virgil/commit

FIX prr computation. Use drug-reaction cooccurrences instead of report count

authorMichiel Hildebrand
Fri Mar 15 14:58:53 2013 +0100
committerMichiel Hildebrand
Fri Mar 15 15:01:12 2013 +0100
commit8ef3b915eb91d000b3571faf520139b6871f5a02
tree6297b1aaa9cef4f608d702e3bfcdff17c30e6d05
parent4cf01e4e0b6519ff1199a898b46d07fb4dc77a2f
Diff style: patch stat
diff --git a/api/measurements.pl b/api/measurements.pl
index 304b939..fbc151a 100644
--- a/api/measurements.pl
+++ b/api/measurements.pl
@@ -1,5 +1,5 @@
 :- module(measurements,
-	  [flush_virgil_cache/0
+	  [
 	  ]).
 
 :- use_module(library(http/http_dispatch)).
@@ -10,8 +10,7 @@
 
 :- http_handler(cliopatria(aers/api/measurements/prr), http_measurements_prr, []).
 
-:- dynamic
-	virgil_cache/2.
+
 
 http_measurements_prr(Request) :-
 	http_parameters(Request,
@@ -32,10 +31,18 @@ prr_per_reaction([Reaction|Rs], Drugs, [Obj|Os]) :-
 	prr_per_reaction(Rs, Drugs, Os).
 
 prr(Drugs, Reaction, PRR, Prov) :-
-	drug_reactions(Drugs, DRs),
-	length(DRs, D),
-	proof_count(member(Reaction-_, DRs), DE),
+	% total drug cooccurrences
+	drug_reaction_counts(Drugs, DRs),
+	pairs_keys(DRs, DR_Counts),
+	sumlist(DR_Counts, D),
+
+	% drug-reaction cooccurrences
+        memberchk(DE-Reaction, DRs),
+
+	% reaction cooccurrences
 	reaction_count(Reaction, E),
+
+	% total cooccurrences
 	cc_count(A),
 
 	PRR is (DE/D)/((E-DE)/(A-D)),
@@ -48,30 +55,7 @@ prr(Drugs, Reaction, PRR, Prov) :-
 	%Prov = (DE/D)/((E-DE)/(A-D)).
 
 
-drug_reactions(Drugs, DRs) :-
-	virgil_cache(drug(Drugs), DRs),
-	!.
-drug_reactions(Drugs, DRs) :-
-	setof(R-Report, reaction(Drugs, [], R, Report), DRs),
-	assert(virgil_cache(drug(Drugs), DRs)).
-
-reaction_count(Reaction, Count) :-
-	virgil_cache(reaction(Reaction), Count),
-	!.
-reaction_count(Reaction, Count) :-
-	setof(R, report([], [Reaction], [], R), Es),
-	length(Es, Count),
-	assert(virgil_cache(reaction(Reaction), Count)).
-
-cc_count(Count) :-
-	virgil_cache(cc, Count),
-	!.
-cc_count(Count) :-
-	setof(R, report([], [], [], R), As),
-	length(As, Count),
-	assert(virgil_cache(cc, Count)).
-
-
-flush_virgil_cache :-
-	retractall(virgil_cache(_, _)).
+
+
+
 
diff --git a/api/reactions.pl b/api/reactions.pl
index 477afaa..d3f7663 100644
--- a/api/reactions.pl
+++ b/api/reactions.pl
@@ -22,11 +22,7 @@ http_reactions(Request) :-
 			 offset(Offset,
 				[default(0)])
 			]),
-	findall(Count-Reaction,
-		(   setof(R, reaction(DrugNames, [], Reaction, R), Rs),
-		    length(Rs, Count)
-		),
-		Reactions0),
+	drug_reaction_counts(DrugNames, Reactions0),
 	keysort(Reactions0, Reactions1),
 	reverse(Reactions1, Reactions),
 	length(Reactions, Total_Reactions),
diff --git a/lib/aers_report.pl b/lib/aers_report.pl
index 8d07ae3..bfe4fa7 100644
--- a/lib/aers_report.pl
+++ b/lib/aers_report.pl
@@ -2,12 +2,24 @@
 	  [report/4,
 	   report_by_drug/2,
 	   report_by_filter/2,
-	   reaction/4
+	   reaction/4,
+	   drug_reaction_counts/2,
+	   reaction_count/2,
+	   cc_count/1,
+	   flush_virgil_cache/0
 	  ]).
 
 :- use_module(library(semweb/rdf_db)).
 :- use_module(library(semweb/rdf_label)).
 
+:- dynamic
+	virgil_cache/2.
+
+flush_virgil_cache :-
+	retractall(virgil_cache(_, _)).
+
+%%	report(+DrugMentionList, -ReactionTerms, +ReportFilter, -Report)
+
 report(Drugs, Reactions, Filter, Report) :-
 	(   Drugs = [_|_]
 	->  report_by_drug(Drugs, Report)
@@ -33,7 +45,8 @@ report_by_reaction([_|T], Report) :-
 report_by_filter([], Report) :-
 	rdf(Report, rdf:type, aers:'Report').
 
-%%	reaction(+Drugs, +Filter, ?Reaction, -Report)
+
+%%	reaction(+DrugMentionList, +Filter, ?Reaction, -Report)
 
 reaction(Drugs, Filter, Reaction, Report) :-
 	(   Drugs = [_|_]
@@ -43,3 +56,54 @@ reaction(Drugs, Filter, Reaction, Report) :-
 	report_by_filter(Filter, Report),
 	rdf(Report, aers:reaction, Reaction_Lit),
 	literal_text(Reaction_Lit, Reaction).
+
+
+%%	drug_reacton_counts(+DrugMentionList, -Pairs:count-reaction)
+
+drug_reaction_counts(Drugs, DRs) :-
+	virgil_cache(drug(Drugs), DRs),
+	!.
+drug_reaction_counts(Drugs, DRs) :-
+	findall(Count-Reaction,
+		(setof(R, reaction(Drugs, [], Reaction, R), Rs),
+		 length(Rs, Count)
+		), DRs),
+	assert(virgil_cache(drug(Drugs), DRs)).
+
+
+%%	reaction_count(+Reaction, -ReactionCount)
+
+reaction_count(Reaction, Count) :-
+	virgil_cache(reaction(Reaction), Count),
+	!.
+reaction_count(Reaction, Count) :-
+	setof(R-D, (report([], [Reaction], [], R),
+		    report_drug_name(R, D)
+		   ),
+	      Es),
+	length(Es, Count),
+	assert(virgil_cache(reaction(Reaction), Count)).
+
+%%	cc_count(-Count)
+
+cc_count(Count) :-
+	virgil_cache(cc, Count),
+	!.
+cc_count(Count) :-
+	setof(R-D-E, report_drug_reaction([], R, D, E), As),
+	length(As, Count),
+	assert(virgil_cache(cc, Count)).
+
+
+report_drug_reaction(Filter, Report, DrugName, Reaction) :-
+	report_by_filter(Filter, Report),
+	report_drug_name(Report, DrugName),
+	report_reaction(Report, Reaction).
+
+report_drug_name(Report, Drug) :-
+	rdf(Report, aers:drug, DrugUse),
+	rdf(DrugUse, aers:drugname, literal(Drug)).
+
+report_reaction(Report, Reaction) :-
+	rdf(Report, aers:reaction, literal(Reaction)).
+