def causatives(institute_obj, request): """Create content to be displayed on institute causatives page Args: institute_obj(dict) An institute object request(flask.request) request sent by user's browser Returns: data(dict) """ # Retrieve variants grouped by case query = request.args.get("query", "") hgnc_id = None if "|" in query: # filter accepts an array of IDs. Provide an array with one ID element try: hgnc_id = [int(query.split(" | ", 1)[0])] except ValueError: flash("Provided gene info could not be parsed!", "warning") variants = list( store.check_causatives(institute_obj=institute_obj, limit_genes=hgnc_id)) if variants: variants = sorted( variants, key=lambda k: k.get("hgnc_symbols", [None])[0] or k.get("str_repid" ) or "", ) all_variants = {} all_cases = {} for variant_obj in variants: if variant_obj["category"] in ["snv", "cancer"]: update_representative_gene(variant_obj, variant_obj.get( "genes", [])) # required to display cDNA and protein change if variant_obj["case_id"] not in all_cases: case_obj = store.case(variant_obj["case_id"]) all_cases[variant_obj["case_id"]] = case_obj else: case_obj = all_cases[variant_obj["case_id"]] if variant_obj["variant_id"] not in all_variants: all_variants[variant_obj["variant_id"]] = [] all_variants[variant_obj["variant_id"]].append((case_obj, variant_obj)) data = dict( institute=institute_obj, variant_groups=all_variants, acmg_map={ key: ACMG_COMPLETE_MAP[value] for key, value in ACMG_MAP.items() }, ) return data
def causatives(institute_id): institute_obj = institute_and_case(store, institute_id) query = request.args.get("query", "") hgnc_id = None if "|" in query: # filter accepts an array of IDs. Provide an array with one ID element try: hgnc_id = [int(query.split(" | ", 1)[0])] except ValueError: flash("Provided gene info could not be parsed!", "warning") variants = store.check_causatives(institute_obj=institute_obj, limit_genes=hgnc_id) if variants: variants.sort("hgnc_symbols", pymongo.ASCENDING) all_variants = {} all_cases = {} for variant_obj in variants: if variant_obj["case_id"] not in all_cases: case_obj = store.case(variant_obj["case_id"]) all_cases[variant_obj["case_id"]] = case_obj else: case_obj = all_cases[variant_obj["case_id"]] if variant_obj["variant_id"] not in all_variants: all_variants[variant_obj["variant_id"]] = [] all_variants[variant_obj["variant_id"]].append((case_obj, variant_obj)) acmg_map = { key: ACMG_COMPLETE_MAP[value] for key, value in ACMG_MAP.items() } return dict(institute=institute_obj, variant_groups=all_variants, acmg_map=acmg_map)
def update_variant_actions(self, institute_obj, case_obj, old_eval_variants): """Update existing variants of a case according to the tagged status (manual_rank, dismiss_variant, mosaic_tags) of its previous variants Accepts: institute_obj(dict): an institute object case_obj(dict): a case object old_eval_variants(list(Variant)) Returns: updated_variants(dict): a dictionary like this: 'manual_rank' : [list of variant ids], 'dismiss_variant' : [list of variant ids], 'mosaic_tags' : [list of variant ids], 'cancer_tier': [list of variant ids], 'acmg_classification': [list of variant ids] 'is_commented': [list of variant ids] """ updated_variants = { "manual_rank": [], "dismiss_variant": [], "mosaic_tags": [], "cancer_tier": [], "acmg_classification": [], "is_commented": [], } LOG.debug( "Updating action status for {} variants in case:{}".format( len(old_eval_variants), case_obj["_id"] ) ) n_status_updated = 0 for old_var in old_eval_variants: # search for the same variant in newly uploaded vars for this case display_name = old_var["display_name"] new_var = self.variant_collection.find_one( {"case_id": case_obj["_id"], "display_name": display_name} ) if new_var is None: # same var is no more among case variants, skip it LOG.warning( "Trying to propagate manual action from an old variant to a new, but couldn't find same variant any more" ) continue for action in list( updated_variants.keys() ): # manual_rank, dismiss_variant, mosaic_tags if ( old_var.get(action) is not None or action == "is_commented" ): # tag new variant accordingly # collect only the latest associated event: verb = action if action == "acmg_classification": verb = "acmg" elif action == "is_commented": verb = "comment" old_event = self.event_collection.find_one( { "case": case_obj["_id"], "verb": verb, "variant_id": old_var["variant_id"], "category": "variant", }, sort=[("updated_at", pymongo.DESCENDING)], ) if old_event is None: continue user_obj = self.user(old_event["user_id"]) if user_obj is None: continue # create a link to the new variant for the events link = "/{0}/{1}/{2}".format( new_var["institute"], case_obj["display_name"], new_var["_id"] ) updated_variant = None if action == "manual_rank": updated_variant = self.update_manual_rank( institute=institute_obj, case=case_obj, user=user_obj, link=link, variant=new_var, manual_rank=old_var.get(action), ) if action == "dismiss_variant": updated_variant = self.update_dismiss_variant( institute=institute_obj, case=case_obj, user=user_obj, link=link, variant=new_var, dismiss_variant=old_var.get(action), ) if action == "mosaic_tags": updated_variant = self.update_mosaic_tags( institute=institute_obj, case=case_obj, user=user_obj, link=link, variant=new_var, mosaic_tags=old_var.get(action), ) if action == "cancer_tier": updated_variant = self.update_cancer_tier( institute=institute_obj, case=case_obj, user=user_obj, link=link, variant=new_var, cancer_tier=old_var.get(action), ) if action == "acmg_classification": str_classif = ACMG_MAP.get(old_var.get("acmg_classification")) updated_variant = self.update_acmg( institute_obj=institute_obj, case_obj=case_obj, user_obj=user_obj, link=link, variant_obj=new_var, acmg_str=str_classif, ) if action == "is_commented": updated_comments = self.comments_reupload( old_var, new_var, institute_obj, case_obj ) if updated_comments > 0: LOG.info( "Created {} new comments for variant {} after reupload".format( updated_comments, display_name ) ) updated_variant = new_var if updated_variant is not None: n_status_updated += 1 updated_variants[action].append(updated_variant["_id"]) LOG.info("Variant actions updated {} times".format(n_status_updated)) return updated_variants