jbrowse-plugin-graphgenomeviewer 8.8.2 → 9.0.0

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 (194) hide show
  1. package/README.md +6 -6
  2. package/dist/chunks/{AddTrackWorkflow-FANMD3WB.js → AddTrackWorkflow-3PX4I4DX.js} +2 -2
  3. package/dist/chunks/{AddTrackWorkflow-FANMD3WB.js.map → AddTrackWorkflow-3PX4I4DX.js.map} +2 -2
  4. package/dist/chunks/{GbzBaseSyntenyAdapter-NAXISJUH.js → GbzBaseSyntenyAdapter-YUT5RT7G.js} +2 -2
  5. package/dist/chunks/{GbzBaseSyntenyAdapter-NAXISJUH.js.map → GbzBaseSyntenyAdapter-YUT5RT7G.js.map} +2 -2
  6. package/dist/chunks/{GraphGenomeView-PPOVN5LA.js → GraphGenomeView-XFKLX3VQ.js} +2 -2
  7. package/dist/chunks/{GraphTrackSettingsDialog-BRTDTVOJ.js → GraphTrackSettingsDialog-KOYYI2XH.js} +2 -2
  8. package/dist/chunks/{HighlightColorDialog-CGW7J3SK.js → HighlightColorDialog-F4IARMEO.js} +2 -2
  9. package/dist/chunks/LinearGraphDisplay-BZ44C6S3.js +2 -0
  10. package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js +2 -0
  11. package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js.map +7 -0
  12. package/dist/chunks/RgfaTabixAdapter-7QKNUHKX.js +2 -0
  13. package/dist/chunks/RgfaTabixAdapter-7QKNUHKX.js.map +7 -0
  14. package/dist/chunks/{TrackWarningsDialog-23WL6FPV.js → TrackWarningsDialog-V5YSUFRO.js} +1 -1
  15. package/dist/chunks/{TrackWarningsDialog-23WL6FPV.js.map → TrackWarningsDialog-V5YSUFRO.js.map} +1 -1
  16. package/dist/chunks/WalkFormsAdapter-5NDOULY6.js +2 -0
  17. package/dist/chunks/WalkFormsAdapter-5NDOULY6.js.map +7 -0
  18. package/dist/chunks/WalkTabixSyntenyAdapter-KI7ESKKP.js +2 -0
  19. package/dist/chunks/WalkTabixSyntenyAdapter-KI7ESKKP.js.map +7 -0
  20. package/dist/chunks/{chunk-RS274NAD.js → chunk-3HSJ7SAT.js} +2 -2
  21. package/dist/chunks/{chunk-RS274NAD.js.map → chunk-3HSJ7SAT.js.map} +1 -1
  22. package/dist/chunks/chunk-42VF2CSA.js +4 -0
  23. package/dist/chunks/chunk-42VF2CSA.js.map +7 -0
  24. package/dist/chunks/{chunk-LFQFVYNY.js → chunk-47UWMS4O.js} +3 -3
  25. package/dist/chunks/chunk-47UWMS4O.js.map +7 -0
  26. package/dist/chunks/{chunk-MWQGJP3J.js → chunk-7PVPO366.js} +2 -2
  27. package/dist/chunks/{chunk-MWQGJP3J.js.map → chunk-7PVPO366.js.map} +1 -1
  28. package/dist/chunks/{chunk-SKB4GSET.js → chunk-AQSLN3RH.js} +2 -2
  29. package/dist/chunks/{chunk-SKB4GSET.js.map → chunk-AQSLN3RH.js.map} +1 -1
  30. package/dist/chunks/chunk-AXUXLPO3.js +6 -0
  31. package/dist/chunks/chunk-AXUXLPO3.js.map +7 -0
  32. package/dist/chunks/chunk-CJ4VON23.js +2 -0
  33. package/dist/chunks/chunk-CJ4VON23.js.map +7 -0
  34. package/dist/chunks/{chunk-AGUEPVOR.js → chunk-FQI75MV6.js} +1 -1
  35. package/dist/chunks/{chunk-AGUEPVOR.js.map → chunk-FQI75MV6.js.map} +1 -1
  36. package/dist/chunks/{chunk-FM4T47WH.js → chunk-HFBUC6GF.js} +2 -2
  37. package/dist/chunks/{chunk-FM4T47WH.js.map → chunk-HFBUC6GF.js.map} +1 -1
  38. package/dist/chunks/chunk-I2XBA4H7.js +9 -0
  39. package/dist/chunks/{chunk-EFXNCI7R.js.map → chunk-I2XBA4H7.js.map} +4 -4
  40. package/dist/chunks/chunk-KIURR66K.js +3 -0
  41. package/dist/chunks/chunk-KIURR66K.js.map +7 -0
  42. package/dist/chunks/{chunk-CHLLRNBQ.js → chunk-LQSOJR7D.js} +2 -2
  43. package/dist/chunks/{chunk-CHLLRNBQ.js.map → chunk-LQSOJR7D.js.map} +1 -1
  44. package/dist/chunks/chunk-M6YSANSW.js +2 -0
  45. package/dist/chunks/chunk-M6YSANSW.js.map +7 -0
  46. package/dist/chunks/{chunk-ZWHXVFZF.js → chunk-MPUAUZSJ.js} +1 -1
  47. package/dist/chunks/{chunk-ZWHXVFZF.js.map → chunk-MPUAUZSJ.js.map} +1 -1
  48. package/dist/chunks/{chunk-5HDIVUAZ.js → chunk-N4ZFGZDN.js} +2 -2
  49. package/dist/chunks/{chunk-5HDIVUAZ.js.map → chunk-N4ZFGZDN.js.map} +1 -1
  50. package/dist/chunks/{chunk-KBOVZ3GI.js → chunk-OSEQDKL3.js} +1 -1
  51. package/dist/chunks/{chunk-KBOVZ3GI.js.map → chunk-OSEQDKL3.js.map} +1 -1
  52. package/dist/chunks/{chunk-NSQ4VXKR.js → chunk-P76SUZFP.js} +3 -3
  53. package/dist/chunks/{chunk-NSQ4VXKR.js.map → chunk-P76SUZFP.js.map} +3 -3
  54. package/dist/chunks/{chunk-HKGTCZOL.js → chunk-R34FRICP.js} +4 -4
  55. package/dist/chunks/{chunk-HKGTCZOL.js.map → chunk-R34FRICP.js.map} +2 -2
  56. package/dist/chunks/chunk-SXMUGZXP.js +2 -0
  57. package/dist/chunks/chunk-SXMUGZXP.js.map +7 -0
  58. package/dist/chunks/chunk-T7NMFIRW.js +2 -0
  59. package/dist/chunks/chunk-T7NMFIRW.js.map +7 -0
  60. package/dist/chunks/chunk-TLUGH4VW.js +2 -0
  61. package/dist/chunks/{chunk-LKD5NRWR.js → chunk-VAWAASUT.js} +1 -1
  62. package/dist/chunks/{chunk-LKD5NRWR.js.map → chunk-VAWAASUT.js.map} +1 -1
  63. package/dist/chunks/chunk-Y4TLRGAC.js +2 -0
  64. package/dist/chunks/{chunk-EEWEXRY6.js.map → chunk-Y4TLRGAC.js.map} +3 -3
  65. package/dist/chunks/chunk-ZXJRZKWF.js +2 -0
  66. package/dist/chunks/chunk-ZXJRZKWF.js.map +7 -0
  67. package/dist/chunks/{executeDiagonalize-HZFFXMG4.js → executeDiagonalize-ZMW5BLEJ.js} +2 -2
  68. package/dist/chunks/{executeDiagonalize-HZFFXMG4.js.map → executeDiagonalize-ZMW5BLEJ.js.map} +1 -1
  69. package/dist/chunks/{renderSvg-UKXPWKKV.js → renderSvg-DLJTA2B3.js} +2 -2
  70. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
  71. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  72. package/package.json +12 -12
  73. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +4 -7
  74. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +1 -1
  75. package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +9 -6
  76. package/src/GraphGenomeView/model.test.ts +21 -8
  77. package/src/GraphGenomeView/pane/loadActions.ts +7 -2
  78. package/src/GraphGenomeView/pane/walkRowViews.ts +1 -1
  79. package/src/GraphGenomeView/walkRowGroups.test.ts +14 -3
  80. package/src/GraphGenomeView/walkRowGroups.ts +0 -22
  81. package/src/GraphGenomeView/walkRowsCut.ts +1 -0
  82. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +5 -2
  83. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +1 -1
  84. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +16 -16
  85. package/src/RgfaTabixAdapter/configSchema.ts +16 -12
  86. package/src/RgfaTabixAdapter/test_data/walks7/build.sh +27 -0
  87. package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.gfa +35 -0
  88. package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.walks.gz +0 -0
  89. package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.walks.gz.idx +3 -0
  90. package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.gfa +22 -0
  91. package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.walks.gz +0 -0
  92. package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.walks.gz.idx +3 -0
  93. package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.gfa +15 -0
  94. package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.walks.gz +0 -0
  95. package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.walks.gz.idx +3 -0
  96. package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.gfa +19 -0
  97. package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.walks.gz +0 -0
  98. package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.walks.gz.idx +3 -0
  99. package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.gfa +11 -0
  100. package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.walks.gz +0 -0
  101. package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.walks.gz.idx +3 -0
  102. package/src/RgfaTabixAdapter/test_data/walks7/rejoin.GRCh38.walks.gz +0 -0
  103. package/src/RgfaTabixAdapter/test_data/walks7/rejoin.GRCh38.walks.gz.idx +3 -0
  104. package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.gfa +23 -0
  105. package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.walks.gz +0 -0
  106. package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.walks.gz.idx +3 -0
  107. package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.gfa +50 -0
  108. package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.walks.gz +0 -0
  109. package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.walks.gz.idx +3 -0
  110. package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.gfa +45 -0
  111. package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.walks.gz +0 -0
  112. package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.walks.gz.idx +3 -0
  113. package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.gfa +22 -0
  114. package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.walks.gz +0 -0
  115. package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.walks.gz.idx +3 -0
  116. package/src/RgfaTabixAdapter/walkFiles.test.ts +131 -119
  117. package/src/RgfaTabixAdapter/walkReader.ts +36 -49
  118. package/src/WalkFormsAdapter/WalkFormsAdapter.test.ts +7 -28
  119. package/src/WalkFormsAdapter/WalkFormsAdapter.ts +4 -29
  120. package/src/WalkFormsAdapter/configSchema.ts +13 -13
  121. package/src/WalkFormsAdapter/formRows.test.ts +0 -7
  122. package/src/WalkFormsAdapter/formRows.ts +0 -12
  123. package/src/WalkFormsAdapter/formsMenu.test.ts +1 -1
  124. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +54 -96
  125. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +56 -152
  126. package/src/WalkTabixSyntenyAdapter/configSchema.ts +15 -16
  127. package/src/WalkTabixSyntenyAdapter/gbzParity.test.ts +5 -6
  128. package/src/WalkTabixSyntenyAdapter/walkLanes.ts +48 -142
  129. package/src/graphTrackConfig.test.ts +1 -1
  130. package/src/graphTrackDefaults/graphTrackDefaults.test.ts +7 -10
  131. package/src/launchFromGraph/syntenyTracks.test.ts +1 -1
  132. package/src/locationName.ts +2 -2
  133. package/src/panSNAliases/panSNAliases.test.ts +4 -6
  134. package/src/panSNTabix.test.ts +3 -23
  135. package/src/panSNTabix.ts +58 -34
  136. package/src/synteny/laneZoomNotice.test.ts +1 -0
  137. package/src/version.ts +1 -1
  138. package/dist/chunks/LinearGraphDisplay-2AZ7X7TK.js +0 -2
  139. package/dist/chunks/MinigraphBubbleAdapter-NR3MMUUG.js +0 -2
  140. package/dist/chunks/MinigraphBubbleAdapter-NR3MMUUG.js.map +0 -7
  141. package/dist/chunks/RgfaTabixAdapter-JDQLVQVP.js +0 -2
  142. package/dist/chunks/RgfaTabixAdapter-JDQLVQVP.js.map +0 -7
  143. package/dist/chunks/WalkFormsAdapter-YMQC3NLG.js +0 -2
  144. package/dist/chunks/WalkFormsAdapter-YMQC3NLG.js.map +0 -7
  145. package/dist/chunks/WalkTabixSyntenyAdapter-PBWN53PE.js +0 -2
  146. package/dist/chunks/WalkTabixSyntenyAdapter-PBWN53PE.js.map +0 -7
  147. package/dist/chunks/chunk-6VNDP3UB.js +0 -2
  148. package/dist/chunks/chunk-6VNDP3UB.js.map +0 -7
  149. package/dist/chunks/chunk-A27SW7X7.js +0 -2
  150. package/dist/chunks/chunk-A27SW7X7.js.map +0 -7
  151. package/dist/chunks/chunk-APSXG7SV.js +0 -2
  152. package/dist/chunks/chunk-DEWVJ57F.js +0 -4
  153. package/dist/chunks/chunk-DEWVJ57F.js.map +0 -7
  154. package/dist/chunks/chunk-EEWEXRY6.js +0 -2
  155. package/dist/chunks/chunk-EFXNCI7R.js +0 -9
  156. package/dist/chunks/chunk-EH5OCKSE.js +0 -3
  157. package/dist/chunks/chunk-EH5OCKSE.js.map +0 -7
  158. package/dist/chunks/chunk-GLSUAMGV.js +0 -3
  159. package/dist/chunks/chunk-GLSUAMGV.js.map +0 -7
  160. package/dist/chunks/chunk-LFQFVYNY.js.map +0 -7
  161. package/dist/chunks/chunk-QUDJ7AM3.js +0 -2
  162. package/dist/chunks/chunk-QUDJ7AM3.js.map +0 -7
  163. package/dist/chunks/chunk-T7LVVBTT.js +0 -2
  164. package/dist/chunks/chunk-T7LVVBTT.js.map +0 -7
  165. package/dist/chunks/chunk-ZBFIEBO6.js +0 -2
  166. package/dist/chunks/chunk-ZBFIEBO6.js.map +0 -7
  167. package/src/RgfaTabixAdapter/test_data/walks1_header.GRCh38.walks.bed.gz +0 -0
  168. package/src/RgfaTabixAdapter/test_data/walks1_header.GRCh38.walks.bed.gz.tbi +0 -0
  169. package/src/RgfaTabixAdapter/test_data/walks5_follow.GRCh38.walks.bed.gz +0 -0
  170. package/src/RgfaTabixAdapter/test_data/walks5_follow.GRCh38.walks.bed.gz.tbi +0 -0
  171. package/src/RgfaTabixAdapter/test_data/walks5_header.GRCh38.walks.bed.gz +0 -0
  172. package/src/RgfaTabixAdapter/test_data/walks5_header.GRCh38.walks.bed.gz.tbi +0 -0
  173. package/src/RgfaTabixAdapter/test_data/walks5_inversion.GRCh38.walks.bed.gz +0 -0
  174. package/src/RgfaTabixAdapter/test_data/walks5_inversion.GRCh38.walks.bed.gz.tbi +0 -0
  175. package/src/RgfaTabixAdapter/test_data/walks5_lanepairs.GRCh38.walks.bed.gz +0 -0
  176. package/src/RgfaTabixAdapter/test_data/walks5_lanepairs.GRCh38.walks.bed.gz.tbi +0 -0
  177. package/src/RgfaTabixAdapter/test_data/walks5_maxnode.GRCh38.walks.bed.gz +0 -0
  178. package/src/RgfaTabixAdapter/test_data/walks5_maxnode.GRCh38.walks.bed.gz.tbi +0 -0
  179. package/src/RgfaTabixAdapter/test_data/walks5_rejoin.GRCh38.walks.bed.gz +0 -0
  180. package/src/RgfaTabixAdapter/test_data/walks5_rejoin.GRCh38.walks.bed.gz.tbi +0 -0
  181. package/src/RgfaTabixAdapter/test_data/walks5_skip.GRCh38.walks.bed.gz +0 -0
  182. package/src/RgfaTabixAdapter/test_data/walks5_skip.GRCh38.walks.bed.gz.tbi +0 -0
  183. package/src/RgfaTabixAdapter/test_data/walks5_skipfollow.GRCh38.walks.bed.gz +0 -0
  184. package/src/RgfaTabixAdapter/test_data/walks5_skipfollow.GRCh38.walks.bed.gz.tbi +0 -0
  185. package/src/RgfaTabixAdapter/test_data/walks5_skipinv.GRCh38.walks.bed.gz +0 -0
  186. package/src/RgfaTabixAdapter/test_data/walks5_skipinv.GRCh38.walks.bed.gz.tbi +0 -0
  187. package/src/RgfaTabixAdapter/test_data/walks5_twopart.GRCh38.walks.bed.gz +0 -0
  188. package/src/RgfaTabixAdapter/test_data/walks5_twopart.GRCh38.walks.bed.gz.tbi +0 -0
  189. /package/dist/chunks/{GraphGenomeView-PPOVN5LA.js.map → GraphGenomeView-XFKLX3VQ.js.map} +0 -0
  190. /package/dist/chunks/{GraphTrackSettingsDialog-BRTDTVOJ.js.map → GraphTrackSettingsDialog-KOYYI2XH.js.map} +0 -0
  191. /package/dist/chunks/{HighlightColorDialog-CGW7J3SK.js.map → HighlightColorDialog-F4IARMEO.js.map} +0 -0
  192. /package/dist/chunks/{LinearGraphDisplay-2AZ7X7TK.js.map → LinearGraphDisplay-BZ44C6S3.js.map} +0 -0
  193. /package/dist/chunks/{chunk-APSXG7SV.js.map → chunk-TLUGH4VW.js.map} +0 -0
  194. /package/dist/chunks/{renderSvg-UKXPWKKV.js.map → renderSvg-DLJTA2B3.js.map} +0 -0
@@ -0,0 +1,23 @@
1
+ H VN:Z:1.1
2
+ S 1 * LN:i:10
3
+ S 2 * LN:i:10
4
+ S 3 * LN:i:10
5
+ S 4 * LN:i:10
6
+ S 5 * LN:i:10
7
+ S 6 * LN:i:10
8
+ S 7 * LN:i:10
9
+ S 8 * LN:i:10
10
+ S 9 * LN:i:10
11
+ S 10 * LN:i:10
12
+ L 1 + 2 + 0M
13
+ L 2 + 3 + 0M
14
+ L 2 + 9 + 0M
15
+ L 3 + 4 + 0M
16
+ L 4 + 5 + 0M
17
+ L 5 + 6 + 0M
18
+ L 6 + 7 + 0M
19
+ L 7 + 8 + 0M
20
+ L 8 + 9 + 0M
21
+ L 9 + 10 + 0M
22
+ W GRCh38 0 chr1 0 100 >1>2>3>4>5>6>7>8>9>10
23
+ W HG002 1 ctg 0 40 >1>2>9>10
@@ -0,0 +1,3 @@
1
+ #walks format:i:7 tile:i:10 revisited:i:0 stay:i:311 abridge:i:1000000 abridgebytes:i:3000000 bytes:i:2152
2
+ #header 0 133
3
+ GRCh38#0#chr1 1871 253
@@ -0,0 +1,50 @@
1
+ H VN:Z:1.1
2
+ S 1 * LN:i:1000
3
+ S 2 * LN:i:1000
4
+ S 3 * LN:i:1000
5
+ S 4 * LN:i:1000
6
+ S 5 * LN:i:1000
7
+ S 6 * LN:i:1000
8
+ S 7 * LN:i:1000
9
+ S 8 * LN:i:1000
10
+ S 9 * LN:i:1000
11
+ S 10 * LN:i:1000
12
+ S 11 * LN:i:1000
13
+ S 12 * LN:i:1000
14
+ S 13 * LN:i:1000
15
+ S 14 * LN:i:1000
16
+ S 15 * LN:i:1000
17
+ S 16 * LN:i:1000
18
+ S 17 * LN:i:1000
19
+ S 18 * LN:i:1000
20
+ S 19 * LN:i:1000
21
+ S 20 * LN:i:1000
22
+ S 99 * LN:i:500
23
+ L 1 + 2 + 0M
24
+ L 10 + 11 + 0M
25
+ L 11 + 12 + 0M
26
+ L 12 + 13 + 0M
27
+ L 13 + 14 + 0M
28
+ L 14 + 15 + 0M
29
+ L 15 + 16 + 0M
30
+ L 16 + 17 + 0M
31
+ L 17 + 18 + 0M
32
+ L 18 + 19 + 0M
33
+ L 19 + 20 + 0M
34
+ L 2 + 3 + 0M
35
+ L 2 + 6 + 0M
36
+ L 2 + 99 + 0M
37
+ L 3 + 4 + 0M
38
+ L 4 + 5 + 0M
39
+ L 5 + 6 + 0M
40
+ L 6 + 7 + 0M
41
+ L 6 - 99 - 0M
42
+ L 7 + 8 + 0M
43
+ L 8 + 9 + 0M
44
+ L 9 + 10 + 0M
45
+ W GRCh38 0 chr1 0 20000 >1>2>3>4>5>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
46
+ W HG002 1 ctg 0 17000 >1>2>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
47
+ W HG003 1 ctg 0 20000 >1>2>3>4>5>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
48
+ W HG004 1 ctg 0 17000 <20<19<18<17<16<15<14<13<12<11<10<9<8<7<6<2<1
49
+ W HG005 1 ctg 0 17500 >1>2>99>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
50
+ W HG007 1 ctg 100000 117000 >1>2>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
@@ -0,0 +1,3 @@
1
+ #walks format:i:7 tile:i:1000 revisited:i:0 stay:i:311 abridge:i:1000000 abridgebytes:i:3000000 bytes:i:4089
2
+ #header 0 146
3
+ GRCh38#0#chr1 3709 352
@@ -0,0 +1,45 @@
1
+ H VN:Z:1.1
2
+ S 1 * LN:i:1000
3
+ S 2 * LN:i:1000
4
+ S 3 * LN:i:1000
5
+ S 4 * LN:i:1000
6
+ S 5 * LN:i:1000
7
+ S 6 * LN:i:1000
8
+ S 7 * LN:i:1000
9
+ S 8 * LN:i:1000
10
+ S 9 * LN:i:1000
11
+ S 10 * LN:i:1000
12
+ S 11 * LN:i:1000
13
+ S 12 * LN:i:1000
14
+ S 13 * LN:i:1000
15
+ S 14 * LN:i:1000
16
+ S 15 * LN:i:1000
17
+ S 16 * LN:i:1000
18
+ S 17 * LN:i:1000
19
+ S 18 * LN:i:1000
20
+ S 19 * LN:i:1000
21
+ S 20 * LN:i:1000
22
+ L 1 + 2 + 0M
23
+ L 1 + 2 - 0M
24
+ L 10 + 11 + 0M
25
+ L 11 + 12 + 0M
26
+ L 12 + 13 + 0M
27
+ L 13 + 14 + 0M
28
+ L 14 + 15 + 0M
29
+ L 15 + 16 + 0M
30
+ L 16 + 17 + 0M
31
+ L 17 + 18 + 0M
32
+ L 18 + 19 + 0M
33
+ L 19 + 20 + 0M
34
+ L 2 + 3 + 0M
35
+ L 2 - 6 + 0M
36
+ L 3 + 4 + 0M
37
+ L 4 + 5 + 0M
38
+ L 5 + 6 + 0M
39
+ L 6 + 7 + 0M
40
+ L 7 + 8 + 0M
41
+ L 8 + 9 + 0M
42
+ L 9 + 10 + 0M
43
+ W GRCh38 0 chr1 0 20000 >1>2>3>4>5>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
44
+ W HG003 1 ctg 0 20000 >1>2>3>4>5>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
45
+ W HG008 1 ctg 0 17000 >1<2>6>7>8>9>10>11>12>13>14>15>16>17>18>19>20
@@ -0,0 +1,3 @@
1
+ #walks format:i:7 tile:i:1000 revisited:i:0 stay:i:311 abridge:i:1000000 abridgebytes:i:3000000 bytes:i:3428
2
+ #header 0 138
3
+ GRCh38#0#chr1 3049 351
@@ -0,0 +1,22 @@
1
+ H VN:Z:1.1
2
+ S 1 * LN:i:600
3
+ S 2 * LN:i:600
4
+ S 3 * LN:i:600
5
+ S 4 * LN:i:600
6
+ S 5 * LN:i:600
7
+ S 6 * LN:i:600
8
+ S 7 * LN:i:550
9
+ S 8 * LN:i:20
10
+ L 1 + 2 + 0M
11
+ L 2 + 3 + 0M
12
+ L 2 + 7 + 0M
13
+ L 3 + 4 + 0M
14
+ L 4 + 5 + 0M
15
+ L 4 + 8 + 0M
16
+ L 4 - 7 - 0M
17
+ L 5 + 6 + 0M
18
+ L 6 - 8 - 0M
19
+ P GRCh38#chr1 1+,2+,3+,4+,5+,6+ *
20
+ W HG00097 1 chr1 0 3600 >1>2>3>4>5>6
21
+ W HG002 1 chr1 0 3550 >1>2>7>4>5>6
22
+ W HG002 2 chr1 0 3020 >1>2>3>4>8>6
@@ -0,0 +1,3 @@
1
+ #walks format:i:7 tile:i:1000 revisited:i:0 stay:i:311 abridge:i:1000000 abridgebytes:i:3000000 bytes:i:1363
2
+ #header 0 141
3
+ GRCh38#chr1 1151 184
@@ -1,13 +1,12 @@
1
1
  import { existsSync } from 'node:fs'
2
2
 
3
- import { TabixIndexedFile } from '@gmod/tabix'
4
3
  import {
5
4
  graphFromTables,
6
5
  graphTablesGFA,
7
6
  } from '@jbrowse/bandage-core/gfa/graphTables'
8
7
  import { walkRowsOf } from '@jbrowse/bandage-core/layout/walkRowRuns'
9
8
  import { readConfObject } from '@jbrowse/core/configuration'
10
- import { WalkReader } from '@jbrowse/graph-walks'
9
+ import { WalkFile, WalkReader } from '@jbrowse/graph-walks'
11
10
  import { firstValueFrom } from 'rxjs'
12
11
  import { toArray } from 'rxjs/operators'
13
12
 
@@ -19,54 +18,57 @@ import type { WalkCut } from './walkCut.ts'
19
18
  import type { GraphTables } from '@jbrowse/bandage-core/gfa/graphTables'
20
19
 
21
20
  // chr22 of HPRC v2.1 at base level, one walk file per reference in walk
22
- // format 5, built under ~/work/scratch/walks-20261008/f5. Skipped where the
23
- // files are absent.
24
- const chr22 = '/home/cdiesh/work/scratch/walks-20261008/f5/chr22'
21
+ // format 7, built under ~/work/scratch/walks7. Skipped where the files are
22
+ // absent.
23
+ const chr22 = '/home/cdiesh/work/scratch/walks7/chr22'
25
24
  const present = ['GRCh38', 'CHM13'].every(sample =>
26
- existsSync(`${chr22}.${sample}.walks.bed.gz`),
25
+ existsSync(`${chr22}.${sample}.walks.gz`),
27
26
  )
28
27
 
28
+ // The walk files under test_data/walks7, which its build.sh writes from the
29
+ // GFAs beside them
29
30
  const fixture = (name: string) =>
30
31
  require
31
- .resolve(`./test_data/${name}.GRCh38.walks.bed.gz`)
32
- .replace(/\.walks\.bed\.gz$/, '')
32
+ .resolve(`./test_data/walks7/${name}.GRCh38.walks.gz`)
33
+ .replace(/\.walks\.gz$/, '')
33
34
 
34
- // Four walks over a 3.6 kb reference in 1 kb chunks:
35
+ // Four walks over a 3.6 kb reference in 1 kb tiles:
35
36
  // W GRCh38 0 chr1 >1>2>3>4>5>6
36
37
  // W HG002 1 chr1 >1>2>7>4>5>6 7 replaces 3
37
38
  // W HG002 2 chr1 >1>2>3>4>8>6 8 replaces 5
38
39
  // W HG00097 1 chr1 >1>2>3>4>5>6
39
- const headerPrefix = fixture('walks5_header')
40
+ const headerPrefix = fixture('header')
40
41
 
41
- // walks5_header's walks with the reference named as pggb names a P-line,
42
+ // header's walks with the reference named as pggb names a P-line,
42
43
  // GRCh38#chr1
43
- const twoPartPrefix = fixture('walks5_twopart')
44
+ const twoPartPrefix = fixture('twopart')
44
45
 
45
- // An unchopped graph, node 1 spanning 0-2600 and filed under chunk 0 alone:
46
+ // An unchopped graph, node 1 spanning 0-2600, longer than its 1 kb tile:
46
47
  // W GRCh38 0 chr1 >1>2>4
47
48
  // W HG002 1 chr1 >1>3>4 3 replaces 2
48
- const maxNodePrefix = fixture('walks5_maxnode')
49
+ const maxNodePrefix = fixture('maxnode')
49
50
 
50
- // Twelve 500 bp reference nodes over chr1:0-6000 in one 10 kb chunk:
51
+ // Twelve 500 bp reference nodes over chr1:0-6000 in one 10 kb tile:
51
52
  // W GRCh38 0 chr1 >1>2>3>4>5>6>7>8>9>10>11>12
52
53
  // W HG002 1 chr1 >1>2>3>20>21>9>10>11>12 20 and 21, 2 kb each, replace 4-8
53
54
  // W HG002 2 chr1 >1>2>3>4>5>6>7>8>9>10>11>12
54
55
  // W HG003 1 chr1 >1>2>3>22 the contig ends on 22, 300 bp
55
- const rejoinPrefix = fixture('walks5_rejoin')
56
+ const rejoinPrefix = fixture('rejoin')
56
57
 
57
- // The same graph in 1 kb chunks, whose rows name the chunks their path goes on
58
- // in: HG002#1 leaves chunk 1000 for 20 and 21 and rejoins at 9, in chunk 4000
59
- const followPrefix = fixture('walks5_follow')
58
+ // The same graph in 1 kb tiles: HG002#1 leaves tile 1000 at 1500 for 20 and
59
+ // 21 and rejoins at 4000, in tile 4000
60
+ const followPrefix = fixture('follow')
61
+
62
+ const local = (path: string) => ({
63
+ localPath: path,
64
+ locationType: 'LocalPathLocation',
65
+ })
60
66
 
61
67
  function makeAdapter(prefix: string, slots = {}) {
62
- const local = (path: string) => ({
63
- localPath: path,
64
- locationType: 'LocalPathLocation',
65
- })
66
68
  return new Adapter(
67
69
  configSchema.create({
68
- walksLocation: local(`${prefix}.walks.bed.gz`),
69
- walksIndex: { location: local(`${prefix}.walks.bed.gz.tbi`) },
70
+ walksLocation: local(`${prefix}.walks.gz`),
71
+ walksIndex: local(`${prefix}.walks.gz.idx`),
70
72
  assemblyNameToPanSN: { hg38: 'GRCh38', hs1: 'CHM13' },
71
73
  ...slots,
72
74
  }),
@@ -156,7 +158,7 @@ test.skipIf(!present)(
156
158
  )
157
159
 
158
160
  test.skipIf(!present)(
159
- 'the densest chunk is past the step budget for every haplotype',
161
+ 'the densest tile is past the step budget for every haplotype',
160
162
  async () => {
161
163
  const cut = makeAdapter(`${chr22}.GRCh38`, {
162
164
  walkByteBudget: 100_000_000,
@@ -174,17 +176,18 @@ test.skipIf(!present)(
174
176
  60_000,
175
177
  )
176
178
 
177
- test('walksUri names the walk file and its index', () => {
179
+ test('walksUri names the walk file and its directory', () => {
178
180
  const config = configSchema.create({
179
181
  walksUri: 'hprc.GRCh38',
180
182
  baseUri: 'https://example.com/',
181
183
  })
182
184
  expect(readConfObject(config, 'walksLocation')).toMatchObject({
183
- uri: 'hprc.GRCh38.walks.bed.gz',
185
+ uri: 'hprc.GRCh38.walks.gz',
184
186
  baseUri: 'https://example.com/',
185
187
  })
186
- expect(readConfObject(config, ['walksIndex', 'location'])).toMatchObject({
187
- uri: 'hprc.GRCh38.walks.bed.gz.tbi',
188
+ expect(readConfObject(config, 'walksIndex')).toMatchObject({
189
+ uri: 'hprc.GRCh38.walks.gz.idx',
190
+ baseUri: 'https://example.com/',
188
191
  })
189
192
  })
190
193
 
@@ -203,6 +206,20 @@ test("the haplotypes a walk file's header names", async () => {
203
206
  expect(gfa).not.toMatch(/^S\t8\t/m)
204
207
  })
205
208
 
209
+ test('an unset walksIndex reads the directory beside the walk file', async () => {
210
+ const adapter = new Adapter(
211
+ configSchema.create({
212
+ walksLocation: local(`${headerPrefix}.walks.gz`),
213
+ assemblyNameToPanSN: { hg38: 'GRCh38' },
214
+ }),
215
+ )
216
+ expect(await adapter.getHaplotypeNames()).toEqual([
217
+ 'HG00097#1',
218
+ 'HG002#1',
219
+ 'HG002#2',
220
+ ])
221
+ })
222
+
206
223
  test('a cut asked to expand walks hands the reader their names', async () => {
207
224
  const cut = vi.spyOn(WalkReader.prototype, 'cut')
208
225
  await makeAdapter(headerPrefix).getSubgraph(chr1(1000, 2600), {
@@ -275,13 +292,8 @@ test('a cut for some haplotypes keeps a reference walk named without a haplotype
275
292
  ])
276
293
  })
277
294
 
278
- test('a format 1 walk file is refused, with what to rebuild it with', async () => {
279
- const cut = makeAdapter(fixture('walks1_header')).getSubgraph(chr1(0, 600))
280
- await expect(cut).rejects.toThrow(/rebuild it with gfa-to-tabix 1.4/)
281
- })
282
-
283
- test('a cut over walkByteBudget reads no row', async () => {
284
- const getLines = vi.spyOn(TabixIndexedFile.prototype, 'getLines')
295
+ test('a cut over walkByteBudget reads no unit', async () => {
296
+ const read = vi.spyOn(WalkFile.prototype, 'read')
285
297
  const cut = makeAdapter(headerPrefix, { walkByteBudget: 100 }).getSubgraph(
286
298
  chr1(1000, 2600),
287
299
  )
@@ -289,19 +301,13 @@ test('a cut over walkByteBudget reads no row', async () => {
289
301
  name: 'NodeLimitError',
290
302
  message: expect.stringMatching(/walkByteBudget/),
291
303
  })
292
- expect(getLines).not.toHaveBeenCalled()
293
- getLines.mockRestore()
304
+ expect(read).not.toHaveBeenCalled()
305
+ read.mockRestore()
294
306
  })
295
307
 
296
- // tabix-js's getLines spins forever on a NaN end, so these mock it: a
297
- // regression fails here instead of hanging the suite
298
- test('a cut or a feature read over a range that is not finite queries nothing', async () => {
299
- const getLines = vi
300
- .spyOn(TabixIndexedFile.prototype, 'getLines')
301
- .mockResolvedValue()
302
- const bytes = vi
303
- .spyOn(TabixIndexedFile.prototype, 'bytesForRegions')
304
- .mockResolvedValue(0)
308
+ test('a cut or a feature read over a range that is not finite reads nothing', async () => {
309
+ const read = vi.spyOn(WalkFile.prototype, 'read')
310
+ const bytesFor = vi.spyOn(WalkReader.prototype, 'bytesFor')
305
311
  const adapter = makeAdapter(headerPrefix)
306
312
  const region = chr1(Number.NaN, 2600)
307
313
  await expect(adapter.getSubgraph(region)).rejects.toThrow(
@@ -313,19 +319,19 @@ test('a cut or a feature read over a range that is not finite queries nothing',
313
319
  await expect(adapter.getRegionByteSize([region])).rejects.toThrow(
314
320
  /not a finite range/,
315
321
  )
316
- expect(getLines).not.toHaveBeenCalled()
317
- expect(bytes).not.toHaveBeenCalled()
318
- getLines.mockRestore()
319
- bytes.mockRestore()
322
+ expect(read).not.toHaveBeenCalled()
323
+ expect(bytesFor).not.toHaveBeenCalled()
324
+ read.mockRestore()
325
+ bytesFor.mockRestore()
320
326
  })
321
327
 
322
- test("a node longer than a chunk is read back as far as the header's maxnode reaches", async () => {
328
+ test('a node longer than a tile is read from the tile its extent names', async () => {
323
329
  const adapter = makeAdapter(maxNodePrefix)
324
330
  const region = chr1(2100, 2500)
325
331
  const features = await firstValueFrom(
326
332
  adapter.getFeatures(region).pipe(toArray()),
327
333
  )
328
- expect(features.map(f => f.get('name'))).toContain('1')
334
+ expect(features.map(f => f.get('name'))).toEqual(['1'])
329
335
  const gfa = await gfaOf(adapter.getSubgraph(region))
330
336
  expect(gfa).toMatch(/^S\t1\t/m)
331
337
  expect(gfa).toMatch(/^W\tGRCh38\t0\tchr1\t0\t3800\t>1>2>4(\t|$)/m)
@@ -339,99 +345,105 @@ test("a walk-indexed graph's features are the reference nodes overlapping the wi
339
345
  expect(features.map(f => f.get('name'))).toEqual(['2', '3', '4'])
340
346
  })
341
347
 
342
- test('the byte gate measures a walk file from the chunk before the window', async () => {
343
- const bytes = vi.spyOn(TabixIndexedFile.prototype, 'bytesForRegions')
348
+ test('the byte gate measures the bytes a cut of the window reads', async () => {
349
+ const bytesFor = vi.spyOn(WalkReader.prototype, 'bytesFor')
344
350
  const size = await makeAdapter(headerPrefix).getRegionByteSize([
345
351
  chr1(2100, 2600),
346
352
  ])
347
353
  expect(size).toBeGreaterThan(0)
348
- expect(bytes.mock.calls.map(call => call[0])).toEqual([
349
- [{ refName: 'GRCh38#0#chr1', start: 1000, end: 2600 }],
354
+ expect(bytesFor.mock.calls.map(call => call.slice(0, 2))).toEqual([
355
+ ['GRCh38#0#chr1', { start: 2100, end: 2600 }],
350
356
  ])
351
- bytes.mockRestore()
352
- })
353
-
354
- test('getFeatures reads from the chunk before the window', async () => {
355
- const getLines = vi.spyOn(TabixIndexedFile.prototype, 'getLines')
356
- await firstValueFrom(
357
- makeAdapter(headerPrefix).getFeatures(chr1(2100, 2600)).pipe(toArray()),
358
- )
359
- expect(getLines.mock.calls.map(call => call[1])).toEqual([1000])
360
- getLines.mockRestore()
357
+ bytesFor.mockRestore()
361
358
  })
362
359
 
363
- test('a walk leaving the window is measured to where it rejoins the reference', async () => {
364
- const cut = (await makeAdapter(rejoinPrefix).getSubgraph(chr1(1000, 1500), {
365
- walkRows: true,
366
- })) as WalkCut
367
- const rows = walkRowsOf(cut.walkRowRuns!).rows.map(
368
- ({ label, bp, complete, stop }) => ({ label, bp, complete, stop }),
369
- )
370
- expect(rows).toEqual([
371
- { label: 'HG002#1', bp: 4500, complete: true, stop: undefined },
372
- { label: 'HG002#2', bp: 500, complete: true, stop: undefined },
373
- {
374
- label: 'HG003#1',
375
- bp: 800,
376
- complete: false,
377
- stop: { contigEnds: false, shortBp: 0 },
378
- },
379
- ])
380
- })
360
+ // A fragment runs from its walk's first step on the drawn stretch to its
361
+ // last, so HG002#1's ends at 3 and its departure says where it goes on, and
362
+ // HG003#1's ends at 3 with 22 trimmed, which no departure follows
363
+ test.each([
364
+ ['one 10 kb tile', rejoinPrefix],
365
+ ['1 kb tiles', followPrefix],
366
+ ])(
367
+ 'a walk leaving the window says where it rejoins the reference, in %s',
368
+ async (_, prefix) => {
369
+ const cut = (await makeAdapter(prefix).getSubgraph(chr1(1000, 1500), {
370
+ walkRows: true,
371
+ })) as WalkCut
372
+ const rows = walkRowsOf(cut.walkRowRuns!).rows.map(
373
+ ({ label, bp, complete, stop }) => ({ label, bp, complete, stop }),
374
+ )
375
+ expect(rows).toEqual([
376
+ { label: 'HG002#2', bp: 500, complete: true, stop: undefined },
377
+ {
378
+ label: 'HG002#1',
379
+ bp: 500,
380
+ complete: false,
381
+ stop: {
382
+ contigEnds: false,
383
+ shortBp: 0,
384
+ goesOn: {
385
+ near: 4000,
386
+ departure: expect.objectContaining({
387
+ leavePos: 1500,
388
+ rejoinPos: 4000,
389
+ ownBp: 4000,
390
+ }),
391
+ },
392
+ },
393
+ },
394
+ {
395
+ label: 'HG003#1',
396
+ bp: 500,
397
+ complete: false,
398
+ stop: { contigEnds: false, shortBp: 0 },
399
+ },
400
+ ])
401
+ },
402
+ )
381
403
 
382
- // gfa-to-tabix 1.5 --walks --chunk 10 of ten 10 bp reference nodes:
404
+ // gfa-to-tabix --walks --tile 10 of ten 10 bp reference nodes:
383
405
  // W GRCh38 0 chr1 >1>2>3>4>5>6>7>8>9>10
384
- // W HG002 1 ctg >1>2>9>10 a deletion of 20-80, whose chunks hold skip rows
385
- const skipPrefix = fixture('walks5_skip')
406
+ // W HG002 1 ctg >1>2>9>10 a departure from 20 to 80 with nothing between
407
+ const skipPrefix = fixture('skip')
386
408
 
387
- // HG002's deletion runs under the whole of GRCh38's bar, flanks included
388
- test('a haplotype that jumps over the window draws as a deletion row', async () => {
409
+ // HG002 steps on 2 and 9, the reference nodes either side of the window, so
410
+ // its row across the reference's 30 bp is its departure from 20 to 80
411
+ test('a haplotype that jumps over the window draws as a row of its departure', async () => {
389
412
  const cut = (await makeAdapter(skipPrefix).getSubgraph(chr1(31, 60), {
390
413
  walkRows: true,
391
414
  })) as WalkCut
392
415
  const { reference, rows } = walkRowsOf(cut.walkRowRuns!)
393
- expect(reference.bp).toBe(40)
416
+ expect(reference.bp).toBe(30)
394
417
  expect(
395
- rows.map(({ label, bp, gapBp, complete }) => ({
418
+ rows.map(({ label, bp, gapBp, complete, stepless, runs }) => ({
396
419
  label,
397
420
  bp,
398
421
  gapBp,
399
422
  complete,
423
+ stepless,
424
+ runs: runs.map(({ start, bp, cause }) => ({ start, bp, cause })),
400
425
  })),
401
- ).toEqual([{ label: 'HG002#1', bp: 0, gapBp: 40, complete: true }])
402
- expect(rows[0]!.runs).toEqual([
403
- expect.objectContaining({ start: 0, bp: 40, cause: 'deleted' }),
404
- ])
405
- })
406
-
407
- test('a walk the read cuts off is read on to the chunk its row names', async () => {
408
- const getLines = vi.spyOn(TabixIndexedFile.prototype, 'getLines')
409
- const cut = (await makeAdapter(followPrefix).getSubgraph(chr1(1000, 1500), {
410
- walkRows: true,
411
- })) as WalkCut
412
- const reads = getLines.mock.calls.map(call => [call[1], call[2]])
413
- getLines.mockRestore()
414
- const rows = walkRowsOf(cut.walkRowRuns!).rows.map(
415
- ({ label, bp, complete }) => ({ label, bp, complete }),
416
- )
417
- expect(rows).toEqual([
418
- { label: 'HG002#1', bp: 4500, complete: true },
419
- { label: 'HG002#2', bp: 500, complete: true },
420
- { label: 'HG003#1', bp: 800, complete: false },
426
+ ).toEqual([
427
+ {
428
+ label: 'HG002#1',
429
+ bp: 0,
430
+ gapBp: 30,
431
+ complete: true,
432
+ stepless: true,
433
+ runs: [{ start: 0, bp: 30, cause: 'departure' }],
434
+ },
421
435
  ])
422
- // the window's chunks, then on to chunk 4000; HG003#1's contig ends
423
- expect(new Set(reads.map(String))).toEqual(new Set(['0,1500', '2000,4001']))
424
436
  })
425
437
 
426
- test('a cut on a signal already aborted reads no row', async () => {
438
+ test('a cut on a signal already aborted reads no unit', async () => {
427
439
  const adapter = makeAdapter(headerPrefix)
428
440
  await adapter.getHaplotypeNames()
429
- const getLines = vi.spyOn(TabixIndexedFile.prototype, 'getLines')
441
+ const read = vi.spyOn(WalkFile.prototype, 'read')
430
442
  const aborted = new AbortController()
431
443
  aborted.abort(new Error('panned away'))
432
444
  await expect(
433
445
  adapter.getSubgraph(chr1(1000, 2600), { signal: aborted.signal }),
434
446
  ).rejects.toThrow()
435
- expect(getLines).not.toHaveBeenCalled()
436
- getLines.mockRestore()
447
+ expect(read).not.toHaveBeenCalled()
448
+ read.mockRestore()
437
449
  })