scout-browser 4.92__py3-none-any.whl → 4.95.0__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/hgnc.py +5 -1
- scout/adapter/mongo/managed_variant.py +4 -2
- scout/adapter/mongo/query.py +91 -54
- scout/adapter/mongo/variant.py +17 -11
- scout/adapter/mongo/variant_events.py +45 -1
- scout/build/ccv.py +59 -0
- scout/build/panel.py +1 -1
- 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/constants/gene_tags.py +22 -12
- scout/demo/643594.config.yaml +2 -2
- scout/demo/643594.research.mei.vcf.gz +0 -0
- scout/demo/643594.research.mei.vcf.gz.tbi +0 -0
- scout/demo/images/custom_images/1300x1000.jpg +0 -0
- scout/load/panelapp.py +8 -12
- scout/models/ccv_evaluation.py +26 -0
- scout/models/variant/variant.py +1 -0
- scout/parse/omim.py +5 -6
- scout/parse/panelapp.py +16 -42
- scout/parse/variant/compound.py +20 -21
- 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 +48 -0
- scout/server/blueprints/cases/templates/cases/case_report.html +61 -1
- scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +2 -2
- scout/server/blueprints/cases/templates/cases/index.html +0 -2
- scout/server/blueprints/cases/views.py +5 -5
- 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/managed_variants/forms.py +17 -2
- scout/server/blueprints/managed_variants/templates/managed_variants/managed_variants.html +2 -2
- 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 +86 -5
- scout/server/blueprints/variant/templates/variant/sv-variant.html +2 -2
- 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 +115 -5
- scout/server/blueprints/variants/controllers.py +31 -0
- scout/server/blueprints/variants/forms.py +33 -5
- 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 +193 -0
- scout/utils/link.py +4 -3
- scout/utils/md5.py +0 -0
- {scout_browser-4.92.dist-info → scout_browser-4.95.0.dist-info}/METADATA +67 -45
- {scout_browser-4.92.dist-info → scout_browser-4.95.0.dist-info}/RECORD +70 -65
- {scout_browser-4.92.dist-info → scout_browser-4.95.0.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.95.0.dist-info}/entry_points.txt +0 -0
- {scout_browser-4.92.dist-info → scout_browser-4.95.0.dist-info/licenses}/LICENSE +0 -0
@@ -76,15 +76,15 @@
|
|
76
76
|
</td> <!-- end of ID col-->
|
77
77
|
|
78
78
|
<td> <!-- HGVS Description col -->
|
79
|
-
{% set hgvs_c = (tx.coding_sequence_name or '')|truncate(
|
79
|
+
{% set hgvs_c = (tx.coding_sequence_name or '')|truncate(30, True) %}
|
80
80
|
{% if variant.chromosome in ["MT","M"] %}
|
81
81
|
{% set mt_notation = "m." ~ variant.position ~ variant.reference ~ ">" ~ variant.alternative %}
|
82
|
-
{{ mt_notation|truncate(
|
82
|
+
{{ mt_notation|truncate(30,True) }} <span class="text-muted">({{ hgvs_c }})</span>
|
83
83
|
{% else %}
|
84
84
|
{{ hgvs_c }}
|
85
85
|
{% endif %}
|
86
86
|
<span class="text-muted float-end">
|
87
|
-
{{ (tx.protein_sequence_name or '')|url_decode }}
|
87
|
+
{{ (tx.protein_sequence_name or '')|url_decode|truncate(30, True) }}
|
88
88
|
</span>
|
89
89
|
</td> <!-- end of HGVS Description col -->
|
90
90
|
|
@@ -84,7 +84,7 @@
|
|
84
84
|
|
85
85
|
<div class="row">
|
86
86
|
<div class="col-lg-3 col-md-6">
|
87
|
-
{{ panel_classify(variant, institute, case, ACMG_OPTIONS, manual_rank_options, cancer_tier_options, dismiss_variant_options, mosaic_variant_options, evaluations) }}
|
87
|
+
{{ panel_classify(variant, institute, case, ACMG_OPTIONS, CCV_OPTIONS, manual_rank_options, cancer_tier_options, dismiss_variant_options, mosaic_variant_options, evaluations, ccv_evaluations) }}
|
88
88
|
</div>
|
89
89
|
<div class="col-lg-5 col-md-6">
|
90
90
|
{{ panel_summary() }}
|
@@ -200,6 +200,20 @@
|
|
200
200
|
</div>
|
201
201
|
{% endmacro %}
|
202
202
|
|
203
|
+
{% macro observation_badge(observed_case) %}
|
204
|
+
|
205
|
+
{% if observed_case.variant and observed_case.variant.category == "snv"%}
|
206
|
+
<a class="badge rounded-pill bg-light text-dark" target="_blank" href="{{ url_for('variant.variant', institute_id=observed_case.case.owner, case_name=observed_case.case.display_name, variant_id=observed_case.variant._id) }}">{{ observed_case.case.display_name }}</a>
|
207
|
+
{% elif observed_case.variant and observed_case.variant.category == "sv"%}
|
208
|
+
<a class="badge rounded-pill bg-light text-dark" target="_blank" href="{{ url_for('variant.sv_variant', institute_id=observed_case.case.owner, case_name=observed_case.case.display_name, variant_id=observed_case.variant._id) }}">{{ observed_case.case.display_name }}</a>
|
209
|
+
{% else %}
|
210
|
+
<span data-bs-toggle="tooltip" title="Missing link, this might be caused by variants not loaded after a rerun or inexact SV matching.">
|
211
|
+
<span class="ml-3 badge rounded-pill bg-light text-dark">{{ observed_case.case.display_name }}</span>
|
212
|
+
</span>
|
213
|
+
{% endif %}
|
214
|
+
|
215
|
+
{% endmacro %}
|
216
|
+
|
203
217
|
{% macro observations_panel(variant, observations, case) %}
|
204
218
|
<div class="card panel-default">
|
205
219
|
<div class="panel-heading d-flex justify-content-between">
|
@@ -240,19 +254,23 @@
|
|
240
254
|
</span>
|
241
255
|
{% endif %}
|
242
256
|
{% endif %}
|
243
|
-
{% for
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
<a class="badge rounded-pill bg-light text-dark" target="_blank" href="{{ url_for('variant.sv_variant', institute_id=data.case.owner, case_name=data.case.display_name, variant_id=data.variant._id) }}">{{ data.case.display_name }}</a>
|
248
|
-
{% else %}
|
249
|
-
<span data-bs-toggle="tooltip" title="Missing link, this might be caused by variants not loaded after a rerun or inexact SV matching.">
|
250
|
-
<span class="ml-3 badge rounded-pill bg-light text-dark">{{ data.case.display_name }}</span>
|
251
|
-
</span>
|
252
|
-
{% endif %}
|
257
|
+
{% for observed_case in obs.cases %}
|
258
|
+
{% if loop.index <= 10 %}
|
259
|
+
{{ observation_badge(observed_case) }}
|
260
|
+
{% endif %}
|
253
261
|
{% endfor %}
|
262
|
+
|
254
263
|
{% if obs.cases|length > 10 %}
|
255
|
-
|
264
|
+
<span class="collapse" id="additionalCases_{{ loqusid }}">
|
265
|
+
{% for observed_case in obs.cases %}
|
266
|
+
{% if loop.index > 10 %}
|
267
|
+
{{ observation_badge(observed_case) }}
|
268
|
+
{% endif %}
|
269
|
+
{% endfor %}
|
270
|
+
</span>
|
271
|
+
<button class="btn btn-link p-0 toggle-button" type="button" data-bs-toggle="collapse" href="#additionalCases_{{ loqusid }}">
|
272
|
+
<span class="toggle-text">Show more/less</span>
|
273
|
+
</button>
|
256
274
|
{% endif %}
|
257
275
|
</td>
|
258
276
|
</tr>
|
@@ -2,7 +2,14 @@ import logging
|
|
2
2
|
from typing import Dict, List, Optional, Tuple
|
3
3
|
|
4
4
|
from scout.adapter import MongoAdapter
|
5
|
-
from scout.constants import
|
5
|
+
from scout.constants import (
|
6
|
+
ACMG_COMPLETE_MAP,
|
7
|
+
CALLERS,
|
8
|
+
CCV_COMPLETE_MAP,
|
9
|
+
CLINSIG_MAP,
|
10
|
+
SO_TERMS,
|
11
|
+
VARIANT_FILTERS,
|
12
|
+
)
|
6
13
|
from scout.server.links import add_gene_links, add_tx_links
|
7
14
|
|
8
15
|
LOG = logging.getLogger(__name__)
|
@@ -472,6 +479,19 @@ def evaluation(store, evaluation_obj):
|
|
472
479
|
return evaluation_obj
|
473
480
|
|
474
481
|
|
482
|
+
def ccv_evaluation(store, evaluation_obj):
|
483
|
+
"""Fetch and fill-in evaluation object."""
|
484
|
+
evaluation_obj["institute"] = store.institute(evaluation_obj["institute_id"])
|
485
|
+
evaluation_obj["case"] = store.case(evaluation_obj["case_id"])
|
486
|
+
evaluation_obj["variant"] = store.variant(evaluation_obj["variant_specific"])
|
487
|
+
evaluation_obj["ccv_criteria"] = {
|
488
|
+
criterion["term"]: criterion for criterion in evaluation_obj["ccv_criteria"]
|
489
|
+
}
|
490
|
+
evaluation_obj["ccv_classification"] = CCV_COMPLETE_MAP.get(
|
491
|
+
evaluation_obj["ccv_classification"]
|
492
|
+
)
|
493
|
+
|
494
|
+
|
475
495
|
def transcript_str(transcript_obj, gene_name=None):
|
476
496
|
"""Generate amino acid change as a string.
|
477
497
|
|
@@ -13,13 +13,26 @@ from flask import (
|
|
13
13
|
from flask_login import current_user
|
14
14
|
from markupsafe import Markup
|
15
15
|
|
16
|
-
from scout.constants import
|
17
|
-
|
16
|
+
from scout.constants import (
|
17
|
+
ACMG_CRITERIA,
|
18
|
+
ACMG_MAP,
|
19
|
+
ACMG_OPTIONS,
|
20
|
+
CCV_CRITERIA,
|
21
|
+
CCV_MAP,
|
22
|
+
CCV_OPTIONS,
|
23
|
+
)
|
24
|
+
from scout.server.blueprints.variant.controllers import ccv_evaluation as ccv_evaluation_controller
|
25
|
+
from scout.server.blueprints.variant.controllers import (
|
26
|
+
check_reset_variant_ccv_classification,
|
27
|
+
check_reset_variant_classification,
|
28
|
+
)
|
18
29
|
from scout.server.blueprints.variant.controllers import evaluation as evaluation_controller
|
19
30
|
from scout.server.blueprints.variant.controllers import observations, str_variant_reviewer
|
20
31
|
from scout.server.blueprints.variant.controllers import variant as variant_controller
|
21
32
|
from scout.server.blueprints.variant.controllers import variant_acmg as acmg_controller
|
22
33
|
from scout.server.blueprints.variant.controllers import variant_acmg_post
|
34
|
+
from scout.server.blueprints.variant.controllers import variant_ccv as ccv_controller
|
35
|
+
from scout.server.blueprints.variant.controllers import variant_ccv_post
|
23
36
|
from scout.server.blueprints.variant.verification_controllers import (
|
24
37
|
MissingVerificationRecipientError,
|
25
38
|
variant_verification,
|
@@ -27,6 +40,7 @@ from scout.server.blueprints.variant.verification_controllers import (
|
|
27
40
|
from scout.server.extensions import loqusdb, store
|
28
41
|
from scout.server.utils import institute_and_case, public_endpoint, templated
|
29
42
|
from scout.utils.acmg import get_acmg, get_acmg_conflicts, get_acmg_temperature
|
43
|
+
from scout.utils.ccv import get_ccv, get_ccv_conflicts, get_ccv_temperature
|
30
44
|
from scout.utils.ensembl_rest_clients import EnsemblRestApiClient
|
31
45
|
|
32
46
|
LOG = logging.getLogger(__name__)
|
@@ -205,9 +219,40 @@ def variant_acmg(institute_id, case_name, variant_id):
|
|
205
219
|
)
|
206
220
|
|
207
221
|
|
222
|
+
@variant_bp.route("/<institute_id>/<case_name>/<variant_id>/ccv", methods=["GET", "POST"])
|
223
|
+
@templated("variant/ccv.html")
|
224
|
+
def variant_ccv(institute_id, case_name, variant_id):
|
225
|
+
"""ClinGen-CCG-VICC classification form."""
|
226
|
+
if request.method == "GET":
|
227
|
+
data = ccv_controller(store, institute_id, case_name, variant_id)
|
228
|
+
return data
|
229
|
+
|
230
|
+
criteria = []
|
231
|
+
criteria_terms = request.form.getlist("criteria")
|
232
|
+
for term in criteria_terms:
|
233
|
+
criteria.append(
|
234
|
+
dict(
|
235
|
+
term=term,
|
236
|
+
comment=request.form.get("comment-{}".format(term)),
|
237
|
+
links=[request.form.get("link-{}".format(term))],
|
238
|
+
)
|
239
|
+
)
|
240
|
+
ccv = variant_ccv_post(store, institute_id, case_name, variant_id, current_user.email, criteria)
|
241
|
+
flash("classified as: {}".format(ccv), "info")
|
242
|
+
return redirect(
|
243
|
+
url_for(
|
244
|
+
".variant",
|
245
|
+
institute_id=institute_id,
|
246
|
+
case_name=case_name,
|
247
|
+
variant_id=variant_id,
|
248
|
+
)
|
249
|
+
)
|
250
|
+
|
251
|
+
|
208
252
|
@variant_bp.route("/<institute_id>/<case_name>/<variant_id>/update", methods=["POST"])
|
209
253
|
def variant_update(institute_id, case_name, variant_id):
|
210
|
-
"""Update user-defined information about a variant: manual rank
|
254
|
+
"""Update user-defined information about a variant: manual rank, cancer tier,
|
255
|
+
CLinGen-CGC-VICC classification, dismissal & mosaic tags."""
|
211
256
|
institute_obj, case_obj = institute_and_case(store, institute_id, case_name)
|
212
257
|
variant_obj = store.variant(variant_id)
|
213
258
|
user_obj = store.user(current_user.email)
|
@@ -250,6 +295,7 @@ def variant_update(institute_id, case_name, variant_id):
|
|
250
295
|
flash("Variant tag was updated", "info")
|
251
296
|
else:
|
252
297
|
flash("Variant tag was reset", "info")
|
298
|
+
|
253
299
|
elif request.form.get("acmg_classification"):
|
254
300
|
new_acmg = request.form["acmg_classification"]
|
255
301
|
acmg_classification = variant_obj.get("acmg_classification")
|
@@ -268,6 +314,24 @@ def variant_update(institute_id, case_name, variant_id):
|
|
268
314
|
)
|
269
315
|
flash("updated ACMG classification: {}".format(new_acmg), "info")
|
270
316
|
|
317
|
+
elif request.form.get("ccv_classification"):
|
318
|
+
new_ccv = request.form["ccv_classification"]
|
319
|
+
ccv_classification = variant_obj.get("ccv_classification")
|
320
|
+
# If there already is a classification and the same one is sent again this means that
|
321
|
+
# We want to remove the classification
|
322
|
+
if isinstance(ccv_classification, int) and (new_ccv == CCV_MAP[ccv_classification]):
|
323
|
+
new_ccv = None
|
324
|
+
|
325
|
+
store.submit_ccv_evaluation(
|
326
|
+
variant_obj=variant_obj,
|
327
|
+
user_obj=user_obj,
|
328
|
+
institute_obj=institute_obj,
|
329
|
+
case_obj=case_obj,
|
330
|
+
link=link,
|
331
|
+
classification=new_ccv,
|
332
|
+
)
|
333
|
+
flash("updated ClinGen-CGC-VIGG classification: {}".format(new_ccv), "info")
|
334
|
+
|
271
335
|
new_dismiss = request.form.getlist("dismiss_variant")
|
272
336
|
if new_dismiss:
|
273
337
|
store.update_dismiss_variant(
|
@@ -310,7 +374,6 @@ def variant_update(institute_id, case_name, variant_id):
|
|
310
374
|
@templated("variant/acmg.html")
|
311
375
|
def evaluation(evaluation_id):
|
312
376
|
"""Show, edit or delete an ACMG evaluation."""
|
313
|
-
|
314
377
|
evaluation_obj = store.get_evaluation(evaluation_id)
|
315
378
|
if evaluation_obj is None:
|
316
379
|
flash("Evaluation was not found in database", "warning")
|
@@ -328,7 +391,7 @@ def evaluation(evaluation_id):
|
|
328
391
|
if check_reset_variant_classification(store, evaluation_obj, link):
|
329
392
|
flash("Cleared ACMG classification.", "info")
|
330
393
|
|
331
|
-
return redirect(
|
394
|
+
return redirect(request.referrer)
|
332
395
|
|
333
396
|
return dict(
|
334
397
|
evaluation=evaluation_obj,
|
@@ -353,6 +416,53 @@ def acmg():
|
|
353
416
|
return jsonify({"classification": classification, "conflicts": acmg_conflicts, **acmg_bayesian})
|
354
417
|
|
355
418
|
|
419
|
+
@variant_bp.route("/ccv_evaluations/<evaluation_id>", methods=["GET", "POST"])
|
420
|
+
@templated("variant/ccv.html")
|
421
|
+
def ccv_evaluation(evaluation_id):
|
422
|
+
"""Show, edit or delete an ClinGen-CGC-VIGG evaluation."""
|
423
|
+
|
424
|
+
evaluation_obj = store.get_ccv_evaluation(evaluation_id)
|
425
|
+
if evaluation_obj is None:
|
426
|
+
flash("Evaluation was not found in database", "warning")
|
427
|
+
return redirect(request.referrer)
|
428
|
+
ccv_evaluation_controller(store, evaluation_obj)
|
429
|
+
if request.method == "POST":
|
430
|
+
link = url_for(
|
431
|
+
".variant",
|
432
|
+
institute_id=evaluation_obj["institute"]["_id"],
|
433
|
+
case_name=evaluation_obj["case"]["display_name"],
|
434
|
+
variant_id=evaluation_obj["variant_specific"],
|
435
|
+
)
|
436
|
+
store.delete_ccv_evaluation(evaluation_obj)
|
437
|
+
|
438
|
+
if check_reset_variant_ccv_classification(store, evaluation_obj, link):
|
439
|
+
flash("Cleared ClinGen-CGC-VIGG classification.", "info")
|
440
|
+
|
441
|
+
return redirect(link)
|
442
|
+
|
443
|
+
return dict(
|
444
|
+
evaluation=evaluation_obj,
|
445
|
+
edit=bool(request.args.get("edit")),
|
446
|
+
institute=evaluation_obj["institute"],
|
447
|
+
case=evaluation_obj["case"],
|
448
|
+
variant=evaluation_obj["variant"],
|
449
|
+
CRITERIA=CCV_CRITERIA,
|
450
|
+
CCV_OPTIONS=CCV_OPTIONS,
|
451
|
+
)
|
452
|
+
|
453
|
+
|
454
|
+
@variant_bp.route("/api/v1/ccv")
|
455
|
+
@public_endpoint
|
456
|
+
def ccv():
|
457
|
+
"""Calculate an ClinGen-CVC-VIGG classification from submitted criteria."""
|
458
|
+
criteria = request.args.getlist("criterion")
|
459
|
+
classification = get_ccv(criteria)
|
460
|
+
|
461
|
+
ccv_bayesian = get_ccv_temperature(criteria)
|
462
|
+
ccv_conflicts = get_ccv_conflicts(criteria)
|
463
|
+
return jsonify({"classification": classification, "conflicts": ccv_conflicts, **ccv_bayesian})
|
464
|
+
|
465
|
+
|
356
466
|
@variant_bp.route(
|
357
467
|
"/<institute_id>/<case_name>/<variant_id>/<order>",
|
358
468
|
methods=["POST"],
|
@@ -17,6 +17,8 @@ from scout.constants import (
|
|
17
17
|
CANCER_EXPORT_HEADER,
|
18
18
|
CANCER_SPECIFIC_VARIANT_DISMISS_OPTIONS,
|
19
19
|
CANCER_TIER_OPTIONS,
|
20
|
+
CCV_COMPLETE_MAP,
|
21
|
+
CCV_MAP,
|
20
22
|
CHROMOSOMES,
|
21
23
|
CHROMOSOMES_38,
|
22
24
|
CLINSIG_MAP,
|
@@ -362,6 +364,7 @@ def get_manual_assessments(variant_obj):
|
|
362
364
|
## display manual input of interest: classified, commented, tagged, mosaicism or dismissed.
|
363
365
|
assessment_keywords = [
|
364
366
|
"acmg_classification",
|
367
|
+
"ccv_classification",
|
365
368
|
"manual_rank",
|
366
369
|
"cancer_tier",
|
367
370
|
"dismiss_variant",
|
@@ -402,6 +405,16 @@ def get_manual_assessments(variant_obj):
|
|
402
405
|
assessment["label"] = classification["short"]
|
403
406
|
assessment["display_class"] = classification["color"]
|
404
407
|
|
408
|
+
if assessment_type == "ccv_classification":
|
409
|
+
ccv_classification = variant_obj[assessment_type]
|
410
|
+
if isinstance(ccv_classification, int):
|
411
|
+
ccv_code = CCV_MAP[ccv_classification]
|
412
|
+
ccv_classification = CCV_COMPLETE_MAP[ccv_code]
|
413
|
+
|
414
|
+
assessment["title"] = "ClinGen-CGC-VIGG: {}".format(ccv_classification["label"])
|
415
|
+
assessment["label"] = ccv_classification["short"]
|
416
|
+
assessment["display_class"] = ccv_classification["color"]
|
417
|
+
|
405
418
|
if assessment_type == "dismiss_variant":
|
406
419
|
dismiss_variant_options = {
|
407
420
|
**DISMISS_VARIANT_OPTIONS,
|
@@ -918,6 +931,11 @@ def parse_variant(
|
|
918
931
|
acmg_code = ACMG_MAP[variant_obj["acmg_classification"]]
|
919
932
|
variant_obj["acmg_classification"] = ACMG_COMPLETE_MAP[acmg_code]
|
920
933
|
|
934
|
+
ccv_classification = variant_obj.get("ccv_classification")
|
935
|
+
if isinstance(ccv_classification, int):
|
936
|
+
ccv_code = CCV_MAP[variant_obj["ccv_classification"]]
|
937
|
+
variant_obj["ccv_classification"] = CCV_COMPLETE_MAP[ccv_code]
|
938
|
+
|
921
939
|
# convert length for SV variants
|
922
940
|
variant_length = variant_obj.get("length")
|
923
941
|
variant_obj["length"] = {100000000000: "inf", -1: "n.d."}.get(variant_length, variant_length)
|
@@ -1409,6 +1427,19 @@ def cancer_variants(store, institute_id, case_name, variants_query, variant_coun
|
|
1409
1427
|
secondary_gene = gene
|
1410
1428
|
variant_obj["second_rep_gene"] = secondary_gene
|
1411
1429
|
variant_obj["clinical_assessments"] = get_manual_assessments(variant_obj)
|
1430
|
+
|
1431
|
+
evaluations = []
|
1432
|
+
# Get previous ClinGen-CGC-VIGG evaluations of the variant from other cases
|
1433
|
+
for evaluation_obj in store.get_ccv_evaluations(variant_obj):
|
1434
|
+
if evaluation_obj["case_id"] == case_obj["_id"]:
|
1435
|
+
continue
|
1436
|
+
|
1437
|
+
ccv_classification = evaluation_obj["ccv_classification"]
|
1438
|
+
|
1439
|
+
evaluation_obj["ccv_classification"] = CCV_COMPLETE_MAP.get(ccv_classification)
|
1440
|
+
evaluations.append(evaluation_obj)
|
1441
|
+
variant_obj["ccv_evaluations"] = evaluations
|
1442
|
+
|
1412
1443
|
variants_list.append(variant_obj)
|
1413
1444
|
|
1414
1445
|
data = dict(
|
@@ -16,7 +16,7 @@ from wtforms import (
|
|
16
16
|
SubmitField,
|
17
17
|
validators,
|
18
18
|
)
|
19
|
-
from wtforms.widgets import TextInput
|
19
|
+
from wtforms.widgets import NumberInput, TextInput
|
20
20
|
|
21
21
|
from scout.constants import (
|
22
22
|
CALLERS,
|
@@ -132,8 +132,22 @@ class VariantFiltersForm(FlaskForm):
|
|
132
132
|
)
|
133
133
|
|
134
134
|
chrom = NonValidatingSelectMultipleField("Chromosome", choices=[], default="")
|
135
|
-
start = IntegerField(
|
136
|
-
|
135
|
+
start = IntegerField(
|
136
|
+
"Start position",
|
137
|
+
[
|
138
|
+
validators.Optional(),
|
139
|
+
validators.NumberRange(min=0, message="Start position must be 1 or greater."),
|
140
|
+
],
|
141
|
+
widget=NumberInput(min=1),
|
142
|
+
)
|
143
|
+
end = IntegerField(
|
144
|
+
"End position",
|
145
|
+
[
|
146
|
+
validators.Optional(),
|
147
|
+
validators.NumberRange(min=0, message="End position must be 1 or greater."),
|
148
|
+
],
|
149
|
+
widget=NumberInput(min=1),
|
150
|
+
)
|
137
151
|
cytoband_start = NonValidatingSelectField("Cytoband start", choices=[])
|
138
152
|
cytoband_end = NonValidatingSelectField("Cytoband end", choices=[])
|
139
153
|
|
@@ -264,8 +278,22 @@ class OutlierFiltersForm(FlaskForm):
|
|
264
278
|
)
|
265
279
|
|
266
280
|
chrom = NonValidatingSelectMultipleField("Chromosome", choices=[], default="")
|
267
|
-
start = IntegerField(
|
268
|
-
|
281
|
+
start = IntegerField(
|
282
|
+
"Start position",
|
283
|
+
[
|
284
|
+
validators.Optional(),
|
285
|
+
validators.NumberRange(min=1, message="Start position must be 0 or greater."),
|
286
|
+
],
|
287
|
+
widget=NumberInput(min=1),
|
288
|
+
)
|
289
|
+
end = IntegerField(
|
290
|
+
"End position",
|
291
|
+
[
|
292
|
+
validators.Optional(),
|
293
|
+
validators.NumberRange(min=1, message="End position must be 0 or greater."),
|
294
|
+
],
|
295
|
+
widget=NumberInput(min=1),
|
296
|
+
)
|
269
297
|
cytoband_start = NonValidatingSelectField("Cytoband start", choices=[])
|
270
298
|
cytoband_end = NonValidatingSelectField("Cytoband end", choices=[])
|
271
299
|
|
@@ -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 %}
|