def test_omim_terms(adapter, case_obj, test_omim_term): """Test extracting and formatting OMIM terms from a case for a MatchMaker submission""" # GIVEN a database containing an OMIM term adapter.disease_term_collection.insert_one(test_omim_term) # GIVEN a case with OMIM terms case_obj["diagnosis_phenotypes"] = [test_omim_term["disease_nr"]] # THEN the omim_terms function shuld extract OMIM terms with an ID and a label disorders = omim_terms(adapter, case_obj) assert disorders[0]["id"] == f"MIM:{test_omim_term['disease_nr']}" assert disorders[0]["label"] == test_omim_term["description"]
def mme_add( store, user_obj, case_obj, add_gender, add_features, add_disorders, genes_only, mme_base_url, mme_accepts, mme_token, ): """Add a patient to MatchMaker server Args: store(adapter.MongoAdapter) user_obj(dict) a scout user object (to be added as matchmaker contact) case_obj(dict) a scout case object add_gender(bool) if True case gender will be included in matchmaker add_features(bool) if True HPO features will be included in matchmaker add_disorders(bool) if True OMIM diagnoses will be included in matchmaker genes_only(bool) if True only genes and not variants will be shared mme_base_url(str) base url of the MME server mme_accepts(str) request content accepted by MME server mme_token(str) auth token of the MME server Returns: submitted_info(dict) info submitted to MatchMaker and its responses """ if not mme_base_url or not mme_accepts or not mme_token: return "Please check that Matchmaker connection parameters are valid" url = "".join([mme_base_url, "/patient/add"]) features = [] # this is the list of HPO terms disorders = [] # this is the list of OMIM diagnoses g_features = [] # create contact dictionary contact_info = { "name": user_obj["name"], "href": "".join(["mailto:", user_obj["email"]]), "institution": "Scout software user, Science For Life Laboratory, Stockholm, Sweden", } if add_features: # create features dictionaries features = hpo_terms(case_obj) if add_disorders: # create OMIM disorders dictionaries disorders = omim_terms(case_obj) # send a POST request and collect response for each affected individual in case server_responses = [] submitted_info = { "contact": contact_info, "sex": add_gender, "features": features, "disorders": disorders, "genes_only": genes_only, "patient_id": [], } for individual in case_obj.get("individuals"): if not individual["phenotype"] in [ 2, "affected", ]: # include only affected individuals continue patient = { "contact": contact_info, "id": ".".join( [case_obj["_id"], individual.get("individual_id")] ), # This is a required field form MME "label": ".".join([case_obj["display_name"], individual.get("display_name")]), "features": features, "disorders": disorders, } if add_gender: if individual["sex"] == "1": patient["sex"] = "MALE" else: patient["sex"] = "FEMALE" if case_obj.get("suspects"): g_features = genomic_features( store, case_obj, individual.get("display_name"), genes_only ) patient["genomicFeatures"] = g_features # send add request to server and capture response resp = matchmaker_request( url=url, token=mme_token, method="POST", content_type=mme_accepts, accept="application/json", data={"patient": patient}, ) server_responses.append( { "patient": patient, "message": resp.get("message"), "status_code": resp.get("status_code"), } ) submitted_info["server_responses"] = server_responses return submitted_info
def test_mme_add(self, populated_database, user_obj, case_obj, parsed_variant): """test calling the controller that submits new patients to Matchmaker""" session = requests.Session() adapter = populated_database # Add an HPO term to this scout case assert case_obj.get('phenotype_terms') == None phenotype_term = { 'phenotype_id': 'HP:0011031', 'feature': 'Abnormality of iron homeostasis' } updated_case = adapter.case_collection.find_one_and_update( {'_id': case_obj['_id']}, {'$set': { 'phenotype_terms': [phenotype_term] }}, return_document=pymongo.ReturnDocument.AFTER) assert updated_case['phenotype_terms'][0] == phenotype_term # Check that features (HPO) terms are obtained by MME parser features = hpo_terms(updated_case) assert features # Add a couple of OMIM diagnoses to this case assert case_obj.get('diagnosis_phenotypes') == None updated_case = adapter.case_collection.find_one_and_update( {'_id': case_obj['_id']}, {'$set': { 'diagnosis_phenotypes': [615349, 616833] }}, return_document=pymongo.ReturnDocument.AFTER) assert updated_case['diagnosis_phenotypes'] # Check that OMIM terms are obtained by MME parser diagnoses = omim_terms(updated_case) assert diagnoses # Add variant containing a gene to database and pin it for this case a_gene = adapter.hgnc_collection.find_one() assert a_gene['hgnc_id'] assert adapter.variant_collection.find_one() is None parsed_variant['hgnc_ids'] = [a_gene['hgnc_id']] parsed_variant['samples'] = [ { # pretend the affected subject has the allele 'sample_id': 'ADM1059A2', 'display_name': 'NA12882', 'genotype_call': '0/1' } ] adapter.variant_collection.insert_one(parsed_variant) assert adapter.variant_collection.find_one() # pin it updated_case = adapter.case_collection.find_one_and_update( {'_id': case_obj['_id']}, {'$set': { 'suspects': [parsed_variant['_id']] }}, return_document=pymongo.ReturnDocument.AFTER) assert updated_case['suspects'] == [parsed_variant['_id']] # Check that genomic features are created correcly by MME parser g_feat = genomic_features(adapter, updated_case, 'NA12882', 'False') assert g_feat # use controller to send request and collect response mme_base_url = 'http://localhost:{port}'.format( port=self.mock_server_port) submitted_info = controllers.mme_add(store=adapter, user_obj=user_obj, case_obj=updated_case, add_gender=True, add_features=True, add_disorders=True, genes_only=False, mme_base_url=mme_base_url, mme_accepts=MME_ACCEPTS, mme_token=MME_TOKEN) assert submitted_info['server_responses'][0]['patient']
def matchmaker_add(request, institute_id, case_name): """Add all affected individuals from a case to a MatchMaker server Args: request(werkzeug.local.LocalProxy) institute_id(str): _id of an institute case_name(str): display name of a case """ # Check that general MME request requirements are fulfilled matchmaker_check_requirements(request) _, case_obj = institute_and_case(store, institute_id, case_name) candidate_vars = request.form.getlist("selected_var") if len(candidate_vars) > 3: flash( "At the moment it is not possible to save to MatchMaker more than 3 candidate variants / genes", "warning", ) return redirect(request.referrer) save_gender = "sex" in request.form features = ( hpo_terms(case_obj) if "features" in request.form and case_obj.get("phenotype_terms") else [] ) disorders = omim_terms(store, case_obj) if "disorders" in request.form else [] genes_only = request.form.get("genomicfeatures") == "genes" if not features and not candidate_vars: flash( "In order to upload a case to MatchMaker you need to pin a variant or at least assign a phenotype (HPO term)", "danger", ) return redirect(request.referrer) # create contact dictionary user_obj = store.user(current_user.email) contact_info = { "name": user_obj["name"], "href": "".join(["mailto:", user_obj["email"]]), "institution": "Scout software user, Science For Life Laboratory, Stockholm, Sweden", } submitted_info = { "contact": contact_info, "sex": save_gender, "features": features, "disorders": disorders, "genes_only": genes_only, "patient_id": [], "server_responses": [], } server_responses = [] n_updated = 0 for individual in case_obj.get("individuals"): if not individual["phenotype"] in [ 2, "affected", ]: # include only affected individuals continue patient = { "contact": contact_info, "id": ".".join( [case_obj["_id"], individual.get("individual_id")] ), # This is a required field form MME "label": ".".join([case_obj["display_name"], individual.get("display_name")]), "features": features, "disorders": disorders, } if save_gender: if individual["sex"] == "1": patient["sex"] = "MALE" else: patient["sex"] = "FEMALE" if candidate_vars: g_features = genomic_features( store, case_obj, individual.get("display_name"), candidate_vars, genes_only ) patient["genomicFeatures"] = g_features resp = matchmaker.patient_submit(patient) submitted_info["server_responses"].append( { "patient": patient, "message": resp.get("message"), "status_code": resp.get("status_code"), } ) if resp.get("status_code") != 200: flash( "an error occurred while adding patient to matchmaker: {}".format(resp), "warning", ) continue flash(f"Patient {individual.get('display_name')} saved to MatchMaker", "success") n_updated += 1 if n_updated > 0: store.case_mme_update(case_obj=case_obj, user_obj=user_obj, mme_subm_obj=submitted_info) return n_updated
def mme_add(store, user_obj, case_obj, add_gender, add_features, add_disorders, genes_only, mme_base_url, mme_accepts, mme_token): """Add a patient to MatchMaker server Args: store(adapter.MongoAdapter) user_obj(dict) a scout user object (to be added as matchmaker contact) case_obj(dict) a scout case object add_gender(bool) if True case gender will be included in matchmaker add_features(bool) if True HPO features will be included in matchmaker add_disorders(bool) if True OMIM diagnoses will be included in matchmaker genes_only(bool) if True only genes and not variants will be shared mme_base_url(str) base url of the MME server mme_accepts(str) request content accepted by MME server mme_token(str) auth token of the MME server Returns: submitted_info(dict) info submitted to MatchMaker and its responses """ if not mme_base_url or not mme_accepts or not mme_token: return 'Please check that Matchmaker connection parameters are valid' url = ''.join([mme_base_url, '/patient/add']) features = [] # this is the list of HPO terms disorders = [] # this is the list of OMIM diagnoses g_features = [] # create contact dictionary contact_info = { 'name': user_obj['name'], 'href': ''.join(['mailto:', user_obj['email']]), 'institution': 'Scout software user, Science For Life Laboratory, Stockholm, Sweden' } if add_features: # create features dictionaries features = hpo_terms(case_obj) if add_disorders: # create OMIM disorders dictionaries disorders = omim_terms(case_obj) # send a POST request and collect response for each affected individual in case server_responses = [] submitted_info = { 'contact': contact_info, 'sex': add_gender, 'features': features, 'disorders': disorders, 'genes_only': genes_only, 'patient_id': [] } for individual in case_obj.get('individuals'): if not individual['phenotype'] in [ 2, 'affected' ]: # include only affected individuals continue patient = { 'contact': contact_info, 'id': '.'.join([case_obj['_id'], individual.get('individual_id') ]), # This is a required field form MME 'label': '.'.join( [case_obj['display_name'], individual.get('display_name')]), 'features': features, 'disorders': disorders } if add_gender: if individual['sex'] == '1': patient['sex'] = 'MALE' else: patient['sex'] = 'FEMALE' if case_obj.get('suspects'): g_features = genomic_features(store, case_obj, individual.get('display_name'), genes_only) patient['genomicFeatures'] = g_features # send add request to server and capture response resp = matchmaker_request(url=url, token=mme_token, method='POST', content_type=mme_accepts, accept='application/json', data={'patient': patient}) server_responses.append({ 'patient': patient, 'message': resp.get('message'), 'status_code': resp.get('status_code') }) submitted_info['server_responses'] = server_responses return submitted_info
def mme_add(store, user_obj, case_obj, add_gender, add_features, add_disorders, genes_only, mme_base_url, mme_accepts, mme_token): """Add a patient to MatchMaker server Args: store(adapter.MongoAdapter) user_obj(dict) a scout user object (to be added as matchmaker contact) case_obj(dict) a scout case object add_gender(bool) if True case gender will be included in matchmaker add_features(bool) if True HPO features will be included in matchmaker add_disorders(bool) if True OMIM diagnoses will be included in matchmaker genes_only(bool) if True only genes and not variants will be shared mme_base_url(str) base url of the MME server mme_accepts(str) request content accepted by MME server mme_token(str) auth token of the MME server Returns: submitted_info(dict) info submitted to MatchMaker and its responses """ if not mme_base_url or not mme_accepts or not mme_token: return 'Please check that Matchmaker connection parameters are valid' url = ''.join([mme_base_url, '/patient/add']) features = [] # this is the list of HPO terms disorders = [] # this is the list of OMIM diagnoses g_features = [] # create contact dictionary contact_info = { 'name' : user_obj['name'], 'href' : ''.join( ['mailto:',user_obj['email']] ), 'institution' : 'Scout software user, Science For Life Laboratory, Stockholm, Sweden' } if add_features: # create features dictionaries features = hpo_terms(case_obj) if add_disorders: # create OMIM disorders dictionaries disorders = omim_terms(case_obj) # send a POST request and collect response for each affected individual in case server_responses = [] submitted_info = { 'contact' : contact_info, 'sex' : add_gender, 'features' : features, 'disorders' : disorders, 'genes_only' : genes_only, 'patient_id' : [] } for individual in case_obj.get('individuals'): if not individual['phenotype'] in [2, 'affected']: # include only affected individuals continue patient = { 'contact' : contact_info, 'id' : '.'.join([case_obj['_id'], individual.get('individual_id')]), # This is a required field form MME 'label' : '.'.join([case_obj['display_name'], individual.get('display_name')]), 'features' : features, 'disorders' : disorders } if add_gender: if individual['sex'] == '1': patient['sex'] = 'MALE' else: patient['sex'] = 'FEMALE' if case_obj.get('suspects'): g_features = genomic_features(store, case_obj, individual.get('display_name'), genes_only) patient['genomicFeatures'] = g_features # send add request to server and capture response resp = matchmaker_request(url=url, token=mme_token, method='POST', content_type=mme_accepts, accept='application/json', data={'patient':patient}) server_responses.append({ 'patient': patient, 'message': resp.get('message'), 'status_code' : resp.get('status_code') }) submitted_info['server_responses'] = server_responses return submitted_info
def test_mme_add(self, populated_database, user_obj, case_obj, parsed_variant): """test calling the controller that submits new patients to Matchmaker""" session = requests.Session() adapter = populated_database # Add an HPO term to this scout case assert len(case_obj.get("phenotype_terms")) == 0 phenotype_term = { "phenotype_id": "HP:0011031", "feature": "Abnormality of iron homeostasis", } updated_case = adapter.case_collection.find_one_and_update( {"_id": case_obj["_id"]}, {"$set": { "phenotype_terms": [phenotype_term] }}, return_document=pymongo.ReturnDocument.AFTER, ) assert updated_case["phenotype_terms"][0] == phenotype_term # Check that features (HPO) terms are obtained by MME parser features = hpo_terms(updated_case) assert features # Add a couple of OMIM diagnoses to this case assert case_obj.get("diagnosis_phenotypes") is None updated_case = adapter.case_collection.find_one_and_update( {"_id": case_obj["_id"]}, {"$set": { "diagnosis_phenotypes": [615349, 616833] }}, return_document=pymongo.ReturnDocument.AFTER, ) assert updated_case["diagnosis_phenotypes"] # Check that OMIM terms are obtained by MME parser diagnoses = omim_terms(updated_case) assert diagnoses # Add variant containing a gene to database and pin it for this case a_gene = adapter.hgnc_collection.find_one() assert a_gene["hgnc_id"] assert adapter.variant_collection.find_one() is None parsed_variant["hgnc_ids"] = [a_gene["hgnc_id"]] parsed_variant["samples"] = [ { # pretend the affected subject has the allele "sample_id": "ADM1059A2", "display_name": "NA12882", "genotype_call": "0/1", } ] adapter.variant_collection.insert_one(parsed_variant) assert adapter.variant_collection.find_one() # pin it updated_case = adapter.case_collection.find_one_and_update( {"_id": case_obj["_id"]}, {"$set": { "suspects": [parsed_variant["_id"]] }}, return_document=pymongo.ReturnDocument.AFTER, ) assert updated_case["suspects"] == [parsed_variant["_id"]] # Check that genomic features are created correcly by MME parser g_feat = genomic_features(adapter, updated_case, "NA12882", "False") assert g_feat # use controller to send request and collect response mme_base_url = "http://localhost:{port}".format( port=self.mock_server_port) submitted_info = controllers.mme_add( store=adapter, user_obj=user_obj, case_obj=updated_case, add_gender=True, add_features=True, add_disorders=True, genes_only=False, mme_base_url=mme_base_url, mme_accepts=MME_ACCEPTS, mme_token=MME_TOKEN, ) assert submitted_info["server_responses"][0]["patient"]