Example #1
0
def trait_view(report_slug, trait_slug="", rerun=None):

    report_data = list(
        report.select(report, trait, mapping.trait_id)
        .join(trait)
        .where(
            ((report.report_slug == report_slug) & (report.release == 0))
            | ((report.report_hash == report_slug) & (report.release > 0))
        )
        .join(mapping, JOIN.LEFT_OUTER)
        .distinct()
        .dicts()
        .execute()
    )

    if not report_data:
        return render_template("404.html"), 404

    if report_data[0]["release"] == 0:
        report_url_slug = report_data[0]["report_slug"]
    else:
        report_url_slug = report_data[0]["report_hash"]

    if not trait_slug:
        return redirect(url_for("trait_view", report_slug=report_url_slug, trait_slug=report_data[0]["trait_slug"]))
    else:
        try:
            trait_data = [x for x in report_data if x["trait_slug"] == trait_slug][0]
        except:
            # Redirect user to first trait if it can't be found.
            return redirect(url_for("trait_view", report_slug=report_url_slug, trait_slug=report_data[0]["trait_slug"]))

    page_title = trait_data["report_name"] + " > " + trait_data["trait_name"]
    title = trait_data["report_name"]
    subtitle = trait_data["trait_name"]
    # Define report and trait slug
    report_slug = trait_data["report_slug"]  # don't remove
    trait_slug = trait_data["trait_slug"]  # don't remove

    r = report.get(report_slug=report_slug)
    t = trait.get(report=r, trait_slug=trait_slug)

    # phenotype data
    phenotype_data = list(
        trait_value.select(strain.strain, trait_value.value)
        .join(trait)
        .join(report)
        .switch(trait_value)
        .join(strain)
        .where(report.report_slug == r.report_slug)
        .where(trait.trait_slug == t.trait_slug)
        .dicts()
        .execute()
    )

    if rerun == "rerun":
        t.status = "queue"
        t.save()
        launch_mapping(verify_request=False)
        # Return user to current trait
        return redirect(url_for("trait_view", report_slug=report_url_slug, trait_slug=trait_slug))

    report_trait = "%s/%s" % (report_slug, trait_slug)
    base_url = "https://storage.googleapis.com/cendr/" + report_trait

    # Fetch significant mappings
    mapping_results = list(
        mapping.select(mapping, report, trait)
        .join(trait)
        .join(report)
        .filter((report.report_slug == report_slug), (trait.trait_slug == trait_slug))
        .dicts()
        .execute()
    )

    #######################
    # Variant Correlation #
    #######################
    var_corr = []
    for m in mapping_results:
        var_corr.append(correlation.get_correlated_genes(r, t, m["chrom"], m["interval_start"], m["interval_end"]))
    tbl_color = {"LOW": "success", "MODERATE": "warning", "HIGH": "danger"}

    #######################
    # Fetch geo locations #
    #######################
    geo_gt = {}
    for m in mapping_results:
        try:
            result = GT.fetch_geo_gt(m["chrom"], m["pos"])
            geo_gt[m["chrom"] + ":" + str(m["pos"])] = result
        except:
            pass
    geo_gt = json.dumps(geo_gt)

    status = trait_data["status"]

    # List available datasets
    report_files = list(storage.Client().get_bucket("cendr").list_blobs(prefix=report_trait + "/tables"))
    report_files = [os.path.split(x.name)[1] for x in report_files]

    # Fetch biotypes descriptions
    from cendr import biotypes

    return render_template("report.html", **locals())
Example #2
0
def process_gwa():
    release_dict = {"public": 0, "embargo12": 1, "private": 2}
    req = request.get_json()

    # Add Validation
    rep_names = report_namecheck(req["report_name"])
    req["report_slug"] = rep_names["report_slug"]
    req["report_hash"] = rep_names["report_hash"]
    if "error" in rep_names.keys():
        return ""
    data = req["trait_data"]
    del req["trait_data"]
    req["release"] = release_dict[req["release"]]
    req["version"] = 1
    trait_names = data[0][1:]
    strain_set = []
    trait_keep = []
    with db.atomic():
        report_rec = report(**req)
        report_rec.save()
        trait_data = []

        for row in data[1:]:
            if row[0] is not None and row[0] != "":
                q = row[0].strip().replace("(", "\(").replace(")", "\)")
                strain_name = resolve_strain_isotype(q)
                strain_set.append(strain_name)

        trait_set = data[0][1:]
        for n, t in enumerate(trait_set):
            trait_vals = [row[n + 1] for row in data[1:] if row[n + 1]]
            if t and len(trait_vals) > 0:
                submit_time = datetime.now(pytz.timezone("America/Chicago"))
                trait_keep.append(t)
                trait_set[n] = trait.insert(
                    report=report_rec, trait_name=t, trait_slug=slugify(t), status="queue", submission_date=submit_time
                ).execute()
            else:
                trait_set[n] = None
        for col, t in enumerate(trait_set):
            for row, s in enumerate(strain_set):
                if t and s and is_number(data[1:][row][col + 1]):
                    trait_data.append({"trait": t, "strain": s, "value": autoconvert(data[1:][row][col + 1])})

        trait_value.insert_many(trait_data).execute()
    for t in trait_keep:
        req["trait_name"] = t
        req["trait_slug"] = slugify(t)
        req["db_name"] = dbname
        req["submission_date"] = datetime.now(pytz.timezone("America/Chicago")).isoformat()
        # Submit job to task queue.
        launch_mapping(verify_request=False)
        req["success"] = True
        # Send user email
    if req["release"] > 0:
        report_slug = req["report_hash"]
    else:
        report_slug = req["report_slug"]
    mail.send_mail(
        sender="CeNDR <*****@*****.**>",
        to=req["email"],
        subject="CeNDR Mapping Report - " + req["report_slug"],
        body=mapping_submission.format(report_slug=report_slug),
    )

    return str(json.dumps(req))