Spacelab 0.28.0__py3-none-any.whl
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.
- spacelab/__init__.py +6 -0
- spacelab/__main__.py +3 -0
- spacelab/cli.py +97 -0
- spacelab/hlod/__init__.py +8 -0
- spacelab/hlod/__main__.py +5 -0
- spacelab/hlod/build.py +349 -0
- spacelab/hlod/cells.py +82 -0
- spacelab/hlod/cli.py +90 -0
- spacelab/hlod/hashing.py +38 -0
- spacelab/hlod/hilbert.py +91 -0
- spacelab/hlod/read.py +150 -0
- spacelab/hlod/verify.py +142 -0
- spacelab/prep_spatialdata.py +700 -0
- spacelab/server.py +130 -0
- spacelab/static/AI_lens_black.png +0 -0
- spacelab/static/ai-new-logo.png +0 -0
- spacelab/static/aifi_logo.png +0 -0
- spacelab/static/assets/AllenInstitutePlusText-Bold-DxLtQ4oE.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-BoldItalic-mxzHQhQO.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-Italic-CaKmxpsW.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-Light-DUThXl1m.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-LightItalic-CxfKknzG.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-Regular-B0ryviHQ.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-Semibold-3PoiDF1d.woff2 +0 -0
- spacelab/static/assets/AllenInstitutePlusText-SemiboldItalic-uXaVqnFo.woff2 +0 -0
- spacelab/static/assets/blosc-BKQbfHyB.js +18 -0
- spacelab/static/assets/blosc-j6ygecpn.js +18 -0
- spacelab/static/assets/chunk-INHXZS53-D3tQiqtZ.js +2 -0
- spacelab/static/assets/chunk-INHXZS53-QjxmivJp.js +2 -0
- spacelab/static/assets/deflate-BRVR_fNk.js +2 -0
- spacelab/static/assets/hlodTranscripts.worker-CjhNLk56.js +2 -0
- spacelab/static/assets/index-BT-mDgg2.js +5025 -0
- spacelab/static/assets/index-CNIqsj6m.css +1 -0
- spacelab/static/assets/jpeg-JUDfHHDo.js +2 -0
- spacelab/static/assets/lerc-CXQdKTps.js +2 -0
- spacelab/static/assets/lz4-C2MQfzIA.js +16 -0
- spacelab/static/assets/lz4-rzy_Siro.js +16 -0
- spacelab/static/assets/lzw-DBCCrYEo.js +2 -0
- spacelab/static/assets/packbits-LrtZ2mhj.js +2 -0
- spacelab/static/assets/pako.esm-C69tvH9t.js +2 -0
- spacelab/static/assets/polygons.worker-ClOPdWlW.js +2 -0
- spacelab/static/assets/raw-lPmjnySZ.js +2 -0
- spacelab/static/assets/spatialdataExpression.worker-D4W_OHS3.js +4 -0
- spacelab/static/assets/spatialdataShapes.worker-DQV1zeTt.js +974 -0
- spacelab/static/assets/spatialdataTranscripts.worker-DH9L-MwZ.js +974 -0
- spacelab/static/assets/transcripts.worker-CtxyO4n3.js +2 -0
- spacelab/static/assets/umap.worker-BPHuoLPV.js +2 -0
- spacelab/static/assets/webimage-xg0Pp5Jv.js +2 -0
- spacelab/static/assets/zstd-Cp7BEDDH.js +16 -0
- spacelab/static/assets/zstd-WlDjm0Vu.js +16 -0
- spacelab/static/blurred-bg.jpg +0 -0
- spacelab/static/favicon.ico +0 -0
- spacelab/static/index.html +22 -0
- spacelab/static/logo192.png +0 -0
- spacelab/static/logo512.png +0 -0
- spacelab/static/manifest.json +15 -0
- spacelab/static/robots.txt +3 -0
- spacelab-0.28.0.dist-info/METADATA +30 -0
- spacelab-0.28.0.dist-info/RECORD +62 -0
- spacelab-0.28.0.dist-info/WHEEL +4 -0
- spacelab-0.28.0.dist-info/entry_points.txt +2 -0
- spacelab-0.28.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var C=(()=>{for(var a=new Uint8Array(128),r=0;r<64;r++)a[r<26?r+65:r<52?r+71:r<62?r-4:r*4-205]=r;return t=>{for(var o=t.length,v=new Uint8Array((o-(t[o-1]=="=")-(t[o-2]=="="))*3/4|0),n=0,e=0;n<o;){var d=a[t.charCodeAt(n++)],A=a[t.charCodeAt(n++)],h=a[t.charCodeAt(n++)],y=a[t.charCodeAt(n++)];v[e++]=d<<2|A>>4,v[e++]=A<<4|h>>2,v[e++]=h<<6|y}return v}})();export{C as _};
|
|
2
|
+
//# sourceMappingURL=chunk-INHXZS53-D3tQiqtZ.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var C=(()=>{for(var a=new Uint8Array(128),r=0;r<64;r++)a[r<26?r+65:r<52?r+71:r<62?r-4:r*4-205]=r;return t=>{for(var o=t.length,v=new Uint8Array((o-(t[o-1]=="=")-(t[o-2]=="="))*3/4|0),n=0,e=0;n<o;){var d=a[t.charCodeAt(n++)],A=a[t.charCodeAt(n++)],h=a[t.charCodeAt(n++)],y=a[t.charCodeAt(n++)];v[e++]=d<<2|A>>4,v[e++]=A<<4|h>>2,v[e++]=h<<6|y}return v}})();export{C as _};
|
|
2
|
+
//# sourceMappingURL=chunk-INHXZS53-QjxmivJp.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function S(e,t=25,n,o=!0){const s=e.length,r=new Uint8Array(s);if(s===0)return r;const c=new Float64Array(s);let l=1/0,i=-1/0;for(let h=0;h<s;h++){let a=e[h];n!==void 0&&a>n&&(a=n);const f=o?Math.log1p(a):a;c[h]=f,f<l&&(l=f),f>i&&(i=f)}if(i===l)return r.fill(0),r;for(let h=0;h<s;h++){const f=(c[h]-l)/(i-l)*t;r[h]=Math.round(f)}return r}const D=(e,t,n,o)=>{const s=n*o;return{rows:Math.max(1,Math.ceil(t/s)),cols:Math.max(1,Math.ceil(e/s)),tilePx:s}},N=(e,t)=>{const n=new Uint32Array(t.rows*t.cols);for(let o=0;o+1<e.length;o+=2){const s=Math.floor(e[o]/t.tilePx),r=Math.floor(e[o+1]/t.tilePx);s<0||r<0||s>=t.cols||r>=t.rows||n[r*t.cols+s]++}return n},z=(e,t,n,o)=>{let s=0;for(let a=0;a<e.length;a++)e[a]>0&&s++;const r=new Uint32Array(s),c=new Uint32Array(s*10);let l=0;for(let a=0;a<t.rows;a++){const f=a*t.tilePx,u=f+t.tilePx;for(let d=0;d<t.cols;d++){const y=e[a*t.cols+d];if(y===0)continue;const g=d*t.tilePx,w=g+t.tilePx;c.set([g,f,w,f,w,u,g,u,g,f],l*10),r[l++]=y}}const i=S(r,o,n),h=new Uint8Array(e.length);l=0;for(let a=0;a<e.length;a++)e[a]>0&&(h[a]=i[l++]+1);return{polygons:c,counts:h}},C=e=>{const t=e.a*e.d-e.b*e.c;if(!Number.isFinite(t)||t===0)throw new Error("Coordinate transform is not invertible");const n=e.d/t,o=-e.b/t,s=-e.c/t,r=e.a/t;return{a:n,b:o,c:s,d:r,tx:-(n*e.tx+o*e.ty),ty:-(s*e.tx+r*e.ty)}},F=e=>Math.sqrt(Math.abs(e.a*e.d-e.b*e.c)),O=(e,t)=>{const{a:n,b:o,c:s,d:r,tx:c,ty:l}=t;for(let i=0;i+1<e.length;i+=2){const h=e[i],a=e[i+1];e[i]=n*h+o*a+c,e[i+1]=s*h+r*a+l}},j=(e,t,n)=>{const o=2**e;let s=0;for(let r=o/2;r>=1;r/=2){const c=t&r?1:0,l=n&r?1:0;if(s+=r*r*(3*c^l),l===0){c===1&&(t=o-1-t,n=o-1-n);const i=t;t=n,n=i}}return s},T=32768,G=(e,t)=>{const n=[0];for(let o=0;o<=t;o++)n.push(n[o]+4**(o+e)+1);return n},x=(e,t,n,o)=>{const s=2**o;return Math.min(Math.max(Math.floor((e-t)/n*s),0),s-1)},H=(e,t)=>e[2]<t.x0||e[3]<t.y0||e[0]>t.x0+t.size||e[1]>t.y0+t.size||e[0]>e[2]||e[1]>e[3],V=(e,t,n)=>{if(H(e,n))return[];const{x0:o,y0:s,size:r}=n,c=x(e[0],o,r,t),l=x(e[2],o,r,t),i=x(e[1],s,r,t),h=x(e[3],s,r,t),a=new Array((l-c+1)*(h-i+1));let f=0;for(let u=c;u<=l;u++)for(let d=i;d<=h;d++)a[f++]=j(t,u,d);return a.sort((u,d)=>u-d)},W=(e,t,n)=>{const o=[];for(const s of n){const[r,c]=e.cellRange(t,s);c>r&&o.push({start:r,end:c,cells:[s]})}return o},Y=(e,t=T)=>{const n=[...e].sort((s,r)=>s.start-r.start),o=[];for(const s of n){const r=o[o.length-1];r&&s.start-r.end<=t?(r.end=Math.max(r.end,s.end),r.cells.push(...s.cells)):o.push({start:s.start,end:s.end,cells:[...s.cells]})}return o},K=(e,t)=>{const n=C(t),o=[],s=[];for(const[r,c]of[[e[0],e[1]],[e[2],e[1]],[e[0],e[3]],[e[2],e[3]]])o.push(n.a*r+n.b*c+n.tx),s.push(n.c*r+n.d*c+n.ty);return[Math.min(...o),Math.min(...s),Math.max(...o),Math.max(...s)]},J=async(e,t,n,o)=>{const s=await e.geneIndex(t),r=K(n,o),c=[];for(let a=0;a<=s.Dmax;a++){const f=V(r,a+s.g,e.extent);for(const u of Y(W(s,a,f)))c.push(await e.readCoords(u.start,u.end))}let l=0;for(const a of c)l+=a.length;const i=new Float32Array(l);let h=0;for(const a of c){O(a,o);for(let f=0;f+1<a.length;f+=2){const u=a[f],d=a[f+1];u<n[0]||u>n[2]||d<n[1]||d>n[3]||(i[h++]=u,i[h++]=d)}}return i.slice(0,h)},X={float32:4,uint32:4,int32:4,uint64:8,int64:8,float64:8,uint8:1},I=0xffffffffffffffffn,b=(e,t)=>{const n=t.codecs?.[0];if(t.zarr_format!==3||n?.name!=="sharding_indexed")throw new Error(`${e}: not a sharded zarr v3 array`);const o=n.configuration,s=o.codecs??[];if(s.length!==1||s[0].name!=="bytes"||s[0].configuration?.endian==="big")throw new Error(`${e}: chunks must be uncompressed little-endian`);const r=X[t.data_type];if(!r)throw new Error(`${e}: unsupported data type ${t.data_type}`);const c=t.shape,l=t.chunk_grid.configuration.chunk_shape,i=o.chunk_shape;for(let u=1;u<c.length;u++)if(i[u]!==c[u]||l[u]!==c[u])throw new Error(`${e}: only dim 0 may be chunked`);const h=l[0]/i[0],a=(o.index_codecs??[]).some(u=>u.name==="crc32c")?4:0,f=c.slice(1).reduce((u,d)=>u*d,1);return{url:e,shape:c,dtype:t.data_type,itemBytes:r,rowBytes:f*r,chunkRows:i[0],shardRows:l[0],chunksPerShard:h,indexLocation:o.index_location==="start"?"start":"end",indexBytes:16*h+a,separator:t.chunk_key_encoding?.configuration?.separator??"/"}},A=async(e,t)=>{const n=e.suffixLength!==void 0?`bytes=-${e.suffixLength}`:`bytes=${e.offset}-${e.offset+e.length-1}`,o=await fetch(e.url,{headers:{Range:n},signal:t});if(o.status===404)return null;if(!o.ok)throw new Error(`${e.url}: HTTP ${o.status}`);const s=new Uint8Array(await o.arrayBuffer());return o.status===206?s:e.suffixLength!==void 0?s.subarray(s.length-e.suffixLength):s.subarray(e.offset,e.offset+e.length)};class v{constructor(t,n=A){this.meta=t,this.fetchRange=n,this.indexCache=new Map}shardUrl(t){const n=this.meta.shape.slice(1).map(()=>"0");return`${this.meta.url}/c${this.meta.separator}${[t,...n].join(this.meta.separator)}`}shardIndex(t){let n=this.indexCache.get(t);if(!n){const{indexBytes:o,indexLocation:s,chunksPerShard:r}=this.meta,c=this.shardUrl(t);n=this.fetchRange(s==="end"?{url:c,suffixLength:o}:{url:c,offset:0,length:o},void 0).then(l=>{if(!l)return null;const i=new DataView(l.buffer,l.byteOffset,l.byteLength),h=[],a=[];for(let f=0;f<r;f++){const u=i.getBigUint64(16*f,!0),d=i.getBigUint64(16*f+8,!0);h.push(u===I?-1:Number(u)),a.push(d===I?-1:Number(d))}return{offsets:h,nbytes:a}}),n.catch(()=>this.indexCache.delete(t)),this.indexCache.set(t,n)}return n}async readRows(t,n,o){const{rowBytes:s,chunkRows:r,shardRows:c}=this.meta,l=new Uint8Array(Math.max(0,n-t)*s);if(n<=t)return l;const i=[];for(let h=Math.floor(t/c);h*c<n;h++){const a=h*c,f=Math.max(t,a)-a,u=Math.min(n,a+c)-a;i.push(this.shardIndex(h).then(async d=>{if(!d)return;const y=this.shardUrl(h),g=[];let w=Math.floor(f/r);const p=Math.floor((u-1)/r);for(;w<=p;){if(d.offsets[w]<0){w++;continue}if(d.nbytes[w]!==r*s)throw new Error(`${y}: chunk ${w} is not an uncompressed full chunk`);let m=w;for(;m<p&&d.offsets[m+1]===d.offsets[m]+d.nbytes[m]&&d.nbytes[m+1]===d.nbytes[m];)m++;const $=Math.max(f,w*r),B=Math.min(u,(m+1)*r),L=d.offsets[w]+($-w*r)*s,U=(a+$-t)*s;g.push(this.fetchRange({url:y,offset:L,length:(B-$)*s},o).then(E=>{E&&l.set(E,U)})),w=m+1}await Promise.all(g)}))}return await Promise.all(i),l}}const k="hilbert-lod-points",Q=(e,t)=>{const n=new DataView(e.buffer,e.byteOffset,e.byteLength),o=[];if(t==="uint64")for(let s=0;s+8<=e.byteLength;s+=8)o.push(Number(n.getBigUint64(s,!0)));else if(t==="uint32")for(let s=0;s+4<=e.byteLength;s+=4)o.push(n.getUint32(s,!0));else throw new Error(`unexpected index dtype ${t}`);return o},P=async e=>{const t=await fetch(e);if(!t.ok)return null;try{return await t.json()}catch{return null}};class R{constructor(t,n,o,s,r,c){this.url=t,this.attrs=n,this.geneOffsets=o,this.levelOffsets=s,this.genes=n.genes,this.extent=n.extent,this.K=n.K,this.g=n.g,this.P=n.P,this.Dmax=n.Dmax,this.B=G(n.g,n.Dmax),this.coords=new v(b(`${t}/coords`,r.coords),c),this.cellIndex=new v(b(`${t}/index/cell_index`,r["index/cell_index"]),c)}static async open(t,n,o=A){const s=n??await P(`${t}/zarr.json`),r=s?.attributes;if(r?.format!==k)throw new Error(`${t} is not a ${k} store`);if(r.format_version!==1)throw new Error(`${t}: unsupported format_version ${r.format_version}`);const c=["coords","index/gene_offsets","index/level_offsets","index/cell_index"],l=s.consolidated_metadata?.metadata??{},i={};await Promise.all(c.map(async y=>{if(i[y]=l[y]??await P(`${t}/${y}/zarr.json`),!i[y])throw new Error(`${t}/${y} is missing`)}));const h=async y=>{const g=b(`${t}/${y}`,i[y]),w=await new v(g,o).readRows(0,g.shape[0]);return{values:Q(w,g.dtype),shape:g.shape}},[a,f]=await Promise.all([h("index/gene_offsets"),h("index/level_offsets")]),u=f.shape[1],d=[];for(let y=0;y<f.shape[0];y++)d.push(f.values.slice(y*u,(y+1)*u));return new R(t,r,a.values,d,i,o)}geneRows(t){return[this.geneOffsets[t],this.geneOffsets[t+1]]}async geneIndex(t,n){const o=await this.cellIndex.readRows(t,t+1,n),s=new Uint32Array(o.buffer,o.byteOffset,o.byteLength/4),[r,c]=this.geneRows(t),l=this.levelOffsets[t],i=this.B,{g:h,Dmax:a}=this;return{gene:t,start:r,end:c,g:h,Dmax:a,levelStart:f=>l[f],levelEnd:f=>l[f+1],cellRange:(f,u)=>[r+s[i[f]+u],r+s[i[f]+u+1]],cellCount:(f,u)=>s[i[f]+u+1]-s[i[f]+u]}}async readCoords(t,n,o){const s=await this.coords.readRows(t,n,o);return new Float32Array(s.buffer,s.byteOffset,s.byteLength/4)}}const M=self;let _=null;M.onmessage=async e=>{const t=e.data||{};try{if(t.type==="OPEN"){_=R.open(t.url,t.root).then(c=>({store:c,toWorld:t.toWorld})),_.catch(()=>{});return}if(!_)return;const{store:n,toWorld:o}=await _,[s,r]=n.geneRows(t.gene);if(t.type==="REGION"){const c=await J(n,t.gene,t.box,o);M.postMessage({type:"REGION_DONE",requestId:t.requestId,gene:t.gene,positions:c},[c.buffer]);return}if(t.type==="DENSITY"){const c=await n.readCoords(s,r);O(c,o);const{x0:l,y0:i,size:h}=n.extent,a=[[l,i],[l+h,i],[l,i+h],[l+h,i+h]].map(([w,p])=>[o.a*w+o.b*p+o.tx,o.c*w+o.d*p+o.ty]),f=Math.max(...a.map(w=>w[0])),u=Math.max(...a.map(w=>w[1])),d=D(f,u,t.gridSize,F(o)),{polygons:y,counts:g}=z(N(c,d),d,t.capMax,t.targetMax);M.postMessage({type:"DENSITY_DONE",requestId:t.requestId,gene:t.gene,polygons:y,counts:g},[y.buffer,g.buffer])}}catch(n){console.error(n),M.postMessage({type:"ERROR",requestId:t.requestId,payload:n instanceof Error?n.message:"Failed to read the transcript store"})}};
|
|
2
|
+
//# sourceMappingURL=hlodTranscripts.worker-CjhNLk56.js.map
|