From 65dcd96b6640e2252c83eec58024d95d28fb8498 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Tue, 27 Aug 2024 15:29:09 -0400 Subject: [PATCH 1/4] feat: store score components in DB --- server/app/models/interaction.rb | 34 ++++++++++++++----- .../20240826185158_add_score_components.rb | 7 ++++ server/db/structure.sql | 8 +++-- .../genome/groupers/interaction_grouper.rb | 8 +++-- 4 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 server/db/migrate/20240826185158_add_score_components.rb diff --git a/server/app/models/interaction.rb b/server/app/models/interaction.rb index ed197baf..6c6ecafa 100644 --- a/server/app/models/interaction.rb +++ b/server/app/models/interaction.rb @@ -51,15 +51,31 @@ def interaction_score(known_drug_partners_per_gene = nil, known_gene_partners_pe end end - def calculate_interaction_score(known_drug_partners_per_gene = nil, known_gene_partners_per_drug = nil) - known_drug_partners_per_gene = Interaction.group(:gene_id).count if known_drug_partners_per_gene.nil? - average_known_drug_partners_per_gene = known_drug_partners_per_gene.values.sum / known_drug_partners_per_gene.values.size.to_f - known_gene_partners_per_drug = Interaction.group(:drug_id).count if known_gene_partners_per_drug.nil? - average_known_gene_partners_per_drug = known_gene_partners_per_drug.values.sum / known_gene_partners_per_drug.values.size.to_f - known_drug_partners_for_interaction_gene = known_drug_partners_per_gene[self.gene_id] - known_gene_partners_for_interaction_drug = known_gene_partners_per_drug[self.drug_id] - - (self.publications.count + self.sources.count) * average_known_gene_partners_per_drug/known_gene_partners_for_interaction_drug * average_known_drug_partners_per_gene/known_drug_partners_for_interaction_gene + def calculate_interaction_score(drug_partners_per_gene = nil, gene_partners_per_drug = nil, update = false) + drug_partners_per_gene = Interaction.group(:gene_id).count if drug_partners_per_gene.nil? + avg_drug_partners_per_gene = drug_partners_per_gene.values.sum / drug_partners_per_gene.values.size.to_f + + gene_partners_per_drug = Interaction.group(:drug_id).count if gene_partners_per_drug.nil? + avg_gene_partners_per_drug = gene_partners_per_drug.values.sum / gene_partners_per_drug.values.size.to_f + + drug_partners_for_this_gene = drug_partners_per_gene[gene_id] + gene_partners_for_this_drug = gene_partners_per_drug[drug_id] + + drug_specificity = avg_gene_partners_per_drug / gene_partners_for_this_drug + gene_specificity = avg_drug_partners_per_gene / drug_partners_for_this_gene + evidence_score = publications.count + sources.count + + interaction_score = evidence_score * drug_specificity * gene_specificity + + if update + self.interaction_score = interaction_score + self.drug_specificity = drug_specificity + self.gene_specificity = gene_specificity + self.evidence_score = evidence_score + save! + end + + interaction_score end end diff --git a/server/db/migrate/20240826185158_add_score_components.rb b/server/db/migrate/20240826185158_add_score_components.rb new file mode 100644 index 00000000..2d958f21 --- /dev/null +++ b/server/db/migrate/20240826185158_add_score_components.rb @@ -0,0 +1,7 @@ +class AddScoreComponents < ActiveRecord::Migration[6.1] + def change + add_column :interactions, :drug_specificity, :float + add_column :interactions, :gene_specificity, :float + add_column :interactions, :evidence_score, :integer + end +end diff --git a/server/db/structure.sql b/server/db/structure.sql index 7b41af58..b203e046 100644 --- a/server/db/structure.sql +++ b/server/db/structure.sql @@ -458,7 +458,10 @@ CREATE TABLE public.interactions ( id text NOT NULL, drug_id text NOT NULL, gene_id text NOT NULL, - score numeric + score numeric, + drug_specificity double precision, + gene_specificity double precision, + evidence_score integer ); @@ -1878,6 +1881,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20220523183117'), ('20230104221712'), ('20230110183235'), -('20230214150515'); +('20230214150515'), +('20240826185158'); diff --git a/server/lib/genome/groupers/interaction_grouper.rb b/server/lib/genome/groupers/interaction_grouper.rb index ac914a2f..7a6319b8 100644 --- a/server/lib/genome/groupers/interaction_grouper.rb +++ b/server/lib/genome/groupers/interaction_grouper.rb @@ -89,11 +89,13 @@ def self.add_member(interaction_claim) def self.cache_interaction_scores count = Interaction.count - known_drug_partners_per_gene = Interaction.group(:gene_id).count - known_gene_partners_per_drug = Interaction.group(:drug_id).count + drug_partners_per_geneeraction.group(:gene_id).count + gene_partners_per_drugeraction.group(:drug_id).count pbar = ProgressBar.create(title: 'Calculating interaction scores', total: count, format: "%t: %p%% %a |%B|") Interaction.find_each do |interaction| - interaction.score = interaction.calculate_interaction_score(known_drug_partners_per_gene, known_gene_partners_per_drug) + interaction.score = interaction.calculate_interaction_score( + drug_partners_per_gene, gene_partners_per_drug, true + ) interaction.save! pbar.progress += 1 end From dd627dbf1a12d6a699faf2128f675e11644f3c4d Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Tue, 27 Aug 2024 16:48:55 -0400 Subject: [PATCH 2/4] ?? --- server/lib/genome/groupers/interaction_grouper.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/lib/genome/groupers/interaction_grouper.rb b/server/lib/genome/groupers/interaction_grouper.rb index 7a6319b8..465116bc 100644 --- a/server/lib/genome/groupers/interaction_grouper.rb +++ b/server/lib/genome/groupers/interaction_grouper.rb @@ -93,10 +93,7 @@ def self.cache_interaction_scores gene_partners_per_drugeraction.group(:drug_id).count pbar = ProgressBar.create(title: 'Calculating interaction scores', total: count, format: "%t: %p%% %a |%B|") Interaction.find_each do |interaction| - interaction.score = interaction.calculate_interaction_score( - drug_partners_per_gene, gene_partners_per_drug, true - ) - interaction.save! + interaction.calculate_interaction_score(drug_partners_per_gene, gene_partners_per_drug, true) pbar.progress += 1 end end From 96ba62e6bf287e0f55aaf6cefa49ab7b28de959c Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Wed, 28 Aug 2024 12:36:48 -0400 Subject: [PATCH 3/4] fix --- server/app/graphql/types/interaction_type.rb | 3 +++ server/app/models/interaction.rb | 2 +- server/lib/genome/groupers/interaction_grouper.rb | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/server/app/graphql/types/interaction_type.rb b/server/app/graphql/types/interaction_type.rb index 325982fb..bc24c321 100644 --- a/server/app/graphql/types/interaction_type.rb +++ b/server/app/graphql/types/interaction_type.rb @@ -12,6 +12,9 @@ class InteractionType < Types::BaseObject field :publications, [Types::PublicationType], null: false field :sources, [Types::SourceType], null: false field :interaction_score, Float, null: false + field :drug_specificity, Float, null: false + field :gene_specificity, Float, null: false + field :evidence_score, Integer, null: false def interaction_claims Loaders::AssociationLoader.for(Interaction, :interaction_claims).load(object) diff --git a/server/app/models/interaction.rb b/server/app/models/interaction.rb index 6c6ecafa..0e710bd4 100644 --- a/server/app/models/interaction.rb +++ b/server/app/models/interaction.rb @@ -68,7 +68,7 @@ def calculate_interaction_score(drug_partners_per_gene = nil, gene_partners_per_ interaction_score = evidence_score * drug_specificity * gene_specificity if update - self.interaction_score = interaction_score + self.score = interaction_score self.drug_specificity = drug_specificity self.gene_specificity = gene_specificity self.evidence_score = evidence_score diff --git a/server/lib/genome/groupers/interaction_grouper.rb b/server/lib/genome/groupers/interaction_grouper.rb index 465116bc..780a1af8 100644 --- a/server/lib/genome/groupers/interaction_grouper.rb +++ b/server/lib/genome/groupers/interaction_grouper.rb @@ -89,8 +89,8 @@ def self.add_member(interaction_claim) def self.cache_interaction_scores count = Interaction.count - drug_partners_per_geneeraction.group(:gene_id).count - gene_partners_per_drugeraction.group(:drug_id).count + drug_partners_per_gene = Interaction.group(:gene_id).count + gene_partners_per_drug = Interaction.group(:drug_id).count pbar = ProgressBar.create(title: 'Calculating interaction scores', total: count, format: "%t: %p%% %a |%B|") Interaction.find_each do |interaction| interaction.calculate_interaction_score(drug_partners_per_gene, gene_partners_per_drug, true) From 259c263b5441b794aee99287f172d2ef88931c5b Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Wed, 28 Aug 2024 12:40:33 -0400 Subject: [PATCH 4/4] cleanup --- server/app/models/interaction.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/app/models/interaction.rb b/server/app/models/interaction.rb index 0e710bd4..590cc6bd 100644 --- a/server/app/models/interaction.rb +++ b/server/app/models/interaction.rb @@ -54,17 +54,15 @@ def interaction_score(known_drug_partners_per_gene = nil, known_gene_partners_pe def calculate_interaction_score(drug_partners_per_gene = nil, gene_partners_per_drug = nil, update = false) drug_partners_per_gene = Interaction.group(:gene_id).count if drug_partners_per_gene.nil? avg_drug_partners_per_gene = drug_partners_per_gene.values.sum / drug_partners_per_gene.values.size.to_f + drug_partners_for_this_gene = drug_partners_per_gene[gene_id] gene_partners_per_drug = Interaction.group(:drug_id).count if gene_partners_per_drug.nil? avg_gene_partners_per_drug = gene_partners_per_drug.values.sum / gene_partners_per_drug.values.size.to_f - - drug_partners_for_this_gene = drug_partners_per_gene[gene_id] gene_partners_for_this_drug = gene_partners_per_drug[drug_id] drug_specificity = avg_gene_partners_per_drug / gene_partners_for_this_drug gene_specificity = avg_drug_partners_per_gene / drug_partners_for_this_gene evidence_score = publications.count + sources.count - interaction_score = evidence_score * drug_specificity * gene_specificity if update