celldega 0.4.5 → 0.4.6
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/package.json
CHANGED
|
@@ -2128,7 +2128,7 @@ ${I.stack}`:B}var AC=0,O0=new TextEncoder("utf-8"),r_=typeof O0.encodeInto=="fun
|
|
|
2128
2128
|
grayscale = clamp(grayscale, 0.0, 1.0);
|
|
2129
2129
|
// Apply custom color and scaled opacity
|
|
2130
2130
|
color = vec4(uColor, grayscale);
|
|
2131
|
-
`},A}updateState(A){super.updateState(A);let{props:g,oldProps:B}=A;(g.color!==B.color||g.opacityScale!==B.opacityScale)&&this.setState({uniforms:{uColor:g.color.map(Q=>Q/255),uOpacityScale:g.opacityScale}})}draw(A){let{uniforms:g}=this.state;super.draw({...A,uniforms:{...A.uniforms,...g}})}};var BM=(I,A,g)=>B=>{let{bbox:{left:Q,bottom:C,right:E,top:i}}=B.tile,{width:o,height:t}=I;return new gN(B,{data:null,image:B.data,bounds:[BE(Q,0,o),BE(C,0,t),BE(E,0,o),BE(i,0,t)],color:A,opacityScale:g})};var u_=(I,A)=>{let g=I.img.landscape_parameters.max_pyramid_zoom,B=5;return new Ce({id:A.button_name,tileSize:I.dimensions.tileSize,refinementStrategy:"no-overlap",minZoom:-7,maxZoom:0,maxCacheSize:20,extent:[0,0,I.dimensions.width,I.dimensions.height],getTileData:AN(I.global_base_url,A.name,I.img.image_format,g,ZI),renderSubLayers:BM(I.dimensions,A.color,B)})},C2=async I=>I.img.image_info.map(g=>u_(I,g)),IN=(I,A)=>{I.image_layers=I.image_layers.map(g=>g.clone({visible:A}))},E2=(I,A,g)=>{I.image_layers=I.image_layers.map(B=>B.id.startsWith(A)?B.clone({visible:g}):B)},i2=(I,A,g,B,Q)=>{let C=Q[g];A.image_layers=A.image_layers.map(E=>E.id.startsWith(g)?E.clone({renderSubLayers:BM(I.dimensions,C,B),id:g+"-"+B}):E)};var o2=I=>{let A=[0,0,0,255],{width:g,height:B}=I.dimensions;return new no({id:"background-layer",data:[{polygon:[[0,0],[g,0],[g,B],[0,B]]}],getPolygon:C=>C.polygon,getFillColor:A,pickable:!1})},t2=(I,A)=>{I.background_layer=I.background_layer.clone({visible:A})};var NB=(I,A)=>{let g=A.length===I.selected_genes.length&&A.every((B,Q)=>B===I.selected_genes[Q]);I.selected_genes=g?[]:A};var QE=async(I,A,g,B)=>{var Q=g+"/cbg/"+B+".parquet",C=await IQ(Q,ZI.fetch);let E=C.getChild("__index_level_0__").toArray(),i=C.getChild(B).toArray(),o=new Array(I.cell_names_array.length).fill(0);E.forEach((t,a)=>{if(I.cell_name_to_index_map.has(t)){let e=I.cell_name_to_index_map.get(t),s=Number(i[a]),D=Number(A.meta_gene[B].max),n=Math.log1p(s),r=Math.log1p(D);o[e]=n/r*255}else console.log("Cell name not found in cell_name_to_index_map")}),I.cell_exp_array=o};var BN=async(I,A)=>{let g=I.global_base_url;var B=await IQ(g+"/tbg/"+A+".parquet",ZI.fetch);let Q=B.getChild("__index_level_0__").toArray(),C=B.getChild(A).toArray(),E=new Array(I.cats.tile_names_array.length).fill(0);Q.forEach((i,o)=>{if(I.cats.tile_name_to_index_map.has(i)){let t=I.cats.tile_name_to_index_map.get(i),a=Math.log1p(Number(C[o])),e=Math.log(Number(I.genes.meta_gene[A].max));E[t]=a/e*255}}),I.cats.tile_exp_array=E};var a2=I=>{let A=document.createElement("input");A.setAttribute("type","text"),A.setAttribute("placeholder","Gene search"),A.style.width="500px",A.style.height="20px",A.style.marginTop="5px",A.style.display="inline-block",A.style.padding="1pt 2pt",I.gene_search_input=A};var QN={},e2=async I=>{if(!(I in QN)){let A,Q=`https://www.ebi.ac.uk/proteins/api/proteins?offset=0&size=100&exact_gene=${I}&organism=human`;try{let i=(await(await fetch(Q,{headers:{Accept:"application/json"}})).json()).filter(o=>o.proteinExistence==="Evidence at protein level").filter(o=>"comments"in o).filter(o=>"gene"in o).filter(o=>o.gene[0].name.value.toLowerCase()===I.toLowerCase()).sort((o,t)=>t.comments.length-o.comments.length);if(i.length>0){let t=`https://rest.uniprot.org/uniprotkb/${i[0].accession}.json`;try{let e=await(await fetch(t)).json();try{let s=e.proteinDescription.recommendedName.fullName.value,D=e.comments?.[0]?.texts?.[0]?.value||"Unable to obtain UniProt description.";A={name:s,description:D}}catch(s){A={name:"",description:"Unable to obtain UniProt description."},console.log(s)}}catch(a){A={name:"",description:"Unable to obtain UniProt description."},console.log(a)}}}catch(C){A={name:"",description:"Unable to obtain UniProt description."},console.log(C)}QN[I]=A}};var QM=[],p_=async(I,A,g)=>{let B=A.genes.gene_search_input.value,Q=B===""?"cluster":B;(B===""||A.genes.gene_names.includes(B))&&(mI(A.cats,Q),NB(A.genes,B===""?[]:[B]),VI(A.cats,[]),B!==""&&QM.includes(B)&&await BN(A,B),Fr(A,g),I.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]}),await BQ(A.genes,B))},m_=async(I,A,g)=>{let B=g.genes.gene_search_input.value,Q=B===""?"cluster":B;if(B===""||g.genes.gene_names.includes(B)){mI(g.cats,Q),NB(g.genes,B===""?[]:[B]),VI(g.cats,[]);let C=g.genes.gene_names.includes(B);C&&await QE(g.cats,g.genes,g.global_base_url,B),JB(A,g,!C),kB(A,Q),qB(A,Q),UB(g.genes,A);let E=FI(A,g.close_up);I.setProps({layers:E});let i=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",i?1:.25),!i){let o=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===B}).attr("opacity",1);if(!o.empty()){let t=o.node().getBoundingClientRect().top,a=g.containers.bar_gene.getBoundingClientRect().top,e=t-a+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:e,behavior:"smooth"})}await BQ(g.genes,B)}}},CM=async(I,A,g,B)=>{QM=["cluster",...B.genes.gene_names],B.genes.gene_search.style.width="115px",a2(B.genes);let Q=document.createElement("datalist");Q.id="genes_datalist",B.genes.gene_search_input.setAttribute("list",Q.id),QM.forEach(E=>{let i=document.createElement("option");i.value=E,Q.appendChild(i)}),B.genes.gene_search_input.style.width="156px",B.genes.gene_search_input.style.maxWidth="250px",B.genes.gene_search_input.style.height="12px",B.genes.gene_search_input.style.fontSize="12px",B.genes.gene_search_input.style.border="1px solid #d3d3d3",B.genes.gene_search_input.style.borderRadius="0",B.genes.gene_search_input.style.display="inline-block",B.genes.gene_search_input.style.padding="1pt 2pt",B.genes.gene_search.appendChild(B.genes.gene_search_input),B.genes.gene_search.appendChild(Q),B.genes.gene_text_box=document.createElement("div"),B.genes.gene_text_box.textContent="",B.genes.gene_text_box.style.marginTop="3px",B.genes.gene_text_box.style.color="#222222",B.genes.gene_text_box.style.border="1px solid #d3d3d3",B.genes.gene_text_box.style.height="69px",B.genes.gene_text_box.style.overflow="scroll",B.genes.gene_text_box.style.fontSize="12px",B.genes.gene_text_box.style.cursor="default",B.genes.gene_text_box.style.width="142px",B.genes.gene_text_box.style.paddingLeft="2px",B.genes.gene_text_box.style.paddingRight="17px",B.genes.gene_text_box.addEventListener("wheel",E=>{let{scrollTop:i,scrollHeight:o,clientHeight:t}=B.genes.gene_text_box,a=i===0,e=i+t===o;(a&&E.deltaY<0||e&&E.deltaY>0)&&E.preventDefault()}),B.genes.gene_search.appendChild(B.genes.gene_text_box),B.genes.gene_search_input.value="",mI(B.cats,"cluster");let C;I==="sst"?(C=()=>p_(A,B,g),B.genes.gene_search_input.style.marginTop="10px",B.genes.gene_search.style.height="50px"):(C=()=>m_(A,g,B),B.genes.gene_search_input.style.marginTop="5px"),B.genes.gene_search_input.addEventListener("input",C)},BQ=async(I,A)=>{if(A!==""){I.gene_text_box.textContent="loading",await e2(A);let g=QN[A];g&&g.name&&g.description?I.gene_text_box.innerHTML=`<span style="color: blue;">${g.name}</span><br>${g.description}`:I.gene_text_box.textContent=""}else I.gene_text_box.textContent="";I.gene_text_box.scrollTo({top:0,behavior:"smooth"})};var s2=async(I,A,g)=>{let B=A.map(a=>`${I}/transcript_tiles/transcripts_tile_${a.tileX}_${a.tileY}.parquet`);var Q=await $0(g.cache.trx,B,ZI),C=Q.filter(a=>a!==null),E=Pp(C),i=E.getChild("name").toArray();g.genes.trx_names_array=i;var o=Se(E);let t=o.attributes.getPosition.value;return g.combo_data.trx=g.genes.trx_names_array.map((a,e)=>({name:a,x:t[e*2],y:t[e*2+1]})),o};var x_=async(I,A,g,B,Q)=>{let C=Q.genes.trx_names_array[I.index];if(!C){console.error("Invalid gene name at index:",I.index);return}let E=C===Q.cats.cat,i=E?"cluster":C;JB(B,Q,Q.cats.cat===C),mI(Q.cats,i),NB(Q.genes,[C]),VI(Q.cats,[]),await QE(Q.cats,Q.genes,Q.global_base_url,C),kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);if(g.setProps({layers:o}),Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",E?1:.25),E)Q.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let t=Q.genes.svg_bar_gene.selectAll("g").filter(function(){let a=lI(this).select("text").node();return a&&a.textContent===C}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=Q.containers.bar_gene.getBoundingClientRect().top,s=a-e+Q.containers.bar_gene.scrollTop;Q.genes.svg_bar_gene.attr("opacity",1),Q.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.genes.gene_search_input.value=Q.genes.gene_search_input.value!==C?C:"",BQ(Q.genes,E?"":C)},D2=I=>new nC({id:"trx-layer",data:I.trx_data,pickable:!0,getColor:(g,B)=>{let Q=I.trx_names_array[B.index],C=I.color_dict_gene[Q],E=I.selected_genes.length===0||I.selected_genes.includes(Q)?255:5;return[...C,E]}}),n2=(I,A,g)=>{A.trx_layer=A.trx_layer.clone({onClick:(B,Q)=>x_(B,Q,I,A,g)})},r2=async(I,A,g,B)=>{B.genes.trx_data=await s2(I,A,B),g.trx_layer=g.trx_layer.clone({data:B.genes.trx_data})},c2=(I,A)=>{I.trx_layer=I.trx_layer.clone({visible:A})},CN=(I,A)=>{I.trx_layer=I.trx_layer.clone({getRadius:A})},UB=(I,A)=>{A.trx_layer=A.trx_layer.clone({id:"trx-layer-"+I.selected_genes.join("-")})};var W_=()=>document.createElement("input"),G2=I=>{I.image_layer_sliders=I.image_info.map(A=>{let g=document.createElement("input");return g.name=A.button_name,g})},T_=async(I,A,g)=>{B2(g,A.sliders.tile.value/100),I.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},b_=async(I,A,g)=>{h2(A,g.sliders.cell.value/5);let Q=FI(A,g.close_up);I.setProps({layers:Q})},Z_=async(I,A,g)=>{CN(A,g.sliders.trx.value/100);let Q=FI(A,g.close_up);I.setProps({layers:Q})},w2=(I,A,g,B)=>async()=>{let C=B.img.image_layer_sliders.filter(i=>i.name===I)[0].value/10;i2(B,g,I,C,B.img.image_layer_colors);let E=FI(g,B.close_up);A.setProps({layers:E})},EM=(I,A,g)=>{I.type="range",I.min="0",I.max="100",I.value=A,I.className="slider",I.style.width="75px",I.addEventListener("input",g)},EN=(I,A,g,B)=>{let Q,C,E=W_();switch(I){case"tile":Q=100,C=()=>T_(A,B,g);break;case"cell":Q=B.genes.trx_ini_raidus*100,C=()=>b_(A,g,B);break;case"trx":Q=B.genes.trx_ini_raidus*100,C=()=>Z_(A,g,B);break;default:console.log("no match",I)}EM(E,Q,C),B.sliders[I]=E},Yo=(I,A)=>{I.disabled=!A};var mE=I=>[I.mat_layer,I.row_cat_layer,I.col_cat_layer,I.row_label_layer,I.col_label_layer,I.row_dendro_layer,I.col_dendro_layer],N2=({layer:I,viewport:A})=>A.id==="matrix"&&I.id.includes("mat-layer")||A.id==="rows"&&I.id==="row-layer"||A.id==="cols"&&I.id==="col-layer"||A.id==="rows"&&I.id.includes("row-label-layer")||A.id==="cols"&&I.id==="col-label-layer"||A.id==="dendro_rows"&I.id==="row-dendro-layer"?!0:A.id==="dendro_cols"&&I.id==="col-dendro-layer";var iM=(I,A,g)=>new bw({id:g+"-dendro-layer",data:A.dendro.polygons[g],getPolygon:Q=>Q.coordinates,getFillColor:[0,0,0,90],getLineColor:[255,255,255,255],lineWidthMinPixels:0,pickable:!0,antialiasing:!1}),k2=(I,A,g)=>{I[g+"_dendro_layer"]=I[g+"_dendro_layer"].clone({data:A.dendro.polygons[g]})},Rr=(I,A,g)=>{let B=!1;A.order.current[g]==="clust"&&(B=!0),I[g+"_dendro_layer"]=I[g+"_dendro_layer"].clone({visible:B})},P_=(I,A,g,B,Q)=>{B.click.type=Q+"_dendro",B.click.value={name:I.object.properties.name,selected_names:I.object.properties.all_names},Object.keys(B.model).length>0&&(B.model.set("click_info",null),B.model.set("click_info",B.click),B.model.save_changes()),typeof B.custom_callbacks[Q+"_dendro"]=="function"&&B.custom_callbacks[Q+"_dendro"](I.object.properties.all_names)},oM=(I,A,g,B)=>{A[B+"_dendro_layer"]=A[B+"_dendro_layer"].clone({onClick:Q=>P_(Q,I,A,g,B)})};var jB,y2=!0,O_=I=>{y2=I},Le=I=>{let A=lI(I.currentTarget);return A.style("color")==="blue"?(A.style("color","gray"),jB=!1):(A.style("color","blue"),jB=!0),jB},v_=(I,A,g,B,Q)=>{let C=lI(I.currentTarget),E=C.text().toLowerCase();E==="var"?E="rankvar":E==="sum"&&(E="rank"),C.classed("active")===!1&&(C.classed("active",!0),lI(Q.el).selectAll(".button-"+A).classed("active",!1).style("border-color",Q.buttons.gray),C.style("border-color",Q.buttons.blue).classed("active",!0),Q.order.current[A]=E,B.mat_layer=B.mat_layer.clone({updateTriggers:{getPosition:[Q.order.current.row,Q.order.current.col]}}),A==="row"?B.row_label_layer=B.row_label_layer.clone({updateTriggers:{getPosition:Q.order.current.row}}):B.col_label_layer=B.col_label_layer.clone({updateTriggers:{getPosition:Q.order.current.col}}),Rr(B,Q,A),g.setProps({layers:mE(B)}))},l2=(I,A,g,B=40,Q,C,E,i)=>{let o="button-"+Q,t;g===!0?t=i.buttons.blue:t=i.buttons.gray,A=A.toUpperCase(),lI(I).append("div").classed(o,!0).classed("active",g).text(A).style("width",B+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color",t).style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif').on("click",a=>v_(a,Q,C,E,i))},bt=(I,A,g,B="blue",Q=40,C="button",E,i,o)=>{let t;g==="IMG"?A==="sst"?t=a=>V_(a,E,i):t=a=>X_(a,E,i,o):g==="TILE"?t=a=>__(a,E,i,o):g==="TRX"?t=a=>z_(a,E,i,o):g==="CELL"?t=a=>$_(a,E,i,o):t=j_(g,E,i,o),lI(I).append("div").attr("class",C).text(g).style("width",Q+"px").style("text-align","left").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color",B).style("margin-top","5px").style("margin-left","5px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif;').on("click",t)},j_=(I,A,g,B)=>async Q=>{if(y2){Le(Q),E2(g,I,jB);let C=B.img.image_layer_sliders.filter(i=>i.name===I)[0];Yo(C,jB);let E=FI(g,B.close_up);A.setProps({layers:E})}},V_=async(I,A,g)=>{Le(I),$p(g,jB),A.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},X_=async(I,A,g,B)=>{Le(I),IN(g,jB),t2(g,jB),lI(B.containers.image).selectAll(".img_layer_button").style("color",jB?"blue":"gray"),O_(jB),B.img.image_layer_sliders.map(C=>Yo(C,jB));let Q=FI(g,B.close_up);A.setProps({layers:Q})},z_=async(I,A,g,B)=>{Le(I),Yo(B.genes.trx_slider,jB),c2(g,jB);let Q=FI(g,B.close_up);A.setProps({layers:Q})},__=async(I,A,g,B)=>{Le(I),Yo(B.sliders.tile,jB),I2(g,jB),A.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},$_=async(I,A,g,B)=>{Le(I),Yo(B.sliders.cell,jB),R2(g,jB),F2(g,jB);let Q=FI(g,B.close_up);A.setProps({layers:Q})};var iN=(I,A,g)=>{let B;return(...Q)=>{let E=()=>{B=null,g||I.apply(void 0,Q)},i=g&&!B;clearTimeout(B),B=setTimeout(E,A),i&&I.apply(void 0,Q)}};var tM=()=>document.createElement("div"),Zt=(I,A,g,B,Q)=>{Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1);let C=lI(I.currentTarget),E=C.attr("font-weight")==="bold";Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",.25),E?(C.attr("font-weight","normal"),Q.cats.svg_bar_cluster.selectAll("g").attr("opacity",1)):(C.attr("font-weight","bold"),C.attr("opacity",1)),mI(Q.cats,"cluster"),VI(Q.cats,[A.name]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o}),Q.genes.gene_search_input.value="",BQ(Q.genes,"")},Mr=async(I,A,g,B,Q)=>{Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1);let C=lI(I.currentTarget),E=C.attr("font-weight")==="bold";Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",.25),E?(C.attr("font-weight","normal"),Q.genes.svg_bar_gene.selectAll("g").attr("opacity",1)):(C.attr("font-weight","bold"),C.attr("opacity",1));let i=A.name,o=i===Q.cats.cat,t=o?"cluster":i;JB(B,Q,Q.cats.cat===i),mI(Q.cats,t),NB(Q.genes,[i]),VI(Q.cats,[]),await QE(Q.cats,Q.genes,Q.global_base_url,i),kB(B,t),qB(B,t),UB(Q.genes,B);let a=FI(B,Q.close_up);g.setProps({layers:a}),Q.genes.gene_search_input.value=Q.genes.gene_search_input.value!==i?i:"",BQ(Q.genes,o?"":i)},aM=(I,A,g,B,Q,C,E,i)=>{I.className="bar_container",I.style.width="107px",I.style.height="72px",I.style.marginLeft="5px",I.style.overflowY="auto",I.style.border="1px solid #d3d3d3",I.addEventListener("wheel",r=>{let{scrollTop:c,scrollHeight:w,clientHeight:h}=I,G=c===0,N=c+h===w;(G&&r.deltaY<0||N&&r.deltaY>0)&&r.preventDefault()});let o=15,t=o*(B.length+1);g.attr("width",100).attr("height",t).attr("font-family","sans-serif").attr("font-size","13").attr("text-anchor","end").style("user-select","none"),I.appendChild(g.node());let a=90,e=B.map(r=>r.value),s=Aa().domain(qo(e.length)).range([0,(o+1)*e.length]),D=Ia().domain([0,pe(e)]).range([0,a]),n=g.selectAll("g").data(B).join("g").attr("transform",(r,c)=>`translate(2,${s(c)+2})`).on("click",(r,c)=>A(r,c,C,E,i));n.append("rect").attr("fill",r=>{let c=Q[r.name];return`rgb(${c[0]}, ${c[1]}, ${c[2]})`}).attr("width",r=>D(r.value)).attr("height",s.bandwidth()-1),n.append("text").attr("fill","black").attr("x","5px").attr("y",s.bandwidth()/2-1).attr("dy","0.35em").attr("text-anchor","start").text(r=>r.name)},Pt=(I,A,g,B,Q,C,E,i)=>{let t=15*(A.length+1);I.attr("height",t);let a=90,e=A.map(w=>w.value),s=Aa().domain(qo(e.length)).range([0,16*e.length]),D=Ia().domain([0,pe(e)]).range([0,a]),n=I.selectAll("g").data(A,w=>w.name),r=n.enter().append("g").attr("transform",(w,h)=>`translate(2,${s(h)+2})`).on("click",(w,h)=>B(w,h,C,E,i));r.append("rect").attr("width",0).attr("height",s.bandwidth()-1).transition().duration(750).attr("width",w=>D(w.value)),r.append("text").attr("fill","black").attr("x","5px").attr("y",s.bandwidth()/2-1).attr("dy","0.35em").attr("text-anchor","start").text(w=>w.name).attr("opacity",0).transition().duration(750).attr("opacity",1);let c=n.merge(r);c.transition().duration(750).attr("transform",(w,h)=>`translate(2,${s(h)+2})`),c.select("rect").attr("width",w=>D(w.value)).attr("fill",w=>{let h=g[w.name]||[0,0,0],G=Q.length===0||Q.includes(w.name)?1:.1;return`rgba(${h[0]}, ${h[1]}, ${h[2]}, ${G})`}),c.select("text").text(w=>w.name),n.exit().transition().duration(750).attr("opacity",0).remove()};var M2=I=>{I.dendro={},I.dendro.default_level=5,I.dendro.tri_height=.1,I.dendro.trap_height=.03,I.dendro.trap_float=.005,I.dendro.dendro_args={},I.dendro.group_level={},I.dendro.polygons={},I.dendro.update_dendro=!1,I.dendro.selected_clust_names=[],I.dendro.group_info={},I.dendro.default_link_level=.5,I.dendro.output_label_format="list",I.dendro.min_dist={},I.dendro.min_dist.row=0,I.dendro.min_dist.col=0;let A=["col","row"],g;I.dendro.max_linkage_dist={};let B;A.forEach(Q=>{g=I.linkage[Q],I.dendro.max_linkage_dist[Q]=g[g.length-1][2]+.01,B=I.dendro.max_linkage_dist[Q]*I.dendro.default_link_level,eM(I,Q,B),sM(I,Q)})},eM=(I,A,g)=>{let B,Q,C={};I[A+"_nodes"].forEach((a,e)=>{C[e]=[e],a.group_links=e});let E=I[A+"_nodes"].length,i=0,o;I.linkage[A].forEach((a,e)=>{a[2]>i&&a[2]<g&&(B=a[0],Q=a[1],o=E+e,C[o]=[],C[o]=C[o].concat(C[B],C[Q]),delete C[B],delete C[Q])});let t={};Object.entries(C).forEach(([a,e])=>{e.forEach(s=>{t[s]=a})}),I[A+"_nodes"].forEach((a,e)=>{a.group_links=t[e]})},sM=(I,A)=>{var g={},B=I[A+"_nodes"],Q,C,E=I.mat["num_"+A+"s"];A==="row"?(Q=I.viz.mat_width,C=Q/E):(Q=I.viz.mat_height,C=Q/E);var i=I.order.current[A];B.forEach((t,a)=>{var e=t.group_links,s;if(A==="row"){let r=I.mat.num_rows-I.mat.orders.row[i][a];s=I.viz.row_offset*(r+1)}else{let r=I.mat.num_cols-I.mat.orders.col[i][a];s=I.viz.col_offset*(r+0)}var D=s+C,n=t.name;n.indexOf(": ")>=0&&(n=n.split(": ")[1]),Object.prototype.hasOwnProperty.call(g,e)||(g[e]={name_top:n,name_bot:n,pos_top:s,pos_bot:D,pos_mid:(s+D)/2,name:e,all_names:[],axis:A}),g[e].all_names.push(n),s<g[e].pos_top&&(g[e].name_top=n,g[e].pos_top=s,g[e].pos_mid=(s+g[e].pos_bot)/2),D>g[e].pos_bot&&(g[e].name_bot=n,g[e].pos_bot=D,g[e].pos_mid=(g[e].pos_top+D)/2)});var o=[];Object.values(g).forEach(t=>{o.push(t)}),I.dendro.group_info[A]=o},dr=(I,A)=>{I.dendro.polygons[A]=[],I.dendro.group_info[A].forEach(g=>{let{pos_top:B,pos_bot:Q,pos_mid:C}=g;if(A==="row"){let E=Q-B,i=7,o=[[i+100,C],[i,C-E/2],[i,C+E/2]];I.dendro.polygons[A].push({coordinates:o,properties:{...g,axis:A}})}else if(A==="col"){let E=Q-B,i=17,o=[[C,i+100],[C-E/2,i],[C+E/2,i]];I.dendro.polygons[A].push({coordinates:o,properties:{...g,axis:A}})}})};var JB=(I,A,g)=>{lI(A.containers.image).selectAll(".img_layer_button").style("color",g?"blue":"gray"),A.img.image_layer_sliders.map(B=>Yo(B,g)),IN(I,g)},DM=()=>{let I=document.createElement("div");return I.style.display="flex",I.style.flexDirection="row",I.style.border="1px solid #d3d3d3",I.className="ui_container",I.style.height="100px",I},d2=()=>{let I=document.createElement("div");return I.style.display="flex",I.style.flexDirection="row",I.className="ctrl_container",I.style.width="535px",I},kC=(I,A,g=null)=>{let B=document.createElement("div");return B.className=I,B.style.display="flex",B.style.flexDirection=A,g!==null&&(B.style.height=g+"px",B.style.overflow="scroll"),B},oN=I=>{let A=document.createElement("div");return A.className=I,A.style.width="100%",A.style.marginLeft="2px",A.style.marginTop="2px",A},J2=(I,A,g)=>{let B=DM(),Q=kC("button_container","column"),C=kC("slider_container","column"),E=33,i=["col","row"],o=["clust","sum","var","ini"];i.forEach(a=>{let e=kC(a,"row");lI(e).append("div").text(a.toUpperCase()).style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),o.forEach(s=>{l2(e,s,s==="clust",E,a,I,A,g)}),Q.appendChild(e)}),g.dendro.sliders={},i.forEach(a=>{g.dendro.sliders[a]=document.createElement("input"),g.dendro.sliders[a].type="range",g.dendro.sliders[a].min="0",g.dendro.sliders[a].max="100",g.dendro.sliders[a].value=50,g.dendro.sliders[a].className="slider",g.dendro.sliders[a].style.width="75px"});let t=(a,e,s,D)=>{e.dendro.sliders[s+"_value"]=e.dendro.max_linkage_dist[s]*D.target.value/100,eM(e,s,e.dendro.sliders[s+"_value"]),sM(e,s),dr(e,s),k2(A,e,s),a.setProps({layers:mE(A)})};return i.forEach(a=>{g.dendro.sliders[a].addEventListener("input",e=>t(I,g,a,e))}),g.dendro.sliders.col.style.marginTop="5px",g.dendro.sliders.row.style.marginTop="20px",lI(C).append("div").text("DENDRO").style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-left","20px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),C.appendChild(g.dendro.sliders.col),C.appendChild(g.dendro.sliders.row),Q.style.marginTop="15px",C.style.marginTop="0px",C.style.marginLeft="10px",B.appendChild(Q),B.appendChild(C),B},K2=(I,A,g)=>{let B=DM(),Q=d2(),C=kC("image_container","row"),E=kC("tile_container","row"),i=oN("tile_slider_container");return bt(C,"sst","IMG","blue",50,"button",I,A,g),bt(E,"sst","TILE","blue",50,"button",I,A,g),g.sliders={},EN("tile",I,A,g),i.appendChild(g.sliders.tile),B.appendChild(Q),E.appendChild(i),CM("sst",I,A,g),Q.appendChild(C),Q.appendChild(E),Q.appendChild(g.genes.gene_search),B},f2=(I,A,g,B)=>{let Q=DM(),C=d2();B.containers.image=kC("image_container","column");let E=kC("img_layers_container","column",72);E.style.width="135px",E.style.border="1px solid #d3d3d3",E.style.marginTop="3px",E.style.marginLeft="2px",E.addEventListener("wheel",r=>{let{scrollTop:c,scrollHeight:w,clientHeight:h}=E,G=c===0,N=c+h===w;(G&&r.deltaY<0||N&&r.deltaY>0)&&r.preventDefault()});let i=kC("cell_container","column");i.style.width="120px";let o=kC("cell_ctrl_container","row");o.style.marginLeft="0px";let t=kC("gene_container","column");t.style.marginTop="0px",t.style.width="125px";let a=kC("trx_container","row"),e=oN("cell_slider_container"),s=oN("trx_slider_container");bt(B.containers.image,"ist","IMG","blue",30,"button",A,g,B);let D=(r,c)=>r.image_layer_sliders.filter(w=>w.name===c),n=(r,c)=>{let w=c.button_name,h=kC("image_layer_container","row");h.style.height="21px",bt(h,"ist",w,"blue",75,"img_layer_button",A,g,B);let G=oN(w),N=D(r,w)[0],k=w2(w,A,g,B),y=iN(k,100);EM(N,50,y),G.appendChild(N),h.appendChild(G),E.appendChild(h)};if(B.img.image_info.map(r=>n(B.img,r)),bt(o,"ist","CELL","blue",40,"button",A,g,B),bt(a,"ist","TRX","blue",40,"button",A,g,B),B.containers.image.appendChild(E),B.sliders={},EN("cell",A,g,B),e.appendChild(B.sliders.cell),o.appendChild(e),B.containers.bar_cluster=tM(),aM(B.containers.bar_cluster,Zt,B.cats.svg_bar_cluster,B.cats.cluster_counts,B.cats.color_dict_cluster,A,g,B),B.containers.bar_gene=tM(),aM(B.containers.bar_gene,Mr,B.genes.svg_bar_gene,B.genes.gene_counts,B.genes.color_dict_gene,A,g,B),i.appendChild(o),i.appendChild(B.containers.bar_cluster),EN("trx",A,g,B),a.appendChild(s),s.appendChild(B.sliders.trx),t.appendChild(a),t.appendChild(B.containers.bar_gene),CM("ist",A,g,B),B.genes.gene_search.style.marginLeft="0px",Q.appendChild(C),C.appendChild(B.containers.image),C.appendChild(i),C.appendChild(t),C.appendChild(B.genes.gene_search),I.trim!==""){let r=document.createElement("div");lI(r).classed("name_container",!0).style("text-align","left").style("cursor","pointer").style("font-size","22px").style("font-weight","bold").style("color","#222222").style("margin-top","0px").style("margin-left","15px").style("margin-right","5px").style("user-select","none").text(I.toUpperCase()),Q.appendChild(r)}return Q};var A$=(I,A,g)=>{let B=I.polygon_cell_names[g.index],Q=I.dict_cell_cats[B],C;Q in I.color_dict_cluster?C=I.color_dict_cluster[Q]:C=[0,0,0];let E=I.selected_cats.length===0||I.selected_cats.includes(Q)?255:50;return[...C,E]},Y2=I=>new so({id:"path-layer",data:[],pickable:!0,widthScale:3,widthMinPixels:1,getPath:g=>g,getColor:(g,B)=>A$(I.cats,g,B),widthUnits:"pixels"}),g$=(I,A,g,B,Q)=>{let C=Q.cats.polygon_cell_names[I.index],E=Q.cats.dict_cell_cats[C];mI(Q.cats,"cluster"),VI(Q.cats,[E]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o})},U2=async(I,A,g,B)=>{let Q=await vp(I,A,B);g.path_layer=g.path_layer.clone({data:Q})},q2=(I,A,g)=>{A.path_layer=A.path_layer.clone({onClick:(B,Q)=>g$(B,Q,I,A,g)})},F2=(I,A)=>{I.path_layer=I.path_layer.clone({visible:A})},qB=(I,A)=>{I.path_layer=I.path_layer.clone({id:"path-layer-"+A})};var I$=async(I,A,g,B,Q)=>{let C="ontouchstart"in window||navigator.maxTouchPoints>0,E;C?E=Q.cats.cell_cats[I.index]:E=Q.tooltip_cat_cell,mI(Q.cats,"cluster"),VI(Q.cats,[E]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");if(Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",Q.cats.reset_cat?1:.25),Q.cats.reset_cat)Q.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let t=Q.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===E}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=Q.containers.bar_cluster.getBoundingClientRect().top,s=a-e+Q.containers.bar_cluster.scrollTop;Q.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o}),Q.genes.gene_search_input.value="",BQ(Q.genes,"")},S2=async(I,A)=>{let g=I+"/cell_metadata.parquet";var B=await IQ(g,ZI.fetch);let Q=Se(B);await Lp(A.genes,I),Hp(A.cats,B),up(A.cats);var C=await IQ(I+"/cell_clusters/cluster.parquet",ZI.fetch);pp(A.cats,C,"cluster"),xp(A.cats);let E=B.getChild("name").toArray(),i=Q.attributes.getPosition.value;return A.combo_data.cell=E.map((t,a)=>({name:t,cat:A.cats.dict_cell_cats[t],x:i[a*2],y:i[a*2+1]})),new nC({id:"cell-layer",radiusMinPixels:1,getRadius:5,pickable:!0,getColor:(t,a)=>Wp(A.cats,t,a),data:Q})},L2=(I,A,g)=>{A.cell_layer=A.cell_layer.clone({onClick:(B,Q)=>I$(B,Q,I,A,g)})},R2=(I,A)=>{I.cell_layer=I.cell_layer.clone({visible:A})},h2=(I,A)=>{I.cell_layer=I.cell_layer.clone({getRadius:A})},kB=(I,A)=>{I.cell_layer=I.cell_layer.clone({id:"cell-layer-"+A})};var tN=()=>[new DC({id:"ortho"})];var H2=(I,A,g,B,Q)=>{let C=Math.floor(I/Q),E=Math.floor(A/Q),i=Math.floor(g/Q),o=Math.floor(B/Q),t=[];for(let a=C;a<=E;a++)for(let e=i;e<=o;e++)t.push({tileX:a,tileY:e,name:a+"_"+e});return t};var u2=async({height:I,width:A,zoom:g,target:B},Q,C,E)=>{let i=E.img.landscape_parameters.tile_size,o=50,t=Math.pow(2,g),[a,e]=B,s=A/(2*t),D=I/(2*t);E.bounds={},E.bounds.min_x=a-s,E.bounds.max_x=a+s,E.bounds.min_y=e-D,E.bounds.max_y=e+D;let n=Q.viewManager.getViewports();if(!n||n.length===0){console.error("No viewports available");return}let r=H2(E.bounds.min_x,E.bounds.max_x,E.bounds.min_y,E.bounds.max_y,i);if(r.length<o){await r2(E.global_base_url,r,C,E),await U2(E.global_base_url,r,C,E),E.close_up=!0;let G=E.combo_data.trx.filter(y=>y.x>=E.bounds.min_x&&y.x<=E.bounds.max_x&&y.y>=E.bounds.min_y&&y.y<=E.bounds.max_y).map(y=>y.name).reduce((y,F)=>{let d=y.find(J=>J.name===F);return d?d.value+=1:y.push({name:F,value:1}),y},[]).filter(y=>y.value>0).sort((y,F)=>F.value-y.value);Pt(E.genes.svg_bar_gene,G,E.genes.color_dict_gene,Mr,E.genes.selected_genes,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});let l=E.combo_data.cell.filter(y=>y.x>=E.bounds.min_x&&y.x<=E.bounds.max_x&&y.y>=E.bounds.min_y&&y.y<=E.bounds.max_y).map(y=>y.cat).reduce((y,F)=>{let d=y.find(J=>J.name===F);return d?d.value+=1:y.push({name:F,value:1}),y},[]).filter(y=>y.value>0).sort((y,F)=>F.value-y.value);Pt(E.cats.svg_bar_cluster,l,E.cats.color_dict_cluster,Zt,E.cats.selected_cats,Q,C,E),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"})}else E.close_up&&(E.close_up=!1,Pt(E.genes.svg_bar_gene,E.genes.gene_counts,E.genes.color_dict_gene,Mr,E.genes.selected_genes,Q,C,E),Pt(E.cats.svg_bar_cluster,E.cats.cluster_counts,E.cats.color_dict_cluster,Zt,E.cats.selected_cats,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"}),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"}));let c=FI(C,E.close_up);Q.setProps({layers:c})};var B$=200,p2=iN(({viewState:I},A,g,B)=>(u2(I,A,g,B),typeof B.custom_callbacks.view_change=="function"&&B.custom_callbacks.view_change(I,B.close_up,g.trx_layer),I),B$);var m2=(I,A)=>{if(A.index===-1||!A.layer)return null;let g="",B="",Q="";return A.layer.id.startsWith("cell-layer")||A.layer.id.startsWith("path-layer")?(B=A.layer.id.startsWith("cell-layer")?I.cats.cell_names_array[A.index]:I.cats.polygon_cell_names[A.index],Q=I.cats.dict_cell_cats[B],g=`<div>cell: ${B}</div><div>cluster: ${Q}</div>`,I.tooltip_cat_cell=Q):A.layer.id.startsWith("trx-layer")&&(B=I.genes.trx_names_array[A.index],g=`<div>transcript: ${B}</div>`),Ho(".deck-tooltip").style("margin-top","75px"),{html:g}};var Q$=({isDragging:I})=>I?"grabbing":"pointer",x2=(I,A,g)=>new oo({parent:I,controller:{doubleClickZoom:!1},getCursor:Q$,width:A,height:g}),W2=(I,A)=>{I.setProps({views:A})},T2=(I,A)=>{I.setProps({getTooltip:g=>m2(A,g)})},b2=(I,A,g)=>{I.setProps({onViewStateChange:B=>{p2(B,I,A,g)}})},Z2=(I,A,g,B,Q)=>{let C={target:[A,g,B],zoom:Q};I.setProps({initialViewState:C})};var P2=(I,A)=>{I.image_format=A},O2=(I,A)=>{I.image_info=A},v2=(I,A)=>{A.forEach(g=>{I[g.button_name]=g.color})};var aN=async(I,A)=>{let g=await IQ(A+"/meta_gene.parquet",ZI.fetch),B=g.getChild("__index_level_0__").toArray(),Q=g.getChild("mean").toArray(),C=g.getChild("std").toArray(),E=g.getChild("max").toArray();B.forEach((i,o)=>{I.meta_gene[i]={mean:Q[o],std:C[o],max:E[o]},I.gene_counts.push({name:i,value:Number(Q[o])})}),I.gene_counts.sort((i,o)=>o.value-i.value),I.gene_names=I.gene_counts.map(i=>i.name)};var j2=(I,A)=>{I.color_dict_cluster=A.color;for(let B in I.color_dict_cluster)I.color_dict_cluster[B]=Wt(I.color_dict_cluster[B]);var g=A.count;I.cluster_counts=[];for(let B in g)I.cluster_counts.push({name:B,value:g[B]});I.cluster_counts.sort((B,Q)=>Q.value-B.value)},V2=async I=>{let A=I.global_base_url+"/cell_clusters/meta_cluster.parquet";var g=await IQ(A,ZI.fetch);let B=[],Q=[],C=[],E=g.getChild("__index_level_0__"),i=g.getChild("color"),o=g.getChild("count"),t=[];for(let a of g.schema.fields)t.push(a.name);E&&i&&(B=E.toArray(),Q=i.toArray(),C=o.toArray()),B.forEach((a,e)=>{I.cats.color_dict_cluster[a]=Wt(Q[e]),I.cats.cluster_counts.push({name:a,value:Number(C[e])})}),I.cats.cluster_counts.sort((a,e)=>e.value-a.value)};var X2=async(I,A,g)=>{let B=g.model.get("update_trigger");console.log("**********************************************"),console.log("click_info",B),console.log("**********************************************");let Q,C;if(!("click_type"in B)||!("click_value"in B)){if(console.log("new mat!"),B.type==="row_label"){Q=B.value.name;let E=Q===g.cats.cat?"cluster":Q;JB(A,g,g.cats.cat===Q),mI(g.cats,E),NB(g.genes,[Q]),VI(g.cats,[]),await QE(g.cats,g.genes,g.global_base_url,Q),kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i});let o=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",o?1:.25),!o){let t=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===Q}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_gene.getBoundingClientRect().top,s=a-e+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",BQ(g.genes,Q)}else if(B.type==="col_label"){Q="cluster",C=B.value.name,console.log("new_cat",C),mI(g.cats,"cluster"),VI(g.cats,[C]),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let E=g.cats.selected_cats.join("-");kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let o=C;if(!g.cats.reset_cat){let t=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===o}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_cluster.getBoundingClientRect().top,s=a-e+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}}else if(B.type==="col_dendro"){Q="cluster",Q="cluster";let E=B.value.selected_names;mI(g.cats,"cluster"),VI(g.cats,E),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let i=g.cats.selected_cats.join("-");kB(A,i),qB(A,i),UB(g.genes,A);let o=FI(A,g.close_up);I.setProps({layers:o}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let t=E;if(!g.cats.reset_cat){let a=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===t}).attr("opacity",1);if(!a.empty()){let e=a.node().getBoundingClientRect().top,s=g.containers.bar_cluster.getBoundingClientRect().top,D=e-s+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:D,behavior:"smooth"})}}mI(g.cats,Q),VI(g.cats,B.click_value)}}else if(B.click_type==="row-label"){Q=B.click_value;let E=Q===g.cats.cat?"cluster":Q;JB(A,g,g.cats.cat===Q),mI(g.cats,E),NB(g.genes,[Q]),VI(g.cats,[]),await QE(g.cats,g.genes,g.global_base_url,Q),kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i});let o=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",o?1:.25),!o){let t=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===Q}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_gene.getBoundingClientRect().top,s=a-e+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",BQ(g.genes,Q)}else if(B.click_type==="col-label"){Q="cluster",C=B.click_value,mI(g.cats,"cluster"),VI(g.cats,[C]),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let E=g.cats.selected_cats.join("-");kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let o=C;if(!g.cats.reset_cat){let t=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===o}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_cluster.getBoundingClientRect().top,s=a-e+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}}else if(B.click_type==="col-dendro"){Q="cluster",Q="cluster";let E=B.click_value;mI(g.cats,"cluster"),VI(g.cats,E),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let i=g.cats.selected_cats.join("-");kB(A,i),qB(A,i),UB(g.genes,A);let o=FI(A,g.close_up);I.setProps({layers:o}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let t=E;if(!g.cats.reset_cat){let a=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===t}).attr("opacity",1);if(!a.empty()){let e=a.node().getBoundingClientRect().top,s=g.containers.bar_cluster.getBoundingClientRect().top,D=e-s+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:D,behavior:"smooth"})}}mI(g.cats,Q),VI(g.cats,B.click_value)}else Q="cluster"};var z2=(I,A,g)=>{let B=g.model.get("cell_clusters");j2(g.cats,B.meta_cluster),mp(g.cats,B.new_clusters),kB(A,"cluster");let Q=FI(A,g.close_up);I.setProps({layers:Q}),g.combo_data.cell=g.combo_data.cell.map(C=>({...C,cat:g.cats.dict_cell_cats[C.name]})),Pt(g.cats.svg_bar_cluster,g.cats.cluster_counts,g.cats.color_dict_cluster,Zt,[],I,A,g)};var C$=(I,A,g)=>{if(I.size>=20){let Q=I.keys().next().value;I.delete(Q)}I.set(A,g)},E$=(I,A)=>{let g=I.get(A);return g&&(I.delete(A),I.set(A,g)),g},i$=I=>{I.clear()},nM=()=>{let I=new Map;return{set:(A,g)=>C$(I,A,g),get:A=>E$(I,A),clear:()=>i$(I)}};var rM=async(I,A,g,B,Q,C,E,i,o="",t=.25,a=0,e=800,s=null)=>{a===0&&(a="100%");let D={};sc(D,i),D.close_up=!1,D.model=A,D.containers={},D.custom_callbacks={},D.custom_callbacks.view_change=s,D.cats={},D.cats.cat,D.cats.reset_cat=!1,D.cats.selected_cats=[],D.cats.cell_cats=[],D.cats.dict_cell_cats={},D.cats.color_dict_cluster={},D.cats.cluster_counts=[],D.cats.polygon_cell_names=[],D.cats.svg_bar_cluster=Lo("svg"),D.genes={},D.genes.color_dict_gene={},D.genes.gene_names=[],D.genes.meta_gene={},D.genes.gene_counts=[],D.genes.selected_genes=[],D.genes.trx_ini_radius=t,D.genes.trx_names_array=[],D.genes.trx_data=[],D.genes.gene_text_box="",D.genes.trx_slider=document.createElement("input"),D.genes.gene_search=document.createElement("div"),D.genes.svg_bar_gene=Lo("svg"),D.cats.cell_exp_array=[],D.cats.cell_names_array=[],D.cats.cell_name_to_index_map=new Map,D.img={},D.img.image_layer_colors={},D.img.image_layer_sliders={},ec(g);let n="dapi";await Dc(D.img,i);let r=D.img.landscape_parameters.image_info;P2(D.img,D.img.landscape_parameters.image_format),O2(D.img,r),G2(D.img),v2(D.img.image_layer_colors,D.img.image_info);let c=document.createElement("div");c.style.height=e+"px",c.style.border="1px solid #d3d3d3",await nc(D,i,n),await aN(D.genes,i),await V2(D),D.views=tN();let w=await x2(c,a,e);Z2(w,B,Q,C,E),W2(w,D.views),D.cache={},D.cache.cell=await nM(),D.cache.trx=await nM(),D.combo_data={},D.tooltip_cat_cell="",T2(w,D);let h=o2(D),G=await C2(D),N=await S2(i,D),k=await Y2(D),l=D2(D.genes),y={background_layer:h,image_layers:G,cell_layer:N,path_layer:k,trx_layer:l};L2(w,y,D),q2(w,y,D),n2(w,y,D),CN(y,t);let F=FI(y,D.close_up);w.setProps({layers:F}),b2(w,y,D),Object.keys(D.model).length>0&&(D.model.on("change:update_trigger",()=>X2(w,y,D)),D.model.on("change:cell_clusters",()=>z2(w,y,D)));let d=f2(o,w,y,D);return I.appendChild(d),I.appendChild(c),{update_matrix_gene:async Y=>{let U=Y===D.cats.cat,q=U?"cluster":Y;if(U)D.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let K=D.genes.svg_bar_gene.selectAll("g").filter(function(){let M=lI(this).select("text").node();return M&&M.textContent===Y}).attr("opacity",1);if(!K.empty()){let M=K.node().getBoundingClientRect().top,f=D.containers.bar_gene.getBoundingClientRect().top,L=M-f+D.containers.bar_gene.scrollTop;D.genes.svg_bar_gene.attr("opacity",1),D.containers.bar_gene.scrollTo({top:L,behavior:"smooth"})}}D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),JB(y,D,D.cats.cat===Y),mI(D.cats,q),NB(D.genes,[Y]),VI(D.cats,[]),await QE(D.cats,D.genes,D.global_base_url,Y),kB(y,q),qB(y,q),UB(D.genes,y);let R=FI(y,D.close_up);w.setProps({layers:R}),D.genes.gene_search_input.value=D.genes.gene_search_input.value!==Y?Y:"",BQ(D.genes,U?"":Y)},update_matrix_col:async Y=>{if(D.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",D.cats.reset_cat?1:.25),D.cats.reset_cat)D.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let R=D.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===Y}).attr("opacity",1);if(!R.empty()){let K=R.node().getBoundingClientRect().top,M=D.containers.bar_cluster.getBoundingClientRect().top,f=K-M+D.containers.bar_cluster.scrollTop;D.containers.bar_cluster.scrollTo({top:f,behavior:"smooth"})}}mI(D.cats,"cluster"),VI(D.cats,[Y]),NB(D.genes,[]),JB(y,D,!D.cats.selected_cats.length>0);let U=D.cats.selected_cats.join("-");kB(y,U),qB(y,U),UB(D.genes,y);let q=FI(y,D.close_up);w.setProps({layers:q}),D.genes.gene_search_input.value="",BQ(D.genes,"")},update_matrix_dendro_col:async Y=>{let U="cluster",q=Y;mI(D.cats,"cluster"),VI(D.cats,q),NB(D.genes,[]),JB(y,D,!D.cats.selected_cats.length>0);let R=D.cats.selected_cats.join("-");kB(y,R),qB(y,R),UB(D.genes,y);let K=FI(y,D.close_up);w.setProps({layers:K}),D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",D.cats.reset_cat?1:.25);let M=q;if(!D.cats.reset_cat){let f=D.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===M}).attr("opacity",1);if(!f.empty()){let L=f.node().getBoundingClientRect().top,H=D.containers.bar_cluster.getBoundingClientRect().top,u=L-H+D.containers.bar_cluster.scrollTop;D.containers.bar_cluster.scrollTo({top:u,behavior:"smooth"})}}},update_view_state:async(Y,U,q)=>{console.log("new_view_state",Y),console.log("close_up",U),console.log("trx_layer",q),D.close_up=U,y.trx_layer=q.clone({id:"trx-layer-clone"+Y.zoom});let R=FI(y,D.close_up);w.setProps({controller:{doubleClickZoom:!1},initialViewState:Y,views:D.views,layers:R})},update_layers:()=>{console.log("update_layers")},finalize:()=>{w.finalize()}}};var _2=(I,A)=>{I.tile_scatter_data=A};var $2=(I,A)=>{I.tile_names_array=A},Am=I=>{I.tile_name_to_index_map=new Map,I.tile_names_array.forEach((A,g)=>{I.tile_name_to_index_map.set(A,g)})};var gm=async I=>{let A={},g=I+"/df_colors.parquet";var B=await IQ(g,ZI.fetch);let Q=[],C=[],E=B.getChild("__index_level_0__"),i=B.getChild("color");return E&&i&&(Q=E.toArray(),C=i.toArray()),Q.forEach((o,t)=>{A[String(o)]=Wt(C[t])}),A};var Im=async(I,A,g)=>{let B=g.model.get("update_trigger"),Q;B.click_type==="row-label"?(Q=B.click_value,mI(g.cats,Q),await BN(g,Q)):B.click_type==="col-label"?(mI(g.cats,"cluster"),VI(g.cats,[B.click_value])):B.click_type==="col-dendro"?(mI(g.cats,"cluster"),VI(g.cats,B.click_value)):mI("cluster"),Fr(g,A),I.setProps({layers:[A.simple_image_layer,A.square_scatter_layer]}),Q&&Q!=="cluster"&&(g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",await BQ(g.genes,Q))};var Bm=(I,A)=>{if(I.index===-1||!I.layer)return null;let g=A.cats.tile_cats_array[I.index];return A.tooltip_cat_cell=g,Ho(".deck-tooltip").style("margin-top","75px"),{html:`<div>${g}</div?`}};var cM=async(I,A,g,B,Q,C,E,i,o=1.4,t="",a=0,e=800)=>{a===0&&(a="100%");let s=document.createElement("div");s.style.height=" 800px";let D={};ec(B),sc(D,g),D.model=I,D.img={},D.img.image_layer_colors={},D.img.image_layer_sliders={},await Dc(D.img,g),await nc(D,g,"cells"),D.genes={},D.genes.color_dict_gene={},D.genes.gene_names=[],D.genes.meta_gene={},D.genes.gene_counts=[],D.genes.selected_genes=[],D.genes.trx_ini_radius=1,D.genes.trx_names_array=[],D.genes.trx_data=[],D.genes.gene_text_box="",D.genes.trx_slider=document.createElement("input"),D.genes.gene_search=document.createElement("div"),D.genes.svg_bar_gene=Lo("svg"),D.cats={},D.cats.cat="cluster",D.cats.reset_cat=!1,D.cats.selected_cats=[],D.cats.cell_cats=[],D.cats.dict_cell_cats={},D.cats.color_dict_cluster={},D.cats.cluster_counts=[],D.cats.polygon_cell_names=[],D.cats.svg_bar_cluster=Lo("svg"),D.tooltip_cat_tile="",D.cats.square_tile_size=o,await aN(D.genes,g);let n={name:"cells",color:[0,0,255]},r=g+"/tile_geometries.parquet";var c=await IQ(r,ZI.fetch);D.cats.tile_cats_array=c.getChild("cluster").toArray(),D.cats.tile_exp_array=[],D.cats.tile_names_array=[],D.cats.tile_scatter_data=[],_2(D.cats,Se(c)),$2(D.cats,c.getChild("name").toArray()),Am(D.cats),D.cats.tile_color_dict=await gm(g);let w=await _p(D,n),h=g2(D.cats),G={simple_image_layer:w,square_scatter_layer:h};D.views=tN();let N=A2(s,a,e),k={target:[Q,C,E],zoom:i};N.setProps({views:D.views,layers:[G.simple_image_layer,G.square_scatter_layer],getTooltip:y=>Bm(y,D),initialViewState:k}),Object.keys(D.model).length>0&&D.model.on("change:update_trigger",()=>Im(N,G,D)),Q2(N,G,D);let l=K2(N,G,D);return A.appendChild(l),A.appendChild(s),()=>N.finalize()};var o$=({isDragging:I})=>I?"grabbing":"pointer",Qm=(I,A,g)=>(typeof A=="number"&&(A=A+100,g=g+100),new oo({parent:I,getCursor:o$,width:A,height:g}));var Cm=(I,A)=>{let g;I.mat.forEach((B,Q)=>{B.forEach((C,E)=>{C>=0?g=[255,0,0]:g=[0,0,255];let i={position:[A.viz.col_offset*(E+.5),A.viz.row_offset*(Q+1.5)],color:[g[0],g[1],g[2],255*Math.abs(C)/A.mat.max_abs_value],value:C,row:Q,col:E};A.mat.mat_data.push(i)})})};var Em=(I,A,g,B,Q,C,E,i)=>{let o={};return o.root=g,o.model=I,o.custom_callbacks={},o.custom_callbacks.row=C,o.custom_callbacks.col=E,o.custom_callbacks.col_dendro=i,o.viz={},o.viz.height_margin=100,o.cats={},o.cats.num_cats={},o.cats.num_cats.row=0,o.cats.num_cats.col=0,o.root.style.height=Q+o.viz.height_margin+"px",o.viz.mat_width=B,o.viz.mat_height=Q,o.mat={},o.mat.num_rows=A.mat.length,o.mat.num_cols=A.mat[0].length,o.row_nodes=A.row_nodes,o.col_nodes=A.col_nodes,o.mat.net_mat=A.mat,o.linkage=A.linkage,o.viz.base_font_size=125,o.viz.col_label=75,o.viz.row_label=75,o.viz.extra_space={},o.viz.extra_space.row=10,o.viz.extra_space.col=10,o.zoom={},o.zoom.ini_zoom_x=0,o.zoom.ini_zoom_y=0,o.viz.row_cat_width=9,o.viz.col_cat_height=9,o.viz.row_cat_offset=10,o.viz.col_cat_offset=10,o.viz.label_row_x=15,o.viz.label_col_y=25,o.viz.cat_shift_row=30,o.viz.label_buffer=1,o.animate={},o.animate.duration=2500,o.viz.dendrogram_width=15,o.viz.font_size={},o.viz.font_size.rows=o.viz.base_font_size/o.mat.num_rows,o.viz.font_size.cols=o.viz.base_font_size/o.mat.num_cols,o.viz.col_region=(o.viz.col_cat_height+o.viz.extra_space.col)*o.cats.num_cats.col+o.viz.col_label,o.viz.row_region=(o.viz.row_cat_width+o.viz.extra_space.row)*o.cats.num_cats.row+o.viz.row_label,o.viz.col_width=o.viz.mat_width/o.mat.num_cols,o.viz.row_offset=o.viz.mat_height/o.mat.num_rows,o.viz.col_offset=o.viz.mat_width/o.mat.num_cols,o.viz.cat_shift_col=o.viz.col_label,o.zoom.ini_pan_x=o.viz.mat_width/2,o.zoom.ini_pan_y=o.viz.mat_height/2+o.viz.row_offset,o.mat.mat_data=[],o.mat.num_rows=A.mat.length,o.mat.num_cols=A.mat[0].length,o.mat.max_abs_value=A.mat.flat().reduce((t,a)=>Math.max(t,Math.abs(a)),-1/0),o.order={},o.order.current={},o.order.current.row="clust",o.order.current.col="clust",o.order.new="ini",o.buttons={},o.buttons.blue="#8797ff",o.buttons.gray="#EEEEEE",o.click={},o.click.type,o.click.value,o};var im=(I,A)=>{let g=[];I.col_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};g.push(C)}),A.labels.col_label_data=g,A.labels.clicks.col=0,A.mat.orders.col={},A.mat.orders.col.ini=g.map(B=>B.ini),A.mat.orders.col.clust=g.map(B=>B.clust+1),A.mat.orders.col.rank=g.map(B=>B.rank+1),A.mat.orders.col.rankvar=g.map(B=>B.rankvar+1)},om=(I,A)=>{let g=[];I.row_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};g.push(C)}),A.labels.row_label_data=g,A.labels.clicks.row=0,A.mat.orders.row={},A.mat.orders.row.ini=g.map(B=>B.ini),A.mat.orders.row.clust=g.map(B=>B.clust+1),A.mat.orders.row.rank=g.map(B=>B.rank+1),A.mat.orders.row.rankvar=g.map(B=>B.rankvar+1)};var tm=(I,A)=>{var g=0;let B=0;var Q=A.mat.num_rows*A.cats.num_cats.row;return new Array(Q).fill(0).map(()=>{var E=B%A.cats.num_cats.row;B%A.cats.num_cats.row===0&&(g+=1);let i={position:[A.viz.row_cat_offset*(E+.5)+20,A.viz.row_offset*(g+.5)],color:[0,255,0,255],name:"something "+g};return B+=1,i})},am=(I,A)=>{var g=A.mat.num_cols*A.cats.num_cats.col,B=0;let Q=0;return new Array(g).fill(0).map(()=>{var E=Q%A.mat.num_cols;Q%A.mat.num_cols===0&&(B+=1);let i={position:[A.viz.col_offset*(E+.5),A.viz.col_cat_offset*(B+1.5)-35],color:[0,255,0,150],name:"some column "+E};return Q+=1,i})};var em=`#version 300 es
|
|
2131
|
+
`},A}updateState(A){super.updateState(A);let{props:g,oldProps:B}=A;(g.color!==B.color||g.opacityScale!==B.opacityScale)&&this.setState({uniforms:{uColor:g.color.map(Q=>Q/255),uOpacityScale:g.opacityScale}})}draw(A){let{uniforms:g}=this.state;super.draw({...A,uniforms:{...A.uniforms,...g}})}};var BM=(I,A,g)=>B=>{let{bbox:{left:Q,bottom:C,right:E,top:i}}=B.tile,{width:o,height:t}=I;return new gN(B,{data:null,image:B.data,bounds:[BE(Q,0,o),BE(C,0,t),BE(E,0,o),BE(i,0,t)],color:A,opacityScale:g})};var u_=(I,A)=>{let g=I.img.landscape_parameters.max_pyramid_zoom,B=5;return new Ce({id:A.button_name,tileSize:I.dimensions.tileSize,refinementStrategy:"no-overlap",minZoom:-7,maxZoom:0,maxCacheSize:20,extent:[0,0,I.dimensions.width,I.dimensions.height],getTileData:AN(I.global_base_url,A.name,I.img.image_format,g,ZI),renderSubLayers:BM(I.dimensions,A.color,B)})},C2=async I=>I.img.image_info.map(g=>u_(I,g)),IN=(I,A)=>{I.image_layers=I.image_layers.map(g=>g.clone({visible:A}))},E2=(I,A,g)=>{I.image_layers=I.image_layers.map(B=>B.id.startsWith(A)?B.clone({visible:g}):B)},i2=(I,A,g,B,Q)=>{let C=Q[g];A.image_layers=A.image_layers.map(E=>E.id.startsWith(g)?E.clone({renderSubLayers:BM(I.dimensions,C,B),id:g+"-"+B}):E)};var o2=I=>{let A=[0,0,0,255],{width:g,height:B}=I.dimensions;return new no({id:"background-layer",data:[{polygon:[[0,0],[g,0],[g,B],[0,B]]}],getPolygon:C=>C.polygon,getFillColor:A,pickable:!1})},t2=(I,A)=>{I.background_layer=I.background_layer.clone({visible:A})};var NB=(I,A)=>{let g=A.length===I.selected_genes.length&&A.every((B,Q)=>B===I.selected_genes[Q]);I.selected_genes=g?[]:A};var QE=async(I,A,g,B)=>{var Q=g+"/cbg/"+B+".parquet",C=await IQ(Q,ZI.fetch);let E=C.getChild("__index_level_0__").toArray(),i=C.getChild(B).toArray(),o=new Array(I.cell_names_array.length).fill(0);E.forEach((t,a)=>{if(I.cell_name_to_index_map.has(t)){let e=I.cell_name_to_index_map.get(t),s=Number(i[a]),D=Number(A.meta_gene[B].max),n=Math.log1p(s),r=Math.log1p(D);o[e]=n/r*255}else console.log("Cell name not found in cell_name_to_index_map")}),I.cell_exp_array=o};var BN=async(I,A)=>{let g=I.global_base_url;var B=await IQ(g+"/tbg/"+A+".parquet",ZI.fetch);let Q=B.getChild("__index_level_0__").toArray(),C=B.getChild(A).toArray(),E=new Array(I.cats.tile_names_array.length).fill(0);Q.forEach((i,o)=>{if(I.cats.tile_name_to_index_map.has(i)){let t=I.cats.tile_name_to_index_map.get(i),a=Math.log1p(Number(C[o])),e=Math.log(Number(I.genes.meta_gene[A].max));E[t]=a/e*255}}),I.cats.tile_exp_array=E};var a2=I=>{let A=document.createElement("input");A.setAttribute("type","text"),A.setAttribute("placeholder","Gene search"),A.style.width="500px",A.style.height="20px",A.style.marginTop="5px",A.style.display="inline-block",A.style.padding="1pt 2pt",I.gene_search_input=A};var QN={},e2=async I=>{if(!(I in QN)){let A,Q=`https://www.ebi.ac.uk/proteins/api/proteins?offset=0&size=100&exact_gene=${I}&organism=human`;try{let i=(await(await fetch(Q,{headers:{Accept:"application/json"}})).json()).filter(o=>o.proteinExistence==="Evidence at protein level").filter(o=>"comments"in o).filter(o=>"gene"in o).filter(o=>o.gene[0].name.value.toLowerCase()===I.toLowerCase()).sort((o,t)=>t.comments.length-o.comments.length);if(i.length>0){let t=`https://rest.uniprot.org/uniprotkb/${i[0].accession}.json`;try{let e=await(await fetch(t)).json();try{let s=e.proteinDescription.recommendedName.fullName.value,D=e.comments?.[0]?.texts?.[0]?.value||"Unable to obtain UniProt description.";A={name:s,description:D}}catch(s){A={name:"",description:"Unable to obtain UniProt description."},console.log(s)}}catch(a){A={name:"",description:"Unable to obtain UniProt description."},console.log(a)}}}catch(C){A={name:"",description:"Unable to obtain UniProt description."},console.log(C)}QN[I]=A}};var QM=[],p_=async(I,A,g)=>{let B=A.genes.gene_search_input.value,Q=B===""?"cluster":B;(B===""||A.genes.gene_names.includes(B))&&(mI(A.cats,Q),NB(A.genes,B===""?[]:[B]),VI(A.cats,[]),B!==""&&QM.includes(B)&&await BN(A,B),Fr(A,g),I.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]}),await BQ(A.genes,B))},m_=async(I,A,g)=>{let B=g.genes.gene_search_input.value,Q=B===""?"cluster":B;if(B===""||g.genes.gene_names.includes(B)){mI(g.cats,Q),NB(g.genes,B===""?[]:[B]),VI(g.cats,[]);let C=g.genes.gene_names.includes(B);C&&await QE(g.cats,g.genes,g.global_base_url,B),JB(A,g,!C),kB(A,Q),qB(A,Q),UB(g.genes,A);let E=FI(A,g.close_up);I.setProps({layers:E});let i=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",i?1:.25),!i){let o=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===B}).attr("opacity",1);if(!o.empty()){let t=o.node().getBoundingClientRect().top,a=g.containers.bar_gene.getBoundingClientRect().top,e=t-a+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:e,behavior:"smooth"})}await BQ(g.genes,B)}}},CM=async(I,A,g,B)=>{QM=["cluster",...B.genes.gene_names],B.genes.gene_search.style.width="115px",a2(B.genes);let Q=document.createElement("datalist");Q.id="genes_datalist",B.genes.gene_search_input.setAttribute("list",Q.id),QM.forEach(E=>{let i=document.createElement("option");i.value=E,Q.appendChild(i)}),B.genes.gene_search_input.style.width="156px",B.genes.gene_search_input.style.maxWidth="250px",B.genes.gene_search_input.style.height="12px",B.genes.gene_search_input.style.fontSize="12px",B.genes.gene_search_input.style.border="1px solid #d3d3d3",B.genes.gene_search_input.style.borderRadius="0",B.genes.gene_search_input.style.display="inline-block",B.genes.gene_search_input.style.padding="1pt 2pt",B.genes.gene_search.appendChild(B.genes.gene_search_input),B.genes.gene_search.appendChild(Q),B.genes.gene_text_box=document.createElement("div"),B.genes.gene_text_box.textContent="",B.genes.gene_text_box.style.marginTop="3px",B.genes.gene_text_box.style.color="#222222",B.genes.gene_text_box.style.border="1px solid #d3d3d3",B.genes.gene_text_box.style.height="69px",B.genes.gene_text_box.style.overflow="scroll",B.genes.gene_text_box.style.fontSize="12px",B.genes.gene_text_box.style.cursor="default",B.genes.gene_text_box.style.width="142px",B.genes.gene_text_box.style.paddingLeft="2px",B.genes.gene_text_box.style.paddingRight="17px",B.genes.gene_text_box.addEventListener("wheel",E=>{let{scrollTop:i,scrollHeight:o,clientHeight:t}=B.genes.gene_text_box,a=i===0,e=i+t===o;(a&&E.deltaY<0||e&&E.deltaY>0)&&E.preventDefault()}),B.genes.gene_search.appendChild(B.genes.gene_text_box),B.genes.gene_search_input.value="",mI(B.cats,"cluster");let C;I==="sst"?(C=()=>p_(A,B,g),B.genes.gene_search_input.style.marginTop="10px",B.genes.gene_search.style.height="50px"):(C=()=>m_(A,g,B),B.genes.gene_search_input.style.marginTop="5px"),B.genes.gene_search_input.addEventListener("input",C)},BQ=async(I,A)=>{if(A!==""){I.gene_text_box.textContent="loading",await e2(A);let g=QN[A];g&&g.name&&g.description?I.gene_text_box.innerHTML=`<span style="color: blue;">${g.name}</span><br>${g.description}`:I.gene_text_box.textContent=""}else I.gene_text_box.textContent="";I.gene_text_box.scrollTo({top:0,behavior:"smooth"})};var s2=async(I,A,g)=>{let B=A.map(a=>`${I}/transcript_tiles/transcripts_tile_${a.tileX}_${a.tileY}.parquet`);var Q=await $0(g.cache.trx,B,ZI),C=Q.filter(a=>a!==null),E=Pp(C),i=E.getChild("name").toArray();g.genes.trx_names_array=i;var o=Se(E);let t=o.attributes.getPosition.value;return g.combo_data.trx=g.genes.trx_names_array.map((a,e)=>({name:a,x:t[e*2],y:t[e*2+1]})),o};var x_=async(I,A,g,B,Q)=>{let C=Q.genes.trx_names_array[I.index];if(!C){console.error("Invalid gene name at index:",I.index);return}let E=C===Q.cats.cat,i=E?"cluster":C;JB(B,Q,Q.cats.cat===C),mI(Q.cats,i),NB(Q.genes,[C]),VI(Q.cats,[]),await QE(Q.cats,Q.genes,Q.global_base_url,C),kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);if(g.setProps({layers:o}),Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",E?1:.25),E)Q.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let t=Q.genes.svg_bar_gene.selectAll("g").filter(function(){let a=lI(this).select("text").node();return a&&a.textContent===C}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=Q.containers.bar_gene.getBoundingClientRect().top,s=a-e+Q.containers.bar_gene.scrollTop;Q.genes.svg_bar_gene.attr("opacity",1),Q.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.genes.gene_search_input.value=Q.genes.gene_search_input.value!==C?C:"",BQ(Q.genes,E?"":C)},D2=I=>new nC({id:"trx-layer",data:I.trx_data,pickable:!0,getColor:(g,B)=>{let Q=I.trx_names_array[B.index],C=I.color_dict_gene[Q],E=I.selected_genes.length===0||I.selected_genes.includes(Q)?255:5;return[...C,E]}}),n2=(I,A,g)=>{A.trx_layer=A.trx_layer.clone({onClick:(B,Q)=>x_(B,Q,I,A,g)})},r2=async(I,A,g,B)=>{B.genes.trx_data=await s2(I,A,B),g.trx_layer=g.trx_layer.clone({data:B.genes.trx_data})},c2=(I,A)=>{I.trx_layer=I.trx_layer.clone({visible:A})},CN=(I,A)=>{I.trx_layer=I.trx_layer.clone({getRadius:A})},UB=(I,A)=>{A.trx_layer=A.trx_layer.clone({id:"trx-layer-"+I.selected_genes.join("-")})};var W_=()=>document.createElement("input"),G2=I=>{I.image_layer_sliders=I.image_info.map(A=>{let g=document.createElement("input");return g.name=A.button_name,g})},T_=async(I,A,g)=>{B2(g,A.sliders.tile.value/100),I.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},b_=async(I,A,g)=>{h2(A,g.sliders.cell.value/5);let Q=FI(A,g.close_up);I.setProps({layers:Q})},Z_=async(I,A,g)=>{CN(A,g.sliders.trx.value/100);let Q=FI(A,g.close_up);I.setProps({layers:Q})},w2=(I,A,g,B)=>async()=>{let C=B.img.image_layer_sliders.filter(i=>i.name===I)[0].value/10;i2(B,g,I,C,B.img.image_layer_colors);let E=FI(g,B.close_up);A.setProps({layers:E})},EM=(I,A,g)=>{I.type="range",I.min="0",I.max="100",I.value=A,I.className="slider",I.style.width="75px",I.addEventListener("input",g)},EN=(I,A,g,B)=>{let Q,C,E=W_();switch(I){case"tile":Q=100,C=()=>T_(A,B,g);break;case"cell":Q=B.genes.trx_ini_raidus*100,C=()=>b_(A,g,B);break;case"trx":Q=B.genes.trx_ini_raidus*100,C=()=>Z_(A,g,B);break;default:console.log("no match",I)}EM(E,Q,C),B.sliders[I]=E},Yo=(I,A)=>{I.disabled=!A};var mE=I=>[I.mat_layer,I.row_cat_layer,I.col_cat_layer,I.row_label_layer,I.col_label_layer,I.row_dendro_layer,I.col_dendro_layer],N2=({layer:I,viewport:A})=>A.id==="matrix"&&I.id.includes("mat-layer")||A.id==="rows"&&I.id==="row-layer"||A.id==="cols"&&I.id==="col-layer"||A.id==="rows"&&I.id.includes("row-label-layer")||A.id==="cols"&&I.id==="col-label-layer"||A.id==="dendro_rows"&I.id==="row-dendro-layer"?!0:A.id==="dendro_cols"&&I.id==="col-dendro-layer";var iM=(I,A,g)=>new bw({id:g+"-dendro-layer",data:A.dendro.polygons[g],getPolygon:Q=>Q.coordinates,getFillColor:[0,0,0,90],getLineColor:[255,255,255,255],lineWidthMinPixels:0,pickable:!0,antialiasing:!1}),k2=(I,A,g)=>{I[g+"_dendro_layer"]=I[g+"_dendro_layer"].clone({data:A.dendro.polygons[g]})},Rr=(I,A,g)=>{let B=!1;A.order.current[g]==="clust"&&(B=!0),I[g+"_dendro_layer"]=I[g+"_dendro_layer"].clone({visible:B})},P_=(I,A,g,B,Q)=>{B.click.type=Q+"_dendro",B.click.value={name:I.object.properties.name,selected_names:I.object.properties.all_names},Object.keys(B.model).length>0&&(B.model.set("click_info",null),B.model.set("click_info",B.click),B.model.save_changes()),typeof B.custom_callbacks[Q+"_dendro"]=="function"&&B.custom_callbacks[Q+"_dendro"](I.object.properties.all_names)},oM=(I,A,g,B)=>{A[B+"_dendro_layer"]=A[B+"_dendro_layer"].clone({onClick:Q=>P_(Q,I,A,g,B)})};var jB,y2=!0,O_=I=>{y2=I},Le=I=>{let A=lI(I.currentTarget);return A.style("color")==="blue"?(A.style("color","gray"),jB=!1):(A.style("color","blue"),jB=!0),jB},v_=(I,A,g,B,Q)=>{let C=lI(I.currentTarget),E=C.text().toLowerCase();E==="var"?E="rankvar":E==="sum"&&(E="rank"),C.classed("active")===!1&&(C.classed("active",!0),lI(Q.el).selectAll(".button-"+A).classed("active",!1).style("border-color",Q.buttons.gray),C.style("border-color",Q.buttons.blue).classed("active",!0),Q.order.current[A]=E,B.mat_layer=B.mat_layer.clone({updateTriggers:{getPosition:[Q.order.current.row,Q.order.current.col]}}),A==="row"?B.row_label_layer=B.row_label_layer.clone({updateTriggers:{getPosition:Q.order.current.row}}):B.col_label_layer=B.col_label_layer.clone({updateTriggers:{getPosition:Q.order.current.col}}),Rr(B,Q,A),g.setProps({layers:mE(B)}))},l2=(I,A,g,B=40,Q,C,E,i)=>{let o="button-"+Q,t;g===!0?t=i.buttons.blue:t=i.buttons.gray,A=A.toUpperCase(),lI(I).append("div").classed(o,!0).classed("active",g).text(A).style("width",B+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color",t).style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif').on("click",a=>v_(a,Q,C,E,i))},bt=(I,A,g,B="blue",Q=40,C="button",E,i,o)=>{let t;g==="IMG"?A==="sst"?t=a=>V_(a,E,i):t=a=>X_(a,E,i,o):g==="TILE"?t=a=>__(a,E,i,o):g==="TRX"?t=a=>z_(a,E,i,o):g==="CELL"?t=a=>$_(a,E,i,o):t=j_(g,E,i,o),lI(I).append("div").attr("class",C).text(g).style("width",Q+"px").style("text-align","left").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color",B).style("margin-top","5px").style("margin-left","5px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif;').on("click",t)},j_=(I,A,g,B)=>async Q=>{if(y2){Le(Q),E2(g,I,jB);let C=B.img.image_layer_sliders.filter(i=>i.name===I)[0];Yo(C,jB);let E=FI(g,B.close_up);A.setProps({layers:E})}},V_=async(I,A,g)=>{Le(I),$p(g,jB),A.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},X_=async(I,A,g,B)=>{Le(I),IN(g,jB),t2(g,jB),lI(B.containers.image).selectAll(".img_layer_button").style("color",jB?"blue":"gray"),O_(jB),B.img.image_layer_sliders.map(C=>Yo(C,jB));let Q=FI(g,B.close_up);A.setProps({layers:Q})},z_=async(I,A,g,B)=>{Le(I),Yo(B.genes.trx_slider,jB),c2(g,jB);let Q=FI(g,B.close_up);A.setProps({layers:Q})},__=async(I,A,g,B)=>{Le(I),Yo(B.sliders.tile,jB),I2(g,jB),A.setProps({layers:[g.simple_image_layer,g.square_scatter_layer]})},$_=async(I,A,g,B)=>{Le(I),Yo(B.sliders.cell,jB),R2(g,jB),F2(g,jB);let Q=FI(g,B.close_up);A.setProps({layers:Q})};var iN=(I,A,g)=>{let B;return(...Q)=>{let E=()=>{B=null,g||I.apply(void 0,Q)},i=g&&!B;clearTimeout(B),B=setTimeout(E,A),i&&I.apply(void 0,Q)}};var tM=()=>document.createElement("div"),Zt=(I,A,g,B,Q)=>{Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1);let C=lI(I.currentTarget),E=C.attr("font-weight")==="bold";Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",.25),E?(C.attr("font-weight","normal"),Q.cats.svg_bar_cluster.selectAll("g").attr("opacity",1)):(C.attr("font-weight","bold"),C.attr("opacity",1)),mI(Q.cats,"cluster"),VI(Q.cats,[A.name]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o}),Q.genes.gene_search_input.value="",BQ(Q.genes,"")},Mr=async(I,A,g,B,Q)=>{Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1);let C=lI(I.currentTarget),E=C.attr("font-weight")==="bold";Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",.25),E?(C.attr("font-weight","normal"),Q.genes.svg_bar_gene.selectAll("g").attr("opacity",1)):(C.attr("font-weight","bold"),C.attr("opacity",1));let i=A.name,o=i===Q.cats.cat,t=o?"cluster":i;JB(B,Q,Q.cats.cat===i),mI(Q.cats,t),NB(Q.genes,[i]),VI(Q.cats,[]),await QE(Q.cats,Q.genes,Q.global_base_url,i),kB(B,t),qB(B,t),UB(Q.genes,B);let a=FI(B,Q.close_up);g.setProps({layers:a}),Q.genes.gene_search_input.value=Q.genes.gene_search_input.value!==i?i:"",BQ(Q.genes,o?"":i)},aM=(I,A,g,B,Q,C,E,i)=>{I.className="bar_container",I.style.width="107px",I.style.height="72px",I.style.marginLeft="5px",I.style.overflowY="auto",I.style.border="1px solid #d3d3d3",I.addEventListener("wheel",r=>{let{scrollTop:c,scrollHeight:w,clientHeight:h}=I,G=c===0,N=c+h===w;(G&&r.deltaY<0||N&&r.deltaY>0)&&r.preventDefault()});let o=15,t=o*(B.length+1);g.attr("width",100).attr("height",t).attr("font-family","sans-serif").attr("font-size","13").attr("text-anchor","end").style("user-select","none"),I.appendChild(g.node());let a=90,e=B.map(r=>r.value),s=Aa().domain(qo(e.length)).range([0,(o+1)*e.length]),D=Ia().domain([0,pe(e)]).range([0,a]),n=g.selectAll("g").data(B).join("g").attr("transform",(r,c)=>`translate(2,${s(c)+2})`).on("click",(r,c)=>A(r,c,C,E,i));n.append("rect").attr("fill",r=>{let c=Q[r.name];return`rgb(${c[0]}, ${c[1]}, ${c[2]})`}).attr("width",r=>D(r.value)).attr("height",s.bandwidth()-1),n.append("text").attr("fill","black").attr("x","5px").attr("y",s.bandwidth()/2-1).attr("dy","0.35em").attr("text-anchor","start").text(r=>r.name)},Pt=(I,A,g,B,Q,C,E,i)=>{let t=15*(A.length+1);I.attr("height",t);let a=90,e=A.map(w=>w.value),s=Aa().domain(qo(e.length)).range([0,16*e.length]),D=Ia().domain([0,pe(e)]).range([0,a]),n=I.selectAll("g").data(A,w=>w.name),r=n.enter().append("g").attr("transform",(w,h)=>`translate(2,${s(h)+2})`).on("click",(w,h)=>B(w,h,C,E,i));r.append("rect").attr("width",0).attr("height",s.bandwidth()-1).transition().duration(750).attr("width",w=>D(w.value)),r.append("text").attr("fill","black").attr("x","5px").attr("y",s.bandwidth()/2-1).attr("dy","0.35em").attr("text-anchor","start").text(w=>w.name).attr("opacity",0).transition().duration(750).attr("opacity",1);let c=n.merge(r);c.transition().duration(750).attr("transform",(w,h)=>`translate(2,${s(h)+2})`),c.select("rect").attr("width",w=>D(w.value)).attr("fill",w=>{let h=g[w.name]||[0,0,0],G=Q.length===0||Q.includes(w.name)?1:.1;return`rgba(${h[0]}, ${h[1]}, ${h[2]}, ${G})`}),c.select("text").text(w=>w.name),n.exit().transition().duration(750).attr("opacity",0).remove()};var M2=I=>{I.dendro={},I.dendro.default_level=5,I.dendro.tri_height=.1,I.dendro.trap_height=.03,I.dendro.trap_float=.005,I.dendro.dendro_args={},I.dendro.group_level={},I.dendro.polygons={},I.dendro.update_dendro=!1,I.dendro.selected_clust_names=[],I.dendro.group_info={},I.dendro.default_link_level=.5,I.dendro.output_label_format="list",I.dendro.min_dist={},I.dendro.min_dist.row=0,I.dendro.min_dist.col=0;let A=["col","row"],g;I.dendro.max_linkage_dist={};let B;A.forEach(Q=>{g=I.linkage[Q],I.dendro.max_linkage_dist[Q]=g[g.length-1][2]+.01,B=I.dendro.max_linkage_dist[Q]*I.dendro.default_link_level,eM(I,Q,B),sM(I,Q)})},eM=(I,A,g)=>{let B,Q,C={};I[A+"_nodes"].forEach((a,e)=>{C[e]=[e],a.group_links=e});let E=I[A+"_nodes"].length,i=0,o;I.linkage[A].forEach((a,e)=>{a[2]>i&&a[2]<g&&(B=a[0],Q=a[1],o=E+e,C[o]=[],C[o]=C[o].concat(C[B],C[Q]),delete C[B],delete C[Q])});let t={};Object.entries(C).forEach(([a,e])=>{e.forEach(s=>{t[s]=a})}),I[A+"_nodes"].forEach((a,e)=>{a.group_links=t[e]})},sM=(I,A)=>{var g={},B=I[A+"_nodes"],Q,C,E=I.mat["num_"+A+"s"];A==="row"?(Q=I.viz.mat_width,C=Q/E):(Q=I.viz.mat_height,C=Q/E);var i=I.order.current[A];B.forEach((t,a)=>{var e=t.group_links,s;if(A==="row"){let r=I.mat.num_rows-I.mat.orders.row[i][a];s=I.viz.row_offset*(r+1)}else{let r=I.mat.num_cols-I.mat.orders.col[i][a];s=I.viz.col_offset*(r+0)}var D=s+C,n=t.name;n.indexOf(": ")>=0&&(n=n.split(": ")[1]),Object.prototype.hasOwnProperty.call(g,e)||(g[e]={name_top:n,name_bot:n,pos_top:s,pos_bot:D,pos_mid:(s+D)/2,name:e,all_names:[],axis:A}),g[e].all_names.push(n),s<g[e].pos_top&&(g[e].name_top=n,g[e].pos_top=s,g[e].pos_mid=(s+g[e].pos_bot)/2),D>g[e].pos_bot&&(g[e].name_bot=n,g[e].pos_bot=D,g[e].pos_mid=(g[e].pos_top+D)/2)});var o=[];Object.values(g).forEach(t=>{o.push(t)}),I.dendro.group_info[A]=o},dr=(I,A)=>{I.dendro.polygons[A]=[],I.dendro.group_info[A].forEach(g=>{let{pos_top:B,pos_bot:Q,pos_mid:C}=g;if(A==="row"){let E=Q-B,i=7,o=[[i+100,C],[i,C-E/2],[i,C+E/2]];I.dendro.polygons[A].push({coordinates:o,properties:{...g,axis:A}})}else if(A==="col"){let E=Q-B,i=17,o=[[C,i+100],[C-E/2,i],[C+E/2,i]];I.dendro.polygons[A].push({coordinates:o,properties:{...g,axis:A}})}})};var JB=(I,A,g)=>{lI(A.containers.image).selectAll(".img_layer_button").style("color",g?"blue":"gray"),A.img.image_layer_sliders.map(B=>Yo(B,g)),IN(I,g)},DM=()=>{let I=document.createElement("div");return I.style.display="flex",I.style.flexDirection="row",I.style.border="1px solid #d3d3d3",I.className="ui_container",I.style.height="100px",I},d2=()=>{let I=document.createElement("div");return I.style.display="flex",I.style.flexDirection="row",I.className="ctrl_container",I.style.width="535px",I},kC=(I,A,g=null)=>{let B=document.createElement("div");return B.className=I,B.style.display="flex",B.style.flexDirection=A,g!==null&&(B.style.height=g+"px",B.style.overflow="scroll"),B},oN=I=>{let A=document.createElement("div");return A.className=I,A.style.width="100%",A.style.marginLeft="2px",A.style.marginTop="2px",A},J2=(I,A,g)=>{let B=DM(),Q=kC("button_container","column"),C=kC("slider_container","column"),E=33,i=["col","row"],o=["clust","sum","var","ini"];i.forEach(a=>{let e=kC(a,"row");lI(e).append("div").text(a.toUpperCase()).style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),o.forEach(s=>{l2(e,s,s==="clust",E,a,I,A,g)}),Q.appendChild(e)}),g.dendro.sliders={},i.forEach(a=>{g.dendro.sliders[a]=document.createElement("input"),g.dendro.sliders[a].type="range",g.dendro.sliders[a].min="0",g.dendro.sliders[a].max="100",g.dendro.sliders[a].value=50,g.dendro.sliders[a].className="slider",g.dendro.sliders[a].style.width="75px"});let t=(a,e,s,D)=>{e.dendro.sliders[s+"_value"]=e.dendro.max_linkage_dist[s]*D.target.value/100,eM(e,s,e.dendro.sliders[s+"_value"]),sM(e,s),dr(e,s),k2(A,e,s),a.setProps({layers:mE(A)})};return i.forEach(a=>{g.dendro.sliders[a].addEventListener("input",e=>t(I,g,a,e))}),g.dendro.sliders.col.style.marginTop="5px",g.dendro.sliders.row.style.marginTop="20px",lI(C).append("div").text("DENDRO").style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-left","20px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),C.appendChild(g.dendro.sliders.col),C.appendChild(g.dendro.sliders.row),Q.style.marginTop="15px",C.style.marginTop="0px",C.style.marginLeft="10px",B.appendChild(Q),B.appendChild(C),B},K2=(I,A,g)=>{let B=DM(),Q=d2(),C=kC("image_container","row"),E=kC("tile_container","row"),i=oN("tile_slider_container");return bt(C,"sst","IMG","blue",50,"button",I,A,g),bt(E,"sst","TILE","blue",50,"button",I,A,g),g.sliders={},EN("tile",I,A,g),i.appendChild(g.sliders.tile),B.appendChild(Q),E.appendChild(i),CM("sst",I,A,g),Q.appendChild(C),Q.appendChild(E),Q.appendChild(g.genes.gene_search),B},f2=(I,A,g,B)=>{let Q=DM(),C=d2();B.containers.image=kC("image_container","column");let E=kC("img_layers_container","column",72);E.style.width="135px",E.style.border="1px solid #d3d3d3",E.style.marginTop="3px",E.style.marginLeft="2px",E.addEventListener("wheel",r=>{let{scrollTop:c,scrollHeight:w,clientHeight:h}=E,G=c===0,N=c+h===w;(G&&r.deltaY<0||N&&r.deltaY>0)&&r.preventDefault()});let i=kC("cell_container","column");i.style.width="120px";let o=kC("cell_ctrl_container","row");o.style.marginLeft="0px";let t=kC("gene_container","column");t.style.marginTop="0px",t.style.width="125px";let a=kC("trx_container","row"),e=oN("cell_slider_container"),s=oN("trx_slider_container");bt(B.containers.image,"ist","IMG","blue",30,"button",A,g,B);let D=(r,c)=>r.image_layer_sliders.filter(w=>w.name===c),n=(r,c)=>{let w=c.button_name,h=kC("image_layer_container","row");h.style.height="21px",bt(h,"ist",w,"blue",75,"img_layer_button",A,g,B);let G=oN(w),N=D(r,w)[0],k=w2(w,A,g,B),y=iN(k,100);EM(N,50,y),G.appendChild(N),h.appendChild(G),E.appendChild(h)};if(B.img.image_info.map(r=>n(B.img,r)),bt(o,"ist","CELL","blue",40,"button",A,g,B),bt(a,"ist","TRX","blue",40,"button",A,g,B),B.containers.image.appendChild(E),B.sliders={},EN("cell",A,g,B),e.appendChild(B.sliders.cell),o.appendChild(e),B.containers.bar_cluster=tM(),aM(B.containers.bar_cluster,Zt,B.cats.svg_bar_cluster,B.cats.cluster_counts,B.cats.color_dict_cluster,A,g,B),B.containers.bar_gene=tM(),aM(B.containers.bar_gene,Mr,B.genes.svg_bar_gene,B.genes.gene_counts,B.genes.color_dict_gene,A,g,B),i.appendChild(o),i.appendChild(B.containers.bar_cluster),EN("trx",A,g,B),a.appendChild(s),s.appendChild(B.sliders.trx),t.appendChild(a),t.appendChild(B.containers.bar_gene),CM("ist",A,g,B),B.genes.gene_search.style.marginLeft="0px",Q.appendChild(C),C.appendChild(B.containers.image),C.appendChild(i),C.appendChild(t),C.appendChild(B.genes.gene_search),I.trim!==""){let r=document.createElement("div");lI(r).classed("name_container",!0).style("text-align","left").style("cursor","pointer").style("font-size","22px").style("font-weight","bold").style("color","#222222").style("margin-top","0px").style("margin-left","15px").style("margin-right","5px").style("user-select","none").text(I.toUpperCase()),Q.appendChild(r)}return Q};var A$=(I,A,g)=>{let B=I.polygon_cell_names[g.index],Q=I.dict_cell_cats[B],C;Q in I.color_dict_cluster?C=I.color_dict_cluster[Q]:C=[0,0,255];let E=I.selected_cats.length===0||I.selected_cats.includes(Q)?255:50;return[...C,E]},Y2=I=>new so({id:"path-layer",data:[],pickable:!0,widthScale:3,widthMinPixels:1,getPath:g=>g,getColor:(g,B)=>A$(I.cats,g,B),widthUnits:"pixels"}),g$=(I,A,g,B,Q)=>{let C=Q.cats.polygon_cell_names[I.index],E=Q.cats.dict_cell_cats[C];mI(Q.cats,"cluster"),VI(Q.cats,[E]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o})},U2=async(I,A,g,B)=>{let Q=await vp(I,A,B);g.path_layer=g.path_layer.clone({data:Q})},q2=(I,A,g)=>{A.path_layer=A.path_layer.clone({onClick:(B,Q)=>g$(B,Q,I,A,g)})},F2=(I,A)=>{I.path_layer=I.path_layer.clone({visible:A})},qB=(I,A)=>{I.path_layer=I.path_layer.clone({id:"path-layer-"+A})};var I$=async(I,A,g,B,Q)=>{let C="ontouchstart"in window||navigator.maxTouchPoints>0,E;C?E=Q.cats.cell_cats[I.index]:E=Q.tooltip_cat_cell,mI(Q.cats,"cluster"),VI(Q.cats,[E]),NB(Q.genes,[]),JB(B,Q,!Q.cats.selected_cats.length>0);let i=Q.cats.selected_cats.join("-");if(Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",Q.cats.reset_cat?1:.25),Q.cats.reset_cat)Q.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let t=Q.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===E}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=Q.containers.bar_cluster.getBoundingClientRect().top,s=a-e+Q.containers.bar_cluster.scrollTop;Q.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}kB(B,i),qB(B,i),UB(Q.genes,B);let o=FI(B,Q.close_up);g.setProps({layers:o}),Q.genes.gene_search_input.value="",BQ(Q.genes,"")},S2=async(I,A)=>{let g=I+"/cell_metadata.parquet";var B=await IQ(g,ZI.fetch);let Q=Se(B);await Lp(A.genes,I),Hp(A.cats,B),up(A.cats);var C=await IQ(I+"/cell_clusters/cluster.parquet",ZI.fetch);pp(A.cats,C,"cluster"),xp(A.cats);let E=B.getChild("name").toArray(),i=Q.attributes.getPosition.value;return A.combo_data.cell=E.map((t,a)=>({name:t,cat:A.cats.dict_cell_cats[t],x:i[a*2],y:i[a*2+1]})),new nC({id:"cell-layer",radiusMinPixels:1,getRadius:5,pickable:!0,getColor:(t,a)=>Wp(A.cats,t,a),data:Q})},L2=(I,A,g)=>{A.cell_layer=A.cell_layer.clone({onClick:(B,Q)=>I$(B,Q,I,A,g)})},R2=(I,A)=>{I.cell_layer=I.cell_layer.clone({visible:A})},h2=(I,A)=>{I.cell_layer=I.cell_layer.clone({getRadius:A})},kB=(I,A)=>{I.cell_layer=I.cell_layer.clone({id:"cell-layer-"+A})};var tN=()=>[new DC({id:"ortho"})];var H2=(I,A,g,B,Q)=>{let C=Math.floor(I/Q),E=Math.floor(A/Q),i=Math.floor(g/Q),o=Math.floor(B/Q),t=[];for(let a=C;a<=E;a++)for(let e=i;e<=o;e++)t.push({tileX:a,tileY:e,name:a+"_"+e});return t};var u2=async({height:I,width:A,zoom:g,target:B},Q,C,E)=>{let i=E.img.landscape_parameters.tile_size,o=50,t=Math.pow(2,g),[a,e]=B,s=A/(2*t),D=I/(2*t);E.bounds={},E.bounds.min_x=a-s,E.bounds.max_x=a+s,E.bounds.min_y=e-D,E.bounds.max_y=e+D;let n=Q.viewManager.getViewports();if(!n||n.length===0){console.error("No viewports available");return}let r=H2(E.bounds.min_x,E.bounds.max_x,E.bounds.min_y,E.bounds.max_y,i);if(r.length<o){await r2(E.global_base_url,r,C,E),await U2(E.global_base_url,r,C,E),E.close_up=!0;let G=E.combo_data.trx.filter(y=>y.x>=E.bounds.min_x&&y.x<=E.bounds.max_x&&y.y>=E.bounds.min_y&&y.y<=E.bounds.max_y).map(y=>y.name).reduce((y,F)=>{let d=y.find(J=>J.name===F);return d?d.value+=1:y.push({name:F,value:1}),y},[]).filter(y=>y.value>0).sort((y,F)=>F.value-y.value);Pt(E.genes.svg_bar_gene,G,E.genes.color_dict_gene,Mr,E.genes.selected_genes,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});let l=E.combo_data.cell.filter(y=>y.x>=E.bounds.min_x&&y.x<=E.bounds.max_x&&y.y>=E.bounds.min_y&&y.y<=E.bounds.max_y).map(y=>y.cat).reduce((y,F)=>{let d=y.find(J=>J.name===F);return d?d.value+=1:y.push({name:F,value:1}),y},[]).filter(y=>y.value>0).sort((y,F)=>F.value-y.value);Pt(E.cats.svg_bar_cluster,l,E.cats.color_dict_cluster,Zt,E.cats.selected_cats,Q,C,E),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"})}else E.close_up&&(E.close_up=!1,Pt(E.genes.svg_bar_gene,E.genes.gene_counts,E.genes.color_dict_gene,Mr,E.genes.selected_genes,Q,C,E),Pt(E.cats.svg_bar_cluster,E.cats.cluster_counts,E.cats.color_dict_cluster,Zt,E.cats.selected_cats,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"}),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"}));let c=FI(C,E.close_up);Q.setProps({layers:c})};var B$=200,p2=iN(({viewState:I},A,g,B)=>(u2(I,A,g,B),typeof B.custom_callbacks.view_change=="function"&&B.custom_callbacks.view_change(I,B.close_up,g.trx_layer),I),B$);var m2=(I,A)=>{if(A.index===-1||!A.layer)return null;let g="",B="",Q="";return A.layer.id.startsWith("cell-layer")||A.layer.id.startsWith("path-layer")?(B=A.layer.id.startsWith("cell-layer")?I.cats.cell_names_array[A.index]:I.cats.polygon_cell_names[A.index],Q=I.cats.dict_cell_cats[B],g=`<div>cell: ${B}</div><div>cluster: ${Q}</div>`,I.tooltip_cat_cell=Q):A.layer.id.startsWith("trx-layer")&&(B=I.genes.trx_names_array[A.index],g=`<div>transcript: ${B}</div>`),Ho(".deck-tooltip").style("margin-top","75px"),{html:g}};var Q$=({isDragging:I})=>I?"grabbing":"pointer",x2=(I,A,g)=>new oo({parent:I,controller:{doubleClickZoom:!1},getCursor:Q$,width:A,height:g}),W2=(I,A)=>{I.setProps({views:A})},T2=(I,A)=>{I.setProps({getTooltip:g=>m2(A,g)})},b2=(I,A,g)=>{I.setProps({onViewStateChange:B=>{p2(B,I,A,g)}})},Z2=(I,A,g,B,Q)=>{let C={target:[A,g,B],zoom:Q};I.setProps({initialViewState:C})};var P2=(I,A)=>{I.image_format=A},O2=(I,A)=>{I.image_info=A},v2=(I,A)=>{A.forEach(g=>{I[g.button_name]=g.color})};var aN=async(I,A)=>{let g=await IQ(A+"/meta_gene.parquet",ZI.fetch),B=g.getChild("__index_level_0__").toArray(),Q=g.getChild("mean").toArray(),C=g.getChild("std").toArray(),E=g.getChild("max").toArray();B.forEach((i,o)=>{I.meta_gene[i]={mean:Q[o],std:C[o],max:E[o]},I.gene_counts.push({name:i,value:Number(Q[o])})}),I.gene_counts.sort((i,o)=>o.value-i.value),I.gene_names=I.gene_counts.map(i=>i.name)};var j2=(I,A)=>{I.color_dict_cluster=A.color;for(let B in I.color_dict_cluster)I.color_dict_cluster[B]=Wt(I.color_dict_cluster[B]);var g=A.count;I.cluster_counts=[];for(let B in g)I.cluster_counts.push({name:B,value:g[B]});I.cluster_counts.sort((B,Q)=>Q.value-B.value)},V2=async I=>{let A=I.global_base_url+"/cell_clusters/meta_cluster.parquet";var g=await IQ(A,ZI.fetch);let B=[],Q=[],C=[],E=g.getChild("__index_level_0__"),i=g.getChild("color"),o=g.getChild("count"),t=[];for(let a of g.schema.fields)t.push(a.name);E&&i&&(B=E.toArray(),Q=i.toArray(),C=o.toArray()),B.forEach((a,e)=>{I.cats.color_dict_cluster[a]=Wt(Q[e]),I.cats.cluster_counts.push({name:a,value:Number(C[e])})}),I.cats.cluster_counts.sort((a,e)=>e.value-a.value)};var X2=async(I,A,g)=>{let B=g.model.get("update_trigger"),Q,C;if(!("click_type"in B)||!("click_value"in B)){if(B.type==="row_label"){Q=B.value.name;let E=Q===g.cats.cat?"cluster":Q;JB(A,g,g.cats.cat===Q),mI(g.cats,E),NB(g.genes,[Q]),VI(g.cats,[]),await QE(g.cats,g.genes,g.global_base_url,Q),kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i});let o=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",o?1:.25),!o){let t=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===Q}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_gene.getBoundingClientRect().top,s=a-e+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",BQ(g.genes,Q)}else if(B.type==="col_label"){Q="cluster",C=B.value.name,mI(g.cats,"cluster"),VI(g.cats,[C]),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let E=g.cats.selected_cats.join("-");kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let o=C;if(!g.cats.reset_cat){let t=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===o}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_cluster.getBoundingClientRect().top,s=a-e+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}}else if(B.type==="col_dendro"){Q="cluster",Q="cluster";let E=B.value.selected_names;mI(g.cats,"cluster"),VI(g.cats,E),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let i=g.cats.selected_cats.join("-");kB(A,i),qB(A,i),UB(g.genes,A);let o=FI(A,g.close_up);I.setProps({layers:o}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let t=E;if(!g.cats.reset_cat){let a=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===t}).attr("opacity",1);if(!a.empty()){let e=a.node().getBoundingClientRect().top,s=g.containers.bar_cluster.getBoundingClientRect().top,D=e-s+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:D,behavior:"smooth"})}}mI(g.cats,Q),VI(g.cats,B.click_value)}}else if(B.click_type==="row-label"){Q=B.click_value;let E=Q===g.cats.cat?"cluster":Q;JB(A,g,g.cats.cat===Q),mI(g.cats,E),NB(g.genes,[Q]),VI(g.cats,[]),await QE(g.cats,g.genes,g.global_base_url,Q),kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i});let o=!1;if(g.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",o?1:.25),!o){let t=g.genes.svg_bar_gene.selectAll("g").filter(function(){return lI(this).select("text").text()===Q}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_gene.getBoundingClientRect().top,s=a-e+g.containers.bar_gene.scrollTop;g.containers.bar_gene.scrollTo({top:s,behavior:"smooth"})}}g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",BQ(g.genes,Q)}else if(B.click_type==="col-label"){Q="cluster",C=B.click_value,mI(g.cats,"cluster"),VI(g.cats,[C]),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let E=g.cats.selected_cats.join("-");kB(A,E),qB(A,E),UB(g.genes,A);let i=FI(A,g.close_up);I.setProps({layers:i}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let o=C;if(!g.cats.reset_cat){let t=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===o}).attr("opacity",1);if(!t.empty()){let a=t.node().getBoundingClientRect().top,e=g.containers.bar_cluster.getBoundingClientRect().top,s=a-e+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:s,behavior:"smooth"})}}}else if(B.click_type==="col-dendro"){Q="cluster",Q="cluster";let E=B.click_value;mI(g.cats,"cluster"),VI(g.cats,E),NB(g.genes,[]),JB(A,g,!g.cats.selected_cats.length>0);let i=g.cats.selected_cats.join("-");kB(A,i),qB(A,i),UB(g.genes,A);let o=FI(A,g.close_up);I.setProps({layers:o}),g.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",g.cats.reset_cat?1:.25);let t=E;if(!g.cats.reset_cat){let a=g.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===t}).attr("opacity",1);if(!a.empty()){let e=a.node().getBoundingClientRect().top,s=g.containers.bar_cluster.getBoundingClientRect().top,D=e-s+g.containers.bar_cluster.scrollTop;g.containers.bar_cluster.scrollTo({top:D,behavior:"smooth"})}}mI(g.cats,Q),VI(g.cats,B.click_value)}else Q="cluster"};var z2=(I,A,g)=>{let B=g.model.get("cell_clusters");j2(g.cats,B.meta_cluster),mp(g.cats,B.new_clusters),kB(A,"cluster");let Q=FI(A,g.close_up);I.setProps({layers:Q}),g.combo_data.cell=g.combo_data.cell.map(C=>({...C,cat:g.cats.dict_cell_cats[C.name]})),Pt(g.cats.svg_bar_cluster,g.cats.cluster_counts,g.cats.color_dict_cluster,Zt,[],I,A,g)};var C$=(I,A,g)=>{if(I.size>=20){let Q=I.keys().next().value;I.delete(Q)}I.set(A,g)},E$=(I,A)=>{let g=I.get(A);return g&&(I.delete(A),I.set(A,g)),g},i$=I=>{I.clear()},nM=()=>{let I=new Map;return{set:(A,g)=>C$(I,A,g),get:A=>E$(I,A),clear:()=>i$(I)}};var rM=async(I,A,g,B,Q,C,E,i,o="",t=.25,a=0,e=800,s=null)=>{a===0&&(a="100%");let D={};sc(D,i),D.close_up=!1,D.model=A,D.containers={},D.custom_callbacks={},D.custom_callbacks.view_change=s,D.cats={},D.cats.cat,D.cats.reset_cat=!1,D.cats.selected_cats=[],D.cats.cell_cats=[],D.cats.dict_cell_cats={},D.cats.color_dict_cluster={},D.cats.cluster_counts=[],D.cats.polygon_cell_names=[],D.cats.svg_bar_cluster=Lo("svg"),D.genes={},D.genes.color_dict_gene={},D.genes.gene_names=[],D.genes.meta_gene={},D.genes.gene_counts=[],D.genes.selected_genes=[],D.genes.trx_ini_radius=t,D.genes.trx_names_array=[],D.genes.trx_data=[],D.genes.gene_text_box="",D.genes.trx_slider=document.createElement("input"),D.genes.gene_search=document.createElement("div"),D.genes.svg_bar_gene=Lo("svg"),D.cats.cell_exp_array=[],D.cats.cell_names_array=[],D.cats.cell_name_to_index_map=new Map,D.img={},D.img.image_layer_colors={},D.img.image_layer_sliders={},ec(g);let n="dapi";await Dc(D.img,i);let r=D.img.landscape_parameters.image_info;P2(D.img,D.img.landscape_parameters.image_format),O2(D.img,r),G2(D.img),v2(D.img.image_layer_colors,D.img.image_info);let c=document.createElement("div");c.style.height=e+"px",c.style.border="1px solid #d3d3d3",await nc(D,i,n),await aN(D.genes,i),await V2(D),D.views=tN();let w=await x2(c,a,e);Z2(w,B,Q,C,E),W2(w,D.views),D.cache={},D.cache.cell=await nM(),D.cache.trx=await nM(),D.combo_data={},D.tooltip_cat_cell="",T2(w,D);let h=o2(D),G=await C2(D),N=await S2(i,D),k=await Y2(D),l=D2(D.genes),y={background_layer:h,image_layers:G,cell_layer:N,path_layer:k,trx_layer:l};L2(w,y,D),q2(w,y,D),n2(w,y,D),CN(y,t);let F=FI(y,D.close_up);w.setProps({layers:F}),b2(w,y,D),Object.keys(D.model).length>0&&(D.model.on("change:update_trigger",()=>X2(w,y,D)),D.model.on("change:cell_clusters",()=>z2(w,y,D)));let d=f2(o,w,y,D);return I.appendChild(d),I.appendChild(c),{update_matrix_gene:async Y=>{let U=Y===D.cats.cat,q=U?"cluster":Y;if(U)D.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let K=D.genes.svg_bar_gene.selectAll("g").filter(function(){let M=lI(this).select("text").node();return M&&M.textContent===Y}).attr("opacity",1);if(!K.empty()){let M=K.node().getBoundingClientRect().top,f=D.containers.bar_gene.getBoundingClientRect().top,L=M-f+D.containers.bar_gene.scrollTop;D.genes.svg_bar_gene.attr("opacity",1),D.containers.bar_gene.scrollTo({top:L,behavior:"smooth"})}}D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),JB(y,D,D.cats.cat===Y),mI(D.cats,q),NB(D.genes,[Y]),VI(D.cats,[]),await QE(D.cats,D.genes,D.global_base_url,Y),kB(y,q),qB(y,q),UB(D.genes,y);let R=FI(y,D.close_up);w.setProps({layers:R}),D.genes.gene_search_input.value=D.genes.gene_search_input.value!==Y?Y:"",BQ(D.genes,U?"":Y)},update_matrix_col:async Y=>{if(D.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",D.cats.reset_cat?1:.25),D.cats.reset_cat)D.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let R=D.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===Y}).attr("opacity",1);if(!R.empty()){let K=R.node().getBoundingClientRect().top,M=D.containers.bar_cluster.getBoundingClientRect().top,f=K-M+D.containers.bar_cluster.scrollTop;D.containers.bar_cluster.scrollTo({top:f,behavior:"smooth"})}}mI(D.cats,"cluster"),VI(D.cats,[Y]),NB(D.genes,[]),JB(y,D,!D.cats.selected_cats.length>0);let U=D.cats.selected_cats.join("-");kB(y,U),qB(y,U),UB(D.genes,y);let q=FI(y,D.close_up);w.setProps({layers:q}),D.genes.gene_search_input.value="",BQ(D.genes,"")},update_matrix_dendro_col:async Y=>{let U="cluster",q=Y;mI(D.cats,"cluster"),VI(D.cats,q),NB(D.genes,[]),JB(y,D,!D.cats.selected_cats.length>0);let R=D.cats.selected_cats.join("-");kB(y,R),qB(y,R),UB(D.genes,y);let K=FI(y,D.close_up);w.setProps({layers:K}),D.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",D.cats.reset_cat?1:.25);let M=q;if(!D.cats.reset_cat){let f=D.cats.svg_bar_cluster.selectAll("g").filter(function(){return lI(this).select("text").text()===M}).attr("opacity",1);if(!f.empty()){let L=f.node().getBoundingClientRect().top,H=D.containers.bar_cluster.getBoundingClientRect().top,u=L-H+D.containers.bar_cluster.scrollTop;D.containers.bar_cluster.scrollTo({top:u,behavior:"smooth"})}}},update_view_state:async(Y,U,q)=>{console.log("new_view_state",Y),console.log("close_up",U),console.log("trx_layer",q),D.close_up=U,y.trx_layer=q.clone({id:"trx-layer-clone"+Y.zoom});let R=FI(y,D.close_up);w.setProps({controller:{doubleClickZoom:!1},initialViewState:Y,views:D.views,layers:R})},update_layers:()=>{console.log("update_layers")},finalize:()=>{w.finalize()}}};var _2=(I,A)=>{I.tile_scatter_data=A};var $2=(I,A)=>{I.tile_names_array=A},Am=I=>{I.tile_name_to_index_map=new Map,I.tile_names_array.forEach((A,g)=>{I.tile_name_to_index_map.set(A,g)})};var gm=async I=>{let A={},g=I+"/df_colors.parquet";var B=await IQ(g,ZI.fetch);let Q=[],C=[],E=B.getChild("__index_level_0__"),i=B.getChild("color");return E&&i&&(Q=E.toArray(),C=i.toArray()),Q.forEach((o,t)=>{A[String(o)]=Wt(C[t])}),A};var Im=async(I,A,g)=>{let B=g.model.get("update_trigger"),Q;B.click_type==="row-label"?(Q=B.click_value,mI(g.cats,Q),await BN(g,Q)):B.click_type==="col-label"?(mI(g.cats,"cluster"),VI(g.cats,[B.click_value])):B.click_type==="col-dendro"?(mI(g.cats,"cluster"),VI(g.cats,B.click_value)):mI("cluster"),Fr(g,A),I.setProps({layers:[A.simple_image_layer,A.square_scatter_layer]}),Q&&Q!=="cluster"&&(g.genes.gene_search_input.value=g.genes.gene_search_input.value!==Q?Q:"",await BQ(g.genes,Q))};var Bm=(I,A)=>{if(I.index===-1||!I.layer)return null;let g=A.cats.tile_cats_array[I.index];return A.tooltip_cat_cell=g,Ho(".deck-tooltip").style("margin-top","75px"),{html:`<div>${g}</div?`}};var cM=async(I,A,g,B,Q,C,E,i,o=1.4,t="",a=0,e=800)=>{a===0&&(a="100%");let s=document.createElement("div");s.style.height=" 800px";let D={};ec(B),sc(D,g),D.model=I,D.img={},D.img.image_layer_colors={},D.img.image_layer_sliders={},await Dc(D.img,g),await nc(D,g,"cells"),D.genes={},D.genes.color_dict_gene={},D.genes.gene_names=[],D.genes.meta_gene={},D.genes.gene_counts=[],D.genes.selected_genes=[],D.genes.trx_ini_radius=1,D.genes.trx_names_array=[],D.genes.trx_data=[],D.genes.gene_text_box="",D.genes.trx_slider=document.createElement("input"),D.genes.gene_search=document.createElement("div"),D.genes.svg_bar_gene=Lo("svg"),D.cats={},D.cats.cat="cluster",D.cats.reset_cat=!1,D.cats.selected_cats=[],D.cats.cell_cats=[],D.cats.dict_cell_cats={},D.cats.color_dict_cluster={},D.cats.cluster_counts=[],D.cats.polygon_cell_names=[],D.cats.svg_bar_cluster=Lo("svg"),D.tooltip_cat_tile="",D.cats.square_tile_size=o,await aN(D.genes,g);let n={name:"cells",color:[0,0,255]},r=g+"/tile_geometries.parquet";var c=await IQ(r,ZI.fetch);D.cats.tile_cats_array=c.getChild("cluster").toArray(),D.cats.tile_exp_array=[],D.cats.tile_names_array=[],D.cats.tile_scatter_data=[],_2(D.cats,Se(c)),$2(D.cats,c.getChild("name").toArray()),Am(D.cats),D.cats.tile_color_dict=await gm(g);let w=await _p(D,n),h=g2(D.cats),G={simple_image_layer:w,square_scatter_layer:h};D.views=tN();let N=A2(s,a,e),k={target:[Q,C,E],zoom:i};N.setProps({views:D.views,layers:[G.simple_image_layer,G.square_scatter_layer],getTooltip:y=>Bm(y,D),initialViewState:k}),Object.keys(D.model).length>0&&D.model.on("change:update_trigger",()=>Im(N,G,D)),Q2(N,G,D);let l=K2(N,G,D);return A.appendChild(l),A.appendChild(s),()=>N.finalize()};var o$=({isDragging:I})=>I?"grabbing":"pointer",Qm=(I,A,g)=>(typeof A=="number"&&(A=A+100,g=g+100),new oo({parent:I,getCursor:o$,width:A,height:g}));var Cm=(I,A)=>{let g;I.mat.forEach((B,Q)=>{B.forEach((C,E)=>{C>=0?g=[255,0,0]:g=[0,0,255];let i={position:[A.viz.col_offset*(E+.5),A.viz.row_offset*(Q+1.5)],color:[g[0],g[1],g[2],255*Math.abs(C)/A.mat.max_abs_value],value:C,row:Q,col:E};A.mat.mat_data.push(i)})})};var Em=(I,A,g,B,Q,C,E,i)=>{let o={};return o.root=g,o.model=I,o.custom_callbacks={},o.custom_callbacks.row=C,o.custom_callbacks.col=E,o.custom_callbacks.col_dendro=i,o.viz={},o.viz.height_margin=100,o.cats={},o.cats.num_cats={},o.cats.num_cats.row=0,o.cats.num_cats.col=0,o.root.style.height=Q+o.viz.height_margin+"px",o.viz.mat_width=B,o.viz.mat_height=Q,o.mat={},o.mat.num_rows=A.mat.length,o.mat.num_cols=A.mat[0].length,o.row_nodes=A.row_nodes,o.col_nodes=A.col_nodes,o.mat.net_mat=A.mat,o.linkage=A.linkage,o.viz.base_font_size=125,o.viz.col_label=75,o.viz.row_label=75,o.viz.extra_space={},o.viz.extra_space.row=10,o.viz.extra_space.col=10,o.zoom={},o.zoom.ini_zoom_x=0,o.zoom.ini_zoom_y=0,o.viz.row_cat_width=9,o.viz.col_cat_height=9,o.viz.row_cat_offset=10,o.viz.col_cat_offset=10,o.viz.label_row_x=15,o.viz.label_col_y=25,o.viz.cat_shift_row=30,o.viz.label_buffer=1,o.animate={},o.animate.duration=2500,o.viz.dendrogram_width=15,o.viz.font_size={},o.viz.font_size.rows=o.viz.base_font_size/o.mat.num_rows,o.viz.font_size.cols=o.viz.base_font_size/o.mat.num_cols,o.viz.col_region=(o.viz.col_cat_height+o.viz.extra_space.col)*o.cats.num_cats.col+o.viz.col_label,o.viz.row_region=(o.viz.row_cat_width+o.viz.extra_space.row)*o.cats.num_cats.row+o.viz.row_label,o.viz.col_width=o.viz.mat_width/o.mat.num_cols,o.viz.row_offset=o.viz.mat_height/o.mat.num_rows,o.viz.col_offset=o.viz.mat_width/o.mat.num_cols,o.viz.cat_shift_col=o.viz.col_label,o.zoom.ini_pan_x=o.viz.mat_width/2,o.zoom.ini_pan_y=o.viz.mat_height/2+o.viz.row_offset,o.mat.mat_data=[],o.mat.num_rows=A.mat.length,o.mat.num_cols=A.mat[0].length,o.mat.max_abs_value=A.mat.flat().reduce((t,a)=>Math.max(t,Math.abs(a)),-1/0),o.order={},o.order.current={},o.order.current.row="clust",o.order.current.col="clust",o.order.new="ini",o.buttons={},o.buttons.blue="#8797ff",o.buttons.gray="#EEEEEE",o.click={},o.click.type,o.click.value,o};var im=(I,A)=>{let g=[];I.col_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};g.push(C)}),A.labels.col_label_data=g,A.labels.clicks.col=0,A.mat.orders.col={},A.mat.orders.col.ini=g.map(B=>B.ini),A.mat.orders.col.clust=g.map(B=>B.clust+1),A.mat.orders.col.rank=g.map(B=>B.rank+1),A.mat.orders.col.rankvar=g.map(B=>B.rankvar+1)},om=(I,A)=>{let g=[];I.row_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};g.push(C)}),A.labels.row_label_data=g,A.labels.clicks.row=0,A.mat.orders.row={},A.mat.orders.row.ini=g.map(B=>B.ini),A.mat.orders.row.clust=g.map(B=>B.clust+1),A.mat.orders.row.rank=g.map(B=>B.rank+1),A.mat.orders.row.rankvar=g.map(B=>B.rankvar+1)};var tm=(I,A)=>{var g=0;let B=0;var Q=A.mat.num_rows*A.cats.num_cats.row;return new Array(Q).fill(0).map(()=>{var E=B%A.cats.num_cats.row;B%A.cats.num_cats.row===0&&(g+=1);let i={position:[A.viz.row_cat_offset*(E+.5)+20,A.viz.row_offset*(g+.5)],color:[0,255,0,255],name:"something "+g};return B+=1,i})},am=(I,A)=>{var g=A.mat.num_cols*A.cats.num_cats.col,B=0;let Q=0;return new Array(g).fill(0).map(()=>{var E=Q%A.mat.num_cols;Q%A.mat.num_cols===0&&(B+=1);let i={position:[A.viz.col_offset*(E+.5),A.viz.col_cat_offset*(B+1.5)-35],color:[0,255,0,150],name:"some column "+E};return Q+=1,i})};var em=`#version 300 es
|
|
2132
2132
|
#define SHADER_NAME scatterplot-layer-vertex-shader
|
|
2133
2133
|
|
|
2134
2134
|
// customize the vertex shader to allow for x and y scaling and zooming
|