jbrowse-plugin-msaview 2.10.1 → 2.10.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.
- package/dist/jbrowse-plugin-msaview.umd.production.min.js +1 -1
- package/dist/jbrowse-plugin-msaview.umd.production.min.js.map +2 -2
- package/dist/utils/useFetch.js +0 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -2
- package/src/utils/useFetch.ts +0 -0
- package/src/version.ts +1 -1
|
@@ -84,7 +84,7 @@ ${h.sequence}`)].join(`
|
|
|
84
84
|
`)){let[o,i,s]=n.split(" ");if(o&&ZD(o)===r)return{offset:Number(i),length:Number(s)}}}var rN=p(ye());function nN({model:e}){let{hovered:t}=(0,rN.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Po(t))return;let{coord:s,refName:a}=t.hoverPosition,c=s-1;if(i)return a!==i.refName||!o.assemblyNames.includes(i.assemblyName)||c<i.start||c>=i.end?void 0:e.seqPosToVisibleCol(r,c-i.start);if(a===n?.refName){let l=n.g2p[c];if(l!==void 0)return e.seqPosToVisibleCol(r,l)}}var Aj="jbrowse-msaview-domain-cache",zd="domains",mj=1,oN=yo(Aj,mj,e=>{e.objectStoreNames.contains(zd)||e.createObjectStore(zd,{keyPath:"accession"})});async function iN(e){let r=(await oN()).transaction(zd,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n}async function sN(e){let r=(await oN()).transaction(zd,"readwrite");for(let n of e)await r.store.put(n);await r.done}Ci();function Co(e,t){return new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(e)?.[1]}function pj(e){let t={},r=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=r.exec(e))!==null;){let o=Co(n[1],"GBQualifier_name"),i=Co(n[1],"GBQualifier_value");o&&i!==void 0&&t[o]===void 0&&(t[o]=i)}return t}function gj(e){let t=[],r=[],n=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,o;for(;(o=n.exec(e))!==null;){let i=o[1],s=Co(i,"GBInterval_from"),a=Co(i,"GBInterval_to"),c=Co(i,"GBInterval_point");s&&a?(t.push(Number(s)),r.push(Number(a))):c&&(t.push(Number(c)),r.push(Number(c)))}return t.length>0?{start:Math.min(...t),end:Math.max(...r)}:void 0}var hj=2;function yj(e){let t=Co(e,"GBFeature_key"),r=pj(e),n=r.db_xref,o=gj(e);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&o&&o.end-o.start+1>=hj){let i=n.replace("CDD:",""),s=t==="Region",a=r.note?.split(/[[(]/)[0]?.trim(),c=s?r.region_name??i:a||r.site_type||"site",l=s?i:`${i}:${c}`;return{signature:{entry:{name:c,description:r.note??c,accession:l}},locations:[o]}}}function xj(e){let t=new Map,r=/<GBSeq>([\s\S]*?)<\/GBSeq>/g,n;for(;(n=r.exec(e))!==null;){let o=n[1],i=[],s=/<GBFeature>([\s\S]*?)<\/GBFeature>/g,a;for(;(a=s.exec(o))!==null;){let c=yj(a[1]);c&&i.push(c)}for(let c of[Co(o,"GBSeq_accession-version"),Co(o,"GBSeq_primary-accession")])c&&t.set(c,i)}return t}async function aN(e){let t=[...new Set(e)].filter(Boolean),r=new Map,n=await iN(t),o=[];t.forEach((a,c)=>{let l=n[c];l?r.set(a,l.matches):o.push(a)});let i=[],s=100;for(let a=0;a<o.length;a+=s){let c=o.slice(a,a+s),l=await Qr(Yd({db:"protein",id:c.join(","),rettype:"gp",retmode:"xml"})),u=xj(l);for(let d of c){let A=u.get(d);A!==void 0&&(r.set(d,A),i.push({accession:d,matches:A}))}}return i.length>0&&await sN(i),r}async function cN(e){let t=e.data.treeMetadata;if(!t)throw new Error("No sequence metadata available to look up domains");let r=JSON.parse(t),n=Object.entries(r).map(([s,a])=>({rowName:s,accession:a.Accession})).filter(s=>!!s.accession);if(n.length===0)throw new Error("No NCBI accessions found in alignment rows");e.setProgress(`Fetching protein domains from NCBI for ${n.length} sequences...`);let o=await aN(n.map(s=>s.accession)),i={};for(let{rowName:s,accession:a}of n){let c=o.get(a);c&&c.length>0&&(i[s]={matches:c,xref:[{id:s}]})}if(Object.keys(i).length===0)throw new Error("No CDD domain annotations found for these proteins");e.setDomains(i)}var Cj="jbrowse-msaview-data",bj=1,el="msa-data",sy=yo(Cj,bj,e=>{e.objectStoreNames.contains(el)||e.createObjectStore(el,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})});function lN(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function uN(e,t){try{let r=await sy(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(el,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function fN(e){try{let r=await(await sy()).get(el,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 dN(e=10080*60*1e3){try{let t=await sy(),r=Date.now()-e,i=await t.transaction(el,"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 Ej(e){let t=e;return t.type==="ProteinView"&&Array.isArray(t.structures)}function AN(e){return e.filter(Ej)}function mN(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 gN(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await fN(t);n&&(n.msa&&e.setMSA(n.msa),n.tree&&e.setTree(n.tree),n.treeMetadata&&e.setTreeMetadata(n.treeMetadata))}catch(n){console.error("Failed to load MSA data from IndexedDB:",n)}finally{e.setLoadingStoredData(!1)}})()}function hN(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=lN();await uN(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 yN(e){e.orthologParams&&(async()=>{try{e.setProgress("Resolving orthologs"),e.setError(void 0);let t=await XD({self:e});e.setData(t),e.setOrthologParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function xN(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await VD({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function CN(e){let{rows:t,domainsRequested:r,interProAnnotations:n}=e,o=e.data.treeMetadata?.includes('"Accession"')??!1;t.length>0&&o&&!n&&!r&&(e.setDomainsRequested(!0),(async()=>{try{await cN(e)}catch(i){console.error("[msaview-domains] auto-load failed:",i)}finally{e.setProgress("")}})())}function bN(e){let{init:t}=e;if(t){let{msaUrl:r,msaIndexedLocation:n,msaName:o,querySeqName:i}=t;(async()=>{try{if(e.setError(void 0),r){let s=iw(r);s&&(e.setUniprotId(s),e.setQuerySeqName("query"))}if(i&&e.setQuerySeqName(i),r)e.setMSAFilehandle({uri:r,locationType:"UriLocation"});else if(n&&o){let s=await tN({location:n,name:o});if(s)e.setMSA(s);else throw new Error(`No alignment named ${o} in ${n.uri}`)}e.setInit(void 0)}catch(s){e.setError(s),console.error(s)}})()}}function EN(e){let t=!1;return()=>{let r=nN({model:e});r!==void 0?(e.setMousePos(r),t=!0):t&&(e.setMousePos(void 0),t=!1)}}function wN(e){let t=!1;return()=>{let{connectedViewId:r,transcriptToMsaMap:n,querySeqName:o}=e;if(!r||!n)return;let i=new Set;for(let a of AN((0,pN.getSession)(e).views))for(let c of a.structures){if(c.connectedViewId!==r)continue;let l=c.hoverGenomeHighlights;if(!l||l.length===0)continue;let{g2p:u}=n;for(let d of l)for(let A=d.start;A<d.end;A++){let f=u[A];if(f!==void 0){let g=e.seqPosToGlobalCol(o,f);i.add(g)}}}let s=Array.from(i).map(a=>e.globalColToVisibleCol(a)).filter(a=>a!==void 0);s.length>0?(e.setHighlightedColumns(s),t=!0):t&&(e.setHighlightedColumns(e.highlightColumns?.length?e.highlightColumns:void 0),t=!1)}}function IN(){dN().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}function qd({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o,rows:i}=e,s=i.find(c=>c[0]===r)?.[1];if(!s)return[];let a=mN(s,t);if(a===void 0)return[];if(o){let c=o.start+a;return c<o.end?[{refName:o.refName,start:c,end:c+1}]:[]}if(n){let{refName:c,p2gCodon:l}=n;return lw(l,a)?.map(([u,d])=>({refName:c,start:u,end:d}))??[]}return[]}function SN(e){let t=qd(e),r=t[0],n=t.at(-1);return r&&n?{refName:r.refName,start:r.start,end:n.end}:void 0}function ay(){return ot.types.compose(vN.BaseViewModel,Fd(),ot.types.model("MsaView",{connectedViewId:ot.types.maybe(ot.types.string),connectedFeature:ot.types.frozen(),blastParams:ot.types.frozen(),orthologParams:ot.types.frozen(),querySeqName:"QUERY",uniprotId:ot.types.maybe(ot.types.string),zoomToBaseLevel:!1,init:ot.types.frozen(),dataStoreId:ot.types.maybe(ot.types.string),mafRegion:ot.types.frozen()})).volatile(()=>({rid:void 0,progress:"",error:void 0,loadingStoredData:!1,isStoringData:!1,domainsRequested:!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?cw(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,BN.getSession)(e);return t.find(r=>r.id===e.connectedViewId)}})).views(e=>({get connectedHoverHighlights(){let{mouseCol:t}=e;return t===void 0?[]:qd({model:e,coord:t})},get connectedClickHighlights(){let{mouseClickCol:t}=e;return t===void 0?[]:qd({model:e,coord:t})},get connectedHighlights(){return[...this.connectedHoverHighlights,...this.connectedClickHighlights]}})).actions(e=>({setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setError(t){e.error=t},setProgress(t){e.progress=t},setRid(t){e.rid=t},setBlastParams(t){e.blastParams=t},setOrthologParams(t){e.orthologParams=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},setDomainsRequested(t){e.domainsRequested=t},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,o=SN({model:e,coord:t});!o||!r||(n?r.navTo(o):r.centerAt(o.start,o.refName))}})).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)}}]}})).actions(e=>({afterCreate(){IN();for(let t of[gN,hN,xN,yN,bN,CN])(0,ot.addDisposer)(e,(0,Jd.autorun)(()=>{t(e)}));(0,ot.addDisposer)(e,(0,Jd.autorun)(EN(e))),(0,ot.addDisposer)(e,(0,Jd.autorun)(wN(e)))}}))}function oa(e){return e.type==="MsaView"}var wj=(0,ly.observer)(function({model:e}){let{hovered:t,views:r}=(0,TN.getSession)(e);return r.some(o=>oa(o)&&o.connectedViewId===e.id)&&Po(t)?cy.default.createElement(Ij,{model:e,hovered:t}):null}),Ij=(0,ly.observer)(function({model:e,hovered:t}){let{classes:r}=Su(),{offsetPx:n}=e,{coord:o,refName:i}=t.hoverPosition,s=e.bpToPx({refName:i,coord:o-1}),a=e.bpToPx({refName:i,coord:o});if(s&&a){let c=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),l=Math.min(s.offsetPx,a.offsetPx)-n;return cy.default.createElement("div",{className:r.highlight,style:{left:l,width:c}})}return null}),MN=wj;var tl=p(_()),QN=p(ye()),uy=p(Y());var Sj=(0,uy.observer)(function({model:t}){let{views:r,hovered:n}=(0,QN.getSession)(t),o=r.filter(oa).find(s=>s.connectedViewId===t.id),i=[...o?.connectedClickHighlights??[],...Po(n)?[]:o?.connectedHoverHighlights??[]];return i.length?tl.default.createElement(vj,{model:t,highlights:i}):null}),vj=(0,uy.observer)(function({model:e,highlights:t}){let{classes:r}=Su(),{offsetPx:n}=e;return tl.default.createElement(tl.default.Fragment,null,t.map((o,i)=>{let s=e.bpToPx({refName:o.refName,coord:o.start}),a=e.bpToPx({refName:o.refName,coord:o.end});if(s&&a){let c=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),l=Math.min(s.offsetPx,a.offsetPx)-n;return tl.default.createElement("div",{key:`${o.refName}-${o.start}-${o.end}-${i}`,className:r.highlight,style:{left:l,width:c}})}return null}))}),RN=Sj;var Bj=(0,_N.observer)(function({model:t}){return rl.default.createElement(rl.default.Fragment,null,rl.default.createElement(RN,{model:t}),rl.default.createElement(MN,{model:t}))}),kN=Bj;function fy(e){e.addToExtensionPoint("LinearGenomeView-TracksContainerComponent",(t,{model:r})=>{let{views:n}=(0,NN.getSession)(r);return n.some(i=>oa(i)&&i.connectedViewId===r.id)?[...t,DN.default.createElement(kN,{key:"highlight_protein_viewer_msaview",model:r})]:t})}var VN=p(np());var LN=p(Mi());function dy(e){let t=e.getAdapterType("BgzipFastaAdapter");return(0,LN.ConfigurationSchema)("BgzipFastaMsaAdapter",{msaRegex:{type:"string",defaultValue:"_"}},{baseConfiguration:t?.configSchema})}function Ay(e){return e.addAdapterType(()=>new VN.AdapterType({name:"BgzipFastaMsaAdapter",configSchema:dy(e),adapterMetadata:{hiddenFromGUI:!0},getAdapterClass:()=>Promise.resolve().then(()=>(UN(),HN)).then(t=>t.default)}))}var iA=p(ye());xe();var jN=p(F(),1),$N=$((0,jN.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");var dt=p(_()),fP=p($e()),dP=p(ye()),Ei=p(G());var Nr=p(_());xe();var YN=p(F(),1),WN=$((0,YN.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");var PL=p(G()),FL=p(vt());var Fe=p(_());v0();var Dr=p(G()),SL=p(Y()),vL=p(vt());var it=p(_()),tL=p($e());xe();var zN=p(F(),1),qN=$((0,zN.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM19 4h-3.5l-1-1h-5l-1 1H5v2h14z"}),"Delete");var yt=p(G()),rL=p(Y()),nL=p(vt());var my=p(ye());function JN({newViewTitle:e,view:t,feature:r,blastParams:n}){(0,my.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,connectedFeature:r.toJSON(),drawNodeBubbles:!0,colWidth:10,rowHeight:12,blastParams:n})}function KN({newViewTitle:e,view:t,cached:r,connectedFeature:n}){(0,my.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,connectedFeature:n,drawNodeBubbles:!0,colWidth:10,rowHeight:12,data:{msa:r.msa,tree:r.tree,treeMetadata:r.treeMetadata}})}var mr=p(_()),XN=e=>e==null||e===!1;function Tj(e){return XN(e)||Array.isArray(e)&&e.some(XN)?null:JSON.stringify(e)}function cn(e,t,{onSuccess:r}={}){let n=Tj(e),[o,i]=(0,mr.useState)(0),[s,a]=(0,mr.useState)(),c=n===null?null:`${o}\0${n}`,l=s?.attempt===c,u=s?.question===n,d=(0,mr.useRef)({fetcher:t,onSuccess:r});return(0,mr.useEffect)(()=>{d.current={fetcher:t,onSuccess:r}}),(0,mr.useEffect)(()=>{if(c===null||n===null)return;let A=!0;return d.current.fetcher().then(f=>{A&&(a({attempt:c,question:n,data:f}),d.current.onSuccess?.(f))}).catch(f=>{A&&a({attempt:c,question:n,error:f})}),()=>{A=!1}},[c,n]),{data:u?s.data:void 0,error:l?s.error:void 0,isLoading:c!==null&&!l,mutate:(0,mr.useCallback)(()=>{i(A=>A+1)},[])}}function ZN(e,t){let[r,n]=(0,mr.useState)(e);return(0,mr.useEffect)(()=>{let o=setTimeout(()=>{n(e)},t);return()=>{clearTimeout(o)}},[e,t]),r}function Xd(e){let{data:t,error:r,isLoading:n,mutate:o}=cn(`cached-blast-${e.join(",")}`,async()=>(await RD()).filter(s=>s.geneId&&e.includes(s.geneId)));return{results:t??[],error:r,isLoading:n,handleDelete:async i=>{await X0(i),o()},handleClearAll:async()=>{await Promise.all((t??[]).map(i=>X0(i.id))),o()}}}var Mj=(0,nL.makeStyles)()({header:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8},resultList:{maxHeight:300,overflow:"auto"}});function eL(e){let t=[e.geneName,e.transcriptName!==e.geneName?e.transcriptName:void 0].filter(r=>!!r);return t.length>0?t.join(" - "):e.geneId??e.transcriptId??"Unknown"}var Qj=(0,rL.observer)(function({model:e,handleClose:t,feature:r}){let{classes:n}=Mj(),o=Ar(e),[i,s]=(0,it.useState)(),a=(0,it.useMemo)(()=>Zs(r),[r]),{results:c,error:l,isLoading:u,handleDelete:d,handleClearAll:A}=Xd(a),f=h=>{let{transcriptId:y}=h,E=y?Hd(r).find(w=>Js(w,y)):void 0;KN({view:o,cached:h,newViewTitle:`BLAST - ${eL(h)}`,connectedFeature:E?.toJSON()}),t()},g=l??i;return g?it.default.createElement(tL.ErrorMessage,{error:g}):u?it.default.createElement(yt.Typography,null,"Loading cached results..."):c.length===0?it.default.createElement(yt.Typography,{color:"textSecondary"},"No cached BLAST results found for this gene. Run a BLAST query to cache results."):it.default.createElement("div",null,it.default.createElement("div",{className:n.header},it.default.createElement(yt.Typography,{variant:"subtitle1"},"Cached BLAST Results (",c.length,")"),it.default.createElement(yt.Button,{size:"small",color:"error",onClick:async()=>{try{s(void 0),await A()}catch(h){s(h)}}},"Clear results for this gene")),it.default.createElement(yt.List,{dense:!0,className:n.resultList},c.map(h=>it.default.createElement(yt.ListItem,{key:h.id,disablePadding:!0,secondaryAction:it.default.createElement(yt.IconButton,{edge:"end",size:"small",onClick:async y=>{y.stopPropagation();try{s(void 0),await d(h.id)}catch(E){s(E)}}},it.default.createElement(qN,{fontSize:"small"}))},it.default.createElement(yt.ListItemButton,{onClick:()=>{f(h)}},it.default.createElement(yt.ListItemText,{primary:`${eL(h)} - ${h.blastDatabase}${h.blastProgram?`/${h.blastProgram}`:""} (${h.msaAlgorithm})`,secondary:`${new Date(h.timestamp).toLocaleString()} - Seq: ${h.proteinSequence.slice(0,30)}...`}))))))}),oL=Qj;var hy=p(_()),lL=p(G());var py="https://blast.ncbi.nlm.nih.gov/Blast.cgi",iL=["clustalo","muscle","kalign","mafft"],sL=["uniprotkb_swissprot","uniprotkb","uniprotkb_reference_proteomes","uniprotkb_trembl"],aL="uniprotkb_swissprot";var gy=p(_()),cL=p(G());function Rj({children:e,...t}){return gy.default.createElement("div",null,gy.default.createElement(cL.TextField,{...t},e))}var st=Rj;function nl({value:e,onChange:t,className:r}){return hy.default.createElement(st,{variant:"outlined",label:"MSA Algorithm",className:r,select:!0,value:e,onChange:n=>{t(n.target.value)}},iL.map(n=>hy.default.createElement(lL.MenuItem,{value:n,key:n},n)))}var yy=p(_()),uL=p($e()),fL=p(G()),dL=p(vt()),_j=(0,dL.makeStyles)()({dialogContent:{width:"80em"}});function Rr({error:e,children:t}){let{classes:r}=_j();return yy.default.createElement(fL.DialogContent,{className:r.dialogContent},e?yy.default.createElement(uL.ErrorMessage,{error:e}):null,t)}var Zd=p(_()),ol=p(G());function Nn({onSubmit:e,onCancel:t,submitDisabled:r,submitLabel:n="Submit",cancelLabel:o="Cancel"}){return Zd.default.createElement(ol.DialogActions,null,Zd.default.createElement(ol.Button,{color:"primary",variant:"contained",disabled:r,onClick:()=>{e()}},n),Zd.default.createElement(ol.Button,{color:"secondary",variant:"contained",onClick:()=>{t()}},o))}var _r=p(_()),ia=p(G()),pL=p(vt());var AL=p(_()),mL=p(vt());var kj=(0,mL.makeStyles)()({textAreaFont:{fontFamily:"Courier New"}});function xy({value:e}){let{classes:t}=kj();return AL.default.createElement(st,{variant:"outlined",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,value:e,slotProps:{input:{readOnly:!0,classes:{input:t.textAreaFont}}}})}var Dj=(0,pL.makeStyles)()({flex:{display:"flex"},minWidth:{minWidth:300},centered:{alignContent:"center",marginLeft:20}});function kr({feature:e,options:t,selectedId:r,selectedTranscript:n,setSelectedId:o,proteinSequence:i,validIds:s}){let{classes:a}=Dj(),[c,l]=(0,_r.useState)(!1);return _r.default.createElement(_r.default.Fragment,null,_r.default.createElement("div",{className:a.flex},_r.default.createElement(ia.TextField,{variant:"outlined",label:`Choose isoform of ${Dn(e)}`,helperText:"the query row, so the alignment stays linked to the genome view",select:!0,className:a.minWidth,value:r,onChange:u=>{o(u.target.value)}},t.map(u=>{let d=s?s.some(g=>Js(u,g)):!0,{len:A,mod:f}=Od(u);return _r.default.createElement(ia.MenuItem,{value:yi(u),key:u.id(),disabled:!d},Ks(u)," (",A," aa)"," ",f?" (possible fragment)":"",s?d?" (has data)":" (no data)":"")})),_r.default.createElement("div",{className:a.centered},_r.default.createElement(ia.Button,{variant:"contained",color:"primary",onClick:()=>{l(!c)}},c?"Hide sequence":"Show sequence"))),c?_r.default.createElement(xy,{value:i?`>${Ks(n)}
|
|
85
85
|
${i}`:"Loading..."}):null)}var tA=p(_());var wL=p(ye());var eA=p(ye());wQ();function gL({cds:e,sequence:t,codonTable:r}){let n=e[0]?.phase??0,o=EQ(e,t),i=n>0?"&":"";for(let s=n;s<o.length;s+=3)i+=r[o.slice(s,s+3)]||"&";return i}var Nj=[{id:1,name:"Standard",ncbieaa:"FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"---M------**--*----M---------------M----------------------------"},{id:2,name:"Vertebrate Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSS**VVVVAAAADDEEGGGG",sncbieaa:"----------**--------------------MMMM----------**---M------------"},{id:3,name:"Yeast Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWTTTTPPPPHHQQRRRRIIMMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**----------------------MM---------------M------------"},{id:4,name:"Mold Mitochondrial; Protozoan Mitochondrial; Coelenterate Mitochondrial; Mycoplasma; Spiroplasma",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--MM------**-------M------------MMMM---------------M------------"},{id:5,name:"Invertebrate Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSSSSVVVVAAAADDEEGGGG",sncbieaa:"---M------**--------------------MMMM---------------M------------"},{id:6,name:"Ciliate Nuclear; Dasycladacean Nuclear; Hexamita Nuclear",ncbieaa:"FFLLSSSSYYQQCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--------------*--------------------M----------------------------"},{id:9,name:"Echinoderm Mitochondrial; Flatworm Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNNKSSSSVVVVAAAADDEEGGGG",sncbieaa:"----------**-----------------------M---------------M------------"},{id:10,name:"Euplotid Nuclear",ncbieaa:"FFLLSSSSYY**CCCWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**-----------------------M----------------------------"},{id:11,name:"Bacterial, Archaeal and Plant Plastid",ncbieaa:"FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"---M------**--*----M------------MMMM---------------M------------"},{id:12,name:"Alternative Yeast Nuclear",ncbieaa:"FFLLSSSSYY**CC*WLLLSPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**--*----M---------------M----------------------------"},{id:13,name:"Ascidian Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSSGGVVVVAAAADDEEGGGG",sncbieaa:"---M------**----------------------MM---------------M------------"},{id:14,name:"Alternative Flatworm Mitochondrial",ncbieaa:"FFLLSSSSYYY*CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNNKSSSSVVVVAAAADDEEGGGG",sncbieaa:"-----------*-----------------------M----------------------------"},{id:15,name:"Blepharisma Macronuclear",ncbieaa:"FFLLSSSSYY*QCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------*---*--------------------M----------------------------"},{id:16,name:"Chlorophycean Mitochondrial",ncbieaa:"FFLLSSSSYY*LCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------*---*--------------------M----------------------------"},{id:21,name:"Trematode Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNNKSSSSVVVVAAAADDEEGGGG",sncbieaa:"----------**-----------------------M---------------M------------"},{id:22,name:"Scenedesmus obliquus Mitochondrial",ncbieaa:"FFLLSS*SYY*LCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"------*---*---*--------------------M----------------------------"},{id:23,name:"Thraustochytrium Mitochondrial",ncbieaa:"FF*LSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--*-------**--*-----------------M--M---------------M------------"},{id:24,name:"Rhabdopleuridae Mitochondrial",ncbieaa:"FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSSKVVVVAAAADDEEGGGG",sncbieaa:"---M------**-------M---------------M---------------M------------"},{id:25,name:"Candidate Division SR1 and Gracilibacteria",ncbieaa:"FFLLSSSSYY**CCGWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"---M------**-----------------------M---------------M------------"},{id:26,name:"Pachysolen tannophilus Nuclear",ncbieaa:"FFLLSSSSYY**CC*WLLLAPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**--*----M---------------M----------------------------"},{id:27,name:"Karyorelict Nuclear",ncbieaa:"FFLLSSSSYYQQCCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--------------*--------------------M----------------------------"},{id:28,name:"Condylostoma Nuclear",ncbieaa:"FFLLSSSSYYQQCCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**--*--------------------M----------------------------"},{id:29,name:"Mesodinium Nuclear",ncbieaa:"FFLLSSSSYYYYCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--------------*--------------------M----------------------------"},{id:30,name:"Peritrich Nuclear",ncbieaa:"FFLLSSSSYYEECC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"--------------*--------------------M----------------------------"},{id:31,name:"Blastocrithidia Nuclear",ncbieaa:"FFLLSSSSYYEECCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"----------**-----------------------M----------------------------"},{id:32,name:"Balanophoraceae Plastid",ncbieaa:"FFLLSSSSYY*WCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG",sncbieaa:"---M------*---*----M------------MMMM---------------M------------"},{id:33,name:"Cephalodiscidae Mitochondrial",ncbieaa:"FFLLSSSSYYY*CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSSKVVVVAAAADDEEGGGG",sncbieaa:"---M-------*-------M---------------M---------------M------------"}],Lj="TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG",Pj="TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG",Fj="TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG",Oj=Array.from({length:64},(e,t)=>Lj[t]+Pj[t]+Fj[t]),hL=new Map(Nj.map(e=>[e.id,e]));function Gj(e){let t={};for(let[r,n]of Object.entries(e)){let o=i=>{let s=r.charAt(i);return[s.toUpperCase(),s.toLowerCase()]};for(let i of o(0))for(let s of o(1))for(let a of o(2))t[i+s+a]=n}return t}function Hj(e){let t=hL.get(e);!t&&e!==1&&console.warn(`Unknown genetic code (transl_table=${e}); using standard code`);let{id:r,name:n,ncbieaa:o,sncbieaa:i}=t??hL.get(1),s={},a=[];for(let[c,l]of Oj.entries())s[l]=o[c],i[c]==="M"&&a.push(l);return{id:r,name:n,codonTable:Gj(s),starts:a}}var yL=new Map;function xL(e=1){let t=yL.get(e);return t||(t=Hj(e),yL.set(e,t)),t}function Cy(e){let t=Array.isArray(e)?e[0]:e,r=Number(t);return Number.isInteger(r)&&r>0?r:void 0}function Uj({cds:e,sequence:t,geneticCodeId:r}){let{codonTable:n}=xL(r);return gL({cds:e,sequence:t,codonTable:n})}function Vj(e,t){return e.map(r=>({...r,start:t-r.end,end:t-r.start})).toSorted((r,n)=>r.start-n.start)}function CL({feature:e,seq:t}){let{subfeatures:r,start:n,strand:o}=e.toJSON(),i=(0,eA.dedupe)(r?.toSorted((c,l)=>c.start-l.start).map(c=>({...c,start:c.start-n,end:c.end-n})).filter(c=>c.type==="CDS")??[],c=>`${c.start}-${c.end}`),s=e.get("subfeatures")?.find(c=>c.get("type")?.toLowerCase()==="cds"),a=Cy(e.get("transl_table"))??Cy(s?.get("transl_table"));return Uj({cds:o===-1?Vj(i,t.length):i,sequence:o===-1?(0,eA.revcom)(t):t,geneticCodeId:a})}var bL=p(Mi());async function EL({start:e,end:t,refName:r,session:n,assemblyName:o}){let{assemblyManager:i,rpcManager:s}=n,a=await i.waitForAssembly(o);if(!a)throw new Error("assembly not found");let c="getSequence";return(await s.call(c,"CoreGetFeatures",{adapterConfig:(0,bL.getConf)(a,["sequence","adapter"]),sessionId:c,regions:[{start:e,end:t,refName:a.getCanonicalRefName(r),assemblyName:o}]}))[0]?.get("seq")??""}function IL({view:e,feature:t}){let r=e?.assemblyNames?.[0],{data:n,error:o}=cn(t&&r?[t.id(),r,"feature-sequence"]:null,async()=>{let{start:i,end:s,refName:a}=t.toJSON();return{seq:await EL({start:i,end:s,refName:a,assemblyName:r,session:(0,wL.getSession)(e)})}});return{proteinSequence:n&&t?CL({seq:n.seq,feature:t}):"",sequence:n,error:o}}function jj(e,t,r){if(!r?.length)return e;let n=s=>r.some(a=>Js(s,a)),o=t.find(s=>yi(s)===e);if(o&&n(o))return e;let i=t.find(n);return i?yi(i):e}function ln({feature:e,view:t,validIds:r}){let n=(0,tA.useMemo)(()=>Hd(e),[e]),[o,i]=(0,tA.useState)(()=>yi(n[0])),s=jj(o,n,r),a=n.find(u=>yi(u)===s),{proteinSequence:c,error:l}=IL({view:t,feature:a});return{options:n,selectedId:s,setSelectedId:i,selectedTranscript:a,proteinSequence:c,error:l,validIds:r}}var $j=(0,vL.makeStyles)()({selectField:{width:150},cachedResultsAccordion:{marginTop:20},infoText:{marginTop:20}}),Yj=(0,SL.observer)(function({handleClose:e,feature:t,model:r,children:n}){let{classes:o}=$j(),i=Ar(r),[s,a]=(0,Fe.useState)(),[c,l]=(0,Fe.useState)(aL),[u,d]=(0,Fe.useState)("clustalo"),A=(0,Fe.useMemo)(()=>Zs(t),[t]),{results:f,error:g}=Xd(A),h=ln({feature:t,view:i}),{selectedTranscript:y,proteinSequence:E}=h,w=h.error??s??g;return Fe.default.createElement(Fe.default.Fragment,null,Fe.default.createElement(Rr,{error:w},n,Fe.default.createElement(st,{variant:"outlined",label:"BLAST database",className:o.selectField,select:!0,value:c,onChange:I=>{l(I.target.value)}},sL.map(I=>Fe.default.createElement(Dr.MenuItem,{value:I,key:I},I))),Fe.default.createElement(nl,{className:o.selectField,value:u,onChange:d}),Fe.default.createElement(kr,{feature:t,...h}),Fe.default.createElement(Dr.Typography,{className:o.infoText},"This panel will automatically submit a blastp query to EBI, which searches UniProtKB. Searches usually finish in under a minute, and swissprot returns curated sequences that align more cleanly than the many near-identical entries a TrEMBL search brings back. After completion, all the hits will be run through a multiple sequence alignment. Searching NCBI's nr needs the manual approach: NCBI no longer lets a browser read responses from Blast.cgi."),f.length>0?Fe.default.createElement(Dr.Accordion,{className:o.cachedResultsAccordion},Fe.default.createElement(Dr.AccordionSummary,{expandIcon:Fe.default.createElement(yd,null)},Fe.default.createElement(Dr.Typography,null,"Previous BLAST Results")),Fe.default.createElement(Dr.AccordionDetails,null,Fe.default.createElement(oL,{model:r,handleClose:e,feature:t}))):null),Fe.default.createElement(Nn,{submitDisabled:!E,onSubmit:()=>{try{y&&(a(void 0),JN({feature:y,view:i,newViewTitle:MD(t,y),blastParams:{blastDatabase:c,msaAlgorithm:u,selectedTranscript:y,proteinSequence:E}}),e())}catch(I){console.error(I),a(I)}},onCancel:e}))}),BL=Yj;var un=p(_()),_L=p(ye()),sa=p(G()),kL=p(Y()),DL=p(vt());Ey();var Wj=(0,DL.makeStyles)()({ncbiLink:{wordBreak:"break-all",margin:30,maxWidth:600},infoText:{marginTop:20}}),zj=(0,kL.observer)(function({handleClose:e,feature:t,model:r,children:n}){let{classes:o}=Wj(),i=Ar(r),s=ln({feature:t,view:i}),{proteinSequence:a,error:c}=s,l=Xs(a),u=`${py}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${l}`,d=`${py}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${(0,_L.shorten2)(l,10)}`;return un.default.createElement(un.default.Fragment,null,un.default.createElement(Rr,{error:c},n,un.default.createElement(kr,{feature:t,...s}),a?un.default.createElement("div",{className:o.ncbiLink},"Link to NCBI BLAST: ",un.default.createElement(il,{href:u},d)):null,un.default.createElement(sa.Typography,{className:o.infoText},`Click the link above and run your BLAST query, and once you have results, click "Multiple Alignment" at the top of the results page to be redirected to COBALT, NCBI's multiple sequence aligner. Once COBALT completes, you can download an MSA (.aln file) and optionally a Newick tree (.nh) and paste the results into JBrowse`)),un.default.createElement(sa.DialogActions,null,un.default.createElement(sa.Button,{color:"primary",variant:"contained",onClick:()=>{e()}},"Close")))}),NL=zj;var bi=p(_()),fn=p(G());function wy({lookupMethod:e,setLookupMethod:t}){return bi.default.createElement(fn.FormControl,{component:"fieldset"},bi.default.createElement(fn.RadioGroup,{row:!0,value:e,onChange:r=>{t(r.target.value)}},bi.default.createElement(fn.FormControlLabel,{value:"automatic",control:bi.default.createElement(fn.Radio,null),label:"Automatic"}),bi.default.createElement(fn.FormControlLabel,{value:"manual",control:bi.default.createElement(fn.Radio,null),label:"Manual"})))}var pr=p(_()),Ft=p(G()),LL=p(vt());Xc();var qj=(0,LL.makeStyles)()({field:{minWidth:300},help:{marginBottom:8}});function Iy({handleClose:e,ebiEmail:t}){let{classes:r}=qj(),[n,o]=(0,pr.useState)(t);return pr.default.createElement(Ft.Dialog,{open:!0,maxWidth:"lg",onClose:()=>{e()}},pr.default.createElement(Ft.DialogTitle,null,"BLAST Settings"),pr.default.createElement(Ft.DialogContent,null,pr.default.createElement(Ft.Typography,{variant:"subtitle2",className:r.help},"Searches run at EBI, which asks for a contact address on every job so they can reach whoever is generating the load. If your site sends real volume, use your own."),pr.default.createElement(st,{autoFocus:!0,margin:"dense",label:"EBI contact email",fullWidth:!0,variant:"outlined",value:n,className:r.field,onChange:i=>{o(i.target.value)}}),pr.default.createElement(Ft.Button,{variant:"contained",onClick:()=>{o(ea)}},"Reset")),pr.default.createElement(Ft.DialogActions,null,pr.default.createElement(Ft.Button,{variant:"contained",color:"secondary",onClick:()=>{e()}},"Cancel"),pr.default.createElement(Ft.Button,{color:"primary",variant:"contained",onClick:()=>{e({ebiEmail:n})}},"Save")))}Xc();ey();var Jj=(0,FL.makeStyles)()({settingsButton:{float:"right"}}),Kj={automatic:BL,manual:NL};function Sy({handleClose:e,model:t,feature:r}){let[n,o]=(0,Nr.useState)("automatic"),[i,s]=PD(ry,ea),[a,c]=(0,Nr.useState)(!1),{classes:l}=Jj(),u=Kj[n];return Nr.default.createElement(Nr.default.Fragment,null,Nr.default.createElement(PL.IconButton,{className:l.settingsButton,size:"small",onClick:()=>{c(!0)}},Nr.default.createElement(WN,null)),Nr.default.createElement(u,{model:t,feature:r,handleClose:e},Nr.default.createElement(wy,{lookupMethod:n,setLookupMethod:o})),a?Nr.default.createElement(Iy,{ebiEmail:i,handleClose:d=>{d&&s(d.ebiEmail),c(!1)}}):null)}var ce=p(_()),vy=p($e()),gr=p(G()),HL=p(Y()),UL=p(vt());var OL=p(ye());function GL({newViewTitle:e,view:t,feature:r,msaFilehandle:n,treeFilehandle:o,querySeqName:i,data:s}){(0,OL.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,connectedFeature:r.toJSON(),msaFilehandle:n,treeFilehandle:o,querySeqName:i,data:s})}var Xj=(0,UL.makeStyles)()({textAreaFont:{fontFamily:"Courier New"},inputContainer:{marginBottom:30},fileContainer:{maxWidth:500},msaInput:{marginBottom:20},queryNameInput:{marginTop:20},warningAlert:{marginTop:10}}),Zj=(0,HL.observer)(function({model:t,feature:r,handleClose:n}){let o=Ar(t),{classes:i}=Xj(),[s,a]=(0,ce.useState)(),[c,l]=(0,ce.useState)("file"),[u,d]=(0,ce.useState)(""),[A,f]=(0,ce.useState)(""),[g,h]=(0,ce.useState)(),[y,E]=(0,ce.useState)(),[w,I]=(0,ce.useState)(""),b=ln({feature:r,view:o}),{selectedTranscript:S,error:v}=b;return ce.default.createElement(ce.default.Fragment,null,ce.default.createElement(Rr,{error:s??v},ce.default.createElement(gr.FormControl,{component:"fieldset"},ce.default.createElement(gr.RadioGroup,{row:!0,value:c,onChange:R=>{l(R.target.value)}},ce.default.createElement(gr.FormControlLabel,{value:"file",control:ce.default.createElement(gr.Radio,null),label:"Open files"}),ce.default.createElement(gr.FormControlLabel,{value:"text",control:ce.default.createElement(gr.Radio,null),label:"Paste text"}))),ce.default.createElement("div",{className:i.inputContainer},c==="file"?ce.default.createElement("div",{className:i.fileContainer},ce.default.createElement(vy.FileSelector,{name:"MSA File .aln (Clustal), .fa/.mfa (aligned FASTA), .stock (Stockholm), etc)",inline:!0,location:g,setLocation:h}),ce.default.createElement(vy.FileSelector,{name:"Tree file .nh (Newick) or .asn (NCBI COBALT ASN.1)",inline:!0,location:y,setLocation:E})):ce.default.createElement(ce.default.Fragment,null,ce.default.createElement(st,{variant:"outlined",name:"MSA",multiline:!0,minRows:5,className:i.msaInput,maxRows:10,fullWidth:!0,placeholder:"Paste MSA here",value:u,onChange:R=>{d(R.target.value)}}),ce.default.createElement(st,{variant:"outlined",name:"Tree",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,placeholder:"Paste newick tree (optional)",value:A,onChange:R=>{f(R.target.value)}}))),ce.default.createElement(kr,{feature:r,...b}),ce.default.createElement(st,{variant:"outlined",name:"MSA row name",fullWidth:!0,required:!0,className:i.queryNameInput,placeholder:"Row name in MSA that corresponds to the selected transcript",helperText:"Required: Specify the name of the row in your MSA that should be aligned with the selected transcript",value:w,onChange:R=>{I(R.target.value)}}),w.trim()?null:ce.default.createElement(gr.Alert,{severity:"warning",className:i.warningAlert},"Without specifying the MSA row name, clicking on the MSA will not navigate to the corresponding genome position, and hovering highlights will not work.")),ce.default.createElement(Nn,{submitDisabled:!S||c==="file"&&!g||c==="text"&&!u.trim(),onSubmit:()=>{try{S&&(a(void 0),GL({newViewTitle:Dn(S),view:o,feature:S,querySeqName:w.trim(),...c==="file"?{msaFilehandle:g,treeFilehandle:y}:{data:{msa:u,tree:A}}}),n())}catch(R){console.error(R),a(R)}},onCancel:n}))}),VL=Zj;var at=p(_()),zL=p(G()),qL=p(Y()),JL=p(vt());var rA=p(_());Ci();var e7="https://eutils.ncbi.nlm.nih.gov/entrez/eutils";function By(e,t){let r=new URLSearchParams({...t,retmode:"json",tool:ta,email:ra});return`${e7}/${e}?${r.toString()}`}async function jL(e){let t=e.trim();if(!t)return;if(/^\d+$/.test(t))return Number(t);let n=(await xo(By("esearch.fcgi",{db:"taxonomy",term:t,retmax:"1"}))).esearchresult?.idlist?.[0];return n?Number(n):void 0}async function $L(e){let t=e.trim();if(!t)return;let n=(await xo(By("esearch.fcgi",{db:"assembly",term:t,retmax:"1"}))).esearchresult?.idlist?.[0];if(!n)return;let i=(await xo(By("esummary.fcgi",{db:"assembly",id:n}))).result?.[n],s=Number(i?.speciestaxid);return i?.speciesname&&s?{taxId:s,speciesName:i.speciesname}:void 0}async function t7(e){let t=await jL(e);if(!t)throw new Error(`No NCBI taxon matches "${e}"`);let r=(await na([t])).get(t),n=[r?.sciname,r?.commonName&&`(${r.commonName})`].filter(Boolean).join(" ");return{taxId:t,label:n||`taxon ${t}`}}function Ty({value:e,assemblyName:t,onChange:r,className:n}){let[o,i]=(0,rA.useState)(),s=ZN(o,400),{data:a}=cn(t&&o===void 0?[t,"assembly-species"]:null,()=>$L(t),{onSuccess:A=>{A&&r(A.taxId)}}),{data:c,error:l}=cn(s?.trim()?[s.trim(),"taxon"]:null,()=>t7(s),{onSuccess:({taxId:A})=>{r(A)}}),u=o??a?.speciesName??"human",d=o===void 0?a?.speciesName:c?.label;return rA.default.createElement(st,{variant:"outlined",label:"Query species",className:n,value:u,onChange:A=>{i(A.target.value)},error:!!l,helperText:l?`${l}`:d??`the species this gene is from (taxon ${e})`})}var YL=p(ye());function WL({newViewTitle:e,view:t,feature:r,orthologParams:n}){(0,YL.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,connectedFeature:r.toJSON(),drawNodeBubbles:!0,colWidth:10,rowHeight:12,orthologParams:n})}var r7=(0,JL.makeStyles)()({selectField:{width:180}}),n7=(0,qL.observer)(function({handleClose:e,feature:t,model:r}){let{classes:n}=r7(),o=Ar(r),[i,s]=(0,at.useState)(),[a,c]=(0,at.useState)(9606),[l,u]=(0,at.useState)("clustalo"),[d,A]=(0,at.useState)(String(oy)),f=(0,at.useMemo)(()=>Zs(t),[t]),g=ln({feature:t,view:o}),{selectedTranscript:h,proteinSequence:y}=g,E=g.error??i,w=Number(d),I=Number.isInteger(w)&&w>=2;return at.default.createElement(at.default.Fragment,null,at.default.createElement(Rr,{error:E},at.default.createElement(zL.Typography,{variant:"body2"},"NCBI's precomputed orthologs, one gene per species, looked up rather than searched for. No BLAST job to queue."),at.default.createElement("div",null,at.default.createElement(Ty,{className:n.selectField,value:a,assemblyName:o.assemblyNames[0],onChange:c}),at.default.createElement(nl,{className:n.selectField,value:l,onChange:u}),at.default.createElement(st,{variant:"outlined",label:"Rows to align",className:n.selectField,type:"number",value:d,onChange:b=>{A(b.target.value)},error:!I,helperText:"the closest N species NCBI has"})),at.default.createElement(kr,{feature:t,...g})),at.default.createElement(Nn,{submitDisabled:!y||!I,onSubmit:()=>{try{h&&(s(void 0),WL({feature:h,view:o,newViewTitle:`Orthologs - ${Dn(t)} - ${Ks(h)}`,orthologParams:{taxId:a,maxSpecies:w,geneCandidates:f,msaAlgorithm:l,selectedTranscript:h,proteinSequence:y}}),e())}catch(b){console.error(b),s(b)}},onCancel:e}))}),KL=n7;var xt=p(_()),sl=p($e()),oA=p(ye()),sP=p(G()),aP=p(Y()),cP=p(vt());Xn();function My(e,t="",r=5e3){let n=[e];for(;n.length;){let o=n.pop();for(let[i,s]of Object.entries(o)){if(t.length>r)return Ah(t);typeof s=="object"&&s!==null?n.push(s):i==="locationType"&&s==="FileHandleLocation"?t+=`${i}-BlobLocation`:i==="handleId"?t+=`blobId-fh-blob-${s}`:t+=`${i}-${s}`}}return`adp-${Ah(t)}`}function XL(e={}){return e.type&&e.adapterId?`${e.type}-${e.adapterId}`:`${My(e)}`}var ZL={};async function o7(e,t,r){let n=r?.type;if(!n)throw new Error(`could not determine adapter type from adapter config snapshot ${JSON.stringify(r)}`);let o=e.getAdapterType(n);if(!o)throw new Error(`unknown data adapter type ${n}`);let i=o.configSchema.create(r,{pluginManager:e}),s=Qy.bind(null,e,t),a=await o.getAdapterClass();return{dataAdapter:new a(i,s,e),sessionIds:new Set([t])}}async function Qy(e,t,r){let n=XL(r);ZL[n]??=o7(e,t,r);let o=await ZL[n];return o.sessionIds.add(t),o}async function eP(e,t){return(await Qy(e,"msa",t)).dataAdapter}async function tP({config:e,pluginManager:t}){return(await eP(t,e)).getMSAList()}async function rP({config:e,pluginManager:t,msaId:r}){return(await eP(t,e)).getMSA(r)}var nP=p(ye());function oP({newViewTitle:e,view:t,feature:r,data:n,querySeqName:o}){(0,nP.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,treeAreaWidth:200,querySeqName:o,treeWidth:100,drawNodeBubbles:!1,labelsAlignRight:!0,showBranchLen:!1,colWidth:10,rowHeight:12,colorSchemeName:"percent_identity_dynamic",data:n,connectedViewId:t.id,connectedFeature:r.toJSON()})}var iP=p(Mi());function nA(e){return(0,iP.readConfObject)(e,["msa","datasets"])}var i7=(0,cP.makeStyles)()({selectedContainer:{marginTop:50}}),s7=(0,aP.observer)(function({model:e,feature:t,handleClose:r}){let n=(0,oA.getSession)(e),o=Ar(e),{classes:i}=i7(),{pluginManager:s}=(0,oA.getEnv)(e),{assemblyNames:a}=o,[c,l]=(0,xt.useState)(),u=nA(n.jbrowse),[d,A]=(0,xt.useState)(u?.[0]?.datasetId),f=u?.find(R=>R.datasetId===d),{data:g,isLoading:h,error:y}=cn(f?`${f.datasetId}-msa-list`:null,()=>tP({config:f.adapter,pluginManager:s})),E=ln({feature:t,view:o,validIds:g}),{selectedId:w,selectedTranscript:I}=E,{data:b,isLoading:S,error:v}=cn(w&&f&&g?`${f.datasetId}-${w}-msa`:null,()=>rP({msaId:w,config:f.adapter,pluginManager:s})),B=y??v??E.error??c;return xt.default.createElement(xt.default.Fragment,null,xt.default.createElement(Rr,{error:B},xt.default.createElement(st,{select:!0,label:"Select MSA dataset",value:d,onChange:R=>{A(R.target.value)}},u?.map(R=>xt.default.createElement(sP.MenuItem,{key:R.datasetId,value:R.datasetId},R.name))),f?xt.default.createElement("div",{className:i.selectedContainer},!h&&S?xt.default.createElement(sl.LoadingEllipses,{variant:"h6",message:`Loading MSA for (${w})`}):null,h?xt.default.createElement(sl.LoadingEllipses,{variant:"h6",message:`Loading available MSAs for (${f.name})`}):null,g?xt.default.createElement("div",null,xt.default.createElement(sl.SanitizedHTML,{html:f.description}),xt.default.createElement(kr,{feature:t,...E})):null):null),xt.default.createElement(Nn,{submitDisabled:!I||!b?.length,onSubmit:()=>{try{if(I&&b){let R=`${w}_${a[0]}`;oP({newViewTitle:Dn(I),view:o,querySeqName:R,feature:I,data:{msa:b.map(L=>`>${L.get("refName")}
|
|
86
86
|
${L.get("seq")}`).join(`
|
|
87
|
-
`)}}),r()}}catch(R){l(R)}},onCancel:r}))}),lP=s7;var uP=p(_());function aa({children:e,value:t,index:r,...n}){return uP.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r?e:null)}function Ry({handleClose:e,feature:t,model:r}){let n=(0,dP.getSession)(r),i=!!nA(n.jbrowse)?.length,[s,a]=(0,dt.useState)("orthologs");return dt.default.createElement(fP.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},dt.default.createElement(Ei.Tabs,{value:s,onChange:(c,l)=>{a(l)}},dt.default.createElement(Ei.Tab,{label:"Orthologs (fast)",value:"orthologs"}),dt.default.createElement(Ei.Tab,{label:"BLAST query",value:"ncbi_blast"}),i?dt.default.createElement(Ei.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,dt.default.createElement(Ei.Tab,{label:"Manual upload",value:"manual_msa"})),dt.default.createElement(aa,{value:s,index:"orthologs"},dt.default.createElement(KL,{handleClose:e,feature:t,model:r})),dt.default.createElement(aa,{value:s,index:"ncbi_blast"},dt.default.createElement(Sy,{handleClose:e,feature:t,model:r})),i?dt.default.createElement(aa,{value:s,index:"preloaded_msa"},dt.default.createElement(lP,{model:r,feature:t,handleClose:e})):null,dt.default.createElement(aa,{value:s,index:"manual_msa"},dt.default.createElement(VL,{model:r,feature:t,handleClose:e})))}function AP(e){let t=String(e??"").toLowerCase();return t.includes("gene")||t.includes("rna")||t.includes("transcript")}function mP(e){let t=e.contextMenuInfo,r=e.fetchFullFeature;if(t&&r)return AP(t.item.type)?()=>r(t.item.featureId,t.displayedRegionIndex):void 0;let n=e.contextMenuFeature;return n&&AP(n.get("type"))?()=>Promise.resolve(n):void 0}function a7(e){return e.name==="LinearBasicDisplay"}function c7(e,t){let r=(0,iA.getContainingTrack)(e),n=(0,iA.getSession)(r);t().then(o=>{o?n.queueDialog(i=>[Ry,{model:r,handleClose:i,feature:o}]):n.notify("Could not load feature for MSA view","warning")}).catch(o=>{n.notifyError(`${o}`,o)})}function l7(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=mP(t);return[...r.call(t),...n?[{label:"Launch MSA view",icon:$N,onClick:()=>{c7(t,n)}}]:[]]}}})}function _y(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(a7(t)&&(t.stateModel=l7(t.stateModel)),t))}function ky(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,data:n,msaFileLocation:o,msaIndexedLocation:i,msaName:s,treeFileLocation:a,querySeqName:c,...l}=t;if(!n&&!o&&!i&&!l.orthologParams)throw new Error("No MSA data, file location or orthologParams provided when launching MSA view");return r.addView("MsaView",{type:"MsaView",...l,data:n,...a?{treeFilehandle:{...a,locationType:"UriLocation"}}:{},init:{msaUrl:o?.uri,msaIndexedLocation:i,msaName:s,querySeqName:c}}),t})}var QP=p(_()),RP=p(gP());var g7=(0,QP.lazy)(()=>Promise.resolve().then(()=>(MP(),TP)));function Py(e){e.addViewType(()=>new RP.default({name:"MsaView",stateModel:ay(),ReactComponent:g7}))}var _P="2.10.
|
|
87
|
+
`)}}),r()}}catch(R){l(R)}},onCancel:r}))}),lP=s7;var uP=p(_());function aa({children:e,value:t,index:r,...n}){return uP.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r?e:null)}function Ry({handleClose:e,feature:t,model:r}){let n=(0,dP.getSession)(r),i=!!nA(n.jbrowse)?.length,[s,a]=(0,dt.useState)("orthologs");return dt.default.createElement(fP.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},dt.default.createElement(Ei.Tabs,{value:s,onChange:(c,l)=>{a(l)}},dt.default.createElement(Ei.Tab,{label:"Orthologs (fast)",value:"orthologs"}),dt.default.createElement(Ei.Tab,{label:"BLAST query",value:"ncbi_blast"}),i?dt.default.createElement(Ei.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,dt.default.createElement(Ei.Tab,{label:"Manual upload",value:"manual_msa"})),dt.default.createElement(aa,{value:s,index:"orthologs"},dt.default.createElement(KL,{handleClose:e,feature:t,model:r})),dt.default.createElement(aa,{value:s,index:"ncbi_blast"},dt.default.createElement(Sy,{handleClose:e,feature:t,model:r})),i?dt.default.createElement(aa,{value:s,index:"preloaded_msa"},dt.default.createElement(lP,{model:r,feature:t,handleClose:e})):null,dt.default.createElement(aa,{value:s,index:"manual_msa"},dt.default.createElement(VL,{model:r,feature:t,handleClose:e})))}function AP(e){let t=String(e??"").toLowerCase();return t.includes("gene")||t.includes("rna")||t.includes("transcript")}function mP(e){let t=e.contextMenuInfo,r=e.fetchFullFeature;if(t&&r)return AP(t.item.type)?()=>r(t.item.featureId,t.displayedRegionIndex):void 0;let n=e.contextMenuFeature;return n&&AP(n.get("type"))?()=>Promise.resolve(n):void 0}function a7(e){return e.name==="LinearBasicDisplay"}function c7(e,t){let r=(0,iA.getContainingTrack)(e),n=(0,iA.getSession)(r);t().then(o=>{o?n.queueDialog(i=>[Ry,{model:r,handleClose:i,feature:o}]):n.notify("Could not load feature for MSA view","warning")}).catch(o=>{n.notifyError(`${o}`,o)})}function l7(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=mP(t);return[...r.call(t),...n?[{label:"Launch MSA view",icon:$N,onClick:()=>{c7(t,n)}}]:[]]}}})}function _y(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(a7(t)&&(t.stateModel=l7(t.stateModel)),t))}function ky(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,data:n,msaFileLocation:o,msaIndexedLocation:i,msaName:s,treeFileLocation:a,querySeqName:c,...l}=t;if(!n&&!o&&!i&&!l.orthologParams)throw new Error("No MSA data, file location or orthologParams provided when launching MSA view");return r.addView("MsaView",{type:"MsaView",...l,data:n,...a?{treeFilehandle:{...a,locationType:"UriLocation"}}:{},init:{msaUrl:o?.uri,msaIndexedLocation:i,msaName:s,querySeqName:c}}),t})}var QP=p(_()),RP=p(gP());var g7=(0,QP.lazy)(()=>Promise.resolve().then(()=>(MP(),TP)));function Py(e){e.addViewType(()=>new RP.default({name:"MsaView",stateModel:ay(),ReactComponent:g7}))}var _P="2.10.2";var cA=class extends kP.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=_P;this.rootConfigurationSchema=r=>({msa:(0,Fy.ConfigurationSchema)("MSA",{datasets:Oy.types.maybe(Oy.types.array((0,Fy.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Py(r),_y(r),ky(r),fy(r),Ay(r)}configure(r){(0,DP.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:rw,onClick:n=>{n.addView("MsaView",{})}})}};return iF(h7);})();
|
|
88
88
|
/*! Bundled license information:
|
|
89
89
|
|
|
90
90
|
react-is/cjs/react-is.production.js:
|