@fishka/seqio 0.6.0 → 0.7.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.
@@ -1,2 +1,2 @@
1
- function z(e){let n="";for(let t=0;t<e.length;t++)n+=String.fromCharCode(e[t]);return n}function E(e){let n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t)&255;return n}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,n,t){return e.subarray(n,n+t)}function _(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var F=128,N=28;function G(e){if(e.byteLength<F)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let n=0;if(z(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&z(x(e,128,4))==="ABIF")n=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let t=n;if(e.byteLength-t<F)throw new Error(`ABIF too small: ${e.byteLength-t} bytes after offset ${t}`);let r=w(e),a=r.getInt16(t+4,false),i=V(e,r,t+6,t);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,l=Math.max(0,c),u=r.getInt32(t+6+20,false);if(u<0||u+l*N>e.byteLength-t)throw new Error(`Directory out of bounds: offset=${u}, entries=${l}, file=${e.byteLength-t}`);let d=[];for(let T=0;T<l;T++)d.push(V(e,r,t+u+T*N,t));let y=i.raw?.dataSize??l*N,f=t+u+l*N,h=Math.min(Math.max(0,y-l*N),Math.max(0,e.byteLength-f)),o={entryCount:l,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,t+6+N,F-6-N)),A=n===128?new Uint8Array(x(e,0,128)):void 0,C=W(e,t,u,y,d,n);return {version:a,tdir:o,entries:d,macBinaryOffset:n,macBinaryHeader:A,headerReserved:g,unreferencedRanges:C}}function W(e,n,t,r,a,i){let c=e.byteLength,l=[];i===128&&l.push([0,128]),l.push([n,n+F]);let u=Math.max(a.length*N,Math.max(0,r));l.push([n+t,n+t+u]);for(let o of a)if(o.raw&&!o.raw.inline){let g=n+o.raw.dataOffset;l.push([g,g+o.payload.byteLength]);}let d=l.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 V(e,n,t,r){let a=z(x(e,t,4)),i=n.getInt32(t+4,false),c=n.getInt16(t+8,false),l=n.getInt16(t+10,false),u=n.getInt32(t+12,false),d=n.getInt32(t+16,false),y=n.getInt32(t+24,false),f=Math.max(0,u*Math.max(0,l)),h=d>=0?d:f,o=d>=0?d<=4:f<=4,g=Math.max(0,l>0?Math.min(u,Math.floor(h/l)):Math.min(u,h)),A,C;if(o)C=-1,A=new Uint8Array(x(e,t+20,Math.min(4,h)));else {C=n.getInt32(t+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,t+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:l,elementCount:g,payload:A,dataHandle:y,raw:{elementCount:u,dataSize:d,dataOffset:C,inline:o,dataOffsetBytes:T}}}function ae(e){let n=e.macBinaryOffset,t=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=F;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-n+o.bytes.length);let c=t>r,l=i,u=c?l:e.tdir.dataOffset,d=t===r?e.tdir.dataSize:t*N;c&&(l+=d);let y=new Array(t);for(let o=0;o<t;o++){let g=e.entries[o].payload.byteLength;if(a[o]||g<=4){y[o]=-1;continue}y[o]=l,l+=g;}let f=new Uint8Array(l),h=w(f);f.set(E("ABIF"),0),h.setInt16(4,e.version,false),f.set(e.headerReserved,6+N),H(f,h,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:t,dataSize:d,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:u}}),t===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,u+t*N);for(let o=0;o<t;o++){let g=e.entries[o],A=a[o],C=u+o*N,T=g.payload.byteLength;H(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-n);return f}function H(e,n,t,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(E(r.tagName),t),n.setInt32(t+4,r.tagNumber,false),n.setInt16(t+8,r.elementType,false),n.setInt16(t+10,r.elementSize,false),n.setInt32(t+12,r.elementCount,false),n.setInt32(t+16,r.dataSize,false),r.offsetSlot.kind==="external")n.setInt32(t+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:c}=r.offsetSlot;e.fill(0,t+20,t+24),e.set(a.subarray(0,i),t+20),c&&i<4&&e.set(c.subarray(i,4),t+20+i);}n.setInt32(t+24,r.dataHandle,false);}function S(e,n,t){return e.entries.find(r=>r.tagName===n&&r.tagNumber===t)}function ie(e,n){return e.entries.filter(t=>t.tagName===n)}function $(e,n,t,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${n}${t}: payload length ${r.byteLength} != count*size`);let i=S(e,n,t);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):e.entries.push({tagName:n,tagNumber:t,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function me(e,n){let t=S(e,"DATA",n);if(!t)return;if(t.elementSize!==2)throw new Error(`DATA${n}: expected elementSize=2, got ${t.elementSize}`);let r=new Int16Array(t.elementCount),a=w(t.payload);for(let i=0;i<t.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function O(e){let n=S(e,"FWO_",1);return n?z(n.payload.subarray(0,n.elementCount)):"GATC"}function P(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function le(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function fe(e){let n=S(e,"RevC",1);if(!n)return;let t=w(n.payload);return n.payload.byteLength>=2?t.getInt16(0,false)!==0:n.payload.some(r=>r!==0)}function ce(e){let n=O(e);if(!P(n))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${n}"`);return {[n[0]]:1,[n[1]]:2,[n[2]]:3,[n[3]]:4}}function de(e){return U(e,2)??U(e,1)}function U(e,n){let t=S(e,"PBAS",n);if(t)return z(t.payload.subarray(0,t.elementCount)).replace(/\0+$/g,"")}function ge(e){return D(e,2)??D(e,1)}function D(e,n){let t=S(e,"PCON",n);if(!t)return;let r=new Array(t.elementCount);for(let a=0;a<t.elementCount;a++)r[a]=t.payload[a];return r}function be(e){return k(e,2)??k(e,1)}function k(e,n){let t=S(e,"PLOC",n);if(!t)return;if(t.elementSize!==2)throw new Error(`PLOC${n}: expected elementSize=2, got ${t.elementSize}`);let r=w(t.payload),a=new Array(t.elementCount);for(let i=0;i<t.elementCount;i++)a[i]=r.getUint16(i*2,false);return a}function he(e){let n=S(e,"SPAC",1);if(!n||n.elementSize!==4||n.payload.byteLength<4)return;let t=w(n.payload).getFloat32(0,false);return Number.isFinite(t)&&t>0?t:void 0}function Ce(e,n,t={}){let{start:r,end:a}=n;if(!Number.isInteger(r)||!Number.isInteger(a)||r<0||a<=r)throw new Error(`cropAbif: invalid range [${r}, ${a})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let i=Math.min(L(e,9),L(e,10),L(e,11),L(e,12));if(a>i)throw new Error(`cropAbif: range end ${a} exceeds the processed trace length ${i}`);let c=t.rawTrace??"omit",l=[];for(let u of e.entries)u.tagName==="DATA"&&u.tagNumber>=9&&u.tagNumber<=12?l.push(Y(u,r,a)):u.tagName==="DATA"&&u.tagNumber>=1&&u.tagNumber<=8?c==="full"&&l.push({...u}):u.tagName==="PBAS"||u.tagName==="PCON"||u.tagName==="PLOC"||l.push({...u});for(let u of Z(e))l.push(...J(e,u,r,a));return {version:e.version,tdir:e.tdir,entries:l,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function L(e,n){return S(e,"DATA",n)?.elementCount??0}function Y(e,n,t){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(n*2,t*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:t-n,payload:r,dataHandle:e.dataHandle}}function Z(e){let n=new Set;for(let t of e.entries)t.tagName==="PBAS"&&n.add(t.tagNumber);return Array.from(n).sort((t,r)=>t-r)}function J(e,n,t,r){let a=U(e,n);if(a===void 0)return [];let i=k(e,n);if(i===void 0)throw new Error(`cropAbif: PBAS${n} has no PLOC${n} to crop by`);if(i.length!==a.length)throw new Error(`cropAbif: PBAS${n}/PLOC${n} length mismatch (${a.length} vs ${i.length})`);let c=D(e,n);if(c!==void 0&&c.length!==a.length)throw new Error(`cropAbif: PBAS${n}/PCON${n} length mismatch`);let l=[];for(let f=0;f<i.length;f++)i[f]>=t&&i[f]<r&&l.push(f);let u=l.map(f=>a[f]).join(""),d=l.map(f=>i[f]-t),y=[{tagName:"PBAS",tagNumber:n,elementType:2,elementSize:1,elementCount:u.length,payload:E(u),dataHandle:0},{tagName:"PLOC",tagNumber:n,elementType:4,elementSize:2,elementCount:d.length,payload:K(d),dataHandle:0}];if(c!==void 0){let f=l.map(h=>c[h]);y.push({tagName:"PCON",tagNumber:n,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return y}function K(e){let n=new Uint8Array(e.length*2),t=w(n);for(let r=0;r<e.length;r++)t.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return n}var Q={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 Q[e]??(e>=1024?`user${e}`:`type${e}`)}function X(e,n=10){return e.length<=n?`[${e.join(", ")}]`:`[${e.slice(0,n).join(", ")}, \u2026 +${e.length-n}] (n=${e.length})`}function ee(e,n=80){return e.length>n?e.slice(0,n)+"\u2026":e}function j(e){let n=e.subarray(0,16),t=Array.from(n,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${t}${e.byteLength>16?" \u2026":""}]`}function R(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function v(e,n,t,r){let a=Math.max(0,Math.min(n,Math.floor(e/t))),i=[];for(let c=0;c<a;c++)i.push(r(c*t));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function q(e,n,t){let r=w(t);switch(e){case 1:return {kind:"numbers",value:Array.from(t.subarray(0,n))};case 2:case 19:return {kind:"string",value:z(t.subarray(0,n)).replace(/\0+$/g,"")};case 3:return v(t.byteLength,n,2,a=>r.getUint16(a,false));case 4:return v(t.byteLength,n,2,a=>r.getInt16(a,false));case 5:return v(t.byteLength,n,4,a=>r.getInt32(a,false));case 7:return v(t.byteLength,n,4,a=>r.getFloat32(a,false));case 8:return v(t.byteLength,n,8,a=>r.getFloat64(a,false));case 10:{if(t.byteLength<4)return {kind:"unknown",value:t};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 t.byteLength<4?{kind:"unknown",value:t}:{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(n,t.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(t.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:z(x(t,1,Math.min(a,Math.max(0,n-1))))}}default:return {kind:"unknown",value:t}}}function te(e,n){switch(e.kind){case "number":return String(e.value);case "numbers":return X(e.value);case "string":return ee(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:t,month:r,day:a}=e.value;return `${t}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:t,minute:r,second:a}=e.value;return `${String(t).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${I(n)} ${j(e.value)}`;case "unknown":return `${I(n)} ${j(e.value)}`}}function ze(e,n=""){let t=e instanceof Uint8Array?e:new Uint8Array(e),r=G(t),a=r.entries.map(s=>{let m=s.tagName==="PCON"&&s.elementSize===1?q(1,s.elementCount,s.payload):q(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:m,preview:te(m,s.elementType)}}),i=O(r);P(i)||(i="GATC");let c={},l={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 m=r.entries[s],p=a[s].decoded;if(m.tagName==="DATA"){let b=R(p);b&&(c[m.tagNumber]=b,m.tagNumber>=1&&m.tagNumber<=4?l[o(m.tagNumber-1)]=b:m.tagNumber>=9&&m.tagNumber<=12&&(u[o(m.tagNumber-9)]=b));}else if(m.tagName==="PBAS"&&p.kind==="string")y[m.tagNumber]=p.value;else if(m.tagName==="PCON"){let b=m.elementSize===1?Array.from(m.payload.subarray(0,m.elementCount)):R(p);b&&(f[m.tagNumber]=b);}else if(m.tagName==="PLOC"){let b=R(p);b&&(h[m.tagNumber]=b.map(M=>M<0?M+65536:M));}else if(m.tagName==="SPAC")if(m.elementSize===4&&m.payload.byteLength>=4){let b=w(m.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(d.samplingRate=b);}else p.kind==="number"&&(d.samplingRate=p.value);else if(m.tagName==="SMPL"&&p.kind==="string")d.sampleName=p.value;else if(m.tagName==="LANE"&&p.kind==="number")d.laneNumber=p.value;else if(m.tagName==="TUBE"&&p.kind==="string")d.tube=p.value;else if(m.tagName==="MCHN"&&p.kind==="string")d.machineName=p.value;else if(m.tagName==="MODL"&&p.kind==="string")d.machineModel=p.value;else if(m.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(m.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 m.tagName==="CMNT"&&p.kind==="string"?d.comments.push(p.value):m.tagName==="RevC"&&m.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,m)=>s-m).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(),m=f[C]??[];m.length!==s.length&&(m=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:m,positions:p,pbasVersion:C};}if(!Number.isFinite(d.samplingRate)||(d.samplingRate??0)<=0){let s=A?.positions,m=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&&m>0&&(d.samplingRate=m/A.sequence.length);}let T={baseOrder:i,dataChannels:c,data1To4:l,data9To12:u};return {fileName:n,fileSize:t.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:d,chromatogram:T,baseCalls:A,baseCallVariants:g,entries:a}}function Ee(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function $e(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function ke(e,n){$(e,"PBAS",2,E(n),{elementType:2,elementSize:1,elementCount:n.length});}function Be(e,n){let t=new Uint8Array(n.length);for(let r=0;r<n.length;r++)t[r]=Math.max(0,Math.min(255,Math.round(n[r])));$(e,"PCON",2,t,{elementType:2,elementSize:1,elementCount:n.length});}function Le(e,n){let t=new Uint8Array(n.length*2),r=w(t);for(let a=0;a<n.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,n[a])),false);$(e,"PLOC",2,t,{elementType:4,elementSize:2,elementCount:n.length});}function Me(e,n,t){let r=new Uint8Array(4);w(r).setFloat32(0,n,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=E(t),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 l=new Uint8Array(4);w(l).setFloat32(0,n,false),$(e,"SPAC",3,l,{elementType:7,elementSize:4,elementCount:1});}function Oe(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Pe(e){if(!B(e))for(let n=1;n<=4;n++){let t=S(e,"DATA",n);if(!t)continue;let r=8+n;S(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:t.elementType,elementSize:t.elementSize,elementCount:t.elementCount,payload:new Uint8Array(t.payload),dataHandle:0});}}export{N as ENTRY_SIZE,F as HEADER_SIZE,Oe as averagePeakSpacing,$e as channelMaxLength,Ce as cropAbif,le as dataChannelRole,Pe as ensureRawDataChannels,ie as findEntries,S as findEntry,ce as getChannelMap,ge as getConfidences,D as getConfidencesForVersion,me as getDataChannel,O as getFwo,be as getPositions,k as getPositionsForVersion,fe as getReverseComplemented,he as getSamplingRate,de as getSequence,U as getSequenceForVersion,B as hasData9To12Block,Ee as hasSignals,P as isFwoPermutation,ze as parseAbif,G as readAbif,Me as setAveragePeakSpacing,Be as setConfidences,Le as setPositions,ke as setSequence,_ as tagNameFromInt32,$ as upsertEntry,ae as writeAbif};//# sourceMappingURL=index.mjs.map
1
+ function E(e){let n="";for(let t=0;t<e.length;t++)n+=String.fromCharCode(e[t]);return n}function z(e){let n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t)&255;return n}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,n,t){return e.subarray(n,n+t)}function W(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var v=128,N=28;function j(e){if(e.byteLength<v)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let n=0;if(E(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&E(x(e,128,4))==="ABIF")n=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let t=n;if(e.byteLength-t<v)throw new Error(`ABIF too small: ${e.byteLength-t} bytes after offset ${t}`);let r=w(e),a=r.getInt16(t+4,false),i=H(e,r,t+6,t);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,l=Math.max(0,c),u=r.getInt32(t+6+20,false);if(u<0||u+l*N>e.byteLength-t)throw new Error(`Directory out of bounds: offset=${u}, entries=${l}, file=${e.byteLength-t}`);let d=[];for(let T=0;T<l;T++)d.push(H(e,r,t+u+T*N,t));let y=i.raw?.dataSize??l*N,f=t+u+l*N,h=Math.min(Math.max(0,y-l*N),Math.max(0,e.byteLength-f)),o={entryCount:l,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,t+6+N,v-6-N)),A=n===128?new Uint8Array(x(e,0,128)):void 0,C=Y(e,t,u,y,d,n);return {version:a,tdir:o,entries:d,macBinaryOffset:n,macBinaryHeader:A,headerReserved:g,unreferencedRanges:C}}function Y(e,n,t,r,a,i){let c=e.byteLength,l=[];i===128&&l.push([0,128]),l.push([n,n+v]);let u=Math.max(a.length*N,Math.max(0,r));l.push([n+t,n+t+u]);for(let o of a)if(o.raw&&!o.raw.inline){let g=n+o.raw.dataOffset;l.push([g,g+o.payload.byteLength]);}let d=l.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 H(e,n,t,r){let a=E(x(e,t,4)),i=n.getInt32(t+4,false),c=n.getInt16(t+8,false),l=n.getInt16(t+10,false),u=n.getInt32(t+12,false),d=n.getInt32(t+16,false),y=n.getInt32(t+24,false),f=Math.max(0,u*Math.max(0,l)),h=d>=0?d:f,o=d>=0?d<=4:f<=4,g=Math.max(0,l>0?Math.min(u,Math.floor(h/l)):Math.min(u,h)),A,C;if(o)C=-1,A=new Uint8Array(x(e,t+20,Math.min(4,h)));else {C=n.getInt32(t+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,t+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:l,elementCount:g,payload:A,dataHandle:y,raw:{elementCount:u,dataSize:d,dataOffset:C,inline:o,dataOffsetBytes:T}}}function oe(e){let n=e.macBinaryOffset,t=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=v;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-n+o.bytes.length);let c=t>r,l=i,u=c?l:e.tdir.dataOffset,d=t===r?e.tdir.dataSize:t*N;c&&(l+=d);let y=new Array(t);for(let o=0;o<t;o++){let g=e.entries[o].payload.byteLength;if(a[o]||g<=4){y[o]=-1;continue}y[o]=l,l+=g;}let f=new Uint8Array(l),h=w(f);f.set(z("ABIF"),0),h.setInt16(4,e.version,false),f.set(e.headerReserved,6+N),G(f,h,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:t,dataSize:d,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:u}}),t===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,u+t*N);for(let o=0;o<t;o++){let g=e.entries[o],A=a[o],C=u+o*N,T=g.payload.byteLength;G(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-n);return f}function G(e,n,t,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(z(r.tagName),t),n.setInt32(t+4,r.tagNumber,false),n.setInt16(t+8,r.elementType,false),n.setInt16(t+10,r.elementSize,false),n.setInt32(t+12,r.elementCount,false),n.setInt32(t+16,r.dataSize,false),r.offsetSlot.kind==="external")n.setInt32(t+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:c}=r.offsetSlot;e.fill(0,t+20,t+24),e.set(a.subarray(0,i),t+20),c&&i<4&&e.set(c.subarray(i,4),t+20+i);}n.setInt32(t+24,r.dataHandle,false);}function S(e,n,t){return e.entries.find(r=>r.tagName===n&&r.tagNumber===t)}function se(e,n){return e.entries.filter(t=>t.tagName===n)}function Z(e,n){return e.tagName!==n.tagName?e.tagName<n.tagName?-1:1:e.tagNumber-n.tagNumber}function O(e,n){let t=e.findIndex(r=>Z(r,n)>0);e.splice(t<0?e.length:t,0,n);}function $(e,n,t,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${n}${t}: payload length ${r.byteLength} != count*size`);let i=S(e,n,t);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):O(e.entries,{tagName:n,tagNumber:t,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function fe(e,n){let t=S(e,"DATA",n);if(!t)return;if(t.elementSize!==2)throw new Error(`DATA${n}: expected elementSize=2, got ${t.elementSize}`);let r=new Int16Array(t.elementCount),a=w(t.payload);for(let i=0;i<t.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function P(e){let n=S(e,"FWO_",1);return n?E(n.payload.subarray(0,n.elementCount)):"GATC"}function R(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function ce(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function de(e){let n=S(e,"RevC",1);if(!n)return;let t=w(n.payload);return n.payload.byteLength>=2?t.getInt16(0,false)!==0:n.payload.some(r=>r!==0)}function ge(e){let n=P(e);if(!R(n))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${n}"`);return {[n[0]]:1,[n[1]]:2,[n[2]]:3,[n[3]]:4}}function be(e){return U(e,2)??U(e,1)}function U(e,n){let t=S(e,"PBAS",n);if(t)return E(t.payload.subarray(0,t.elementCount)).replace(/\0+$/g,"")}function he(e){return D(e,2)??D(e,1)}function D(e,n){let t=S(e,"PCON",n);if(!t)return;let r=new Array(t.elementCount);for(let a=0;a<t.elementCount;a++)r[a]=t.payload[a];return r}function pe(e){return k(e,2)??k(e,1)}function k(e,n){let t=S(e,"PLOC",n);if(!t)return;if(t.elementSize!==2)throw new Error(`PLOC${n}: expected elementSize=2, got ${t.elementSize}`);let r=w(t.payload),a=new Array(t.elementCount);for(let i=0;i<t.elementCount;i++)a[i]=r.getUint16(i*2,false);return a}function ye(e){let n=S(e,"SPAC",1);if(!n||n.elementSize!==4||n.payload.byteLength<4)return;let t=w(n.payload).getFloat32(0,false);return Number.isFinite(t)&&t>0?t:void 0}function Ne(e,n,t={}){let{start:r,end:a}=n;if(!Number.isInteger(r)||!Number.isInteger(a)||r<0||a<=r)throw new Error(`cropAbif: invalid range [${r}, ${a})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let i=Math.min(L(e,9),L(e,10),L(e,11),L(e,12));if(a>i)throw new Error(`cropAbif: range end ${a} exceeds the processed trace length ${i}`);let c=t.rawTrace??"omit",l=[];for(let u of e.entries)u.tagName==="DATA"&&u.tagNumber>=9&&u.tagNumber<=12?l.push(J(u,r,a)):u.tagName==="DATA"&&u.tagNumber>=1&&u.tagNumber<=8?c==="full"&&l.push({...u}):u.tagName==="PBAS"||u.tagName==="PCON"||u.tagName==="PLOC"||l.push({...u});for(let u of K(e))l.push(...Q(e,u,r,a));return {version:e.version,tdir:e.tdir,entries:l,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function L(e,n){return S(e,"DATA",n)?.elementCount??0}function J(e,n,t){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(n*2,t*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:t-n,payload:r,dataHandle:e.dataHandle}}function K(e){let n=new Set;for(let t of e.entries)t.tagName==="PBAS"&&n.add(t.tagNumber);return Array.from(n).sort((t,r)=>t-r)}function Q(e,n,t,r){let a=U(e,n);if(a===void 0)return [];let i=k(e,n);if(i===void 0)throw new Error(`cropAbif: PBAS${n} has no PLOC${n} to crop by`);if(i.length!==a.length)throw new Error(`cropAbif: PBAS${n}/PLOC${n} length mismatch (${a.length} vs ${i.length})`);let c=D(e,n);if(c!==void 0&&c.length!==a.length)throw new Error(`cropAbif: PBAS${n}/PCON${n} length mismatch`);let l=[];for(let f=0;f<i.length;f++)i[f]>=t&&i[f]<r&&l.push(f);let u=l.map(f=>a[f]).join(""),d=l.map(f=>i[f]-t),y=[{tagName:"PBAS",tagNumber:n,elementType:2,elementSize:1,elementCount:u.length,payload:z(u),dataHandle:0},{tagName:"PLOC",tagNumber:n,elementType:4,elementSize:2,elementCount:d.length,payload:X(d),dataHandle:0}];if(c!==void 0){let f=l.map(h=>c[h]);y.push({tagName:"PCON",tagNumber:n,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return y}function X(e){let n=new Uint8Array(e.length*2),t=w(n);for(let r=0;r<e.length;r++)t.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return n}var ee={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 V(e){return ee[e]??(e>=1024?`user${e}`:`type${e}`)}function te(e,n=10){return e.length<=n?`[${e.join(", ")}]`:`[${e.slice(0,n).join(", ")}, \u2026 +${e.length-n}] (n=${e.length})`}function ne(e,n=80){return e.length>n?e.slice(0,n)+"\u2026":e}function q(e){let n=e.subarray(0,16),t=Array.from(n,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${t}${e.byteLength>16?" \u2026":""}]`}function I(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function F(e,n,t,r){let a=Math.max(0,Math.min(n,Math.floor(e/t))),i=[];for(let c=0;c<a;c++)i.push(r(c*t));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function _(e,n,t){let r=w(t);switch(e){case 1:return {kind:"numbers",value:Array.from(t.subarray(0,n))};case 2:case 19:return {kind:"string",value:E(t.subarray(0,n)).replace(/\0+$/g,"")};case 3:return F(t.byteLength,n,2,a=>r.getUint16(a,false));case 4:return F(t.byteLength,n,2,a=>r.getInt16(a,false));case 5:return F(t.byteLength,n,4,a=>r.getInt32(a,false));case 7:return F(t.byteLength,n,4,a=>r.getFloat32(a,false));case 8:return F(t.byteLength,n,8,a=>r.getFloat64(a,false));case 10:{if(t.byteLength<4)return {kind:"unknown",value:t};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 t.byteLength<4?{kind:"unknown",value:t}:{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(n,t.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(t.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:E(x(t,1,Math.min(a,Math.max(0,n-1))))}}default:return {kind:"unknown",value:t}}}function re(e,n){switch(e.kind){case "number":return String(e.value);case "numbers":return te(e.value);case "string":return ne(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:t,month:r,day:a}=e.value;return `${t}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:t,minute:r,second:a}=e.value;return `${String(t).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${V(n)} ${q(e.value)}`;case "unknown":return `${V(n)} ${q(e.value)}`}}function $e(e,n=""){let t=e instanceof Uint8Array?e:new Uint8Array(e),r=j(t),a=r.entries.map(s=>{let m=s.tagName==="PCON"&&s.elementSize===1?_(1,s.elementCount,s.payload):_(s.elementType,s.elementCount,s.payload);return {tag:s.tagName,tagNumber:s.tagNumber,elementType:s.elementType,elementTypeName:V(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:m,preview:re(m,s.elementType)}}),i=P(r);R(i)||(i="GATC");let c={},l={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 m=r.entries[s],p=a[s].decoded;if(m.tagName==="DATA"){let b=I(p);b&&(c[m.tagNumber]=b,m.tagNumber>=1&&m.tagNumber<=4?l[o(m.tagNumber-1)]=b:m.tagNumber>=9&&m.tagNumber<=12&&(u[o(m.tagNumber-9)]=b));}else if(m.tagName==="PBAS"&&p.kind==="string")y[m.tagNumber]=p.value;else if(m.tagName==="PCON"){let b=m.elementSize===1?Array.from(m.payload.subarray(0,m.elementCount)):I(p);b&&(f[m.tagNumber]=b);}else if(m.tagName==="PLOC"){let b=I(p);b&&(h[m.tagNumber]=b.map(M=>M<0?M+65536:M));}else if(m.tagName==="SPAC")if(m.elementSize===4&&m.payload.byteLength>=4){let b=w(m.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(d.samplingRate=b);}else p.kind==="number"&&(d.samplingRate=p.value);else if(m.tagName==="SMPL"&&p.kind==="string")d.sampleName=p.value;else if(m.tagName==="LANE"&&p.kind==="number")d.laneNumber=p.value;else if(m.tagName==="TUBE"&&p.kind==="string")d.tube=p.value;else if(m.tagName==="MCHN"&&p.kind==="string")d.machineName=p.value;else if(m.tagName==="MODL"&&p.kind==="string")d.machineModel=p.value;else if(m.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(m.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 m.tagName==="CMNT"&&p.kind==="string"?d.comments.push(p.value):m.tagName==="RevC"&&m.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,m)=>s-m).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(),m=f[C]??[];m.length!==s.length&&(m=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:m,positions:p,pbasVersion:C};}if(!Number.isFinite(d.samplingRate)||(d.samplingRate??0)<=0){let s=A?.positions,m=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&&m>0&&(d.samplingRate=m/A.sequence.length);}let T={baseOrder:i,dataChannels:c,data1To4:l,data9To12:u};return {fileName:n,fileSize:t.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:d,chromatogram:T,baseCalls:A,baseCallVariants:g,entries:a}}function ve(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Fe(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Le(e,n){$(e,"PBAS",2,z(n),{elementType:2,elementSize:1,elementCount:n.length});}function Me(e,n){let t=new Uint8Array(n.length);for(let r=0;r<n.length;r++)t[r]=Math.max(0,Math.min(255,Math.round(n[r])));$(e,"PCON",2,t,{elementType:2,elementSize:1,elementCount:n.length});}function Oe(e,n){let t=new Uint8Array(n.length*2),r=w(t);for(let a=0;a<n.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,n[a])),false);$(e,"PLOC",2,t,{elementType:4,elementSize:2,elementCount:n.length});}function Pe(e,n,t){let r=new Uint8Array(4);w(r).setFloat32(0,n,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=z(t),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 l=new Uint8Array(4);w(l).setFloat32(0,n,false),$(e,"SPAC",3,l,{elementType:7,elementSize:4,elementCount:1});}function Re(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Ie(e){if(!B(e))for(let n=1;n<=4;n++){let t=S(e,"DATA",n);if(!t)continue;let r=8+n;S(e,"DATA",r)||O(e.entries,{tagName:"DATA",tagNumber:r,elementType:t.elementType,elementSize:t.elementSize,elementCount:t.elementCount,payload:new Uint8Array(t.payload),dataHandle:0});}}export{N as ENTRY_SIZE,v as HEADER_SIZE,Re as averagePeakSpacing,Fe as channelMaxLength,Ne as cropAbif,ce as dataChannelRole,Ie as ensureRawDataChannels,se as findEntries,S as findEntry,ge as getChannelMap,he as getConfidences,D as getConfidencesForVersion,fe as getDataChannel,P as getFwo,pe as getPositions,k as getPositionsForVersion,de as getReverseComplemented,ye as getSamplingRate,be as getSequence,U as getSequenceForVersion,B as hasData9To12Block,ve as hasSignals,O as insertEntrySorted,R as isFwoPermutation,$e as parseAbif,j as readAbif,Pe as setAveragePeakSpacing,Me as setConfidences,Oe as setPositions,Le as setSequence,W as tagNameFromInt32,$ as upsertEntry,oe as writeAbif};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map