def case(store, institute_obj, case_obj): """Preprocess a single case.""" case_obj['individual_ids'] = [] for individual in case_obj['individuals']: try: sex = int(individual.get('sex', 0)) except ValueError as err: sex = 0 individual['sex_human'] = SEX_MAP[sex] individual['phenotype_human'] = PHENOTYPE_MAP.get( individual['phenotype']) case_obj['individual_ids'].append(individual['individual_id']) case_obj['assignees'] = [ store.user(user_email) for user_email in case_obj.get('assignees', []) ] suspects = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get('suspects', []) ] causatives = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get('causatives', []) ] distinct_genes = set() case_obj['panel_names'] = [] for panel_info in case_obj.get('panels', []): if panel_info.get('is_default'): panel_obj = store.gene_panel(panel_info['panel_name'], version=panel_info.get('version')) distinct_genes.update( [gene['hgnc_id'] for gene in panel_obj.get('genes', [])]) full_name = "{} ({})".format(panel_obj['display_name'], panel_obj['version']) case_obj['panel_names'].append(full_name) case_obj['default_genes'] = list(distinct_genes) for hpo_term in itertools.chain(case_obj.get('phenotype_groups', []), case_obj.get('phenotype_terms', [])): hpo_term['hpo_link'] = ( "http://compbio.charite.de/hpoweb/showterm?id={}".format( hpo_term['phenotype_id'])) # other collaborators than the owner of the case o_collaborators = [ store.institute(collab_id) for collab_id in case_obj['collaborators'] if collab_id != case_obj['owner'] ] case_obj['o_collaborators'] = [(collab_obj['_id'], collab_obj['display_name']) for collab_obj in o_collaborators] irrelevant_ids = ('cust000', institute_obj['_id']) collab_ids = [(collab['_id'], collab['display_name']) for collab in store.institutes() if (collab['_id'] not in irrelevant_ids) and ( collab['_id'] not in case_obj['collaborators'])] events = list(store.events(institute_obj, case=case_obj))
def case_report_content(store, institute_obj, case_obj): """Gather contents to be visualized in a case report Args: store(adapter.MongoAdapter) institute_obj(models.Institute) case_obj(models.Case) Returns: data(dict) """ variant_types = { "causatives_detailed": "causatives", "partial_causatives_detailed": "partial_causatives", "suspects_detailed": "suspects", "classified_detailed": "acmg_classification", "tagged_detailed": "manual_rank", "tier_detailed": "cancer_tier", "dismissed_detailed": "dismiss_variant", "commented_detailed": "is_commented", } data = case_obj for individual in data["individuals"]: try: sex = int(individual.get("sex", 0)) except ValueError as err: sex = 0 individual["sex_human"] = SEX_MAP[sex] individual["phenotype_human"] = PHENOTYPE_MAP.get(individual["phenotype"]) dismiss_options = DISMISS_VARIANT_OPTIONS if case_obj.get("track") == "cancer": dismiss_options = { **DISMISS_VARIANT_OPTIONS, **CANCER_SPECIFIC_VARIANT_DISMISS_OPTIONS, } # Add the case comments data["comments"] = store.events(institute_obj, case=case_obj, comments=True) data["manual_rank_options"] = MANUAL_RANK_OPTIONS data["cancer_tier_options"] = CANCER_TIER_OPTIONS data["dismissed_options"] = dismiss_options data["genetic_models"] = dict(GENETIC_MODELS) data["report_created_at"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") evaluated_variants = {vt: [] for vt in variant_types} # We collect all causatives (including the partial ones) and suspected variants # These are handeled in separate since they are on case level for var_type in ["causatives", "suspects", "partial_causatives"]: # These include references to variants vt = "_".join([var_type, "detailed"]) for var_id in case_obj.get(var_type, []): variant_obj = store.variant(var_id) if not variant_obj: continue if var_type == "partial_causatives": # Collect associated phenotypes variant_obj["phenotypes"] = [ value for key, value in case_obj["partial_causatives"].items() if key == var_id ][0] evaluated_variants[vt].append(variant_obj) ## get variants for this case that are either classified, commented, tagged or dismissed. for var_obj in store.evaluated_variants(case_id=case_obj["_id"]): # Check which category it belongs to for vt in variant_types: keyword = variant_types[vt] # When found we add it to the categpry # Eac variant can belong to multiple categories if keyword not in var_obj: continue evaluated_variants[vt].append(var_obj) for var_type in evaluated_variants: decorated_variants = [] for var_obj in evaluated_variants[var_type]: # We decorate the variant with some extra information decorated_info = variant_decorator( store=store, institute_id=institute_obj["_id"], case_name=case_obj["display_name"], variant_id=None, variant_obj=var_obj, add_case=False, add_other=False, get_overlapping=False, add_compounds=False, variant_type=var_obj["category"], institute_obj=institute_obj, case_obj=case_obj, ) decorated_variants.append(decorated_info["variant"]) # Add the decorated variants to the case data[var_type] = decorated_variants return data
def case(store, institute_obj, case_obj): """Preprocess a single case. Prepare the case to be displayed in the case view. Args: store(adapter.MongoAdapter) institute_obj(models.Institute) case_obj(models.Case) Returns: data(dict): includes the cases, how many there are and the limit. """ # Convert individual information to more readable format case_obj['individual_ids'] = [] for individual in case_obj['individuals']: try: sex = int(individual.get('sex', 0)) except ValueError as err: sex = 0 individual['sex_human'] = SEX_MAP[sex] individual['phenotype_human'] = PHENOTYPE_MAP.get( individual['phenotype']) case_obj['individual_ids'].append(individual['individual_id']) case_obj['assignees'] = [ store.user(user_email) for user_email in case_obj.get('assignees', []) ] # Fetch the variant objects for suspects and causatives suspects = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get('suspects', []) ] causatives = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get('causatives', []) ] # Set of all unique genes in the default gene panels distinct_genes = set() case_obj['panel_names'] = [] for panel_info in case_obj.get('panels', []): if not panel_info.get('is_default'): continue panel_obj = store.gene_panel(panel_info['panel_name'], version=panel_info.get('version')) distinct_genes.update( [gene['hgnc_id'] for gene in panel_obj.get('genes', [])]) full_name = "{} ({})".format(panel_obj['display_name'], panel_obj['version']) case_obj['panel_names'].append(full_name) case_obj['default_genes'] = list(distinct_genes) for hpo_term in itertools.chain(case_obj.get('phenotype_groups', []), case_obj.get('phenotype_terms', [])): hpo_term['hpo_link'] = ( "http://compbio.charite.de/hpoweb/showterm?id={}".format( hpo_term['phenotype_id'])) # other collaborators than the owner of the case o_collaborators = [ store.institute(collab_id) for collab_id in case_obj['collaborators'] if collab_id != case_obj['owner'] ] case_obj['o_collaborators'] = [(collab_obj['_id'], collab_obj['display_name']) for collab_obj in o_collaborators] irrelevant_ids = ('cust000', institute_obj['_id']) collab_ids = [(collab['_id'], collab['display_name']) for collab in store.institutes() if (collab['_id'] not in irrelevant_ids) and ( collab['_id'] not in case_obj['collaborators'])] events = list(store.events(institute_obj, case=case_obj))
def case_report_content(store, institute_obj, case_obj): """Gather contents to be visualized in a case report Args: store(adapter.MongoAdapter) institute_obj(models.Institute) case_obj(models.Case) Returns: data(dict) """ variant_types = { 'causatives_detailed': 'causatives', 'suspects_detailed': 'suspects', 'classified_detailed': 'acmg_classification', 'tagged_detailed': 'manual_rank', 'dismissed_detailed': 'dismiss_variant', 'commented_detailed': 'is_commented', } data = case_obj for individual in data['individuals']: try: sex = int(individual.get('sex', 0)) except ValueError as err: sex = 0 individual['sex_human'] = SEX_MAP[sex] individual['phenotype_human'] = PHENOTYPE_MAP.get( individual['phenotype']) # Add the case comments data['comments'] = store.events(institute_obj, case=case_obj, comments=True) data['manual_rank_options'] = MANUAL_RANK_OPTIONS data['dismissed_options'] = DISMISS_VARIANT_OPTIONS data['genetic_models'] = dict(GENETIC_MODELS) data['report_created_at'] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M") evaluated_variants = {} for vt in variant_types: evaluated_variants[vt] = [] # We collect all causatives and suspected variants # These are handeled in separate since they are on case level for var_type in ['causatives', 'suspects']: #These include references to variants vt = '_'.join([var_type, 'detailed']) for var_id in case_obj.get(var_type, []): variant_obj = store.variant(var_id) if not variant_obj: continue # If the variant exists we add it to the evaluated variants evaluated_variants[vt].append(variant_obj) ## get variants for this case that are either classified, commented, tagged or dismissed. for var_obj in store.evaluated_variants(case_id=case_obj['_id']): # Check which category it belongs to for vt in variant_types: keyword = variant_types[vt] # When found we add it to the categpry # Eac variant can belong to multiple categories if keyword in var_obj: evaluated_variants[vt].append(var_obj) for var_type in evaluated_variants: decorated_variants = [] for var_obj in evaluated_variants[var_type]: # We decorate the variant with some extra information if var_obj['category'] == 'snv': decorated_info = variant_decorator(store=store, institute_obj=institute_obj, case_obj=case_obj, variant_id=None, variant_obj=var_obj, add_case=False, add_other=False, get_overlapping=False) else: decorated_info = sv_variant(store=store, institute_id=institute_obj['_id'], case_name=case_obj['display_name'], variant_obj=var_obj, add_case=False, get_overlapping=False) decorated_variants.append(decorated_info['variant']) # Add the decorated variants to the case data[var_type] = decorated_variants return data
def case_report_content(store, institute_obj, case_obj): """Gather contents to be visualized in a case report Args: store(adapter.MongoAdapter) institute_obj(models.Institute) case_obj(models.Case) Returns: data(dict) """ variant_types = { 'causatives_detailed': 'causatives', 'suspects_detailed': 'suspects', 'classified_detailed': 'acmg_classification', 'tagged_detailed': 'manual_rank', 'dismissed_detailed': 'dismiss_variant', 'commented_detailed': 'is_commented', } data = case_obj for individual in data['individuals']: try: sex = int(individual.get('sex', 0)) except ValueError as err: sex = 0 individual['sex_human'] = SEX_MAP[sex] individual['phenotype_human'] = PHENOTYPE_MAP.get(individual['phenotype']) # Add the case comments data['comments'] = store.events(institute_obj, case=case_obj, comments=True) data['manual_rank_options'] = MANUAL_RANK_OPTIONS data['dismissed_options'] = DISMISS_VARIANT_OPTIONS data['genetic_models'] = dict(GENETIC_MODELS) data['report_created_at'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") evaluated_variants = {} for vt in variant_types: evaluated_variants[vt] = [] # We collect all causatives and suspected variants # These are handeled in separate since they are on case level for var_type in ['causatives', 'suspects']: #These include references to variants vt = '_'.join([var_type, 'detailed']) for var_id in case_obj.get(var_type,[]): variant_obj = store.variant(var_id) if not variant_obj: continue # If the variant exists we add it to the evaluated variants evaluated_variants[vt].append(variant_obj) ## get variants for this case that are either classified, commented, tagged or dismissed. for var_obj in store.evaluated_variants(case_id=case_obj['_id']): # Check which category it belongs to for vt in variant_types: keyword = variant_types[vt] # When found we add it to the categpry # Eac variant can belong to multiple categories if keyword in var_obj: evaluated_variants[vt].append(var_obj) for var_type in evaluated_variants: decorated_variants = [] for var_obj in evaluated_variants[var_type]: # We decorate the variant with some extra information if var_obj['category'] == 'snv': decorated_info = variant_decorator( store=store, institute_obj=institute_obj, case_obj=case_obj, variant_id=None, variant_obj=var_obj, add_case=False, add_other=False, get_overlapping=False ) else: decorated_info = sv_variant( store=store, institute_id=institute_obj['_id'], case_name=case_obj['display_name'], variant_obj=var_obj, add_case=False, get_overlapping=False ) decorated_variants.append(decorated_info['variant']) # Add the decorated variants to the case data[var_type] = decorated_variants return data