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
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