@fishka/seqio 0.4.0 → 0.6.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.
- package/README.md +50 -39
- package/dist/abif/index.d.mts +192 -97
- package/dist/abif/index.d.ts +192 -97
- package/dist/abif/index.js +1 -1
- package/dist/abif/index.js.map +1 -1
- package/dist/abif/index.mjs +1 -1
- package/dist/abif/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
function T(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function N(e,t,n){return e.subarray(t,t+n)}function q(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var v=128,x=28;function P(e){if(e.byteLength<v)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(T(N(e,0,4))!=="ABIF")if(e.byteLength>=132&&T(N(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<v)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=B(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==x)throw new Error(`Expected dir element size ${x}, got ${i.elementSize}`);let c=i.raw?.elementCount??i.elementCount,u=Math.max(0,c),d=r.getInt32(n+6+20,false);if(d<0||d+u*x>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${d}, entries=${u}, file=${e.byteLength-n}`);let s=[];for(let E=0;E<u;E++)s.push(B(e,r,n+d+E*x,n));let g=i.raw?.dataSize??u*x,S=n+d+u*x,b=Math.min(Math.max(0,g-u*x),Math.max(0,e.byteLength-S)),h={entryCount:u,rawEntryCount:c,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:g,dataOffset:d,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(N(e,S,b))},y=new Uint8Array(N(e,n+6+x,v-6-x)),A=t===128?new Uint8Array(N(e,0,128)):void 0,C=G(e,n,d,g,s,t);return {version:a,tdir:h,entries:s,macBinaryOffset:t,macBinaryHeader:A,headerReserved:y,unreferencedRanges:C}}function G(e,t,n,r,a,i){let c=e.byteLength,u=[];i===128&&u.push([0,128]),u.push([t,t+v]);let d=Math.max(a.length*x,Math.max(0,r));u.push([t+n,t+n+d]);for(let h of a)if(h.raw&&!h.raw.inline){let y=t+h.raw.dataOffset;u.push([y,y+h.payload.byteLength]);}let s=u.map(([h,y])=>[Math.max(0,Math.min(h,c)),Math.max(0,Math.min(y,c))]).filter(([h,y])=>y>h).sort((h,y)=>h[0]-y[0]),g=[];for(let[h,y]of s){let A=g[g.length-1];A&&h<=A[1]?A[1]=Math.max(A[1],y):g.push([h,y]);}let S=[],b=0;for(let[h,y]of g)h>b&&S.push({offset:b,bytes:new Uint8Array(N(e,b,h-b))}),b=Math.max(b,y);return b<c&&S.push({offset:b,bytes:new Uint8Array(N(e,b,c-b))}),S}function B(e,t,n,r){let a=T(N(e,n,4)),i=t.getInt32(n+4,false),c=t.getInt16(n+8,false),u=t.getInt16(n+10,false),d=t.getInt32(n+12,false),s=t.getInt32(n+16,false),g=t.getInt32(n+24,false),S=Math.max(0,d*Math.max(0,u)),b=s>=0?s:S,h=s>=0?s<=4:S<=4,y=Math.max(0,u>0?Math.min(d,Math.floor(b/u)):Math.min(d,b)),A,C;if(h)C=-1,A=new Uint8Array(N(e,n+20,Math.min(4,b)));else {C=t.getInt32(n+20,false);let o=r+C;if(C<0||o+b>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${b})`);A=new Uint8Array(N(e,o,b));}let E=new Uint8Array(N(e,n+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:u,elementCount:y,payload:A,dataHandle:g,raw:{elementCount:d,dataSize:s,dataOffset:C,inline:h,dataOffsetBytes:E}}}function re(e){let t=e.entries.length,n=v,r=t*x,a=n+r,i=new Array(t);for(let s=0;s<t;s++){let g=e.entries[s].payload.byteLength;g>4?(i[s]=a,a+=g):i[s]=-1;}let c=a,u=new Uint8Array(c),d=w(u);u.set(F("ABIF"),0),d.setInt16(4,e.version,false),O({tagName:"tdir",tagNumber:1,elementType:1023,elementSize:x,elementCount:t,payload:new Uint8Array(0),dataHandle:0},u,d,6,-1,r,n);for(let s=0;s<t;s++){let g=e.entries[s];O(g,u,d,n+s*x,i[s]);}for(let s=0;s<t;s++){let g=i[s];g>=0&&u.set(e.entries[s].payload,g);}return u}function O(e,t,n,r,a,i,c){if(e.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${e.tagName}"`);t.set(F(e.tagName),r),n.setInt32(r+4,e.tagNumber,false),n.setInt16(r+8,e.elementType,false),n.setInt16(r+10,e.elementSize,false),n.setInt32(r+12,e.elementCount,false);let u=i??e.payload.byteLength;if(n.setInt32(r+16,u,false),c!==void 0)n.setInt32(r+20,c,false);else if(u<=4)t.fill(0,r+20,r+24),t.set(e.payload.subarray(0,u),r+20);else {if(a<0)throw new Error(`External payload requires offset for ${e.tagName}${e.tagNumber}`);n.setInt32(r+20,a,false);}n.setInt32(r+24,e.dataHandle,false);}function p(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ae(e,t){return e.entries.filter(n=>n.tagName===t)}function $(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=p(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r):e.entries.push({tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function le(e,t){let n=p(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function D(e){let t=p(e,"FWO_",1);return t?T(t.payload.subarray(0,t.elementCount)):"GATC"}function z(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function H(e){return !!(p(e,"DATA",9)&&p(e,"DATA",10)&&p(e,"DATA",11)&&p(e,"DATA",12))}function ue(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function me(e){let t=p(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function fe(e){let t=D(e);if(!z(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function ce(e){let t=a=>T(a.payload.subarray(0,a.elementCount)).replace(/\0+$/g,""),n=p(e,"PBAS",2);if(n)return t(n);let r=p(e,"PBAS",1);if(r)return t(r)}function ge(e){let t=p(e,"PCON",2)??p(e,"PCON",1);if(!t)return;let n=new Array(t.elementCount);for(let r=0;r<t.elementCount;r++)n[r]=t.payload[r];return n}function de(e){let t=p(e,"PLOC",2)??p(e,"PLOC",1);if(!t)return;if(t.elementSize!==2)throw new Error(`PLOC: expected elementSize=2, got ${t.elementSize}`);let n=w(t.payload),r=new Array(t.elementCount);for(let a=0;a<t.elementCount;a++)r[a]=n.getUint16(a*2,false);return r}function be(e){let t=p(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function Se(e,t){$(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function Ce(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));$(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function we(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);$(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Ne(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),c=new Uint8Array(1+i);c[0]=i,c.set(a.subarray(0,i),1),$(e,"SPAC",2,c,{elementType:18,elementSize:1,elementCount:1+i});let u=new Uint8Array(4);w(u).setFloat32(0,t,false),$(e,"SPAC",3,u,{elementType:7,elementSize:4,elementCount:1});}function xe(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Te(e){if(!H(e))for(let t=1;t<=4;t++){let n=p(e,"DATA",t);if(!n)continue;let r=8+t;p(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var W={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function M(e){return W[e]??(e>=1024?`user${e}`:`type${e}`)}function Q(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function X(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function _(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function R(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function U(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let c=0;c<a;c++)i.push(r(c*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function V(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:T(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return U(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return U(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return U(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return U(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return U(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),c=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:c}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:T(N(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Y(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Q(e.value);case "string":return X(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${M(t)} ${_(e.value)}`;case "unknown":return `${M(t)} ${_(e.value)}`}}function Ue(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=P(n),a=r.entries.map(o=>{let l=o.tagName==="PCON"&&o.elementSize===1?V(1,o.elementCount,o.payload):V(o.elementType,o.elementCount,o.payload);return {tag:o.tagName,tagNumber:o.tagNumber,elementType:o.elementType,elementTypeName:M(o.elementType),elementSize:o.elementSize,elementCount:o.elementCount,rawElementCount:o.raw?.elementCount??o.elementCount,dataSize:o.raw?.dataSize??o.elementCount*o.elementSize,dataOffset:o.raw?.dataOffset??-1,inline:o.raw?.inline??o.elementCount*o.elementSize<=4,decoded:l,preview:Y(l,o.elementType)}}),i=D(r);z(i)||(i="GATC");let c={},u={A:[],C:[],G:[],T:[]},d={A:[],C:[],G:[],T:[]},s={comments:[]},g={},S={},b={},h=o=>i[o];for(let o=0;o<r.entries.length;o++){let l=r.entries[o],f=a[o].decoded;if(l.tagName==="DATA"){let m=R(f);m&&(c[l.tagNumber]=m,l.tagNumber>=1&&l.tagNumber<=4?u[h(l.tagNumber-1)]=m:l.tagNumber>=9&&l.tagNumber<=12&&(d[h(l.tagNumber-9)]=m));}else if(l.tagName==="PBAS"&&f.kind==="string")g[l.tagNumber]=f.value;else if(l.tagName==="PCON"){let m=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):R(f);m&&(S[l.tagNumber]=m);}else if(l.tagName==="PLOC"){let m=R(f);m&&(b[l.tagNumber]=m.map(L=>L<0?L+65536:L));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let m=w(l.payload).getFloat32(0,false);Number.isFinite(m)&&m>0&&(s.samplingRate=m);}else f.kind==="number"&&(s.samplingRate=f.value);else if(l.tagName==="SMPL"&&f.kind==="string")s.sampleName=f.value;else if(l.tagName==="LANE"&&f.kind==="number")s.laneNumber=f.value;else if(l.tagName==="TUBE"&&f.kind==="string")s.tube=f.value;else if(l.tagName==="MCHN"&&f.kind==="string")s.machineName=f.value;else if(l.tagName==="MODL"&&f.kind==="string")s.machineModel=f.value;else if(l.tagName==="RUND"&&f.kind==="date"){let m=f.value;s.runDate=`${m.year}-${String(m.month).padStart(2,"0")}-${String(m.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&f.kind==="time"){let m=f.value;s.runTime=`${String(m.hour).padStart(2,"0")}:${String(m.minute).padStart(2,"0")}:${String(m.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&f.kind==="string"?s.comments.push(f.value):l.tagName==="RevC"&&l.tagNumber===1&&(f.kind==="number"?s.reverseComplemented=f.value!==0:f.kind==="numbers"&&(s.reverseComplemented=f.value.some(m=>m!==0)));}let y=Object.keys(g).map(Number).sort((o,l)=>o-l).map(o=>({version:o,role:o===1?"edited":o===2?"called":"unknown",sequence:g[o],confidences:S[o]??[],positions:b[o]??[]})),A,C=2 in g?2:1 in g?1:Object.keys(g).map(Number)[0];if(C!==void 0&&g[C]!==void 0){let o=g[C].toUpperCase(),l=S[C]??[];l.length!==o.length&&(l=Object.keys(S).map(Number).map(m=>S[m]).find(m=>m.length===o.length)??[]);let f=b[C]??[];f.length!==o.length&&(f=Object.keys(b).map(Number).map(m=>b[m]).find(m=>m.length===o.length)??[]),A={sequence:o,confidences:l,positions:f,pbasVersion:C};}if(!Number.isFinite(s.samplingRate)||(s.samplingRate??0)<=0){let o=A?.positions,l=Math.max(d.A.length,d.C.length,d.G.length,d.T.length);o&&o.length>1?s.samplingRate=(o[o.length-1]-o[0])/(o.length-1):A&&A.sequence.length>0&&l>0&&(s.samplingRate=l/A.sequence.length);}let E={baseOrder:i,dataChannels:c,data1To4:u,data9To12:d};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:s,chromatogram:E,baseCalls:A,baseCallVariants:y,entries:a}}function Le(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function De(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}var Re=93;function Me(e,t){let n=t?.lineWidth??60;return I(e).map(r=>`${k(">",r.id,r.description)}
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
function E(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,t,n){return e.subarray(t,t+n)}function X(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var z=128,N=28;function j(e){if(e.byteLength<z)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(E(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&E(x(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<z)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=_(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==N)throw new Error(`Expected dir element size ${N}, got ${i.elementSize}`);let c=i.raw?.elementCount??i.elementCount,m=Math.max(0,c),u=r.getInt32(n+6+20,false);if(u<0||u+m*N>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${u}, entries=${m}, file=${e.byteLength-n}`);let d=[];for(let T=0;T<m;T++)d.push(_(e,r,n+u+T*N,n));let y=i.raw?.dataSize??m*N,f=n+u+m*N,h=Math.min(Math.max(0,y-m*N),Math.max(0,e.byteLength-f)),o={entryCount:m,rawEntryCount:c,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:y,dataOffset:u,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(x(e,f,h))},g=new Uint8Array(x(e,n+6+N,z-6-N)),A=t===128?new Uint8Array(x(e,0,128)):void 0,C=Y(e,n,u,y,d,t);return {version:a,tdir:o,entries:d,macBinaryOffset:t,macBinaryHeader:A,headerReserved:g,unreferencedRanges:C}}function Y(e,t,n,r,a,i){let c=e.byteLength,m=[];i===128&&m.push([0,128]),m.push([t,t+z]);let u=Math.max(a.length*N,Math.max(0,r));m.push([t+n,t+n+u]);for(let o of a)if(o.raw&&!o.raw.inline){let g=t+o.raw.dataOffset;m.push([g,g+o.payload.byteLength]);}let d=m.map(([o,g])=>[Math.max(0,Math.min(o,c)),Math.max(0,Math.min(g,c))]).filter(([o,g])=>g>o).sort((o,g)=>o[0]-g[0]),y=[];for(let[o,g]of d){let A=y[y.length-1];A&&o<=A[1]?A[1]=Math.max(A[1],g):y.push([o,g]);}let f=[],h=0;for(let[o,g]of y)o>h&&f.push({offset:h,bytes:new Uint8Array(x(e,h,o-h))}),h=Math.max(h,g);return h<c&&f.push({offset:h,bytes:new Uint8Array(x(e,h,c-h))}),f}function _(e,t,n,r){let a=E(x(e,n,4)),i=t.getInt32(n+4,false),c=t.getInt16(n+8,false),m=t.getInt16(n+10,false),u=t.getInt32(n+12,false),d=t.getInt32(n+16,false),y=t.getInt32(n+24,false),f=Math.max(0,u*Math.max(0,m)),h=d>=0?d:f,o=d>=0?d<=4:f<=4,g=Math.max(0,m>0?Math.min(u,Math.floor(h/m)):Math.min(u,h)),A,C;if(o)C=-1,A=new Uint8Array(x(e,n+20,Math.min(4,h)));else {C=t.getInt32(n+20,false);let s=r+C;if(C<0||s+h>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${h})`);A=new Uint8Array(x(e,s,h));}let T=new Uint8Array(x(e,n+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:m,elementCount:g,payload:A,dataHandle:y,raw:{elementCount:u,dataSize:d,dataOffset:C,inline:o,dataOffsetBytes:T}}}function fe(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,a=e.entries.map(o=>o.raw&&o.payload.byteLength===o.raw.dataSize?o.raw:void 0),i=z;i=Math.max(i,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*N));for(let o of a)o&&!o.inline&&(i=Math.max(i,o.dataOffset+o.dataSize));for(let o of e.unreferencedRanges)i=Math.max(i,o.offset-t+o.bytes.length);let c=n>r,m=i,u=c?m:e.tdir.dataOffset,d=n===r?e.tdir.dataSize:n*N;c&&(m+=d);let y=new Array(n);for(let o=0;o<n;o++){let g=e.entries[o].payload.byteLength;if(a[o]||g<=4){y[o]=-1;continue}y[o]=m,m+=g;}let f=new Uint8Array(m),h=w(f);f.set(F("ABIF"),0),h.setInt16(4,e.version,false),f.set(e.headerReserved,6+N),q(f,h,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:d,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:u}}),n===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,u+n*N);for(let o=0;o<n;o++){let g=e.entries[o],A=a[o],C=u+o*N,T=g.payload.byteLength;q(f,h,C,{tagName:g.tagName,tagNumber:g.tagNumber,elementType:g.elementType,elementSize:g.elementSize,elementCount:A?A.elementCount:g.elementCount,dataSize:A?A.dataSize:T,dataHandle:g.dataHandle,offsetSlot:T<=4?{kind:"inline",payload:g.payload,dataSize:T,staleTail:A?.dataOffsetBytes}:{kind:"external",value:A?A.dataOffset:y[o]}}),T>4&&f.set(g.payload,A?A.dataOffset:y[o]);}for(let o of e.unreferencedRanges)f.set(o.bytes,o.offset-t);return f}function q(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(F(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:c}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(a.subarray(0,i),n+20),c&&i<4&&e.set(c.subarray(i,4),n+20+i);}t.setInt32(n+24,r.dataHandle,false);}function S(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ce(e,t){return e.entries.filter(n=>n.tagName===t)}function $(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=S(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):e.entries.push({tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function he(e,t){let n=S(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function M(e){let t=S(e,"FWO_",1);return t?E(t.payload.subarray(0,t.elementCount)):"GATC"}function B(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function L(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function pe(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function ye(e){let t=S(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function Ae(e){let t=M(e);if(!B(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function Se(e){return U(e,2)??U(e,1)}function U(e,t){let n=S(e,"PBAS",t);if(n)return E(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function Ce(e){return R(e,2)??R(e,1)}function R(e,t){let n=S(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let a=0;a<n.elementCount;a++)r[a]=n.payload[a];return r}function we(e){return v(e,2)??v(e,1)}function v(e,t){let n=S(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=w(n.payload),a=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)a[i]=r.getUint16(i*2,false);return a}function Ne(e){let t=S(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function $e(e,t,n={}){let{start:r,end:a}=t;if(!Number.isInteger(r)||!Number.isInteger(a)||r<0||a<=r)throw new Error(`cropAbif: invalid range [${r}, ${a})`);if(!L(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let i=Math.min(O(e,9),O(e,10),O(e,11),O(e,12));if(a>i)throw new Error(`cropAbif: range end ${a} exceeds the processed trace length ${i}`);let c=n.rawTrace??"omit",m=[];for(let u of e.entries)u.tagName==="DATA"&&u.tagNumber>=9&&u.tagNumber<=12?m.push(Z(u,r,a)):u.tagName==="DATA"&&u.tagNumber>=1&&u.tagNumber<=8?c==="full"&&m.push({...u}):u.tagName==="PBAS"||u.tagName==="PCON"||u.tagName==="PLOC"||m.push({...u});for(let u of J(e))m.push(...K(e,u,r,a));return {version:e.version,tdir:e.tdir,entries:m,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function O(e,t){return S(e,"DATA",t)?.elementCount??0}function Z(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function J(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function K(e,t,n,r){let a=U(e,t);if(a===void 0)return [];let i=v(e,t);if(i===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(i.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${a.length} vs ${i.length})`);let c=R(e,t);if(c!==void 0&&c.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let m=[];for(let f=0;f<i.length;f++)i[f]>=n&&i[f]<r&&m.push(f);let u=m.map(f=>a[f]).join(""),d=m.map(f=>i[f]-n),y=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:F(u),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:d.length,payload:ee(d),dataHandle:0}];if(c!==void 0){let f=m.map(h=>c[h]);y.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return y}function ee(e){let t=new Uint8Array(e.length*2),n=w(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var te={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function I(e){return te[e]??(e>=1024?`user${e}`:`type${e}`)}function ne(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function re(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function G(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function P(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function D(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let c=0;c<a;c++)i.push(r(c*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function W(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:E(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return D(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return D(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return D(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return D(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return D(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),c=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:c}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:E(x(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function ae(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return ne(e.value);case "string":return re(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${I(t)} ${G(e.value)}`;case "unknown":return `${I(t)} ${G(e.value)}`}}function ve(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=j(n),a=r.entries.map(s=>{let l=s.tagName==="PCON"&&s.elementSize===1?W(1,s.elementCount,s.payload):W(s.elementType,s.elementCount,s.payload);return {tag:s.tagName,tagNumber:s.tagNumber,elementType:s.elementType,elementTypeName:I(s.elementType),elementSize:s.elementSize,elementCount:s.elementCount,rawElementCount:s.raw?.elementCount??s.elementCount,dataSize:s.raw?.dataSize??s.elementCount*s.elementSize,dataOffset:s.raw?.dataOffset??-1,inline:s.raw?.inline??s.elementCount*s.elementSize<=4,decoded:l,preview:ae(l,s.elementType)}}),i=M(r);B(i)||(i="GATC");let c={},m={A:[],C:[],G:[],T:[]},u={A:[],C:[],G:[],T:[]},d={comments:[]},y={},f={},h={},o=s=>i[s];for(let s=0;s<r.entries.length;s++){let l=r.entries[s],p=a[s].decoded;if(l.tagName==="DATA"){let b=P(p);b&&(c[l.tagNumber]=b,l.tagNumber>=1&&l.tagNumber<=4?m[o(l.tagNumber-1)]=b:l.tagNumber>=9&&l.tagNumber<=12&&(u[o(l.tagNumber-9)]=b));}else if(l.tagName==="PBAS"&&p.kind==="string")y[l.tagNumber]=p.value;else if(l.tagName==="PCON"){let b=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):P(p);b&&(f[l.tagNumber]=b);}else if(l.tagName==="PLOC"){let b=P(p);b&&(h[l.tagNumber]=b.map(k=>k<0?k+65536:k));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let b=w(l.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(d.samplingRate=b);}else p.kind==="number"&&(d.samplingRate=p.value);else if(l.tagName==="SMPL"&&p.kind==="string")d.sampleName=p.value;else if(l.tagName==="LANE"&&p.kind==="number")d.laneNumber=p.value;else if(l.tagName==="TUBE"&&p.kind==="string")d.tube=p.value;else if(l.tagName==="MCHN"&&p.kind==="string")d.machineName=p.value;else if(l.tagName==="MODL"&&p.kind==="string")d.machineModel=p.value;else if(l.tagName==="RUND"&&p.kind==="date"){let b=p.value;d.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&p.kind==="time"){let b=p.value;d.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&p.kind==="string"?d.comments.push(p.value):l.tagName==="RevC"&&l.tagNumber===1&&(p.kind==="number"?d.reverseComplemented=p.value!==0:p.kind==="numbers"&&(d.reverseComplemented=p.value.some(b=>b!==0)));}let g=Object.keys(y).map(Number).sort((s,l)=>s-l).map(s=>({version:s,role:s===1?"edited":s===2?"called":"unknown",sequence:y[s],confidences:f[s]??[],positions:h[s]??[]})),A,C=2 in y?2:1 in y?1:Object.keys(y).map(Number)[0];if(C!==void 0&&y[C]!==void 0){let s=y[C].toUpperCase(),l=f[C]??[];l.length!==s.length&&(l=Object.keys(f).map(Number).map(b=>f[b]).find(b=>b.length===s.length)??[]);let p=h[C]??[];p.length!==s.length&&(p=Object.keys(h).map(Number).map(b=>h[b]).find(b=>b.length===s.length)??[]),A={sequence:s,confidences:l,positions:p,pbasVersion:C};}if(!Number.isFinite(d.samplingRate)||(d.samplingRate??0)<=0){let s=A?.positions,l=Math.max(u.A.length,u.C.length,u.G.length,u.T.length);s&&s.length>1?d.samplingRate=(s[s.length-1]-s[0])/(s.length-1):A&&A.sequence.length>0&&l>0&&(d.samplingRate=l/A.sequence.length);}let T={baseOrder:i,dataChannels:c,data1To4:m,data9To12:u};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:d,chromatogram:T,baseCalls:A,baseCallVariants:g,entries:a}}function Le(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Oe(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Ie(e,t){$(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function He(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));$(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Ve(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);$(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function _e(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),c=new Uint8Array(1+i);c[0]=i,c.set(a.subarray(0,i),1),$(e,"SPAC",2,c,{elementType:18,elementSize:1,elementCount:1+i});let m=new Uint8Array(4);w(m).setFloat32(0,t,false),$(e,"SPAC",3,m,{elementType:7,elementSize:4,elementCount:1});}function qe(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function je(e){if(!L(e))for(let t=1;t<=4;t++){let n=S(e,"DATA",t);if(!n)continue;let r=8+t;S(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var We=93;function Qe(e,t){let n=t?.lineWidth??60;return V(e).map(r=>`${H(">",r.id,r.description)}
|
|
2
|
+
${oe(r.sequence,n)}`).join("")}function Xe(e){return V(e).map(ie).join("")}function Ye(e,t){let n=t?.lineWidth??60;return V(e).map(r=>`${H(">",r.id,r.description)}
|
|
3
|
+
${se(r.qualities,n)}`).join("")}function Ze(e){return !!e&&e.length>0&&!e.every(t=>t===255)}function ie(e){let{id:t,description:n,sequence:r,qualities:a}=e;if(a.length!==r.length)throw new Error(`FASTQ ${t}: ${a.length} quality scores for ${r.length} bases`);let i=a.map(ue).join("");return `${H("@",t,n)}
|
|
4
4
|
${r}
|
|
5
5
|
+
|
|
6
6
|
${i}
|
|
7
|
-
`}function
|
|
8
|
-
`))throw new Error("FASTX header must not contain a newline");return e+r}function
|
|
7
|
+
`}function H(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
|
|
8
|
+
`))throw new Error("FASTX header must not contain a newline");return e+r}function oe(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
|
|
9
9
|
`;let n="";for(let r=0;r<e.length;r+=t)n+=`${e.slice(r,r+t)}
|
|
10
|
-
`;return n}function
|
|
11
|
-
`;return a}function
|
|
10
|
+
`;return n}function se(e,t){if(e.length===0)return "";let n=e.map(Q),r=t<=0?n.length:t,a="";for(let i=0;i<n.length;i+=r)a+=`${n.slice(i,i+r).join(" ")}
|
|
11
|
+
`;return a}function Q(e){let t=Math.round(e);return t<0?0:t>93?93:t}function ue(e){return String.fromCharCode(Q(e)+33)}function V(e){return Array.isArray(e)?e:[e]}export{N as ENTRY_SIZE,z as HEADER_SIZE,We as MAX_PHRED,qe as averagePeakSpacing,Oe as channelMaxLength,$e as cropAbif,pe as dataChannelRole,je as ensureRawDataChannels,ce as findEntries,S as findEntry,Qe as formatFasta,Xe as formatFastq,Ye as formatQual,Ae as getChannelMap,Ce as getConfidences,R as getConfidencesForVersion,he as getDataChannel,M as getFwo,we as getPositions,v as getPositionsForVersion,ye as getReverseComplemented,Ne as getSamplingRate,Se as getSequence,U as getSequenceForVersion,L as hasData9To12Block,Le as hasSignals,Ze as hasUsableQuality,B as isFwoPermutation,ve as parseAbif,j as readAbif,_e as setAveragePeakSpacing,He as setConfidences,Ve as setPositions,Ie as setSequence,X as tagNameFromInt32,$ as upsertEntry,fe as writeAbif};//# sourceMappingURL=index.mjs.map
|
|
12
12
|
//# sourceMappingURL=index.mjs.map
|