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 ed197baf..590cc6bd 100644 --- a/server/app/models/interaction.rb +++ b/server/app/models/interaction.rb @@ -51,15 +51,29 @@ 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] + 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] - (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 + 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 + 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.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..780a1af8 100644 --- a/server/lib/genome/groupers/interaction_grouper.rb +++ b/server/lib/genome/groupers/interaction_grouper.rb @@ -89,12 +89,11 @@ 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_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.score = interaction.calculate_interaction_score(known_drug_partners_per_gene, known_gene_partners_per_drug) - interaction.save! + interaction.calculate_interaction_score(drug_partners_per_gene, gene_partners_per_drug, true) pbar.progress += 1 end end