Ejemplo n.º 1
0
def _search_external_matches(nodes_to_query, patient_data):
    body = {'_disclaimer': MME_DISCLAIMER}
    body.update(patient_data)
    external_results = []
    submission_gene_ids = set()
    for feature in patient_data['patient'].get('genomicFeatures', []):
        submission_gene_ids.update(get_gene_ids_for_feature(feature, {}))

    for node in nodes_to_query:
        headers = {
            'X-Auth-Token': node['token'],
            'Accept': MME_ACCEPT_HEADER,
            'Content-Type': MME_ACCEPT_HEADER,
            'Content-Language': 'en-US',
        }
        try:
            external_result = requests.post(url=node['url'],
                                            headers=headers,
                                            data=json.dumps(body))
            if external_result.status_code != 200:
                try:
                    message = external_result.json().get('message')
                except Exception:
                    message = external_result.content
                error_message = '{} ({})'.format(message or 'Error',
                                                 external_result.status_code)
                raise Exception(error_message)

            node_results = external_result.json()['results']
            logger.info('Found {} matches from {}'.format(
                len(node_results), node['name']))
            if node_results:
                _, _, gene_symbols_to_ids = get_mme_genes_phenotypes_for_results(
                    node_results)
                invalid_results = []
                for result in node_results:
                    if (not submission_gene_ids) or \
                            _is_valid_external_match(result, submission_gene_ids, gene_symbols_to_ids):
                        external_results.append(result)
                    else:
                        invalid_results.append(result)
                if invalid_results:
                    error_message = 'Received {} invalid matches from {}'.format(
                        len(invalid_results), node['name'])
                    logger.error(error_message)
        except Exception as e:
            error_message = 'Error searching in {}: {}\n(Patient info: {})'.format(
                node['name'], e.message, json.dumps(patient_data))
            logger.error(error_message)
            post_to_slack(MME_SLACK_ALERT_NOTIFICATION_CHANNEL, error_message)

    return external_results
Ejemplo n.º 2
0
def _is_valid_external_match(result, submission_gene_ids, gene_symbols_to_ids):
    for feature in result.get('patient', {}).get('genomicFeatures', []):
        if any(gene_id in submission_gene_ids for gene_id in get_gene_ids_for_feature(feature, gene_symbols_to_ids)):
            return True
    return False