Skip to content

Commit

Permalink
feat: add linkouts to non-coding tables (#302)
Browse files Browse the repository at this point in the history
* refactor linkouts

* add linkouts to non-coding table
  • Loading branch information
FelixMoelder committed May 15, 2024
1 parent f558487 commit 15ce609
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 75 deletions.
70 changes: 70 additions & 0 deletions workflow/resources/datavzrd/linkouts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
function hgvsc_dropdown(value, row) {
function varsome_link(row) {
let ref = row["reference allele"];
let alt = row["alternative allele"];
if ( alt && ref) {
let chr = row.chromosome;
let pos = row.position;
let build = ( row.build === "GRCh38" ) ? "hg38/" : "hg19/";
const url = "https://varsome.com/variant/";
let aa_regex = /^[ACGTacgt]+$/;
if ( ref.match(aa_regex) && alt.match(aa_regex)) {
let descriptor = `${chr}:${pos}:${ref}:${alt}`
return `${url}${build}${descriptor}`;
}
}
return ``
}

function genomenexus_link(row) {
let hgvsg = row.hgvsg
if ( hgvsg ) {
let build = ( row.build === "GRCh38" ) ? "grch38." : "";
const url_suffix = "genomenexus.org/variant/"
return `https://${build}${url_suffix}${hgvsg}`
}
return ``
}

function alphamissense_link(row) {
if ( row.swissprot && row["protein position"] ) {
let swissprot = row.swissprot.split('.')[0]
let residue = row["protein position"]
const url_prefix = "https://alphamissense.hegelab.org/hotspot?uid="
return `${url_prefix}${swissprot}&resi=${residue}`
}
return ``
}

let hgvs_regex = /^(.+?):(.+)$/;
// discard protein id
let hgvsc = ( value ) ? value.match(hgvs_regex)[2].replace('%3D', '=') : "-";
let links = "";

let varsome_url = varsome_link(row);
if (varsome_url != "") {
links = `<a class="dropdown-item" href='${varsome_url}' target='_blank' rel='noopener noreferrer' >VarSome</a>`
}

let genomenexus_url = genomenexus_link(row)
if (genomenexus_url != "") {
links = `${links}<a class="dropdown-item" href='${genomenexus_url}' target='_blank' rel='noopener noreferrer' >Genome Nexus</a>`
}

let alphamissense_url = alphamissense_link(row);
if (alphamissense_url != "") {
links = `${links}<a class="dropdown-item" href='${alphamissense_url}' target='_blank' rel='noopener noreferrer' >AlphaMissense</a>`
}
if ( links ) {
let dropdown = `<div class="btn-group">
<button class="btn btn-outline-secondary btn-table btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
${hgvsc}
</button>
<div class="dropdown-menu">
${links}
</div>
</div>
`;
return dropdown;
}
}
96 changes: 21 additions & 75 deletions workflow/resources/datavzrd/variant-calls-template.datavzrd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,64 +11,22 @@ __definitions__:
def read_file(path):
return open(path, 'r').read()
- |
hgvsp_content = f"""
hgvs_content = f"""
function(value, row) {{
let hgvsp_regex = /^(.+?):(.+)$/;
let hgvs_regex = /^(.+?):(.+)$/;
// discard protein id
let hgvsp = value.match(hgvsp_regex)[2].replace('%3D', '=');
return hgvsp
}}
"""
- |
varsome_link = f"""
function(row) {{
let hgvsp_regex = /^(.+?):(.+)$/;
// discard protein id
let hgvsp = row.hgvsp.match(hgvsp_regex)[2].replace('%3D', '=');
let chr = row.chromosome;
let pos = row.position;
let ref = row["reference allele"];
let alt = row["alternative allele"];
let build = ( "{params.build}" === "GRCh38" ) ? "hg38/" : "hg19/";
const url = "https://varsome.com/variant/";
let aa_regex = /^[ACGTacgt]+$/;
if ( ref.match(aa_regex) && alt.match(aa_regex)) {{
let descriptor = `${{chr}}:${{pos}}:${{ref}}:${{alt}}`
return `${{url}}${{build}}${{descriptor}}`;
}}
else {{
return `${{hgvsp}}`;
}}
}}
"""
- |
genomenexus_link = f"""
function(row) {{
let hgvsg = row.hgvsg
let build = ( "{params.build}" === "GRCh38" ) ? "grch38." : "";
const url_suffix = "genomenexus.org/variant/"
return `https://${{build}}${{url_suffix}}${{hgvsg}}`
}}
"""
- |
alphamissense_link = f"""
function(row) {{
if ( typeof row.swissprot !== 'undefined' ) {{
let swissprot = row.swissprot.split('.')[0]
let residue = row["protein position"]
const url_prefix = "https://alphamissense.hegelab.org/hotspot?uid="
return `${{url_prefix}}${{swissprot}}&resi=${{residue}}`
}}
return ``
let hgvs = value.match(hgvs_regex)[2].replace('%3D', '=');
return hgvs
}}
"""
- |
protein_id = f"""
function(row) {{
if ( typeof row.hgvsp !== 'undefined') {{
let protein_id = row.hgvsp.split(':')[0]
return protein_id
}}
return ``
}}
"""
- |
Expand Down Expand Up @@ -232,7 +190,7 @@ views:
desc: |
?f"""
Variants in coding regions.\n{params.event_desc}\n
SpliceAI scores are probabilities of a variant being splice-altered.\n
SpliceAI scores are probabilities of a variant being splice-altering.\n
AlphaMissense scores are classified as: likely benign (<0.34), ambiguous (0.34<=, <=0.564), likely pathogenic (0.564<).
"""
dataset: ?f"{group}-coding"
Expand All @@ -243,14 +201,9 @@ views:
ensembl:
url: https://www.ensembl.org/Homo_sapiens/Transcript/Summary?t={feature}
hgvsp:
link-to-url:
custom-content: ?hgvsp_content
VarSome:
url: "{query_varsome}"
Genome Nexus:
url: "{query_genomenexus}"
AlphaMissense:
url: "{query_alphamissense}"
custom: ?hgvs_content
hgvsc:
custom: ?read_file(input.linkouts)
vartype:
display-mode: hidden
impact:
Expand Down Expand Up @@ -330,8 +283,6 @@ views:
display-mode: hidden
hgvsg:
display-mode: hidden
hgvsc:
display-mode: detail
chromosome:
display-mode: detail
position:
Expand Down Expand Up @@ -410,28 +361,19 @@ views:
optional: true
custom: ?make_popover
add-columns:
query_varsome:
value: ?varsome_link
display-mode: hidden
query_genomenexus:
value: ?genomenexus_link
display-mode: hidden
query_alphamissense:
value: ?alphamissense_link
build:
value: ?f"function() {{ return `{params.build}` }}"
display-mode: hidden
ensembl_protein_id:
value: ?protein_id
display-mode: detail





?f"{group}-noncoding":
desc: |
?f"""
Variants in non-coding regions.\n{params.event_desc}
SpliceAI scores are probabilities of a variant being splice-altered.\n
SpliceAI scores are probabilities of a variant being splice-altering.\n
AlphaMissense scores are classified as: likely benign (<0.34), ambiguous (0.34<=, <=0.564), likely pathogenic (0.564<).
"""
dataset: ?f"{group}-noncoding"
Expand All @@ -442,6 +384,8 @@ views:
link-to-url:
ensembl:
url: https://www.ensembl.org/Homo_sapiens/Transcript/Summary?t={feature}
hgvsc:
custom: ?read_file(input.linkouts)
consequence:
plot:
heatmap:
Expand All @@ -450,6 +394,7 @@ views:
vartype:
display-mode: hidden
swissprot:
optional: true
display-mode: hidden
impact:
plot:
Expand Down Expand Up @@ -516,9 +461,6 @@ views:
hgvsg:
optional: true
display-mode: hidden
hgvsc:
optional: true
display-mode: detail
chromosome:
display-mode: detail
position:
Expand Down Expand Up @@ -592,3 +534,7 @@ views:
population:
optional: true
custom: ?make_popover
add-columns:
build:
value: ?f"function() {{ return `{params.build}` }}"
display-mode: hidden
1 change: 1 addition & 0 deletions workflow/rules/datavzrd.smk
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ rule datavzrd_variants_calls:
input:
coding_calls=get_datavzrd_data(impact="coding"),
noncoding_calls=get_datavzrd_data(impact="noncoding"),
linkouts=workflow.source_path("../resources/datavzrd/linkouts.js"),
spec_observations=workflow.source_path(
"../resources/datavzrd/spec_observations.json"
),
Expand Down

0 comments on commit 15ce609

Please sign in to comment.