scout-browser 4.88.1__py3-none-any.whl → 4.89__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 (59) hide show
  1. scout/__version__.py +1 -1
  2. scout/adapter/mongo/base.py +1 -1
  3. scout/adapter/mongo/case.py +185 -117
  4. scout/adapter/mongo/omics_variant.py +19 -0
  5. scout/build/case.py +1 -0
  6. scout/commands/load/variants.py +121 -40
  7. scout/commands/update/case.py +56 -10
  8. scout/constants/case_tags.py +5 -0
  9. scout/constants/disease_parsing.py +2 -2
  10. scout/constants/igv_tracks.py +2 -2
  11. scout/constants/indexes.py +8 -1
  12. scout/demo/643594.config.yaml +1 -0
  13. scout/demo/panel_1.txt +2 -0
  14. scout/demo/resources/ensembl_exons_37_reduced.txt +135 -0
  15. scout/demo/resources/ensembl_exons_38_reduced.txt +166 -0
  16. scout/demo/resources/ensembl_genes_37_reduced.txt +2 -0
  17. scout/demo/resources/ensembl_genes_38_reduced.txt +2 -0
  18. scout/demo/resources/ensembl_transcripts_37_reduced.txt +27 -0
  19. scout/demo/resources/ensembl_transcripts_38_reduced.txt +36 -0
  20. scout/demo/resources/hgnc_reduced_set.txt +2 -0
  21. scout/log/handlers.py +2 -1
  22. scout/log/log.py +48 -61
  23. scout/models/case/case_loading_models.py +2 -0
  24. scout/parse/omim.py +2 -2
  25. scout/server/app.py +23 -7
  26. scout/server/blueprints/alignviewers/controllers.py +46 -23
  27. scout/server/blueprints/cases/controllers.py +21 -47
  28. scout/server/blueprints/cases/templates/cases/case_report.html +4 -1
  29. scout/server/blueprints/cases/templates/cases/case_sma.html +19 -0
  30. scout/server/blueprints/cases/templates/cases/collapsible_actionbar.html +7 -7
  31. scout/server/blueprints/cases/templates/cases/individuals_table.html +1 -1
  32. scout/server/blueprints/clinvar/form.py +1 -1
  33. scout/server/blueprints/clinvar/templates/clinvar/clinvar_submissions.html +2 -2
  34. scout/server/blueprints/clinvar/templates/clinvar/multistep_add_variant.html +9 -3
  35. scout/server/blueprints/institutes/controllers.py +11 -38
  36. scout/server/blueprints/institutes/forms.py +18 -4
  37. scout/server/blueprints/institutes/templates/overview/cases.html +137 -46
  38. scout/server/blueprints/login/views.py +16 -12
  39. scout/server/blueprints/panels/controllers.py +4 -1
  40. scout/server/blueprints/panels/templates/panels/panel.html +1 -1
  41. scout/server/blueprints/panels/templates/panels/panels.html +5 -5
  42. scout/server/blueprints/public/templates/public/index.html +18 -10
  43. scout/server/blueprints/variant/templates/variant/components.html +0 -1
  44. scout/server/blueprints/variant/templates/variant/gene_disease_relations.html +1 -1
  45. scout/server/config.py +3 -0
  46. scout/server/extensions/__init__.py +2 -0
  47. scout/server/extensions/chanjo2_extension.py +46 -0
  48. scout/server/extensions/chanjo_extension.py +44 -1
  49. scout/server/extensions/matchmaker_extension.py +0 -1
  50. scout/server/links.py +11 -2
  51. scout/server/templates/report_base.html +1 -0
  52. scout/utils/convert.py +1 -1
  53. scout/utils/date.py +1 -1
  54. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/METADATA +1 -1
  55. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/RECORD +59 -58
  56. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/LICENSE +0 -0
  57. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/WHEEL +0 -0
  58. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/entry_points.txt +0 -0
  59. {scout_browser-4.88.1.dist-info → scout_browser-4.89.dist-info}/top_level.txt +0 -0
@@ -15662,6 +15662,172 @@ Chromosome/scaffold name Gene stable ID Transcript stable ID Exon stable ID Exon
15662
15662
  5 ENSG00000170458 ENST00000401743 ENSE00001862834 140011313 140012565 140011313 140011440 -1 3
15663
15663
  5 ENSG00000170458 ENST00000401743 ENSE00001429397 140012654 140012877 140012657 140012877 -1 2
15664
15664
  5 ENSG00000170458 ENST00000401743 ENSE00001554029 140013116 140013286 140013116 140013286 -1 1
15665
+ 5 ENSG00000205571 ENST00000511812 ENSE00002054021 70049638 70049766 70049638 70049685 1 1
15666
+ 5 ENSG00000205571 ENST00000511812 ENSE00001725187 70063415 70063486 1 2
15667
+ 5 ENSG00000205571 ENST00000511812 ENSE00003668426 70065965 70066084 1 3
15668
+ 5 ENSG00000205571 ENST00000511812 ENSE00003698225 70067294 70067446 1 4
15669
+ 5 ENSG00000205571 ENST00000511812 ENSE00003550962 70069235 70069330 1 5
15670
+ 5 ENSG00000205571 ENST00000511812 ENSE00003620900 70070641 70070751 1 6
15671
+ 5 ENSG00000205571 ENST00000511812 ENSE00002055618 70076521 70076706 70076572 70076706 1 7
15672
+ 5 ENSG00000205571 ENST00000626847 ENSE00001725187 70063415 70063486 1 2
15673
+ 5 ENSG00000205571 ENST00000626847 ENSE00003668426 70065965 70066084 1 3
15674
+ 5 ENSG00000205571 ENST00000626847 ENSE00003698225 70067294 70067446 1 5
15675
+ 5 ENSG00000205571 ENST00000626847 ENSE00003550962 70069235 70069330 1 6
15676
+ 5 ENSG00000205571 ENST00000626847 ENSE00003620900 70070641 70070751 1 7
15677
+ 5 ENSG00000205571 ENST00000626847 ENSE00003762300 70049654 70049766 70049654 70049685 1 1
15678
+ 5 ENSG00000205571 ENST00000626847 ENSE00003579743 70066934 70067134 1 4
15679
+ 5 ENSG00000205571 ENST00000626847 ENSE00003765895 70077019 70077592 70077034 70077592 1 8
15680
+ 5 ENSG00000205571 ENST00000506734 ENSE00001725187 70063415 70063486 1 2
15681
+ 5 ENSG00000205571 ENST00000506734 ENSE00003668426 70065965 70066084 1 3
15682
+ 5 ENSG00000205571 ENST00000506734 ENSE00003698225 70067294 70067446 1 5
15683
+ 5 ENSG00000205571 ENST00000506734 ENSE00003550962 70069235 70069330 1 6
15684
+ 5 ENSG00000205571 ENST00000506734 ENSE00003620900 70070641 70070751 1 7
15685
+ 5 ENSG00000205571 ENST00000506734 ENSE00003579743 70066934 70067134 1 4
15686
+ 5 ENSG00000205571 ENST00000506734 ENSE00002041070 70049657 70049766 70049657 70049685 1 1
15687
+ 5 ENSG00000205571 ENST00000506734 ENSE00002038304 70071282 70071390 70071333 70071390 1 8
15688
+ 5 ENSG00000205571 ENST00000506734 ENSE00002033350 70077019 70077596 70077019 70077596 1 9
15689
+ 5 ENSG00000205571 ENST00000380742 ENSE00001725187 70063415 70063486 1 2
15690
+ 5 ENSG00000205571 ENST00000380742 ENSE00003668426 70065965 70066084 1 3
15691
+ 5 ENSG00000205571 ENST00000380742 ENSE00003698225 70067294 70067446 1 5
15692
+ 5 ENSG00000205571 ENST00000380742 ENSE00003620900 70070641 70070751 1 6
15693
+ 5 ENSG00000205571 ENST00000380742 ENSE00003579743 70066934 70067134 1 4
15694
+ 5 ENSG00000205571 ENST00000380742 ENSE00001897950 70049664 70049766 70049664 70049685 1 1
15695
+ 5 ENSG00000205571 ENST00000380742 ENSE00003698693 70076521 70076574 70076572 70076574 1 7
15696
+ 5 ENSG00000205571 ENST00000380742 ENSE00001812360 70077019 70077592 70077019 70077592 1 8
15697
+ 5 ENSG00000205571 ENST00000380743 ENSE00001725187 70063415 70063486 1 2
15698
+ 5 ENSG00000205571 ENST00000380743 ENSE00003668426 70065965 70066084 1 3
15699
+ 5 ENSG00000205571 ENST00000380743 ENSE00003698225 70067294 70067446 1 5
15700
+ 5 ENSG00000205571 ENST00000380743 ENSE00003550962 70069235 70069330 1 6
15701
+ 5 ENSG00000205571 ENST00000380743 ENSE00003620900 70070641 70070751 1 7
15702
+ 5 ENSG00000205571 ENST00000380743 ENSE00003579743 70066934 70067134 1 4
15703
+ 5 ENSG00000205571 ENST00000380743 ENSE00003698693 70076521 70076574 70076572 70076574 1 8
15704
+ 5 ENSG00000205571 ENST00000380743 ENSE00001904512 70049669 70049766 70049669 70049685 1 1
15705
+ 5 ENSG00000205571 ENST00000380743 ENSE00003898412 70077019 70077595 70077019 70077595 1 9
15706
+ 5 ENSG00000205571 ENST00000628696 ENSE00001725187 70063415 70063486 1 2
15707
+ 5 ENSG00000205571 ENST00000628696 ENSE00003668426 70065965 70066084 1 3
15708
+ 5 ENSG00000205571 ENST00000628696 ENSE00003698225 70067294 70067446 1 5
15709
+ 5 ENSG00000205571 ENST00000628696 ENSE00003550962 70069235 70069330 1 6
15710
+ 5 ENSG00000205571 ENST00000628696 ENSE00003620900 70070641 70070751 1 7
15711
+ 5 ENSG00000205571 ENST00000628696 ENSE00003579743 70066934 70067134 1 4
15712
+ 5 ENSG00000205571 ENST00000628696 ENSE00001792916 70049686 70049766 1 1
15713
+ 5 ENSG00000205571 ENST00000628696 ENSE00003762314 70071282 70071332 1 8
15714
+ 5 ENSG00000205571 ENST00000380741 ENSE00001725187 70063415 70063486 1 2
15715
+ 5 ENSG00000205571 ENST00000380741 ENSE00003668426 70065965 70066084 1 3
15716
+ 5 ENSG00000205571 ENST00000380741 ENSE00003698225 70067294 70067446 1 5
15717
+ 5 ENSG00000205571 ENST00000380741 ENSE00003550962 70069235 70069330 1 6
15718
+ 5 ENSG00000205571 ENST00000380741 ENSE00003620900 70070641 70070751 1 7
15719
+ 5 ENSG00000205571 ENST00000380741 ENSE00003579743 70066934 70067134 1 4
15720
+ 5 ENSG00000205571 ENST00000380741 ENSE00001792916 70049686 70049766 1 1
15721
+ 5 ENSG00000205571 ENST00000380741 ENSE00003723821 70076521 70076586 70076572 70076586 1 8
15722
+ 5 ENSG00000205571 ENST00000614240 ENSE00001725187 70063415 70063486 1 2
15723
+ 5 ENSG00000205571 ENST00000614240 ENSE00003668426 70065965 70066084 1 3
15724
+ 5 ENSG00000205571 ENST00000614240 ENSE00003698225 70067294 70067446 1 5
15725
+ 5 ENSG00000205571 ENST00000614240 ENSE00003620900 70070641 70070751 1 6
15726
+ 5 ENSG00000205571 ENST00000614240 ENSE00003579743 70066934 70067134 1 4
15727
+ 5 ENSG00000205571 ENST00000614240 ENSE00001792916 70049686 70049766 1 1
15728
+ 5 ENSG00000205571 ENST00000614240 ENSE00003723821 70076521 70076586 70076572 70076586 1 7
15729
+ 5 ENSG00000205571 ENST00000503678 ENSE00002056052 70063411 70063486 1 1
15730
+ 5 ENSG00000205571 ENST00000503678 ENSE00003685383 70065965 70066084 1 2
15731
+ 5 ENSG00000205571 ENST00000503678 ENSE00003650356 70066934 70067134 1 3
15732
+ 5 ENSG00000205571 ENST00000503678 ENSE00003700892 70067294 70067446 1 4
15733
+ 5 ENSG00000205571 ENST00000503678 ENSE00003668557 70069235 70069330 1 5
15734
+ 5 ENSG00000205571 ENST00000503678 ENSE00002064131 70070641 70070755 1 6
15735
+ 5 ENSG00000205571 ENST00000511873 ENSE00003698225 70067294 70067446 1 2
15736
+ 5 ENSG00000205571 ENST00000511873 ENSE00003668557 70069235 70069330 70069235 70069330 1 4
15737
+ 5 ENSG00000205571 ENST00000511873 ENSE00002038537 70067084 70067134 1 1
15738
+ 5 ENSG00000205571 ENST00000511873 ENSE00002050020 70069026 70069142 70069062 70069142 1 3
15739
+ 5 ENSG00000205571 ENST00000511873 ENSE00003697649 70070641 70070654 70070641 70070654 1 5
15740
+ 5 ENSG00000205571 ENST00000509805 ENSE00003700892 70067294 70067446 1 2
15741
+ 5 ENSG00000205571 ENST00000509805 ENSE00003668557 70069235 70069330 1 3
15742
+ 5 ENSG00000205571 ENST00000509805 ENSE00002036057 70067094 70067134 1 1
15743
+ 5 ENSG00000205571 ENST00000509805 ENSE00002062850 70070641 70070849 1 4
15744
+ 5 ENSG00000205571 ENST00000505346 ENSE00003700892 70067294 70067446 1 2
15745
+ 5 ENSG00000205571 ENST00000505346 ENSE00002067458 70067099 70067134 1 1
15746
+ 5 ENSG00000205571 ENST00000505346 ENSE00003529016 70070641 70070751 1 3
15747
+ 5 ENSG00000205571 ENST00000505346 ENSE00002073006 70076521 70076927 1 4
15748
+ 5 ENSG00000205571 ENST00000514914 ENSE00003668557 70069235 70069330 1 2
15749
+ 5 ENSG00000205571 ENST00000514914 ENSE00003529016 70070641 70070751 1 3
15750
+ 5 ENSG00000205571 ENST00000514914 ENSE00002051731 70067279 70067446 1 1
15751
+ 5 ENSG00000205571 ENST00000514914 ENSE00003696722 70076521 70076574 1 4
15752
+ 5 ENSG00000205571 ENST00000514914 ENSE00002023398 70077019 70077251 1 5
15753
+ 5 ENSG00000205571 ENST00000508258 ENSE00002032527 70069233 70069330 1 1
15754
+ 5 ENSG00000205571 ENST00000508258 ENSE00002041684 70070641 70070753 1 2
15755
+ 5 ENSG00000205571 ENST00000507458 ENSE00003698693 70076521 70076574 70076572 70076574 1 2
15756
+ 5 ENSG00000205571 ENST00000507458 ENSE00002036578 70070664 70070751 1 1
15757
+ 5 ENSG00000205571 ENST00000507458 ENSE00002067548 70077019 70077160 70077019 70077160 1 3
15758
+ 5 ENSG00000205571 ENST00000507458 ENSE00002085226 70077762 70078522 70077762 70078522 1 4
15759
+ 5 ENSG00000172062 ENST00000503079 ENSE00001922009 70925030 70925184 70925030 70925103 1 1
15760
+ 5 ENSG00000172062 ENST00000503079 ENSE00001688516 70938839 70938910 1 2
15761
+ 5 ENSG00000172062 ENST00000503079 ENSE00001638255 70941389 70941508 1 3
15762
+ 5 ENSG00000172062 ENST00000503079 ENSE00001766361 70942358 70942558 1 4
15763
+ 5 ENSG00000172062 ENST00000503079 ENSE00003576392 70942718 70942870 1 5
15764
+ 5 ENSG00000172062 ENST00000503079 ENSE00001593733 70946066 70946176 1 6
15765
+ 5 ENSG00000172062 ENST00000503079 ENSE00002062475 70951941 70952347 70951992 70952347 1 7
15766
+ 5 ENSG00000172062 ENST00000514951 ENSE00001688516 70938839 70938910 1 2
15767
+ 5 ENSG00000172062 ENST00000514951 ENSE00001638255 70941389 70941508 1 3
15768
+ 5 ENSG00000172062 ENST00000514951 ENSE00003576392 70942718 70942870 1 4
15769
+ 5 ENSG00000172062 ENST00000514951 ENSE00001593733 70946066 70946176 1 6
15770
+ 5 ENSG00000172062 ENST00000514951 ENSE00002034950 70925056 70925184 70925056 70925103 1 1
15771
+ 5 ENSG00000172062 ENST00000514951 ENSE00003611930 70944658 70944753 1 5
15772
+ 5 ENSG00000172062 ENST00000514951 ENSE00002045198 70951941 70952567 70951992 70952567 1 7
15773
+ 5 ENSG00000172062 ENST00000506239 ENSE00001688516 70938839 70938910 1 2
15774
+ 5 ENSG00000172062 ENST00000506239 ENSE00001638255 70941389 70941508 1 3
15775
+ 5 ENSG00000172062 ENST00000506239 ENSE00001766361 70942358 70942558 1 4
15776
+ 5 ENSG00000172062 ENST00000506239 ENSE00003576392 70942718 70942870 1 5
15777
+ 5 ENSG00000172062 ENST00000506239 ENSE00001593733 70946066 70946176 1 7
15778
+ 5 ENSG00000172062 ENST00000506239 ENSE00003611930 70944658 70944753 1 6
15779
+ 5 ENSG00000172062 ENST00000506239 ENSE00002073998 70925075 70925184 70925075 70925103 1 1
15780
+ 5 ENSG00000172062 ENST00000506239 ENSE00002042046 70946707 70946815 70946758 70946815 1 8
15781
+ 5 ENSG00000172062 ENST00000506239 ENSE00002052357 70952439 70953016 70952439 70953016 1 9
15782
+ 5 ENSG00000172062 ENST00000380707 ENSE00001688516 70938839 70938910 1 2
15783
+ 5 ENSG00000172062 ENST00000380707 ENSE00001638255 70941389 70941508 1 3
15784
+ 5 ENSG00000172062 ENST00000380707 ENSE00001766361 70942358 70942558 1 4
15785
+ 5 ENSG00000172062 ENST00000380707 ENSE00003576392 70942718 70942870 1 5
15786
+ 5 ENSG00000172062 ENST00000380707 ENSE00001593733 70946066 70946176 1 7
15787
+ 5 ENSG00000172062 ENST00000380707 ENSE00003611930 70944658 70944753 1 6
15788
+ 5 ENSG00000172062 ENST00000380707 ENSE00003899118 70925087 70925184 70925087 70925103 1 1
15789
+ 5 ENSG00000172062 ENST00000380707 ENSE00003693452 70951941 70951994 70951992 70951994 1 8
15790
+ 5 ENSG00000172062 ENST00000380707 ENSE00001885073 70952439 70953015 70952439 70953015 1 9
15791
+ 5 ENSG00000172062 ENST00000506163 ENSE00001688516 70938839 70938910 1 2
15792
+ 5 ENSG00000172062 ENST00000506163 ENSE00001638255 70941389 70941508 1 3
15793
+ 5 ENSG00000172062 ENST00000506163 ENSE00001766361 70942358 70942558 1 4
15794
+ 5 ENSG00000172062 ENST00000506163 ENSE00003576392 70942718 70942870 1 5
15795
+ 5 ENSG00000172062 ENST00000506163 ENSE00001593733 70946066 70946176 1 7
15796
+ 5 ENSG00000172062 ENST00000506163 ENSE00003611930 70944658 70944753 1 6
15797
+ 5 ENSG00000172062 ENST00000506163 ENSE00002033586 70925095 70925184 70925095 70925103 1 1
15798
+ 5 ENSG00000172062 ENST00000506163 ENSE00002025434 70952439 70953040 70952454 70953040 1 8
15799
+ 5 ENSG00000172062 ENST00000625245 ENSE00001688516 70938839 70938910 1 2
15800
+ 5 ENSG00000172062 ENST00000625245 ENSE00001638255 70941389 70941508 1 3
15801
+ 5 ENSG00000172062 ENST00000625245 ENSE00001766361 70942358 70942558 1 4
15802
+ 5 ENSG00000172062 ENST00000625245 ENSE00003576392 70942718 70942870 1 5
15803
+ 5 ENSG00000172062 ENST00000625245 ENSE00001593733 70946066 70946176 1 7
15804
+ 5 ENSG00000172062 ENST00000625245 ENSE00003611930 70944658 70944753 1 6
15805
+ 5 ENSG00000172062 ENST00000625245 ENSE00001695536 70925104 70925184 1 1
15806
+ 5 ENSG00000172062 ENST00000625245 ENSE00003771397 70946707 70946757 1 8
15807
+ 5 ENSG00000172062 ENST00000351205 ENSE00001688516 70938839 70938910 1 2
15808
+ 5 ENSG00000172062 ENST00000351205 ENSE00001638255 70941389 70941508 1 3
15809
+ 5 ENSG00000172062 ENST00000351205 ENSE00001766361 70942358 70942558 1 4
15810
+ 5 ENSG00000172062 ENST00000351205 ENSE00003576392 70942718 70942870 1 5
15811
+ 5 ENSG00000172062 ENST00000351205 ENSE00001593733 70946066 70946176 1 7
15812
+ 5 ENSG00000172062 ENST00000351205 ENSE00003611930 70944658 70944753 1 6
15813
+ 5 ENSG00000172062 ENST00000351205 ENSE00001695536 70925104 70925184 1 1
15814
+ 5 ENSG00000172062 ENST00000351205 ENSE00003727855 70951941 70952006 70951992 70952006 1 8
15815
+ 5 ENSG00000172062 ENST00000518504 ENSE00002115234 70942472 70942558 1 1
15816
+ 5 ENSG00000172062 ENST00000518504 ENSE00003586477 70942718 70942870 1 2
15817
+ 5 ENSG00000172062 ENST00000518504 ENSE00002067240 70946066 70946278 1 3
15818
+ 5 ENSG00000172062 ENST00000507905 ENSE00003576392 70942718 70942870 1 2
15819
+ 5 ENSG00000172062 ENST00000507905 ENSE00002065935 70942508 70942558 1 1
15820
+ 5 ENSG00000172062 ENST00000507905 ENSE00002019326 70944449 70944565 70944485 70944565 1 3
15821
+ 5 ENSG00000172062 ENST00000507905 ENSE00003477349 70944658 70944753 70944658 70944753 1 4
15822
+ 5 ENSG00000172062 ENST00000507905 ENSE00002110817 70946066 70946079 70946066 70946079 1 5
15823
+ 5 ENSG00000172062 ENST00000513228 ENSE00003586477 70942718 70942870 1 2
15824
+ 5 ENSG00000172062 ENST00000513228 ENSE00003477349 70944658 70944753 1 3
15825
+ 5 ENSG00000172062 ENST00000513228 ENSE00002053468 70942518 70942558 1 1
15826
+ 5 ENSG00000172062 ENST00000513228 ENSE00002065580 70946066 70946274 1 4
15827
+ 5 ENSG00000172062 ENST00000510679 ENSE00002063740 70946089 70946176 1 1
15828
+ 5 ENSG00000172062 ENST00000510679 ENSE00003581587 70951941 70951994 1 2
15829
+ 5 ENSG00000172062 ENST00000510679 ENSE00002068209 70952439 70952580 1 3
15830
+ 5 ENSG00000172062 ENST00000510679 ENSE00002084907 70953182 70953942 1 4
15665
15831
  6 ENSG00000118503 ENST00000421450 ENSE00001636894 138188351 138188679 138188351 138188679 1 1
15666
15832
  6 ENSG00000118503 ENST00000421450 ENSE00001724607 138192350 138192441 138192350 138192364 1 2
15667
15833
  6 ENSG00000118503 ENST00000420009 ENSE00001680250 138188459 138188655 138188459 138188655 1 1
@@ -194,6 +194,8 @@ Chromosome/scaffold name Gene start (bp) Gene end (bp) Gene stable ID HGNC symbo
194
194
  5 1392909 1445545 ENSG00000142319 SLC6A3 11049
195
195
  5 174151536 174157896 ENSG00000120149 MSX2 7392
196
196
  5 140011313 140013286 ENSG00000170458 CD14 1628
197
+ 5 70220768 70249769 ENSG00000172062 SMN1 11117
198
+ 5 69345350 69374349 ENSG00000205571 SMN2 11118
197
199
  6 138188351 138204449 ENSG00000118503 TNFAIP3 11896
198
200
  6 157099063 157531913 ENSG00000049618 ARID1B 18040
199
201
  6 7727030 7881655 ENSG00000153162 BMP6 1073
@@ -194,6 +194,8 @@ Chromosome/scaffold name Gene start (bp) Gene end (bp) Gene stable ID HGNC symbo
194
194
  5 140631728 140633701 ENSG00000170458 CD14 1628
195
195
  5 95751319 95823005 ENSG00000173221 GLRX 4330
196
196
  5 174724533 174730893 ENSG00000120149 MSX2 7392
197
+ 5 70925030 70953942 ENSG00000172062 SMN1 11117
198
+ 5 70049638 70078522 ENSG00000205571 SMN2 11118
197
199
  6 139371807 139374620 ENSG00000164442 CITED2 1987
198
200
  6 137867188 137883312 ENSG00000118503 TNFAIP3 11896
199
201
  6 156777374 157210779 ENSG00000049618 ARID1B 18040
@@ -1996,6 +1996,33 @@ Chromosome/scaffold name Gene stable ID Transcript stable ID Transcript start (b
1996
1996
  5 ENSG00000170458 ENST00000401743 140011313 140013286 NM_001174105
1997
1997
  5 ENSG00000170458 ENST00000401743 140011313 140013286 NM_001040021
1998
1998
  5 ENSG00000170458 ENST00000401743 140011313 140013286 NM_001174104
1999
+ 5 ENSG00000205571 ENST00000380743 69345439 69373419 NM_017411
2000
+ 5 ENSG00000205571 ENST00000511812 69345465 69372533
2001
+ 5 ENSG00000205571 ENST00000506734 69345484 69373423
2002
+ 5 ENSG00000205571 ENST00000380742 69345491 69373419 NM_022876
2003
+ 5 ENSG00000205571 ENST00000503678 69359238 69366582
2004
+ 5 ENSG00000205571 ENST00000511873 69362911 69366481
2005
+ 5 ENSG00000205571 ENST00000509805 69362921 69366676
2006
+ 5 ENSG00000205571 ENST00000505346 69362926 69372754
2007
+ 5 ENSG00000205571 ENST00000514914 69363106 69373078
2008
+ 5 ENSG00000205571 ENST00000508258 69365060 69366580
2009
+ 5 ENSG00000205571 ENST00000507458 69366491 69374349
2010
+ 5 ENSG00000205571 ENST00000380741 69345350 69373421 NM_022875 XM_005276775
2011
+ 5 ENSG00000205571 ENST00000380741 69345350 69373421 NM_022875 XM_005248575
2012
+ 5 ENSG00000205571 ENST00000380741 69345350 69373421 NM_022877 XM_005276775
2013
+ 5 ENSG00000205571 ENST00000380741 69345350 69373421 NM_022877 XM_005248575
2014
+ 5 ENSG00000172062 ENST00000503079 70220857 70248174
2015
+ 5 ENSG00000172062 ENST00000380707 70220857 70248839 NM_000344
2016
+ 5 ENSG00000172062 ENST00000514951 70220883 70248394 XM_005276777
2017
+ 5 ENSG00000172062 ENST00000514951 70220883 70248394 XM_005248578
2018
+ 5 ENSG00000172062 ENST00000514951 70220883 70248394 XM_005248577
2019
+ 5 ENSG00000172062 ENST00000506239 70220902 70248843
2020
+ 5 ENSG00000172062 ENST00000506163 70220922 70248867
2021
+ 5 ENSG00000172062 ENST00000518504 70238299 70242105
2022
+ 5 ENSG00000172062 ENST00000507905 70238335 70241906
2023
+ 5 ENSG00000172062 ENST00000513228 70238345 70242101
2024
+ 5 ENSG00000172062 ENST00000510679 70241916 70249769
2025
+ 5 ENSG00000172062 ENST00000351205 70220768 70248841 NM_022874
1999
2026
  6 ENSG00000118503 ENST00000421450 138188351 138192441
2000
2027
  6 ENSG00000118503 ENST00000420009 138188459 138196172
2001
2028
  6 ENSG00000118503 ENST00000237289 138188581 138204449 NM_001270507 XM_005267119
@@ -3013,6 +3013,42 @@ Chromosome/scaffold name Gene stable ID Transcript stable ID Transcript start (b
3013
3013
  5 ENSG00000173221 ENST00000512469 95816410 95822711
3014
3014
  5 ENSG00000120149 ENST00000239243 174724533 174730893 NM_002449
3015
3015
  5 ENSG00000120149 ENST00000507785 174724602 174729880 XM_017009489
3016
+ 5 ENSG00000172062 ENST00000503079 70925030 70952347 NM_022874 XM_047417616
3017
+ 5 ENSG00000172062 ENST00000514951 70925056 70952567 XM_011543597
3018
+ 5 ENSG00000172062 ENST00000506239 70925075 70953016
3019
+ 5 ENSG00000172062 ENST00000380707 70925087 70953015 NM_000344 NM_000344.4
3020
+ 5 ENSG00000172062 ENST00000506163 70925095 70953040 NM_001297715 XM_047417615
3021
+ 5 ENSG00000172062 ENST00000506163 70925095 70953040 NM_001297715 XM_017009786
3022
+ 5 ENSG00000172062 ENST00000506163 70925095 70953040 NM_001297715 XM_047417618
3023
+ 5 ENSG00000172062 ENST00000625245 70925104 70946757 XM_011543596
3024
+ 5 ENSG00000172062 ENST00000351205 70925104 70952006
3025
+ 5 ENSG00000172062 ENST00000518504 70942472 70946278
3026
+ 5 ENSG00000172062 ENST00000507905 70942508 70946079
3027
+ 5 ENSG00000172062 ENST00000513228 70942518 70946274
3028
+ 5 ENSG00000172062 ENST00000510679 70946089 70953942
3029
+ 5 ENSG00000205571 ENST00000511812 70049638 70076706 XM_047417621
3030
+ 5 ENSG00000205571 ENST00000511812 70049638 70076706 XM_047417622
3031
+ 5 ENSG00000205571 ENST00000511812 70049638 70076706 XM_011543600
3032
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022877 XM_047417619
3033
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022877 XM_011543601
3034
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022877 XM_011543603
3035
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022875 XM_047417619
3036
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022875 XM_011543601
3037
+ 5 ENSG00000205571 ENST00000626847 70049654 70077592 NM_022875 XM_011543603
3038
+ 5 ENSG00000205571 ENST00000506734 70049657 70077596
3039
+ 5 ENSG00000205571 ENST00000380742 70049664 70077592 NM_022876 XM_011543602
3040
+ 5 ENSG00000205571 ENST00000380743 70049669 70077595 NM_017411 NM_017411.4
3041
+ 5 ENSG00000205571 ENST00000628696 70049686 70071332 XM_011543599
3042
+ 5 ENSG00000205571 ENST00000628696 70049686 70071332 XM_017009787
3043
+ 5 ENSG00000205571 ENST00000380741 70049686 70076586
3044
+ 5 ENSG00000205571 ENST00000614240 70049686 70076586 XM_047417620
3045
+ 5 ENSG00000205571 ENST00000503678 70063411 70070755
3046
+ 5 ENSG00000205571 ENST00000511873 70067084 70070654
3047
+ 5 ENSG00000205571 ENST00000509805 70067094 70070849
3048
+ 5 ENSG00000205571 ENST00000505346 70067099 70076927
3049
+ 5 ENSG00000205571 ENST00000514914 70067279 70077251
3050
+ 5 ENSG00000205571 ENST00000508258 70069233 70070753
3051
+ 5 ENSG00000205571 ENST00000507458 70070664 70078522
3016
3052
  6 ENSG00000164442 ENST00000367651 139371807 139374620 NM_006079
3017
3053
  6 ENSG00000164442 ENST00000537332 139372255 139374213 NM_001168389
3018
3054
  6 ENSG00000164442 ENST00000536159 139372255 139374362 NM_001168388
@@ -263,3 +263,5 @@ HGNC:12791 WRN Werner syndrome RecQ like helicase protein-coding gene gene with
263
263
  HGNC:32550 ZBTB42 zinc finger and BTB domain containing 42 protein-coding gene gene with protein product Approved 14q32.33 14q32.33 ZNF925 "Zinc fingers C2H2-type|BTB domain containing" "28|861" 2006-03-15 2015-08-26 100128927 ENSG00000179627 OTTHUMG00000170790 uc021sem.3 AX721091 NM_001137601 CCDS45174 B2RXF5 MGI:3644133 RGD:1582758 ZBTB42 613915 471346 591
264
264
  HGNC:12873 ZIC2 Zic family member 2 protein-coding gene gene with protein product Approved 13q32.3 13q32.3 HPE5 Zinc finger protein of the cerebellum 2 "Zic family member 2 (odd-paired Drosophila homolog)|Zic family member 2 (odd-paired homolog, Drosophila)" Zinc fingers C2H2-type 28 1998-04-27 2011-05-19 2018-04-21 7546 ENSG00000043355 OTTHUMG00000017279 uc001von.4 AF104902 NM_007129 CCDS9495 O95409 9771712 MGI:106679 RGD:1311174 LRG_1157|http://www.lrg-sequence.org/LRG/LRG_1157 ZIC2 603073 120610
265
265
  HGNC:29277 ZNF687 zinc finger protein 687 protein-coding gene gene with protein product Approved 1q21.3 01q21.3 KIAA1441 2005-05-06 2016-10-05 57592 ENSG00000143373 OTTHUMG00000012347 uc001exq.4 NM_020832 CCDS992 Q8N1G0 10718198 MGI:1925516 RGD:2323182 ZNF687 610568 451453
266
+ HGNC:11117 SMN1 survival of motor neuron 1, telomeric protein-coding gene gene with protein product Approved 5q13.2 05q13.2 "BCD541|SMNT|SMA1|SMA2|SMA3|GEMIN1|TDRD16A" "gemin-1|tudor domain containing 16A" "SMA@|SMA" spinal muscular atrophy (Werdnig-Hoffmann disease, Kugelberg-Welander disease) "Tudor domain containing|SMN complex|Proteins encoded by multiple genes" "780|1500|2293" 1996-12-12 2023-01-20 6606 ENSG00000172062 OTTHUMG00000099361 uc003kak.4 U18423 NM_000344 Q16637 7813012 MGI:109257 RGD:620755 "SMN1 - Spinal Muscular Atrophy (SMA)|http://www.LOVD.nl/SMN1|Leiden Muscular Dystrophy pages|http://www.dmd.nl/nmdb2/home.php?select_db=SMN1|ALSOD, the Amyotrophic Lateral Sclerosis Online Genetic Database|http://alsod.iop.kcl.ac.uk/|LRG_676|http://ftp.ebi.ac.uk/pub/databases/lrgex/LRG_676.xml" 600354 133452 HGNC:11117 "ENST00000380707.9|NM_000344.4" HGNC:11117
267
+ HGNC:11118 SMN2 survival of motor neuron 2, centromeric protein-coding gene gene with protein product Approved 5q13.2 05q13.2 "BCD541|SMNC|GEMIN1|TDRD16B" tudor domain containing 16B "Tudor domain containing|SMN complex|Proteins encoded by multiple genes" "780|1500|2293" 1996-12-12 2023-01-20 6607 ENSG00000205571 OTTHUMG00000099389 uc003jyd.4 NM_017411 Q16637 7813012 MGI:109257 "ALSOD, the Amyotrophic Lateral Sclerosis Online Genetic Database|http://alsod.iop.kcl.ac.uk/|LRG_677|http://ftp.ebi.ac.uk/pub/databases/lrgex/LRG_677.xml" 601627 119750 HGNC:11118 "ENST00000380743.9|NM_017411.4"
scout/log/handlers.py CHANGED
@@ -1,9 +1,10 @@
1
1
  # -*- coding: utf-8 -*-
2
- import logging
3
2
  import logging.handlers
4
3
 
5
4
 
6
5
  class TlsSMTPHandler(logging.handlers.SMTPHandler):
6
+ """Used by the app to send emails."""
7
+
7
8
  def emit(self, record):
8
9
  """Emit a record.
9
10
  Format the record and send it to the specified addressees.
scout/log/log.py CHANGED
@@ -1,62 +1,49 @@
1
1
  import logging
2
- import os
3
- import sys
4
-
5
-
6
- def init_log(logger, filename=None, loglevel=None):
7
- """
8
- Initializes the log file in the proper format.
9
-
10
- Arguments:
11
-
12
- filename (str): Path to a file. Or None if logging is to
13
- be disabled.
14
- loglevel (str): Determines the level of the log output.
15
- """
16
- template = "[%(asctime)s] %(levelname)-8s: %(name)-25s: %(message)s"
17
- formatter = logging.Formatter(template)
18
-
19
- if loglevel:
20
- logger.setLevel(getattr(logging, loglevel))
21
-
22
- # We will always print warnings and higher to stderr
23
- console = logging.StreamHandler()
24
- console.setLevel("WARNING")
25
- console.setFormatter(formatter)
26
-
27
- if filename:
28
- file_handler = logging.FileHandler(filename, encoding="utf-8")
29
- if loglevel:
30
- file_handler.setLevel(getattr(logging, loglevel))
31
- file_handler.setFormatter(formatter)
32
- logger.addHandler(file_handler)
33
- # If no logfile is provided we print all log messages that the user has
34
- # defined to stderr
35
- else:
36
- if loglevel:
37
- console.setLevel(getattr(logging, loglevel))
38
-
39
- logger.addHandler(console)
40
-
41
-
42
- def get_log_stream(logger):
43
- """
44
- Returns a stream to the root log file.
45
- If there is no logfile return the stderr log stream
46
-
47
- Returns:
48
- A stream to the root log file or stderr stream.
49
- """
50
-
51
- file_stream = None
52
- log_stream = None
53
- for handler in logger.handlers:
54
- if isinstance(handler, logging.FileHandler):
55
- file_stream = handler.stream
56
- else:
57
- log_stream = handler.stream
58
-
59
- if file_stream:
60
- return file_stream
61
-
62
- return log_stream
2
+
3
+ import coloredlogs
4
+ from flask.app import Flask
5
+
6
+ USERS_LOGGER_PATH_PARAM = "USERS_ACTIVITY_LOG_PATH"
7
+ ACTIVITY_LOG_IGNORE_TRIGGERS = [
8
+ "static",
9
+ "ideograms",
10
+ "custom_images",
11
+ "autozygous_images",
12
+ "coverage_images",
13
+ "upd_regions_images",
14
+ "favicon",
15
+ "GET /",
16
+ "Closing",
17
+ "Enable",
18
+ "enabled",
19
+ "Collecting IGV tracks",
20
+ ] # Substrings used when filtering messages to show if users activity log is on
21
+
22
+
23
+ class ActivityLogFilter(logging.Filter):
24
+ """When monitoring users activity, log only navigation on main pages.
25
+ - Do not log messages that contain the substrings specified in ACTIVITY_LOG_IGNORE_TRIGGERS"""
26
+
27
+ def filter(self, record):
28
+ return (
29
+ any(sub_url in record.getMessage() for sub_url in ACTIVITY_LOG_IGNORE_TRIGGERS) is False
30
+ )
31
+
32
+
33
+ def set_activity_log(log: logging.Logger, app: Flask):
34
+ """Log users' activity to a file, if specified in the scout config."""
35
+ app.logger.setLevel("INFO")
36
+ app.logger.addFilter(ActivityLogFilter())
37
+ file_handler = logging.FileHandler(app.config[USERS_LOGGER_PATH_PARAM])
38
+ file_handler.setFormatter(logging.Formatter("%(asctime)s - %(message)s"))
39
+ log.addHandler(file_handler)
40
+
41
+
42
+ def init_log(log: logging.Logger, app: Flask):
43
+ """Initializes the log file in the proper format."""
44
+
45
+ current_log_level = log.getEffectiveLevel()
46
+ coloredlogs.install(level="DEBUG" if app.debug else current_log_level)
47
+
48
+ if USERS_LOGGER_PATH_PARAM in app.config:
49
+ set_activity_log(log=log, app=app)
@@ -58,6 +58,7 @@ CASE_FILE_PATH_CHECKS = [
58
58
  "RNAfusion_inspector_research",
59
59
  "RNAfusion_report",
60
60
  "RNAfusion_report_research",
61
+ "rna_delivery_report",
61
62
  ]
62
63
 
63
64
  VCF_FILE_PATH_CHECKS = FILE_TYPE_MAP.keys()
@@ -431,6 +432,7 @@ class CaseLoader(BaseModel):
431
432
  RNAfusion_inspector_research: Optional[str] = None
432
433
  RNAfusion_report: Optional[str] = None
433
434
  RNAfusion_report_research: Optional[str] = None
435
+ rna_delivery_report: Optional[str] = None
434
436
  smn_tsv: Optional[str] = None
435
437
  sv_rank_model_version: Optional[str] = None
436
438
  synopsis: Optional[Union[List[str], str]] = None
scout/parse/omim.py CHANGED
@@ -49,7 +49,7 @@ def parse_genemap2_diseases(phenotype_entry, mim_number=None):
49
49
  i = 0
50
50
  splitted_info = phenotype_info.split(",")
51
51
  for i, text in enumerate(splitted_info):
52
- # Everything before ([1,2,3])
52
+ # Everything before ([1,2,3,4])
53
53
  # We check if we are in the part where the mim number exists
54
54
  match = ENTRY_PATTERN.search(text)
55
55
  if not match:
@@ -75,7 +75,7 @@ def parse_genemap2_diseases(phenotype_entry, mim_number=None):
75
75
  {
76
76
  "mim_number": disease_mim,
77
77
  "inheritance": inheritance,
78
- "description": disease_description.strip("?\{\}"),
78
+ "description": disease_description.strip(r"?{}"),
79
79
  "status": disease_status,
80
80
  }
81
81
  )
scout/server/app.py CHANGED
@@ -2,17 +2,19 @@
2
2
 
3
3
  import logging
4
4
  import os
5
+ import re
5
6
  from datetime import timedelta
6
7
  from typing import Dict, Union
7
8
  from urllib.parse import parse_qsl, unquote, urlsplit
8
9
 
9
- import coloredlogs
10
10
  from flask import Flask, redirect, request, url_for
11
11
  from flask_cors import CORS
12
12
  from flask_login import current_user
13
13
  from markdown import markdown as python_markdown
14
14
  from markupsafe import Markup
15
15
 
16
+ from scout.log import init_log
17
+
16
18
  from . import extensions
17
19
  from .blueprints import (
18
20
  alignviewers,
@@ -36,6 +38,8 @@ from .blueprints import (
36
38
 
37
39
  LOG = logging.getLogger(__name__)
38
40
 
41
+ USERS_LOGGER_PATH_PARAM = "USERS_ACTIVITY_LOG_PATH"
42
+
39
43
 
40
44
  def create_app(config_file=None, config=None):
41
45
  """Flask app factory function."""
@@ -60,8 +64,7 @@ def create_app(config_file=None, config=None):
60
64
 
61
65
  app.json.sort_keys = False
62
66
 
63
- current_log_level = LOG.getEffectiveLevel()
64
- coloredlogs.install(level="DEBUG" if app.debug else current_log_level)
67
+ init_log(log=LOG, app=app)
65
68
  configure_extensions(app)
66
69
  register_blueprints(app)
67
70
  register_filters(app)
@@ -83,10 +86,15 @@ def create_app(config_file=None, config=None):
83
86
  relevant_endpoint = not (static_endpoint or public_endpoint)
84
87
  # if endpoint requires auth, check if user is authenticated
85
88
  if relevant_endpoint and not current_user.is_authenticated:
86
- # combine visited URL (convert byte string query string to unicode!)
87
- next_url = "{}?{}".format(request.path, request.query_string.decode())
88
- login_url = url_for("public.index", next=next_url)
89
- return redirect(login_url)
89
+ return redirect(url_for("public.index"))
90
+
91
+ @app.before_request
92
+ def log_users_activity():
93
+ """Log users' navigation to file, if specified in the app setting.s"""
94
+ if USERS_LOGGER_PATH_PARAM not in app.config:
95
+ return
96
+ user = current_user.email if current_user.is_authenticated else "anonymous"
97
+ LOG.info(" - ".join([user, request.path]))
90
98
 
91
99
  return app
92
100
 
@@ -246,6 +254,14 @@ def register_filters(app):
246
254
  return "COSM" + str(cosmicId)
247
255
  return cosmicId
248
256
 
257
+ @app.template_filter()
258
+ def upper_na(string):
259
+ """
260
+ Uppercase ocurences of "dna" and "rna" for nice display.
261
+ """
262
+
263
+ return re.sub(r"[Dd][Nn][Aa]", r"DNA", re.sub(r"[Rr][Nn][Aa]", r"RNA", string))
264
+
249
265
  @app.template_filter()
250
266
  def count_cursor(pymongo_cursor):
251
267
  """Count number of returned documents (deprecated pymongo.cursor.count())"""
@@ -125,7 +125,9 @@ def make_sashimi_tracks(
125
125
  case_obj: dict, variant_id: Optional[str] = None, omics_variant_id: Optional[str] = None
126
126
  ):
127
127
  """Create a dictionary containing the required tracks for a splice junction plot
128
- If either a regular variant_id or an omics variant id is passed, set display to a particular locus.
128
+ If a regular variant_id is passed, set display to a particular gene locus.
129
+ If an omics_variant_id is passed, set display to a window surrounding the variant, which can be a
130
+ gene or an affected region.
129
131
  Otherwise defaults to whole genome "All" view.
130
132
 
131
133
  Returns:
@@ -133,18 +135,16 @@ def make_sashimi_tracks(
133
135
  """
134
136
 
135
137
  locus = "All"
136
- variant_obj = None
137
-
138
- if variant_id:
139
- variant_obj = store.variant(document_id=variant_id)
140
- if omics_variant_id:
141
- variant_obj = store.omics_variant(variant_id=omics_variant_id)
142
138
 
143
139
  build = "38"
144
140
  if "37" in str(case_obj.get("rna_genome_build", "38")):
145
141
  build = "37"
146
142
 
147
- if variant_obj:
143
+ if variant_id:
144
+ variant_obj = store.variant(document_id=variant_id)
145
+ locus = make_locus_from_gene(variant_obj, case_obj, build)
146
+ if omics_variant_id:
147
+ variant_obj = store.omics_variant(variant_id=omics_variant_id)
148
148
  locus = make_locus_from_variant(variant_obj, case_obj, build)
149
149
 
150
150
  display_obj = {"locus": locus, "tracks": []}
@@ -195,17 +195,16 @@ def make_merged_splice_track(ind: dict) -> dict:
195
195
  return track
196
196
 
197
197
 
198
- def make_locus_from_variant(variant_obj: Dict, case_obj: Dict, build: str) -> str:
199
- """Given a variant obj, construct a locus string across any gene touched for IGV to display.
200
-
201
- Initialize locus coordinates with variant coordinates so it won't crash if variant gene(s) no longer exist in database.
198
+ def get_locus_from_variant(variant_obj: Dict, case_obj: Dict, build: str) -> tuple:
199
+ """
202
200
  Check if variant coordinates are in genome build 38, otherwise do variant coords liftover.
203
201
  Use original coordinates only if genome build was already 38 or liftover didn't work.
204
- Collect locus coordinates. Take into account that variant can hit multiple genes.
205
- The returned locus will so span all genes the variant falls into.
202
+ Collect locus coordinates.
206
203
  """
207
- locus_start_coords = []
208
- locus_end_coords = []
204
+ MIN_LOCUS_SIZE_OFFSET = 100
205
+
206
+ locus_start_coord = variant_obj.get("position")
207
+ locus_end_coord = variant_obj.get("end")
209
208
 
210
209
  if build not in str(case_obj.get("genome_build")):
211
210
  client = EnsemblRestApiClient()
@@ -218,13 +217,37 @@ def make_locus_from_variant(variant_obj: Dict, case_obj: Dict, build: str) -> st
218
217
  if mapped_coords:
219
218
  mapped_start = mapped_coords[0]["mapped"].get("start")
220
219
  mapped_end = mapped_coords[0]["mapped"].get("end") or mapped_start
221
- locus_start_coords.append(mapped_start)
222
- locus_end_coords.append(mapped_end)
220
+ locus_start_coord = mapped_start
221
+ locus_end_coord = mapped_end
222
+
223
+ variant_size_offset = (variant_obj.get("end") - variant_obj.get("position")) / 10
224
+ if variant_size_offset < (MIN_LOCUS_SIZE_OFFSET * 2):
225
+ variant_size_offset = MIN_LOCUS_SIZE_OFFSET
226
+ locus_start_coord -= variant_size_offset
227
+ locus_end_coord += variant_size_offset
228
+
229
+ return (variant_obj["chromosome"], locus_start_coord, locus_end_coord)
230
+
231
+
232
+ def make_locus_from_variant(variant_obj: Dict, case_obj: Dict, build: str) -> str:
233
+ """Given a variant obj, construct a locus string across variant plus a percent size offset around the variant."""
234
+
235
+ (chrom, locus_start, locus_end) = get_locus_from_variant(variant_obj, case_obj, build)
236
+ return f"{chrom}:{locus_start}-{locus_end}"
237
+
238
+
239
+ def make_locus_from_gene(variant_obj: Dict, case_obj: Dict, build: str) -> str:
240
+ """Given a variant obj, construct a locus string across any gene touched for IGV to display.
241
+ Initialize locus coordinates with variant coordinates so it won't crash if variant gene(s) no longer exist in database.
242
+ Check if variant coordinates are in genome build 38, otherwise do variant coords liftover.
243
+ Use original coordinates only if genome build was already 38 or liftover didn't work.
244
+ Collect locus coordinates. Take into account that variant can hit multiple genes.
245
+ The returned locus will so span all genes the variant falls into.
246
+ """
223
247
 
224
- if not locus_start_coords:
225
- locus_start_coords.append(variant_obj.get("position"))
226
- if not locus_end_coords:
227
- locus_end_coords.append(variant_obj.get("end"))
248
+ (chrom, locus_start, locus_end) = get_locus_from_variant(variant_obj, case_obj, build)
249
+ locus_start_coords = [locus_start]
250
+ locus_end_coords = [locus_end]
228
251
 
229
252
  variant_genes_ids = [gene["hgnc_id"] for gene in variant_obj.get("genes", [])]
230
253
  for gene_id in variant_genes_ids:
@@ -237,7 +260,7 @@ def make_locus_from_variant(variant_obj: Dict, case_obj: Dict, build: str) -> st
237
260
  locus_start = min(locus_start_coords)
238
261
  locus_end = max(locus_end_coords)
239
262
 
240
- return f"{variant_obj['chromosome']}:{locus_start}-{locus_end}"
263
+ return f"{chrom}:{locus_start}-{locus_end}"
241
264
 
242
265
 
243
266
  def set_tracks(name, file_list):