jbrowse-plugin-msaview 2.4.1 → 2.4.2

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.
@@ -71,7 +71,7 @@ ${F.get("seq")}`).join(`
71
71
  `)}}),r()}catch(Q){l(Q)}}},"Submit"),Je.default.createElement($r.Button,{color:"secondary",variant:"contained",onClick:()=>{r()}},"Cancel")))}),Lh=$2;var WA=f(B());function Ni({children:e,value:t,index:r,...n}){return WA.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r?WA.default.createElement("div",null,e):null)}function zA({handleClose:e,feature:t,model:r}){let n=(0,Rh.getSession)(r),i=!!va(n.jbrowse)?.length,[s,a]=(0,vt.useState)("ncbi_blast");return vt.default.createElement(Fh.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},vt.default.createElement(ko.Tabs,{value:s,onChange:(l,A)=>{a(A)}},vt.default.createElement(ko.Tab,{label:"NCBI BLAST query",value:"ncbi_blast"}),i?vt.default.createElement(ko.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,vt.default.createElement(ko.Tab,{label:"Manual upload",value:"manual_msa"})),vt.default.createElement(Ni,{value:s,index:"ncbi_blast"},vt.default.createElement(MA,{handleClose:e,feature:t,model:r})),i?vt.default.createElement(Ni,{value:s,index:"preloaded_msa"},vt.default.createElement(Lh,{model:r,feature:t,handleClose:e})):null,vt.default.createElement(Ni,{value:s,index:"manual_msa"},vt.default.createElement(Wg,{model:r,feature:t,handleClose:e})))}function K2(e){return e.name==="LinearBasicDisplay"}function X2(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=t.contextMenuFeature,o=(0,Ta.getContainingTrack)(t),i=n?.get("type"),s=n&&["gene","mRNA","transcript"].includes(i);return[...r(),...s?[{label:"Launch MSA view",icon:lg,onClick:()=>{(0,Ta.getSession)(o).queueDialog(a=>[zA,{model:o,handleClose:a,feature:n}])}}]:[]]}}})}function $A(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(K2(t)&&(t.stateModel=X2(t.stateModel)),t))}function KA(e){e.addToExtensionPoint("LaunchView-MsaView",({session:t,data:r,msaFileLocation:n,treeFileLocation:o,connectedViewId:i,connectedFeature:s,displayName:a,colorSchemeName:c,colWidth:l,rowHeight:A,treeAreaWidth:u,treeWidth:d,drawNodeBubbles:m,labelsAlignRight:p,showBranchLen:C,querySeqName:x})=>{if(!r&&!n)throw new Error("No MSA data or file location provided when launching MSA view");t.addView("MsaView",{type:"MsaView",displayName:a,connectedViewId:i,connectedFeature:s,colorSchemeName:c,colWidth:l,rowHeight:A,treeAreaWidth:u,treeWidth:d,drawNodeBubbles:m,labelsAlignRight:p,showBranchLen:C,init:{msaData:r?.msa,treeData:r?.tree,msaUrl:n?.uri,treeUrl:o?.uri,querySeqName:x}})})}var PQ=f(B()),OQ=f(Oh());var xQ=f(B()),yQ=f(_l()),xi=f(ie()),xe=f(Nt());function*Z2(e,t){if(t!==-1)for(let r=e.start;r<e.end;r++)yield r;else for(let r=e.end-1;r>=e.start;r--)yield r}function Gh(e){let t=e.strand,r=e.refName;if(t!==-1&&t!==1)throw new Error(`Invalid strand value: ${t}. Expected 1 or -1.`);if(!r)throw new Error("refName is required");let n=e.subfeatures?.filter(c=>c.type==="CDS")??[],o=new Set,i=n.filter(c=>{if(c.start>=c.end)return!1;let l=`${c.start}-${c.end}`;return o.has(l)?!1:(o.add(l),!0)}).sort((c,l)=>t*(c.start-l.start)),s={},a={};if(i.length!==0){let l=(3-(i[0]?.phase??0))%3,A=-1;for(let u of i)for(let d of Z2(u,t)){let m=Math.floor(l++/3);s[d]=m,m!==A&&(a[m]=d,A=m)}}return{g2p:s,p2g:a,refName:r,strand:t}}var wQ=f(zr());Nd();var Rd=f(ie());function HS(e,t){let r=e.sciname.replaceAll(" ","_");if(e.taxid&&t?.has(e.taxid)){let n=t.get(e.taxid);n.commonName&&(r=n.commonName.split(" ").map(o=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("_"))}return`${e.accession}-${r}`}function US(e){return e.replaceAll("-","")}async function qS(e,t){let r=await fetch(e,t);if(!r.ok)throw new Error(`HTTP ${r.status} fetching ${e} ${await r.text()}`);return r}async function Mn(e,t){return(await qS(e,t)).text()}async function jS(e,t){return(await qS(e,t)).json()}function ul(e){return new Promise(t=>setTimeout(t,e))}var fl="https://www.ebi.ac.uk/Tools/services/rest",Lk={clustalo:{params:{email:"colin.diesh@gmail.com"},msaResult:"aln-clustal_num",treeResult:"phylotree"},muscle:{params:{email:"colin.diesh@gmail.com",format:"clw",tree:"tree1"},msaResult:"fa",treeResult:"phylotree"},kalign:{params:{email:"colin.diesh@gmail.com",stype:"protein"},msaResult:"fa",treeResult:"phylotree"},mafft:{params:{email:"colin.diesh@gmail.com",stype:"protein"},msaResult:"fa",treeResult:"phylotree"}};async function Fk({onProgress:e,jobId:t,algorithm:r}){for(;;){for(let o=0;o<10;o++)await ul(1e3),e(`Re-checking MSA status in... ${10-o}`);let n=await Mn(`${fl}/${r}/status/${t}`);if(n==="FINISHED")break;if(n.includes("FAILURE"))throw new Error(`Failed to run: jobId ${t}`)}}async function JS({algorithm:e,sequence:t,onProgress:r}){let n=Lk[e];r(`Launching ${e} MSA...`);let o=await Mn(`${fl}/${e}/run`,{method:"POST",body:new URLSearchParams({...n.params,sequence:t})});return await Fk({jobId:o,algorithm:e,onProgress:r}),{msa:await Mn(`${fl}/${e}/result/${o}/${n.msaResult}`),tree:await Mn(`${fl}/${e}/result/${o}/${n.treeResult}`)}}async function Ld({rid:e,baseUrl:t,onProgress:r}){r(`Checking BLAST status for RID: ${e}...`),await Pk({rid:e,onProgress:r,baseUrl:t});let n=await jS(`${t}?CMD=Get&RID=${e}&FORMAT_TYPE=JSON2_S&FORMAT_OBJECT=Alignment`);return{rid:e,hits:n.BlastOutput2[0]?.report.results.search.hits??[]}}async function VS({query:e,blastDatabase:t,blastProgram:r,baseUrl:n,onProgress:o,onRid:i}){o("Submitting to NCBI BLAST...");let{rid:s}=await Rk({query:e,blastDatabase:t,blastProgram:r,baseUrl:n});return i(s),Ld({rid:s,baseUrl:n,onProgress:o})}async function Rk({query:e,blastProgram:t,blastDatabase:r,baseUrl:n}){let o=await Mn(n,{method:"POST",body:new URLSearchParams({CMD:"Put",PROGRAM:t==="quick-blastp"?"blastp":t,DATABASE:r,QUERY:e,...r==="nr_cluster_seq"?{CLUSTERED_DB:"on",DB_TYPE:"Experimental Databases"}:{},...t==="quick-blastp"?{BLAST_PROGRAMS:"kmerBlastp"}:{}})}),i=/^ {4}RID = (.*$)/m.exec(o)?.[1],s=/^ {4}RTOE = (.*$)/m.exec(o)?.[1];if(!i)throw new Error("Failed to get RID from BLAST request");return{rid:i,rtoe:s}}async function Pk({rid:e,onProgress:t,baseUrl:r}){for(;;){for(let c=0;c<20;c++)await ul(1e3),t(`Re-checking BLAST status in... ${20-c}`);let o=await Mn(`${r}?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=${e}`),s=/\s+Status=(\S+)/m.exec(o)?.[1],a=/\s+ThereAreHits=yes/m.test(o);if(s!=="WAITING"){if(s==="FAILED")throw new Error(`BLAST ${e} failed`);if(s==="READY"){if(a)return!0;throw new Error("No hits found")}throw new Error(`BLAST ${e} returned unexpected status: ${s??"unknown"}`)}}}_i();var Ok="jbrowse-msaview-taxonomy-cache",xs="common-names",Gk=2;async function YS(){return Rn(Ok,Gk,{upgrade(e){e.objectStoreNames.contains(xs)&&e.deleteObjectStore(xs),e.createObjectStore(xs,{keyPath:"taxid"})}})}async function Hk(e){let r=(await YS()).transaction(xs,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n}async function Uk(e){let r=(await YS()).transaction(xs,"readwrite");for(let n of e)await r.store.put(n);await r.done}async function WS(e){let t=new Map,r=[],n=await Hk(e);for(let s=0;s<e.length;s++){let a=e[s],c=n[s];c?t.set(a,{sciname:c.sciname,commonName:c.commonName}):r.push(a)}if(r.length===0)return t;let o=100,i=[];for(let s=0;s<r.length;s+=o){let a=r.slice(s,s+o),c=a.join(",");try{let A=await(await fetch(`https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=taxonomy&id=${c}&retmode=xml`)).text(),u=new Map,d=/<Taxon>\s*<TaxId>(\d+)<\/TaxId>/g,m;for(;(m=d.exec(A))!==null;){let p=Number(m[1]),C=m.index,x=1,I=C+m[0].length;for(;x>0&&I<A.length;){let v=A.indexOf("<Taxon>",I),M=A.indexOf("</Taxon>",I);if(M===-1)break;v!==-1&&v<M?(x++,I=v+7):(x--,I=M+8)}let h=A.slice(C,I),y=u.get(p),w=h.includes("<LineageEx>"),S=y?.includes("<LineageEx>");(!y||w&&!S)&&u.set(p,h)}for(let p of a){let C=u.get(p);if(C){let x=/<GenbankCommonName>(.*?)<\/GenbankCommonName>/.exec(C),I=/<CommonName>(.*?)<\/CommonName>/.exec(C),h=/<ScientificName>(.*?)<\/ScientificName>/.exec(C),y=x?.[1]??I?.[1],w=h?.[1]??"";t.set(p,{sciname:w,commonName:y}),i.push({taxid:p,sciname:w,commonName:y})}}}catch(l){console.error("Failed to fetch taxonomy data:",l)}}return i.length>0&&await Uk(i),t}async function zS({self:e}){let{baseUrl:t,blastDatabase:r,blastProgram:n,msaAlgorithm:o,proteinSequence:i,selectedTranscript:s,rid:a}=e.blastParams,c=Vs(i),l,A;if(a){e.setRid(a);let I=await Ld({rid:a,baseUrl:t,onProgress:h=>{e.setProgress(h)}});l=I.hits,A=I.rid}else{let I=await VS({query:c,blastDatabase:r,blastProgram:n,baseUrl:t,onProgress:h=>{e.setProgress(h)},onRid:h=>{e.setRid(h)}});l=I.hits,A=I.rid}e.setProgress("Fetching species taxonomy info...");let u=l.map(I=>I.description[0]?.taxid).filter(I=>I!==void 0),d=await WS(u),m={},p=l.map(I=>{let h=I.description[0]??{accession:"unknown",id:"unknown",sciname:"unknown"},y=HS(h,d),w=US(I.hsps[0]?.hseq??"");return m[y]=qk(h,d),`>${y}
72
72
  ${w}`}),C=await JS({algorithm:o,sequence:[`>QUERY
73
73
  ${c}`,...p].join(`
74
- `),onProgress:I=>{e.setProgress(I)}}),x=JSON.stringify(m);return await ap({proteinSequence:c,blastDatabase:r,blastProgram:n,msaAlgorithm:o,msa:C.msa,tree:C.tree,treeMetadata:x,rid:A,geneId:s?.get("parentId"),transcriptId:s?.id(),transcriptName:s?.get("name")??s?.get("id"),geneName:s?.get("gene_name")??s?.get("parentId")}),{...C,treeMetadata:x}}function qk(e,t){let r={},n=e.taxid?t.get(e.taxid):void 0;return n?.sciname&&(r["Scientific name"]=n.sciname),n?.commonName&&(r["Common name"]=n.commonName),e.accession&&(r.Accession=e.accession),e.id&&(r.ID=e.id),e.title&&(r.Description=e.title),r}ys();function ws({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,s=e.rows.find(c=>c[0]===r)?.[1];if(!s)return;let a=dl(s,t);if(a!==void 0){if(o){let c=o.start+a;return c>=o.end?void 0:{refName:o.refName,start:c,end:c+1}}if(n){let{refName:c,p2g:l}=n,A=l[a],u=l[a+1];return A!==void 0&&u!==void 0?{refName:c,start:Math.min(A,u),end:Math.max(A,u)}:void 0}}}_i();var Jk="jbrowse-msaview-data",Vk=1,bs="msa-data";async function Fd(){return Rn(Jk,Vk,{upgrade(e){e.objectStoreNames.contains(bs)||e.createObjectStore(bs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function KS(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function XS(e,t){try{let r=await Fd(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(bs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function ZS(e){try{let r=await(await Fd()).get(bs,e);return r?{msa:r.msa,tree:r.tree,treeMetadata:r.treeMetadata}:void 0}catch(t){console.warn("Failed to retrieve MSA data:",t);return}}async function eQ(e=10080*60*1e3){try{let t=await Fd(),r=Date.now()-e,i=await t.transaction(bs,"readwrite").store.index("timestamp").openCursor(IDBKeyRange.upperBound(r)),s=0;for(;i;)await i.delete(),s++,i=await i.continue();return s}catch(t){return console.warn("Failed to cleanup old MSA data:",t),0}}ys();function tQ(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await ZS(t);n&&(n.msa&&e.setMSA(n.msa),n.tree&&e.setTree(n.tree))}catch(n){console.error("Failed to load MSA data from IndexedDB:",n)}finally{e.setLoadingStoredData(!1)}})()}function rQ(e){let{rows:t,dataStoreId:r,isStoringData:n}=e;if(t.length>0&&!r&&!n){if(e.msaFilehandle||e.treeFilehandle)return;let o=e.data.msa,i=e.data.tree;(o||i)&&(e.setIsStoringData(!0),(async()=>{try{let s=KS();await XS(s,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(s)}catch(s){console.error("Failed to store MSA data to IndexedDB:",s)}finally{e.setIsStoringData(!1)}})())}}function nQ(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await zS({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function oQ(e){let{init:t}=e;t&&(async()=>{try{e.setError(void 0);let{msaData:r,msaUrl:n,treeData:o,treeUrl:i,querySeqName:s}=t;if(n){let a=xm(n);a&&(e.setUniprotId(a),e.setQuerySeqName("query"))}if(s&&e.setQuerySeqName(s),r)e.setMSA(r);else if(n){let a=await fetch(n);if(!a.ok)throw new Error(`Failed to fetch MSA: ${a.status}`);let c=await a.text();e.setMSA(c)}if(o)e.setTree(o);else if(i){let a=await fetch(i);if(!a.ok)throw new Error(`Failed to fetch tree: ${a.status}`);let c=await a.text();e.setTree(c)}e.setInit(void 0)}catch(r){e.setError(r),console.error(r)}})()}function iQ(e){let{mouseCol:t,mouseClickCol:r}=e,n=t===void 0?void 0:ws({model:e,coord:t}),o=r===void 0?void 0:ws({model:e,coord:r});e.setConnectedHighlights([n,o].filter(i=>!!i))}function sQ(e){let{mouseCol:t,connectedProteinViews:r}=e;if(r.length!==0)for(let n of r){let o=n.proteinView.structures[n.structureIdx];if(!o)continue;if(t===void 0){o.clearHighlightFromExternal?.();continue}let i=e.getSequenceByRowName(n.msaRowName);if(!i)continue;let s=dl(i,t);if(s===void 0){o.clearHighlightFromExternal?.();continue}let a=n.msaToStructure[s];a===void 0?o.clearHighlightFromExternal?.():o.highlightFromExternal?.(a)}}function aQ(e){let{connectedViewId:t,uniprotId:r,rows:n,connectedStructures:o}=e;if(!(!r||n.length===0))for(let i of vn((0,Rd.getSession)(e).views))for(let s=0;s<i.structures.length;s++){let a=i.structures[s];if(!(!a||a.connectedViewId!==t||a.uniprotId!==r||o.some(l=>l.proteinViewId===i.id&&l.structureIdx===s))&&a.structureSequences?.[0])try{e.connectToStructure(i.id,s)}catch(l){console.error("Failed to auto-connect to ProteinView:",l)}}}function cQ(e){let{connectedViewId:t,transcriptToMsaMap:r,querySeqName:n}=e;if(!t||!r)return;let o=new Set;for(let s of vn((0,Rd.getSession)(e).views))for(let a of s.structures){if(a.connectedViewId!==t)continue;let c=a.hoverGenomeHighlights;if(!c||c.length===0)continue;let{g2p:l}=r;for(let A of c)for(let u=A.start;u<A.end;u++){let d=l[u];if(d!==void 0){let m=e.seqPosToGlobalCol(n,d);o.add(m)}}}let i=Array.from(o).map(s=>e.globalColToVisibleCol(s)).filter(s=>s!==void 0);e.setHighlightedColumns(i.length>0?i:void 0)}function lQ(){eQ().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}var AQ=f(ie());function uQ({model:e}){let{hovered:t}=(0,AQ.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Im(t))return;let{coord:s,refName:a}=t.hoverPosition;if(i){if(a!==i.refName||!o.assemblyNames.includes(i.assemblyName)||s<i.start||s>=i.end)return;let l=s-i.start;return e.seqPosToVisibleCol(r,l)}if(n){let{g2p:c}=n,l=c[s];if(l!==void 0)return e.seqPosToVisibleCol(r,l)}}var Yk={A:{A:4,R:-1,N:-2,D:-2,C:0,Q:-1,E:-1,G:0,H:-2,I:-1,L:-1,K:-1,M:-1,F:-2,P:-1,S:1,T:0,W:-3,Y:-2,V:0,B:-2,Z:-1,X:0,"*":-4},R:{A:-1,R:5,N:0,D:-2,C:-3,Q:1,E:0,G:-2,H:0,I:-3,L:-2,K:2,M:-1,F:-3,P:-2,S:-1,T:-1,W:-3,Y:-2,V:-3,B:-1,Z:0,X:-1,"*":-4},N:{A:-2,R:0,N:6,D:1,C:-3,Q:0,E:0,G:0,H:1,I:-3,L:-3,K:0,M:-2,F:-3,P:-2,S:1,T:0,W:-4,Y:-2,V:-3,B:3,Z:0,X:-1,"*":-4},D:{A:-2,R:-2,N:1,D:6,C:-3,Q:0,E:2,G:-1,H:-1,I:-3,L:-4,K:-1,M:-3,F:-3,P:-1,S:0,T:-1,W:-4,Y:-3,V:-3,B:4,Z:1,X:-1,"*":-4},C:{A:0,R:-3,N:-3,D:-3,C:9,Q:-3,E:-4,G:-3,H:-3,I:-1,L:-1,K:-3,M:-1,F:-2,P:-3,S:-1,T:-1,W:-2,Y:-2,V:-1,B:-3,Z:-3,X:-2,"*":-4},Q:{A:-1,R:1,N:0,D:0,C:-3,Q:5,E:2,G:-2,H:0,I:-3,L:-2,K:1,M:0,F:-3,P:-1,S:0,T:-1,W:-2,Y:-1,V:-2,B:0,Z:3,X:-1,"*":-4},E:{A:-1,R:0,N:0,D:2,C:-4,Q:2,E:5,G:-2,H:0,I:-3,L:-3,K:1,M:-2,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:1,Z:4,X:-1,"*":-4},G:{A:0,R:-2,N:0,D:-1,C:-3,Q:-2,E:-2,G:6,H:-2,I:-4,L:-4,K:-2,M:-3,F:-3,P:-2,S:0,T:-2,W:-2,Y:-3,V:-3,B:-1,Z:-2,X:-1,"*":-4},H:{A:-2,R:0,N:1,D:-1,C:-3,Q:0,E:0,G:-2,H:8,I:-3,L:-3,K:-1,M:-2,F:-1,P:-2,S:-1,T:-2,W:-2,Y:2,V:-3,B:0,Z:0,X:-1,"*":-4},I:{A:-1,R:-3,N:-3,D:-3,C:-1,Q:-3,E:-3,G:-4,H:-3,I:4,L:2,K:-3,M:1,F:0,P:-3,S:-2,T:-1,W:-3,Y:-1,V:3,B:-3,Z:-3,X:-1,"*":-4},L:{A:-1,R:-2,N:-3,D:-4,C:-1,Q:-2,E:-3,G:-4,H:-3,I:2,L:4,K:-2,M:2,F:0,P:-3,S:-2,T:-1,W:-2,Y:-1,V:1,B:-4,Z:-3,X:-1,"*":-4},K:{A:-1,R:2,N:0,D:-1,C:-3,Q:1,E:1,G:-2,H:-1,I:-3,L:-2,K:5,M:-1,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:0,Z:1,X:-1,"*":-4},M:{A:-1,R:-1,N:-2,D:-3,C:-1,Q:0,E:-2,G:-3,H:-2,I:1,L:2,K:-1,M:5,F:0,P:-2,S:-1,T:-1,W:-1,Y:-1,V:1,B:-3,Z:-1,X:-1,"*":-4},F:{A:-2,R:-3,N:-3,D:-3,C:-2,Q:-3,E:-3,G:-3,H:-1,I:0,L:0,K:-3,M:0,F:6,P:-4,S:-2,T:-2,W:1,Y:3,V:-1,B:-3,Z:-3,X:-1,"*":-4},P:{A:-1,R:-2,N:-2,D:-1,C:-3,Q:-1,E:-1,G:-2,H:-2,I:-3,L:-3,K:-1,M:-2,F:-4,P:7,S:-1,T:-1,W:-4,Y:-3,V:-2,B:-2,Z:-1,X:-2,"*":-4},S:{A:1,R:-1,N:1,D:0,C:-1,Q:0,E:0,G:0,H:-1,I:-2,L:-2,K:0,M:-1,F:-2,P:-1,S:4,T:1,W:-3,Y:-2,V:-2,B:0,Z:0,X:0,"*":-4},T:{A:0,R:-1,N:0,D:-1,C:-1,Q:-1,E:-1,G:-2,H:-2,I:-1,L:-1,K:-1,M:-1,F:-2,P:-1,S:1,T:5,W:-2,Y:-2,V:0,B:-1,Z:-1,X:0,"*":-4},W:{A:-3,R:-3,N:-4,D:-4,C:-2,Q:-2,E:-3,G:-2,H:-2,I:-3,L:-2,K:-3,M:-1,F:1,P:-4,S:-3,T:-2,W:11,Y:2,V:-3,B:-4,Z:-3,X:-2,"*":-4},Y:{A:-2,R:-2,N:-2,D:-3,C:-2,Q:-1,E:-2,G:-3,H:2,I:-1,L:-1,K:-2,M:-1,F:3,P:-3,S:-2,T:-2,W:2,Y:7,V:-1,B:-3,Z:-2,X:-1,"*":-4},V:{A:0,R:-3,N:-3,D:-3,C:-1,Q:-2,E:-2,G:-3,H:-3,I:3,L:1,K:-2,M:1,F:-1,P:-2,S:-2,T:0,W:-3,Y:-1,V:4,B:-3,Z:-2,X:-1,"*":-4},B:{A:-2,R:-1,N:3,D:4,C:-3,Q:0,E:1,G:-1,H:0,I:-3,L:-4,K:0,M:-3,F:-3,P:-2,S:0,T:-1,W:-4,Y:-3,V:-3,B:4,Z:1,X:-1,"*":-4},Z:{A:-1,R:0,N:0,D:1,C:-3,Q:3,E:4,G:-2,H:0,I:-3,L:-3,K:1,M:-1,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:1,Z:4,X:-1,"*":-4},X:{A:0,R:-1,N:-1,D:-1,C:-2,Q:-1,E:-1,G:-1,H:-1,I:-1,L:-1,K:-1,M:-1,F:-1,P:-2,S:0,T:0,W:-2,Y:-1,V:-1,B:-1,Z:-1,X:-1,"*":-4},"*":{A:-4,R:-4,N:-4,D:-4,C:-4,Q:-4,E:-4,G:-4,H:-4,I:-4,L:-4,K:-4,M:-4,F:-4,P:-4,S:-4,T:-4,W:-4,Y:-4,V:-4,B:-4,Z:-4,X:-4,"*":1}},fQ=Yk;function dQ(e,t){return fQ[e.toUpperCase()]?.[t.toUpperCase()]??-4}var Wk=-10,zk=-.5;function $k(e,t,r=Wk,n=zk){let o=e.length,i=t.length,s=[],a=[],c=[];for(let h=0;h<=o;h++){s[h]=[],a[h]=[],c[h]=[];for(let y=0;y<=i;y++)s[h][y]=-1/0,a[h][y]=-1/0,c[h][y]=-1/0}s[0][0]=0;for(let h=1;h<=o;h++)a[h][0]=r+(h-1)*n;for(let h=1;h<=i;h++)c[0][h]=r+(h-1)*n;for(let h=1;h<=o;h++)for(let y=1;y<=i;y++){let w=dQ(e[h-1],t[y-1]);s[h][y]=Math.max(s[h-1][y-1],a[h-1][y-1],c[h-1][y-1])+w,a[h][y]=Math.max(s[h-1][y]+r,a[h-1][y]+n),c[h][y]=Math.max(s[h][y-1]+r,c[h][y-1]+n)}let l="",A="",u=o,d=i,m=s[o][i],p=a[o][i],C=c[o][i],x=Math.max(m,p,C),I=x===m?"M":x===p?"Ix":"Iy";for(;u>0||d>0;)if(I==="M"&&u>0&&d>0){l=e[u-1]+l,A=t[d-1]+A;let h=dQ(e[u-1],t[d-1]),y=s[u-1][d-1],w=a[u-1][d-1],S=s[u][d];S===y+h?I="M":S===w+h?I="Ix":I="Iy",u--,d--}else if(I==="Ix"&&u>0){l=e[u-1]+l,A="-"+A;let h=a[u][d],y=s[u-1][d]+r;I=h===y?"M":"Ix",u--}else if(d>0){l="-"+l,A=t[d-1]+A;let h=c[u][d],y=s[u][d-1]+r;I=h===y?"M":"Iy",d--}else break;return{alignedSeq1:l,alignedSeq2:A,score:x}}function Kk(e,t){let r="";for(let n=0;n<e.length;n++){let o=e[n],i=t[n];o==="-"||i==="-"?r+=" ":o.toUpperCase()===i.toUpperCase()?r+="|":r+=" "}return r}function mQ(e,t){let{alignedSeq1:r,alignedSeq2:n}=$k(e,t);return{consensus:Kk(r,n),alns:[{id:"msa",seq:r},{id:"structure",seq:n}]}}function gQ(e){let t=e.alns[0].seq,r=e.alns[1].seq;if(t.length!==r.length)throw new Error("Aligned sequences must have same length");let n=0,o=0,i=new Map,s=new Map;for(let a=0;a<t.length;a++){let c=t[a],l=r[a];c!=="-"&&l!=="-"?(i.set(n,o),s.set(o,n),n++,o++):c==="-"?o++:n++}return{seq1ToSeq2:i,seq2ToSeq1:s}}ys();var tN=(0,xQ.lazy)(()=>Promise.resolve().then(()=>(IQ(),EQ)));function Pd(){return xe.types.compose(yQ.BaseViewModel,Al(),xe.types.model("MsaView",{connectedViewId:xe.types.maybe(xe.types.string),connectedFeature:xe.types.frozen(),connectedHighlights:xe.types.array(xe.types.model({refName:xe.types.string,start:xe.types.number,end:xe.types.number})),blastParams:xe.types.frozen(),querySeqName:"QUERY",uniprotId:xe.types.maybe(xe.types.string),zoomToBaseLevel:!1,init:xe.types.frozen(),connectedStructures:xe.types.array(xe.types.frozen()),dataStoreId:xe.types.maybe(xe.types.string),mafRegion:xe.types.frozen()})).volatile(()=>({rid:void 0,progress:"",error:void 0,loadingStoredData:!1,isStoringData:!1})).views(e=>({getRowByName(t){return e.rows.find(r=>r[0]===t)},getSequenceByRowName(t){return e.rows.find(r=>r[0]===t)?.[1]}})).views(e=>({get transcriptToMsaMap(){return e.connectedFeature?Gh(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,xi.getSession)(e);return t.find(r=>r.id===e.connectedViewId)},get connectedProteinViews(){let t=vn((0,xi.getSession)(e).views),r=[];for(let n of e.connectedStructures){let o=t.find(i=>i.id===n.proteinViewId);o&&r.push({...n,proteinView:o})}return r}})).views(e=>({get structureHoverCol(){for(let t of e.connectedProteinViews){let n=t.proteinView.structures[t.structureIdx]?.hoverPosition?.structureSeqPos;if(n!==void 0){let o=t.structureToMsa[n];if(o!==void 0){let i=e.getSequenceByRowName(t.msaRowName);if(i){let s=$S(i,o);if(s!==void 0)return e.globalColToVisibleCol(s)}}}}}})).views(e=>({get mouseCol2(){let t=e.structureHoverCol;return t!==void 0?t:uQ({model:e})}})).actions(e=>({setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setError(t){e.error=t},setProgress(t){e.progress=t},setRid(t){e.rid=t},setConnectedHighlights(t){e.connectedHighlights=(0,xe.cast)(t)},addToConnectedHighlights(t){e.connectedHighlights.push(t)},clearConnectedHighlights(){e.connectedHighlights=(0,xe.cast)([])},setBlastParams(t){e.blastParams=t},setInit(t){e.init=t},setQuerySeqName(t){e.querySeqName=t},setUniprotId(t){e.uniprotId=t},setDataStoreId(t){e.dataStoreId=t},setMafRegion(t){e.mafRegion=t},setLoadingStoredData(t){e.loadingStoredData=t},setIsStoringData(t){e.isStoringData=t},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,{assemblyManager:o}=(0,xi.getSession)(e),i=ws({model:e,coord:t});if(!(!i||!r))if(n)r.navTo(i);else{let s=Ls({assemblyManager:o,assemblyNames:r.assemblyNames,refName:i.refName});r.centerAt(i.start,s)}},connectToStructure(t,r,n){let o=n??e.querySeqName,i=e.getSequenceByRowName(o);if(!i)throw new Error(`MSA row "${o}" not found`);let s=i.replaceAll("-",""),a=vn((0,xi.getSession)(e).views).find(p=>p.id===t);if(!a)throw new Error(`ProteinView "${t}" not found`);let c=a.structures[r];if(!c)throw new Error(`Structure at index ${r} not found`);let l=c.structureSequences?.[0];if(!l)throw new Error("Structure sequence not available");let A=mQ(s,l),{seq1ToSeq2:u,seq2ToSeq1:d}=gQ(A),m={proteinViewId:t,structureIdx:r,msaRowName:o,msaToStructure:Object.fromEntries(u),structureToMsa:Object.fromEntries(d)};e.connectedStructures.push(m)},disconnectFromStructure(t,r){let n=e.connectedStructures.findIndex(o=>o.proteinViewId===t&&o.structureIdx===r);n!==-1&&e.connectedStructures.splice(n,1)},disconnectAllStructures(){e.connectedStructures.clear()}})).actions(e=>{let t=e.setMouseClickPos.bind(e);return{setMouseClickPos(r,n){t(r,n),r!==void 0&&e.handleMsaClick(r)}}}).views(e=>({extraViewMenuItems(){return[{label:"Zoom to base level on click?",checked:e.zoomToBaseLevel,type:"checkbox",onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}},{label:"Connect to protein structure...",onClick:()=>{(0,xi.getSession)(e).queueDialog(t=>[tN,{model:e,handleClose:t}])}},...e.connectedStructures.length>0?[{label:"Disconnect from protein structures",onClick:()=>{e.disconnectAllStructures()}}]:[]]}})).actions(e=>({afterCreate(){lQ();for(let t of[tQ,rQ,nQ,oQ,iQ,sQ,aQ,cQ])(0,xe.addDisposer)(e,(0,wQ.autorun)(()=>{t(e)}))}}))}var lN=(0,PQ.lazy)(()=>Promise.resolve().then(()=>(RQ(),FQ)));function Ud(e){e.addViewType(()=>new OQ.default({name:"MsaView",stateModel:Pd(),ReactComponent:lN}))}var GQ="2.4.1";var hl=class extends HQ.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=GQ;this.rootConfigurationSchema=r=>({msa:(0,qd.ConfigurationSchema)("MSA",{datasets:jd.types.maybe(jd.types.array((0,qd.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Ud(r),$A(r),KA(r),Tl(r),zl(r)}configure(r){(0,UQ.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:dm,onClick:n=>{n.addView("MsaView",{})}})}};return t1(AN);})();
74
+ `),onProgress:I=>{e.setProgress(I)}}),x=JSON.stringify(m);return await ap({proteinSequence:c,blastDatabase:r,blastProgram:n,msaAlgorithm:o,msa:C.msa,tree:C.tree,treeMetadata:x,rid:A,geneId:s?.get("parentId"),transcriptId:s?.id(),transcriptName:s?.get("name")??s?.get("id"),geneName:s?.get("gene_name")??s?.get("parentId")}),{...C,treeMetadata:x}}function qk(e,t){let r={},n=e.taxid?t.get(e.taxid):void 0;return n?.sciname&&(r["Scientific name"]=n.sciname),n?.commonName&&(r["Common name"]=n.commonName),e.accession&&(r.Accession=e.accession),e.id&&(r.ID=e.id),e.title&&(r.Description=e.title),r}ys();function ws({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,s=e.rows.find(c=>c[0]===r)?.[1];if(!s)return;let a=dl(s,t);if(a!==void 0){if(o){let c=o.start+a;return c>=o.end?void 0:{refName:o.refName,start:c,end:c+1}}if(n){let{refName:c,p2g:l}=n,A=l[a],u=l[a+1];return A!==void 0&&u!==void 0?{refName:c,start:Math.min(A,u),end:Math.max(A,u)}:void 0}}}_i();var Jk="jbrowse-msaview-data",Vk=1,bs="msa-data";async function Fd(){return Rn(Jk,Vk,{upgrade(e){e.objectStoreNames.contains(bs)||e.createObjectStore(bs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function KS(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function XS(e,t){try{let r=await Fd(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(bs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function ZS(e){try{let r=await(await Fd()).get(bs,e);return r?{msa:r.msa,tree:r.tree,treeMetadata:r.treeMetadata}:void 0}catch(t){console.warn("Failed to retrieve MSA data:",t);return}}async function eQ(e=10080*60*1e3){try{let t=await Fd(),r=Date.now()-e,i=await t.transaction(bs,"readwrite").store.index("timestamp").openCursor(IDBKeyRange.upperBound(r)),s=0;for(;i;)await i.delete(),s++,i=await i.continue();return s}catch(t){return console.warn("Failed to cleanup old MSA data:",t),0}}ys();function tQ(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await ZS(t);n&&(n.msa&&e.setMSA(n.msa),n.tree&&e.setTree(n.tree))}catch(n){console.error("Failed to load MSA data from IndexedDB:",n)}finally{e.setLoadingStoredData(!1)}})()}function rQ(e){let{rows:t,dataStoreId:r,isStoringData:n}=e;if(t.length>0&&!r&&!n){if(e.msaFilehandle||e.treeFilehandle)return;let o=e.data.msa,i=e.data.tree;(o||i)&&(e.setIsStoringData(!0),(async()=>{try{let s=KS();await XS(s,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(s)}catch(s){console.error("Failed to store MSA data to IndexedDB:",s)}finally{e.setIsStoringData(!1)}})())}}function nQ(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await zS({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function oQ(e){let{init:t}=e;t&&(async()=>{try{e.setError(void 0);let{msaData:r,msaUrl:n,treeData:o,treeUrl:i,querySeqName:s}=t;if(n){let a=xm(n);a&&(e.setUniprotId(a),e.setQuerySeqName("query"))}if(s&&e.setQuerySeqName(s),r)e.setMSA(r);else if(n){let a=await fetch(n);if(!a.ok)throw new Error(`Failed to fetch MSA: ${a.status}`);let c=await a.text();e.setMSA(c)}if(o)e.setTree(o);else if(i){let a=await fetch(i);if(!a.ok)throw new Error(`Failed to fetch tree: ${a.status}`);let c=await a.text();e.setTree(c)}e.setInit(void 0)}catch(r){e.setError(r),console.error(r)}})()}function iQ(e){let{mouseCol:t,mouseClickCol:r}=e,n=t===void 0?void 0:ws({model:e,coord:t}),o=r===void 0?void 0:ws({model:e,coord:r});e.setConnectedHighlights([n,o].filter(i=>!!i))}function sQ(e){let{mouseCol:t,connectedProteinViews:r}=e;if(r.length!==0)for(let n of r){let o=n.proteinView.structures[n.structureIdx];if(!o)continue;if(t===void 0){o.clearHighlightFromExternal?.();continue}let i=e.getSequenceByRowName(n.msaRowName);if(!i)continue;let s=dl(i,t);if(s===void 0){o.clearHighlightFromExternal?.();continue}let a=n.msaToStructure[s];a===void 0?o.clearHighlightFromExternal?.():o.highlightFromExternal?.(a)}}function aQ(e){let{connectedViewId:t,uniprotId:r,rows:n,connectedStructures:o}=e;if(!(!r||n.length===0))for(let i of vn((0,Rd.getSession)(e).views))for(let s=0;s<i.structures.length;s++){let a=i.structures[s];if(!(!a||a.connectedViewId!==t||a.uniprotId!==r||o.some(l=>l.proteinViewId===i.id&&l.structureIdx===s))&&a.structureSequences?.[0])try{e.connectToStructure(i.id,s)}catch(l){console.error("Failed to auto-connect to ProteinView:",l)}}}function cQ(e){let{connectedViewId:t,transcriptToMsaMap:r,querySeqName:n}=e;if(!t||!r)return;let o=new Set;for(let s of vn((0,Rd.getSession)(e).views))for(let a of s.structures){if(a.connectedViewId!==t)continue;let c=a.hoverGenomeHighlights;if(!c||c.length===0)continue;let{g2p:l}=r;for(let A of c)for(let u=A.start;u<A.end;u++){let d=l[u];if(d!==void 0){let m=e.seqPosToGlobalCol(n,d);o.add(m)}}}let i=Array.from(o).map(s=>e.globalColToVisibleCol(s)).filter(s=>s!==void 0);e.setHighlightedColumns(i.length>0?i:void 0)}function lQ(){eQ().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}var AQ=f(ie());function uQ({model:e}){let{hovered:t}=(0,AQ.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Im(t))return;let{coord:s,refName:a}=t.hoverPosition;if(i){if(a!==i.refName||!o.assemblyNames.includes(i.assemblyName)||s<i.start||s>=i.end)return;let l=s-i.start;return e.seqPosToVisibleCol(r,l)}if(n){let{g2p:c}=n,l=c[s];if(l!==void 0)return e.seqPosToVisibleCol(r,l)}}var Yk={A:{A:4,R:-1,N:-2,D:-2,C:0,Q:-1,E:-1,G:0,H:-2,I:-1,L:-1,K:-1,M:-1,F:-2,P:-1,S:1,T:0,W:-3,Y:-2,V:0,B:-2,Z:-1,X:0,"*":-4},R:{A:-1,R:5,N:0,D:-2,C:-3,Q:1,E:0,G:-2,H:0,I:-3,L:-2,K:2,M:-1,F:-3,P:-2,S:-1,T:-1,W:-3,Y:-2,V:-3,B:-1,Z:0,X:-1,"*":-4},N:{A:-2,R:0,N:6,D:1,C:-3,Q:0,E:0,G:0,H:1,I:-3,L:-3,K:0,M:-2,F:-3,P:-2,S:1,T:0,W:-4,Y:-2,V:-3,B:3,Z:0,X:-1,"*":-4},D:{A:-2,R:-2,N:1,D:6,C:-3,Q:0,E:2,G:-1,H:-1,I:-3,L:-4,K:-1,M:-3,F:-3,P:-1,S:0,T:-1,W:-4,Y:-3,V:-3,B:4,Z:1,X:-1,"*":-4},C:{A:0,R:-3,N:-3,D:-3,C:9,Q:-3,E:-4,G:-3,H:-3,I:-1,L:-1,K:-3,M:-1,F:-2,P:-3,S:-1,T:-1,W:-2,Y:-2,V:-1,B:-3,Z:-3,X:-2,"*":-4},Q:{A:-1,R:1,N:0,D:0,C:-3,Q:5,E:2,G:-2,H:0,I:-3,L:-2,K:1,M:0,F:-3,P:-1,S:0,T:-1,W:-2,Y:-1,V:-2,B:0,Z:3,X:-1,"*":-4},E:{A:-1,R:0,N:0,D:2,C:-4,Q:2,E:5,G:-2,H:0,I:-3,L:-3,K:1,M:-2,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:1,Z:4,X:-1,"*":-4},G:{A:0,R:-2,N:0,D:-1,C:-3,Q:-2,E:-2,G:6,H:-2,I:-4,L:-4,K:-2,M:-3,F:-3,P:-2,S:0,T:-2,W:-2,Y:-3,V:-3,B:-1,Z:-2,X:-1,"*":-4},H:{A:-2,R:0,N:1,D:-1,C:-3,Q:0,E:0,G:-2,H:8,I:-3,L:-3,K:-1,M:-2,F:-1,P:-2,S:-1,T:-2,W:-2,Y:2,V:-3,B:0,Z:0,X:-1,"*":-4},I:{A:-1,R:-3,N:-3,D:-3,C:-1,Q:-3,E:-3,G:-4,H:-3,I:4,L:2,K:-3,M:1,F:0,P:-3,S:-2,T:-1,W:-3,Y:-1,V:3,B:-3,Z:-3,X:-1,"*":-4},L:{A:-1,R:-2,N:-3,D:-4,C:-1,Q:-2,E:-3,G:-4,H:-3,I:2,L:4,K:-2,M:2,F:0,P:-3,S:-2,T:-1,W:-2,Y:-1,V:1,B:-4,Z:-3,X:-1,"*":-4},K:{A:-1,R:2,N:0,D:-1,C:-3,Q:1,E:1,G:-2,H:-1,I:-3,L:-2,K:5,M:-1,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:0,Z:1,X:-1,"*":-4},M:{A:-1,R:-1,N:-2,D:-3,C:-1,Q:0,E:-2,G:-3,H:-2,I:1,L:2,K:-1,M:5,F:0,P:-2,S:-1,T:-1,W:-1,Y:-1,V:1,B:-3,Z:-1,X:-1,"*":-4},F:{A:-2,R:-3,N:-3,D:-3,C:-2,Q:-3,E:-3,G:-3,H:-1,I:0,L:0,K:-3,M:0,F:6,P:-4,S:-2,T:-2,W:1,Y:3,V:-1,B:-3,Z:-3,X:-1,"*":-4},P:{A:-1,R:-2,N:-2,D:-1,C:-3,Q:-1,E:-1,G:-2,H:-2,I:-3,L:-3,K:-1,M:-2,F:-4,P:7,S:-1,T:-1,W:-4,Y:-3,V:-2,B:-2,Z:-1,X:-2,"*":-4},S:{A:1,R:-1,N:1,D:0,C:-1,Q:0,E:0,G:0,H:-1,I:-2,L:-2,K:0,M:-1,F:-2,P:-1,S:4,T:1,W:-3,Y:-2,V:-2,B:0,Z:0,X:0,"*":-4},T:{A:0,R:-1,N:0,D:-1,C:-1,Q:-1,E:-1,G:-2,H:-2,I:-1,L:-1,K:-1,M:-1,F:-2,P:-1,S:1,T:5,W:-2,Y:-2,V:0,B:-1,Z:-1,X:0,"*":-4},W:{A:-3,R:-3,N:-4,D:-4,C:-2,Q:-2,E:-3,G:-2,H:-2,I:-3,L:-2,K:-3,M:-1,F:1,P:-4,S:-3,T:-2,W:11,Y:2,V:-3,B:-4,Z:-3,X:-2,"*":-4},Y:{A:-2,R:-2,N:-2,D:-3,C:-2,Q:-1,E:-2,G:-3,H:2,I:-1,L:-1,K:-2,M:-1,F:3,P:-3,S:-2,T:-2,W:2,Y:7,V:-1,B:-3,Z:-2,X:-1,"*":-4},V:{A:0,R:-3,N:-3,D:-3,C:-1,Q:-2,E:-2,G:-3,H:-3,I:3,L:1,K:-2,M:1,F:-1,P:-2,S:-2,T:0,W:-3,Y:-1,V:4,B:-3,Z:-2,X:-1,"*":-4},B:{A:-2,R:-1,N:3,D:4,C:-3,Q:0,E:1,G:-1,H:0,I:-3,L:-4,K:0,M:-3,F:-3,P:-2,S:0,T:-1,W:-4,Y:-3,V:-3,B:4,Z:1,X:-1,"*":-4},Z:{A:-1,R:0,N:0,D:1,C:-3,Q:3,E:4,G:-2,H:0,I:-3,L:-3,K:1,M:-1,F:-3,P:-1,S:0,T:-1,W:-3,Y:-2,V:-2,B:1,Z:4,X:-1,"*":-4},X:{A:0,R:-1,N:-1,D:-1,C:-2,Q:-1,E:-1,G:-1,H:-1,I:-1,L:-1,K:-1,M:-1,F:-1,P:-2,S:0,T:0,W:-2,Y:-1,V:-1,B:-1,Z:-1,X:-1,"*":-4},"*":{A:-4,R:-4,N:-4,D:-4,C:-4,Q:-4,E:-4,G:-4,H:-4,I:-4,L:-4,K:-4,M:-4,F:-4,P:-4,S:-4,T:-4,W:-4,Y:-4,V:-4,B:-4,Z:-4,X:-4,"*":1}},fQ=Yk;function dQ(e,t){return fQ[e.toUpperCase()]?.[t.toUpperCase()]??-4}var Wk=-10,zk=-.5;function $k(e,t,r=Wk,n=zk){let o=e.length,i=t.length,s=[],a=[],c=[];for(let h=0;h<=o;h++){s[h]=[],a[h]=[],c[h]=[];for(let y=0;y<=i;y++)s[h][y]=-1/0,a[h][y]=-1/0,c[h][y]=-1/0}s[0][0]=0;for(let h=1;h<=o;h++)a[h][0]=r+(h-1)*n;for(let h=1;h<=i;h++)c[0][h]=r+(h-1)*n;for(let h=1;h<=o;h++)for(let y=1;y<=i;y++){let w=dQ(e[h-1],t[y-1]);s[h][y]=Math.max(s[h-1][y-1],a[h-1][y-1],c[h-1][y-1])+w,a[h][y]=Math.max(s[h-1][y]+r,a[h-1][y]+n),c[h][y]=Math.max(s[h][y-1]+r,c[h][y-1]+n)}let l="",A="",u=o,d=i,m=s[o][i],p=a[o][i],C=c[o][i],x=Math.max(m,p,C),I=x===m?"M":x===p?"Ix":"Iy";for(;u>0||d>0;)if(I==="M"&&u>0&&d>0){l=e[u-1]+l,A=t[d-1]+A;let h=dQ(e[u-1],t[d-1]),y=s[u-1][d-1],w=a[u-1][d-1],S=s[u][d];S===y+h?I="M":S===w+h?I="Ix":I="Iy",u--,d--}else if(I==="Ix"&&u>0){l=e[u-1]+l,A="-"+A;let h=a[u][d],y=s[u-1][d]+r;I=h===y?"M":"Ix",u--}else if(d>0){l="-"+l,A=t[d-1]+A;let h=c[u][d],y=s[u][d-1]+r;I=h===y?"M":"Iy",d--}else break;return{alignedSeq1:l,alignedSeq2:A,score:x}}function Kk(e,t){let r="";for(let n=0;n<e.length;n++){let o=e[n],i=t[n];o==="-"||i==="-"?r+=" ":o.toUpperCase()===i.toUpperCase()?r+="|":r+=" "}return r}function mQ(e,t){let{alignedSeq1:r,alignedSeq2:n}=$k(e,t);return{consensus:Kk(r,n),alns:[{id:"msa",seq:r},{id:"structure",seq:n}]}}function gQ(e){let t=e.alns[0].seq,r=e.alns[1].seq;if(t.length!==r.length)throw new Error("Aligned sequences must have same length");let n=0,o=0,i=new Map,s=new Map;for(let a=0;a<t.length;a++){let c=t[a],l=r[a];c!=="-"&&l!=="-"?(i.set(n,o),s.set(o,n),n++,o++):c==="-"?o++:n++}return{seq1ToSeq2:i,seq2ToSeq1:s}}ys();var tN=(0,xQ.lazy)(()=>Promise.resolve().then(()=>(IQ(),EQ)));function Pd(){return xe.types.compose(yQ.BaseViewModel,Al(),xe.types.model("MsaView",{connectedViewId:xe.types.maybe(xe.types.string),connectedFeature:xe.types.frozen(),connectedHighlights:xe.types.array(xe.types.model({refName:xe.types.string,start:xe.types.number,end:xe.types.number})),blastParams:xe.types.frozen(),querySeqName:"QUERY",uniprotId:xe.types.maybe(xe.types.string),zoomToBaseLevel:!1,init:xe.types.frozen(),connectedStructures:xe.types.array(xe.types.frozen()),dataStoreId:xe.types.maybe(xe.types.string),mafRegion:xe.types.frozen()})).volatile(()=>({rid:void 0,progress:"",error:void 0,loadingStoredData:!1,isStoringData:!1})).views(e=>({getRowByName(t){return e.rows.find(r=>r[0]===t)},getSequenceByRowName(t){return e.rows.find(r=>r[0]===t)?.[1]}})).views(e=>({get transcriptToMsaMap(){return e.connectedFeature?Gh(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,xi.getSession)(e);return t.find(r=>r.id===e.connectedViewId)},get connectedProteinViews(){let t=vn((0,xi.getSession)(e).views),r=[];for(let n of e.connectedStructures){let o=t.find(i=>i.id===n.proteinViewId);o&&r.push({...n,proteinView:o})}return r}})).views(e=>({get structureHoverCol(){for(let t of e.connectedProteinViews){let n=t.proteinView.structures[t.structureIdx]?.hoverPosition?.structureSeqPos;if(n!==void 0){let o=t.structureToMsa[n];if(o!==void 0){let i=e.getSequenceByRowName(t.msaRowName);if(i){let s=$S(i,o);if(s!==void 0)return e.globalColToVisibleCol(s)}}}}}})).views(e=>({get mouseCol2(){let t=e.structureHoverCol;return t!==void 0?t:uQ({model:e})}})).actions(e=>({setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setError(t){e.error=t},setProgress(t){e.progress=t},setRid(t){e.rid=t},setConnectedHighlights(t){e.connectedHighlights=(0,xe.cast)(t)},addToConnectedHighlights(t){e.connectedHighlights.push(t)},clearConnectedHighlights(){e.connectedHighlights=(0,xe.cast)([])},setBlastParams(t){e.blastParams=t},setInit(t){e.init=t},setQuerySeqName(t){e.querySeqName=t},setUniprotId(t){e.uniprotId=t},setDataStoreId(t){e.dataStoreId=t},setMafRegion(t){e.mafRegion=t},setLoadingStoredData(t){e.loadingStoredData=t},setIsStoringData(t){e.isStoringData=t},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,{assemblyManager:o}=(0,xi.getSession)(e),i=ws({model:e,coord:t});if(!(!i||!r))if(n)r.navTo(i);else{let s=Ls({assemblyManager:o,assemblyNames:r.assemblyNames,refName:i.refName});r.centerAt(i.start,s)}},connectToStructure(t,r,n){let o=n??e.querySeqName,i=e.getSequenceByRowName(o);if(!i)throw new Error(`MSA row "${o}" not found`);let s=i.replaceAll("-",""),a=vn((0,xi.getSession)(e).views).find(p=>p.id===t);if(!a)throw new Error(`ProteinView "${t}" not found`);let c=a.structures[r];if(!c)throw new Error(`Structure at index ${r} not found`);let l=c.structureSequences?.[0];if(!l)throw new Error("Structure sequence not available");let A=mQ(s,l),{seq1ToSeq2:u,seq2ToSeq1:d}=gQ(A),m={proteinViewId:t,structureIdx:r,msaRowName:o,msaToStructure:Object.fromEntries(u),structureToMsa:Object.fromEntries(d)};e.connectedStructures.push(m)},disconnectFromStructure(t,r){let n=e.connectedStructures.findIndex(o=>o.proteinViewId===t&&o.structureIdx===r);n!==-1&&e.connectedStructures.splice(n,1)},disconnectAllStructures(){e.connectedStructures.clear()}})).actions(e=>{let t=e.setMouseClickPos.bind(e);return{setMouseClickPos(r,n){t(r,n),r!==void 0&&e.handleMsaClick(r)}}}).views(e=>({extraViewMenuItems(){return[{label:"Zoom to base level on click?",checked:e.zoomToBaseLevel,type:"checkbox",onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}},{label:"Connect to protein structure...",onClick:()=>{(0,xi.getSession)(e).queueDialog(t=>[tN,{model:e,handleClose:t}])}},...e.connectedStructures.length>0?[{label:"Disconnect from protein structures",onClick:()=>{e.disconnectAllStructures()}}]:[]]}})).actions(e=>({afterCreate(){lQ();for(let t of[tQ,rQ,nQ,oQ,iQ,sQ,aQ,cQ])(0,xe.addDisposer)(e,(0,wQ.autorun)(()=>{t(e)}))}}))}var lN=(0,PQ.lazy)(()=>Promise.resolve().then(()=>(RQ(),FQ)));function Ud(e){e.addViewType(()=>new OQ.default({name:"MsaView",stateModel:Pd(),ReactComponent:lN}))}var GQ="2.4.2";var hl=class extends HQ.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=GQ;this.rootConfigurationSchema=r=>({msa:(0,qd.ConfigurationSchema)("MSA",{datasets:jd.types.maybe(jd.types.array((0,qd.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Ud(r),$A(r),KA(r),Tl(r),zl(r)}configure(r){(0,UQ.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:dm,onClick:n=>{n.addView("MsaView",{})}})}};return t1(AN);})();
75
75
  /*! Bundled license information:
76
76
 
77
77
  use-sync-external-store/cjs/use-sync-external-store-shim.production.js: