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
@@ -1,3 +1,4 @@
1
+ {% from "cases/chanjo2_form.html" import chanjo2_report_form %}
1
2
  {% from "variant/buttons.html" import variant_tag_button, variant_tier_button, dismiss_variant_button, mosaic_variant_button %}
2
3
  {% from "variants/utils.html" import compounds_table %}
3
4
  {% from "variant/variant_details.html" import severity_list %}
@@ -118,15 +119,7 @@
118
119
  {% endif %}
119
120
  </div>
120
121
  {% endfor %}
121
- {% if config.chanjo_report %}
122
- <div class="d-flex flex-wrap ms-1">
123
- {% for gene in variant.genes %}
124
- <a class="btn btn-sm btn-secondary text-white" rel="noopener noreferrer" target="_blank" href="{{ url_for('report.gene', gene_id=gene.hgnc_id, sample_id=variant.samples|map(attribute='sample_id')|list) }}">
125
- Gene coverage: {{ gene.common.hgnc_symbol if gene.common else gene.hgnc_id }}
126
- </a>
127
- {% endfor %}
128
- </div>
129
- {% endif %}
122
+ {{ gene_coverage(institute, variant, case, config) }}
130
123
  </li>
131
124
  <li class="list-group-item">
132
125
  <div>
@@ -136,6 +129,30 @@
136
129
  </ul>
137
130
  {% endmacro %}
138
131
 
132
+ {% macro gene_coverage(institute, variant, case, config) %}
133
+ {% if case.chanjo_coverage and config.chanjo_report %}
134
+ <div class="d-flex flex-wrap ms-1">
135
+ {% for gene in variant.genes %}
136
+ <a class="btn btn-sm btn-secondary text-white" rel="noopener noreferrer" target="_blank" href="{{ url_for('report.gene', gene_id=gene.hgnc_id, sample_id=variant.samples|map(attribute='sample_id')|list) }}" data-bs-toggle="tooltip" title="Chanjo coverage report">
137
+ Gene coverage: {{ gene.common.hgnc_symbol if gene.common else gene.hgnc_id }}
138
+ </a>
139
+ {% endfor %}
140
+ </div>
141
+ {% endif %}
142
+ {% if case.chanjo2_coverage %}
143
+ <div class="d-flex flex-wrap ms-1" data-bs-toggle="tooltip" title="Chanjo2 coverage reports">
144
+ {% for gene in variant.genes %}
145
+ {{ chanjo2_report_form(institute, case, gene.hgnc_symbol, 'overview', gene.hgnc_id, "Gene coverage " + (gene.common.hgnc_symbol if gene.common else gene.hgnc_id), "btn btn-sm btn-secondary text-white") }} <!--chanjo2 genes overview -->
146
+ {% if gene.common.hgnc_id in gene_has_full_coverage and gene.common.hgnc_id[gene.common.hgnc_id] %}
147
+ <span class="bg-success fa-solid fa-circle-check" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Chanjo2 coverage is at 100% completeness."></span>
148
+ {% else %}
149
+ <span class="bg-warning fa-solid fa-triangle-exclamation" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Note that Chanjo2 coverage is below 100% completeness."></span>
150
+ {% endif %}
151
+ {% endfor %}
152
+ </div>
153
+ {% endif %}
154
+ {% endmacro %}
155
+
139
156
  {% macro acmg_form(institute, case, variant, ACMG_OPTIONS, selected=None) %}
140
157
  <form action="{{ url_for('variant.variant_update', institute_id=institute._id, case_name=case.display_name, variant_id=variant._id) }}" method="POST">
141
158
  <div class="d-flex justify-content-between">
@@ -339,6 +339,7 @@
339
339
  <thead class="thead table-light border-top">
340
340
  <tr class="active">
341
341
  <th>Gene</th>
342
+ <th data-bs-toggle="tooltip" title="Gene tolerance to a single copy of a truncating mutation (pLI) | Loss-of-function observed/expected upper bound fraction (LOEUF)">pLI score|LOEUF</th>
342
343
  <th>Region</th>
343
344
  <th>Consequence</th>
344
345
  {% if case.genome_build == "38" %}
@@ -349,11 +350,12 @@
349
350
  <tbody>
350
351
  {% for gene in variant.genes %}
351
352
  <tr>
352
- <th>
353
+ <td>
353
354
  <a href="{{ url_for('genes.gene', hgnc_id=gene.hgnc_id) }}">
354
355
  {{ gene.common.hgnc_symbol if gene.common else gene.hgnc_id }}
355
356
  </a>
356
- </th>
357
+ </td>
358
+ <td>{{gene.pli_score|round(2) if gene.pli_score else "n.a."}} | {{gene.loeuf|round(2) if gene.loeuf else "n.a."}}</td>
357
359
  <td>{{ gene.region_annotation }}</td>
358
360
  <td>{{ gene.functional_annotation|truncate(20, True) }}</td>
359
361
  {% if case.genome_build == "38" %} <!-- Display eventual functional annotations associated to MANE transcripts -->
@@ -282,6 +282,8 @@ def add_gene_info(
282
282
  )
283
283
 
284
284
  all_models.update(set(variant_gene["manual_inheritance"]))
285
+ variant_gene["pli_score"] = hgnc_gene.get("pli_score")
286
+ variant_gene["loeuf"] = hgnc_gene.get("constraint_lof_oe_ci_upper")
285
287
 
286
288
  update_inheritance_model(variant_gene, all_models, disease_terms)
287
289
 
@@ -40,6 +40,7 @@ from scout.server.blueprints.variant.utils import (
40
40
  update_variant_case_panels,
41
41
  )
42
42
  from scout.server.blueprints.variants.forms import BetterDecimalField
43
+ from scout.server.extensions import store
43
44
  from scout.server.links import add_gene_links, cosmic_links, str_source_link
44
45
  from scout.server.utils import (
45
46
  case_has_alignments,
@@ -83,6 +84,20 @@ def populate_force_show_unaffected_vars(institute_obj, form):
83
84
  form.show_unaffected.data = True
84
85
 
85
86
 
87
+ def populate_persistent_filters_choices(
88
+ institute_id: str, category: str, form: ImmutableMultiDict
89
+ ) -> List[dict]:
90
+ """Populate the options present in the form.filters on variants page, directly setting on the form.
91
+ Also return a convenient list of filters for use in filter update macros.
92
+ """
93
+ available_filters = list(store.filters(institute_id, category))
94
+ form.filters.choices = [
95
+ (filter.get("_id"), filter.get("display_name"))
96
+ for filter in sorted(available_filters, key=lambda f: f.get("display_name", "").lower())
97
+ ]
98
+ return available_filters
99
+
100
+
86
101
  def populate_chrom_choices(form, case_obj):
87
102
  """Populate the option of the chromosome select according to the case genome build"""
88
103
  # Populate chromosome choices
@@ -90,6 +105,12 @@ def populate_chrom_choices(form, case_obj):
90
105
  form.chrom.choices = [(chrom, chrom) for chrom in chromosomes]
91
106
 
92
107
 
108
+ def populate_institute_soft_filters(form, institute_obj):
109
+ """Populate the hidden field 'institute_soft_filters' with a string containing all institute's soft filters."""
110
+ if institute_obj.get("soft_filters"):
111
+ form.institute_soft_filters.data = ",".join(institute_obj["soft_filters"])
112
+
113
+
93
114
  def variants(
94
115
  store,
95
116
  institute_obj,
@@ -711,7 +732,7 @@ def _compound_follow_filter_clnsig(compound, compound_var_obj, query_form):
711
732
 
712
733
  There are some filter options that are rather unique, like the ClinVar one.
713
734
 
714
- If clinsig_confident_always_returned is checked, variants are currently never dismissed on ClinSig alone.
735
+ If prioritise_clinvar is checked, variants are currently never dismissed on ClinSig alone.
715
736
 
716
737
  Args:
717
738
  compound(dict)
@@ -722,8 +743,7 @@ def _compound_follow_filter_clnsig(compound, compound_var_obj, query_form):
722
743
  query_rank = []
723
744
  query_str_rank = []
724
745
 
725
- clinsig_always_returned = query_form.get("clinsig_confident_always_returned")
726
- if clinsig_always_returned:
746
+ if query_form.get("prioritise_clinvar"):
727
747
  return False
728
748
 
729
749
  clinsig = query_form.get("clinsig")
@@ -2088,3 +2108,9 @@ def get_show_dismiss_block():
2088
2108
  session["show_dismiss_block"] = show_dismiss_block
2089
2109
 
2090
2110
  return show_dismiss_block
2111
+
2112
+
2113
+ def set_hpo_clinical_filter(case_obj: dict, request_form: dict):
2114
+ """Set HPO clinical filter on case if requested through the form."""
2115
+ if request_form.get("hpo_clinical_filter"):
2116
+ case_obj["hpo_clinical_filter"] = True
@@ -113,6 +113,8 @@ class VariantFiltersForm(FlaskForm):
113
113
  compound_follow_filter = BooleanField("Compounds follow filter")
114
114
  cadd_inclusive = BooleanField("CADD inclusive")
115
115
  clinsig = NonValidatingSelectMultipleField("ClinVar CLINSIG", choices=CLINSIG_OPTIONS)
116
+ clinsig_exclude = BooleanField("Exclude")
117
+ prioritise_clinvar = BooleanField("Prioritise ClinVar")
116
118
 
117
119
  gnomad_frequency = BetterDecimalField("gnomadAF", validators=[validators.Optional()])
118
120
  local_obs_old = IntegerField("Local obs. (archive)", validators=[validators.Optional()])
@@ -151,11 +153,25 @@ class VariantFiltersForm(FlaskForm):
151
153
  cytoband_start = NonValidatingSelectField("Cytoband start", choices=[])
152
154
  cytoband_end = NonValidatingSelectField("Cytoband end", choices=[])
153
155
 
156
+ size_selector = NonValidatingSelectField(
157
+ "Variant size in bp", choices=[("$gte", ">="), ("$lt", "<")]
158
+ )
159
+ size = IntegerField(
160
+ "",
161
+ [
162
+ validators.Optional(),
163
+ validators.NumberRange(min=0, message="Number of bases must be 1 or greater."),
164
+ ],
165
+ widget=NumberInput(min=1),
166
+ )
167
+
154
168
  hide_dismissed = BooleanField("Hide dismissed", default=False)
155
169
  filter_variants = SubmitField(label="Filter variants")
156
170
  export = SubmitField(label="Filter and export")
157
171
 
158
- show_unaffected = BooleanField("Show also variants present only in unaffected", default=False)
172
+ show_unaffected = BooleanField("Include variants present only in unaffected", default=True)
173
+ show_soft_filtered = BooleanField(f"Include soft-filtered variants", default=False)
174
+ institute_soft_filters = HiddenField()
159
175
 
160
176
 
161
177
  class FiltersForm(VariantFiltersForm):
@@ -163,11 +179,11 @@ class FiltersForm(VariantFiltersForm):
163
179
 
164
180
  symbol_file = FileField("Symbol File")
165
181
 
166
- clinsig_confident_always_returned = BooleanField("CLINSIG Confident")
182
+ clinvar_trusted_revstat = BooleanField("CLINSIG Confident")
167
183
  spidex_human = SelectMultipleField("SPIDEX", choices=SPIDEX_CHOICES)
168
184
 
169
185
  clinical_filter = SubmitField(label="Clinical filter")
170
- clinvar_tag = BooleanField("ClinVar hits")
186
+ clinvar_tag = BooleanField("ClinVar hits only")
171
187
 
172
188
  # polymorphic constant base for clinical filter
173
189
  clinical_filter_base = CLINICAL_FILTER_BASE
@@ -180,7 +196,7 @@ class CancerFiltersForm(VariantFiltersForm):
180
196
  alt_count = IntegerField("Min alt count", validators=[validators.Optional()])
181
197
  control_frequency = BetterDecimalField("Normal alt AF <", validators=[validators.Optional()])
182
198
  tumor_frequency = BetterDecimalField("Tumor alt AF >", validators=[validators.Optional()])
183
- clinvar_tag = BooleanField("ClinVar hits")
199
+ clinvar_tag = BooleanField("ClinVar hits only")
184
200
  cosmic_tag = BooleanField("Cosmic hits")
185
201
  mvl_tag = BooleanField("Managed Variants hits")
186
202
  local_obs_cancer_somatic_old = IntegerField(
@@ -189,7 +205,6 @@ class CancerFiltersForm(VariantFiltersForm):
189
205
  local_obs_cancer_germline_old = IntegerField(
190
206
  "Local germline obs. (archive)", validators=[validators.Optional()]
191
207
  )
192
-
193
208
  # polymorphic constant base for clinical filter
194
209
  clinical_filter_base = CLINICAL_FILTER_BASE_CANCER
195
210
 
@@ -212,8 +227,6 @@ class StrFiltersForm(VariantFiltersForm):
212
227
  class SvFiltersForm(VariantFiltersForm):
213
228
  """Extends FiltersForm for structural variants"""
214
229
 
215
- size = StringField("Length")
216
- size_shorter = BooleanField("Length shorter than")
217
230
  svtype = SelectMultipleField("SVType", choices=SV_TYPE_CHOICES)
218
231
  decipher = BooleanField("Decipher")
219
232
  clingen_ngi = IntegerField("ClinGen NGI obs")
@@ -242,8 +255,6 @@ class CancerSvFiltersForm(SvFiltersForm):
242
255
  class FusionFiltersForm(VariantFiltersForm):
243
256
  """Extends FiltersForm for fusion variants"""
244
257
 
245
- size = StringField("Length")
246
- size_shorter = BooleanField("Length shorter than")
247
258
  decipher = BooleanField("Decipher")
248
259
  clinical_filter = SubmitField(label="Clinical filter")
249
260
  fusion_score = BetterDecimalField("Fusion score >=", validators=[validators.Optional()])
@@ -302,7 +313,23 @@ class OutlierFiltersForm(FlaskForm):
302
313
 
303
314
  clinical_filter_base = CLINICAL_FILTER_BASE_OUTLIER
304
315
 
305
- show_unaffected = BooleanField("Show also variants present only in unaffected", default=False)
316
+ show_unaffected = BooleanField("Include variants present only in unaffected", default=False)
317
+
318
+ sort_by = NonValidatingSelectField(
319
+ choices=[
320
+ ("", "Sort by"),
321
+ ("p_value", "Sort by P-value"),
322
+ ("delta_psi", "Sort by Δψ"),
323
+ ("psi_value", "Sort by ψ value"),
324
+ ("zscore", "Sort by zscore"),
325
+ ("l2fc", "Sort by l2fc"),
326
+ ],
327
+ validators=[validators.Optional()],
328
+ )
329
+ sort_order = NonValidatingSelectField(
330
+ choices=[("", "Sort order"), ("asc", "asc"), ("desc", "desc")],
331
+ validators=[validators.Optional()],
332
+ )
306
333
 
307
334
 
308
335
  FILTERSFORMCLASS = {
@@ -203,16 +203,18 @@
203
203
  {% endfor %}
204
204
 
205
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>
206
+ {% if panel_count %}
207
+ <a
208
+ class="badge bg-secondary text-white"
209
+ data-bs-toggle="popover"
210
+ data-bs-html="true"
211
+ data-bs-trigger="hover click"
212
+ title="Overlapping gene panels"
213
+ data-bs-content="{% for panel in matching_panels %}
214
+ {{ panel.panel_name|safe }}<br>
215
+ {% endfor %}"
216
+ >{{ panel_count }}</a>
217
+ {% endif %}
216
218
  {% endmacro %}
217
219
 
218
220
  {% if variant.category in ["cancer", "sv_cancer"] %}
@@ -36,12 +36,18 @@
36
36
  the_form.submit();
37
37
  }}
38
38
 
39
- var show_unaffected =document.getElementById('show_unaffected');
39
+ var show_unaffected = document.getElementById('show_unaffected');
40
40
  if (show_unaffected) {
41
41
  show_unaffected.onchange = function() {
42
42
  the_form.submit();
43
43
  }}
44
44
 
45
+ var show_soft_filtered = document.getElementById('show_soft_filtered');
46
+ if (show_soft_filtered) {
47
+ show_soft_filtered.onchange = function() {
48
+ the_form.submit();
49
+ }}
50
+
45
51
  function resetPage(){
46
52
  document.getElementById('page').value = "1";
47
53
  }
@@ -102,6 +108,18 @@
102
108
  {{ form.hide_dismissed(class="form-check-input") }}
103
109
  {{ form.hide_dismissed.label(class="form-check-label ms-2") }}
104
110
  </div>
111
+ {% if institute.soft_filters %} <!-- Available only for institutes with soft filters in settings -->
112
+ <div class="form-check d-flex justify-content-start">
113
+ {{ form.show_soft_filtered(class="form-check-input") }}
114
+ {{ form.show_soft_filtered.label(
115
+ class="form-check-label ms-2",
116
+ data_bs_toggle="tooltip",
117
+ title="Filters are defined by an admin in the institute settings. Current filters are: " ~
118
+ form.institute_soft_filters.data|safe
119
+ ) }}
120
+ {{ form.institute_soft_filters() }}
121
+ </div>
122
+ {% endif %}
105
123
  <div class="form-check d-flex justify-content-start">
106
124
  {% if institute.check_show_all_vars %}
107
125
  <input type="checkbox" class="form-check-input" name="show_unaffected" id="show_unaffected" checked disabled>
@@ -275,6 +293,16 @@
275
293
  </div>
276
294
  {% endmacro %}
277
295
 
296
+ {% macro variant_size_filter(form) %}
297
+ <div class="col-2">
298
+ {{ form.size_selector.label(class="control-label") }}
299
+ <div class="input-group">
300
+ {{ form.size_selector(class="form-select") }}
301
+ {{ form.size(class="form-control") }}
302
+ </div>
303
+ </div>
304
+ {% endmacro %}
305
+
278
306
  {% macro snv_filters(form, institute, case, filters)%}
279
307
  <input type="hidden" name="variant_type" value="{{ form.variant_type.data }}">
280
308
  {{ variants_common_filters(form, "snv") }}
@@ -308,16 +336,28 @@
308
336
  {{ form.spidex_human(class="selectpicker", data_style="btn-secondary") }}
309
337
  </div>
310
338
  <div class="col-2">
311
- {{ form.clinsig.label(class="control-label") }}
339
+ <span>{{ form.clinsig.label(class="control-label") }}</span>
340
+ <span style="float:right;">{{ form.clinsig_exclude.label(class="control-label", data_bs_toggle="tooltip", data_bs_placement="left", title="Exclude variants with clinical significance among the selected categories.") }} {{form.clinsig_exclude}}</span>
312
341
  {{ form.clinsig(class="selectpicker", data_style="btn-secondary") }}
313
342
  </div>
314
- <div class="col-1">
315
- {{ form.clinsig_confident_always_returned.label(class="control-label", data_bs_toggle="tooltip", data_bs_placement="top", title="Always show selected CLINSIG entries with trusted revision status levels.") }}
316
- <div>{{ form.clinsig_confident_always_returned() }}</div>
317
- </div>
318
- <div class="col-1">
319
- {{ form.clinvar_tag() }}
320
- {{ form.clinvar_tag.label(class="ms-2") }}
343
+ <div class="col-2">
344
+ <div class="row">
345
+ <div class="class="form-check">
346
+ {{ form.clinvar_trusted_revstat(class="form-check-input") }}
347
+ {{ form.clinvar_trusted_revstat.label(class="form-check-label", data_bs_toggle="tooltip", data_bs_placement="top", title="Limit search to variants with trusted ClinVar revision status levels: mult, multiple_submitters, single, single_submitter, exp, reviewed_by_expert_panel, guideline, practice_guideline.") }}
348
+ </div>
349
+ </div>
350
+ <div class="row">
351
+ <div class="class="form-check">
352
+ {{ form.clinvar_tag(class="form-check-input") }}
353
+ {{ form.clinvar_tag.label(class="form-check-label", data_bs_toggle="tooltip", data_bs_placement="top", title="Return only variants with annotated ClinVar significance.") }}
354
+ </div>
355
+ </div>
356
+ <div class="row">
357
+ <div class="class="form-check">
358
+ {{ form.prioritise_clinvar(class="form-check-input") }}
359
+ {{ form.prioritise_clinvar.label(class="form-check-label", data_bs_toggle="tooltip", data_bs_placement="top", title="Include variants matching the selected ClinVar conditions, in addition to those found using the other search criteria (broadens the search). Note that variants excluded using ClinVar tags will still be returned when found using the other search criteria.") }}
360
+ </div>
321
361
  </div>
322
362
  </div>
323
363
  <div class="row mb-2">
@@ -336,10 +376,10 @@
336
376
  </div>
337
377
  </div>
338
378
  </div>
339
- <div class="col-2">
379
+ <div class="col-1">
340
380
  {{ wtf.form_field(form.start) }}
341
381
  </div>
342
- <div class="col-2">
382
+ <div class="col-1">
343
383
  {{ wtf.form_field(form.end) }}
344
384
  </div>
345
385
  <div class="col-2">
@@ -348,6 +388,7 @@
348
388
  <div class="col-2">
349
389
  {{ wtf.form_field(form.cytoband_end) }}
350
390
  </div>
391
+ {{ variant_size_filter(form) }}
351
392
  </div>
352
393
  <div class="row">
353
394
  <div class="col-2">
@@ -577,16 +618,6 @@
577
618
  gene_panels=['hpo']) }}">HPO gene list</a>
578
619
  </div>
579
620
  </div>
580
- <div class="col-2">
581
- {{ form.size.label(class="control-label") }}
582
- {{ form.size(class="form-control", type="number") }}
583
- </div>
584
- <div class="col-2 d-flex align-items-end">
585
- <div class="mb-2 form-check">
586
- {{ form.size_shorter.label(class="form-check-label") }}
587
- {{ form.size_shorter(class="form-check-input",type="checkbox") }}
588
- </div>
589
- </div>
590
621
  <div class="col-1 d-flex align-items-end">
591
622
  <div class="mb-2 form-check">
592
623
  {{ form.decipher.label(class="form-check-label") }}
@@ -622,10 +653,10 @@
622
653
  </div>
623
654
  </div>
624
655
  </div>
625
- <div class="col-2">
656
+ <div class="col-1">
626
657
  {{ wtf.form_field(form.start) }}
627
658
  </div>
628
- <div class="col-2">
659
+ <div class="col-1">
629
660
  {{ wtf.form_field(form.end) }}
630
661
  </div>
631
662
  <div class="col-1">
@@ -634,6 +665,7 @@
634
665
  <div class="col-1">
635
666
  {{ wtf.form_field(form.cytoband_end) }}
636
667
  </div>
668
+ {{ variant_size_filter(form) }}
637
669
  </div>
638
670
  <div class="row mb-3">
639
671
  <div class="col-2">
@@ -694,7 +726,8 @@
694
726
  {{ form.genetic_models(class="selectpicker", data_style="btn-secondary") }}
695
727
  </div>
696
728
  <div class="col-2">
697
- {{ form.clinsig.label(class="control-label") }}
729
+ <span>{{ form.clinsig.label(class="control-label") }}</span>
730
+ <span style="float:right;">{{ form.clinsig_exclude.label(class="control-label", data_bs_toggle="tooltip", data_bs_placement="left", title="Exclude variants with clinical significance among the selected categories.") }} {{form.clinsig_exclude}}</span>
698
731
  {{ form.clinsig(class="selectpicker", data_style="btn-secondary") }}
699
732
  </div>
700
733
  <div class="col-2">
@@ -765,9 +798,9 @@
765
798
  <div class="col">
766
799
  {{ wtf.form_field(form.cytoband_end) }}
767
800
  </div>
801
+ {{ variant_size_filter(form) }}
768
802
  </div>
769
803
  <div class="row" style="margin-top:10px;">
770
- <div class="col-2"></div>
771
804
  <div class="col-2">
772
805
  <a class="btn btn-secondary btn-sm form-control" data-bs-toggle="collapse" href="#stringcoords" aria-expanded="false" aria-controls="stringcoords">
773
806
  String coordinates
@@ -841,16 +874,6 @@
841
874
  {{ form.hgnc_symbols.label(class="control-label") }}
842
875
  {{ form.hgnc_symbols(class="form-control") }}
843
876
  </div>
844
- <div class="col-2">
845
- {{ form.size.label(class="control-label") }}
846
- {{ form.size(class="form-control", type="number") }}
847
- </div>
848
- <div class="col-2 d-flex align-items-end">
849
- <div class="form-check mb-2">
850
- {{ form.size_shorter.label(class="form-check-label") }}
851
- {{ form.size_shorter(class="form-check-input",type="checkbox") }}
852
- </div>
853
- </div>
854
877
  <div class="col-1">
855
878
  </div>
856
879
  <div class="col-1">
@@ -889,9 +912,9 @@
889
912
  <div class="col">
890
913
  {{ wtf.form_field(form.cytoband_end) }}
891
914
  </div>
915
+ {{ variant_size_filter(form) }}
892
916
  </div>
893
917
  <div class="row" style="margin-top:10px;">
894
- <div class="col-2"></div>
895
918
  <div class="col-2">
896
919
  <a class="btn btn-secondary btn-sm form-control" data-bs-toggle="collapse" href="#stringcoords" aria-expanded="false" aria-controls="stringcoords">
897
920
  String coordinates