jbrowse-plugin-msaview 2.3.2 → 2.3.3

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.
@@ -73,7 +73,7 @@ ${J.get("seq")}`).join(`
73
73
  `)}}),r()}catch(T){l(T)}}},"Submit"),Ue.default.createElement(Kr.Button,{color:"secondary",variant:"contained",onClick:r},"Cancel")))}),Th=PM;var HA=f(B());function Lo({children:e,value:t,index:r,...n}){return HA.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r&&HA.default.createElement("div",null,e))}function UA({handleClose:e,feature:t,model:r}){let n=(0,kh.getSession)(r),{jbrowse:o}=n,i=(0,_h.readConfObject)(o,["msa","datasets"]),s=i&&i.length>0,[a,c]=(0,rt.useState)("ncbi_blast");return rt.default.createElement(Dh.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},rt.default.createElement(Jn.Tabs,{value:a,onChange:(A,u)=>{c(u)}},rt.default.createElement(Jn.Tab,{label:"NCBI BLAST query",value:"ncbi_blast"}),s?rt.default.createElement(Jn.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,rt.default.createElement(Jn.Tab,{label:"Ensembl GeneTree",value:"ensembl_genetree"}),rt.default.createElement(Jn.Tab,{label:"Manual upload",value:"manual_msa"})),rt.default.createElement(Lo,{value:a,index:"ncbi_blast"},rt.default.createElement(yA,{handleClose:e,feature:t,model:r})),s?rt.default.createElement(Lo,{value:a,index:"preloaded_msa"},rt.default.createElement(Th,{model:r,feature:t,handleClose:e})):null,rt.default.createElement(Lo,{value:a,index:"ensembl_genetree"},rt.default.createElement(Yg,{model:r,feature:t,handleClose:e})),rt.default.createElement(Lo,{value:a,index:"manual_msa"},rt.default.createElement(zg,{model:r,feature:t,handleClose:e})))}function OM(e){return e.name==="LinearBasicDisplay"}function GM(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=t.contextMenuFeature,o=(0,va.getContainingTrack)(t),i=n?.get("type"),s=n&&["gene","mRNA","transcript"].includes(i);return[...r(),...s?[{label:"Launch MSA view",icon:ng,onClick:()=>{(0,va.getSession)(o).queueDialog(a=>[UA,{model:o,handleClose:a,feature:n}])}}]:[]]}}})}function qA(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(OM(t)&&(t.stateModel=GM(t.stateModel)),t))}function YA(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:g,showBranchLen:h,querySeqName:I})=>{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:g,showBranchLen:h,init:{msaData:r?.msa,treeData:r?.tree,msaUrl:n?.uri,treeUrl:o?.uri,querySeqName:I}})})}var QQ=f(B()),MQ=f(Lh());var dQ=f(B()),mQ=f(Bl()),Ii=f(ne()),Ie=f(Dt());function*JM(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 Fh(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(u=>u.type==="CDS")??[],o=new Set,i=n.filter(u=>{if(u.start>=u.end)return!1;let d=`${u.start}-${u.end}`;return o.has(d)?!1:(o.add(d),!0)}).sort((u,d)=>t*(u.start-d.start)),s={},a={};if(i.length===0)return{g2p:s,p2g:a,refName:r,strand:t};let l=(3-(i[0]?.phase??0))%3,A=-1;for(let u of i)for(let d of JM(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 gQ=f($r());vd();var kd=f(ne());function kS(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 NS(e){return e.replaceAll("-","")}var Al="https://www.ebi.ac.uk/Tools/services/rest",Ik={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 xk({onProgress:e,jobId:t,algorithm:r}){for(;;){for(let o=0;o<10;o++)await Zs(1e3),e(`Re-checking MSA status in... ${10-o}`);let n=await fr(`${Al}/${r}/status/${t}`);if(n==="FINISHED")break;if(n.includes("FAILURE"))throw new Error(`Failed to run: jobId ${t}`)}}async function LS({algorithm:e,sequence:t,onProgress:r}){let n=Ik[e];if(!n)throw new Error(`unknown algorithm: ${e}`);r(`Launching ${e} MSA...`);let o=await fr(`${Al}/${e}/run`,{method:"POST",body:new URLSearchParams({...n.params,sequence:t})});return await xk({jobId:o,algorithm:e,onProgress:r}),{msa:await fr(`${Al}/${e}/result/${o}/${n.msaResult}`),tree:await fr(`${Al}/${e}/result/${o}/${n.treeResult}`)}}async function Td({rid:e,baseUrl:t,onProgress:r}){r(`Checking BLAST status for RID: ${e}...`),await wk({rid:e,onProgress:r,baseUrl:t});let n=await bo(`${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 FS({query:e,blastDatabase:t,blastProgram:r,baseUrl:n,onProgress:o,onRid:i}){o("Submitting to NCBI BLAST...");let{rid:s}=await yk({query:e,blastDatabase:t,blastProgram:r,baseUrl:n});return i(s),Td({rid:s,baseUrl:n,onProgress:o})}async function yk({query:e,blastProgram:t,blastDatabase:r,baseUrl:n}){let o=await fr(n,{method:"POST",body:new URLSearchParams({CMD:"Put",PROGRAM:t==="quick-blastp"?"blastp":t,DATABASE:r,QUERY:e,...r==="nr_clustered_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 wk({rid:e,onProgress:t,baseUrl:r}){for(;;){for(let l=0;l<20;l++)await Zs(1e3),t(`Re-checking BLAST status in... ${20-l}`);let o=await fr(`${r}?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=${e}`),i=/\s+Status=WAITING/m.test(o),s=/\s+Status=FAILED/m.test(o),a=/\s+Status=READY/m.test(o),c=/\s+ThereAreHits=yes/m.test(o);if(!i){if(s)throw new Error(`BLAST ${e} failed`);if(a){if(c)return!0;throw new Error("No hits found")}}}}Di();var Bk="jbrowse-msaview-taxonomy-cache",Is="common-names",bk=2;async function RS(){return Rn(Bk,bk,{upgrade(e){e.objectStoreNames.contains(Is)&&e.deleteObjectStore(Is),e.createObjectStore(Is,{keyPath:"taxid"})}})}async function Sk(e){return(await RS()).get(Is,e)}async function Qk(e){let r=(await RS()).transaction(Is,"readwrite");for(let n of e)await r.store.put(n);await r.done}async function PS(e){let t=new Map,r=[];for(let i of e){let s=await Sk(i);s?t.set(i,{sciname:s.sciname,commonName:s.commonName}):r.push(i)}if(r.length===0)return t;let n=100,o=[];for(let i=0;i<r.length;i+=n){let s=r.slice(i,i+n),a=s.join(",");try{let l=await(await fetch(`https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=taxonomy&id=${a}&retmode=xml`)).text(),A=new Map,u=/<Taxon>\s*<TaxId>(\d+)<\/TaxId>/g,d;for(;(d=u.exec(l))!==null;){let m=Number(d[1]),g=d.index,h=1,I=g+d[0].length;for(;h>0&&I<l.length;){let S=l.indexOf("<Taxon>",I),v=l.indexOf("</Taxon>",I);if(v===-1)break;S!==-1&&S<v?(h++,I=S+7):(h--,I=v+8)}let C=l.slice(g,I),x=A.get(m),y=C.includes("<LineageEx>"),b=x?.includes("<LineageEx>");(!x||y&&!b)&&A.set(m,C)}for(let m of s){let g=A.get(m);if(g){let h=/<GenbankCommonName>(.*?)<\/GenbankCommonName>/.exec(g),I=/<CommonName>(.*?)<\/CommonName>/.exec(g),C=/<ScientificName>(.*?)<\/ScientificName>/.exec(g),x=h?.[1]??I?.[1],y=C?.[1]??"";t.set(m,{sciname:y,commonName:x}),o.push({taxid:m,sciname:y,commonName:x})}else o.push({taxid:m,sciname:"",commonName:void 0})}}catch(c){console.error("Failed to fetch taxonomy data:",c)}}return o.length>0&&await Qk(o),t}async function OS({self:e}){let{baseUrl:t,blastDatabase:r,blastProgram:n,msaAlgorithm:o,proteinSequence:i,selectedTranscript:s,rid:a}=e.blastParams,c=ra(i),l,A;if(a){e.setRid(a);let C=await Td({rid:a,baseUrl:t,onProgress:x=>{e.setProgress(x)}});l=C.hits,A=C.rid}else{let C=await FS({query:c,blastDatabase:r,blastProgram:n,baseUrl:t,onProgress:x=>{e.setProgress(x)},onRid:x=>{e.setRid(x)}});l=C.hits,A=C.rid}e.setProgress("Fetching species taxonomy info...");let u=l.map(C=>C.description[0]?.taxid).filter(C=>C!==void 0),d=await PS(u),m={},g=l.map(C=>{let x=C.description[0]??{accession:"unknown",id:"unknown",sciname:"unknown"},y=kS(x,d),b=NS(C.hsps[0]?.hseq??"");return m[y]=Mk(x,d),`>${y}
74
74
  ${b}`}),h=await LS({algorithm:o,sequence:[`>QUERY
75
75
  ${c}`,...g].join(`
76
- `),onProgress:C=>{e.setProgress(C)}}),I=JSON.stringify(m);return await cp({proteinSequence:c,blastDatabase:r,blastProgram:n,msaAlgorithm:o,msa:h.msa,tree:h.tree,treeMetadata:I,rid:A,geneId:s?.get("parentId"),transcriptId:s?.id(),transcriptName:s?.get("name")??s?.get("id"),geneName:s?.get("gene_name")??s?.get("parentId")}),{...h,treeMetadata:I}}function Mk(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}function ul(e,t){if(t<0||t>=e.length)return;let r=0;for(let n=0;n<t;n++)e[n]!=="-"&&r++;if(e[t]!=="-")return r}function GS(e,t){let r=0;for(let n=0;n<e.length;n++)if(e[n]!=="-"){if(r===t)return n;r++}}function _d(e){return Object.fromEntries(e)}function xs({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=ul(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}}}Di();var vk="jbrowse-msaview-data",Tk=1,ys="msa-data";async function Dd(){return Rn(vk,Tk,{upgrade(e){e.objectStoreNames.contains(ys)||e.createObjectStore(ys,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function JS(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function HS(e,t){try{let r=await Dd(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(ys,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function US(e){try{let r=await(await Dd()).get(ys,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 qS(e=10080*60*1e3){try{let t=await Dd(),r=Date.now()-e,i=await t.transaction(ys,"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}}function YS(e){return typeof e=="object"&&e!==null&&"hoverFeature"in e&&"hoverPosition"in e}function jS(e){return/AF-([A-Z0-9]+)-F\d+/.exec(e)?.[1]}function VS(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await US(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 WS(e){let{rows:t,dataStoreId:r}=e;if(t.length>0&&!r){if(!!(e.msaFilehandle??e.treeFilehandle))return;let o=e.data.msa,i=e.data.tree;(o||i)&&(async()=>{try{let s=JS();await HS(s,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(s)}catch(s){console.error("Failed to store MSA data to IndexedDB:",s)}})()}}function zS(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await OS({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function $S(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=jS(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 KS(e){let{mouseCol:t,mouseClickCol:r}=e,n=t===void 0?void 0:xs({model:e,coord:t}),o=r===void 0?void 0:xs({model:e,coord:r});e.setConnectedHighlights([n,o].filter(i=>!!i))}function XS(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=ul(i,t);if(s===void 0){o.clearHighlightFromExternal?.();continue}let a=n.msaToStructure[s];a===void 0?o.clearHighlightFromExternal?.():o.highlightFromExternal?.(a)}}function ZS(e){let{views:t}=(0,kd.getSession)(e),{connectedViewId:r,uniprotId:n,rows:o,connectedStructures:i}=e;if(!(!n||o.length===0))for(let s of t){let a=s;if(!(a.type!=="ProteinView"||!a.structures))for(let c=0;c<a.structures.length;c++){let l=a.structures[c];if(!(l.connectedViewId!==r||l.uniprotId!==n||i.some(u=>u.proteinViewId===a.id&&u.structureIdx===c))&&l.structureSequences?.[0])try{e.connectToStructure(a.id,c)}catch(u){console.error("Failed to auto-connect to ProteinView:",u)}}}}function eQ(e){let{views:t}=(0,kd.getSession)(e),{connectedViewId:r,transcriptToMsaMap:n,querySeqName:o}=e;if(!r||!n)return;let i=[];for(let a of t){let c=a;if(!(c.type!=="ProteinView"||!c.structures))for(let l of c.structures){if(l.connectedViewId!==r)continue;let A=l.hoverGenomeHighlights;if(!A||A.length===0)continue;let{g2p:u}=n;for(let d of A)for(let m=d.start;m<d.end;m++){let g=u[m];if(g!==void 0){let h=e.seqPosToGlobalCol(o,g);i.includes(h)||i.push(h)}}}}let s=i.map(a=>e.globalColToVisibleCol(a)).filter(a=>a!==void 0);e.setHighlightedColumns(s.length>0?s:void 0)}function tQ(){qS().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}var rQ=f(ne());function nQ({model:e}){let{hovered:t}=(0,rQ.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!YS(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 _k={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}},oQ=_k;function iQ(e,t){let r=e.toUpperCase(),n=t.toUpperCase();return oQ[r]?.[n]??-4}var Dk=-10,kk=-.5;function Nk(e,t,r=Dk,n=kk){let o=e.length,i=t.length,s=[],a=[],c=[];for(let I=0;I<=o;I++){s[I]=[],a[I]=[],c[I]=[];for(let C=0;C<=i;C++)s[I][C]=-1/0,a[I][C]=-1/0,c[I][C]=-1/0}s[0][0]=0;for(let I=1;I<=o;I++)a[I][0]=r+(I-1)*n;for(let I=1;I<=i;I++)c[0][I]=r+(I-1)*n;for(let I=1;I<=o;I++)for(let C=1;C<=i;C++){let x=iQ(e[I-1],t[C-1]);s[I][C]=Math.max(s[I-1][C-1],a[I-1][C-1],c[I-1][C-1])+x,a[I][C]=Math.max(s[I-1][C]+r,a[I-1][C]+n),c[I][C]=Math.max(s[I][C-1]+r,c[I][C-1]+n)}let l="",A="",u=o,d=i,m=[s[o][i],a[o][i],c[o][i]],g=Math.max(...m),h=g===s[o][i]?"M":g===a[o][i]?"Ix":"Iy";for(;u>0||d>0;)if(h==="M"&&u>0&&d>0){l=e[u-1]+l,A=t[d-1]+A;let I=iQ(e[u-1],t[d-1]),C=s[u-1][d-1],x=a[u-1][d-1];s[u][d]===C+I?h="M":s[u][d]===x+I?h="Ix":h="Iy",u--,d--}else if(h==="Ix"&&u>0)l=e[u-1]+l,A="-"+A,h=a[u][d]===s[u-1][d]+r?"M":"Ix",u--;else if(d>0)l="-"+l,A=t[d-1]+A,h=c[u][d]===s[u][d-1]+r?"M":"Iy",d--;else break;return{alignedSeq1:l,alignedSeq2:A,score:g}}function Lk(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 sQ(e,t){let{alignedSeq1:r,alignedSeq2:n}=Nk(e,t);return{consensus:Lk(r,n),alns:[{id:"msa",seq:r},{id:"structure",seq:n}]}}function aQ(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}}var Pk=(0,dQ.lazy)(()=>Promise.resolve().then(()=>(fQ(),uQ)));function Nd(){return Ie.types.compose(mQ.BaseViewModel,ll(),Ie.types.model("MsaView",{connectedViewId:Ie.types.maybe(Ie.types.string),connectedFeature:Ie.types.frozen(),connectedHighlights:Ie.types.array(Ie.types.model({refName:Ie.types.string,start:Ie.types.number,end:Ie.types.number})),blastParams:Ie.types.frozen(),querySeqName:"QUERY",uniprotId:Ie.types.maybe(Ie.types.string),zoomToBaseLevel:!1,init:Ie.types.frozen(),connectedStructures:Ie.types.array(Ie.types.frozen()),dataStoreId:Ie.types.maybe(Ie.types.string),mafRegion:Ie.types.frozen()})).volatile(()=>({rid:void 0,progress:"",error:void 0,loadingStoredData:!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?Fh(e.connectedFeature):void 0},get processing(){return!!e.progress},get connectedView(){let{views:t}=(0,Ii.getSession)(e);return t.find(r=>r.id===e.connectedViewId)},get connectedProteinViews(){let{views:t}=(0,Ii.getSession)(e);return e.connectedStructures.map(r=>{let n=t.find(o=>o.id===r.proteinViewId);return n?{...r,proteinView:n}:void 0}).filter(r=>!!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=GS(i,o);if(s!==void 0)return e.globalColToVisibleCol(s)}}}}}})).views(e=>({get mouseCol2(){let t=e.structureHoverCol;return t!==void 0?t:nQ({model:e})},get clickCol2(){}})).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,Ie.cast)(t)},addToConnectedHighlights(t){e.connectedHighlights.push(t)},clearConnectedHighlights(){e.connectedHighlights=(0,Ie.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},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,{assemblyManager:o}=(0,Ii.getSession)(e),i=xs({model:e,coord:t});if(!(!i||!r))if(n)r.navTo(i);else{let s=o.get(r.assemblyNames[0])?.getCanonicalRefName(i.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("-",""),{views:a}=(0,Ii.getSession)(e),c=a.find(h=>h.id===t);if(!c)throw new Error(`ProteinView "${t}" not found`);let l=c.structures?.[r];if(!l)throw new Error(`Structure at index ${r} not found`);let A=l.structureSequences?.[0];if(!A)throw new Error("Structure sequence not available");let u=sQ(s,A),{seq1ToSeq2:d,seq2ToSeq1:m}=aQ(u),g={proteinViewId:t,structureIdx:r,msaRowName:o,msaToStructure:_d(d),structureToMsa:_d(m)};e.connectedStructures.push(g)},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,Ii.getSession)(e).queueDialog(t=>[Pk,{model:e,handleClose:t}])}},...e.connectedStructures.length>0?[{label:"Disconnect from protein structures",onClick:()=>{e.disconnectAllStructures()}}]:[]]}})).actions(e=>({afterCreate(){tQ();for(let t of[VS,WS,zS,$S,KS,XS,ZS,eQ])(0,Ie.addDisposer)(e,(0,gQ.autorun)(()=>{t(e)}))}}))}var Yk=(0,QQ.lazy)(()=>Promise.resolve().then(()=>(SQ(),bQ)));function Pd(e){e.addViewType(()=>new MQ.default({name:"MsaView",stateModel:Nd(),ReactComponent:Yk}))}var vQ="2.2.11";var dl=class extends TQ.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=vQ;this.rootConfigurationSchema=r=>({msa:(0,Od.ConfigurationSchema)("MSA",{datasets:Gd.types.maybe(Gd.types.array((0,Od.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Pd(r),qA(r),YA(r),wl(r),Hl(r)}configure(r){(0,_Q.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:lm,onClick:n=>{n.addView("MsaView",{})}})}};return qQ(jk);})();
76
+ `),onProgress:C=>{e.setProgress(C)}}),I=JSON.stringify(m);return await cp({proteinSequence:c,blastDatabase:r,blastProgram:n,msaAlgorithm:o,msa:h.msa,tree:h.tree,treeMetadata:I,rid:A,geneId:s?.get("parentId"),transcriptId:s?.id(),transcriptName:s?.get("name")??s?.get("id"),geneName:s?.get("gene_name")??s?.get("parentId")}),{...h,treeMetadata:I}}function Mk(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}function ul(e,t){if(t<0||t>=e.length)return;let r=0;for(let n=0;n<t;n++)e[n]!=="-"&&r++;if(e[t]!=="-")return r}function GS(e,t){let r=0;for(let n=0;n<e.length;n++)if(e[n]!=="-"){if(r===t)return n;r++}}function _d(e){return Object.fromEntries(e)}function xs({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=ul(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}}}Di();var vk="jbrowse-msaview-data",Tk=1,ys="msa-data";async function Dd(){return Rn(vk,Tk,{upgrade(e){e.objectStoreNames.contains(ys)||e.createObjectStore(ys,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function JS(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function HS(e,t){try{let r=await Dd(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(ys,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function US(e){try{let r=await(await Dd()).get(ys,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 qS(e=10080*60*1e3){try{let t=await Dd(),r=Date.now()-e,i=await t.transaction(ys,"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}}function YS(e){return typeof e=="object"&&e!==null&&"hoverFeature"in e&&"hoverPosition"in e}function jS(e){return/AF-([A-Z0-9]+)-F\d+/.exec(e)?.[1]}function VS(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await US(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 WS(e){let{rows:t,dataStoreId:r}=e;if(t.length>0&&!r){if(!!(e.msaFilehandle??e.treeFilehandle))return;let o=e.data.msa,i=e.data.tree;(o||i)&&(async()=>{try{let s=JS();await HS(s,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(s)}catch(s){console.error("Failed to store MSA data to IndexedDB:",s)}})()}}function zS(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await OS({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function $S(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=jS(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 KS(e){let{mouseCol:t,mouseClickCol:r}=e,n=t===void 0?void 0:xs({model:e,coord:t}),o=r===void 0?void 0:xs({model:e,coord:r});e.setConnectedHighlights([n,o].filter(i=>!!i))}function XS(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=ul(i,t);if(s===void 0){o.clearHighlightFromExternal?.();continue}let a=n.msaToStructure[s];a===void 0?o.clearHighlightFromExternal?.():o.highlightFromExternal?.(a)}}function ZS(e){let{views:t}=(0,kd.getSession)(e),{connectedViewId:r,uniprotId:n,rows:o,connectedStructures:i}=e;if(!(!n||o.length===0))for(let s of t){let a=s;if(!(a.type!=="ProteinView"||!a.structures))for(let c=0;c<a.structures.length;c++){let l=a.structures[c];if(!(l.connectedViewId!==r||l.uniprotId!==n||i.some(u=>u.proteinViewId===a.id&&u.structureIdx===c))&&l.structureSequences?.[0])try{e.connectToStructure(a.id,c)}catch(u){console.error("Failed to auto-connect to ProteinView:",u)}}}}function eQ(e){let{views:t}=(0,kd.getSession)(e),{connectedViewId:r,transcriptToMsaMap:n,querySeqName:o}=e;if(!r||!n)return;let i=[];for(let a of t){let c=a;if(!(c.type!=="ProteinView"||!c.structures))for(let l of c.structures){if(l.connectedViewId!==r)continue;let A=l.hoverGenomeHighlights;if(!A||A.length===0)continue;let{g2p:u}=n;for(let d of A)for(let m=d.start;m<d.end;m++){let g=u[m];if(g!==void 0){let h=e.seqPosToGlobalCol(o,g);i.includes(h)||i.push(h)}}}}let s=i.map(a=>e.globalColToVisibleCol(a)).filter(a=>a!==void 0);e.setHighlightedColumns(s.length>0?s:void 0)}function tQ(){qS().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}var rQ=f(ne());function nQ({model:e}){let{hovered:t}=(0,rQ.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!YS(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 _k={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}},oQ=_k;function iQ(e,t){let r=e.toUpperCase(),n=t.toUpperCase();return oQ[r]?.[n]??-4}var Dk=-10,kk=-.5;function Nk(e,t,r=Dk,n=kk){let o=e.length,i=t.length,s=[],a=[],c=[];for(let I=0;I<=o;I++){s[I]=[],a[I]=[],c[I]=[];for(let C=0;C<=i;C++)s[I][C]=-1/0,a[I][C]=-1/0,c[I][C]=-1/0}s[0][0]=0;for(let I=1;I<=o;I++)a[I][0]=r+(I-1)*n;for(let I=1;I<=i;I++)c[0][I]=r+(I-1)*n;for(let I=1;I<=o;I++)for(let C=1;C<=i;C++){let x=iQ(e[I-1],t[C-1]);s[I][C]=Math.max(s[I-1][C-1],a[I-1][C-1],c[I-1][C-1])+x,a[I][C]=Math.max(s[I-1][C]+r,a[I-1][C]+n),c[I][C]=Math.max(s[I][C-1]+r,c[I][C-1]+n)}let l="",A="",u=o,d=i,m=[s[o][i],a[o][i],c[o][i]],g=Math.max(...m),h=g===s[o][i]?"M":g===a[o][i]?"Ix":"Iy";for(;u>0||d>0;)if(h==="M"&&u>0&&d>0){l=e[u-1]+l,A=t[d-1]+A;let I=iQ(e[u-1],t[d-1]),C=s[u-1][d-1],x=a[u-1][d-1];s[u][d]===C+I?h="M":s[u][d]===x+I?h="Ix":h="Iy",u--,d--}else if(h==="Ix"&&u>0)l=e[u-1]+l,A="-"+A,h=a[u][d]===s[u-1][d]+r?"M":"Ix",u--;else if(d>0)l="-"+l,A=t[d-1]+A,h=c[u][d]===s[u][d-1]+r?"M":"Iy",d--;else break;return{alignedSeq1:l,alignedSeq2:A,score:g}}function Lk(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 sQ(e,t){let{alignedSeq1:r,alignedSeq2:n}=Nk(e,t);return{consensus:Lk(r,n),alns:[{id:"msa",seq:r},{id:"structure",seq:n}]}}function aQ(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}}var Pk=(0,dQ.lazy)(()=>Promise.resolve().then(()=>(fQ(),uQ)));function Nd(){return Ie.types.compose(mQ.BaseViewModel,ll(),Ie.types.model("MsaView",{connectedViewId:Ie.types.maybe(Ie.types.string),connectedFeature:Ie.types.frozen(),connectedHighlights:Ie.types.array(Ie.types.model({refName:Ie.types.string,start:Ie.types.number,end:Ie.types.number})),blastParams:Ie.types.frozen(),querySeqName:"QUERY",uniprotId:Ie.types.maybe(Ie.types.string),zoomToBaseLevel:!1,init:Ie.types.frozen(),connectedStructures:Ie.types.array(Ie.types.frozen()),dataStoreId:Ie.types.maybe(Ie.types.string),mafRegion:Ie.types.frozen()})).volatile(()=>({rid:void 0,progress:"",error:void 0,loadingStoredData:!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?Fh(e.connectedFeature):void 0},get processing(){return!!e.progress},get connectedView(){let{views:t}=(0,Ii.getSession)(e);return t.find(r=>r.id===e.connectedViewId)},get connectedProteinViews(){let{views:t}=(0,Ii.getSession)(e);return e.connectedStructures.map(r=>{let n=t.find(o=>o.id===r.proteinViewId);return n?{...r,proteinView:n}:void 0}).filter(r=>!!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=GS(i,o);if(s!==void 0)return e.globalColToVisibleCol(s)}}}}}})).views(e=>({get mouseCol2(){let t=e.structureHoverCol;return t!==void 0?t:nQ({model:e})},get clickCol2(){}})).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,Ie.cast)(t)},addToConnectedHighlights(t){e.connectedHighlights.push(t)},clearConnectedHighlights(){e.connectedHighlights=(0,Ie.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},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,{assemblyManager:o}=(0,Ii.getSession)(e),i=xs({model:e,coord:t});if(!(!i||!r))if(n)r.navTo(i);else{let s=o.get(r.assemblyNames[0])?.getCanonicalRefName(i.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("-",""),{views:a}=(0,Ii.getSession)(e),c=a.find(h=>h.id===t);if(!c)throw new Error(`ProteinView "${t}" not found`);let l=c.structures?.[r];if(!l)throw new Error(`Structure at index ${r} not found`);let A=l.structureSequences?.[0];if(!A)throw new Error("Structure sequence not available");let u=sQ(s,A),{seq1ToSeq2:d,seq2ToSeq1:m}=aQ(u),g={proteinViewId:t,structureIdx:r,msaRowName:o,msaToStructure:_d(d),structureToMsa:_d(m)};e.connectedStructures.push(g)},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,Ii.getSession)(e).queueDialog(t=>[Pk,{model:e,handleClose:t}])}},...e.connectedStructures.length>0?[{label:"Disconnect from protein structures",onClick:()=>{e.disconnectAllStructures()}}]:[]]}})).actions(e=>({afterCreate(){tQ();for(let t of[VS,WS,zS,$S,KS,XS,ZS,eQ])(0,Ie.addDisposer)(e,(0,gQ.autorun)(()=>{t(e)}))}}))}var Yk=(0,QQ.lazy)(()=>Promise.resolve().then(()=>(SQ(),bQ)));function Pd(e){e.addViewType(()=>new MQ.default({name:"MsaView",stateModel:Nd(),ReactComponent:Yk}))}var vQ="2.3.3";var dl=class extends TQ.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=vQ;this.rootConfigurationSchema=r=>({msa:(0,Od.ConfigurationSchema)("MSA",{datasets:Gd.types.maybe(Gd.types.array((0,Od.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Pd(r),qA(r),YA(r),wl(r),Hl(r)}configure(r){(0,_Q.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:lm,onClick:n=>{n.addView("MsaView",{})}})}};return qQ(jk);})();
77
77
  /*! Bundled license information:
78
78
 
79
79
  use-sync-external-store/cjs/use-sync-external-store-shim.production.js: