scout-browser 4.96.0__py3-none-any.whl → 4.98.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.
Files changed (86) hide show
  1. scout/adapter/mongo/case.py +51 -47
  2. scout/adapter/mongo/filter.py +28 -11
  3. scout/adapter/mongo/institute.py +2 -0
  4. scout/adapter/mongo/omics_variant.py +20 -5
  5. scout/adapter/mongo/query.py +104 -95
  6. scout/adapter/mongo/variant.py +0 -5
  7. scout/adapter/mongo/variant_loader.py +10 -12
  8. scout/build/individual.py +3 -11
  9. scout/commands/delete/delete_command.py +87 -49
  10. scout/commands/load/research.py +4 -4
  11. scout/commands/load/variants.py +25 -8
  12. scout/commands/setup/setup_scout.py +1 -1
  13. scout/commands/update/case.py +12 -0
  14. scout/commands/update/individual.py +1 -2
  15. scout/constants/__init__.py +7 -2
  16. scout/constants/file_types.py +68 -119
  17. scout/constants/filters.py +2 -1
  18. scout/constants/gene_tags.py +3 -3
  19. scout/constants/igv_tracks.py +7 -11
  20. scout/constants/query_terms.py +2 -2
  21. scout/demo/643594.config.yaml +6 -0
  22. scout/demo/643594.peddy.ped +1 -1
  23. scout/demo/643594.somalier.ancestry.tsv +4 -0
  24. scout/demo/643594.somalier.pairs.tsv +4 -0
  25. scout/demo/643594.somalier.samples.tsv +4 -0
  26. scout/demo/cancer.load_config.yaml +1 -0
  27. scout/demo/resources/__init__.py +1 -1
  28. scout/demo/resources/gnomad.v4.1.constraint_metrics_reduced.tsv +3755 -0
  29. scout/exceptions/database.py +1 -1
  30. scout/load/all.py +8 -16
  31. scout/models/case/case.py +1 -0
  32. scout/models/case/case_loading_models.py +12 -5
  33. scout/models/managed_variant.py +3 -3
  34. scout/models/omics_variant.py +3 -3
  35. scout/parse/case.py +112 -5
  36. scout/parse/pedqc.py +127 -0
  37. scout/parse/variant/frequency.py +9 -6
  38. scout/parse/variant/variant.py +71 -39
  39. scout/server/app.py +2 -0
  40. scout/server/blueprints/alignviewers/controllers.py +2 -0
  41. scout/server/blueprints/alignviewers/templates/alignviewers/igv_viewer.html +3 -0
  42. scout/server/blueprints/alignviewers/templates/alignviewers/utils.html +1 -1
  43. scout/server/blueprints/cases/controllers.py +23 -3
  44. scout/server/blueprints/cases/templates/cases/case.html +3 -0
  45. scout/server/blueprints/cases/templates/cases/chanjo2_form.html +2 -2
  46. scout/server/blueprints/cases/templates/cases/gene_panel.html +9 -3
  47. scout/server/blueprints/cases/templates/cases/individuals_table.html +4 -1
  48. scout/server/blueprints/cases/templates/cases/utils.html +23 -19
  49. scout/server/blueprints/cases/views.py +5 -9
  50. scout/server/blueprints/clinvar/controllers.py +11 -11
  51. scout/server/blueprints/clinvar/templates/clinvar/multistep_add_variant.html +15 -7
  52. scout/server/blueprints/institutes/controllers.py +20 -1
  53. scout/server/blueprints/institutes/forms.py +5 -1
  54. scout/server/blueprints/institutes/templates/overview/filters.html +14 -1
  55. scout/server/blueprints/institutes/templates/overview/institute_settings.html +7 -0
  56. scout/server/blueprints/institutes/templates/overview/utils.html +20 -1
  57. scout/server/blueprints/omics_variants/templates/omics_variants/outliers.html +9 -2
  58. scout/server/blueprints/omics_variants/views.py +8 -10
  59. scout/server/blueprints/variant/controllers.py +30 -1
  60. scout/server/blueprints/variant/templates/variant/cancer-variant.html +19 -3
  61. scout/server/blueprints/variant/templates/variant/components.html +26 -9
  62. scout/server/blueprints/variant/templates/variant/variant.html +4 -2
  63. scout/server/blueprints/variant/utils.py +2 -0
  64. scout/server/blueprints/variants/controllers.py +29 -3
  65. scout/server/blueprints/variants/forms.py +37 -10
  66. scout/server/blueprints/variants/templates/variants/components.html +12 -10
  67. scout/server/blueprints/variants/templates/variants/utils.html +59 -36
  68. scout/server/blueprints/variants/views.py +45 -60
  69. scout/server/extensions/beacon_extension.py +1 -1
  70. scout/server/extensions/bionano_extension.py +5 -5
  71. scout/server/extensions/chanjo2_extension.py +40 -1
  72. scout/server/extensions/chanjo_extension.py +1 -1
  73. scout/server/extensions/matchmaker_extension.py +1 -1
  74. scout/server/static/bs_styles.css +2 -0
  75. scout/server/templates/layout.html +1 -0
  76. scout/server/utils.py +5 -0
  77. scout/utils/ensembl_biomart_clients.py +2 -11
  78. scout/utils/scout_requests.py +1 -1
  79. {scout_browser-4.96.0.dist-info → scout_browser-4.98.0.dist-info}/METADATA +1 -1
  80. {scout_browser-4.96.0.dist-info → scout_browser-4.98.0.dist-info}/RECORD +83 -81
  81. scout/demo/resources/gnomad.v4.0.constraint_metrics_reduced.tsv +0 -3755
  82. scout/parse/peddy.py +0 -149
  83. scout/utils/sort.py +0 -21
  84. {scout_browser-4.96.0.dist-info → scout_browser-4.98.0.dist-info}/WHEEL +0 -0
  85. {scout_browser-4.96.0.dist-info → scout_browser-4.98.0.dist-info}/entry_points.txt +0 -0
  86. {scout_browser-4.96.0.dist-info → scout_browser-4.98.0.dist-info}/licenses/LICENSE +0 -0
@@ -67,8 +67,7 @@ def variants(institute_id, case_name):
67
67
 
68
68
  variants_stats = store.case_variants_count(case_obj["_id"], institute_id, variant_type, False)
69
69
 
70
- if request.form.get("hpo_clinical_filter"):
71
- case_obj["hpo_clinical_filter"] = True
70
+ controllers.set_hpo_clinical_filter(case_obj, request.form)
72
71
 
73
72
  user_obj = store.user(current_user.email)
74
73
  if request.method == "POST":
@@ -97,14 +96,12 @@ def variants(institute_id, case_name):
97
96
 
98
97
  controllers.populate_force_show_unaffected_vars(institute_obj, form)
99
98
 
100
- # populate filters dropdown
101
- available_filters = list(store.filters(institute_id, category))
102
- form.filters.choices = [
103
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
104
- ]
105
99
  # Populate chromosome select choices
106
100
  controllers.populate_chrom_choices(form, case_obj)
107
101
 
102
+ # Populate custom soft filters
103
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
104
+
108
105
  # populate available panel choices
109
106
  form.gene_panels.choices = controllers.gene_panel_choices(store, institute_obj, case_obj)
110
107
 
@@ -161,7 +158,9 @@ def variants(institute_id, case_name):
161
158
  cytobands=cytobands,
162
159
  dismiss_variant_options=DISMISS_VARIANT_OPTIONS,
163
160
  expand_search=controllers.get_expand_search(request.form),
164
- filters=available_filters,
161
+ filters=controllers.populate_persistent_filters_choices(
162
+ institute_id=institute_id, category=category, form=form
163
+ ),
165
164
  form=form,
166
165
  genetic_models_palette=GENETIC_MODELS_PALETTE,
167
166
  inherit_palette=INHERITANCE_PALETTE,
@@ -210,15 +209,12 @@ def str_variants(institute_id, case_name):
210
209
  controllers.populate_force_show_unaffected_vars(institute_obj, form)
211
210
  controllers.update_form_hgnc_symbols(store, case_obj, form)
212
211
 
213
- # populate filters dropdown
214
- available_filters = list(store.filters(institute_id, category))
215
- form.filters.choices = [
216
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
217
- ]
218
-
219
212
  # Populate chromosome select choices
220
213
  controllers.populate_chrom_choices(form, case_obj)
221
214
 
215
+ # Populate custom soft filters
216
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
217
+
222
218
  # populate available panel choices
223
219
  form.gene_panels.choices = controllers.gene_panel_choices(store, institute_obj, case_obj)
224
220
 
@@ -254,7 +250,9 @@ def str_variants(institute_id, case_name):
254
250
  cytobands=cytobands,
255
251
  dismiss_variant_options=DISMISS_VARIANT_OPTIONS,
256
252
  expand_search=controllers.get_expand_search(request.form),
257
- filters=available_filters,
253
+ filters=controllers.populate_persistent_filters_choices(
254
+ institute_id=institute_id, category=category, form=form
255
+ ),
258
256
  form=form,
259
257
  inherit_palette=INHERITANCE_PALETTE,
260
258
  institute=institute_obj,
@@ -282,8 +280,7 @@ def sv_variants(institute_id, case_name):
282
280
  variant_type = "clinical"
283
281
  variants_stats = store.case_variants_count(case_obj["_id"], institute_id, variant_type, False)
284
282
 
285
- if request.form.get("hpo_clinical_filter"):
286
- case_obj["hpo_clinical_filter"] = True
283
+ controllers.set_hpo_clinical_filter(case_obj, request.form)
287
284
 
288
285
  if "dismiss_submit" in request.form: # dismiss a list of variants
289
286
  controllers.dismiss_variant_list(
@@ -299,15 +296,12 @@ def sv_variants(institute_id, case_name):
299
296
  controllers.activate_case(store, institute_obj, case_obj, current_user)
300
297
  form = controllers.populate_sv_filters_form(store, institute_obj, case_obj, category, request)
301
298
 
302
- # populate filters dropdown
303
- available_filters = list(store.filters(institute_obj["_id"], category))
304
- form.filters.choices = [
305
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
306
- ]
307
-
308
299
  # Populate chromosome select choices
309
300
  controllers.populate_chrom_choices(form, case_obj)
310
301
 
302
+ # Populate custom soft filters
303
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
304
+
311
305
  genome_build = "38" if "38" in str(case_obj.get("genome_build", "37")) else "37"
312
306
  cytobands = store.cytoband_by_chrom(genome_build)
313
307
 
@@ -334,7 +328,9 @@ def sv_variants(institute_id, case_name):
334
328
  cytobands=cytobands,
335
329
  dismiss_variant_options=DISMISS_VARIANT_OPTIONS,
336
330
  expand_search=controllers.get_expand_search(request.form),
337
- filters=available_filters,
331
+ filters=controllers.populate_persistent_filters_choices(
332
+ institute_id=institute_id, category=category, form=form
333
+ ),
338
334
  form=form,
339
335
  inherit_palette=INHERITANCE_PALETTE,
340
336
  institute=institute_obj,
@@ -361,8 +357,7 @@ def mei_variants(institute_id, case_name):
361
357
  )
362
358
  variants_stats = store.case_variants_count(case_obj["_id"], institute_id, variant_type, False)
363
359
 
364
- if request.form.get("hpo_clinical_filter"):
365
- case_obj["hpo_clinical_filter"] = True
360
+ controllers.set_hpo_clinical_filter(case_obj, request.form)
366
361
 
367
362
  if "dismiss_submit" in request.form: # dismiss a list of variants
368
363
  controllers.dismiss_variant_list(
@@ -393,15 +388,12 @@ def mei_variants(institute_id, case_name):
393
388
  # set chromosome to all chromosomes
394
389
  form.chrom.data = request.args.get("chrom", "")
395
390
 
396
- # populate filters dropdown
397
- available_filters = list(store.filters(institute_obj["_id"], category))
398
- form.filters.choices = [
399
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
400
- ]
401
-
402
391
  # Populate chromosome select choices
403
392
  controllers.populate_chrom_choices(form, case_obj)
404
393
 
394
+ # Populate custom soft filters
395
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
396
+
405
397
  # populate available panel choices
406
398
  form.gene_panels.choices = controllers.gene_panel_choices(store, institute_obj, case_obj)
407
399
 
@@ -431,7 +423,9 @@ def mei_variants(institute_id, case_name):
431
423
  cytobands=cytobands,
432
424
  dismiss_variant_options=DISMISS_VARIANT_OPTIONS,
433
425
  expand_search=controllers.get_expand_search(request.form),
434
- filters=available_filters,
426
+ filters=controllers.populate_persistent_filters_choices(
427
+ institute_id=institute_id, category=category, form=form
428
+ ),
435
429
  form=form,
436
430
  inherit_palette=INHERITANCE_PALETTE,
437
431
  institute=institute_obj,
@@ -507,15 +501,12 @@ def cancer_variants(institute_id, case_name):
507
501
  # update status of case if visited for the first time
508
502
  controllers.activate_case(store, institute_obj, case_obj, current_user)
509
503
 
510
- # populate filters dropdown
511
- available_filters = list(store.filters(institute_id, category))
512
- form.filters.choices = [
513
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
514
- ]
515
-
516
504
  # Populate chromosome select choices
517
505
  controllers.populate_chrom_choices(form, case_obj)
518
506
 
507
+ # Populate custom soft filters
508
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
509
+
519
510
  form.gene_panels.choices = controllers.gene_panel_choices(store, institute_obj, case_obj)
520
511
 
521
512
  genome_build = "38" if "38" in str(case_obj.get("genome_build", "37")) else "37"
@@ -550,7 +541,9 @@ def cancer_variants(institute_id, case_name):
550
541
  **CANCER_SPECIFIC_VARIANT_DISMISS_OPTIONS,
551
542
  },
552
543
  expand_search=controllers.get_expand_search(request.form),
553
- filters=available_filters,
544
+ filters=controllers.populate_persistent_filters_choices(
545
+ institute_id=institute_id, category=category, form=form
546
+ ),
554
547
  result_size=result_size,
555
548
  show_dismiss_block=controllers.get_show_dismiss_block(),
556
549
  total_variants=variants_stats.get(variant_type, {}).get(category, "NA"),
@@ -574,9 +567,6 @@ def cancer_sv_variants(institute_id, case_name):
574
567
  variant_type = "clinical"
575
568
  variants_stats = store.case_variants_count(case_obj["_id"], institute_id, variant_type, False)
576
569
 
577
- if request.form.get("hpo_clinical_filter"):
578
- case_obj["hpo_clinical_filter"] = True
579
-
580
570
  if "dismiss_submit" in request.form: # dismiss a list of variants
581
571
  controllers.dismiss_variant_list(
582
572
  store,
@@ -591,15 +581,12 @@ def cancer_sv_variants(institute_id, case_name):
591
581
  controllers.activate_case(store, institute_obj, case_obj, current_user)
592
582
  form = controllers.populate_sv_filters_form(store, institute_obj, case_obj, category, request)
593
583
 
594
- # populate filters dropdown
595
- available_filters = list(store.filters(institute_obj["_id"], category))
596
- form.filters.choices = [
597
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
598
- ]
599
-
600
584
  # Populate chromosome select choices
601
585
  controllers.populate_chrom_choices(form, case_obj)
602
586
 
587
+ # Populate custom soft filters
588
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
589
+
603
590
  genome_build = "38" if "38" in str(case_obj.get("genome_build", "37")) else "37"
604
591
  cytobands = store.cytoband_by_chrom(genome_build)
605
592
 
@@ -630,7 +617,9 @@ def cancer_sv_variants(institute_id, case_name):
630
617
  **CANCER_SPECIFIC_VARIANT_DISMISS_OPTIONS,
631
618
  },
632
619
  expand_search=controllers.get_expand_search(request.form),
633
- filters=available_filters,
620
+ filters=controllers.populate_persistent_filters_choices(
621
+ institute_id=institute_id, category=category, form=form
622
+ ),
634
623
  form=form,
635
624
  inherit_palette=INHERITANCE_PALETTE,
636
625
  institute=institute_obj,
@@ -660,9 +649,6 @@ def fusion_variants(institute_id, case_name):
660
649
  variant_type = "clinical"
661
650
  variants_stats = store.case_variants_count(case_obj["_id"], institute_id, variant_type, False)
662
651
 
663
- if request.form.get("hpo_clinical_filter"):
664
- case_obj["hpo_clinical_filter"] = True
665
-
666
652
  if "dismiss_submit" in request.form: # dismiss a list of variants
667
653
  controllers.dismiss_variant_list(
668
654
  store,
@@ -679,15 +665,12 @@ def fusion_variants(institute_id, case_name):
679
665
  store, institute_obj, case_obj, category, request
680
666
  )
681
667
 
682
- # populate filters dropdown
683
- available_filters = list(store.filters(institute_obj["_id"], category))
684
- form.filters.choices = [
685
- (filter.get("_id"), filter.get("display_name")) for filter in available_filters
686
- ]
687
-
688
668
  # Populate chromosome select choices
689
669
  controllers.populate_chrom_choices(form, case_obj)
690
670
 
671
+ # Populate custom soft filters
672
+ controllers.populate_institute_soft_filters(form=form, institute_obj=institute_obj)
673
+
691
674
  genome_build = "38" if "38" in str(case_obj.get("genome_build", "37")) else "37"
692
675
  cytobands = store.cytoband_by_chrom(genome_build)
693
676
 
@@ -717,7 +700,9 @@ def fusion_variants(institute_id, case_name):
717
700
  **DISMISS_VARIANT_OPTIONS,
718
701
  },
719
702
  expand_search=controllers.get_expand_search(request.form),
720
- filters=available_filters,
703
+ filters=controllers.populate_persistent_filters_choices(
704
+ institute_id=institute_id, category=category, form=form
705
+ ),
721
706
  form=form,
722
707
  institute=institute_obj,
723
708
  manual_rank_options=MANUAL_RANK_OPTIONS,
@@ -1,5 +1,5 @@
1
1
  """Scout supports integration with the Clinical Genomics SciLifeLab Beacon
2
- cgbeacon2: https://github.com/Clinical-Genomics/cgbeacon2
2
+ cgbeacon2: https://github.com/Clinical-Genomics/cgbeacon2
3
3
  """
4
4
 
5
5
  import datetime
@@ -1,10 +1,10 @@
1
1
  """
2
- Connect to BioNano Access server via its API.
2
+ Connect to BioNano Access server via its API.
3
3
 
4
- The server API we connect to is described in the following document:
5
- https://bionano.com/wp-content/uploads/2023/01/30462-Bionano-Access-API-Guide-1.pdf
6
- For further development, the server has a Swagger-like demo interface at https://bionano-access.scilifelab.se/Bnx/
7
- which is useful for details, and for sniffing actual message content structure, required cookie variable names etc.
4
+ The server API we connect to is described in the following document:
5
+ https://bionano.com/wp-content/uploads/2023/01/30462-Bionano-Access-API-Guide-1.pdf
6
+ For further development, the server has a Swagger-like demo interface at https://bionano-access.scilifelab.se/Bnx/
7
+ which is useful for details, and for sniffing actual message content structure, required cookie variable names etc.
8
8
  """
9
9
 
10
10
  import json
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Dict
2
+ from typing import Dict, List
3
3
 
4
4
  import requests
5
5
  from flask import current_app
@@ -8,6 +8,9 @@ REF_CHROM = "14"
8
8
  MT_CHROM = "MT"
9
9
  LOG = logging.getLogger(__name__)
10
10
 
11
+ CHANJO_BUILD_37 = "GRCh37"
12
+ CHANJO_BUILD_38 = "GRCh38"
13
+
11
14
 
12
15
  class Chanjo2Client:
13
16
  """Runs requests to chanjo2 and returns results in the expected format."""
@@ -44,3 +47,39 @@ class Chanjo2Client:
44
47
  coverage_stats[ind["individual_id"]] = coverage_info
45
48
 
46
49
  return coverage_stats
50
+
51
+ def get_gene_complete_coverage(
52
+ self, hgnc_id: int, threshold: int = 15, individuals: dict = {}, build: str = "38"
53
+ ) -> bool:
54
+ """
55
+ Return complete coverage for hgnc_id at a coverage threshold.
56
+ """
57
+ chanjo_build = CHANJO_BUILD_37 if "37" in build else CHANJO_BUILD_38
58
+ chanjo2_gene_cov_url: str = "/".join(
59
+ [current_app.config.get("CHANJO2_URL"), "coverage/d4/genes/summary"]
60
+ )
61
+
62
+ gene_cov_query = {
63
+ "build": chanjo_build,
64
+ "coverage_threshold": threshold,
65
+ "hgnc_gene_ids": [hgnc_id],
66
+ "interval_type": "genes",
67
+ "samples": [],
68
+ }
69
+ for ind in individuals:
70
+ if not ind.get("d4_file"):
71
+ continue
72
+
73
+ gene_cov_query["samples"].append(
74
+ {"coverage_file_path": ind["d4_file"], "name": ind["individual_id"]}
75
+ )
76
+
77
+ resp = requests.post(chanjo2_gene_cov_url, json=gene_cov_query)
78
+ gene_cov = resp.json()
79
+
80
+ full_coverage = bool(gene_cov)
81
+ for sample in gene_cov.keys():
82
+ if gene_cov[sample]["coverage_completeness_percent"] < 100:
83
+ full_coverage = False
84
+
85
+ return full_coverage
@@ -1,5 +1,5 @@
1
1
  """
2
- Generate coverage reports using chanjo and chanjo-report. Documentation under -> `docs/admin-guide/chanjo_coverage_integration.md`
2
+ Generate coverage reports using chanjo and chanjo-report. Documentation under -> `docs/admin-guide/chanjo_coverage_integration.md`
3
3
  """
4
4
 
5
5
  import json
@@ -1,5 +1,5 @@
1
1
  """Code for MatchMaker Exchange integration
2
- Tested with PatientMatcher: https://github.com/Clinical-Genomics/patientMatcher
2
+ Tested with PatientMatcher: https://github.com/Clinical-Genomics/patientMatcher
3
3
  """
4
4
 
5
5
  import datetime
@@ -269,6 +269,8 @@ li.nav-item {
269
269
 
270
270
  /* Introduce small space in between list elements */
271
271
  body {
272
+ min-width: 1000px;
273
+ overflow-x: scroll;
272
274
  background-color: var(--bg-color);
273
275
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
274
276
  }
@@ -43,6 +43,7 @@
43
43
  <div class="dropdown-divider" ></div>
44
44
  <a class="dropdown-item" href="https://clinical-genomics.github.io/scout" referrerpolicy="no-referrer" rel="noopener" target='_blank'>User guide</a>
45
45
  <a class="dropdown-item" href="https://github.com/Clinical-Genomics/scout/issues" referrerpolicy="no-referrer" rel="noopener" target='_blank'>Open issues</a>
46
+ <a class="dropdown-item mb-1" href="https://github.com/Clinical-Genomics/scout/releases/tag/v{{ SCOUT_VERSION[:-2] if SCOUT_VERSION.endswith('.0') and SCOUT_VERSION.count('.') > 1 else SCOUT_VERSION }}" referrerpolicy="no-referrer" rel="noopener" target='_blank'>Release notes v{{SCOUT_VERSION}}</a>
46
47
  </div>
47
48
  </li>
48
49
  {% block top_nav %}{% endblock %}
scout/server/utils.py CHANGED
@@ -330,6 +330,11 @@ def case_append_alignments(case_obj: dict):
330
330
  # Add sample name
331
331
  sample_name = f"{case_obj.get('display_name', '')} - {individual.get('display_name', '')}"
332
332
  append_safe(case_obj, "sample_names", sample_name)
333
+ append_safe(
334
+ case_obj,
335
+ "track_items_soft_clips_settings",
336
+ individual.get("analysis_type", "") not in ["wes", "panel"],
337
+ )
333
338
 
334
339
  # Process all file settings
335
340
  for setting in unwrap_settings:
@@ -4,7 +4,7 @@ from typing import Dict, Iterator
4
4
  import requests
5
5
 
6
6
  LOG = logging.getLogger(__name__)
7
- SCHUG_BASE = "https://schug.scilifelab.se"
7
+ SCHUG_BASE = "https://schug-stage.scilifelab.se"
8
8
 
9
9
  BUILDS: Dict[str, str] = {"37": "GRCh37", "38": "GRCh38"}
10
10
 
@@ -29,15 +29,6 @@ class EnsemblBiomartHandler:
29
29
  def stream_resource(self, interval_type: str) -> Iterator[str]:
30
30
  """Use schug web to fetch genes, transcripts or exons from a remote Ensembl biomart in the right genome build and save them to file."""
31
31
 
32
- def yield_resource_lines(iterable) -> str:
33
- """Removes the last element from an iterator."""
34
- it = iter(iterable)
35
- current = next(it)
36
- for i in it:
37
- yield current
38
- current = i
39
-
40
32
  shug_url: str = f"{SCHUG_BASE}{SCHUG_RESOURCE_URL[interval_type]}{self.build}"
41
33
 
42
- # return all lines except the last, which contains the "[success]" string
43
- return yield_resource_lines(self.stream_get(shug_url))
34
+ return self.stream_get(shug_url)
@@ -324,7 +324,7 @@ def fetch_constraint():
324
324
  Returns:
325
325
  exac_lines(iterable(str))
326
326
  """
327
- path = "/release/v4.0/constraint/gnomad.v4.0.constraint_metrics.tsv"
327
+ path = "/release/4.1/constraint/gnomad.v4.1.constraint_metrics.tsv"
328
328
  mirror_urls = [
329
329
  f"https://storage.googleapis.com/gcp-public-data--gnomad{path}",
330
330
  f"https://gnomad-public-us-east-1.s3.amazonaws.com{path}",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scout-browser
3
- Version: 4.96.0
3
+ Version: 4.98.0
4
4
  Summary: Clinical DNA variant visualizer and browser
5
5
  Project-URL: Repository, https://github.com/Clinical-Genomics/scout
6
6
  Project-URL: Changelog, https://github.com/Clinical-Genomics/scout/blob/main/CHANGELOG.md