Exemple #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}
Exemple #2
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"}'
Exemple #3
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