@jbrowse/plugin-alignments 1.7.9 → 2.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 (294) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +192 -207
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -0
  3. package/dist/AlignmentsFeatureDetail/index.d.ts +28 -3
  4. package/dist/AlignmentsFeatureDetail/index.js +48 -55
  5. package/dist/AlignmentsFeatureDetail/index.js.map +1 -0
  6. package/dist/AlignmentsTrack/index.js +24 -32
  7. package/dist/AlignmentsTrack/index.js.map +1 -0
  8. package/dist/BamAdapter/BamAdapter.js +345 -585
  9. package/dist/BamAdapter/BamAdapter.js.map +1 -0
  10. package/dist/BamAdapter/BamSlightlyLazyFeature.js +143 -174
  11. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -0
  12. package/dist/BamAdapter/MismatchParser.js +340 -416
  13. package/dist/BamAdapter/MismatchParser.js.map +1 -0
  14. package/dist/BamAdapter/configSchema.js +33 -46
  15. package/dist/BamAdapter/configSchema.js.map +1 -0
  16. package/dist/BamAdapter/index.js +36 -32
  17. package/dist/BamAdapter/index.js.map +1 -0
  18. package/dist/CramAdapter/CramAdapter.js +376 -644
  19. package/dist/CramAdapter/CramAdapter.js.map +1 -0
  20. package/dist/CramAdapter/CramSlightlyLazyFeature.js +374 -439
  21. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -0
  22. package/dist/CramAdapter/CramTestAdapters.js +169 -227
  23. package/dist/CramAdapter/CramTestAdapters.js.map +1 -0
  24. package/dist/CramAdapter/configSchema.js +28 -38
  25. package/dist/CramAdapter/configSchema.js.map +1 -0
  26. package/dist/CramAdapter/index.js +37 -32
  27. package/dist/CramAdapter/index.js.map +1 -0
  28. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +91 -93
  29. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -0
  30. package/dist/HtsgetBamAdapter/configSchema.js +19 -29
  31. package/dist/HtsgetBamAdapter/configSchema.js.map +1 -0
  32. package/dist/HtsgetBamAdapter/index.js +44 -38
  33. package/dist/HtsgetBamAdapter/index.js.map +1 -0
  34. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +36 -65
  35. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -0
  36. package/dist/LinearAlignmentsDisplay/index.js +22 -28
  37. package/dist/LinearAlignmentsDisplay/index.js.map +1 -0
  38. package/dist/LinearAlignmentsDisplay/models/configSchema.js +12 -23
  39. package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -0
  40. package/dist/LinearAlignmentsDisplay/models/model.d.ts +10 -10
  41. package/dist/LinearAlignmentsDisplay/models/model.js +257 -245
  42. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -0
  43. package/dist/LinearPileupDisplay/components/ColorByModifications.js +98 -116
  44. package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -0
  45. package/dist/LinearPileupDisplay/components/ColorByTag.js +82 -91
  46. package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -0
  47. package/dist/LinearPileupDisplay/components/FilterByTag.js +156 -192
  48. package/dist/LinearPileupDisplay/components/FilterByTag.js.map +1 -0
  49. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +15 -29
  50. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -0
  51. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +79 -93
  52. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -0
  53. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +78 -81
  54. package/dist/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -0
  55. package/dist/LinearPileupDisplay/components/SortByTag.js +80 -88
  56. package/dist/LinearPileupDisplay/components/SortByTag.js.map +1 -0
  57. package/dist/LinearPileupDisplay/configSchema.js +40 -42
  58. package/dist/LinearPileupDisplay/configSchema.js.map +1 -0
  59. package/dist/LinearPileupDisplay/index.js +21 -27
  60. package/dist/LinearPileupDisplay/index.js.map +1 -0
  61. package/dist/LinearPileupDisplay/model.d.ts +33 -20
  62. package/dist/LinearPileupDisplay/model.js +702 -716
  63. package/dist/LinearPileupDisplay/model.js.map +1 -0
  64. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  65. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +105 -57
  66. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -0
  67. package/dist/LinearSNPCoverageDisplay/index.js +21 -27
  68. package/dist/LinearSNPCoverageDisplay/index.js.map +1 -0
  69. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +45 -55
  70. package/dist/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -0
  71. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +14 -12
  72. package/dist/LinearSNPCoverageDisplay/models/model.js +257 -230
  73. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -0
  74. package/dist/NestedFrequencyTable.js +104 -139
  75. package/dist/NestedFrequencyTable.js.map +1 -0
  76. package/dist/PileupRPC/rpcMethods.js +199 -278
  77. package/dist/PileupRPC/rpcMethods.js.map +1 -0
  78. package/dist/PileupRenderer/PileupLayoutSession.js +56 -76
  79. package/dist/PileupRenderer/PileupLayoutSession.js.map +1 -0
  80. package/dist/PileupRenderer/PileupRenderer.d.ts +56 -11
  81. package/dist/PileupRenderer/PileupRenderer.js +942 -1134
  82. package/dist/PileupRenderer/PileupRenderer.js.map +1 -0
  83. package/dist/PileupRenderer/components/PileupRendering.d.ts +1 -1
  84. package/dist/PileupRenderer/components/PileupRendering.js +173 -253
  85. package/dist/PileupRenderer/components/PileupRendering.js.map +1 -0
  86. package/dist/PileupRenderer/configSchema.js +65 -71
  87. package/dist/PileupRenderer/configSchema.js.map +1 -0
  88. package/dist/PileupRenderer/index.js +17 -22
  89. package/dist/PileupRenderer/index.js.map +1 -0
  90. package/dist/PileupRenderer/sortUtil.js +83 -107
  91. package/dist/PileupRenderer/sortUtil.js.map +1 -0
  92. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +2 -0
  93. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +436 -586
  94. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -0
  95. package/dist/SNPCoverageAdapter/configSchema.js +10 -20
  96. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -0
  97. package/dist/SNPCoverageAdapter/index.js +46 -41
  98. package/dist/SNPCoverageAdapter/index.js.map +1 -0
  99. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +1 -1
  100. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +265 -290
  101. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -0
  102. package/dist/SNPCoverageRenderer/configSchema.js +30 -39
  103. package/dist/SNPCoverageRenderer/configSchema.js.map +1 -0
  104. package/dist/SNPCoverageRenderer/index.js +19 -30
  105. package/dist/SNPCoverageRenderer/index.js.map +1 -0
  106. package/dist/index.js +135 -152
  107. package/dist/index.js.map +1 -0
  108. package/dist/shared.js +84 -92
  109. package/dist/shared.js.map +1 -0
  110. package/dist/util.js +130 -121
  111. package/dist/util.js.map +1 -0
  112. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +6 -0
  113. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +145 -0
  114. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -0
  115. package/esm/AlignmentsFeatureDetail/index.d.ts +38 -0
  116. package/esm/AlignmentsFeatureDetail/index.js +23 -0
  117. package/esm/AlignmentsFeatureDetail/index.js.map +1 -0
  118. package/esm/AlignmentsTrack/index.d.ts +2 -0
  119. package/esm/AlignmentsTrack/index.js +23 -0
  120. package/esm/AlignmentsTrack/index.js.map +1 -0
  121. package/esm/BamAdapter/BamAdapter.d.ts +40 -0
  122. package/esm/BamAdapter/BamAdapter.js +173 -0
  123. package/esm/BamAdapter/BamAdapter.js.map +1 -0
  124. package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +33 -0
  125. package/esm/BamAdapter/BamSlightlyLazyFeature.js +107 -0
  126. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -0
  127. package/esm/BamAdapter/MismatchParser.d.ts +25 -0
  128. package/esm/BamAdapter/MismatchParser.js +294 -0
  129. package/esm/BamAdapter/MismatchParser.js.map +1 -0
  130. package/esm/BamAdapter/configSchema.d.ts +2 -0
  131. package/esm/BamAdapter/configSchema.js +31 -0
  132. package/esm/BamAdapter/configSchema.js.map +1 -0
  133. package/esm/BamAdapter/index.d.ts +3 -0
  134. package/esm/BamAdapter/index.js +10 -0
  135. package/esm/BamAdapter/index.js.map +1 -0
  136. package/esm/CramAdapter/CramAdapter.d.ts +53 -0
  137. package/esm/CramAdapter/CramAdapter.js +228 -0
  138. package/esm/CramAdapter/CramAdapter.js.map +1 -0
  139. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +49 -0
  140. package/esm/CramAdapter/CramSlightlyLazyFeature.js +349 -0
  141. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -0
  142. package/esm/CramAdapter/CramTestAdapters.d.ts +29 -0
  143. package/esm/CramAdapter/CramTestAdapters.js +70 -0
  144. package/esm/CramAdapter/CramTestAdapters.js.map +1 -0
  145. package/esm/CramAdapter/configSchema.d.ts +3 -0
  146. package/esm/CramAdapter/configSchema.js +26 -0
  147. package/esm/CramAdapter/configSchema.js.map +1 -0
  148. package/esm/CramAdapter/index.d.ts +3 -0
  149. package/esm/CramAdapter/index.js +11 -0
  150. package/esm/CramAdapter/index.js.map +1 -0
  151. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +9 -0
  152. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js +27 -0
  153. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -0
  154. package/esm/HtsgetBamAdapter/configSchema.d.ts +2 -0
  155. package/esm/HtsgetBamAdapter/configSchema.js +17 -0
  156. package/esm/HtsgetBamAdapter/configSchema.js.map +1 -0
  157. package/esm/HtsgetBamAdapter/index.d.ts +3 -0
  158. package/esm/HtsgetBamAdapter/index.js +16 -0
  159. package/esm/HtsgetBamAdapter/index.js.map +1 -0
  160. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +7 -0
  161. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +34 -0
  162. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -0
  163. package/esm/LinearAlignmentsDisplay/index.d.ts +2 -0
  164. package/esm/LinearAlignmentsDisplay/index.js +19 -0
  165. package/esm/LinearAlignmentsDisplay/index.js.map +1 -0
  166. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +4 -0
  167. package/esm/LinearAlignmentsDisplay/models/configSchema.js +12 -0
  168. package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -0
  169. package/esm/LinearAlignmentsDisplay/models/model.d.ts +105 -0
  170. package/esm/LinearAlignmentsDisplay/models/model.js +181 -0
  171. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -0
  172. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +14 -0
  173. package/esm/LinearPileupDisplay/components/ColorByModifications.js +71 -0
  174. package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -0
  175. package/esm/LinearPileupDisplay/components/ColorByTag.d.ts +9 -0
  176. package/esm/LinearPileupDisplay/components/ColorByTag.js +45 -0
  177. package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -0
  178. package/esm/LinearPileupDisplay/components/FilterByTag.d.ts +18 -0
  179. package/esm/LinearPileupDisplay/components/FilterByTag.js +123 -0
  180. package/esm/LinearPileupDisplay/components/FilterByTag.js.map +1 -0
  181. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +13 -0
  182. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +13 -0
  183. package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js.map +1 -0
  184. package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +16 -0
  185. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +41 -0
  186. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -0
  187. package/esm/LinearPileupDisplay/components/SetMaxHeight.d.ts +10 -0
  188. package/esm/LinearPileupDisplay/components/SetMaxHeight.js +43 -0
  189. package/esm/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -0
  190. package/esm/LinearPileupDisplay/components/SortByTag.d.ts +9 -0
  191. package/esm/LinearPileupDisplay/components/SortByTag.js +43 -0
  192. package/esm/LinearPileupDisplay/components/SortByTag.js.map +1 -0
  193. package/esm/LinearPileupDisplay/configSchema.d.ts +6 -0
  194. package/esm/LinearPileupDisplay/configSchema.js +41 -0
  195. package/esm/LinearPileupDisplay/configSchema.js.map +1 -0
  196. package/esm/LinearPileupDisplay/index.d.ts +2 -0
  197. package/esm/LinearPileupDisplay/index.js +18 -0
  198. package/esm/LinearPileupDisplay/index.js.map +1 -0
  199. package/esm/LinearPileupDisplay/model.d.ts +332 -0
  200. package/esm/LinearPileupDisplay/model.js +576 -0
  201. package/esm/LinearPileupDisplay/model.js.map +1 -0
  202. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +10 -0
  203. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +57 -0
  204. package/esm/LinearSNPCoverageDisplay/components/Tooltip.js.map +1 -0
  205. package/esm/LinearSNPCoverageDisplay/index.d.ts +2 -0
  206. package/esm/LinearSNPCoverageDisplay/index.js +18 -0
  207. package/esm/LinearSNPCoverageDisplay/index.js.map +1 -0
  208. package/esm/LinearSNPCoverageDisplay/models/configSchema.d.ts +2 -0
  209. package/esm/LinearSNPCoverageDisplay/models/configSchema.js +44 -0
  210. package/esm/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -0
  211. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +348 -0
  212. package/esm/LinearSNPCoverageDisplay/models/model.js +185 -0
  213. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -0
  214. package/esm/NestedFrequencyTable.d.ts +14 -0
  215. package/esm/NestedFrequencyTable.js +101 -0
  216. package/esm/NestedFrequencyTable.js.map +1 -0
  217. package/esm/PileupRPC/rpcMethods.d.ts +34 -0
  218. package/esm/PileupRPC/rpcMethods.js +70 -0
  219. package/esm/PileupRPC/rpcMethods.js.map +1 -0
  220. package/esm/PileupRenderer/PileupLayoutSession.d.ts +32 -0
  221. package/esm/PileupRenderer/PileupLayoutSession.js +32 -0
  222. package/esm/PileupRenderer/PileupLayoutSession.js.map +1 -0
  223. package/esm/PileupRenderer/PileupRenderer.d.ts +182 -0
  224. package/esm/PileupRenderer/PileupRenderer.js +830 -0
  225. package/esm/PileupRenderer/PileupRenderer.js.map +1 -0
  226. package/esm/PileupRenderer/components/PileupRendering.d.ts +23 -0
  227. package/esm/PileupRenderer/components/PileupRendering.js +138 -0
  228. package/esm/PileupRenderer/components/PileupRendering.js.map +1 -0
  229. package/esm/PileupRenderer/configSchema.d.ts +2 -0
  230. package/esm/PileupRenderer/configSchema.js +64 -0
  231. package/esm/PileupRenderer/configSchema.js.map +1 -0
  232. package/esm/PileupRenderer/index.d.ts +2 -0
  233. package/esm/PileupRenderer/index.js +12 -0
  234. package/esm/PileupRenderer/index.js.map +1 -0
  235. package/esm/PileupRenderer/sortUtil.d.ts +8 -0
  236. package/esm/PileupRenderer/sortUtil.js +80 -0
  237. package/esm/PileupRenderer/sortUtil.js.map +1 -0
  238. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +67 -0
  239. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +259 -0
  240. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -0
  241. package/esm/SNPCoverageAdapter/configSchema.d.ts +3 -0
  242. package/esm/SNPCoverageAdapter/configSchema.js +6 -0
  243. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -0
  244. package/esm/SNPCoverageAdapter/index.d.ts +3 -0
  245. package/esm/SNPCoverageAdapter/index.js +18 -0
  246. package/esm/SNPCoverageAdapter/index.js.map +1 -0
  247. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +20 -0
  248. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +185 -0
  249. package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js.map +1 -0
  250. package/esm/SNPCoverageRenderer/configSchema.d.ts +2 -0
  251. package/esm/SNPCoverageRenderer/configSchema.js +29 -0
  252. package/esm/SNPCoverageRenderer/configSchema.js.map +1 -0
  253. package/esm/SNPCoverageRenderer/index.d.ts +3 -0
  254. package/esm/SNPCoverageRenderer/index.js +14 -0
  255. package/esm/SNPCoverageRenderer/index.js.map +1 -0
  256. package/esm/index.d.ts +10 -0
  257. package/esm/index.js +91 -0
  258. package/esm/index.js.map +1 -0
  259. package/esm/shared.d.ts +25 -0
  260. package/esm/shared.js +28 -0
  261. package/esm/shared.js.map +1 -0
  262. package/esm/util.d.ts +19 -0
  263. package/esm/util.js +83 -0
  264. package/esm/util.js.map +1 -0
  265. package/package.json +19 -11
  266. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +16 -6
  267. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +321 -397
  268. package/src/AlignmentsFeatureDetail/index.ts +7 -17
  269. package/src/BamAdapter/MismatchParser.ts +1 -0
  270. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -3
  271. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +7 -7
  272. package/src/LinearPileupDisplay/components/ColorByTag.tsx +5 -5
  273. package/src/LinearPileupDisplay/components/FilterByTag.tsx +5 -5
  274. package/src/LinearPileupDisplay/components/LinearPileupDisplayBlurb.tsx +1 -1
  275. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +9 -9
  276. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +5 -5
  277. package/src/LinearPileupDisplay/components/SortByTag.tsx +5 -5
  278. package/src/LinearPileupDisplay/model.ts +90 -32
  279. package/src/LinearSNPCoverageDisplay/components/Tooltip.tsx +44 -30
  280. package/src/LinearSNPCoverageDisplay/models/model.ts +25 -25
  281. package/src/PileupRenderer/PileupRenderer.tsx +399 -198
  282. package/src/PileupRenderer/components/PileupRendering.tsx +11 -11
  283. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +5 -0
  284. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +7 -5
  285. package/dist/AlignmentsFeatureDetail/index.test.js +0 -60
  286. package/dist/BamAdapter/BamAdapter.test.js +0 -177
  287. package/dist/BamAdapter/MismatchParser.test.js +0 -251
  288. package/dist/CramAdapter/CramAdapter.test.js +0 -138
  289. package/dist/LinearAlignmentsDisplay/models/configSchema.test.js +0 -83
  290. package/dist/LinearPileupDisplay/configSchema.test.js +0 -92
  291. package/dist/LinearSNPCoverageDisplay/models/configSchema.test.js +0 -62
  292. package/dist/PileupRenderer/components/PileupRendering.test.js +0 -36
  293. package/dist/declare.d.js +0 -1
  294. package/dist/index.test.js +0 -26
@@ -0,0 +1,173 @@
1
+ import { BamFile } from '@gmod/bam';
2
+ import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
3
+ import { bytesForRegions, updateStatus } from '@jbrowse/core/util';
4
+ import { openLocation } from '@jbrowse/core/util/io';
5
+ import { ObservableCreate } from '@jbrowse/core/util/rxjs';
6
+ import { toArray } from 'rxjs/operators';
7
+ import { readConfObject } from '@jbrowse/core/configuration';
8
+ import BamSlightlyLazyFeature from './BamSlightlyLazyFeature';
9
+ export default class BamAdapter extends BaseFeatureDataAdapter {
10
+ // derived classes may not use the same configuration so a custom
11
+ // configure method allows derived classes to override this behavior
12
+ async configure() {
13
+ if (!this.configured) {
14
+ const bamLocation = readConfObject(this.config, 'bamLocation');
15
+ const location = readConfObject(this.config, ['index', 'location']);
16
+ const indexType = readConfObject(this.config, ['index', 'indexType']);
17
+ const bam = new BamFile({
18
+ bamFilehandle: openLocation(bamLocation, this.pluginManager),
19
+ csiFilehandle: indexType === 'CSI'
20
+ ? openLocation(location, this.pluginManager)
21
+ : undefined,
22
+ baiFilehandle: indexType !== 'CSI'
23
+ ? openLocation(location, this.pluginManager)
24
+ : undefined,
25
+ // chunkSizeLimit and fetchSizeLimit are more troublesome than
26
+ // helpful, and have given overly large values on the ultra long
27
+ // nanopore reads even with 500MB limits, so disabled with infinity
28
+ chunkSizeLimit: Infinity,
29
+ fetchSizeLimit: Infinity,
30
+ yieldThreadTime: Infinity,
31
+ });
32
+ const adapterConfig = readConfObject(this.config, 'sequenceAdapter');
33
+ if (adapterConfig && this.getSubAdapter) {
34
+ this.configured = this.getSubAdapter(adapterConfig).then(({ dataAdapter }) => ({
35
+ bam,
36
+ sequenceAdapter: dataAdapter,
37
+ }));
38
+ }
39
+ else {
40
+ this.configured = Promise.resolve({ bam });
41
+ }
42
+ }
43
+ return this.configured;
44
+ }
45
+ async getHeader(opts) {
46
+ const { bam } = await this.configure();
47
+ return bam.getHeaderText(opts);
48
+ }
49
+ async setupPre(opts) {
50
+ const { statusCallback = () => { } } = opts || {};
51
+ const { bam } = await this.configure();
52
+ this.samHeader = await updateStatus('Downloading index', statusCallback, async () => {
53
+ const samHeader = await bam.getHeader(opts);
54
+ // use the @SQ lines in the header to figure out the
55
+ // mapping between ref ref ID numbers and names
56
+ const idToName = [];
57
+ const nameToId = {};
58
+ samHeader
59
+ .filter(l => l.tag === 'SQ')
60
+ .forEach((sqLine, refId) => {
61
+ sqLine.data.forEach(item => {
62
+ if (item.tag === 'SN') {
63
+ // this is the ref name
64
+ const refName = item.value;
65
+ nameToId[refName] = refId;
66
+ idToName[refId] = refName;
67
+ }
68
+ });
69
+ });
70
+ return { idToName, nameToId };
71
+ });
72
+ return this.samHeader;
73
+ }
74
+ async setup(opts) {
75
+ if (!this.setupP) {
76
+ this.setupP = this.setupPre(opts).catch(e => {
77
+ this.setupP = undefined;
78
+ throw e;
79
+ });
80
+ }
81
+ return this.setupP;
82
+ }
83
+ async getRefNames(opts) {
84
+ const { idToName } = await this.setup(opts);
85
+ return idToName;
86
+ }
87
+ async seqFetch(refName, start, end) {
88
+ const { sequenceAdapter } = await this.configure();
89
+ const refSeqStore = sequenceAdapter;
90
+ if (!refSeqStore) {
91
+ return undefined;
92
+ }
93
+ if (!refName) {
94
+ return undefined;
95
+ }
96
+ const features = refSeqStore.getFeatures({
97
+ refName,
98
+ start,
99
+ end,
100
+ assemblyName: '',
101
+ });
102
+ const seqChunks = await features.pipe(toArray()).toPromise();
103
+ let sequence = '';
104
+ seqChunks
105
+ .sort((a, b) => a.get('start') - b.get('start'))
106
+ .forEach(chunk => {
107
+ const chunkStart = chunk.get('start');
108
+ const chunkEnd = chunk.get('end');
109
+ const trimStart = Math.max(start - chunkStart, 0);
110
+ const trimEnd = Math.min(end - chunkStart, chunkEnd - chunkStart);
111
+ const trimLength = trimEnd - trimStart;
112
+ const chunkSeq = chunk.get('seq') || chunk.get('residues');
113
+ sequence += chunkSeq.substr(trimStart, trimLength);
114
+ });
115
+ if (sequence.length !== end - start) {
116
+ throw new Error(`sequence fetch failed: fetching ${refName}:${(start - 1).toLocaleString()}-${end.toLocaleString()} returned ${sequence.length.toLocaleString()} bases, but should have returned ${(end - start).toLocaleString()}`);
117
+ }
118
+ return sequence;
119
+ }
120
+ getFeatures(region, opts) {
121
+ const { refName, start, end, originalRefName } = region;
122
+ const { signal, filterBy, statusCallback = () => { } } = opts || {};
123
+ return ObservableCreate(async (observer) => {
124
+ const { bam } = await this.configure();
125
+ await this.setup(opts);
126
+ statusCallback('Downloading alignments');
127
+ const records = await bam.getRecordsForRange(refName, start, end, opts);
128
+ const { flagInclude = 0, flagExclude = 0, tagFilter, readName, } = filterBy || {};
129
+ for (const record of records) {
130
+ let ref;
131
+ if (!record.get('MD')) {
132
+ ref = await this.seqFetch(originalRefName || refName, record.get('start'), record.get('end'));
133
+ }
134
+ const flags = record.flags;
135
+ if (!((flags & flagInclude) === flagInclude && !(flags & flagExclude))) {
136
+ continue;
137
+ }
138
+ if (tagFilter) {
139
+ const val = record.get(tagFilter.tag);
140
+ if (!(val === '*' ? val !== undefined : val === tagFilter.value)) {
141
+ continue;
142
+ }
143
+ }
144
+ if (readName && record.get('name') !== readName) {
145
+ continue;
146
+ }
147
+ observer.next(new BamSlightlyLazyFeature(record, this, ref));
148
+ }
149
+ statusCallback('');
150
+ observer.complete();
151
+ }, signal);
152
+ }
153
+ async estimateRegionsStats(regions, opts) {
154
+ const { bam } = await this.configure();
155
+ // this is a method to avoid calling on htsget adapters
156
+ // @ts-ignore
157
+ if (bam.index.filehandle !== '?') {
158
+ const bytes = await bytesForRegions(regions, bam);
159
+ const fetchSizeLimit = readConfObject(this.config, 'fetchSizeLimit');
160
+ return { bytes, fetchSizeLimit };
161
+ }
162
+ else {
163
+ return super.estimateRegionsStats(regions, opts);
164
+ }
165
+ }
166
+ freeResources( /* { region } */) { }
167
+ // depends on setup being called before the BAM constructor
168
+ refIdToName(refId) {
169
+ var _a;
170
+ return (_a = this.samHeader) === null || _a === void 0 ? void 0 : _a.idToName[refId];
171
+ }
172
+ }
173
+ //# sourceMappingURL=BamAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BamAdapter.js","sourceRoot":"","sources":["../../src/BamAdapter/BamAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /// <reference types="node" />
2
+ import { Feature, SimpleFeatureSerialized } from '@jbrowse/core/util/simpleFeature';
3
+ import { BamRecord } from '@gmod/bam';
4
+ import BamAdapter from './BamAdapter';
5
+ export default class BamSlightlyLazyFeature implements Feature {
6
+ private record;
7
+ private adapter;
8
+ private ref?;
9
+ constructor(record: BamRecord, adapter: BamAdapter, ref?: string | undefined);
10
+ _get_name(): any;
11
+ _get_type(): string;
12
+ _get_score(): number;
13
+ _get_flags(): string;
14
+ _get_strand(): number;
15
+ _get_pair_orientation(): string | null | undefined;
16
+ _get_next_seq_id(): number;
17
+ _get_seq_id(): number;
18
+ _get_next_refName(): string | undefined;
19
+ _get_next_segment_position(): string | undefined;
20
+ _get_seq(): string;
21
+ qualRaw(): Buffer | undefined;
22
+ set(): void;
23
+ tags(): string[];
24
+ id(): string;
25
+ get(field: string): any;
26
+ _get_refName(): string | undefined;
27
+ parent(): undefined;
28
+ children(): undefined;
29
+ pairedFeature(): boolean;
30
+ toJSON(): SimpleFeatureSerialized;
31
+ _get_mismatches(): import("./MismatchParser").Mismatch[];
32
+ _get_clipPos(): number;
33
+ }
@@ -0,0 +1,107 @@
1
+ import { getMismatches } from './MismatchParser';
2
+ export default class BamSlightlyLazyFeature {
3
+ // uses parameter properties to automatically create fields on the class
4
+ // https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties
5
+ constructor(record, adapter, ref) {
6
+ this.record = record;
7
+ this.adapter = adapter;
8
+ this.ref = ref;
9
+ }
10
+ _get_name() {
11
+ return this.record.get('name');
12
+ }
13
+ _get_type() {
14
+ return 'match';
15
+ }
16
+ _get_score() {
17
+ return this.record.get('mq');
18
+ }
19
+ _get_flags() {
20
+ return this.record.flags;
21
+ }
22
+ _get_strand() {
23
+ return this.record.isReverseComplemented() ? -1 : 1;
24
+ }
25
+ _get_pair_orientation() {
26
+ return this.record.isPaired() ? this.record.getPairOrientation() : undefined;
27
+ }
28
+ _get_next_seq_id() {
29
+ return this.record._next_refid();
30
+ }
31
+ _get_seq_id() {
32
+ // @ts-ignore
33
+ return this.record._refID;
34
+ }
35
+ _get_next_refName() {
36
+ return this.adapter.refIdToName(this.record._next_refid());
37
+ }
38
+ _get_next_segment_position() {
39
+ const { record, adapter } = this;
40
+ return record.isPaired()
41
+ ? `${adapter.refIdToName(record._next_refid())}:${record._next_pos() + 1}`
42
+ : undefined;
43
+ }
44
+ _get_seq() {
45
+ return this.record.getReadBases();
46
+ }
47
+ qualRaw() {
48
+ return this.record.qualRaw();
49
+ }
50
+ set() { }
51
+ tags() {
52
+ const properties = Object.getOwnPropertyNames(BamSlightlyLazyFeature.prototype);
53
+ return [
54
+ ...new Set(properties
55
+ .filter(prop => prop.startsWith('_get_') &&
56
+ prop !== '_get_mismatches' &&
57
+ prop !== '_get_tags' &&
58
+ prop !== '_get_next_seq_id' &&
59
+ prop !== '_get_seq_id')
60
+ .map(methodName => methodName.replace('_get_', ''))
61
+ .concat(this.record._tags())),
62
+ ];
63
+ }
64
+ id() {
65
+ return `${this.adapter.id}-${this.record.id()}`;
66
+ }
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ get(field) {
69
+ const methodName = `_get_${field}`;
70
+ // @ts-ignore
71
+ if (this[methodName]) {
72
+ // @ts-ignore
73
+ return this[methodName]();
74
+ }
75
+ return this.record.get(field);
76
+ }
77
+ _get_refName() {
78
+ return this.adapter.refIdToName(this.record.seq_id());
79
+ }
80
+ parent() {
81
+ return undefined;
82
+ }
83
+ children() {
84
+ return undefined;
85
+ }
86
+ pairedFeature() {
87
+ return false;
88
+ }
89
+ toJSON() {
90
+ return {
91
+ ...Object.fromEntries(this.tags()
92
+ .map(t => [t, this.get(t)])
93
+ .filter(elt => elt[1] !== undefined)),
94
+ uniqueId: this.id(),
95
+ };
96
+ }
97
+ _get_mismatches() {
98
+ return getMismatches(this.get('CIGAR'), this.get('MD'), this.get('seq'), this.ref, this.qualRaw());
99
+ }
100
+ _get_clipPos() {
101
+ const cigar = this.get('CIGAR') || '';
102
+ return this.get('strand') === -1
103
+ ? +(cigar.match(/(\d+)[SH]$/) || [])[1] || 0
104
+ : +(cigar.match(/^(\d+)([SH])/) || [])[1] || 0;
105
+ }
106
+ }
107
+ //# sourceMappingURL=BamSlightlyLazyFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BamSlightlyLazyFeature.js","sourceRoot":"","sources":["../../src/BamAdapter/BamSlightlyLazyFeature.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAIhD,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,wEAAwE;IACxE,iFAAiF;IACjF,YACU,MAAiB,EACjB,OAAmB,EACnB,GAAY;QAFZ,WAAM,GAAN,MAAM,CAAW;QACjB,YAAO,GAAP,OAAO,CAAY;QACnB,QAAG,GAAH,GAAG,CAAS;IACnB,CAAC;IAEJ,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,SAAS;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;IAC1B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,qBAAqB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC9E,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;IAClC,CAAC;IAED,WAAW;QACT,aAAa;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,0BAA0B;QACxB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QAChC,OAAO,MAAM,CAAC,QAAQ,EAAE;YACtB,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;YAC1E,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAA;IACnC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC9B,CAAC;IAED,GAAG,KAAI,CAAC;IAER,IAAI;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAC3C,sBAAsB,CAAC,SAAS,CACjC,CAAA;QAED,OAAO;YACL,GAAG,IAAI,GAAG,CACR,UAAU;iBACP,MAAM,CACL,IAAI,CAAC,EAAE,CACL,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBACxB,IAAI,KAAK,iBAAiB;gBAC1B,IAAI,KAAK,WAAW;gBACpB,IAAI,KAAK,kBAAkB;gBAC3B,IAAI,KAAK,aAAa,CACzB;iBACA,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;iBAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAC/B;SACF,CAAA;IACH,CAAC;IAED,EAAE;QACA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAA;IACjD,CAAC;IAED,8DAA8D;IAC9D,GAAG,CAAC,KAAa;QACf,MAAM,UAAU,GAAG,QAAQ,KAAK,EAAE,CAAA;QAClC,aAAa;QACb,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE;YACpB,aAAa;YACb,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAA;SAC1B;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,MAAM;QACJ,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,MAAM,CAAC,WAAW,CACnB,IAAI,CAAC,IAAI,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CACvC;YACD,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;SACpB,CAAA;IACH,CAAC;IAED,eAAe;QACb,OAAO,aAAa,CAClB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EACf,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,OAAO,EAAE,CACf,CAAA;IACH,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /// <reference types="node" />
2
+ export interface Mismatch {
3
+ qual?: number;
4
+ start: number;
5
+ length: number;
6
+ type: string;
7
+ base: string;
8
+ altbase?: string;
9
+ seq?: string;
10
+ cliplen?: number;
11
+ }
12
+ export declare function parseCigar(cigar: string): string[];
13
+ export declare function cigarToMismatches(ops: string[], seq: string, ref?: string, qual?: Buffer): Mismatch[];
14
+ /**
15
+ * parse a SAM MD tag to find mismatching bases of the template versus the reference
16
+ * @returns array of mismatches and their positions
17
+ */
18
+ export declare function mdToMismatches(mdstring: string, ops: string[], cigarMismatches: Mismatch[], seq: string, qual?: Buffer): Mismatch[];
19
+ export declare function getMismatches(cigar: string, md: string, seq: string, ref?: string, qual?: Buffer): Mismatch[];
20
+ export declare function getNextRefPos(cigarOps: string[], positions: number[]): Generator<number, void, unknown>;
21
+ export declare function getModificationPositions(mm: string, fseq: string, fstrand: number): {
22
+ type: string;
23
+ positions: number[];
24
+ }[];
25
+ export declare function getModificationTypes(mm: string): string[];
@@ -0,0 +1,294 @@
1
+ import { revcom } from '@jbrowse/core/util';
2
+ const mdRegex = new RegExp(/(\d+|\^[a-z]+|[a-z])/gi);
3
+ const modificationRegex = new RegExp(/([A-Z])([-+])([^,.?]+)([.?])?/);
4
+ export function parseCigar(cigar) {
5
+ return (cigar || '').split(/([MIDNSHPX=])/);
6
+ }
7
+ export function cigarToMismatches(ops, seq, ref, qual) {
8
+ let roffset = 0; // reference offset
9
+ let soffset = 0; // seq offset
10
+ const mismatches = [];
11
+ const hasRefAndSeq = ref && seq;
12
+ for (let i = 0; i < ops.length; i += 2) {
13
+ const len = +ops[i];
14
+ const op = ops[i + 1];
15
+ if (op === 'M' || op === '=' || op === 'E') {
16
+ if (hasRefAndSeq) {
17
+ for (let j = 0; j < len; j++) {
18
+ if (
19
+ // @ts-ignore in the full yarn build of the repo, this says that object is possibly undefined for some reason, ignored
20
+ seq[soffset + j].toUpperCase() !== ref[roffset + j].toUpperCase()) {
21
+ mismatches.push({
22
+ start: roffset + j,
23
+ type: 'mismatch',
24
+ base: seq[soffset + j],
25
+ altbase: ref[roffset + j],
26
+ length: 1,
27
+ });
28
+ }
29
+ }
30
+ }
31
+ soffset += len;
32
+ }
33
+ if (op === 'I') {
34
+ mismatches.push({
35
+ start: roffset,
36
+ type: 'insertion',
37
+ base: `${len}`,
38
+ length: 0,
39
+ });
40
+ soffset += len;
41
+ }
42
+ else if (op === 'D') {
43
+ mismatches.push({
44
+ start: roffset,
45
+ type: 'deletion',
46
+ base: '*',
47
+ length: len,
48
+ });
49
+ }
50
+ else if (op === 'N') {
51
+ mismatches.push({
52
+ start: roffset,
53
+ type: 'skip',
54
+ base: 'N',
55
+ length: len,
56
+ });
57
+ }
58
+ else if (op === 'X') {
59
+ const r = seq.slice(soffset, soffset + len);
60
+ const q = (qual === null || qual === void 0 ? void 0 : qual.slice(soffset, soffset + len)) || [];
61
+ for (let j = 0; j < len; j++) {
62
+ mismatches.push({
63
+ start: roffset + j,
64
+ type: 'mismatch',
65
+ base: r[j],
66
+ qual: q[j],
67
+ length: 1,
68
+ });
69
+ }
70
+ soffset += len;
71
+ }
72
+ else if (op === 'H') {
73
+ mismatches.push({
74
+ start: roffset,
75
+ type: 'hardclip',
76
+ base: `H${len}`,
77
+ cliplen: len,
78
+ length: 1,
79
+ });
80
+ }
81
+ else if (op === 'S') {
82
+ mismatches.push({
83
+ start: roffset,
84
+ type: 'softclip',
85
+ base: `S${len}`,
86
+ cliplen: len,
87
+ length: 1,
88
+ });
89
+ soffset += len;
90
+ }
91
+ if (op !== 'I' && op !== 'S' && op !== 'H') {
92
+ roffset += len;
93
+ }
94
+ }
95
+ return mismatches;
96
+ }
97
+ /**
98
+ * parse a SAM MD tag to find mismatching bases of the template versus the reference
99
+ * @returns array of mismatches and their positions
100
+ */
101
+ export function mdToMismatches(mdstring, ops, cigarMismatches, seq, qual) {
102
+ const mismatchRecords = [];
103
+ let curr = { start: 0, base: '', length: 0, type: 'mismatch' };
104
+ const skips = cigarMismatches.filter(cigar => cigar.type === 'skip');
105
+ let lastCigar = 0;
106
+ let lastTemplateOffset = 0;
107
+ let lastRefOffset = 0;
108
+ let lastSkipPos = 0;
109
+ // convert a position on the reference sequence to a position
110
+ // on the template sequence, taking into account hard and soft
111
+ // clipping of reads
112
+ function nextRecord() {
113
+ mismatchRecords.push(curr);
114
+ // get a new mismatch record ready
115
+ curr = {
116
+ start: curr.start + curr.length,
117
+ length: 0,
118
+ base: '',
119
+ type: 'mismatch',
120
+ };
121
+ }
122
+ function getTemplateCoordLocal(refCoord) {
123
+ let templateOffset = lastTemplateOffset;
124
+ let refOffset = lastRefOffset;
125
+ for (let i = lastCigar; i < ops.length && refOffset <= refCoord; i += 2, lastCigar = i) {
126
+ const len = +ops[i];
127
+ const op = ops[i + 1];
128
+ if (op === 'S' || op === 'I') {
129
+ templateOffset += len;
130
+ }
131
+ else if (op === 'D' || op === 'P' || op === 'N') {
132
+ refOffset += len;
133
+ }
134
+ else if (op !== 'H') {
135
+ templateOffset += len;
136
+ refOffset += len;
137
+ }
138
+ }
139
+ lastTemplateOffset = templateOffset;
140
+ lastRefOffset = refOffset;
141
+ return templateOffset - (refOffset - refCoord);
142
+ }
143
+ // now actually parse the MD string
144
+ const md = mdstring.match(mdRegex) || [];
145
+ for (let i = 0; i < md.length; i++) {
146
+ const token = md[i];
147
+ const num = +token;
148
+ if (!Number.isNaN(num)) {
149
+ curr.start += num;
150
+ }
151
+ else if (token.startsWith('^')) {
152
+ curr.start += token.length - 1;
153
+ }
154
+ else {
155
+ // mismatch
156
+ for (let j = 0; j < token.length; j += 1) {
157
+ curr.length = 1;
158
+ while (lastSkipPos < skips.length) {
159
+ const mismatch = skips[lastSkipPos];
160
+ if (curr.start >= mismatch.start) {
161
+ curr.start += mismatch.length;
162
+ lastSkipPos++;
163
+ }
164
+ else {
165
+ break;
166
+ }
167
+ }
168
+ const s = getTemplateCoordLocal(curr.start);
169
+ curr.base = seq[s] || 'X';
170
+ const qualScore = qual === null || qual === void 0 ? void 0 : qual[s];
171
+ if (qualScore) {
172
+ curr.qual = qualScore;
173
+ }
174
+ curr.altbase = token;
175
+ nextRecord();
176
+ }
177
+ }
178
+ }
179
+ return mismatchRecords;
180
+ }
181
+ export function getMismatches(cigar, md, seq, ref, qual) {
182
+ let mismatches = [];
183
+ const ops = parseCigar(cigar);
184
+ // parse the CIGAR tag if it has one
185
+ if (cigar) {
186
+ mismatches = mismatches.concat(cigarToMismatches(ops, seq, ref, qual));
187
+ }
188
+ // now let's look for CRAM or MD mismatches
189
+ if (md) {
190
+ mismatches = mismatches.concat(mdToMismatches(md, ops, mismatches, seq, qual));
191
+ }
192
+ return mismatches;
193
+ }
194
+ // get relative reference sequence positions for positions given relative to
195
+ // the read sequence
196
+ export function* getNextRefPos(cigarOps, positions) {
197
+ let readPos = 0;
198
+ let refPos = 0;
199
+ let currPos = 0;
200
+ for (let i = 0; i < cigarOps.length && currPos < positions.length; i += 2) {
201
+ const len = +cigarOps[i];
202
+ const op = cigarOps[i + 1];
203
+ if (op === 'S' || op === 'I') {
204
+ for (let i = 0; i < len && currPos < positions.length; i++) {
205
+ if (positions[currPos] === readPos + i) {
206
+ currPos++;
207
+ }
208
+ }
209
+ readPos += len;
210
+ }
211
+ else if (op === 'D' || op === 'N') {
212
+ refPos += len;
213
+ }
214
+ else if (op === 'M' || op === 'X' || op === '=') {
215
+ for (let i = 0; i < len && currPos < positions.length; i++) {
216
+ if (positions[currPos] === readPos + i) {
217
+ yield refPos + i;
218
+ currPos++;
219
+ }
220
+ }
221
+ readPos += len;
222
+ refPos += len;
223
+ }
224
+ }
225
+ }
226
+ export function getModificationPositions(mm, fseq, fstrand) {
227
+ const seq = fstrand === -1 ? revcom(fseq) : fseq;
228
+ const mods = mm.split(';').filter(mod => !!mod);
229
+ const result = [];
230
+ for (let i = 0; i < mods.length; i++) {
231
+ const mod = mods[i];
232
+ const [basemod, ...skips] = mod.split(',');
233
+ // regexes based on parse_mm.pl from hts-specs
234
+ const matches = basemod.match(modificationRegex);
235
+ if (!matches) {
236
+ throw new Error('bad format for MM tag');
237
+ }
238
+ const [, base, strand, typestr] = matches;
239
+ // can be a multi e.g. C+mh for both meth (m) and hydroxymeth (h) so
240
+ // split, and they can also be chemical codes (ChEBI) e.g. C+16061
241
+ const types = typestr.split(/(\d+|.)/).filter(f => !!f);
242
+ if (strand === '-') {
243
+ console.warn('unsupported negative strand modifications');
244
+ // make sure to return a somewhat matching type even in this case
245
+ result.push({ type: 'unsupported', positions: [] });
246
+ }
247
+ // this logic also based on parse_mm.pl from hts-specs is that in the
248
+ // sequence of the read, if we have a modification type e.g. C+m;2 and a
249
+ // sequence ACGTACGTAC we skip the two instances of C and go to the last
250
+ // C
251
+ for (let j = 0; j < types.length; j++) {
252
+ const type = types[j];
253
+ let i = 0;
254
+ const positions = [];
255
+ for (let k = 0; k < skips.length; k++) {
256
+ let delta = +skips[k];
257
+ do {
258
+ if (base === 'N' || base === seq[i]) {
259
+ delta--;
260
+ }
261
+ i++;
262
+ } while (delta >= 0 && i < seq.length);
263
+ const temp = i - 1;
264
+ positions.push(fstrand === -1 ? seq.length - 1 - temp : temp);
265
+ }
266
+ if (fstrand === -1) {
267
+ positions.sort((a, b) => a - b);
268
+ }
269
+ result.push({
270
+ type,
271
+ positions,
272
+ });
273
+ }
274
+ }
275
+ return result;
276
+ }
277
+ export function getModificationTypes(mm) {
278
+ const mods = mm.split(';');
279
+ return mods
280
+ .filter(mod => !!mod)
281
+ .map(mod => {
282
+ const [basemod] = mod.split(',');
283
+ const matches = basemod.match(modificationRegex);
284
+ if (!matches) {
285
+ throw new Error('bad format for MM tag');
286
+ }
287
+ const [, , , typestr] = matches;
288
+ // can be a multi e.g. C+mh for both meth (m) and hydroxymeth (h) so
289
+ // split, and they can also be chemical codes (ChEBI) e.g. C+16061
290
+ return typestr.split(/(\d+|.)/).filter(f => !!f);
291
+ })
292
+ .flat();
293
+ }
294
+ //# sourceMappingURL=MismatchParser.js.map