Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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