Beispiel #1
0
def get_trial_criteria(nct):
    """ Returns JSON containing HTML formatted eligibility criteria for one
	trial. """
    trial = Trial(nct)
    trial.load()

    return {'criteria': trial.eligibility.formatted_html}
Beispiel #2
0
def get_trial_criteria(nct):
	""" Returns JSON containing HTML formatted eligibility criteria for one
	trial. """
	trial = Trial(nct)
	trial.load()
	
	return {'criteria': trial.eligibility.formatted_html}
Beispiel #3
0
def trials_filter_by(run_id, filter_by):
    runner = Runner.get(run_id)
    if runner is None:
        bottle.abort(404)

    if not runner.done:
        bottle.abort(400, "Trial results are not available")

    ncts = runner.get_ncts(restrict='none')
    sess = _get_session()
    run_data = sess.get('runs', {}).get(run_id, {})

    # demographics - get age and gender
    if 'demographics' == filter_by:
        f_gender = run_data.get('gender')
        f_age = int(run_data.get('age', 0))

        for tpl in ncts:
            nct = tpl[0]
            reason = tpl[1] if len(tpl) > 1 else None

            if not reason:
                trial = Trial(nct)
                trial.load()

                # filter gender
                if f_gender:
                    if 'male' == f_gender:
                        if trial.eligibility.gender == 2:
                            reason = "Limited to women"
                    else:
                        if trial.eligibility.gender == 1:
                            reason = "Limited to men"

                # filter age
                if f_age > 0:
                    if trial.eligibility.min_age and trial.eligibility.min_age > f_age:
                        reason = "Patient is too young (min age %d)" % trial.eligibility.min_age
                    elif trial.eligibility.max_age and trial.eligibility.max_age < f_age:
                        reason = "Patient is too old (max age %d)" % trial.eligibility.max_age

            # TODO: REFACTOR into runner class!
            if reason:
                runner.write_trial_reason(nct, reason)

        runner.commit_transactions()

    # problems (only if NLP is on)
    elif 'problems' == filter_by:
        if USE_NLP:
            probs = problems().get('problems', [])

            # extract snomed codes from patient's problem list
            snomed = SNOMEDLookup()
            exclusion_codes = []
            for problem in probs:
                snomed_url = problem.get('sp:problemName',
                                         {}).get('sp:code', {}).get('@id')
                if snomed_url is not None:
                    snomed_code = os.path.basename(snomed_url)
                    exclusion_codes.append(snomed_code)

            # look at trial criteria
            for tpl in ncts:
                nct = tpl[0]
                reason = tpl[1] if len(tpl) > 1 else None

                # if we already have a reason, this trial has already been filtered
                if not reason:
                    trial = Trial(nct)
                    trial.load()

                    # exclusion criterion matched
                    if trial.filter_snomed(exclusion_codes) is not None:
                        reason = 'Matches exclusion criterium "%s" (SNOMED %s)' % (
                            snomed.lookup_code_meaning(match, True,
                                                       True), match)
                        break

                # TODO: REFACTOR
                # runner.write_trial_reason(nct, reason)

    # unknown filtering property
    else:
        return '{"error": "We can not filter by %s"}' % filter_by

    return '{"status": "ok"}'
Beispiel #4
0
def trials_filter_by(run_id, filter_by):
	runner = Runner.get(run_id)
	if runner is None:
		bottle.abort(404)
	
	if not runner.done:
		bottle.abort(400, "Trial results are not available")
	
	ncts = runner.get_ncts(restrict='none')
	sess = _get_session()
	run_data = sess.get('runs', {}).get(run_id, {})
	
	# demographics - get age and gender
	if 'demographics' == filter_by:
		f_gender = run_data.get('gender')
		f_age = int(run_data.get('age', 0))
		
		for tpl in ncts:
			nct = tpl[0]
			reason = tpl[1] if len(tpl) > 1 else None
			
			if not reason:
				trial = Trial(nct)
				trial.load()
				
				# filter gender
				if f_gender:
					if 'male' == f_gender:
						if trial.eligibility.gender == 2:
							reason = "Limited to women"
					else:
						if trial.eligibility.gender == 1:
							reason = "Limited to men"
				
				# filter age
				if f_age > 0:
					if trial.eligibility.min_age and trial.eligibility.min_age > f_age:
						reason = "Patient is too young (min age %d)" % trial.eligibility.min_age
					elif trial.eligibility.max_age and trial.eligibility.max_age < f_age:
						reason = "Patient is too old (max age %d)" % trial.eligibility.max_age
			
			# TODO: REFACTOR into runner class!
			if reason:
				runner.write_trial_reason(nct, reason)
		
		runner.commit_transactions()
	
	# problems (only if NLP is on)
	elif 'problems' == filter_by:
		if USE_NLP:
			probs = problems().get('problems', [])
			
			# extract snomed codes from patient's problem list
			snomed = SNOMEDLookup()
			exclusion_codes = []
			for problem in probs:
				snomed_url = problem.get('sp:problemName', {}).get('sp:code', {}).get('@id')
				if snomed_url is not None:
					snomed_code = os.path.basename(snomed_url)
					exclusion_codes.append(snomed_code)
			
			# look at trial criteria
			for tpl in ncts:
				nct = tpl[0]
				reason = tpl[1] if len(tpl) > 1 else None
				
				# if we already have a reason, this trial has already been filtered
				if not reason:
					trial = Trial(nct)
					trial.load()
					
					# exclusion criterion matched
					if trial.filter_snomed(exclusion_codes) is not None:
						reason = 'Matches exclusion criterium "%s" (SNOMED %s)'  % (snomed.lookup_code_meaning(match, True, True), match)
						break
				
				# TODO: REFACTOR
				# runner.write_trial_reason(nct, reason)
	
	# unknown filtering property
	else:
		return '{"error": "We can not filter by %s"}' % filter_by
	
	return '{"status": "ok"}'
Beispiel #5
0
	def trials_json(self, restrict='reason', filter_interventions=None, filter_phases=None):
		""" Returns an array of trial JSON for the matching trials, optionally
		filtered by intervention type and/or drug phases.
		"""
		if not self.done:
			raise Exception("Trial results are not yet available")
		
		sqlite = SQLite.get(self.sqlite_db)
		if sqlite is None:
			raise Exception("No SQLite handle, please set up properly")
		
		# look up trials. Currently cheaply filtering by string comparison
		qry = "SELECT nct FROM trials WHERE run_id = ? AND reason IS NULL"
		
		if 'reason' == restrict:
			qry += ' AND reason IS NULL'
		
		tpls = [self.run_id]
		if filter_interventions is not None:
			ored = []
			for inter in filter_interventions:
				ored.append('types LIKE "%%%s%%"' % inter)
				# ored.append('instr(types, ?)')
				# tpls.append(inter)
			if len(ored) > 0:
				qry = qry + ' AND (' + ' OR '.join(ored) + ')'
		
		if filter_phases is not None:
			ored = []
			for phase in filter_phases:
				ored.append('phases LIKE "%%%s%%"' % phase)
				# ored.append('instr(phases, ?)')
				# tpls.append(phase)
			
			if len(ored) > 0:
				qry = qry + ' AND (' + ' OR '.join(ored) + ')'
		
		trials = []
		fields = ['keyword', 'phase', 'overall_contact']
		lat = float(self.reference_location[0]) if self.reference_location else 0
		lng = float(self.reference_location[1]) if self.reference_location else 0
		
		# retrieve ncts
		qry += ' ORDER BY distance ASC'
		for row in sqlite.execute(qry, tuple(tpls)):
			trial = Trial(row[0])
			trial.load()
			trial_dict = trial.json(fields)
			
			# add trial locations
			if lat and lng:
				closest = []
				for loc in trial.locations_closest_to(lat, lng, open_only=True):
					closest.append(loc[0].json())
				trial_dict['location'] = closest
			
			trials.append(trial_dict)
		
		# grab trial data in batch from db - PROBLEM: distance order is not preserved
		# for trial in Trial.retrieve(ncts):
		# 	trials.append(trial.json(fields))
		
		return trials
Beispiel #6
0
    def trials_json(self,
                    restrict='reason',
                    filter_interventions=None,
                    filter_phases=None):
        """ Returns an array of trial JSON for the matching trials, optionally
		filtered by intervention type and/or drug phases.
		"""
        if not self.done:
            raise Exception("Trial results are not yet available")

        sqlite = SQLite.get(self.sqlite_db)
        if sqlite is None:
            raise Exception("No SQLite handle, please set up properly")

        # look up trials. Currently cheaply filtering by string comparison
        qry = "SELECT nct FROM trials WHERE run_id = ? AND reason IS NULL"

        if 'reason' == restrict:
            qry += ' AND reason IS NULL'

        tpls = [self.run_id]
        if filter_interventions is not None:
            ored = []
            for inter in filter_interventions:
                ored.append('types LIKE "%%%s%%"' % inter)
                # ored.append('instr(types, ?)')
                # tpls.append(inter)
            if len(ored) > 0:
                qry = qry + ' AND (' + ' OR '.join(ored) + ')'

        if filter_phases is not None:
            ored = []
            for phase in filter_phases:
                ored.append('phases LIKE "%%%s%%"' % phase)
                # ored.append('instr(phases, ?)')
                # tpls.append(phase)

            if len(ored) > 0:
                qry = qry + ' AND (' + ' OR '.join(ored) + ')'

        trials = []
        fields = ['keyword', 'phase', 'overall_contact']
        lat = float(
            self.reference_location[0]) if self.reference_location else 0
        lng = float(
            self.reference_location[1]) if self.reference_location else 0

        # retrieve ncts
        qry += ' ORDER BY distance ASC'
        for row in sqlite.execute(qry, tuple(tpls)):
            trial = Trial(row[0])
            trial.load()
            trial_dict = trial.json(fields)

            # add trial locations
            if lat and lng:
                closest = []
                for loc in trial.locations_closest_to(lat, lng,
                                                      open_only=True):
                    closest.append(loc[0].json())
                trial_dict['location'] = closest

            trials.append(trial_dict)

        # grab trial data in batch from db - PROBLEM: distance order is not preserved
        # for trial in Trial.retrieve(ncts):
        # 	trials.append(trial.json(fields))

        return trials