@gmod/bam 9.0.1 → 10.0.1

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 (54) hide show
  1. package/README.md +18 -17
  2. package/dist/bai.d.ts +2 -0
  3. package/dist/bai.js +19 -0
  4. package/dist/bai.js.map +1 -1
  5. package/dist/bamFile.js +12 -21
  6. package/dist/bamFile.js.map +1 -1
  7. package/dist/csi.d.ts +20 -29
  8. package/dist/csi.js +27 -10
  9. package/dist/csi.js.map +1 -1
  10. package/dist/indexFile.d.ts +21 -1
  11. package/dist/indexFile.js +60 -2
  12. package/dist/indexFile.js.map +1 -1
  13. package/dist/record.d.ts +1 -0
  14. package/dist/record.js +33 -21
  15. package/dist/record.js.map +1 -1
  16. package/dist/streamBam.js +9 -8
  17. package/dist/streamBam.js.map +1 -1
  18. package/dist/util.d.ts +24 -4
  19. package/dist/util.js +52 -4
  20. package/dist/util.js.map +1 -1
  21. package/dist/virtualOffset.d.ts +1 -0
  22. package/dist/virtualOffset.js +4 -0
  23. package/dist/virtualOffset.js.map +1 -1
  24. package/esm/bai.d.ts +2 -0
  25. package/esm/bai.js +19 -0
  26. package/esm/bai.js.map +1 -1
  27. package/esm/bamFile.js +13 -22
  28. package/esm/bamFile.js.map +1 -1
  29. package/esm/csi.d.ts +20 -29
  30. package/esm/csi.js +27 -10
  31. package/esm/csi.js.map +1 -1
  32. package/esm/indexFile.d.ts +21 -1
  33. package/esm/indexFile.js +59 -2
  34. package/esm/indexFile.js.map +1 -1
  35. package/esm/record.d.ts +1 -0
  36. package/esm/record.js +33 -21
  37. package/esm/record.js.map +1 -1
  38. package/esm/streamBam.js +10 -9
  39. package/esm/streamBam.js.map +1 -1
  40. package/esm/util.d.ts +24 -4
  41. package/esm/util.js +49 -4
  42. package/esm/util.js.map +1 -1
  43. package/esm/virtualOffset.d.ts +1 -0
  44. package/esm/virtualOffset.js +3 -0
  45. package/esm/virtualOffset.js.map +1 -1
  46. package/package.json +8 -8
  47. package/src/bai.ts +21 -0
  48. package/src/bamFile.ts +16 -23
  49. package/src/csi.ts +41 -14
  50. package/src/indexFile.ts +72 -3
  51. package/src/record.ts +39 -20
  52. package/src/streamBam.ts +11 -10
  53. package/src/util.ts +56 -4
  54. package/src/virtualOffset.ts +4 -0
package/esm/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAKlD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAA;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,MAAc;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjD,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,kCAAkC,SAAS,YAAY,MAAM,EAAE,CAChE,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiB,EAAE,KAAa,EAAE,GAAW;IACzE,IAAI,EAAE,GAAG,UAAU,CAAA;IACnB,IAAI,EAAE,GAAG,UAAU,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;QAClC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IAC7C,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IAC7C,OAAO,UAAU,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,UAA8B,EAC9B,IAAa,EACb,GAAY;IAEZ,OAAO,CACL,UAAU;QACV,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CACrE,CAAA;AACH,CAAC;AA4BD,iEAAiE;AACjE,4EAA4E;AAC5E,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,6EAA6E;AAC7E,8EAA8E;AAC9E,sDAAsD;AACtD,EAAE;AACF,oEAAoE;AACpE,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAe,EACf,uBAAgC;IAEhC,IACE,uBAAuB,KAAK,SAAS;QACrC,MAAM,CAAC,MAAM,IAAI,0BAA0B,EAC3C,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OACE,CAAC,GAAG,MAAM,CAAC,MAAM;QACjB,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,aAAa,GAAG,uBAAuB,EACvD,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;QAClC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,MAAqB;IACnE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IACvB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,MAAM,CAAA;IACf,CAAC;IAED,0DAA0D;IAC1D,IAAI,QAAiB,CAAA;IACrB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAA;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAA;QACtC,QAAQ,GAAG,EAAE,CAAA;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;YACvB,MAAM,GAAG,GACP,IAAI,CAAC,aAAa,GAAG,WAAW,IAAI,IAAI,CAAC,YAAY,GAAG,UAAU,CAAA;YACpE,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,CAAA;IACnB,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAA;QACzD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,YAAY,GAAY,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;IAC5C,IAAI,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,aAAa,CAAA;IAClD,IAAI,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,aAAa,CAAA;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAA;QAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAA;QAC9C,oEAAoE;QACpE,yEAAyE;QACzE,EAAE;QACF,oEAAoE;QACpE,2EAA2E;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,2EAA2E;QAC3E,6EAA6E;QAC7E,IACE,aAAa,GAAG,YAAY,GAAG,KAAK;YACpC,aAAa,GAAG,YAAY,GAAG,OAAO,EACtC,CAAC;YACD,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;YACxD,MAAM,GAAG,GACP,aAAa,GAAG,YAAY;gBAC5B,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAA;YACvD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,CAC/C,SAAS,CAAC,IAAI,EACd,KAAK,CAAC,IAAI,EACV,SAAS,CAAC,GAAG,EACb,KAAK,CAAC,WAAW,CAClB,CAAA;gBACD,YAAY,GAAG,aAAa,CAAA;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACxB,YAAY,GAAG,aAAa,CAAA;YAC5B,YAAY,GAAG,aAAa,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,YAAY,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,YAAY,CAAC,MAAe;IACnC,MAAM,GAAG,GAAY,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAA;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAA;QACzC,MAAM,GAAG,GACP,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa;YAChD,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QAChD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,4EAA4E;QAC5E,kCAAkC;QAClC,MAAM,YAAY,GAChB,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa;YAChD,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QAChD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,MAAc;IAC9D,MAAM,GAAG,GACP,KAAK,CAAC,MAAM,CAAE;QACd,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC;QACzB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC;QAC1B,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,CAAA;IAC5B,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE;QAClB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC;QACzB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC;QAC1B,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,CAAA;IAC5B,OAAO;QACL,SAAS,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;KAChD,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,kFAAkF;AAClF,kFAAkF;AAClF,iFAAiF;AACjF,kFAAkF;AAClF,iFAAiF;AACjF,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAC5B,MAAe,EACf,kBAAqC,EAAE;IAEvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAM;IACR,CAAC;IACD,sEAAsE;IACtE,6EAA6E;IAC7E,iEAAiE;IACjE,0EAA0E;IAC1E,mEAAmE;IACnE,yEAAyE;IACzE,uEAAuE;IACvE,iDAAiD;IACjD,MAAM,UAAU,GAAG,IAAI,KAAK,CAC1B,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAC3C,CAAA;IACD,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAE,CAAA;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QACtC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;IACxC,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAEhC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QAChC,2CAA2C;QAC3C,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,CAAA;QAC1B,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;YAC3B,IAAI,UAAU,CAAC,GAAG,CAAE,GAAG,GAAG,EAAE,CAAC;gBAC3B,EAAE,GAAG,GAAG,CAAA;YACV,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,GAAG,GAAG,CAAC,CAAA;YACd,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,KAAa;IAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CACnC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAC1C,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,4EAA4E;AAC5E,eAAe;AACf,MAAM,UAAU,YAAY,CAC1B,KAAiB,EACjB,KAAa,EACb,YAAmC;IAEnC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC3B,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,CACjB,CAAA;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3C,kEAAkE;IAClE,uDAAuD;IACvD,MAAM,UAAU,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9D,MAAM,UAAU,GAA0C,EAAE,CAAA;IAC5D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;IAEvC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CACzD,CAAA;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACvB,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAChB,CAAC;IACD,6EAA6E;IAC7E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;AAC3C,CAAC;AAED,2EAA2E;AAC3E,+EAA+E;AAC/E,4CAA4C;AAC5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAiB,EACjB,MAAc,EACd,KAAa,EACb,OAAkC;IAElC,IAAI,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;IACzD,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,MAAM,KAAK,GACT,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,aAAa;YAC7B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,WAAW;YAC3B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,SAAS;YACzB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,OAAO;YACvB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK;YACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;QACf,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QAC7C,IACE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;YAC3B,CAAC,KAAK,GAAG,QAAQ,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,EAC5D,CAAC;YACD,QAAQ,GAAG,KAAK,CAAA;YAChB,OAAO,GAAG,IAAI,CAAA;YACd,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AAC/D,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAC5B,UAAsB,EACtB,eAAwC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,WAAW,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,YAAY,CAC1B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CACtD,CAAA;gBACD,WAAW,CAAC,SAAS,CAAC,GAAG,OAAO,CAAA;gBAChC,WAAW,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;YAClC,CAAC;YACD,aAAa,GAAG,CAAC,GAAG,CAAC,CAAA;YACrB,SAAS,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,WAAW,IAAI,KAAK,CAAC,MAAM,CAAA;IAC7B,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAA;IAC/C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;IACxB,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAQD,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,cAAc;AACd,SAAS,MAAM,CAAC,CAAa;IAC3B,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;AAC9C,CAAC;AAED,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,iDAAiD;AACjD,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AACxE,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAC3B,OAAY,EACZ,KAAa,EACb,GAAW,EACX,GAAW,EACX,MAAW,EAAE;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAA;QACrB,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;gBACnB,MAAK;YACP,CAAC;iBAAM,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACb,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC5B,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -17,3 +17,4 @@ export declare class VirtualOffset {
17
17
  toString(): string;
18
18
  }
19
19
  export declare function fromBytes(bytes: Uint8Array, offset?: number): VirtualOffset;
20
+ export declare function compareOffsets(a: OffsetCoords, b: OffsetCoords): number;
@@ -17,4 +17,7 @@ export function fromBytes(bytes, offset = 0) {
17
17
  bytes[offset + 3] * 0x100 +
18
18
  bytes[offset + 2], (bytes[offset + 1] << 8) | bytes[offset]);
19
19
  }
20
+ export function compareOffsets(a, b) {
21
+ return a.blockPosition - b.blockPosition || a.dataPosition - b.dataPosition;
22
+ }
20
23
  //# sourceMappingURL=virtualOffset.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtualOffset.js","sourceRoot":"","sources":["../src/virtualOffset.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,aAAa;IACjB,aAAa,CAAQ;IACrB,YAAY,CAAQ;IAC3B,YAAY,aAAqB,EAAE,YAAoB;QACrD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA,CAAC,wCAAwC;QAC3E,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA,CAAC,sCAAsC;IACzE,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,CAAA;IACrD,CAAC;CACF;AACD,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,MAAM,GAAG,CAAC;IACrD,OAAO,IAAI,aAAa,CACtB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,aAAa;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,WAAW;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,SAAS;QAC9B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,OAAO;QAC5B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,KAAK;QAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,EACpB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAC3C,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"virtualOffset.js","sourceRoot":"","sources":["../src/virtualOffset.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,aAAa;IACjB,aAAa,CAAQ;IACrB,YAAY,CAAQ;IAC3B,YAAY,aAAqB,EAAE,YAAoB;QACrD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA,CAAC,wCAAwC;QAC3E,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA,CAAC,sCAAsC;IACzE,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,CAAA;IACrD,CAAC;CACF;AACD,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,MAAM,GAAG,CAAC;IACrD,OAAO,IAAI,aAAa,CACtB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,aAAa;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,WAAW;QAChC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,SAAS;QAC9B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,OAAO;QAC5B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,KAAK;QAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,EACpB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAC3C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAe,EAAE,CAAe;IAC7D,OAAO,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAA;AAC7E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gmod/bam",
3
- "version": "9.0.1",
3
+ "version": "10.0.1",
4
4
  "packageManager": "pnpm@11.15.1",
5
5
  "description": "Parser for BAM and BAM index (bai) files",
6
6
  "license": "MIT",
@@ -54,21 +54,21 @@
54
54
  "@gmod/bgzf-filehandle": "^6.6.0",
55
55
  "@gmod/shared-read-cache": "^1.7.2",
56
56
  "@jbrowse/quick-lru": "^7.3.5",
57
- "crc": "^4.3.2",
58
- "generic-filehandle2": "^2.2.1"
57
+ "generic-filehandle2": "^2.4.0"
59
58
  },
60
59
  "devDependencies": {
61
60
  "@eslint/js": "^10.0.1",
62
- "@types/node": "^25.9.5",
63
- "@vitest/coverage-v8": "^4.1.10",
64
- "eslint": "^10.8.0",
61
+ "@types/node": "^26.2.0",
62
+ "@vitest/coverage-v8": "^4.1.11",
63
+ "crc": "^4.3.2",
64
+ "eslint": "^10.9.0",
65
65
  "eslint-plugin-import-x": "^4.17.1",
66
66
  "git-cliff": "^2.13.1",
67
67
  "prettier": "^3.9.6",
68
68
  "rimraf": "^6.1.3",
69
69
  "typescript": "^6.0.3",
70
- "typescript-eslint": "^8.65.0",
71
- "vitest": "^4.1.10"
70
+ "typescript-eslint": "^8.67.0",
71
+ "vitest": "^4.1.11"
72
72
  },
73
73
  "publishConfig": {
74
74
  "access": "public"
package/src/bai.ts CHANGED
@@ -49,6 +49,23 @@ function roundUp(n: number, multiple: number) {
49
49
  return rem === 0 ? n : n - rem + multiple
50
50
  }
51
51
 
52
+ /**
53
+ * Older samtools leaves 0:0 in linear-index windows no read overlaps. htslib
54
+ * fills interior ones from the next entry on load (`hts.c`, "fill missing
55
+ * values"); this also fills leading ones, which htslib leaves at 0. Either
56
+ * way the entry stays a lower bound, since no record overlaps that window.
57
+ * Left as 0, a leading entry scores its whole absolute file offset in
58
+ * `indexCov`, and `getLowestChunk` falls back to the start of the file.
59
+ */
60
+ function fillLinearGaps(blocks: Float64Array, data: Float64Array) {
61
+ for (let j = blocks.length - 2; j >= 0; j--) {
62
+ if (blocks[j] === 0 && data[j] === 0) {
63
+ blocks[j] = blocks[j + 1]!
64
+ data[j] = data[j + 1]!
65
+ }
66
+ }
67
+ }
68
+
52
69
  export interface IndexCovEntry {
53
70
  start: number
54
71
  end: number
@@ -83,6 +100,9 @@ function reg2bins(beg: number, end: number) {
83
100
  }
84
101
 
85
102
  export default class BAI extends IndexFile<BaiParsed> {
103
+ protected minShift = BAI_LINEAR_SHIFT
104
+ protected depth = BAI_DEPTH
105
+
86
106
  async _parse(opts: BaseOpts): Promise<BaiParsed> {
87
107
  const bytes = await this.filehandle.readFile(opts)
88
108
  const dataView = new DataView(
@@ -192,6 +212,7 @@ export default class BAI extends IndexFile<BaiParsed> {
192
212
  linearDataPositions[j] = (bytes[curr + 1]! << 8) | bytes[curr]!
193
213
  curr += 8
194
214
  }
215
+ fillLinearGaps(linearBlockPositions, linearDataPositions)
195
216
 
196
217
  clampChunkEnds(Object.values(binIndex).flat(), linearBlockPositions)
197
218
  return {
package/src/bamFile.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { unzip, unzipChunkSlice } from '@gmod/bgzf-filehandle'
2
2
  import { SharedReadCache } from '@gmod/shared-read-cache'
3
- import crc32 from 'crc/calculators/crc32'
4
3
 
5
4
  import BAI from './bai.ts'
6
5
  import CSI from './csi.ts'
@@ -12,7 +11,11 @@ import {
12
11
  BAM_MAGIC,
13
12
  MAX_CONCURRENT_CHUNK_READS,
14
13
  appendInRange,
14
+ contentHash53,
15
+ decodeHeaderText,
16
+ optimizeChunks,
15
17
  parseRefSeqs,
18
+ readBlockSize,
16
19
  resolveFilehandle,
17
20
  throwIfAborted,
18
21
  } from './util.ts'
@@ -464,9 +467,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
464
467
  const parsed = parseRefSeqs(uncba, headLen + 8, this.renameRefSeq)
465
468
  let samHeader
466
469
  if (parsed) {
467
- const headerText = new TextDecoder('utf8').decode(
468
- uncba.subarray(8, 8 + headLen),
469
- )
470
+ const headerText = decodeHeaderText(uncba, headLen)
470
471
  this.header = headerText
471
472
  this.chrToIndex = parsed.chrToIndex
472
473
  this.indexToChr = parsed.indexToChr
@@ -539,7 +540,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
539
540
  if (chrId === undefined || !this.index) {
540
541
  return []
541
542
  }
542
- const chunks = await this.index.blocksForRange(chrId, min - 1, max, opts)
543
+ const chunks = await this.index.blocksForRange(chrId, min, max, opts)
543
544
  return this._fetchChunkFeatures(chunks, chrId, chr, min, max, opts)
544
545
  }
545
546
 
@@ -818,10 +819,12 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
818
819
  // make the count NaN.
819
820
  const readNameCounts = new Map<string, number>()
820
821
  const readIds = new Set<number>()
822
+ const names = new Array<string>(records.length)
821
823
 
822
824
  for (let i = 0, l = records.length; i < l; i++) {
823
825
  const r = records[i]!
824
826
  const name = r.name
827
+ names[i] = name
825
828
  readNameCounts.set(name, (readNameCounts.get(name) ?? 0) + 1)
826
829
  readIds.add(r.fileOffset)
827
830
  }
@@ -829,10 +832,9 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
829
832
  const matePromises: Promise<Chunk[]>[] = []
830
833
  for (let i = 0, l = records.length; i < l; i++) {
831
834
  const f = records[i]!
832
- const name = f.name
833
835
  if (
834
836
  this.index &&
835
- readNameCounts.get(name) === 1 &&
837
+ readNameCounts.get(names[i]!) === 1 &&
836
838
  (pairAcrossChr ||
837
839
  (f.next_refid === chrId &&
838
840
  Math.abs(f.start - f.next_pos) < maxInsertSize))
@@ -848,20 +850,11 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
848
850
  }
849
851
  }
850
852
 
851
- const map = new Map<string, Chunk>()
852
- const res = await Promise.all(matePromises)
853
- for (let i = 0, l = res.length; i < l; i++) {
854
- const chunks = res[i]!
855
- for (let j = 0, jl = chunks.length; j < jl; j++) {
856
- const m = chunks[j]!
857
- // Key on the virtual-offset span — the same key _cachedChunkFeatures
858
- // uses. Chunk.toString() also folds in `bin` and fetchedSize(), which
859
- // keeps two chunks covering an identical span apart here even though
860
- // the cache below collapses them, so their records came back twice.
861
- map.set(chunkCacheKey(m), m)
862
- }
863
- }
864
- const mateChunks = [...map.values()]
853
+ // Each mate's lookup is merged on its own, so two of them can resolve to
854
+ // different spans over the same records. Merging the union again makes
855
+ // them disjoint, which is what keeps a mate in the overlap from coming
856
+ // back once per span.
857
+ const mateChunks = optimizeChunks((await Promise.all(matePromises)).flat())
865
858
 
866
859
  // Bounded for the reason ADR 0008 bounds the main query path: a viewAsPairs
867
860
  // query over a busy region resolves to many distinct mate chunks, and an
@@ -961,7 +954,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
961
954
  const hasCpositions = cpositions.length > 0
962
955
 
963
956
  while (blockStart + 4 < ba.length) {
964
- const blockSize = dataView.getInt32(blockStart, true)
957
+ const blockSize = readBlockSize(dataView, blockStart)
965
958
  const blockEnd = blockStart + 4 + blockSize - 1
966
959
 
967
960
  if (hasDpositions) {
@@ -981,7 +974,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
981
974
  (blockStart - dpositions[pos]!) +
982
975
  chunk.minv.dataPosition +
983
976
  1
984
- : crc32(ba.subarray(blockStart, blockEnd)) >>> 0,
977
+ : contentHash53(ba, blockStart, blockEnd),
985
978
  dataView,
986
979
  )
987
980
 
package/src/csi.ts CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  } from './util.ts'
11
11
  import { VirtualOffset, fromBytes } from './virtualOffset.ts'
12
12
 
13
+ import type { ParsedIndexBase, RefIndex } from './indexFile.ts'
13
14
  import type { BaseOpts } from './util.ts'
14
15
 
15
16
  const CSI1_MAGIC = 21582659 // CSI\1
@@ -24,10 +25,18 @@ function rshift(num: number, bits: number) {
24
25
  return Math.floor(num / 2 ** bits)
25
26
  }
26
27
 
27
- export default class CSI extends IndexFile {
28
+ interface CsiRefIndex extends RefIndex {
29
+ loffsets: Map<number, VirtualOffset>
30
+ }
31
+
32
+ interface CsiParsed extends ParsedIndexBase<CsiRefIndex> {
33
+ csi: true
34
+ }
35
+
36
+ export default class CSI extends IndexFile<CsiParsed> {
28
37
  private maxBinNumber = 0
29
- private depth = 0
30
- private minShift = 0
38
+ protected depth = 0
39
+ protected minShift = 0
31
40
 
32
41
  // CSI omits the linear index that BAI's indexCov derives coverage from
33
42
  // (CSIv1.tex §3, hts-specs), so there's no equivalent to return.
@@ -74,7 +83,7 @@ export default class CSI extends IndexFile {
74
83
  }
75
84
 
76
85
  // fetch and parse the index
77
- async _parse(opts: BaseOpts) {
86
+ async _parse(opts: BaseOpts): Promise<CsiParsed> {
78
87
  const buffer = await this.filehandle.readFile(opts)
79
88
  const bytes = await unzip(buffer)
80
89
 
@@ -93,7 +102,7 @@ export default class CSI extends IndexFile {
93
102
 
94
103
  this.minShift = dataView.getInt32(4, true)
95
104
  this.depth = dataView.getInt32(8, true)
96
- this.maxBinNumber = ((1 << ((this.depth + 1) * 3)) - 1) / 7
105
+ this.maxBinNumber = (8 ** (this.depth + 1) - 1) / 7
97
106
  const maxBinNumber = this.maxBinNumber
98
107
  const auxLength = dataView.getInt32(12, true)
99
108
  // A tabix-only branch, which is why parseAuxData and the parseNameBytes it
@@ -128,10 +137,10 @@ export default class CSI extends IndexFile {
128
137
  if (bin > this.maxBinNumber) {
129
138
  curr += 28 + 16
130
139
  } else {
131
- // A bin's loffset is the smallest virtual offset of any record in it,
132
- // so the minimum over loffsets is already the minimum over the bin's
133
- // chunks — one read per bin instead of one per chunk. Checked against
134
- // every .csi in test/data: same answer on all 19.
140
+ // A bin's loffset is the linear-index entry at its first window, so
141
+ // the smallest over every bin is the first record's offset — one
142
+ // read per bin instead of one per chunk. Checked against every .csi
143
+ // in test/data: same answer on all 19.
135
144
  firstDataLine = minVirtualOffset(bytes, curr, 1, firstDataLine)
136
145
  curr += 8 // loffset
137
146
  const chunkCount = dataView.getInt32(curr, true)
@@ -149,6 +158,7 @@ export default class CSI extends IndexFile {
149
158
  const binCount = dataView.getInt32(curr, true)
150
159
  curr += 4
151
160
  const binIndex: Record<number, Chunk[]> = {}
161
+ const loffsets = new Map<number, VirtualOffset>()
152
162
  let pseudoBinStats
153
163
  for (let j = 0; j < binCount; j++) {
154
164
  const bin = dataView.getUint32(curr, true)
@@ -157,7 +167,8 @@ export default class CSI extends IndexFile {
157
167
  pseudoBinStats = parsePseudoBin(bytes, curr + 28)
158
168
  curr += 28 + 16
159
169
  } else {
160
- curr += 8 // skip loffset; firstDataLine was computed in the first pass
170
+ loffsets.set(bin, fromBytes(bytes, curr))
171
+ curr += 8
161
172
  const chunkCount = dataView.getInt32(curr, true)
162
173
  curr += 4
163
174
  const chunks = new Array<Chunk>(chunkCount)
@@ -175,6 +186,7 @@ export default class CSI extends IndexFile {
175
186
  clampChunkEnds(Object.values(binIndex).flat())
176
187
  return {
177
188
  binIndex,
189
+ loffsets,
178
190
  stats: pseudoBinStats,
179
191
  }
180
192
  }
@@ -188,12 +200,27 @@ export default class CSI extends IndexFile {
188
200
  }
189
201
  }
190
202
 
191
- // CSI has no linear index — every refId starts from the beginning of file.
192
- protected getLowestChunk() {
193
- return ZERO_OFFSET
203
+ /**
204
+ * CSI has no linear index, but each bin's `loffset` is the linear-index entry
205
+ * at the bin's first window (htslib's `update_loff`), so the finest bin at or
206
+ * left of `min` bounds the query from below the way BAI's linear index does.
207
+ * Walks left through siblings and then up to the parent, as `hts_itr_query`
208
+ * does for CSI.
209
+ */
210
+ protected getLowestChunk(refIndex: CsiRefIndex, min: number) {
211
+ const { loffsets } = refIndex
212
+ const leaves = 8 ** this.depth
213
+ let bin =
214
+ (leaves - 1) / 7 +
215
+ Math.min(Math.floor(min / 2 ** this.minShift), leaves - 1)
216
+ while (bin > 0 && !loffsets.has(bin)) {
217
+ const parent = Math.floor((bin - 1) / 8)
218
+ bin = bin > parent * 8 + 1 ? bin - 1 : parent
219
+ }
220
+ return loffsets.get(bin) ?? ZERO_OFFSET
194
221
  }
195
222
 
196
- // ...and so there is nothing to bound the far end of a query with either, so
223
+ // No linear index means nothing to forecast the far end of a query with, so
197
224
  // estimatedBytesForRegions keeps summing every chunk on a CSI-indexed file.
198
225
  protected getHighestChunk() {
199
226
  return undefined
package/src/indexFile.ts CHANGED
@@ -2,6 +2,7 @@ import { SharedReadCache } from '@gmod/shared-read-cache'
2
2
  import QuickLRU from '@jbrowse/quick-lru'
3
3
 
4
4
  import { chunksLikelyRead, optimizeChunks } from './util.ts'
5
+ import { compareOffsets } from './virtualOffset.ts'
5
6
 
6
7
  import type Chunk from './chunk.ts'
7
8
  import type { BaseOpts } from './util.ts'
@@ -48,6 +49,58 @@ export function memoizeByRefId<T>(
48
49
  }
49
50
  }
50
51
 
52
+ /**
53
+ * The virtual offset past which a coordinate-sorted file holds nothing
54
+ * overlapping `[.., end)`, from the binning index alone: htslib's `max_off`
55
+ * (`hts_itr_query` in hts.c).
56
+ *
57
+ * Walk right from the finest bin after the one holding `end - 1`, stepping up
58
+ * to the parent at every first child, so each bin visited begins at or past
59
+ * `end` and never overlaps the query. Every record in such a bin starts at or
60
+ * past `end`, so the first chunk of the first bin that exists is a record past
61
+ * the query, and in a sorted file so is every record after it.
62
+ *
63
+ * A bound, unlike the linear-index forecast in `chunksLikelyRead`: it rests on
64
+ * the same sort order `appendInRange` and the early stop already assume, and
65
+ * cannot drop a record they would keep. See ADR 0023 for why the caller drops
66
+ * whole merged chunks with it rather than trimming them.
67
+ */
68
+ export function maxOffset(
69
+ binIndex: Record<number, Chunk[]>,
70
+ end: number,
71
+ minShift: number,
72
+ depth: number,
73
+ ) {
74
+ if (end > 2 ** (minShift + depth * 3)) {
75
+ return undefined
76
+ }
77
+ const binCount = (8 ** (depth + 1) - 1) / 7
78
+ let bin = (8 ** depth - 1) / 7 + Math.floor((end - 1) / 2 ** minShift) + 1
79
+ if (bin >= binCount) {
80
+ bin = 0
81
+ }
82
+ for (;;) {
83
+ while (bin % 8 === 1) {
84
+ bin = (bin - 1) / 8
85
+ }
86
+ if (bin === 0) {
87
+ return undefined
88
+ }
89
+ const chunks = binIndex[bin]
90
+ if (chunks?.length) {
91
+ let lowest = chunks[0]!.minv
92
+ for (let i = 1; i < chunks.length; i++) {
93
+ const minv = chunks[i]!.minv
94
+ if (compareOffsets(minv, lowest) < 0) {
95
+ lowest = minv
96
+ }
97
+ }
98
+ return lowest
99
+ }
100
+ bin++
101
+ }
102
+ }
103
+
51
104
  export default abstract class IndexFile<
52
105
  TParsed extends ParsedIndexBase = ParsedIndexBase,
53
106
  > {
@@ -79,6 +132,11 @@ export default abstract class IndexFile<
79
132
  end?: number,
80
133
  ): Promise<{ start: number; end: number; score: number }[]>
81
134
 
135
+ // The binning scheme: the finest bins are 2^minShift wide, and there are
136
+ // depth levels below bin 0. BAI is CSI with minShift 14 and depth 5.
137
+ protected abstract minShift: number
138
+ protected abstract depth: number
139
+
82
140
  // Bin numbers that overlap [min, max). Subclasses implement BAI's fixed
83
141
  // 5-level scheme or CSI's configurable scheme (SAMv1.pdf §5.1.1, CSIv1.tex §2).
84
142
  protected abstract reg2bins(
@@ -87,7 +145,8 @@ export default abstract class IndexFile<
87
145
  ): readonly (readonly [number, number])[]
88
146
 
89
147
  // Lower-bound virtual offset for chunks that could contain alignments in
90
- // [min, ...). BAI uses its linear index; CSI has none and returns 0:0.
148
+ // [min, ...). BAI uses its linear index, CSI the loffset of a bin at or left
149
+ // of min.
91
150
  protected abstract getLowestChunk(
92
151
  refIndex: RefIndex,
93
152
  min: number,
@@ -133,7 +192,16 @@ export default abstract class IndexFile<
133
192
  }
134
193
  }
135
194
  }
136
- return optimizeChunks(chunks, this.getLowestChunk(ba, min))
195
+ const merged = optimizeChunks(chunks, this.getLowestChunk(ba, min))
196
+ const past = maxOffset(binIndex, max, this.minShift, this.depth)
197
+ if (past) {
198
+ let n = merged.length
199
+ while (n > 0 && compareOffsets(merged[n - 1]!.minv, past) >= 0) {
200
+ n--
201
+ }
202
+ merged.length = n
203
+ }
204
+ return merged
137
205
  }
138
206
 
139
207
  // SYNC: ~/src/gmod/tabix-js/src/indexFile.ts parse — same shape and the same
@@ -197,7 +265,8 @@ export default abstract class IndexFile<
197
265
  * exists — was being told 5.6x the truth on exactly the windows a reader
198
266
  * spends their time in, and cannot answer it by zooming: every window narrower
199
267
  * than a linear-index interval resolves to the same chunks and so to the same
200
- * number.
268
+ * number. The table predates `max_off` (ADR 0023), which now drops most of
269
+ * the gap between the first two columns from `blocksForRange` itself.
201
270
  *
202
271
  * Still summed over merged chunks rather than per region, so two regions
203
272
  * sharing a chunk are charged for it once.
package/src/record.ts CHANGED
@@ -440,16 +440,18 @@ export default class BamRecord {
440
440
  }
441
441
 
442
442
  // QUAL is present whenever the record has bases — independent of the unmapped
443
- // flag (unmapped reads routinely carry SEQ/QUAL). A zero-length SEQ means
444
- // there is no quality to return.
443
+ // flag (unmapped reads routinely carry SEQ/QUAL). null for a zero-length SEQ,
444
+ // and for a QUAL of `*`, which BAM stores as 0xFF in every byte (SAMv1
445
+ // §4.2.3). htslib decides on the first byte alone, and so does this.
445
446
  get qual() {
446
447
  const seqLen = this.seq_length
447
448
  if (seqLen === 0) {
448
449
  return null
449
- } else {
450
- const p = this.seqStart + ((seqLen + 1) >> 1)
451
- return this._byteArray.subarray(p, p + seqLen)
452
450
  }
451
+ const p = this.seqStart + ((seqLen + 1) >> 1)
452
+ return this._byteArray[p] === 0xff
453
+ ? null
454
+ : this._byteArray.subarray(p, p + seqLen)
453
455
  }
454
456
 
455
457
  get strand() {
@@ -475,7 +477,7 @@ export default class BamRecord {
475
477
  return this.seqStart + ((seqLen + 1) >> 1) + seqLen
476
478
  }
477
479
 
478
- // batch fromCharCode: fastest for typical name lengths (see benchmarks/string-building.bench.ts)
480
+ // batch fromCharCode: fastest for typical name lengths (benchmarks/string-building.bench.ts, removed in 36a3968)
479
481
  //
480
482
  // Deliberately NOT memoized, unlike end/tags/length_on_ref. Consumers read a
481
483
  // read name about once — jbrowse-components' buildBaseFeatureData copies it
@@ -510,8 +512,8 @@ export default class BamRecord {
510
512
  }
511
513
 
512
514
  getTag(tagName: string) {
513
- if (this._cachedTags !== undefined) {
514
- return this._cachedTags[tagName]
515
+ if (this._cachedTags !== undefined || tagName === 'CG') {
516
+ return this.tags[tagName]
515
517
  }
516
518
  return this._findTag(tagName, false)
517
519
  }
@@ -621,6 +623,9 @@ export default class BamRecord {
621
623
  )
622
624
  p = end
623
625
  }
626
+ if (this._hasCGPlaceholder() && isNumericCigar(tags.CG)) {
627
+ delete tags.CG
628
+ }
624
629
  return tags
625
630
  }
626
631
 
@@ -672,7 +677,7 @@ export default class BamRecord {
672
677
  return !!(this.flags & Constants.BAM_FSUPPLEMENTARY)
673
678
  }
674
679
 
675
- // Benchmark results for CIGAR parsing strategies (see benchmarks/cigar-lifecycle.bench.ts):
680
+ // Benchmark results for CIGAR parsing strategies (benchmarks/cigar-strategies.bench.ts, removed in 36a3968):
676
681
  //
677
682
  // Aligned data:
678
683
  // - Plain array is 1.6-1.8x faster than Uint32Array for small CIGARs (≤50 ops)
@@ -696,12 +701,23 @@ export default class BamRecord {
696
701
  // htslib stores the placeholder as exactly two ops: <seqlen>S<reflen>N.
697
702
  if (numCigarOps === 2) {
698
703
  const cigop = this._dataView.getInt32(p, true)
699
- return (cigop & 0xf) === CIGAR_SOFT_CLIP && cigop >> 4 === this.seq_length
704
+ return (
705
+ (cigop & 0xf) === CIGAR_SOFT_CLIP && cigop >>> 4 === this.seq_length
706
+ )
700
707
  } else {
701
708
  return false
702
709
  }
703
710
  }
704
711
 
712
+ // SAMv1 §4.2.2: with the placeholder and a CG tag, the tag is the CIGAR and
713
+ // a reader removes it from the tags, as htslib does
714
+ private _hasCGPlaceholder() {
715
+ return this._isCGTagPattern(
716
+ this.b0 + this.read_name_length,
717
+ this.flag_nc & 0xffff,
718
+ )
719
+ }
720
+
705
721
  private _computeLengthOnRef(): number {
706
722
  const flag_nc = this._dataView.getInt32(this._start + 16, true)
707
723
  if (flag_nc & (Constants.BAM_FUNMAP << 16)) {
@@ -716,7 +732,7 @@ export default class BamRecord {
716
732
  if ((cigop2 & 0xf) !== CIGAR_REF_SKIP) {
717
733
  console.warn('CG tag with no N tag')
718
734
  }
719
- return cigop2 >> 4
735
+ return cigop2 >>> 4
720
736
  }
721
737
 
722
738
  const absOffset = this._byteArray.byteOffset + p
@@ -732,7 +748,7 @@ export default class BamRecord {
732
748
  let lref = 0
733
749
  for (let c = 0; c < numCigarOps; ++c) {
734
750
  const co = cigarView[c]!
735
- lref += (co >> 4) * ((CIGAR_CONSUMES_REF_MASK >> (co & 0xf)) & 1)
751
+ lref += (co >>> 4) * ((CIGAR_CONSUMES_REF_MASK >> (co & 0xf)) & 1)
736
752
  }
737
753
  return lref
738
754
  }
@@ -740,7 +756,7 @@ export default class BamRecord {
740
756
  let lref = 0
741
757
  for (let c = 0; c < numCigarOps; ++c) {
742
758
  const co = this._dataView.getInt32(p + c * 4, true)
743
- lref += (co >> 4) * ((CIGAR_CONSUMES_REF_MASK >> (co & 0xf)) & 1)
759
+ lref += (co >>> 4) * ((CIGAR_CONSUMES_REF_MASK >> (co & 0xf)) & 1)
744
760
  }
745
761
  return lref
746
762
  }
@@ -761,10 +777,10 @@ export default class BamRecord {
761
777
  const p = this.b0 + this.read_name_length
762
778
 
763
779
  if (this._isCGTagPattern(p, numCigarOps)) {
764
- // getTag, not this.tags: the real CIGAR lives in one tag, so there's no
765
- // reason to decode every other tag on the record to reach it
766
- const cg = this.getTag('CG')
767
- return isNumericCigar(cg) ? cg : new Uint32Array(0)
780
+ const cg = this._findTag('CG', false)
781
+ if (isNumericCigar(cg)) {
782
+ return cg
783
+ }
768
784
  }
769
785
 
770
786
  const absOffset = this._byteArray.byteOffset + p
@@ -811,18 +827,21 @@ export default class BamRecord {
811
827
  let result = ''
812
828
  for (let i = 0, l = numeric.length; i < l; i++) {
813
829
  const packed = numeric[i]!
814
- result += packed >> 4
830
+ result += packed >>> 4
815
831
  result += String.fromCharCode(ASCII_CIGAR_CODES[packed & 0xf]!)
816
832
  }
817
833
  return result
818
834
  }
819
835
 
820
836
  get num_cigar_ops() {
821
- return this.flag_nc & 0xffff
837
+ return this._hasCGPlaceholder()
838
+ ? this.NUMERIC_CIGAR.length
839
+ : this.flag_nc & 0xffff
822
840
  }
823
841
 
842
+ // the stored CIGAR field, which for a long CIGAR is the two-op placeholder
824
843
  get num_cigar_bytes() {
825
- return this.num_cigar_ops << 2
844
+ return (this.flag_nc & 0xffff) << 2
826
845
  }
827
846
 
828
847
  get read_name_length() {