@@ -7,12 +7,2 @@ /** | ||
| export type GenotypeCallback = (str: string, start: number, end: number, sampleIdx: number) => unknown; | ||
| /** | ||
| * Process genotypes by calling a callback for each one, avoiding intermediate | ||
| * object/string allocation. This is useful for operations like counting alleles | ||
| * where you don't need to build the full genotypes object. | ||
| * | ||
| * @param format - The FORMAT field from the VCF line | ||
| * @param prerest - The sample data portion of the VCF line (after FORMAT) | ||
| * @param samplesLen - Number of samples | ||
| * @param callback - Called for each genotype with (string, startIndex, endIndex) | ||
| */ | ||
| export declare function processGenotypes(format: string, prerest: string, samplesLen: number, callback: GenotypeCallback): void; |
+28
-13
@@ -14,6 +14,28 @@ "use strict"; | ||
| */ | ||
| const TAB = 9; | ||
| const COLON = 58; | ||
| const G = 71; | ||
| const T = 84; | ||
| // Column index of the exact "GT" field among the colon-separated FORMAT | ||
| // keys, or -1 if absent. Matches the field exactly so keys that merely | ||
| // contain "GT" (e.g. GATK's PGT) are not mistaken for it. | ||
| function gtColumnIndex(format) { | ||
| let col = 0; | ||
| let start = 0; | ||
| const len = format.length; | ||
| for (let j = 0; j <= len; j++) { | ||
| if (j === len || format.charCodeAt(j) === COLON) { | ||
| if (j - start === 2 && | ||
| format.charCodeAt(start) === G && | ||
| format.charCodeAt(start + 1) === T) { | ||
| return col; | ||
| } | ||
| col++; | ||
| start = j + 1; | ||
| } | ||
| } | ||
| return -1; | ||
| } | ||
| function processGenotypes(format, prerest, samplesLen, callback) { | ||
| const prerestLen = prerest.length; | ||
| const TAB = 9; | ||
| const COLON = 58; | ||
| let pos = 0; | ||
@@ -32,9 +54,8 @@ // Fast path: format is exactly "GT" | ||
| } | ||
| // Check if GT field exists | ||
| const gtIdx = format.indexOf('GT'); | ||
| if (gtIdx === -1) { | ||
| const colonCount = gtColumnIndex(format); | ||
| if (colonCount === -1) { | ||
| return; | ||
| } | ||
| // GT is first field but not only field | ||
| if (gtIdx === 0) { | ||
| if (colonCount === 0) { | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -55,9 +76,3 @@ const start = pos; | ||
| } | ||
| // GT is not first field - need to skip to the right column | ||
| let colonCount = 0; | ||
| for (let j = 0; j < gtIdx; j++) { | ||
| if (format.charCodeAt(j) === COLON) { | ||
| colonCount++; | ||
| } | ||
| } | ||
| // GT is not first field - skip to its column (colonCount fields precede it) | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -64,0 +79,0 @@ const sampleStart = pos; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"processGenotypes.js","sourceRoot":"","sources":["../src/processGenotypes.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"processGenotypes.js","sourceRoot":"","sources":["../src/processGenotypes.ts"],"names":[],"mappings":"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"} |
@@ -7,12 +7,2 @@ /** | ||
| export type GenotypeCallback = (str: string, start: number, end: number, sampleIdx: number) => unknown; | ||
| /** | ||
| * Process genotypes by calling a callback for each one, avoiding intermediate | ||
| * object/string allocation. This is useful for operations like counting alleles | ||
| * where you don't need to build the full genotypes object. | ||
| * | ||
| * @param format - The FORMAT field from the VCF line | ||
| * @param prerest - The sample data portion of the VCF line (after FORMAT) | ||
| * @param samplesLen - Number of samples | ||
| * @param callback - Called for each genotype with (string, startIndex, endIndex) | ||
| */ | ||
| export declare function processGenotypes(format: string, prerest: string, samplesLen: number, callback: GenotypeCallback): void; |
+28
-13
@@ -11,6 +11,28 @@ /** | ||
| */ | ||
| const TAB = 9; | ||
| const COLON = 58; | ||
| const G = 71; | ||
| const T = 84; | ||
| // Column index of the exact "GT" field among the colon-separated FORMAT | ||
| // keys, or -1 if absent. Matches the field exactly so keys that merely | ||
| // contain "GT" (e.g. GATK's PGT) are not mistaken for it. | ||
| function gtColumnIndex(format) { | ||
| let col = 0; | ||
| let start = 0; | ||
| const len = format.length; | ||
| for (let j = 0; j <= len; j++) { | ||
| if (j === len || format.charCodeAt(j) === COLON) { | ||
| if (j - start === 2 && | ||
| format.charCodeAt(start) === G && | ||
| format.charCodeAt(start + 1) === T) { | ||
| return col; | ||
| } | ||
| col++; | ||
| start = j + 1; | ||
| } | ||
| } | ||
| return -1; | ||
| } | ||
| export function processGenotypes(format, prerest, samplesLen, callback) { | ||
| const prerestLen = prerest.length; | ||
| const TAB = 9; | ||
| const COLON = 58; | ||
| let pos = 0; | ||
@@ -29,9 +51,8 @@ // Fast path: format is exactly "GT" | ||
| } | ||
| // Check if GT field exists | ||
| const gtIdx = format.indexOf('GT'); | ||
| if (gtIdx === -1) { | ||
| const colonCount = gtColumnIndex(format); | ||
| if (colonCount === -1) { | ||
| return; | ||
| } | ||
| // GT is first field but not only field | ||
| if (gtIdx === 0) { | ||
| if (colonCount === 0) { | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -52,9 +73,3 @@ const start = pos; | ||
| } | ||
| // GT is not first field - need to skip to the right column | ||
| let colonCount = 0; | ||
| for (let j = 0; j < gtIdx; j++) { | ||
| if (format.charCodeAt(j) === COLON) { | ||
| colonCount++; | ||
| } | ||
| } | ||
| // GT is not first field - skip to its column (colonCount fields precede it) | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -61,0 +76,0 @@ const sampleStart = pos; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"processGenotypes.js","sourceRoot":"","sources":["../src/processGenotypes.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,OAAe,EACf,UAAkB,EAClB,QAA0B;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAA;IACjC,MAAM,GAAG,GAAG,CAAC,CAAA;IACb,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,GAAG,GAAG,CAAC,CAAA;IAEX,oCAAoC;IACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAA;YACjB,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3D,GAAG,EAAE,CAAA;YACP,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAClC,GAAG,EAAE,CAAA;QACP,CAAC;QACD,OAAM;IACR,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAM;IACR,CAAC;IAED,uCAAuC;IACvC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAA;YACjB,OACE,GAAG,GAAG,UAAU;gBAChB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK;gBACjC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAC/B,CAAC;gBACD,GAAG,EAAE,CAAA;YACP,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAClC,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3D,GAAG,EAAE,CAAA;YACP,CAAC;YACD,GAAG,EAAE,CAAA;QACP,CAAC;QACD,OAAM;IACR,CAAC;IAED,2DAA2D;IAC3D,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACnC,UAAU,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,GAAG,CAAA;QACvB,IAAI,MAAM,GAAG,GAAG,CAAA;QAChB,OAAO,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YACjE,MAAM,EAAE,CAAA;QACV,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,UAAU,GAAG,WAAW,CAAA;QAC5B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACpD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;oBACrC,MAAK;gBACP,CAAC;gBACD,MAAM,EAAE,CAAA;gBACR,UAAU,GAAG,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QACD,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;IAClB,CAAC;AACH,CAAC"} | ||
| {"version":3,"file":"processGenotypes.js","sourceRoot":"","sources":["../src/processGenotypes.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,MAAM,GAAG,GAAG,CAAC,CAAA;AACb,MAAM,KAAK,GAAG,EAAE,CAAA;AAChB,MAAM,CAAC,GAAG,EAAE,CAAA;AACZ,MAAM,CAAC,GAAG,EAAE,CAAA;AAEZ,wEAAwE;AACxE,uEAAuE;AACvE,0DAA0D;AAC1D,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAA;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAChD,IACE,CAAC,GAAG,KAAK,KAAK,CAAC;gBACf,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC9B,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAClC,CAAC;gBACD,OAAO,GAAG,CAAA;YACZ,CAAC;YACD,GAAG,EAAE,CAAA;YACL,KAAK,GAAG,CAAC,GAAG,CAAC,CAAA;QACf,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAA;AACX,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,OAAe,EACf,UAAkB,EAClB,QAA0B;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAA;IACjC,IAAI,GAAG,GAAG,CAAC,CAAA;IAEX,oCAAoC;IACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAA;YACjB,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3D,GAAG,EAAE,CAAA;YACP,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAClC,GAAG,EAAE,CAAA;QACP,CAAC;QACD,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAM;IACR,CAAC;IAED,uCAAuC;IACvC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAA;YACjB,OACE,GAAG,GAAG,UAAU;gBAChB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK;gBACjC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAC/B,CAAC;gBACD,GAAG,EAAE,CAAA;YACP,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAClC,OAAO,GAAG,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3D,GAAG,EAAE,CAAA;YACP,CAAC;YACD,GAAG,EAAE,CAAA;QACP,CAAC;QACD,OAAM;IACR,CAAC;IAED,4EAA4E;IAC5E,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,GAAG,CAAA;QACvB,IAAI,MAAM,GAAG,GAAG,CAAA;QAChB,OAAO,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YACjE,MAAM,EAAE,CAAA;QACV,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,UAAU,GAAG,WAAW,CAAA;QAC5B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACpD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;oBACrC,MAAK;gBACP,CAAC;gBACD,MAAM,EAAE,CAAA;gBACR,UAAU,GAAG,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QACD,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;IAClB,CAAC;AACH,CAAC"} |
+1
-1
| { | ||
| "name": "@gmod/vcf", | ||
| "version": "7.0.8", | ||
| "version": "7.0.9", | ||
| "description": "High performance streaming Variant Call Format (VCF) parser in pure JavaScript", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+1
-1
@@ -6,3 +6,3 @@ # vcf-js | ||
| [](https://npmjs.org/package/@gmod/vcf) | ||
| [](https://github.com/GMOD/vcf-js/actions) | ||
|  | ||
@@ -9,0 +9,0 @@ ## Usage |
+32
-14
@@ -23,2 +23,30 @@ /** | ||
| */ | ||
| const TAB = 9 | ||
| const COLON = 58 | ||
| const G = 71 | ||
| const T = 84 | ||
| // Column index of the exact "GT" field among the colon-separated FORMAT | ||
| // keys, or -1 if absent. Matches the field exactly so keys that merely | ||
| // contain "GT" (e.g. GATK's PGT) are not mistaken for it. | ||
| function gtColumnIndex(format: string) { | ||
| let col = 0 | ||
| let start = 0 | ||
| const len = format.length | ||
| for (let j = 0; j <= len; j++) { | ||
| if (j === len || format.charCodeAt(j) === COLON) { | ||
| if ( | ||
| j - start === 2 && | ||
| format.charCodeAt(start) === G && | ||
| format.charCodeAt(start + 1) === T | ||
| ) { | ||
| return col | ||
| } | ||
| col++ | ||
| start = j + 1 | ||
| } | ||
| } | ||
| return -1 | ||
| } | ||
| export function processGenotypes( | ||
@@ -31,4 +59,2 @@ format: string, | ||
| const prerestLen = prerest.length | ||
| const TAB = 9 | ||
| const COLON = 58 | ||
| let pos = 0 | ||
@@ -49,5 +75,4 @@ | ||
| // Check if GT field exists | ||
| const gtIdx = format.indexOf('GT') | ||
| if (gtIdx === -1) { | ||
| const colonCount = gtColumnIndex(format) | ||
| if (colonCount === -1) { | ||
| return | ||
@@ -57,3 +82,3 @@ } | ||
| // GT is first field but not only field | ||
| if (gtIdx === 0) { | ||
| if (colonCount === 0) { | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -77,10 +102,3 @@ const start = pos | ||
| // GT is not first field - need to skip to the right column | ||
| let colonCount = 0 | ||
| for (let j = 0; j < gtIdx; j++) { | ||
| if (format.charCodeAt(j) === COLON) { | ||
| colonCount++ | ||
| } | ||
| } | ||
| // GT is not first field - skip to its column (colonCount fields precede it) | ||
| for (let idx = 0; idx < samplesLen; idx++) { | ||
@@ -87,0 +105,0 @@ const sampleStart = pos |
164167
0.89%3529
0.77%