virgil/commit

ADD PRR measurements to wizard.

authorMichiel Hildebrand
Thu Mar 14 18:24:03 2013 +0100
committerMichiel Hildebrand
Thu Mar 14 18:24:03 2013 +0100
commit6ce33cc8f2721cd8b81313c57c4c8dc693ffedfd
tree1ddb41be2fce6bc0ae3862db112fca311cdfb6f6
parentb44b86c05f824c2d7073c0c32f469904e92da38b
Diff style: patch stat
diff --git a/api/measurements.pl b/api/measurements.pl
new file mode 100644
index 0000000..304b939
--- /dev/null
+++ b/api/measurements.pl
@@ -0,0 +1,77 @@
+:- module(measurements,
+	  [flush_virgil_cache/0
+	  ]).
+
+:- use_module(library(http/http_dispatch)).
+:- use_module(library(http/http_parameters)).
+:- use_module(library(http/http_json)).
+:- use_module(library(aers_report)).
+:- use_module(library(count)).
+
+:- http_handler(cliopatria(aers/api/measurements/prr), http_measurements_prr, []).
+
+:- dynamic
+	virgil_cache/2.
+
+http_measurements_prr(Request) :-
+	http_parameters(Request,
+			['drugnames[]'(Drugs,
+				   [list(atom)]),
+			 'reactions[]'(Reactions,
+				       [list(atom)
+				       ])
+			]),
+	prr_per_reaction(Reactions, Drugs, PRRs),
+	reply_json(PRRs).
+
+
+prr_per_reaction([], _, []).
+prr_per_reaction([Reaction|Rs], Drugs, [Obj|Os]) :-
+	Obj = json([reaction=Reaction, prr=PRR, prov=Prov]),
+	prr(Drugs, Reaction, PRR, Prov),
+	prr_per_reaction(Rs, Drugs, Os).
+
+prr(Drugs, Reaction, PRR, Prov) :-
+	drug_reactions(Drugs, DRs),
+	length(DRs, D),
+	proof_count(member(Reaction-_, DRs), DE),
+	reaction_count(Reaction, E),
+	cc_count(A),
+
+	PRR is (DE/D)/((E-DE)/(A-D)),
+
+	Prov = json([drug=D,
+		     reaction=E,
+		     drugreaction=DE,
+		     all=A
+		    ]).
+	%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 5c13f8a..477afaa 100644
--- a/api/reactions.pl
+++ b/api/reactions.pl
@@ -3,8 +3,6 @@
 
 :- use_module(library(http/http_dispatch)).
 :- use_module(library(http/http_parameters)).
-:- use_module(library(semweb/rdf_db)).
-:- use_module(library(semweb/rdf_label)).
 :- use_module(library(util)).
 :- use_module(library(http/http_json)).
 :- use_module(library(aers_report)).
@@ -40,15 +38,6 @@ http_reactions(Request) :-
 
 reaction_obj(C-R, json([reaction=R, count=C])).
 
-reaction(Drugs, Filter, Reaction, Report) :-
-	(   Drugs = [_|_]
-	->  report_by_drug(Drugs, Report)
-	;   true
-	),
-	report_by_filter(Filter, Report),
-	rdf(Report, aers:reaction, Reaction_Lit),
-	literal_text(Reaction_Lit, Reaction).
-
 %%	http_reaction_count(+Request)
 
 http_reaction_count(Request) :-
diff --git a/config-available/virgil.pl b/config-available/virgil.pl
index 9d221be..27c17cd 100644
--- a/config-available/virgil.pl
+++ b/config-available/virgil.pl
@@ -13,6 +13,7 @@
 :- load_files([ api(drugs),
 		api(reactions),
 		api(reports),
+		api(measurements),
 		applications(virgil)
 	      ],
 	      [ silent(true),
diff --git a/lib/aers_report.pl b/lib/aers_report.pl
index 7fb39de..8d07ae3 100644
--- a/lib/aers_report.pl
+++ b/lib/aers_report.pl
@@ -1,10 +1,12 @@
 :- module(aers_report,
 	  [report/4,
 	   report_by_drug/2,
-	   report_by_filter/2
+	   report_by_filter/2,
+	   reaction/4
 	  ]).
 
 :- use_module(library(semweb/rdf_db)).
+:- use_module(library(semweb/rdf_label)).
 
 report(Drugs, Reactions, Filter, Report) :-
 	(   Drugs = [_|_]
@@ -30,3 +32,14 @@ report_by_reaction([_|T], Report) :-
 
 report_by_filter([], Report) :-
 	rdf(Report, rdf:type, aers:'Report').
+
+%%	reaction(+Drugs, +Filter, ?Reaction, -Report)
+
+reaction(Drugs, Filter, Reaction, Report) :-
+	(   Drugs = [_|_]
+	->  report_by_drug(Drugs, Report)
+	;   true
+	),
+	report_by_filter(Filter, Report),
+	rdf(Report, aers:reaction, Reaction_Lit),
+	literal_text(Reaction_Lit, Reaction).
diff --git a/web/html/wizard.html b/web/html/wizard.html
index d99bdf1..29ccfbe 100644
--- a/web/html/wizard.html
+++ b/web/html/wizard.html
@@ -148,6 +148,10 @@
 			
 			<div class="step-pane" id="measurements">
 				<h3>Measurements</h3>
+				<table class="table">
+					<thead><tr><th>Reaction</th><th>PRR</th></tr></thead>
+					<tbody></tbody>
+				</table>	
 			</div>
 			
 		</div>
@@ -160,6 +164,7 @@
 			brandsURL = '../aers/api/drug/brands',
 			synonymsURL = '../aers/api/drug/synonyms',
 			reactionsURL = '../aers/api/reactions';
+			prrURL = '../aers/api/measurements/prr';
 		
 		$(function() {
 			function getURLParameter(name) {
@@ -176,6 +181,14 @@
 				return drugs;
 			}
 			
+			function getReactions() {
+				var reactions = [];
+				$('#reactions .labelbox input[type=checkbox]:checked').each(function(i,e) {
+					reactions.push($(e).val());
+				});
+				return reactions;
+			}
+			
 			$.fn.updateDrugNames = function(drugs) {
 				var labelbox = $(this).find(".labelbox");
 				$.ajax(mentionsURL, {
@@ -202,13 +215,34 @@
 					success: function(o) {
 						$(o.reactions).each(function(i, e) {
 							labelbox.append(
-								'<label class="checkbox"><input type="checkbox">'
+								'<label class="checkbox"><input type="checkbox" value="'+e.reaction+'">'
 								+e.reaction+'<span class="badge">'+e.count+'</span></label>');
 						});
 					}
 				});
 			};
 			
+			$.fn.updateMeasurements = function() {
+				var drugnames = getDrugNames(),
+					reactions = getReactions(),
+					table = $(this).find('tbody');
+				
+				table.html("");
+				
+				$.ajax(prrURL, {
+					dataType:"json",
+					data:{
+						drugnames:drugnames,
+						reactions:reactions
+						},
+					success: function(o) {
+						$(o).each(function(i,e) {
+							table.append('<tr><td>'+e.reaction+'</td><td>'+e.prr+'</td></tr>');
+						})
+					}
+				});
+			}
+			
 			
 			// setup the checkbox toggle buttons
 			$('button[data-toggle=select]').each(function () {
@@ -266,6 +300,9 @@
 				if(o.step==1&&o.direction=="next") {
 					$("#reactions").updateReactions();
 				}
+				else if(o.step==2&&o.direction=="next") {
+					$("#measurements").updateMeasurements();
+				}
 			});
 			
 		});