:- module(reports, []). :- use_module(library(http/http_dispatch)). :- use_module(library(http/http_parameters)). :- use_module(library(semweb/rdf_db)). :- use_module(library(util)). :- use_module(library(http/http_json)). :- use_module(library(semweb/rdf_describe)). :- use_module(library(semweb/rdf_json)). :- use_module(library(aers_report)). :- use_module(api(drugs)). :- http_handler(cliopatria(aers/api/reports), http_reports, []). :- http_handler(cliopatria(aers/api/cc), http_cc, []). :- http_handler(cliopatria(aers/api/table), http_contingency_table, []). :- http_handler(cliopatria(aers/api/prr), http_prr, []). :- http_handler(cliopatria(aers/api/chi), http_chi, []). %% http_reports(+Request) http_reports(Request) :- http_parameters(Request, [drug(Drugs, [list(atom) ]), reaction(Reactions, [list(atom) ]), limit(Limit, [number,default(100)]), offset(Offset, [number,default(0)]) ]), findall(R, report(Drugs, Reactions, [], R), Reports0), sort(Reports0, Reports), length(Reports, Total_Reports), list_offset(Reports, Offset, Reports_Offset), list_limit(Reports_Offset, Limit, Reports_Limit, _), %maplist(report_obj, Reports_Limit, JSON_Reports), reply_json(json([totalNumberOfResults=Total_Reports, drug=Drugs, reaction=Reactions, reports=Reports_Limit])). %% http_cc(+Request) http_cc(Request) :- http_parameters(Request, [drug(Drug, [atom, optional(true) ]), reaction(Reaction, [atom, optional(true) ]), drugMatch(DrugMatch0, [list(atom) ]), limit(Limit, [number,default(100)]), offset(Offset, [number,default(0)]) ]), ( DrugMatch0 = [] -> DrugMatch = [word,brand,synonym,corrected] ; DrugMatch = DrugMatch0 ), ( var(Drug), var(Reaction) -> reply_json(json([error='api'])) ; ( Drug=all, Reaction=all -> cc_count(Total), CC = [] ; (nonvar(Drug),\+Drug==all) -> drug_match(Drug, DrugMatch, DrugMentions), drug_reaction_cc(DrugMentions, Reaction, CC), length(CC, Total) ; nonvar(Reaction) -> reaction_cc(Reaction, CC), length(CC, Total) ), list_offset(CC, Offset, CC_Offset), list_limit(CC_Offset, Limit, CC_Limit, _), maplist(cc_json, CC_Limit, CC_JSON), reply_json(json([totalNumberOfResults=Total, limit=Limit, offset=Offset, cc=CC_JSON])) ). drug_match(Drug, Methods, DrugMentions) :- findall(M, ( member(Method, Methods), drug_mention(Method, Drug, M, _) ), DrugMentions0), sort(DrugMentions0, DrugMentions). reaction_cc(ReactionMention, []) :- (var(ReactionMention); ReactionMention==all), !. reaction_cc(ReactionMention, CC) :- findall(cc_drug(Report,Drug), ( rdf(Report, aers:reaction, literal(exact(ReactionMention), _Reaction)), rdf(Report, aers:drug, DrugUse), rdf(DrugUse, aers:drugname, literal(Drug)) ), CC0), sort(CC0, CC). drug_reaction_cc(DrugMentions, ReactionMention, CC) :- DrugMentions = [_|_], !, ( (var(ReactionMention); ReactionMention==all) -> ReactionLit = literal(Reaction) ; ReactionLit = literal(exact(ReactionMention), Reaction) ), findall(cc_reaction(Report,Reaction), ( member(Drug, DrugMentions), rdf(DrugUse, aers:drugname, literal(Drug)), rdf(Report, aers:drug, DrugUse), rdf(Report, aers:reaction, ReactionLit) ), CC0), sort(CC0, CC). report_obj(R, JSON) :- resource_CBD(rdf, R, Graph), graph_json(Graph, JSON). cc_json(cc_reaction(Report,Reaction), json([report=Report,reaction=Reaction])). cc_json(cc_drug(Report,Drug), json([report=Report,drug=Drug])). %% http_contingency_table(+Request) % % http_contingency_table(Request) :- http_parameters(Request, [drug(Drug, [atom ]), reaction(Reaction, [atom ]), drugMatch(DrugMatch0, [list(atom) ]) ]), ( DrugMatch0 = [] -> DrugMatch = [word,brand,synonym,corrected] ; DrugMatch = DrugMatch0 ), contingency_table(Drug, DrugMatch, Reaction, A,B,C,D,AB,AC,BD,CD,ABCD), reply_json(json([a=A, b=B, c=C, d=D, 'a+b'=AB, 'a+c'=AC, 'b+d'=BD, 'c+d'=CD, 'a+b+c+d'=ABCD ])). http_prr(Request) :- http_parameters(Request, [drug(Drug, [atom ]), reaction(Reaction, [atom ]), drugMatch(DrugMatch0, [list(atom) ]) ]), ( DrugMatch0 = [] -> DrugMatch = [word,brand,synonym,corrected] ; DrugMatch = DrugMatch0 ), contingency_table(Drug, DrugMatch, Reaction, A,_,C,_,AB,_,_,_,ABCD), PRR is (A/C)/(AB/ABCD), reply_json(json([prr=PRR, formula='(a/c)/((a+b)/(a+b+c+d))', a=A, c=C, 'a+b'=AB, 'a+b+c+d'=ABCD ])). http_chi(Request) :- http_parameters(Request, [drug(Drug, [atom ]), reaction(Reaction, [atom ]), drugMatch(DrugMatch0, [list(atom) ]) ]), ( DrugMatch0 = [] -> DrugMatch = [word,brand,synonym,corrected] ; DrugMatch = DrugMatch0 ), contingency_table(Drug, DrugMatch, Reaction, A,B,C,D,AB,AC,BD,CD,ABCD), Chi is ((A*D-B*C)^2*(A+B+C+D))/(AB*CD*BD*AC), reply_json(json([chi=Chi, formula='(ad-bc)^2(a+b+c+d)/((a+b)*(c+d)*(b+d)*(a+c))', a=A, b=B, c=C, d=D, 'a+b'=AB, 'a+c'=AC, 'b+d'=BD, 'c+d'=CD, 'a+b+c+d'=ABCD ])). contingency_table(Drug, DrugMatch, Reaction, A,B,C,D,AB,AC,BD,CD,ABCD) :- drug_match(Drug, DrugMatch, DrugMentions), drug_reaction_cc(DrugMentions, Reaction, CC_A), drug_reaction_cc(DrugMentions, all, CC_AC), reaction_cc(Reaction, CC_AB), cc_count(ABCD), length(CC_A, A), length(CC_AB, AB), length(CC_AC, AC), B is AB-A, C is AC-A, CD is ABCD-AB, BD is ABCD-AC, D is BD-B.