Spaces:
Sleeping
Sleeping
__author__ = "qiao" | |
""" | |
Rank the trials given the matching and aggregation results | |
""" | |
import json | |
import sys | |
eps = 1e-9 | |
def get_matching_score(matching): | |
# count only the valid ones | |
included = 0 | |
not_inc = 0 | |
na_inc = 0 | |
no_info_inc = 0 | |
excluded = 0 | |
not_exc = 0 | |
na_exc = 0 | |
no_info_exc = 0 | |
# first count inclusions | |
for criteria, info in matching["inclusion"].items(): | |
if len(info) != 3: | |
continue | |
if info[2] == "included": | |
included += 1 | |
elif info[2] == "not included": | |
not_inc += 1 | |
elif info[2] == "not applicable": | |
na_inc += 1 | |
elif info[2] == "not enough information": | |
no_info_inc += 1 | |
# then count exclusions | |
for criteria, info in matching["exclusion"].items(): | |
if len(info) != 3: | |
continue | |
if info[2] == "excluded": | |
excluded += 1 | |
elif info[2] == "not excluded": | |
not_exc += 1 | |
elif info[2] == "not applicable": | |
na_exc += 1 | |
elif info[2] == "not enough information": | |
no_info_exc += 1 | |
# get the matching score | |
score = 0 | |
score += included / (included + not_inc + no_info_inc + eps) | |
if not_inc > 0: | |
score -= 1 | |
if excluded > 0: | |
score -= 1 | |
return score | |
def get_agg_score(assessment): | |
try: | |
rel_score = float(assessment["relevance_score_R"]) | |
eli_score = float(assessment["eligibility_score_E"]) | |
except: | |
rel_score = 0 | |
eli_score = 0 | |
score = (rel_score + eli_score) / 100 | |
return score | |
if __name__ == "__main__": | |
# args are the results paths | |
matching_results_path = sys.argv[1] | |
agg_results_path = sys.argv[2] | |
# loading the results | |
matching_results = json.load(open(matching_results_path)) | |
agg_results = json.load(open(agg_results_path)) | |
# loop over the patients | |
for patient_id, label2trial2results in matching_results.items(): | |
trial2score = {} | |
for _, trial2results in label2trial2results.items(): | |
for trial_id, results in trial2results.items(): | |
matching_score = get_matching_score(results) | |
if patient_id not in agg_results or trial_id not in agg_results[patient_id]: | |
print(f"Patient {patient_id} Trial {trial_id} not in the aggregation results.") | |
agg_score = 0 | |
else: | |
agg_score = get_agg_score(agg_results[patient_id][trial_id]) | |
trial_score = matching_score + agg_score | |
trial2score[trial_id] = trial_score | |
sorted_trial2score = sorted(trial2score.items(), key=lambda x: -x[1]) | |
print() | |
print(f"Patient ID: {patient_id}") | |
print("Clinical trial ranking:") | |
for trial, score in sorted_trial2score: | |
print(trial, score) | |
print("===") | |
print() | |