jbrowse-plugin-msaview 2.6.5 → 2.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AddHighlightModel/MsaToGenomeHighlight.js +9 -4
- package/dist/MsaViewPanel/model.d.ts +13 -0
- package/dist/MsaViewPanel/model.js +24 -9
- package/dist/jbrowse-plugin-msaview.umd.production.min.js +2 -2
- package/dist/jbrowse-plugin-msaview.umd.production.min.js.map +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/AddHighlightModel/MsaToGenomeHighlight.tsx +13 -4
- package/src/MsaViewPanel/model.ts +26 -9
- package/src/version.ts +1 -1
|
@@ -8,10 +8,15 @@ const MsaToGenomeHighlight = observer(function MsaToGenomeHighlight2({ model, })
|
|
|
8
8
|
const msaView = views
|
|
9
9
|
.filter(isMsaView)
|
|
10
10
|
.find(v => v.connectedViewId === model.id);
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
11
|
+
// The persistent click selection always shows. The hover codon is suppressed
|
|
12
|
+
// while hovering the LGV — GenomeMouseoverHighlight handles the single-bp
|
|
13
|
+
// display in that case, so we don't stack a wider codon band on top of it.
|
|
14
|
+
const clickHighlight = msaView?.connectedClickHighlight;
|
|
15
|
+
const hoverHighlight = hasHoverPosition(hovered)
|
|
16
|
+
? undefined
|
|
17
|
+
: msaView?.connectedHoverHighlight;
|
|
18
|
+
const highlights = [clickHighlight, hoverHighlight].filter((r) => r !== undefined);
|
|
19
|
+
return highlights.length ? (React.createElement(MsaToGenomeHighlightRenderer, { model: model, highlights: highlights })) : null;
|
|
15
20
|
});
|
|
16
21
|
// Inner component: handles the scroll-dependent rendering
|
|
17
22
|
const MsaToGenomeHighlightRenderer = observer(function ({ model, highlights, }) {
|
|
@@ -526,6 +526,19 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
526
526
|
*/
|
|
527
527
|
readonly connectedView: MaybeLGV;
|
|
528
528
|
} & {
|
|
529
|
+
/**
|
|
530
|
+
* #getter
|
|
531
|
+
* Genome region under the current MSA hover column. Suppressed on the LGV
|
|
532
|
+
* while it's being hovered (GenomeMouseoverHighlight shows the crisp 1bp
|
|
533
|
+
* marker there instead of this wider codon band).
|
|
534
|
+
*/
|
|
535
|
+
readonly connectedHoverHighlight: IRegion | undefined;
|
|
536
|
+
/**
|
|
537
|
+
* #getter
|
|
538
|
+
* Genome region under the persistent MSA click selection. Shown
|
|
539
|
+
* regardless of LGV hover, so hovering the genome doesn't hide it.
|
|
540
|
+
*/
|
|
541
|
+
readonly connectedClickHighlight: IRegion | undefined;
|
|
529
542
|
/**
|
|
530
543
|
* #getter
|
|
531
544
|
*/
|
|
@@ -111,19 +111,34 @@ export default function stateModelFactory() {
|
|
|
111
111
|
},
|
|
112
112
|
}))
|
|
113
113
|
.views(self => ({
|
|
114
|
+
/**
|
|
115
|
+
* #getter
|
|
116
|
+
* Genome region under the current MSA hover column. Suppressed on the LGV
|
|
117
|
+
* while it's being hovered (GenomeMouseoverHighlight shows the crisp 1bp
|
|
118
|
+
* marker there instead of this wider codon band).
|
|
119
|
+
*/
|
|
120
|
+
get connectedHoverHighlight() {
|
|
121
|
+
const { mouseCol } = self;
|
|
122
|
+
return mouseCol === undefined
|
|
123
|
+
? undefined
|
|
124
|
+
: msaCoordToGenomeCoord({ model: self, coord: mouseCol });
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* #getter
|
|
128
|
+
* Genome region under the persistent MSA click selection. Shown
|
|
129
|
+
* regardless of LGV hover, so hovering the genome doesn't hide it.
|
|
130
|
+
*/
|
|
131
|
+
get connectedClickHighlight() {
|
|
132
|
+
const { mouseClickCol } = self;
|
|
133
|
+
return mouseClickCol === undefined
|
|
134
|
+
? undefined
|
|
135
|
+
: msaCoordToGenomeCoord({ model: self, coord: mouseClickCol });
|
|
136
|
+
},
|
|
114
137
|
/**
|
|
115
138
|
* #getter
|
|
116
139
|
*/
|
|
117
140
|
get connectedHighlights() {
|
|
118
|
-
|
|
119
|
-
return [
|
|
120
|
-
mouseCol === undefined
|
|
121
|
-
? undefined
|
|
122
|
-
: msaCoordToGenomeCoord({ model: self, coord: mouseCol }),
|
|
123
|
-
mouseClickCol === undefined
|
|
124
|
-
? undefined
|
|
125
|
-
: msaCoordToGenomeCoord({ model: self, coord: mouseClickCol }),
|
|
126
|
-
].filter((r) => r !== undefined);
|
|
141
|
+
return [this.connectedHoverHighlight, this.connectedClickHighlight].filter((r) => r !== undefined);
|
|
127
142
|
},
|
|
128
143
|
}))
|
|
129
144
|
.actions(self => ({
|
|
@@ -70,10 +70,10 @@ sp|P13786|HBAZ_CAPHI DAHAAWDKFLSIVSGVLTEKYR 142
|
|
|
70
70
|
${y}`}),C=await KQ({algorithm:o,sequence:[`>QUERY
|
|
71
71
|
${c}`,...p].join(`
|
|
72
72
|
`),onProgress:x=>{e.setProgress(x)}}),I=JSON.stringify(d);return await qQ({proteinSequence:c,blastDatabase:r,blastProgram:n,msaAlgorithm:o,msa:C.msa,tree:C.tree,treeMetadata:I,rid:A,geneId:a?.get("parentId"),transcriptId:a?.id(),transcriptName:a?.get("name")??a?.get("id"),geneName:a?.get("gene_name")??a?.get("parentId")}),{...C,treeMetadata:I}}function t5(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}ed();var nv=f(Rm());async function ov({location:e,name:t}){let r=i=>(0,nv.openLocation)({uri:i,locationType:"UriLocation"}),n=await r(`${e.uri}.idx`).readFile("utf8"),o=r5(n,t);if(o){let a=await new bi({filehandle:r(e.uri),gziFilehandle:r(`${e.uri}.gzi`)}).read(o.length,o.offset);return new TextDecoder().decode(a).trim()}}var rv=e=>e.replace(/\.\d+$/,"");function r5(e,t){let r=rv(t);for(let n of e.split(`
|
|
73
|
-
`)){let[o,i,a]=n.split(" ");if(o&&rv(o)===r)return{offset:Number(i),length:Number(a)}}}var iv=f(xe());function av({model:e}){let{hovered:t}=(0,iv.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Kn(t))return;let{coord:a,refName:s}=t.hoverPosition;if(i)return s!==i.refName||!o.assemblyNames.includes(i.assemblyName)||a<i.start||a>=i.end?void 0:e.seqPosToVisibleCol(r,a-i.start);if(n){let c=n.g2p[a];if(c!==void 0)return e.seqPosToVisibleCol(r,c)}}Mi();var n5="jbrowse-msaview-domain-cache",fA="domains",o5=1;async function sv(){return an(n5,o5,{upgrade(e){e.objectStoreNames.contains(fA)||e.createObjectStore(fA,{keyPath:"accession"})}})}async function cv(e){let r=(await sv()).transaction(fA,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n}async function lv(e){let r=(await sv()).transaction(fA,"readwrite");for(let n of e)await r.store.put(n);await r.done}function Jn(e,t){return new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(e)?.[1]}function i5(e){let t={},r=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=r.exec(e))!==null;){let o=Jn(n[1],"GBQualifier_name"),i=Jn(n[1],"GBQualifier_value");o&&i!==void 0&&t[o]===void 0&&(t[o]=i)}return t}function a5(e){let t=[],r=[],n=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,o;for(;(o=n.exec(e))!==null;){let i=o[1],a=Jn(i,"GBInterval_from"),s=Jn(i,"GBInterval_to"),c=Jn(i,"GBInterval_point");a&&s?(t.push(Number(a)),r.push(Number(s))):c&&(t.push(Number(c)),r.push(Number(c)))}return t.length>0?{start:Math.min(...t),end:Math.max(...r)}:void 0}var s5=2;function c5(e){let t=Jn(e,"GBFeature_key"),r=i5(e),n=r.db_xref,o=a5(e);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&o&&o.end-o.start+1>=s5){let i=n.replace("CDD:",""),a=t==="Region",s=r.note?.split(/[[(]/)[0]?.trim(),c=a?r.region_name??i:s||r.site_type||"site",l=a?i:`${i}:${c}`;return{signature:{entry:{name:c,description:r.note??c,accession:l}},locations:[o]}}}function l5(e){let t=new Map,r=/<GBSeq>([\s\S]*?)<\/GBSeq>/g,n;for(;(n=r.exec(e))!==null;){let o=n[1],i=[],a=/<GBFeature>([\s\S]*?)<\/GBFeature>/g,s;for(;(s=a.exec(o))!==null;){let c=c5(s[1]);c&&i.push(c)}for(let c of[Jn(o,"GBSeq_accession-version"),Jn(o,"GBSeq_primary-accession")])c&&t.set(c,i)}return t}async function Av(e){let t=[...new Set(e)].filter(Boolean),r=new Map,n=await cv(t),o=[];t.forEach((s,c)=>{let l=n[c];l?r.set(s,l.matches):o.push(s)});let i=[],a=100;for(let s=0;s<o.length;s+=a){let c=o.slice(s,s+a),l=await qr(uA({db:"protein",id:c.join(","),rettype:"gp",retmode:"xml"})),A=l5(l);for(let u of c){let m=A.get(u)??[];r.set(u,m),i.push({accession:u,matches:m})}}return i.length>0&&await lv(i),r}async function uv(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(([a,s])=>({rowName:a,accession:s.Accession})).filter(a=>!!a.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 Av(n.map(a=>a.accession)),i={};for(let{rowName:a,accession:s}of n){let c=o.get(s);c&&c.length>0&&(i[a]={matches:c,xref:[{id:a}]})}if(Object.keys(i).length===0)throw new Error("No CDD domain annotations found for these proteins");e.setDomains(i)}Mi();var A5="jbrowse-msaview-data",u5=1,Cs="msa-data";async function Km(){return an(A5,u5,{upgrade(e){e.objectStoreNames.contains(Cs)||e.createObjectStore(Cs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function fv(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function dv(e,t){try{let r=await Km(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(Cs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function mv(e){try{let r=await(await Km()).get(Cs,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 pv(e=10080*60*1e3){try{let t=await Km(),r=Date.now()-e,i=await t.transaction(Cs,"readwrite").store.index("timestamp").openCursor(IDBKeyRange.upperBound(r)),a=0;for(;i;)await i.delete(),a++,i=await i.continue();return a}catch(t){return console.warn("Failed to cleanup old MSA data:",t),0}}function f5(e){let t=e;return t.type==="ProteinView"&&Array.isArray(t.structures)}function gv(e){return e.filter(f5)}function hv(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 Ev(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await mv(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 xv(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 a=fv();await dv(a,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(a)}catch(a){console.error("Failed to store MSA data to IndexedDB:",a)}finally{e.setIsStoringData(!1)}})())}}function Iv(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await tv({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function yv(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 uv(e)}catch(i){console.error("[msaview-domains] auto-load failed:",i)}finally{e.setProgress("")}})())}function wv(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 a=Eg(r);a&&(e.setUniprotId(a),e.setQuerySeqName("query"))}if(i&&e.setQuerySeqName(i),r)e.setMSAFilehandle({uri:r,locationType:"UriLocation"});else if(n&&o){let a=await ov({location:n,name:o});if(a)e.setMSA(a);else throw new Error(`No alignment named ${o} in ${n.uri}`)}e.setInit(void 0)}catch(a){e.setError(a),console.error(a)}})()}}function bv(e){let t=!1;return()=>{let r=av({model:e});r!==void 0?(e.setMousePos(r),t=!0):t&&(e.setMousePos(void 0),t=!1)}}function Bv(e){let t=!1;return()=>{let{connectedViewId:r,transcriptToMsaMap:n,querySeqName:o}=e;if(!r||!n)return;let i=new Set;for(let s of gv((0,Cv.getSession)(e).views))for(let c of s.structures){if(c.connectedViewId!==r)continue;let l=c.hoverGenomeHighlights;if(!l||l.length===0)continue;let{g2p:A}=n;for(let u of l)for(let m=u.start;m<u.end;m++){let d=A[m];if(d!==void 0){let p=e.seqPosToGlobalCol(o,d);i.add(p)}}}let a=Array.from(i).map(s=>e.globalColToVisibleCol(s)).filter(s=>s!==void 0);a.length>0?(e.setHighlightedColumns(a),t=!0):t&&(e.setHighlightedColumns(e.highlightColumns?.length?e.highlightColumns:void 0),t=!1)}}function Sv(){pv().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}function dA({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,i=e.rows.find(s=>s[0]===r)?.[1];if(!i)return;let a=hv(i,t);if(a!==void 0){if(o){let s=o.start+a;return s<o.end?{refName:o.refName,start:s,end:s+1}:void 0}if(n){let{refName:s,p2g:c}=n,l=c[a],A=c[a+1];return l!==void 0&&A!==void 0?{refName:s,start:Math.min(l,A),end:Math.max(l,A)}:void 0}}}function Xm(){return At.types.compose(Qv.BaseViewModel,eA(),At.types.model("MsaView",{connectedViewId:At.types.maybe(At.types.string),connectedFeature:At.types.frozen(),blastParams:At.types.frozen(),querySeqName:"QUERY",uniprotId:At.types.maybe(At.types.string),zoomToBaseLevel:!1,init:At.types.frozen(),dataStoreId:At.types.maybe(At.types.string),mafRegion:At.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?yg(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,vv.getSession)(e);return t.find(r=>r.id===e.connectedViewId)}})).views(e=>({get connectedHighlights(){let{mouseCol:t,mouseClickCol:r}=e;return[t===void 0?void 0:dA({model:e,coord:t}),r===void 0?void 0:dA({model:e,coord:r})].filter(n=>n!==void 0)}})).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},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=dA({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(){Sv();for(let t of[Ev,xv,Iv,wv,yv])(0,At.addDisposer)(e,(0,mA.autorun)(()=>{t(e)}));(0,At.addDisposer)(e,(0,mA.autorun)(bv(e))),(0,At.addDisposer)(e,(0,mA.autorun)(Bv(e)))}}))}function Yi(e){return e.type==="MsaView"}var d5=(0,ep.observer)(function({model:e}){let{hovered:t,views:r}=(0,Mv.getSession)(e);return r.some(o=>Yi(o)&&o.connectedViewId===e.id)&&Kn(t)?Zm.default.createElement(m5,{model:e,hovered:t}):null}),m5=(0,ep.observer)(function({model:e,hovered:t}){let{classes:r}=Ls(),{offsetPx:n}=e,{coord:o,refName:i}=t.hoverPosition,a=e.bpToPx({refName:i,coord:o-1}),s=e.bpToPx({refName:i,coord:o});if(a&&s){let c=Math.max(Math.abs(s.offsetPx-a.offsetPx),4),l=Math.min(a.offsetPx,s.offsetPx)-n;return Zm.default.createElement("div",{className:r.highlight,style:{left:l,width:c}})}return null}),_v=d5;var Es=f(M()),Tv=f(xe()),tp=f(H());var p5=(0,tp.observer)(function({model:t}){let{views:r,hovered:n}=(0,Tv.getSession)(t),i=r.filter(Yi).find(a=>a.connectedViewId===t.id)?.connectedHighlights;return!Kn(n)&&i?.length?Es.default.createElement(g5,{model:t,highlights:i}):null}),g5=(0,tp.observer)(function({model:e,highlights:t}){let{classes:r}=Ls(),{offsetPx:n}=e;return Es.default.createElement(Es.default.Fragment,null,t.map((o,i)=>{let a=e.bpToPx({refName:o.refName,coord:o.start}),s=e.bpToPx({refName:o.refName,coord:o.end});if(a&&s){let c=Math.max(Math.abs(s.offsetPx-a.offsetPx),4),l=Math.min(a.offsetPx,s.offsetPx)-n;return Es.default.createElement("div",{key:`${o.refName}-${o.start}-${o.end}-${i}`,className:r.highlight,style:{left:l,width:c}})}return null}))}),kv=p5;var h5=(0,Dv.observer)(function({model:t}){return xs.default.createElement(xs.default.Fragment,null,xs.default.createElement(kv,{model:t}),xs.default.createElement(_v,{model:t}))}),Nv=h5;function rp(e){e.addToExtensionPoint("LinearGenomeView-TracksContainerComponent",(t,{model:r})=>{let{views:n}=(0,Rv.getSession)(r);return n.some(i=>Yi(i)&&i.connectedViewId===r.id)?[...t,Lv.default.createElement(Nv,{key:"highlight_protein_viewer_msaview",model:r})]:t})}var qv=f(tu());var Fv=f(jo());function np(e){let t=e.getAdapterType("BgzipFastaAdapter");return(0,Fv.ConfigurationSchema)("BgzipFastaMsaAdapter",{msaRegex:{type:"string",defaultValue:"_"}},{baseConfiguration:t?.configSchema})}function op(e){return e.addAdapterType(()=>new qv.AdapterType({name:"BgzipFastaMsaAdapter",configSchema:np(e),adapterMetadata:{hiddenFromGUI:!0},getAdapterClass:()=>Promise.resolve().then(()=>(jv(),Hv)).then(t=>t.default)}))}var PA=f(xe());Y();var Jv=f(O(),1),Vv=(0,R.createSvgIcon)((0,Jv.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");var Lt=f(M()),pM=f(Ne()),gM=f(xe()),ta=f(F());var oe=f(M()),bp=f(Ne()),S2=f(xe()),ir=f(F()),Q2=f(H()),v2=f(De());function Yv({session:e,newViewTitle:t,view:r,feature:n,msaFilehandle:o,treeFilehandle:i,querySeqName:a,data:s}){e.addView("MsaView",{type:"MsaView",displayName:t,connectedViewId:r.id,connectedFeature:n.toJSON(),msaFilehandle:o,treeFilehandle:i,querySeqName:a,data:s})}var ip=f(M()),Wv=f(F());function C5({children:e,...t}){return ip.default.createElement("div",null,ip.default.createElement(Wv.TextField,{...t},e))}var ut=C5;var ap=f(M()),zv=f(Ne()),$v=f(F()),Kv=f(De()),E5=(0,Kv.makeStyles)()({dialogContent:{width:"80em"}});function Cr({error:e,children:t}){let{classes:r}=E5();return ap.default.createElement($v.DialogContent,{className:r.dialogContent},e?ap.default.createElement(zv.ErrorMessage,{error:e}):null,t)}var gA=f(M()),Is=f(F());function dn({onSubmit:e,onCancel:t,submitDisabled:r,submitLabel:n="Submit",cancelLabel:o="Cancel"}){return gA.default.createElement(Is.DialogActions,null,gA.default.createElement(Is.Button,{color:"primary",variant:"contained",disabled:r,onClick:()=>{e()}},n),gA.default.createElement(Is.Button,{color:"secondary",variant:"contained",onClick:()=>{t()}},o))}var Er=f(M()),Wi=f(F()),e2=f(De());var Xv=f(M()),Zv=f(De());var x5=(0,Zv.makeStyles)()({textAreaFont:{fontFamily:"Courier New"}});function sp({value:e}){let{classes:t}=x5();return Xv.default.createElement(ut,{variant:"outlined",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,value:e,slotProps:{input:{readOnly:!0,classes:{input:t.textAreaFont}}}})}var I5=(0,e2.makeStyles)()({flex:{display:"flex"},minWidth:{minWidth:300},centered:{alignContent:"center",marginLeft:20}});function xr({feature:e,options:t,selectedId:r,selectedTranscript:n,setSelectedId:o,proteinSequence:i,validIds:a}){let{classes:s}=I5(),[c,l]=(0,Er.useState)(!1);return Er.default.createElement(Er.default.Fragment,null,Er.default.createElement("div",{className:s.flex},Er.default.createElement(Wi.TextField,{variant:"outlined",label:`Choose isoform of ${Qo(e)}`,select:!0,className:s.minWidth,value:r,onChange:A=>{o(A.target.value)}},t.map(A=>{let u=a?a.some(p=>gs(A,p)):!0,{len:m,mod:d}=tA(A);return Er.default.createElement(Wi.MenuItem,{value:So(A),key:A.id(),disabled:!u},nA(A)," (",m," aa)"," ",d?" (possible fragment)":"",a?u?" (has data)":" (no data)":"")})),Er.default.createElement("div",{className:s.centered},Er.default.createElement(Wi.Button,{variant:"contained",color:"primary",onClick:()=>{l(!c)}},c?"Hide sequence":"Show sequence"))),c?Er.default.createElement(sp,{value:i?`>${nA(n)}
|
|
73
|
+
`)){let[o,i,a]=n.split(" ");if(o&&rv(o)===r)return{offset:Number(i),length:Number(a)}}}var iv=f(xe());function av({model:e}){let{hovered:t}=(0,iv.getSession)(e),{querySeqName:r,transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Kn(t))return;let{coord:a,refName:s}=t.hoverPosition;if(i)return s!==i.refName||!o.assemblyNames.includes(i.assemblyName)||a<i.start||a>=i.end?void 0:e.seqPosToVisibleCol(r,a-i.start);if(n){let c=n.g2p[a];if(c!==void 0)return e.seqPosToVisibleCol(r,c)}}Mi();var n5="jbrowse-msaview-domain-cache",fA="domains",o5=1;async function sv(){return an(n5,o5,{upgrade(e){e.objectStoreNames.contains(fA)||e.createObjectStore(fA,{keyPath:"accession"})}})}async function cv(e){let r=(await sv()).transaction(fA,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n}async function lv(e){let r=(await sv()).transaction(fA,"readwrite");for(let n of e)await r.store.put(n);await r.done}function Jn(e,t){return new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(e)?.[1]}function i5(e){let t={},r=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=r.exec(e))!==null;){let o=Jn(n[1],"GBQualifier_name"),i=Jn(n[1],"GBQualifier_value");o&&i!==void 0&&t[o]===void 0&&(t[o]=i)}return t}function a5(e){let t=[],r=[],n=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,o;for(;(o=n.exec(e))!==null;){let i=o[1],a=Jn(i,"GBInterval_from"),s=Jn(i,"GBInterval_to"),c=Jn(i,"GBInterval_point");a&&s?(t.push(Number(a)),r.push(Number(s))):c&&(t.push(Number(c)),r.push(Number(c)))}return t.length>0?{start:Math.min(...t),end:Math.max(...r)}:void 0}var s5=2;function c5(e){let t=Jn(e,"GBFeature_key"),r=i5(e),n=r.db_xref,o=a5(e);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&o&&o.end-o.start+1>=s5){let i=n.replace("CDD:",""),a=t==="Region",s=r.note?.split(/[[(]/)[0]?.trim(),c=a?r.region_name??i:s||r.site_type||"site",l=a?i:`${i}:${c}`;return{signature:{entry:{name:c,description:r.note??c,accession:l}},locations:[o]}}}function l5(e){let t=new Map,r=/<GBSeq>([\s\S]*?)<\/GBSeq>/g,n;for(;(n=r.exec(e))!==null;){let o=n[1],i=[],a=/<GBFeature>([\s\S]*?)<\/GBFeature>/g,s;for(;(s=a.exec(o))!==null;){let c=c5(s[1]);c&&i.push(c)}for(let c of[Jn(o,"GBSeq_accession-version"),Jn(o,"GBSeq_primary-accession")])c&&t.set(c,i)}return t}async function Av(e){let t=[...new Set(e)].filter(Boolean),r=new Map,n=await cv(t),o=[];t.forEach((s,c)=>{let l=n[c];l?r.set(s,l.matches):o.push(s)});let i=[],a=100;for(let s=0;s<o.length;s+=a){let c=o.slice(s,s+a),l=await qr(uA({db:"protein",id:c.join(","),rettype:"gp",retmode:"xml"})),A=l5(l);for(let u of c){let m=A.get(u)??[];r.set(u,m),i.push({accession:u,matches:m})}}return i.length>0&&await lv(i),r}async function uv(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(([a,s])=>({rowName:a,accession:s.Accession})).filter(a=>!!a.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 Av(n.map(a=>a.accession)),i={};for(let{rowName:a,accession:s}of n){let c=o.get(s);c&&c.length>0&&(i[a]={matches:c,xref:[{id:a}]})}if(Object.keys(i).length===0)throw new Error("No CDD domain annotations found for these proteins");e.setDomains(i)}Mi();var A5="jbrowse-msaview-data",u5=1,Cs="msa-data";async function Km(){return an(A5,u5,{upgrade(e){e.objectStoreNames.contains(Cs)||e.createObjectStore(Cs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}function fv(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function dv(e,t){try{let r=await Km(),n={id:e,msa:t.msa,tree:t.tree,treeMetadata:t.treeMetadata,timestamp:Date.now()};return await r.put(Cs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function mv(e){try{let r=await(await Km()).get(Cs,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 pv(e=10080*60*1e3){try{let t=await Km(),r=Date.now()-e,i=await t.transaction(Cs,"readwrite").store.index("timestamp").openCursor(IDBKeyRange.upperBound(r)),a=0;for(;i;)await i.delete(),a++,i=await i.continue();return a}catch(t){return console.warn("Failed to cleanup old MSA data:",t),0}}function f5(e){let t=e;return t.type==="ProteinView"&&Array.isArray(t.structures)}function gv(e){return e.filter(f5)}function hv(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 Ev(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await mv(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 xv(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 a=fv();await dv(a,{msa:o,tree:i,treeMetadata:e.data.treeMetadata})&&e.setDataStoreId(a)}catch(a){console.error("Failed to store MSA data to IndexedDB:",a)}finally{e.setIsStoringData(!1)}})())}}function Iv(e){e.blastParams&&(async()=>{try{e.setProgress("Submitting query"),e.setError(void 0);let t=await tv({self:e});e.setData(t),e.setBlastParams(void 0)}catch(t){e.setError(t),console.error(t)}finally{e.setProgress("")}})()}function yv(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 uv(e)}catch(i){console.error("[msaview-domains] auto-load failed:",i)}finally{e.setProgress("")}})())}function wv(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 a=Eg(r);a&&(e.setUniprotId(a),e.setQuerySeqName("query"))}if(i&&e.setQuerySeqName(i),r)e.setMSAFilehandle({uri:r,locationType:"UriLocation"});else if(n&&o){let a=await ov({location:n,name:o});if(a)e.setMSA(a);else throw new Error(`No alignment named ${o} in ${n.uri}`)}e.setInit(void 0)}catch(a){e.setError(a),console.error(a)}})()}}function bv(e){let t=!1;return()=>{let r=av({model:e});r!==void 0?(e.setMousePos(r),t=!0):t&&(e.setMousePos(void 0),t=!1)}}function Bv(e){let t=!1;return()=>{let{connectedViewId:r,transcriptToMsaMap:n,querySeqName:o}=e;if(!r||!n)return;let i=new Set;for(let s of gv((0,Cv.getSession)(e).views))for(let c of s.structures){if(c.connectedViewId!==r)continue;let l=c.hoverGenomeHighlights;if(!l||l.length===0)continue;let{g2p:A}=n;for(let u of l)for(let m=u.start;m<u.end;m++){let d=A[m];if(d!==void 0){let p=e.seqPosToGlobalCol(o,d);i.add(p)}}}let a=Array.from(i).map(s=>e.globalColToVisibleCol(s)).filter(s=>s!==void 0);a.length>0?(e.setHighlightedColumns(a),t=!0):t&&(e.setHighlightedColumns(e.highlightColumns?.length?e.highlightColumns:void 0),t=!1)}}function Sv(){pv().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}function dA({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,i=e.rows.find(s=>s[0]===r)?.[1];if(!i)return;let a=hv(i,t);if(a!==void 0){if(o){let s=o.start+a;return s<o.end?{refName:o.refName,start:s,end:s+1}:void 0}if(n){let{refName:s,p2g:c}=n,l=c[a],A=c[a+1];return l!==void 0&&A!==void 0?{refName:s,start:Math.min(l,A),end:Math.max(l,A)}:void 0}}}function Xm(){return At.types.compose(Qv.BaseViewModel,eA(),At.types.model("MsaView",{connectedViewId:At.types.maybe(At.types.string),connectedFeature:At.types.frozen(),blastParams:At.types.frozen(),querySeqName:"QUERY",uniprotId:At.types.maybe(At.types.string),zoomToBaseLevel:!1,init:At.types.frozen(),dataStoreId:At.types.maybe(At.types.string),mafRegion:At.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?yg(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,vv.getSession)(e);return t.find(r=>r.id===e.connectedViewId)}})).views(e=>({get connectedHoverHighlight(){let{mouseCol:t}=e;return t===void 0?void 0:dA({model:e,coord:t})},get connectedClickHighlight(){let{mouseClickCol:t}=e;return t===void 0?void 0:dA({model:e,coord:t})},get connectedHighlights(){return[this.connectedHoverHighlight,this.connectedClickHighlight].filter(t=>t!==void 0)}})).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},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=dA({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(){Sv();for(let t of[Ev,xv,Iv,wv,yv])(0,At.addDisposer)(e,(0,mA.autorun)(()=>{t(e)}));(0,At.addDisposer)(e,(0,mA.autorun)(bv(e))),(0,At.addDisposer)(e,(0,mA.autorun)(Bv(e)))}}))}function Yi(e){return e.type==="MsaView"}var d5=(0,ep.observer)(function({model:e}){let{hovered:t,views:r}=(0,Mv.getSession)(e);return r.some(o=>Yi(o)&&o.connectedViewId===e.id)&&Kn(t)?Zm.default.createElement(m5,{model:e,hovered:t}):null}),m5=(0,ep.observer)(function({model:e,hovered:t}){let{classes:r}=Ls(),{offsetPx:n}=e,{coord:o,refName:i}=t.hoverPosition,a=e.bpToPx({refName:i,coord:o-1}),s=e.bpToPx({refName:i,coord:o});if(a&&s){let c=Math.max(Math.abs(s.offsetPx-a.offsetPx),4),l=Math.min(a.offsetPx,s.offsetPx)-n;return Zm.default.createElement("div",{className:r.highlight,style:{left:l,width:c}})}return null}),_v=d5;var Es=f(M()),Tv=f(xe()),tp=f(H());var p5=(0,tp.observer)(function({model:t}){let{views:r,hovered:n}=(0,Tv.getSession)(t),o=r.filter(Yi).find(c=>c.connectedViewId===t.id),i=o?.connectedClickHighlight,a=Kn(n)?void 0:o?.connectedHoverHighlight,s=[i,a].filter(c=>c!==void 0);return s.length?Es.default.createElement(g5,{model:t,highlights:s}):null}),g5=(0,tp.observer)(function({model:e,highlights:t}){let{classes:r}=Ls(),{offsetPx:n}=e;return Es.default.createElement(Es.default.Fragment,null,t.map((o,i)=>{let a=e.bpToPx({refName:o.refName,coord:o.start}),s=e.bpToPx({refName:o.refName,coord:o.end});if(a&&s){let c=Math.max(Math.abs(s.offsetPx-a.offsetPx),4),l=Math.min(a.offsetPx,s.offsetPx)-n;return Es.default.createElement("div",{key:`${o.refName}-${o.start}-${o.end}-${i}`,className:r.highlight,style:{left:l,width:c}})}return null}))}),kv=p5;var h5=(0,Dv.observer)(function({model:t}){return xs.default.createElement(xs.default.Fragment,null,xs.default.createElement(kv,{model:t}),xs.default.createElement(_v,{model:t}))}),Nv=h5;function rp(e){e.addToExtensionPoint("LinearGenomeView-TracksContainerComponent",(t,{model:r})=>{let{views:n}=(0,Rv.getSession)(r);return n.some(i=>Yi(i)&&i.connectedViewId===r.id)?[...t,Lv.default.createElement(Nv,{key:"highlight_protein_viewer_msaview",model:r})]:t})}var qv=f(tu());var Fv=f(jo());function np(e){let t=e.getAdapterType("BgzipFastaAdapter");return(0,Fv.ConfigurationSchema)("BgzipFastaMsaAdapter",{msaRegex:{type:"string",defaultValue:"_"}},{baseConfiguration:t?.configSchema})}function op(e){return e.addAdapterType(()=>new qv.AdapterType({name:"BgzipFastaMsaAdapter",configSchema:np(e),adapterMetadata:{hiddenFromGUI:!0},getAdapterClass:()=>Promise.resolve().then(()=>(jv(),Hv)).then(t=>t.default)}))}var PA=f(xe());Y();var Jv=f(O(),1),Vv=(0,R.createSvgIcon)((0,Jv.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");var Lt=f(M()),pM=f(Ne()),gM=f(xe()),ta=f(F());var oe=f(M()),bp=f(Ne()),S2=f(xe()),ir=f(F()),Q2=f(H()),v2=f(De());function Yv({session:e,newViewTitle:t,view:r,feature:n,msaFilehandle:o,treeFilehandle:i,querySeqName:a,data:s}){e.addView("MsaView",{type:"MsaView",displayName:t,connectedViewId:r.id,connectedFeature:n.toJSON(),msaFilehandle:o,treeFilehandle:i,querySeqName:a,data:s})}var ip=f(M()),Wv=f(F());function C5({children:e,...t}){return ip.default.createElement("div",null,ip.default.createElement(Wv.TextField,{...t},e))}var ut=C5;var ap=f(M()),zv=f(Ne()),$v=f(F()),Kv=f(De()),E5=(0,Kv.makeStyles)()({dialogContent:{width:"80em"}});function Cr({error:e,children:t}){let{classes:r}=E5();return ap.default.createElement($v.DialogContent,{className:r.dialogContent},e?ap.default.createElement(zv.ErrorMessage,{error:e}):null,t)}var gA=f(M()),Is=f(F());function dn({onSubmit:e,onCancel:t,submitDisabled:r,submitLabel:n="Submit",cancelLabel:o="Cancel"}){return gA.default.createElement(Is.DialogActions,null,gA.default.createElement(Is.Button,{color:"primary",variant:"contained",disabled:r,onClick:()=>{e()}},n),gA.default.createElement(Is.Button,{color:"secondary",variant:"contained",onClick:()=>{t()}},o))}var Er=f(M()),Wi=f(F()),e2=f(De());var Xv=f(M()),Zv=f(De());var x5=(0,Zv.makeStyles)()({textAreaFont:{fontFamily:"Courier New"}});function sp({value:e}){let{classes:t}=x5();return Xv.default.createElement(ut,{variant:"outlined",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,value:e,slotProps:{input:{readOnly:!0,classes:{input:t.textAreaFont}}}})}var I5=(0,e2.makeStyles)()({flex:{display:"flex"},minWidth:{minWidth:300},centered:{alignContent:"center",marginLeft:20}});function xr({feature:e,options:t,selectedId:r,selectedTranscript:n,setSelectedId:o,proteinSequence:i,validIds:a}){let{classes:s}=I5(),[c,l]=(0,Er.useState)(!1);return Er.default.createElement(Er.default.Fragment,null,Er.default.createElement("div",{className:s.flex},Er.default.createElement(Wi.TextField,{variant:"outlined",label:`Choose isoform of ${Qo(e)}`,select:!0,className:s.minWidth,value:r,onChange:A=>{o(A.target.value)}},t.map(A=>{let u=a?a.some(p=>gs(A,p)):!0,{len:m,mod:d}=tA(A);return Er.default.createElement(Wi.MenuItem,{value:So(A),key:A.id(),disabled:!u},nA(A)," (",m," aa)"," ",d?" (possible fragment)":"",a?u?" (has data)":" (no data)":"")})),Er.default.createElement("div",{className:s.centered},Er.default.createElement(Wi.Button,{variant:"contained",color:"primary",onClick:()=>{l(!c)}},c?"Hide sequence":"Show sequence"))),c?Er.default.createElement(sp,{value:i?`>${nA(n)}
|
|
74
74
|
${i}`:"Loading..."}):null)}var _A=f(M());var Vn=f(xe());function y5(e,t){return e.map(r=>t.slice(r.start,r.end)).join("")}function w5({cds:e,sequence:t,codonTable:r}){let n=y5(e,t),o="";for(let i=0;i<n.length;i+=3)o+=r[n.slice(i,i+3)]??"&";return o}function b5(e,t){return e.map(r=>({...r,start:t-r.end,end:t-r.start})).toSorted((r,n)=>r.start-n.start)}function t2({feature:e,seq:t}){let{subfeatures:r,start:n,strand:o}=e.toJSON(),i=(0,Vn.dedupe)(r?.toSorted((a,s)=>a.start-s.start).map(a=>({...a,start:a.start-n,end:a.end-n})).filter(a=>a.type==="CDS")??[],a=>`${a.start}-${a.end}`);return w5({cds:o===-1?b5(i,t.length):i,sequence:o===-1?(0,Vn.revcom)(t):t,codonTable:(0,Vn.generateCodonTable)(Vn.defaultCodonTable)})}var w2=f(xe());var Ye=f(M(),1),wp=f(i2(),1);var ft=f(M(),1);var Yn={};nt(Yn,{ERROR_REVALIDATE_EVENT:()=>N5,FOCUS_EVENT:()=>a2,MUTATE_EVENT:()=>c2,RECONNECT_EVENT:()=>s2});var a2=0,s2=1,c2=2,N5=3;var l2=Object.prototype.hasOwnProperty;function hA(e,t){var r,n;if(e===t)return!0;if(e&&t&&(r=e.constructor)===t.constructor){if(r===Date)return e.getTime()===t.getTime();if(r===RegExp)return e.toString()===t.toString();if(r===Array){if((n=e.length)===t.length)for(;n--&&hA(e[n],t[n]););return n===-1}if(!r||typeof e=="object"){n=0;for(r in e)if(l2.call(e,r)&&++n&&!l2.call(t,r)||!(r in t)||!hA(e[r],t[r]))return!1;return Object.keys(t).length===n}}return e!==e&&t!==t}var Ir=new WeakMap,yr=()=>{},je=yr(),$i=Object,V=e=>e===je,Vt=e=>typeof e=="function",wr=(e,t)=>({...e,...t}),wA=e=>Vt(e.then),lp={},CA={},gp="undefined",Ki=typeof window!=gp,xA=typeof document!=gp,u2=Ki&&"Deno"in window,f2=()=>Ki&&typeof window.requestAnimationFrame!=gp,bA=(e,t)=>{let r=Ir.get(e);return[()=>!V(t)&&e.get(t)||lp,n=>{if(!V(t)){let o=e.get(t);t in CA||(CA[t]=o),r[5](t,wr(o,n),o||lp)}},r[6],()=>!V(t)&&t in CA?CA[t]:!V(t)&&e.get(t)||lp]},fp=!0,L5=()=>fp,[dp,mp]=Ki&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[yr,yr],R5=()=>{let e=xA&&document.visibilityState;return V(e)||e!=="hidden"},F5=e=>(xA&&document.addEventListener("visibilitychange",e),dp("focus",e),()=>{xA&&document.removeEventListener("visibilitychange",e),mp("focus",e)}),P5=e=>{let t=()=>{fp=!0,e()},r=()=>{fp=!1};return dp("online",t),dp("offline",r),()=>{mp("online",t),mp("offline",r)}},d2={isOnline:L5,isVisible:R5},m2={initFocus:F5,initReconnect:P5},BA=!ft.default.useId,Wn=!Ki||u2,hp=e=>f2()?window.requestAnimationFrame(e):setTimeout(e,1),Xi=Wn?ft.useEffect:ft.useLayoutEffect,Ap=typeof navigator<"u"&&navigator.connection,pp=!Wn&&Ap&&(["slow-2g","2g"].includes(Ap.effectiveType)||Ap.saveData),EA=new WeakMap,O5=e=>$i.prototype.toString.call(e),up=(e,t)=>e===`[object ${t}]`,G5=0,IA=e=>{let t=typeof e,r=O5(e),n=up(r,"Date"),o=up(r,"RegExp"),i=up(r,"Object"),a,s;if($i(e)===e&&!n&&!o){if(a=EA.get(e),a)return a;if(a=++G5+"~",EA.set(e,a),Array.isArray(e)){for(a="@",s=0;s<e.length;s++)a+=IA(e[s])+",";EA.set(e,a)}if(i){a="#";let c=$i.keys(e).sort();for(;!V(s=c.pop());)V(e[s])||(a+=s+":"+IA(e[s])+",");EA.set(e,a)}}else a=n?e.toJSON():t=="symbol"?e.toString():t=="string"?JSON.stringify(e):""+e;return a},ws=e=>{if(Vt(e))try{e=e()}catch{e=""}let t=e;return e=typeof e=="string"?e:(Array.isArray(e)?e.length:e)?IA(e):"",[e,t]},U5=0,ys=()=>++U5;async function SA(...e){let[t,r,n,o]=e,i=wr({populateCache:!0,throwOnError:!0},typeof o=="boolean"?{revalidate:o}:o||{}),a=i.populateCache,s=i.rollbackOnError,c=i.optimisticData,l=m=>typeof s=="function"?s(m):s!==!1,A=i.throwOnError;if(Vt(r)){let m=r,d=[],p=t.keys();for(let C of p)!/^\$(inf|sub)\$/.test(C)&&m(t.get(C)._k)&&d.push(C);return Promise.all(d.map(u))}return u(r);async function u(m){let[d]=ws(m);if(!d)return;let[p,C]=bA(t,d),[I,x,E,w]=Ir.get(t),y=()=>{let J=I[d];return(Vt(i.revalidate)?i.revalidate(p().data,m):i.revalidate!==!1)&&(delete E[d],delete w[d],J&&J[0])?J[0](2).then(()=>p().data):p().data};if(e.length<3)return y();let b=n,Q,S=!1,k=ys();x[d]=[k,0];let T=!V(c),_=p(),v=_.data,L=_._c,U=V(L)?v:L;if(T&&(c=Vt(c)?c(U,v):c,C({data:c,_c:U})),Vt(b))try{b=b(U)}catch(J){Q=J,S=!0}if(b&&wA(b))if(b=await b.catch(J=>{Q=J,S=!0}),k!==x[d][0]){if(S)throw Q;return b}else S&&T&&l(Q)&&(a=!0,C({data:U,_c:je}));if(a&&!S)if(Vt(a)){let J=a(b,U);C({data:J,error:je,_c:je})}else C({data:b,error:je,_c:je});if(x[d][1]=ys(),Promise.resolve(y()).then(()=>{C({_c:je})}),S){if(A)throw Q;return}return b}}var A2=(e,t)=>{for(let r in e)e[r][0]&&e[r][0](t)},Cp=(e,t)=>{if(!Ir.has(e)){let r=wr(m2,t),n=Object.create(null),o=SA.bind(je,e),i=yr,a=Object.create(null),s=(A,u)=>{let m=a[A]||[];return a[A]=m,m.push(u),()=>{let d=m.indexOf(u);d>=0&&(m[d]=m[m.length-1],m.pop())}},c=(A,u,m)=>{e.set(A,u);let d=a[A];if(d)for(let p of d)p(u,m)},l=()=>{if(!Ir.has(e)&&(Ir.set(e,[n,Object.create(null),Object.create(null),Object.create(null),o,c,s]),!Wn)){let A=r.initFocus(setTimeout.bind(je,A2.bind(je,n,0))),u=r.initReconnect(setTimeout.bind(je,A2.bind(je,n,1)));i=()=>{A&&A(),u&&u(),Ir.delete(e)}}};return l(),[e,o,l,i]}return[e,Ir.get(e)[4]]},H5=(e,t,r,n,o)=>{let i=r.errorRetryCount,a=o.retryCount,s=~~((Math.random()+.5)*(1<<(a<8?a:8)))*r.errorRetryInterval;!V(i)&&a>i||setTimeout(n,s,o)},p2=hA,[QA,g2]=Cp(new Map),vA=wr({onLoadingSlow:yr,onSuccess:yr,onError:yr,onErrorRetry:H5,onDiscarded:yr,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:pp?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:pp?5e3:3e3,compare:p2,isPaused:()=>!1,cache:QA,mutate:g2,fallback:{}},d2),Ep=(e,t)=>{let r=wr(e,t);if(t){let{use:n,fallback:o}=e,{use:i,fallback:a}=t;n&&i&&(r.use=n.concat(i)),o&&a&&(r.fallback=wr(o,a))}return r},yA=(0,ft.createContext)({}),xp=e=>{let{value:t}=e,r=(0,ft.useContext)(yA),n=Vt(t),o=(0,ft.useMemo)(()=>n?t(r):t,[n,r,t]),i=(0,ft.useMemo)(()=>n?o:Ep(r,o),[n,r,o]),a=o&&o.provider,s=(0,ft.useRef)(je);a&&!s.current&&(s.current=Cp(a(i.cache||QA),o));let c=s.current;return c&&(i.cache=c[0],i.mutate=c[1]),Xi(()=>{if(c)return c[2]&&c[2](),c[3]},[]),(0,ft.createElement)(yA.Provider,wr(e,{value:i}))};var h2="$inf$";var Zi=f(M(),1);var C2=Ki&&window.__SWR_DEVTOOLS_USE__,j5=C2?window.__SWR_DEVTOOLS_USE__:[],q5=()=>{C2&&(window.__SWR_DEVTOOLS_REACT__=Zi.default)},J5=e=>Vt(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],V5=()=>{let e=(0,Zi.useContext)(yA);return(0,Zi.useMemo)(()=>wr(vA,e),[e])};var Y5=e=>(t,r,n)=>e(t,r&&((...i)=>{let[a]=ws(t),[,,,s]=Ir.get(QA);if(a.startsWith(h2))return r(...i);let c=s[a];return V(c)?r(...i):(delete s[a],c)}),n),W5=j5.concat(Y5),E2=e=>function(...r){let n=V5(),[o,i,a]=J5(r),s=Ep(n,a),c=e,{use:l}=s,A=(l||[]).concat(W5);for(let u=A.length;u--;)c=A[u](c);return c(o,i||s.fetcher||null,s)},x2=(e,t,r)=>{let n=t[e]||(t[e]=[]);return n.push(r),()=>{let o=n.indexOf(r);o>=0&&(n[o]=n[n.length-1],n.pop())}};q5();var z5=()=>{},TW=z5();var Ip=Ye.default.use||(e=>{switch(e.status){case"pending":throw e;case"fulfilled":return e.value;case"rejected":throw e.reason;default:throw e.status="pending",e.then(t=>{e.status="fulfilled",e.value=t},t=>{e.status="rejected",e.reason=t}),e}}),yp={dedupe:!0},MA=Promise.resolve(je);MA.status="fulfilled";MA.value=je;var $5=()=>yr,K5=(e,t,r)=>{let{cache:n,compare:o,suspense:i,fallbackData:a,revalidateOnMount:s,revalidateIfStale:c,refreshInterval:l,refreshWhenHidden:A,refreshWhenOffline:u,keepPreviousData:m,strictServerPrefetchWarning:d}=r,[p,C,I,x]=Ir.get(n),[E,w]=ws(e),y=(0,Ye.useRef)(!1),b=(0,Ye.useRef)(!1),Q=(0,Ye.useRef)(E),S=(0,Ye.useRef)(t),k=(0,Ye.useRef)(r),T=()=>k.current,_=()=>T().isVisible()&&T().isOnline(),[v,L,U,J]=bA(n,E),ie=(0,Ye.useRef)({}).current,be=V(a)?V(r.fallback)?je:r.fallback[E]:a,ge=(ae,re)=>{for(let Se in ie){let Ee=Se;if(Ee==="data"){if(!o(ae[Ee],re[Ee])&&(!V(ae[Ee])||!o(Do,re[Ee])))return!1}else if(re[Ee]!==ae[Ee])return!1}return!0},Sr=!y.current,zn=(0,Ye.useMemo)(()=>{let ae=v(),re=J(),Se=Ae=>{let rt=wr(Ae);return delete rt._k,(()=>{if(!E||!t||T().isPaused())return!1;if(Sr&&!V(s))return s;let zr=V(be)?rt.data:be;return i?V(zr)||c:V(zr)||c})()?{isValidating:!0,isLoading:!0,...rt}:rt},Ee=Se(ae),Rt=ae===re?Ee:Se(re),yt=Ee;return[()=>{let Ae=Se(v());return ge(Ae,yt)?(yt.data=Ae.data,yt.isLoading=Ae.isLoading,yt.isValidating=Ae.isValidating,yt.error=Ae.error,yt):(yt=Ae,Ae)},()=>Rt]},[n,E]),It=(0,wp.useSyncExternalStore)((0,Ye.useCallback)(ae=>U(E,(re,Se)=>{ge(Se,re)||ae()}),[n,E]),zn[0],zn[1]),me=p[E]&&p[E].length>0,pn=It.data,Yr=V(pn)?be&&wA(be)?Ip(be):be:pn,ko=It.error,ra=(0,Ye.useRef)(Yr),Do=m?V(pn)?V(ra.current)?Yr:ra.current:pn:Yr,Wr=E&&V(Yr),gn=(0,Ye.useRef)(null);!Wn&&(0,wp.useSyncExternalStore)($5,()=>(gn.current=!1,gn),()=>(gn.current=!0,gn));let HA=gn.current;d&&HA&&!i&&Wr&&console.warn(`Missing pre-initiated data for serialized key "${E}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let na=!E||!t||T().isPaused()||me&&!V(ko)?!1:Sr&&!V(s)?s:i?V(Yr)?!1:c:V(Yr)||c,he=Sr&&na,vs=V(It.isValidating)?he:It.isValidating,Be=V(It.isLoading)?he:It.isLoading,hn=(0,Ye.useCallback)(async ae=>{let re=S.current;if(!E||!re||b.current||T().isPaused())return!1;let Se,Ee,Rt=!0,yt=ae||{},Ae=!I[E]||!yt.dedupe,rt=()=>BA?!b.current&&E===Q.current&&y.current:E===Q.current,Ft={isValidating:!1,isLoading:!1},zr=()=>{L(Ft)},Lo=()=>{let dt=I[E];dt&&dt[1]===Ee&&delete I[E]},Ro={isValidating:!0};V(v().data)&&(Ro.isLoading=!0);try{if(Ae&&(L(Ro),r.loadingTimeout&&V(v().data)&&setTimeout(()=>{Rt&&rt()&&T().onLoadingSlow(E,r)},r.loadingTimeout),I[E]=[re(w),ys()]),[Se,Ee]=I[E],Se=await Se,Ae&&setTimeout(Lo,r.dedupingInterval),!I[E]||I[E][1]!==Ee)return Ae&&rt()&&T().onDiscarded(E),!1;Ft.error=je;let dt=C[E];if(!V(dt)&&(Ee<=dt[0]||Ee<=dt[1]||dt[1]===0))return zr(),Ae&&rt()&&T().onDiscarded(E),!1;let mt=v().data;Ft.data=o(mt,Se)?mt:Se,Ae&&rt()&&T().onSuccess(Se,E,r)}catch(dt){Lo();let mt=T(),{shouldRetryOnError:Cn}=mt;mt.isPaused()||(Ft.error=dt,Ae&&rt()&&(mt.onError(dt,E,mt),(Cn===!0||Vt(Cn)&&Cn(dt))&&(!T().revalidateOnFocus||!T().revalidateOnReconnect||_())&&mt.onErrorRetry(dt,E,mt,Fo=>{let Po=p[E];Po&&Po[0]&&Po[0](Yn.ERROR_REVALIDATE_EVENT,Fo)},{retryCount:(yt.retryCount||0)+1,dedupe:!0})))}return Rt=!1,zr(),!0},[E,n]),Ce=(0,Ye.useCallback)((...ae)=>SA(n,Q.current,...ae),[]);if(Xi(()=>{S.current=t,k.current=r,V(pn)||(ra.current=pn)}),Xi(()=>{if(!E)return;let ae=hn.bind(je,yp),re=0;T().revalidateOnFocus&&(re=Date.now()+T().focusThrottleInterval);let Ee=x2(E,p,(Rt,yt={})=>{if(Rt==Yn.FOCUS_EVENT){let Ae=Date.now();T().revalidateOnFocus&&Ae>re&&_()&&(re=Ae+T().focusThrottleInterval,ae())}else if(Rt==Yn.RECONNECT_EVENT)T().revalidateOnReconnect&&_()&&ae();else{if(Rt==Yn.MUTATE_EVENT)return hn();if(Rt==Yn.ERROR_REVALIDATE_EVENT)return hn(yt)}});return b.current=!1,Q.current=E,y.current=!0,L({_k:w}),na&&(I[E]||(V(Yr)||Wn?ae():hp(ae))),()=>{b.current=!0,Ee()}},[E]),Xi(()=>{let ae;function re(){let Ee=Vt(l)?l(v().data):l;Ee&&ae!==-1&&(ae=setTimeout(Se,Ee))}function Se(){!v().error&&(A||T().isVisible())&&(u||T().isOnline())?hn(yp).then(re):re()}return re(),()=>{ae&&(clearTimeout(ae),ae=-1)}},[l,A,u,E]),(0,Ye.useDebugValue)(Do),i){if(!BA&&Wn&&Wr)throw new Error("Fallback data is required when using Suspense in SSR.");Wr&&(S.current=t,k.current=r,b.current=!1);let ae=x[E],re=!V(ae)&&Wr?Ce(ae):MA;if(Ip(re),!V(ko)&&Wr)throw ko;let Se=Wr?hn(yp):MA;!V(Do)&&Wr&&(Se.status="fulfilled",Se.value=!0),Ip(Se)}return{mutate:Ce,get data(){return ie.data=!0,Do},get error(){return ie.error=!0,ko},get isValidating(){return ie.isValidating=!0,vs},get isLoading(){return ie.isLoading=!0,Be}}},kW=$i.defineProperty(xp,"defaultValue",{value:vA}),vo=E2(K5);var I2=f(jo());async function y2({start:e,end:t,refName:r,session:n,assemblyName:o}){let{assemblyManager:i,rpcManager:a}=n,s=await i.waitForAssembly(o);if(!s)throw new Error("assembly not found");let c="getSequence";return(await a.call(c,"CoreGetFeatures",{adapterConfig:(0,I2.getConf)(s,["sequence","adapter"]),sessionId:c,regions:[{start:e,end:t,refName:s.getCanonicalRefName(r),assemblyName:o}]}))[0]?.get("seq")??""}var Mo={revalidateOnFocus:!1,revalidateOnReconnect:!1,revalidateIfStale:!1,refreshWhenHidden:!1,refreshWhenOffline:!1,shouldRetryOnError:!1};async function X5({feature:e,assemblyName:t,view:r}){let n=(0,w2.getSession)(r),{start:o,end:i,refName:a}=e.toJSON();return{seq:await y2({start:o,end:i,refName:a,assemblyName:t,session:n})}}function b2({view:e,feature:t}){let r=e?.assemblyNames?.[0],n=t&&r?{feature:t,assemblyName:r,view:e}:void 0,{data:o,error:i}=vo(n?[n.feature.id(),n.assemblyName,"feature-sequence"]:null,()=>X5(n),Mo);return{sequence:o,error:i}}function B2({view:e,feature:t}){let{sequence:r,error:n}=b2({view:e,feature:t});return{proteinSequence:r&&t?t2({seq:r.seq,feature:t}):"",sequence:r,error:n}}function Z5(e,t,r){if(r&&r.length>0){let n=t.find(i=>So(i)===e),o=n&&r.some(i=>gs(n,i));if(n&&!o){let i=t.find(a=>r.some(s=>gs(a,s)));return i?So(i):void 0}}}function Jr({feature:e,view:t,validIds:r}){let n=(0,_A.useMemo)(()=>jQ(e),[e]),[o,i]=(0,_A.useState)(()=>So(n[0])),a=Z5(o,n,r)??o,s=n.find(A=>So(A)===a),{proteinSequence:c,error:l}=B2({view:t,feature:s});return{options:n,selectedId:a,setSelectedId:i,selectedTranscript:s,proteinSequence:c,error:l,validIds:r}}var e3=(0,v2.makeStyles)()({textAreaFont:{fontFamily:"Courier New"},inputContainer:{marginBottom:30},fileContainer:{maxWidth:500},msaInput:{marginBottom:20},queryNameInput:{marginTop:20},warningAlert:{marginTop:10}}),t3=(0,Q2.observer)(function({model:t,feature:r,handleClose:n}){let o=(0,S2.getSession)(t),i=or(t),{classes:a}=e3(),[s,c]=(0,oe.useState)(),[l,A]=(0,oe.useState)("file"),[u,m]=(0,oe.useState)(""),[d,p]=(0,oe.useState)(""),[C,I]=(0,oe.useState)(),[x,E]=(0,oe.useState)(),[w,y]=(0,oe.useState)(""),b=Jr({feature:r,view:i}),{selectedTranscript:Q,error:S}=b;return oe.default.createElement(oe.default.Fragment,null,oe.default.createElement(Cr,{error:s??S},oe.default.createElement(ir.FormControl,{component:"fieldset"},oe.default.createElement(ir.RadioGroup,{row:!0,value:l,onChange:T=>{A(T.target.value)}},oe.default.createElement(ir.FormControlLabel,{value:"file",control:oe.default.createElement(ir.Radio,null),label:"Open files"}),oe.default.createElement(ir.FormControlLabel,{value:"text",control:oe.default.createElement(ir.Radio,null),label:"Paste text"}))),oe.default.createElement("div",{className:a.inputContainer},l==="file"?oe.default.createElement("div",{className:a.fileContainer},oe.default.createElement(bp.FileSelector,{name:"MSA File .aln (Clustal), .fa/.mfa (aligned FASTA), .stock (Stockholm), etc)",inline:!0,location:C,setLocation:I}),oe.default.createElement(bp.FileSelector,{name:"Tree file .nh (Newick) or .asn (NCBI COBALT ASN.1)",inline:!0,location:x,setLocation:E})):oe.default.createElement(oe.default.Fragment,null,oe.default.createElement(ut,{variant:"outlined",name:"MSA",multiline:!0,minRows:5,className:a.msaInput,maxRows:10,fullWidth:!0,placeholder:"Paste MSA here",value:u,onChange:T=>{m(T.target.value)}}),oe.default.createElement(ut,{variant:"outlined",name:"Tree",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,placeholder:"Paste newick tree (optional)",value:d,onChange:T=>{p(T.target.value)}}))),oe.default.createElement(xr,{feature:r,...b}),oe.default.createElement(ut,{variant:"outlined",name:"MSA row name",fullWidth:!0,required:!0,className:a.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:T=>{y(T.target.value)}}),w.trim()?null:oe.default.createElement(ir.Alert,{severity:"warning",className:a.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.")),oe.default.createElement(dn,{submitDisabled:!Q||l==="file"&&!C||l==="text"&&!u.trim(),onSubmit:()=>{try{Q&&(c(void 0),Yv({session:o,newViewTitle:Qo(Q),view:i,feature:Q,querySeqName:w.trim(),...l==="file"?{msaFilehandle:C,treeFilehandle:x}:{data:{msa:u,tree:d}}}),n())}catch(T){console.error(T),c(T)}},onCancel:n}))}),M2=t3;var Br=f(M()),eM=f(xe());$d();var tM=f(F()),rM=f(De());var de=f(M());Nl();var Yt=f(F()),H2=f(H()),j2=f(De());var tt=f(M()),N2=f(Ne());Y();var _2=f(O(),1),T2=(0,R.createSvgIcon)((0,_2.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 Ct=f(F()),L2=f(H()),R2=f(De());var Bp=f(xe());function TA({newViewTitle:e,view:t,feature:r,blastParams:n}){(0,Bp.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,connectedFeature:r.toJSON(),drawNodeBubbles:!0,colWidth:10,rowHeight:12,blastParams:n})}function k2({newViewTitle:e,view:t,cached:r}){(0,Bp.getSession)(t).addView("MsaView",{type:"MsaView",displayName:e,connectedViewId:t.id,drawNodeBubbles:!0,colWidth:10,rowHeight:12,data:{msa:r.msa,tree:r.tree,treeMetadata:r.treeMetadata}})}function kA(e){let{data:t,error:r,mutate:n}=vo(`cached-blast-${e.join(",")}`,async()=>(await JQ()).filter(s=>s.geneId&&e.includes(s.geneId)),Mo);return{results:t??[],error:r,isLoading:!t&&!r,handleDelete:async a=>{await VQ(a),await n(s=>s?.filter(c=>c.id!==a)??[],!1)},handleClearAll:async()=>{await YQ(),await n([],!1)}}}var r3=(0,R2.makeStyles)()({header:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8},resultList:{maxHeight:300,overflow:"auto"}});function D2(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 n3=(0,L2.observer)(function({model:e,handleClose:t,feature:r}){let{classes:n}=r3(),o=or(e),[i,a]=(0,tt.useState)(),s=(0,tt.useMemo)(()=>aA(r),[r]),{results:c,error:l,isLoading:A,handleDelete:u,handleClearAll:m}=kA(s),d=C=>{k2({view:o,cached:C,newViewTitle:`BLAST - ${D2(C)}`}),t()},p=l??i;return p?tt.default.createElement(N2.ErrorMessage,{error:p}):A?tt.default.createElement(Ct.Typography,null,"Loading cached results..."):c.length===0?tt.default.createElement(Ct.Typography,{color:"textSecondary"},"No cached BLAST results found for this gene. Run a BLAST query to cache results."):tt.default.createElement("div",null,tt.default.createElement("div",{className:n.header},tt.default.createElement(Ct.Typography,{variant:"subtitle1"},"Cached BLAST Results (",c.length,")"),tt.default.createElement(Ct.Button,{size:"small",color:"error",onClick:async()=>{try{a(void 0),await m()}catch(C){a(C)}}},"Clear All")),tt.default.createElement(Ct.List,{dense:!0,className:n.resultList},c.map(C=>tt.default.createElement(Ct.ListItem,{key:C.id,disablePadding:!0,secondaryAction:tt.default.createElement(Ct.IconButton,{edge:"end",size:"small",onClick:async I=>{I.stopPropagation();try{a(void 0),await u(C.id)}catch(x){a(x)}}},tt.default.createElement(T2,{fontSize:"small"}))},tt.default.createElement(Ct.ListItemButton,{onClick:()=>{d(C)}},tt.default.createElement(Ct.ListItemText,{primary:`${D2(C)} - ${C.blastDatabase}/${C.blastProgram} (${C.msaAlgorithm})`,secondary:`${new Date(C.timestamp).toLocaleString()} - Seq: ${C.proteinSequence.slice(0,30)}...`}))))))}),F2=n3;var Sp=f(M()),U2=f(F());var DA="https://blast.ncbi.nlm.nih.gov/Blast.cgi",P2=["clustalo","muscle","kalign","mafft"],O2=["nr","nr_cluster_seq"],G2=["blastp","quick-blastp"];function bs({value:e,onChange:t,className:r}){return Sp.default.createElement(ut,{variant:"outlined",label:"MSA Algorithm",className:r,select:!0,value:e,onChange:n=>{t(n.target.value)}},P2.map(n=>Sp.default.createElement(U2.MenuItem,{value:n,key:n},n)))}var o3=(0,j2.makeStyles)()({selectField:{width:150},databaseFieldContainer:{display:"flex"},clusterSeqMessage:{marginLeft:4,alignContent:"center"},cachedResultsAccordion:{marginTop:20},infoText:{marginTop:20}}),i3=(0,H2.observer)(function({handleClose:e,feature:t,model:r,children:n,baseUrl:o}){let{classes:i}=o3(),a=or(r),[s,c]=(0,de.useState)(),[l,A]=(0,de.useState)("nr"),[u,m]=(0,de.useState)("clustalo"),[d,p]=(0,de.useState)("quick-blastp"),C=(0,de.useMemo)(()=>aA(t),[t]),{results:I,error:x}=kA(C),E=Jr({feature:t,view:a}),{selectedTranscript:w,proteinSequence:y}=E,b=E.error??s??x;return de.default.createElement(de.default.Fragment,null,de.default.createElement(Cr,{error:b},n,de.default.createElement(ut,{variant:"outlined",label:"BLAST database",className:i.selectField,select:!0,value:l,onChange:Q=>{let S=Q.target.value;A(S),S==="nr_cluster_seq"&&p("blastp")}},O2.map(Q=>de.default.createElement(Yt.MenuItem,{value:Q,key:Q},Q))),de.default.createElement(bs,{className:i.selectField,value:u,onChange:m}),de.default.createElement("div",{className:i.databaseFieldContainer},de.default.createElement(ut,{variant:"outlined",label:"BLAST program",disabled:l==="nr_cluster_seq",className:i.selectField,select:!0,value:d,onChange:Q=>{p(Q.target.value)}},G2.map(Q=>de.default.createElement(Yt.MenuItem,{value:Q,key:Q},Q))),l==="nr_cluster_seq"?de.default.createElement(Yt.Typography,{variant:"subtitle2",className:i.clusterSeqMessage},"Can only use blastp on nr_cluster_seq"):null),de.default.createElement(xr,{feature:t,...E}),de.default.createElement(Yt.Typography,{className:i.infoText},"This panel will automatically submit a query to NCBI. Using blastp can take 10+ minutes to run, quick-blastp is generally a lot faster but is not available for the clustered database. After completion, all the hits will be run through a multiple sequence alignment. Note: we are not able to currently run NCBI COBALT automatically on the BLAST results, even though that is the method NCBI uses on their website. If you need a COBALT alignment, please use the manual approach of submitting BLAST yourself and downloading the resulting files"),I.length>0?de.default.createElement(Yt.Accordion,{className:i.cachedResultsAccordion},de.default.createElement(Yt.AccordionSummary,{expandIcon:de.default.createElement(Gi,null)},de.default.createElement(Yt.Typography,null,"Previous BLAST Results")),de.default.createElement(Yt.AccordionDetails,null,de.default.createElement(F2,{model:r,handleClose:e,feature:t}))):null),de.default.createElement(dn,{submitDisabled:!y,onSubmit:()=>{try{w&&(c(void 0),TA({feature:w,view:a,newViewTitle:oA(t,w),blastParams:{baseUrl:o,blastProgram:d,blastDatabase:l,msaAlgorithm:u,selectedTranscript:w,proteinSequence:y}}),e())}catch(Q){console.error(Q),c(Q)}},onCancel:e}))}),q2=i3;var Vr=f(M()),V2=f(xe()),ea=f(F()),Y2=f(H()),W2=f(De());NA();var a3=(0,W2.makeStyles)()({ncbiLink:{wordBreak:"break-all",margin:30,maxWidth:600},infoText:{marginTop:20}}),s3=(0,Y2.observer)(function({handleClose:e,feature:t,model:r,children:n,baseUrl:o}){let{classes:i}=a3(),a=or(r),s=Jr({feature:t,view:a}),{proteinSequence:c,error:l}=s,A=iA(c),u=`${o}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${A}`,m=`${o}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${(0,V2.shorten2)(A,10)}`;return Vr.default.createElement(Vr.default.Fragment,null,Vr.default.createElement(Cr,{error:l},n,Vr.default.createElement(xr,{feature:t,...s}),c?Vr.default.createElement("div",{className:i.ncbiLink},"Link to NCBI BLAST: ",Vr.default.createElement(_o,{href:u},m)):null,Vr.default.createElement(ea.Typography,{className:i.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`)),Vr.default.createElement(ea.DialogActions,null,Vr.default.createElement(ea.Button,{color:"primary",variant:"contained",onClick:()=>{e()}},"Close")))}),z2=s3;var mn=f(M()),ar=f(F());function vp({lookupMethod:e,setLookupMethod:t}){return mn.default.createElement(ar.FormControl,{component:"fieldset"},mn.default.createElement(ar.RadioGroup,{row:!0,value:e,onChange:r=>{t(r.target.value)}},mn.default.createElement(ar.FormControlLabel,{value:"automatic",control:mn.default.createElement(ar.Radio,null),label:"Automatic"}),mn.default.createElement(ar.FormControlLabel,{value:"rid",control:mn.default.createElement(ar.Radio,null),label:"Load from RID"}),mn.default.createElement(ar.FormControlLabel,{value:"manual",control:mn.default.createElement(ar.Radio,null),label:"Manual"})))}var Et=f(M()),LA=f(F()),$2=f(H()),K2=f(De());NA();var c3=(0,K2.makeStyles)()({marginBottom:{marginBottom:16},ridField:{width:150},infoText:{marginTop:20}}),l3=(0,$2.observer)(function({handleClose:e,feature:t,model:r,children:n,baseUrl:o}){let{classes:i}=c3(),a=or(r),[s,c]=(0,Et.useState)(),[l,A]=(0,Et.useState)(""),[u,m]=(0,Et.useState)("clustalo"),d=Jr({feature:t,view:a}),{selectedTranscript:p,proteinSequence:C}=d,I=d.error??s,x=l.trim();return Et.default.createElement(Et.default.Fragment,null,Et.default.createElement(Cr,{error:I},n,Et.default.createElement(LA.Typography,{variant:"body2",className:i.marginBottom},"Enter the RID (Request ID) from a previously submitted NCBI BLAST query. You can find the RID in the BLAST results page URL or at the top of the results page. RIDs are typically valid for 24-36 hours after submission."),Et.default.createElement(ut,{variant:"outlined",label:"BLAST RID",placeholder:"e.g., ABC12345",fullWidth:!0,className:i.marginBottom,value:l,onChange:E=>{A(E.target.value)}}),x?Et.default.createElement(LA.Typography,{variant:"body2",className:i.marginBottom},Et.default.createElement(_o,{href:`${o}?CMD=Get&RID=${x}`},"View BLAST results on NCBI")):null,Et.default.createElement(bs,{className:i.ridField,value:u,onChange:m}),Et.default.createElement(xr,{feature:t,...d}),Et.default.createElement(LA.Typography,{className:i.infoText},"This will fetch the BLAST results for the provided RID and run them through a multiple sequence alignment. The protein sequence from the selected transcript will be added as the query sequence in the MSA.")),Et.default.createElement(dn,{submitDisabled:!C||!x,onSubmit:()=>{try{p&&x&&(c(void 0),TA({feature:p,view:a,newViewTitle:oA(t,p),blastParams:{baseUrl:o,blastProgram:"blastp",blastDatabase:"nr",msaAlgorithm:u,selectedTranscript:p,proteinSequence:C,rid:x}}),e())}catch(E){console.error(E),c(E)}},onCancel:e}))}),X2=l3;var br=f(M()),sr=f(F()),Z2=f(De());var A3=(0,Z2.makeStyles)()({urlField:{minWidth:300}});function Mp({handleClose:e,baseUrl:t}){let{classes:r}=A3(),[n,o]=(0,br.useState)(t);return br.default.createElement(sr.Dialog,{open:!0,maxWidth:"lg",onClose:()=>{e()}},br.default.createElement(sr.DialogTitle,null,"BLAST Settings"),br.default.createElement(sr.DialogContent,null,br.default.createElement(ut,{autoFocus:!0,margin:"dense",label:"BLAST Base URL",fullWidth:!0,variant:"outlined",value:n,className:r.urlField,onChange:i=>{o(i.target.value)}}),br.default.createElement(sr.Button,{variant:"contained",onClick:()=>{o(DA)}},"Reset")),br.default.createElement(sr.DialogActions,null,br.default.createElement(sr.Button,{variant:"contained",color:"secondary",onClick:()=>{e()}},"Cancel"),br.default.createElement(sr.Button,{color:"primary",variant:"contained",onClick:()=>{e(n)}},"Save")))}var u3=(0,rM.makeStyles)()({settingsButton:{float:"right"}}),f3={automatic:q2,rid:X2,manual:z2};function _p({handleClose:e,model:t,feature:r}){let[n,o]=(0,Br.useState)("automatic"),[i,a]=(0,eM.useLocalStorage)("msa-blastRootUrl",DA),[s,c]=(0,Br.useState)(!1),{classes:l}=u3(),A=f3[n];return Br.default.createElement(Br.default.Fragment,null,Br.default.createElement(tM.IconButton,{className:l.settingsButton,size:"small",onClick:()=>{c(!0)}},Br.default.createElement(xl,null)),Br.default.createElement(A,{model:t,feature:r,handleClose:e,baseUrl:i},Br.default.createElement(vp,{lookupMethod:n,setLookupMethod:o})),s?Br.default.createElement(Mp,{baseUrl:i,handleClose:u=>{u&&a(u),c(!1)}}):null)}var xt=f(M()),Bs=f(Ne()),FA=f(xe()),AM=f(F()),uM=f(H());var fM=f(De());Sn();function Tp(e,t="",r=5e3){let n=[e];for(;n.length;){let o=n.pop();for(let[i,a]of Object.entries(o)){if(t.length>r)return Td(t);typeof a=="object"&&a!==null?n.push(a):i==="locationType"&&a==="FileHandleLocation"?t+=`${i}-BlobLocation`:i==="handleId"?t+=`blobId-fh-blob-${a}`:t+=`${i}-${a}`}}return`adp-${Td(t)}`}function nM(e={}){return e.type&&e.adapterId?`${e.type}-${e.adapterId}`:`${Tp(e)}`}var oM={};async function d3(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}),a=kp.bind(null,e,t),s=await o.getAdapterClass();return{dataAdapter:new s(i,a,e),sessionIds:new Set([t])}}async function kp(e,t,r){let n=nM(r);oM[n]??=d3(e,t,r);let o=await oM[n];return o.sessionIds.add(t),o}async function iM(e,t){return(await kp(e,"msa",t)).dataAdapter}async function aM({config:e,pluginManager:t}){return(await iM(t,e)).getMSAList()}async function sM({config:e,pluginManager:t,msaId:r}){return(await iM(t,e)).getMSA(r)}function cM({session:e,newViewTitle:t,view:r,feature:n,data:o,querySeqName:i}){e.addView("MsaView",{type:"MsaView",displayName:t,treeAreaWidth:200,querySeqName:i,treeWidth:100,drawNodeBubbles:!1,labelsAlignRight:!0,showBranchLen:!1,colWidth:10,rowHeight:12,colorSchemeName:"percent_identity_dynamic",data:o,connectedViewId:r.id,connectedFeature:n.toJSON()})}var lM=f(jo());function RA(e){return(0,lM.readConfObject)(e,["msa","datasets"])}var m3=(0,fM.makeStyles)()({selectedContainer:{marginTop:50}}),p3=(0,uM.observer)(function({model:e,feature:t,handleClose:r}){let n=(0,FA.getSession)(e),o=or(e),{classes:i}=m3(),{pluginManager:a}=(0,FA.getEnv)(e),{assemblyNames:s}=o,[c,l]=(0,xt.useState)(),A=RA(n.jbrowse),[u,m]=(0,xt.useState)(A?.[0]?.datasetId),d=A?.find(k=>k.datasetId===u),{data:p,isLoading:C,error:I}=vo(d?`${d.datasetId}-msa-list`:null,()=>aM({config:d.adapter,pluginManager:a}),Mo),x=Jr({feature:t,view:o,validIds:p}),{selectedId:E,selectedTranscript:w}=x,{data:y,isLoading:b,error:Q}=vo(E&&d&&p?`${d.datasetId}-${E}-${p.length}-msa`:null,()=>sM({msaId:E,config:d.adapter,pluginManager:a}),Mo),S=I??Q??x.error??c;return xt.default.createElement(xt.default.Fragment,null,xt.default.createElement(Cr,{error:S},xt.default.createElement(ut,{select:!0,label:"Select MSA dataset",value:u,onChange:k=>{m(k.target.value)}},A?.map(k=>xt.default.createElement(AM.MenuItem,{key:k.datasetId,value:k.datasetId},k.name))),d?xt.default.createElement("div",{className:i.selectedContainer},!C&&b?xt.default.createElement(Bs.LoadingEllipses,{variant:"h6",message:`Loading MSA for (${E})`}):null,C?xt.default.createElement(Bs.LoadingEllipses,{variant:"h6",message:`Loading available MSAs for (${d.name})`}):null,p?xt.default.createElement("div",null,xt.default.createElement(Bs.SanitizedHTML,{html:d.description}),xt.default.createElement(xr,{feature:t,...x})):null):null),xt.default.createElement(dn,{submitDisabled:!w||!y?.length,onSubmit:()=>{try{if(w&&y){let k=`${E}_${s[0]}`;cM({session:n,newViewTitle:Qo(w),view:o,querySeqName:k,feature:w,data:{msa:y.map(T=>`>${T.get("refName")}
|
|
75
75
|
${T.get("seq")}`).join(`
|
|
76
|
-
`)}}),r()}}catch(k){l(k)}},onCancel:r}))}),dM=p3;var mM=f(M());function Ss({children:e,value:t,index:r,...n}){return mM.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r?e:null)}function Dp({handleClose:e,feature:t,model:r}){let n=(0,gM.getSession)(r),i=!!RA(n.jbrowse)?.length,[a,s]=(0,Lt.useState)("ncbi_blast");return Lt.default.createElement(pM.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},Lt.default.createElement(ta.Tabs,{value:a,onChange:(c,l)=>{s(l)}},Lt.default.createElement(ta.Tab,{label:"NCBI BLAST query",value:"ncbi_blast"}),i?Lt.default.createElement(ta.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,Lt.default.createElement(ta.Tab,{label:"Manual upload",value:"manual_msa"})),Lt.default.createElement(Ss,{value:a,index:"ncbi_blast"},Lt.default.createElement(_p,{handleClose:e,feature:t,model:r})),i?Lt.default.createElement(Ss,{value:a,index:"preloaded_msa"},Lt.default.createElement(dM,{model:r,feature:t,handleClose:e})):null,Lt.default.createElement(Ss,{value:a,index:"manual_msa"},Lt.default.createElement(M2,{model:r,feature:t,handleClose:e})))}function g3(e){return e.name==="LinearBasicDisplay"}function h3(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=t.contextMenuFeature,o=(0,PA.getContainingTrack)(t),i=n?.get("type"),a=n&&["gene","mRNA","transcript"].includes(i);return[...r(),...a?[{label:"Launch MSA view",icon:Vv,onClick:()=>{(0,PA.getSession)(o).queueDialog(s=>[Dp,{model:o,handleClose:s,feature:n}])}}]:[]]}}})}function Np(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(g3(t)&&(t.stateModel=h3(t.stateModel)),t))}function Lp(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,data:n,msaFileLocation:o,msaIndexedLocation:i,msaName:a,treeFileLocation:s,querySeqName:c,...l}=t;if(!n&&!o&&!i)throw new Error("No MSA data or file location provided when launching MSA view");return r.addView("MsaView",{type:"MsaView",...l,data:n,...s?{treeFilehandle:{...s,locationType:"UriLocation"}}:{},init:{msaUrl:o?.uri,msaIndexedLocation:i,msaName:a,querySeqName:c}}),t})}var DM=f(M()),NM=f(CM());var B3=(0,DM.lazy)(()=>Promise.resolve().then(()=>(kM(),TM)));function Op(e){e.addViewType(()=>new NM.default({name:"MsaView",stateModel:Xm(),ReactComponent:B3}))}var LM="2.6.
|
|
76
|
+
`)}}),r()}}catch(k){l(k)}},onCancel:r}))}),dM=p3;var mM=f(M());function Ss({children:e,value:t,index:r,...n}){return mM.default.createElement("div",{role:"tabpanel",hidden:t!==r,...n},t===r?e:null)}function Dp({handleClose:e,feature:t,model:r}){let n=(0,gM.getSession)(r),i=!!RA(n.jbrowse)?.length,[a,s]=(0,Lt.useState)("ncbi_blast");return Lt.default.createElement(pM.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},Lt.default.createElement(ta.Tabs,{value:a,onChange:(c,l)=>{s(l)}},Lt.default.createElement(ta.Tab,{label:"NCBI BLAST query",value:"ncbi_blast"}),i?Lt.default.createElement(ta.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,Lt.default.createElement(ta.Tab,{label:"Manual upload",value:"manual_msa"})),Lt.default.createElement(Ss,{value:a,index:"ncbi_blast"},Lt.default.createElement(_p,{handleClose:e,feature:t,model:r})),i?Lt.default.createElement(Ss,{value:a,index:"preloaded_msa"},Lt.default.createElement(dM,{model:r,feature:t,handleClose:e})):null,Lt.default.createElement(Ss,{value:a,index:"manual_msa"},Lt.default.createElement(M2,{model:r,feature:t,handleClose:e})))}function g3(e){return e.name==="LinearBasicDisplay"}function h3(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=t.contextMenuFeature,o=(0,PA.getContainingTrack)(t),i=n?.get("type"),a=n&&["gene","mRNA","transcript"].includes(i);return[...r(),...a?[{label:"Launch MSA view",icon:Vv,onClick:()=>{(0,PA.getSession)(o).queueDialog(s=>[Dp,{model:o,handleClose:s,feature:n}])}}]:[]]}}})}function Np(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(g3(t)&&(t.stateModel=h3(t.stateModel)),t))}function Lp(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,data:n,msaFileLocation:o,msaIndexedLocation:i,msaName:a,treeFileLocation:s,querySeqName:c,...l}=t;if(!n&&!o&&!i)throw new Error("No MSA data or file location provided when launching MSA view");return r.addView("MsaView",{type:"MsaView",...l,data:n,...s?{treeFilehandle:{...s,locationType:"UriLocation"}}:{},init:{msaUrl:o?.uri,msaIndexedLocation:i,msaName:a,querySeqName:c}}),t})}var DM=f(M()),NM=f(CM());var B3=(0,DM.lazy)(()=>Promise.resolve().then(()=>(kM(),TM)));function Op(e){e.addViewType(()=>new NM.default({name:"MsaView",stateModel:Xm(),ReactComponent:B3}))}var LM="2.6.6";var UA=class extends RM.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=LM;this.rootConfigurationSchema=r=>({msa:(0,Gp.ConfigurationSchema)("MSA",{datasets:Up.types.maybe(Up.types.array((0,Gp.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Op(r),Np(r),Lp(r),rp(r),op(r)}configure(r){(0,FM.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:pg,onClick:n=>{n.addView("MsaView",{})}})}};return i_(S3);})();
|
|
77
77
|
/*! Bundled license information:
|
|
78
78
|
|
|
79
79
|
react-is/cjs/react-is.production.min.js:
|