scout-browser 4.92__py3-none-any.whl → 4.94__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scout/adapter/mongo/base.py +3 -0
- scout/adapter/mongo/case.py +27 -2
- scout/adapter/mongo/ccv.py +131 -0
- scout/adapter/mongo/query.py +88 -53
- scout/adapter/mongo/variant.py +6 -5
- scout/adapter/mongo/variant_events.py +45 -1
- scout/build/ccv.py +59 -0
- scout/commands/export/export_command.py +0 -0
- scout/commands/load/base.py +0 -0
- scout/commands/load/user.py +0 -0
- scout/commands/serve.py +2 -1
- scout/commands/update/disease.py +0 -0
- scout/commands/update/genes.py +0 -0
- scout/commands/wipe_database.py +0 -0
- scout/constants/__init__.py +2 -0
- scout/constants/case_tags.py +2 -0
- scout/constants/ccv.py +244 -0
- scout/demo/643594.config.yaml +2 -2
- scout/demo/images/custom_images/1300x1000.jpg +0 -0
- scout/models/ccv_evaluation.py +26 -0
- scout/models/variant/variant.py +1 -0
- scout/parse/variant/compound.py +0 -0
- scout/parse/variant/gene.py +0 -0
- scout/parse/variant/genotype.py +0 -0
- scout/resources/custom_igv_tracks/mane.bb +0 -0
- scout/server/blueprints/cases/controllers.py +21 -0
- scout/server/blueprints/cases/templates/cases/case_report.html +53 -0
- scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +2 -2
- scout/server/blueprints/cases/templates/cases/index.html +0 -2
- scout/server/blueprints/clinvar/controllers.py +4 -5
- scout/server/blueprints/institutes/controllers.py +129 -67
- scout/server/blueprints/institutes/forms.py +5 -2
- scout/server/blueprints/institutes/templates/overview/cases.html +6 -0
- scout/server/blueprints/institutes/templates/overview/causatives.html +1 -1
- scout/server/blueprints/institutes/templates/overview/utils.html +18 -6
- scout/server/blueprints/institutes/templates/overview/verified.html +1 -1
- scout/server/blueprints/institutes/views.py +4 -0
- scout/server/blueprints/panels/controllers.py +5 -6
- scout/server/blueprints/panels/templates/panels/panel.html +5 -5
- scout/server/blueprints/variant/controllers.py +148 -1
- scout/server/blueprints/variant/templates/variant/cancer-variant.html +1 -1
- scout/server/blueprints/variant/templates/variant/ccv.html +183 -0
- scout/server/blueprints/variant/templates/variant/components.html +61 -3
- scout/server/blueprints/variant/templates/variant/tx_overview.html +3 -3
- scout/server/blueprints/variant/templates/variant/variant.html +1 -1
- scout/server/blueprints/variant/templates/variant/variant_details.html +29 -11
- scout/server/blueprints/variant/utils.py +21 -1
- scout/server/blueprints/variant/views.py +114 -3
- scout/server/blueprints/variants/controllers.py +31 -0
- scout/server/blueprints/variants/templates/variants/cancer-sv-variants.html +4 -18
- scout/server/blueprints/variants/templates/variants/cancer-variants.html +4 -13
- scout/server/blueprints/variants/templates/variants/components.html +77 -73
- scout/server/blueprints/variants/templates/variants/indicators.html +11 -0
- scout/server/blueprints/variants/templates/variants/sv-variants.html +2 -2
- scout/server/links.py +1 -1
- scout/server/static/custom_images.js +19 -2
- scout/utils/acmg.py +0 -1
- scout/utils/ccv.py +201 -0
- scout/utils/md5.py +0 -0
- {scout_browser-4.92.dist-info → scout_browser-4.94.dist-info}/METADATA +67 -45
- {scout_browser-4.92.dist-info → scout_browser-4.94.dist-info}/RECORD +54 -49
- {scout_browser-4.92.dist-info → scout_browser-4.94.dist-info}/WHEEL +1 -2
- scout/__version__.py +0 -1
- scout/demo/images/custom_images/640x480_two.jpg +0 -0
- scout_browser-4.92.dist-info/top_level.txt +0 -1
- {scout_browser-4.92.dist-info → scout_browser-4.94.dist-info}/entry_points.txt +0 -0
- {scout_browser-4.92.dist-info → scout_browser-4.94.dist-info/licenses}/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
{% extends "layout.html" %}
|
2
2
|
{% from "variants/utils.html" import cancer_sv_filters,cell_rank, pagination_footer, pagination_hidden_div, filter_form_footer, filter_script_main, update_stash_filter_button_status, dismiss_variants_block, callers_cell %}
|
3
|
-
{% from "variants/components.html" import external_scripts, external_stylesheets, frequency_cell_general, observed_cell_general, variant_gene_symbols_cell, variant_funct_anno_cell %}
|
3
|
+
{% from "variants/components.html" import allele_cell, external_scripts, external_stylesheets, frequency_cell_general, observed_cell_general, variant_gene_symbols_cell, variant_funct_anno_cell %}
|
4
4
|
|
5
5
|
{% block title %}
|
6
6
|
{{ super() }} - {{ institute.display_name }} - {{ case.display_name }} - SV variants
|
@@ -111,8 +111,8 @@
|
|
111
111
|
{{ variant.sub_category|upper }}
|
112
112
|
</td>
|
113
113
|
<td>{{ variant.chromosome if variant.chromosome == variant.end_chrom else variant.chromosome+'-'+variant.end_chrom }}</td>
|
114
|
-
<td class="col-2"><span style="white-space: nowrap;">{{ variant.position|human_longint|safe }}</span></td>
|
115
|
-
<td class="col-2"><span style="white-space: nowrap;">{{ 'inf' if variant.end == 100000000000 else variant.end|human_longint|safe }}</span></td>
|
114
|
+
<td class="col-2">{% if variant.chromosome != variant.end_chrom %}<span class="text-body"></span><b>{{ variant.chromosome }}</b>:</span>{% endif %}<span class="text-body" style="white-space: nowrap;">{{ variant.position|human_longint|safe }}</span></td>
|
115
|
+
<td class="col-2">{% if variant.chromosome != variant.end_chrom %}<span class="text-body"><b>{{ variant.end_chrom }}</b>:</span>{% endif %}<span style="white-space: nowrap;">{{ 'inf' if variant.end == 100000000000 else variant.end|human_longint|safe }}</span></td>
|
116
116
|
<td class="col-2"><span style="white-space: nowrap;">{{ '-' if variant.length == 100000000000 else variant.length|human_longint|safe }}</span></td>
|
117
117
|
<td class="text-end">{{ frequency_cell_general(variant) }}</td>
|
118
118
|
<td>{{observed_cell_general(variant)}}</td>
|
@@ -122,25 +122,11 @@
|
|
122
122
|
<td>
|
123
123
|
{{ variant_funct_anno_cell(variant) }}
|
124
124
|
</td>
|
125
|
-
<td>{{ allele_cell(variant.tumor or {}) }}{% if variant.somatic_score %}<small class="text-
|
125
|
+
<td>{{ allele_cell(variant.tumor or {}) }}{% if variant.somatic_score %}<small class="text-body" data-bs-toggle="tooltip" data-bs-placement="top" title="SV caller (Manta) somatic score">[{{ variant.somatic_score }}]</small>{% endif %}</td>
|
126
126
|
<td>{{ allele_cell(variant.normal or {}) }}</td>
|
127
127
|
</tr>
|
128
128
|
{% endmacro %}
|
129
129
|
|
130
|
-
{% macro allele_cell(allele) %}
|
131
|
-
{% if 'alt_freq' in allele %}
|
132
|
-
{% if allele.alt_freq == -1 %}
|
133
|
-
<span class="text-muted">.</span>
|
134
|
-
{% else %}
|
135
|
-
{{ allele.alt_freq|round(4) }}
|
136
|
-
{% endif %}
|
137
|
-
<br>
|
138
|
-
<small class="text-muted">{% if allele.alt_depth >= 0 %}{{ allele.alt_depth }}{% else %}.{% endif %}|{% if allele.ref_depth >= 0 %}{{ allele.ref_depth }}{% else %}.{% endif %}</small>
|
139
|
-
{% else %}
|
140
|
-
<span class="text-muted">N/A</span>
|
141
|
-
{% endif %}
|
142
|
-
{% endmacro %}
|
143
|
-
|
144
130
|
|
145
131
|
{% block scripts %}
|
146
132
|
{{ super() }}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
{% extends "layout.html" %}
|
2
2
|
|
3
|
-
{% from "variants/components.html" import external_scripts, external_stylesheets, gene_cell, frequency_cell_general, observed_cell_general, variant_funct_anno_cell %}
|
3
|
+
{% from "variants/components.html" import allele_cell, external_scripts, external_stylesheets, gene_cell, frequency_cell_general, observed_cell_general, variant_funct_anno_cell %}
|
4
4
|
{% from "variants/utils.html" import cancer_filters, cell_rank, pagination_footer, pagination_hidden_div, dismiss_variants_block, filter_form_footer, filter_script_main, update_stash_filter_button_status, callers_cell %}
|
5
|
-
{% from "variants/indicators.html" import pin_indicator, causative_badge, clinical_assessments_badge, comments_badge, dismissals_badge, evaluations_badge, group_assessments_badge, matching_manual_rank, other_tiered_variants, research_assessments_badge %}
|
5
|
+
{% from "variants/indicators.html" import pin_indicator, causative_badge, clinical_assessments_badge, comments_badge, dismissals_badge, evaluations_badge, ccv_evaluations_badge, group_assessments_badge, matching_manual_rank, other_tiered_variants, research_assessments_badge %}
|
6
6
|
|
7
7
|
{% block title %}
|
8
8
|
{{ variant_type|capitalize }} somatic variants
|
@@ -109,6 +109,7 @@
|
|
109
109
|
{{ comments_badge(case, institute, variant) }}
|
110
110
|
{{ causative_badge(variant, case) }}
|
111
111
|
{{ other_tiered_variants(variant) }}
|
112
|
+
{{ ccv_evaluations_badge(variant) }}
|
112
113
|
</td>
|
113
114
|
<td>{{ rank_cell(variant) }}</td>
|
114
115
|
<td>{{ cadd_cell(variant) }}</td>
|
@@ -174,17 +175,7 @@
|
|
174
175
|
{% endmacro %}
|
175
176
|
|
176
177
|
{% macro position_cell(variant) %}
|
177
|
-
{{ variant.chromosome }}
|
178
|
-
{% endmacro %}
|
179
|
-
|
180
|
-
{% macro allele_cell(allele) %}
|
181
|
-
{% if 'alt_freq' in allele %}
|
182
|
-
{{ allele.alt_freq|round(4) }}
|
183
|
-
<br>
|
184
|
-
<small class="text-muted">{{ allele.alt_depth }} | {{ allele.ref_depth }}</small>
|
185
|
-
{% else %}
|
186
|
-
<span class="text-muted">N/A</span>
|
187
|
-
{% endif %}
|
178
|
+
<span class="text-body"><b>{{ variant.chromosome }}</b>:{{ variant.position }}</span>
|
188
179
|
{% endmacro %}
|
189
180
|
|
190
181
|
{% block scripts %}
|
@@ -161,94 +161,84 @@
|
|
161
161
|
|
162
162
|
{% macro gene_cell(variant, inherit_palette) %}
|
163
163
|
<div class="align-items-center">
|
164
|
-
|
165
|
-
|
164
|
+
|
165
|
+
{% macro gene_tooltip(gene) %}
|
166
|
+
<div>
|
166
167
|
<div>
|
168
|
+
<strong>{{ gene.hgnc_symbol }}</strong>: {{ gene.description }}
|
169
|
+
</div>
|
170
|
+
{% if gene.inheritance %}
|
167
171
|
<div>
|
168
|
-
<strong>
|
172
|
+
<strong>Models</strong>: {{ gene.inheritance|join(',') }}
|
169
173
|
</div>
|
170
|
-
|
171
|
-
|
172
|
-
<strong>Models</strong>: {{ variant.first_rep_gene.inheritance|join(',') }}
|
173
|
-
</div>
|
174
|
-
{% endif %}
|
175
|
-
{% if variant.first_rep_gene.phenotypes %}
|
174
|
+
{% endif %}
|
175
|
+
{% if gene.phenotypes %}
|
176
176
|
<div><strong>OMIM disease</strong>
|
177
|
-
{% for disease in
|
178
|
-
<div>
|
179
|
-
{{ disease.description }}
|
180
|
-
</div>
|
177
|
+
{% for disease in gene.phenotypes %}
|
178
|
+
<div>{{ disease.description }}</div>
|
181
179
|
{% endfor %}
|
182
180
|
</div>
|
183
181
|
{% endif %}
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
182
|
+
</div>
|
183
|
+
{% endmacro %}
|
184
|
+
|
185
|
+
{% macro gene_link(gene) %}
|
186
|
+
<a
|
187
|
+
data-bs-toggle="tooltip"
|
188
|
+
data-bs-html="true"
|
189
|
+
title="{{ gene_tooltip(gene) }}"
|
190
|
+
href="{{ url_for('genes.gene', hgnc_id=gene.hgnc_id) }}"
|
191
|
+
>
|
192
|
+
{{ gene.hgnc_symbol or gene.hgnc_id }}
|
194
193
|
</a>
|
194
|
+
{% endmacro %}
|
195
|
+
|
196
|
+
{% macro panel_badge(variant, gene_id=0) %}
|
197
|
+
|
198
|
+
{% set matching_panels = [] %}
|
199
|
+
{% for panel in variant.case_panels|rejectattr('removed')|list %}
|
200
|
+
{% if gene_id in panel.hgnc_ids %}
|
201
|
+
{% set _ = matching_panels.append(panel) %}
|
202
|
+
{% endif %}
|
203
|
+
{% endfor %}
|
195
204
|
|
196
|
-
{% set panel_count =
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
205
|
+
{% set panel_count = matching_panels|length %}
|
206
|
+
<a
|
207
|
+
class="badge bg-secondary text-white"
|
208
|
+
data-bs-toggle="popover"
|
209
|
+
data-bs-html="true"
|
210
|
+
data-bs-trigger="hover click"
|
211
|
+
title="Overlapping gene panels"
|
212
|
+
data-bs-content="{% for panel in matching_panels %}
|
213
|
+
{{ panel.panel_name|safe }}<br>
|
214
|
+
{% else %} No ovelapping gene panels {% endfor %}"
|
215
|
+
>{{ panel_count }}</a>
|
216
|
+
{% endmacro %}
|
217
|
+
|
218
|
+
{% if variant.category in ["cancer", "sv_cancer"] %}
|
219
|
+
{% if variant.first_rep_gene %}
|
220
|
+
{{ gene_link(variant.first_rep_gene) }}
|
221
|
+
{% endif %}
|
222
|
+
{% if variant.secondary_gene %}
|
223
|
+
<span class="text-muted">
|
224
|
+
({{ variant.second_rep_gene.hgnc_symbol or variant.second_rep_gene.hgnc_id }})
|
225
|
+
</span>
|
226
|
+
{% endif %}
|
227
|
+
{% if variant.first_rep_gene or variant.second_rep_gene %}
|
228
|
+
{{ panel_badge(variant, variant.first_rep_gene.hgnc_id or variant.second_rep_gene.hgnc_id) }}
|
209
229
|
{% endif %}
|
210
230
|
{% else %}
|
211
|
-
{% set panel_count = variant.case_panels|rejectattr('removed')|list|count %}
|
212
231
|
{% for gene in variant.genes %}
|
213
232
|
<div>
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
<div>
|
221
|
-
<strong>Models</strong>: {{ gene.inheritance|join(',') }}
|
222
|
-
</div>
|
223
|
-
{% endif %}
|
224
|
-
{% if gene.phenotypes %}
|
225
|
-
<div><strong>OMIM disease</strong>
|
226
|
-
{% for disease in gene.phenotypes %}
|
227
|
-
<div>
|
228
|
-
{{ disease.description }}
|
229
|
-
</div>
|
230
|
-
{% endfor %}
|
231
|
-
</div>
|
232
|
-
{% endif %}
|
233
|
-
</div>"
|
234
|
-
href="{{ url_for('genes.gene', hgnc_id=gene.hgnc_id) }}">{{ gene.hgnc_symbol or gene.hgnc_id }}
|
235
|
-
{% for model in gene.inheritance %} {{ inheritance_badge(model,inherit_palette) }}{% endfor %}</a>
|
236
|
-
{% if panel_count > 0 %}
|
237
|
-
<a
|
238
|
-
class="badge bg-secondary text-white"
|
239
|
-
data-bs-toggle="popover"
|
240
|
-
data-bs-html="true"
|
241
|
-
data-bs-trigger="hover click"
|
242
|
-
data-bs-content="{% for panel in variant.case_panels|sort(attribute='panel_name',case_sensitive=False)|rejectattr('removed') %}
|
243
|
-
{{ panel.panel_name|safe }}<br>
|
244
|
-
{% endfor %}"
|
245
|
-
title="Overlapping gene panels">{{panel_count}}
|
246
|
-
</a>
|
247
|
-
{% endif %}
|
248
|
-
</div>
|
233
|
+
{{ gene_link(gene) }}
|
234
|
+
{% for model in gene.inheritance %}
|
235
|
+
{{ inheritance_badge(model, inherit_palette) }}
|
236
|
+
{% endfor %}
|
237
|
+
{{ panel_badge(variant, gene.hgnc_id) }}
|
238
|
+
</div>
|
249
239
|
{% endfor %}
|
250
|
-
|
251
240
|
{% endif %}
|
241
|
+
|
252
242
|
</div>
|
253
243
|
{% endmacro %}
|
254
244
|
|
@@ -413,3 +403,17 @@
|
|
413
403
|
<script src="https://cdn.datatables.net/1.12.0/js/jquery.dataTables.min.js" integrity="sha512-fu0WiDG5xqtX2iWk7cp17Q9so54SC+5lk/z/glzwlKFdEOwGG6piUseP2Sik9hlvlmyOJ0lKXRSuv1ltdVk9Jg==" referrerpolicy="no-referrer" crossorigin="anonymous"></script>
|
414
404
|
<script src="https://cdn.datatables.net/1.12.0/js/dataTables.bootstrap5.min.js" integrity="sha512-nfoMMJ2SPcUdaoGdaRVA1XZpBVyDGhKQ/DCedW2k93MTRphPVXgaDoYV1M/AJQLCiw/cl2Nbf9pbISGqIEQRmQ==" referrerpolicy="no-referrer" crossorigin="anonymous"></script>
|
415
405
|
{% endmacro %}
|
406
|
+
|
407
|
+
{% macro allele_cell(allele) %}
|
408
|
+
{% if 'alt_freq' in allele %}
|
409
|
+
{% if allele.alt_freq == -1 %}
|
410
|
+
<span class="text-body">.</span>
|
411
|
+
{% else %}
|
412
|
+
<span class="text-body"><b>{{ allele.alt_freq|round(4) }}</b></span>
|
413
|
+
{% endif %}
|
414
|
+
<br>
|
415
|
+
<small class="text-body">{% if 'alt_depth' in allele and allele.alt_depth >= 0 %}{{ allele.alt_depth }}{% else %}.{% endif %}|{% if 'ref_depth' in allele and allele.ref_depth >= 0 %}{{ allele.ref_depth }}{% else %}.{% endif %}</small>
|
416
|
+
{% else %}
|
417
|
+
<span class="text-body">N/A</span>
|
418
|
+
{% endif %}
|
419
|
+
{% endmacro %}
|
@@ -74,6 +74,17 @@
|
|
74
74
|
{% endif %}
|
75
75
|
{% endmacro %}
|
76
76
|
|
77
|
+
{% macro ccv_evaluations_badge(variant) %}
|
78
|
+
{% if variant.ccv_evaluations %}
|
79
|
+
{% for evaluation in (variant.ccv_evaluations or []) %}
|
80
|
+
<span class="badge bg-secondary" style="margin-left:1px" data-bs-toggle="tooltip" data-bs-placement="right"
|
81
|
+
title="Previously classified as {{ evaluation.ccv_classification.label }}">
|
82
|
+
{{ evaluation.ccv_classification.short }}
|
83
|
+
</span>
|
84
|
+
{% endfor %}
|
85
|
+
{% endif %}
|
86
|
+
{% endmacro %}
|
87
|
+
|
77
88
|
{% macro dismissals_badge(variant) %}
|
78
89
|
{% if variant.dismissals %}
|
79
90
|
<span class="badge bg-secondary" style="margin-left:1px" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="top"
|
@@ -108,8 +108,8 @@ onsubmit="return validateForm()">
|
|
108
108
|
</td>
|
109
109
|
<td>{{ variant.sub_category|upper }}</td>
|
110
110
|
<td>{{ variant.chromosome if variant.chromosome == variant.end_chrom else variant.chromosome+'-'+variant.end_chrom }}</td>
|
111
|
-
<td><span style="white-space: nowrap;">{{ variant.position|human_longint|safe }}</span></td>
|
112
|
-
<td><span style="white-space: nowrap;">{{ 'inf' if variant.end == 100000000000 else variant.end|human_longint|safe }}</span></td>
|
111
|
+
<td>{% if variant.chromosome != variant.end_chrom %}<span class="text-body"></span><b>{{ variant.chromosome }}</b>:</span>{% endif %}<span style="white-space: nowrap;">{{ variant.position|human_longint|safe }}</span></td>
|
112
|
+
<td>{% if variant.chromosome != variant.end_chrom %}<span class="text-body"><b>{{ variant.end_chrom }}</b>:</span>{% endif %}<span style="white-space: nowrap;">{{ 'inf' if variant.end == 100000000000 else variant.end|human_longint|safe }}</span></td>
|
113
113
|
<td class="text-end"><span style="white-space: nowrap;">{{ '-' if variant.length == 100000000000 else variant.length|human_longint|safe}}</span></td>
|
114
114
|
<td>
|
115
115
|
{{ frequency_cell_general(variant) }}
|
scout/server/links.py
CHANGED
@@ -714,7 +714,7 @@ def ucsc_link(variant_obj, build=None):
|
|
714
714
|
)
|
715
715
|
if build == 38:
|
716
716
|
url_template = (
|
717
|
-
"http://genome.ucsc.edu/cgi-bin/hgTracks?db=
|
717
|
+
"http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg38&"
|
718
718
|
"position=chr{this[chromosome]}:{this[position]}"
|
719
719
|
"-{this[position]}&dgv=pack&knownGene=pack&omimGene=pack"
|
720
720
|
)
|
@@ -1,3 +1,11 @@
|
|
1
|
+
const imgMaxWidth = window.innerWidth*0.7;
|
2
|
+
const imgMaxHeight = window.innerHeight*0.7;
|
3
|
+
|
4
|
+
function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) {
|
5
|
+
let ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);
|
6
|
+
return [srcWidth*ratio, srcHeight*ratio];
|
7
|
+
}
|
8
|
+
|
1
9
|
/**
|
2
10
|
* This function fetches an image from disk and displays it in a specified div
|
3
11
|
* @param {string} imageUrl - The URL of the image to fetch
|
@@ -9,15 +17,24 @@
|
|
9
17
|
.then(blob => {
|
10
18
|
const img = document.createElement("img");
|
11
19
|
img.src = URL.createObjectURL(blob);
|
20
|
+
if (width > imgMaxWidth || height > imgMaxHeight) {
|
21
|
+
const resized_pixels = calculateAspectRatioFit(width, height, imgMaxWidth, imgMaxHeight);
|
22
|
+
width = resized_pixels[0];
|
23
|
+
height = resized_pixels[1];
|
24
|
+
}
|
12
25
|
if (width) {
|
13
26
|
img.style.width = width+'px';
|
14
27
|
}
|
15
28
|
if (height) {
|
16
29
|
img.style.height = height+'px';
|
17
30
|
}
|
18
|
-
//
|
31
|
+
// Add the image to a link and add the link to the div
|
32
|
+
const link = document.createElement('a');
|
33
|
+
link.appendChild(img);
|
34
|
+
link.href = img.src;
|
35
|
+
link.setAttribute('target', "_blank");
|
19
36
|
const div = document.getElementById(divId);
|
20
|
-
div.appendChild(
|
37
|
+
div.appendChild(link);
|
21
38
|
})
|
22
39
|
.catch(error => console.error(error));
|
23
40
|
}
|
scout/utils/acmg.py
CHANGED
scout/utils/ccv.py
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
# coding=UTF-8
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from scout.constants.ccv import CCV_COMPLETE_MAP, CCV_POTENTIAL_CONFLICTS
|
5
|
+
|
6
|
+
|
7
|
+
def get_ccv_points(ccv_terms: set) -> int:
|
8
|
+
"""
|
9
|
+
Use the algorithm described in Clingen-CGC-VIGG classification paper (Horak 2022)
|
10
|
+
Given a set of CCV evidence criteria terms
|
11
|
+
for each term,
|
12
|
+
check prefixes if no suffix match or stand-alone criteria match
|
13
|
+
|
14
|
+
O positive, SB negative.
|
15
|
+
VS 8 points, S 4, M 2, P 1.
|
16
|
+
|
17
|
+
If no terms return None
|
18
|
+
|
19
|
+
Args:
|
20
|
+
ccv_terms(set(str)): A collection of prediction terms
|
21
|
+
Returns:
|
22
|
+
points(int):"""
|
23
|
+
|
24
|
+
ovs_terms = []
|
25
|
+
os_terms = []
|
26
|
+
om_terms = []
|
27
|
+
op_terms = []
|
28
|
+
sbvs_terms = []
|
29
|
+
sbs_terms = []
|
30
|
+
sbm_terms = []
|
31
|
+
sbp_terms = []
|
32
|
+
|
33
|
+
prefix_map = {
|
34
|
+
"OVS": ovs_terms,
|
35
|
+
"OS": os_terms,
|
36
|
+
"OM": om_terms,
|
37
|
+
"OP": op_terms,
|
38
|
+
"SBVS": sbvs_terms,
|
39
|
+
"SBS": sbs_terms,
|
40
|
+
"SBM": sbm_terms,
|
41
|
+
"SBP": sbp_terms,
|
42
|
+
}
|
43
|
+
|
44
|
+
suffix_map = {
|
45
|
+
"_Strong": {"O": os_terms, "SB": sbs_terms},
|
46
|
+
"_Moderate": {"O": om_terms, "SB": sbm_terms},
|
47
|
+
"_Supporting": {"O": op_terms, "SB": sbp_terms},
|
48
|
+
}
|
49
|
+
|
50
|
+
for term in ccv_terms:
|
51
|
+
for suffix, prefix_dict in suffix_map.items():
|
52
|
+
if term.endswith(suffix):
|
53
|
+
for prefix, term_list in prefix_dict.items():
|
54
|
+
if term.startswith(prefix):
|
55
|
+
term_list.append(term)
|
56
|
+
break
|
57
|
+
else:
|
58
|
+
continue
|
59
|
+
break
|
60
|
+
else:
|
61
|
+
for prefix, term_list in prefix_map.items():
|
62
|
+
if term.startswith(prefix):
|
63
|
+
term_list.append(term)
|
64
|
+
break
|
65
|
+
points = (
|
66
|
+
8 * len(ovs_terms)
|
67
|
+
+ 4 * len(os_terms)
|
68
|
+
+ 2 * len(om_terms)
|
69
|
+
+ len(op_terms)
|
70
|
+
- 8 * len(sbvs_terms)
|
71
|
+
- 4 * len(sbs_terms)
|
72
|
+
- 2 * len(sbm_terms)
|
73
|
+
- len(sbp_terms)
|
74
|
+
)
|
75
|
+
return points
|
76
|
+
|
77
|
+
|
78
|
+
def get_ccv(ccv_terms: set) -> Optional[str]:
|
79
|
+
"""Use the algorithm described in Clingen-CGC-VIGG classification paper (Horak 2022)
|
80
|
+
|
81
|
+
If no terms return None
|
82
|
+
|
83
|
+
O >= 10
|
84
|
+
OP 6 <= p <= 9
|
85
|
+
VUS 0 <= p <= 5
|
86
|
+
LB -1 <= p <= -6
|
87
|
+
B <= -7
|
88
|
+
|
89
|
+
Args:
|
90
|
+
ccv_terms(set(str)): A collection of prediction terms
|
91
|
+
|
92
|
+
Returns:
|
93
|
+
prediction(str): in ['uncertain_significance','benign','likely_benign',
|
94
|
+
'likely_oncogenic','oncogenic']
|
95
|
+
|
96
|
+
"""
|
97
|
+
if not ccv_terms:
|
98
|
+
return None
|
99
|
+
|
100
|
+
points = get_ccv_points(ccv_terms)
|
101
|
+
|
102
|
+
if points <= -7:
|
103
|
+
prediction = "benign"
|
104
|
+
elif points <= -1:
|
105
|
+
prediction = "likely_benign"
|
106
|
+
elif points <= 5:
|
107
|
+
prediction = "uncertain_significance"
|
108
|
+
elif points <= 9:
|
109
|
+
prediction = "likely_oncogenic"
|
110
|
+
elif points >= 10:
|
111
|
+
prediction = "oncogenic"
|
112
|
+
|
113
|
+
return prediction
|
114
|
+
|
115
|
+
|
116
|
+
def get_ccv_temperature(ccv_terms: set) -> Optional[dict]:
|
117
|
+
"""
|
118
|
+
Use the algorithm described in Clingen-CGC-VIGG classification paper (Horak 2022)
|
119
|
+
|
120
|
+
O >= 10
|
121
|
+
OP 6 <= p <= 9
|
122
|
+
VUS 0 <= p <= 5
|
123
|
+
LB -1 <= p <= -6
|
124
|
+
B <= -7
|
125
|
+
|
126
|
+
If no terms return None
|
127
|
+
|
128
|
+
Args:
|
129
|
+
ccv_terms(set(str)): A collection of prediction terms
|
130
|
+
|
131
|
+
Returns:
|
132
|
+
dict:
|
133
|
+
temperature:
|
134
|
+
(points, temperature, point_classification)
|
135
|
+
|
136
|
+
"""
|
137
|
+
TEMPERATURE_STRINGS = {
|
138
|
+
-1: {"label": "B/LB", "color": "success", "icon": "fa-times"},
|
139
|
+
0: {"label": "Ice cold", "color": "info", "icon": "fa-icicles"},
|
140
|
+
1: {"label": "Cold", "color": "info", "icon": "fa-snowman"},
|
141
|
+
2: {"label": "Cold", "color": "info", "icon": "fa-snowflake"},
|
142
|
+
3: {"label": "Tepid", "color": "yellow", "icon": "fa-temperature-half"},
|
143
|
+
4: {"label": "Warm", "color": "orange", "icon": "fa-mug-hot"},
|
144
|
+
5: {"label": "Hot", "color": "red", "icon": "fa-pepper-hot"},
|
145
|
+
6: {"label": "LO/O", "color": "danger", "icon": "fa-stethoscope"},
|
146
|
+
}
|
147
|
+
|
148
|
+
if not ccv_terms:
|
149
|
+
points = 0
|
150
|
+
point_classification = "uncertain_significance"
|
151
|
+
return {
|
152
|
+
"points": points,
|
153
|
+
"temperature": TEMPERATURE_STRINGS[points].get("label"),
|
154
|
+
"temperature_class": TEMPERATURE_STRINGS[points].get("color"),
|
155
|
+
"temperature_icon": TEMPERATURE_STRINGS[points].get("icon"),
|
156
|
+
"point_classification": CCV_COMPLETE_MAP[point_classification].get("short"),
|
157
|
+
}
|
158
|
+
|
159
|
+
points = get_ccv_points(ccv_terms)
|
160
|
+
|
161
|
+
if points <= -7:
|
162
|
+
point_classification = "benign"
|
163
|
+
temperature_icon = TEMPERATURE_STRINGS[-1].get("icon")
|
164
|
+
elif points <= -1:
|
165
|
+
point_classification = "likely_benign"
|
166
|
+
temperature_icon = TEMPERATURE_STRINGS[-1].get("icon")
|
167
|
+
elif points <= 5:
|
168
|
+
point_classification = "uncertain_significance"
|
169
|
+
elif points <= 9:
|
170
|
+
point_classification = "likely_oncogenic"
|
171
|
+
temperature_icon = TEMPERATURE_STRINGS[6].get("icon")
|
172
|
+
elif points >= 10:
|
173
|
+
point_classification = "oncogenic"
|
174
|
+
temperature_icon = TEMPERATURE_STRINGS[6].get("icon")
|
175
|
+
|
176
|
+
temperature_class = CCV_COMPLETE_MAP[point_classification].get("color")
|
177
|
+
temperature = CCV_COMPLETE_MAP[point_classification].get("label")
|
178
|
+
|
179
|
+
if point_classification == "uncertain_significance":
|
180
|
+
temperature_class = TEMPERATURE_STRINGS[points].get("color")
|
181
|
+
temperature = TEMPERATURE_STRINGS[points].get("label")
|
182
|
+
temperature_icon = TEMPERATURE_STRINGS[points].get("icon")
|
183
|
+
|
184
|
+
return {
|
185
|
+
"points": points,
|
186
|
+
"temperature": temperature,
|
187
|
+
"temperature_class": temperature_class,
|
188
|
+
"temperature_icon": temperature_icon,
|
189
|
+
"point_classification": CCV_COMPLETE_MAP[point_classification].get("short"),
|
190
|
+
}
|
191
|
+
|
192
|
+
|
193
|
+
def get_ccv_conflicts(ccv_terms: set) -> list:
|
194
|
+
"""Check potential conflict paris, return list of reference strings."""
|
195
|
+
|
196
|
+
conflicts = []
|
197
|
+
for t1, t2, reference in CCV_POTENTIAL_CONFLICTS:
|
198
|
+
if t1 in ccv_terms and t2 in ccv_terms:
|
199
|
+
conflicts.append(reference)
|
200
|
+
|
201
|
+
return conflicts
|
scout/utils/md5.py
CHANGED
File without changes
|