Esempio n. 1
0
def test_genomic_features(real_variant_database, case_obj):
    """Test function that parses pinned variants from a case and returns them as MatchMaker genomic features"""

    # GIVEN a case with a pinned variant that is in the database
    adapter = real_variant_database
    test_variant = adapter.variant_collection.find_one(
        {"hgnc_symbols": ["POT1"]})

    case_obj["suspects"] = [test_variant["_id"]]
    sample_name = "NA12882"

    # WHEN the parse genomic_features is used to parse genotype features of this case
    g_features = genomic_features(
        store=adapter,
        case_obj=case_obj,
        sample_name=sample_name,
        candidate_vars=case_obj["suspects"],
        genes_only=False,
    )
    # THEN it should return the expected data
    assert isinstance(g_features, list)
    assert g_features[0]["gene"] == {"id": "POT1"}
    assert isinstance(g_features[0]["variant"], dict)
Esempio n. 2
0
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']
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
    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"]