def test_variant_case_no_genes(adapter, case_obj, variant_obj): """Test to preprocess a variant""" # GIVEN a variant wihtout gene info assert variant_obj.get("genes") is None # GIVEN that no region vcf exists assert "region_vcf_file" not in case_obj # WHEN adding info variant_case(adapter, case_obj, variant_obj) # THEN assert no region vcf was added since there where no gene info assert "region_vcf_file" not in case_obj
def test_variant_case(adapter, case_obj, variant_obj): """Test to preprocess a variant""" # GIVEN a variant WITH gene info variant_obj["genes"] = [ { "hgnc_id": 1 }, { "hgnc_id": 2, "common": { "chromosome": "1", "start": "10", "end": "100" } }, ] # GIVEN a variant without gene info assert case_obj.get("region_vcf_file") is None variant_case(adapter, case_obj, variant_obj) # THEN assert that the region VCF was created assert case_obj.get("region_vcf_file") is not None
def variant( store, institute_id, case_name, variant_id=None, variant_obj=None, add_case=True, add_other=True, get_overlapping=True, add_compounds=True, variant_category=None, variant_type=None, case_obj=None, institute_obj=None, ): """Pre-process a single variant for the detailed variant view. Adds information from case and institute that is not present on the variant object Args: store(scout.adapter.MongoAdapter) institute_id(str) case_name(str) variant_id(str) variant_obj(dict) add_case(bool): If info about files case should be added add_other(bool): If information about other causatives should be added get_overlapping(bool): If overlapping variants should be collected variant_type(str): in ["clinical", "research"] variant_category(str): ["snv", "str", "sv", "cancer", "cancer_sv"] institute_obj(scout.models.Institute) case_obj(scout.models.Case) Returns: variant_info(dict): { 'variant': <variant_obj>, 'causatives': <list(other_causatives)>, 'events': <list(events)>, 'overlapping_svs': <list(overlapping svs)>, 'manual_rank_options': MANUAL_RANK_OPTIONS, 'cancer_tier_options': CANCER_TIER_OPTIONS, 'dismiss_variant_options': DISMISS_VARIANT_OPTIONS, 'ACMG_OPTIONS': ACMG_OPTIONS, 'igv_tracks': IGV_TRACKS, 'evaluations': <list(evaluations)>, } """ if not (institute_obj and case_obj): institute_obj, case_obj = institute_and_case(store, institute_id, case_name) # If the variant is already collected we skip this part if not variant_obj: # NOTE this will query with variant_id == document_id, not the variant_id. variant_obj = store.variant(variant_id) if variant_obj is None: return None variant_type = variant_type or variant_obj.get("variant_type", "clinical") # request category specific variant display variant_category = variant_obj.get("category", "snv") LOG.debug("Variant category {}".format(variant_category)) variant_id = variant_obj["variant_id"] genome_build = str(case_obj.get("genome_build", "37")) if genome_build not in ["37", "38"]: genome_build = "37" panels = default_panels(store, case_obj) variant_obj = add_gene_info(store, variant_obj, gene_panels=panels, genome_build=genome_build) # Add information about bam files and create a region vcf if add_case: variant_case(store, case_obj, variant_obj) # Collect all the events for the variant events = list( store.events(institute_obj, case=case_obj, variant_id=variant_id))
def variant( store, institute_id, case_name, variant_id=None, variant_obj=None, add_case=True, add_other=True, get_overlapping=True, add_compounds=True, variant_category=None, variant_type=None, case_obj=None, institute_obj=None, ): """Pre-process a single variant for the detailed variant view. Adds information from case and institute that is not present on the variant object Args: store(scout.adapter.MongoAdapter) institute_id(str) case_name(str) variant_id(str) variant_obj(dict) add_case(bool): If info about files case should be added add_other(bool): If information about other causatives should be added get_overlapping(bool): If overlapping variants should be collected variant_type(str): in ["clinical", "research"] variant_category(str): ["snv", "str", "sv", "cancer", "cancer_sv"] institute_obj(scout.models.Institute) case_obj(scout.models.Case) Returns: variant_info(dict): { 'variant': <variant_obj>, 'causatives': <list(other_causatives)>, 'events': <list(events)>, 'overlapping_svs': <list(overlapping svs)>, 'manual_rank_options': MANUAL_RANK_OPTIONS, 'cancer_tier_options': CANCER_TIER_OPTIONS, 'dismiss_variant_options': DISMISS_VARIANT_OPTIONS, 'ACMG_OPTIONS': ACMG_OPTIONS, 'evaluations': <list(evaluations)>, } """ if not (institute_obj and case_obj): institute_obj, case_obj = institute_and_case(store, institute_id, case_name) # If the variant is already collected we skip this part if not variant_obj: # NOTE this will query with variant_id == document_id, not the variant_id. variant_obj = store.variant(variant_id) if variant_obj is None: return None variant_type = variant_type or variant_obj.get("variant_type", "clinical") # request category specific variant display variant_category = variant_obj.get("category", "snv") LOG.debug("Variant category {}".format(variant_category)) variant_id = variant_obj["variant_id"] genome_build = str(case_obj.get("genome_build", "37")) if genome_build not in ["37", "38"]: genome_build = "37" panels = default_panels(store, case_obj) variant_obj = add_gene_info(store, variant_obj, gene_panels=panels, genome_build=genome_build) # Add information about bam files and create a region vcf if add_case: variant_case(store, case_obj, variant_obj) # Collect all the events for the variant events = store.events(institute_obj, case=case_obj, variant_id=variant_id) for event in events: event["verb"] = VERBS_MAP[event["verb"]] # Comments are not on case level so these needs to be fetched on their own variant_obj["comments"] = store.events(institute_obj, case=case_obj, variant_id=variant_id, comments=True) # Adds information about other causative variants other_causatives = [] if add_other: other_causatives = [ causative for causative in store.other_causatives(case_obj, variant_obj) ] # Gather display information for the genes variant_obj.update(predictions(variant_obj.get("genes", []))) # Prepare classification information for visualisation classification = variant_obj.get("acmg_classification") if isinstance(classification, int): acmg_code = ACMG_MAP[variant_obj["acmg_classification"]] variant_obj["acmg_classification"] = ACMG_COMPLETE_MAP[acmg_code] # sort compounds on combined rank score compounds = variant_obj.get("compounds", []) if compounds: # Gather display information for the compounds for compound_obj in compounds: compound_obj.update(predictions(compound_obj.get("genes", []))) variant_obj["compounds"] = sorted( variant_obj["compounds"], key=lambda compound: -compound["combined_score"]) variant_obj["end_position"] = end_position(variant_obj) # Add general variant links variant_obj.update(get_variant_links(variant_obj, int(genome_build))) variant_obj["frequencies"] = frequencies(variant_obj) if variant_category in ["snv", "cancer"]: # This is to convert a summary of frequencies to a string variant_obj["frequency"] = frequency(variant_obj) # Format clinvar information variant_obj["clinsig_human"] = (clinsig_human(variant_obj) if variant_obj.get("clnsig") else None) # Add display information about callers variant_obj["callers"] = callers(variant_obj, category=variant_category) # Convert affection status to strings for the template is_affected(variant_obj, case_obj) if variant_obj.get("genetic_models"): variant_models = set( model.split("_", 1)[0] for model in variant_obj["genetic_models"]) all_models = variant_obj.get("all_models", set()) variant_obj["is_matching_inheritance"] = set.intersection( variant_models, all_models) # Prepare classification information for visualisation classification = variant_obj.get("acmg_classification") if isinstance(classification, int): acmg_code = ACMG_MAP[variant_obj["acmg_classification"]] variant_obj["acmg_classification"] = ACMG_COMPLETE_MAP[acmg_code] evaluations = [] for evaluation_obj in store.get_evaluations(variant_obj): evaluation(store, evaluation_obj) evaluations.append(evaluation_obj) case_clinvars = store.case_to_clinVars(case_obj.get("display_name")) if variant_id in case_clinvars: variant_obj["clinvar_clinsig"] = case_clinvars.get( variant_id)["clinsig"] overlapping_vars = [] if get_overlapping: for var in store.overlapping(variant_obj): var.update(predictions(var.get("genes", []))) overlapping_vars.append(var) variant_obj["end_chrom"] = variant_obj.get("end_chrom", variant_obj["chromosome"]) dismiss_options = DISMISS_VARIANT_OPTIONS if case_obj.get("track") == "cancer": dismiss_options = { **DISMISS_VARIANT_OPTIONS, **CANCER_SPECIFIC_VARIANT_DISMISS_OPTIONS, } return { "institute": institute_obj, "case": case_obj, "variant": variant_obj, variant_category: True, "causatives": other_causatives, "events": events, "overlapping_vars": overlapping_vars, "manual_rank_options": MANUAL_RANK_OPTIONS, "cancer_tier_options": CANCER_TIER_OPTIONS, "dismiss_variant_options": dismiss_options, "mosaic_variant_options": MOSAICISM_OPTIONS, "ACMG_OPTIONS": ACMG_OPTIONS, "evaluations": evaluations, }