jbrowse-plugin-msaview 3.7.1 → 3.8.0

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.
@@ -6,6 +6,9 @@ export interface ContextMenuInfo {
6
6
  featureId: string;
7
7
  type?: string;
8
8
  };
9
+ subfeature?: {
10
+ featureId: string;
11
+ };
9
12
  displayedRegionIndex: number;
10
13
  }
11
14
  export interface DisplayModel {
@@ -38,6 +38,7 @@ export function launchTarget(self) {
38
38
  return isGeneLikeType(info.item.type)
39
39
  ? {
40
40
  fetchFeature: () => fetchFullFeature(info.item.featureId, info.displayedRegionIndex),
41
+ preferredTranscriptId: info.subfeature?.featureId,
41
42
  }
42
43
  : undefined;
43
44
  }
@@ -108,6 +108,19 @@ describe('launchTarget', () => {
108
108
  // the choice is ever stated
109
109
  expect(target?.preferredTranscriptId).toBe(mrna.id());
110
110
  });
111
+ // the canvas host names the clicked isoform beside the gene it fetches, as
112
+ // its own Collapse introns dialog reads it
113
+ test('carries the isoform a canvas click landed on', () => {
114
+ const host = modernHost('gene');
115
+ const target = launchTarget({
116
+ ...host,
117
+ contextMenuInfo: {
118
+ ...host.contextMenuInfo,
119
+ subfeature: { featureId: 'mrna-2' },
120
+ },
121
+ });
122
+ expect(target?.preferredTranscriptId).toBe('mrna-2');
123
+ });
111
124
  // a host that has both shapes must not fall through to the legacy branch and
112
125
  // launch on a stale feature when the click was not on a gene
113
126
  test('a non-gene click on a host carrying both shapes offers nothing', () => {
@@ -1016,10 +1016,6 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
1016
1016
  * #action
1017
1017
  */
1018
1018
  setQuerySeqName(arg: string): void;
1019
- /**
1020
- * #action
1021
- */
1022
- setQuerySeqOffset(arg: number): void;
1023
1019
  /**
1024
1020
  * #action
1025
1021
  */
@@ -1032,10 +1028,6 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
1032
1028
  * #action
1033
1029
  */
1034
1030
  setLaunchCompleted(arg: boolean): void;
1035
- /**
1036
- * #action
1037
- */
1038
- setMafRegion(arg?: MafRegion): void;
1039
1031
  /**
1040
1032
  * #action
1041
1033
  */
@@ -269,12 +269,6 @@ export default function stateModelFactory() {
269
269
  setQuerySeqName(arg) {
270
270
  self.querySeqName = arg;
271
271
  },
272
- /**
273
- * #action
274
- */
275
- setQuerySeqOffset(arg) {
276
- self.querySeqOffset = arg;
277
- },
278
272
  /**
279
273
  * #action
280
274
  */
@@ -293,12 +287,6 @@ export default function stateModelFactory() {
293
287
  setLaunchCompleted(arg) {
294
288
  self.launchCompleted = arg;
295
289
  },
296
- /**
297
- * #action
298
- */
299
- setMafRegion(arg) {
300
- self.mafRegion = arg;
301
- },
302
290
  /**
303
291
  * #action
304
292
  */
@@ -91,11 +91,11 @@ ${r??t}`,...a].join(`
91
91
  ${C}`,...b.map(v=>`>${v.label}
92
92
  ${v.sequence}`)].join(`
93
93
  `),onProgress:f,signal:d}),treeMetadata:JSON.stringify(x)}}async function ore({taxId:e,geneCandidates:t,onProgress:r,...n}){r("Resolving gene at NCBI...");let o=await b4(t,e);if(!o)throw new Error(`Could not resolve any of ${t.join(", ")} to an NCBI gene in taxon ${e}. Try the NCBI BLAST tab, which needs no gene identifier.`);let i=await lre(o.geneId),s=await w4({geneId:o.geneId,onProgress:r,...n});return{geneId:o.geneId,representative:i,rows:s}}var ire={ncbi:"NCBI",panther:"PANTHER",uniref:"UniProt"};async function sre({geneCandidates:e,identity:t,referenceProteomesOnly:r,signal:n,...o}){let i=await v4({candidates:e,identity:t,referenceProteomesOnly:r,signal:n,...o});return{geneId:i.query.id,representative:{accession:i.query.accession,sequence:i.query.sequence},rows:i.rows}}async function are({geneCandidates:e,...t}){let r=await _4({candidates:e,...t});return{geneId:r.query?.geneRef??r.matched,representative:r.query,rows:r.rows}}async function cre(e,t){let r;try{let n=(await ii([e])).get(e);r=n?.commonName??n?.sciname}catch(n){console.warn("[msaview-orthologs] taxonomy name lookup failed:",n)}return xs([...t.map(n=>n.label),`${r??"query"}_query`]).at(-1)}async function lre(e){try{return await E4(e)}catch(t){console.warn("[msaview-orthologs] query protein lookup failed:",t);return}}function ure(e,t,r,n){let o={"Gene ID":t},i=VA(e.orthologParams?.selectedTranscript);return i&&(o.Transcript=i),n?.sequence===r&&(o.Accession=n.accession),o}function fre(e){let t={"Scientific name":e.scientificName,Accession:e.protein,"Gene ID":e.geneId};return e.commonName&&(t["Common name"]=e.commonName),t}l6();var f6=g(CA());async function d6({location:e,name:t}){let r=i=>(0,f6.openLocation)({uri:i,locationType:"UriLocation"}),n=await r(`${e.uri}.idx`).readFile("utf8"),o=ene(n,t);if(o){let s=await new _c({filehandle:r(e.uri),gziFilehandle:r(`${e.uri}.gzi`)}).read(o.length,o.offset);return new TextDecoder().decode(s).trim()}}var u6=e=>e.replace(/\.\d+$/,"");function ene(e,t){let r=u6(t);for(let n of e.split(`
94
- `)){let[o,i,s]=n.split(" ");if(o&&u6(o)===r)return{offset:Number(i),length:Number(s)}}}var m6=g(Ve());function p6({model:e}){let{assemblyManager:t,hovered:r}=(0,m6.getSession)(e),{transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Es(r)||!$A(e))return;let{coord:s,refName:a}=r.hoverPosition,l=s-1,c=t.get(i?.assemblyName??o.assemblyNames[0]??""),u=m=>(c?.initialized?c.getCanonicalRefName(m):void 0)??m,f=u(a);if(i)return f!==u(i.refName)||!o.assemblyNames.includes(i.assemblyName)||l<i.start||l>=i.end?void 0:_E(e,l-i.start);if(n&&f===u(n.refName)){let m=n.g2p[l];if(m!==void 0)return jA(e,m)}}var tne="jbrowse-msaview-domain-cache",ig="domains",rne=1,A6=ni(tne,rne,e=>{e.objectStoreNames.contains(ig)||e.createObjectStore(ig,{keyPath:"accession"})});function g6(e){return oi("domain cache read",async()=>{let r=(await A6()).transaction(ig,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n},[])}function h6(e){return oi("domain cache write",async()=>{let r=(await A6()).transaction(ig,"readwrite");for(let n of e)await r.store.put(n);await r.done},void 0)}function ui(e,t){let r=new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(e)?.[1];return r===void 0?void 0:Zu(r)}function nne(e){let t={},r=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=r.exec(e))!==null;){let o=ui(n[1],"GBQualifier_name"),i=ui(n[1],"GBQualifier_value");o&&i!==void 0&&t[o]===void 0&&(t[o]=i)}return t}function one(e){let t=[],r=[],n=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,o;for(;(o=n.exec(e))!==null;){let i=o[1],s=ui(i,"GBInterval_from"),a=ui(i,"GBInterval_to"),l=ui(i,"GBInterval_point");s&&a?(t.push(Number(s)),r.push(Number(a))):l&&(t.push(Number(l)),r.push(Number(l)))}return t.length>0?{start:Math.min(...t),end:Math.max(...r)}:void 0}var ine=2;function sne(e){let t=ui(e,"GBFeature_key"),r=nne(e),n=r.db_xref,o=one(e);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&o&&o.end-o.start+1>=ine){let i=n.replace("CDD:",""),s=t==="Region",a=r.note?.split(/[[(]/)[0]?.trim(),l=s?r.region_name??i:a||r.site_type||"site",c=s?i:`${i}:${l}`;return{signature:{entry:{name:l,description:r.note??l,accession:c}},locations:[o]}}}function ane(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 l=sne(a[1]);l&&i.push(l)}for(let l of[ui(o,"GBSeq_accession-version"),ui(o,"GBSeq_primary-accession")])l&&t.set(l,i)}return t}async function y6(e){let t=[...new Set(e)].filter(Boolean),r=new Map,n=await g6(t),o=[];t.forEach((a,l)=>{let c=n[l];c?r.set(a,c.matches):o.push(a)});let i=[],s=100;for(let a=0;a<o.length;a+=s){let l=o.slice(a,a+s),c=await Cs(vc({db:"protein",id:l.join(","),rettype:"gp",retmode:"xml"})),u=ane(c);for(let f of l){let m=u.get(f);m!==void 0&&(r.set(f,m),i.push({accession:f,matches:m}))}}return i.length>0&&await h6(i),r}async function b6(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 y6(n.map(s=>s.accession)),i=n.flatMap(({rowName:s,accession:a})=>(o.get(a)??[]).flatMap(({signature:l,locations:c})=>l.entry?c.map(({start:u,end:f})=>({id:s,accession:l.entry.accession,name:l.entry.name,description:l.entry.description,start:u,end:f})):[]));if(i.length===0)throw new Error("No CDD domain annotations found for these proteins");e.setAnnotations(i)}var cne="jbrowse-msaview-data",lne=1,vs="msa-data",sg=ni(cne,lne,e=>{e.objectStoreNames.contains(vs)||e.createObjectStore(vs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})});function C6(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function x6(e,t){try{let r=await sg(),n={...t,id:e,timestamp:Date.now()};return await r.put(vs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function E6(e){try{let t=await sg(),r=await t.get(vs,e);if(!r)return;try{await t.put(vs,{...r,timestamp:Date.now()})}catch(s){console.warn("Failed to refresh MSA data timestamp:",s)}let{id:n,timestamp:o,...i}=r;return i}catch(t){console.warn("Failed to retrieve MSA data:",t);return}}async function w6(e){try{await(await sg()).delete(vs,e)}catch(t){console.warn("Failed to delete MSA data:",t)}}async function S6(e=10080*60*1e3){try{let t=await sg(),r=Date.now()-e,i=await t.transaction(vs,"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}}var I6=g(Ve()),v6=g(Hr());mo();function une(e){if(!(e.rows.length<2))try{e.calculateNeighborJoiningTreeFromMSA()}catch(t){console.error(t);try{(0,I6.getSession)(e).notify(`The alignment loaded, but no tree was built. ${t instanceof Error?t.message:String(t)}`,"warning")}catch(r){console.error(r)}}}function sw(e){(0,v6.untracked)(()=>{fne(e)})}function fne({self:e,message:t,launch:r,onLaunched:n}){e.launchController?.abort();let o=new AbortController,{signal:i}=o;e.setLaunchController(o);let s=l=>{i.aborted||l()},a={signal:i,act:s,onProgress:l=>{s(()=>{e.setProgress(l)})},onRid:l=>{s(()=>{e.setRid(l)})}};(async()=>{try{s(()=>{e.setProgress(t),e.setError(void 0)});let l=await r(a);s(()=>{e.setData(l),n()}),l.tree||s(()=>{une(e)})}catch(l){PA(l)||(s(()=>{e.setError(l)}),console.error(l))}finally{s(()=>{e.setProgress(""),e.launchController===o&&e.setLaunchController(void 0)})}})()}function dne(e){let t=e;return t.type==="ProteinView"&&Array.isArray(t.structures)}function B6(e){return e.filter(dne)}var mne="This view's alignment is no longer in browser storage. Stored alignments are kept for 7 days after they were last used, and are lost when site data is cleared.",pne=" Retry runs the original search again and rebuilds it.",Ane=" Relaunch it from the gene to rebuild it.";function R6(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await E6(t);n?(0,ag.transaction)(()=>{n.msa&&e.setMSA(n.msa),n.tree&&e.setTree(n.tree),n.treeMetadata&&e.setTreeMetadata(n.treeMetadata),n.gff&&e.setGFF(n.gff),e.setLastStoredData(k6(e))}):(0,ag.transaction)(()=>{e.setDataStoreId(void 0),e.setError(new Error(mne+(e.blastParams??e.orthologParams?pne:Ane)))})}catch(n){console.error("Failed to load MSA data from IndexedDB:",n)}finally{e.setLoadingStoredData(!1)}})()}function k6(e){let{msa:t,tree:r,treeMetadata:n,gff:o}=e.data;return{msa:t,tree:r,treeMetadata:n,gff:o}}function gne(e,t){return!!e&&e.msa===t.msa&&e.tree===t.tree&&e.treeMetadata===t.treeMetadata&&e.gff===t.gff}function Q6(e){let{rows:t,dataStoreId:r,isStoringData:n,lastStoredData:o,init:i}=e,s=k6(e);t.length===0||n||e.msaFilehandle||e.treeFilehandle||i?.msaIndexedLocation||!(s.msa||s.tree)||gne(o,s)||(e.setIsStoringData(!0),(async()=>{try{let a=r??C6();await x6(a,s)&&e.setDataStoreId(a)}catch(a){console.error("Failed to store MSA data to IndexedDB:",a)}finally{(0,ag.transaction)(()=>{e.setLastStoredData(s),e.setIsStoringData(!1)})}})())}function _6(e){e.orthologParams&&!e.launchCompleted&&!D6(e)&&sw({self:e,message:"Resolving orthologs",launch:t=>D4({self:e,scope:t}),onLaunched:()=>{e.setLaunchCompleted(!0)}})}function D6(e){return!!e.connectedTranscript&&!e.connectedFeature}function N6(e){e.blastParams&&!e.launchCompleted&&!D6(e)&&sw({self:e,message:"Submitting query",launch:t=>M4({self:e,scope:t}),onLaunched:()=>{e.setLaunchCompleted(!0)}})}function L6(e){let{rows:t,domainsRequested:r,annotations:n}=e,o=e.data.treeMetadata?.includes('"Accession"')??!1;t.length>0&&o&&n.length===0&&!r&&(e.setDomainsRequested(!0),(async()=>{try{await b6(e)}catch(i){console.error("[msaview-domains] auto-load failed:",i)}finally{e.setProgress("")}})())}function F6(e){let{init:t}=e;if(t){let{msaUrl:r,msaIndexedLocation:n,msaName:o,querySeqName:i}=t,s=!!(n&&o);if(s&&e.data.msa)return;(async()=>{try{if(e.setError(void 0),r){let a=T4(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 d6({location:n,name:o});if(a)e.setMSA(a);else throw new Error(`No alignment named ${o} in ${n.uri}`)}s||e.setInit(void 0)}catch(a){e.setError(a),console.error(a)}})()}}function P6(e){let t=!1;return()=>{let r=p6({model:e});r!==void 0?(e.setMousePos(r),t=!0):t&&(e.setMousePos(void 0),t=!1)}}function T6(e,t){let{connectedViewId:r,transcriptToMsaMap:n}=e;if(!n||!$A(e))return[];let{g2p:o}=n,i=new Set;for(let s of B6((0,M6.getSession)(e).views))for(let a of s.structures)if(a.connectedViewId===r)for(let l of a[t]??[])for(let c=l.start;c<l.end;c++){let u=o[c],f=u===void 0?void 0:jA(e,u);f!==void 0&&i.add(f)}return[...i]}function hne(e,t){return!e||!t?e===t:e.length===t.length&&e.every((r,n)=>r===t[n])}function O6(e){let t;return()=>{let{connectedViewId:r,transcriptToMsaMap:n}=e;if(!r||!n)return;let o=T6(e,"hoverGenomeHighlights"),i=o.length?[]:T6(e,"clickGenomeHighlights"),s=e.highlightColumns??[],a=o.length?o:i.length?i:s,l=a.length>0?a:void 0;hne(t,l)||(t=l,e.setHighlightedColumns(l))}}function G6(){S6().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}function cg({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,i=e.visibleColToSeqPos(r,t);if(i===void 0)return[];if(o){let s=o.start+i;return s<o.end?[{refName:o.refName,start:s,end:s+1}]:[]}if(n){let{refName:s,p2gCodon:a}=n,l=i+(e.querySeqOffset??0);return lB(a,l)?.map(([c,u])=>({refName:s,start:c,end:u}))??[]}return[]}function H6(e){let t=cg(e),r=t[0],n=t.at(-1);return r&&n?{refName:r.refName,start:r.start,end:n.end}:void 0}var Y6=g(Ai()),cw=g(Ve()),J6=g(Rt()),fg=g(Hr());var j6=g(Ve());$6();f_();function Cne({cds:e,sequence:t,geneticCodeId:r,translExcept:n}){let{codonTable:o,starts:i}=bC(r);return U6({cds:e,sequence:t,codonTable:o,starts:i,translExcept:n})}function V6(e){return`${e.start}-${e.end}`}function xne(e){return e.filter((t,r,n)=>!r||V6(t)!==V6(n[r-1]))}function Ene(e,t){return e.map(r=>({...r,start:t-r.end,end:t-r.start})).toSorted((r,n)=>r.start-n.start)}function lg({feature:e,seq:t,assemblyGeneticCodeId:r}){let{subfeatures:n,start:o,end:i,strand:s}=e.toJSON(),a=xne(n?.toSorted((f,m)=>f.start-m.start).map(f=>({...f,start:f.start-o,end:f.end-o})).filter(f=>f.type==="CDS")??[]),l=e.get("subfeatures")?.find(f=>f.get("type")?.toLowerCase()==="cds"),c=yC(e.get("transl_table"))??yC(l?.get("transl_table"))??r,u=e.get("transl_except")??l?.get("transl_except");return Cne({cds:s===-1?Ene(a,t.length):a,sequence:s===-1?(0,j6.revcom)(t):t,geneticCodeId:c,translExcept:u?l_({raw:u,featureStart:o,featureLength:i-o,strand:s}):void 0})}var W6=g(Ai());async function ug({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 l="getSequence",c={adapterConfig:(0,W6.getConf)(a,["sequence","adapter"]),sessionId:l,regions:[{start:e,end:t,refName:a.getCanonicalRefName(r)??r,assemblyName:o}]};return{seq:(await s.call(l,"CoreGetFeatures",c))[0]?.get("seq")??"",assemblyGeneticCodeId:wne(a,r)}}function wne(e,t){return e.getGeneticCodeId?.(t)}function q6(e){return e.replace(/\.\d+$/,"")}function Sne(e,t){let r=q6(t);return[e.get("name"),e.get("id"),e.get("transcript_id"),e.id()].some(n=>typeof n=="string"&&(n===t||q6(n)===r))}function z6(e){return e.map(t=>({assemblyName:t.assemblyName,refName:t.refName,start:Math.floor(t.start),end:Math.ceil(t.end)}))}function Ine(e){let t=z6(e.dynamicBlocks?.contentBlocks??[]),r=z6(e.displayedRegions);return t.length>0?[t,r]:[r]}function K6(e){return e.filter(t=>t.type==="FeatureTrack")}async function vne(e,t){let r=e.connectedView,n=(0,cw.getSession)(e),o="msaview-connectedTranscript",i=K6(r.tracks);for(let s of Ine(r))for(let a of i){let l={adapterConfig:(0,Y6.getConf)(a,"adapter"),sessionId:o,regions:s},c=await n.rpcManager.call(o,"CoreGetFeatures",l);for(let u of c){let f=gE(u).find(m=>Sne(m,t));if(f)return f}}}async function Bne(e,t){let{start:r,end:n,refName:o}=t.toJSON(),i=e.connectedView.assemblyNames[0],{seq:s,assemblyGeneticCodeId:a}=await ug({start:r,end:n,refName:o,assemblyName:i,session:(0,cw.getSession)(e)});return lg({seq:s,feature:t,assemblyGeneticCodeId:a})}var aw=new WeakMap;async function Tne({self:e,transcriptId:t,blastParams:r,orthologParams:n,isCurrent:o}){let i=K6(e.connectedView.tracks).length;try{e.setProgress(`Looking up ${t} in the genome view...`);let s=await vne(e,t);if(!s)throw new Error(`Transcript "${t}" was not found in the ${i} feature track(s) open in the connected genome view. Open the gene track that carries it, and make sure the view is on its locus.`);let a=await Bne(e,s);if(!a)throw new Error(`Transcript "${t}" has no CDS to translate`);if(!o())return;let l=s.toJSON();(0,fg.transaction)(()=>{e.setProgress(""),r&&!r.proteinSequence&&e.setBlastParams({...r,selectedTranscript:l,proteinSequence:a}),n&&!n.proteinSequence&&e.setOrthologParams({...n,selectedTranscript:l,proteinSequence:a}),e.setConnectedFeature(l)})}catch(s){console.error(s),o()&&(e.setProgress(""),e.setError(s))}}function X6(e){let{connectedTranscript:t,connectedFeature:r,connectedView:n,blastParams:o,orthologParams:i}=e;if(!t||r||!n?.initialized||n.tracks.length===0)return;let s=(aw.get(e)??0)+1;aw.set(e,s),(0,fg.untracked)(()=>{Tne({self:e,transcriptId:t,blastParams:o,orthologParams:i,isCurrent:()=>(0,J6.isAlive)(e)&&aw.get(e)===s})})}function lw(){return Ke.types.compose(Z6.BaseViewModel,vA(),Ke.types.model("MsaView",{connectedViewId:Ke.types.maybe(Ke.types.string),connectedFeature:Ke.types.frozen(),connectedTranscript:Ke.types.maybe(Ke.types.string),blastParams:Ke.types.frozen(),orthologParams:Ke.types.frozen(),querySeqName:"QUERY",querySeqOffset:0,uniprotId:Ke.types.maybe(Ke.types.string),zoomToBaseLevel:!1,init:Ke.types.frozen(),dataStoreId:Ke.types.maybe(Ke.types.string),launchCompleted:!1,mafRegion:Ke.types.frozen()})).volatile(()=>({rid:void 0,progress:"",loadingStoredData:!1,isStoringData:!1,lastStoredData:void 0,launchController:void 0,domainsRequested:!1})).views(e=>({get transcriptToMsaMap(){return e.connectedFeature?cB(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,e8.getSession)(e);return t.find(r=>r.id===e.connectedViewId)}})).views(e=>({get connectedHoverHighlights(){let{mouseCol:t}=e;return t===void 0?[]:cg({model:e,coord:t})},get connectedClickHighlights(){let{mouseClickCol:t}=e;return t===void 0?[]:cg({model:e,coord:t})},get connectedHighlights(){return[...this.connectedHoverHighlights,...this.connectedClickHighlights]}})).views(e=>({get hostRestoresData(){let{msaIndexedLocation:t,msaName:r}=e.init??{};return e.hostCarriesData||!!(t&&r)}})).actions(e=>({setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setProgress(t){e.progress=t},setRid(t){e.rid=t},setBlastParams(t){e.blastParams=t},setConnectedFeature(t){e.connectedFeature=t},setOrthologParams(t){e.orthologParams=t},setInit(t){e.init=t},setQuerySeqName(t){e.querySeqName=t},setQuerySeqOffset(t){e.querySeqOffset=t},setUniprotId(t){e.uniprotId=t},setDataStoreId(t){e.dataStoreId=t},setLaunchCompleted(t){e.launchCompleted=t},setMafRegion(t){e.mafRegion=t},setLoadingStoredData(t){e.loadingStoredData=t},setIsStoringData(t){e.isStoringData=t},setLastStoredData(t){e.lastStoredData=t},setLaunchController(t){e.launchController=t},cancelLaunch(){e.launchController?.abort(),e.launchController=void 0,e.blastParams=void 0,e.orthologParams=void 0,e.init=void 0,e.launchCompleted=!1,e.progress="",e.rid=void 0,e.error=void 0},retryLaunch(){e.launchController?.abort(),e.launchController=void 0,e.progress="",e.rid=void 0,e.error=void 0,e.launchCompleted=!1,e.blastParams&&(e.blastParams={...e.blastParams}),e.orthologParams&&(e.orthologParams={...e.orthologParams}),e.init&&(e.init={...e.init})},setDomainsRequested(t){e.domainsRequested=t},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,o=H6({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)}}}).actions(e=>{let t=e.reset.bind(e);return{reset(){let{displayName:r,minimized:n,zoomToBaseLevel:o,dataStoreId:i}=e;t(),r!==void 0&&e.setDisplayName(r),e.setMinimized(n),e.setZoomToBaseLevel(o),e.setDomainsRequested(!1),e.setLastStoredData(void 0),i&&w6(i)}}}).views(e=>{let t=e.menuItems.bind(e);return{menuItems(){return[...t(),{label:"Zoom to base level on click?",type:"checkbox",checked:e.zoomToBaseLevel,onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}}]}}}).actions(e=>({afterCreate(){G6(),(0,Ke.addDisposer)(e,()=>{e.launchController?.abort()});for(let t of[R6,Q6,X6,N6,_6,F6,L6])(0,Ke.addDisposer)(e,(0,dg.autorun)(()=>{t(e)}));(0,Ke.addDisposer)(e,(0,dg.autorun)(P6(e))),(0,Ke.addDisposer)(e,(0,dg.autorun)(O6(e)))}}))}function Dc(e){return e.type==="MsaView"}var df=g(k()),a8=g(Y());var uw=g(k()),n8=g(Ve()),fw=g(Y());var r8=g(Bt()),mg=(0,r8.makeStyles)()({highlight:{height:"100%",background:"rgba(255,255,0,0.2)",border:"1px solid rgba(50,50,0,0.2)",position:"absolute",zIndex:99,textAlign:"center",pointerEvents:"none",overflow:"hidden"}});var Mne=(0,fw.observer)(function({model:e}){let{hovered:t,views:r}=(0,n8.getSession)(e);return r.some(o=>Dc(o)&&o.connectedViewId===e.id)&&Es(t)?uw.default.createElement(Rne,{model:e,hovered:t}):null}),Rne=(0,fw.observer)(function({model:e,hovered:t}){let{classes:r}=mg(),{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 l=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),c=Math.min(s.offsetPx,a.offsetPx)-n;return uw.default.createElement("div",{className:r.highlight,style:{left:c,width:l}})}return null}),o8=Mne;var ff=g(k()),i8=g(Ve()),dw=g(Y());var kne=(0,dw.observer)(function({model:t}){let{views:r,hovered:n}=(0,i8.getSession)(t),o=r.filter(Dc).find(s=>s.connectedViewId===t.id),i=[...o?.connectedClickHighlights??[],...Es(n)?[]:o?.connectedHoverHighlights??[]];return i.length?ff.default.createElement(Qne,{model:t,highlights:i}):null}),Qne=(0,dw.observer)(function({model:e,highlights:t}){let{classes:r}=mg(),{offsetPx:n}=e;return ff.default.createElement(ff.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 l=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),c=Math.min(s.offsetPx,a.offsetPx)-n;return ff.default.createElement("div",{key:`${o.refName}-${o.start}-${o.end}-${i}`,className:r.highlight,style:{left:c,width:l}})}return null}))}),s8=kne;var _ne=(0,a8.observer)(function({model:t}){return df.default.createElement(df.default.Fragment,null,df.default.createElement(s8,{model:t}),df.default.createElement(o8,{model:t}))}),c8=_ne;function mw(e){e.addToExtensionPoint("LinearGenomeView-TracksContainerComponent",(t,{model:r})=>{let{views:n}=(0,u8.getSession)(r);return n.some(i=>Dc(i)&&i.connectedViewId===r.id)?[...t,l8.default.createElement(c8,{key:"highlight_protein_viewer_msaview",model:r})]:t})}var y8=g(R0());var f8=g(Ai());function pw(e){let t=e.getAdapterType("BgzipFastaAdapter");return(0,f8.ConfigurationSchema)("BgzipFastaMsaAdapter",{msaRegex:{type:"string",defaultValue:"_"}},{baseConfiguration:t.configSchema})}function Aw(e){return e.addAdapterType(()=>new y8.AdapterType({name:"BgzipFastaMsaAdapter",configSchema:pw(e),adapterMetadata:{hiddenFromGUI:!0},getAdapterClass:()=>Promise.resolve().then(()=>(h8(),g8)).then(t=>t.default)}))}var kg=g(Ve());oe();var b8=g(O(),1),C8=$((0,b8.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");var Dne=/gene(_segment)?$|rna$|transcript/;function Ag(e){return typeof e=="string"&&Dne.test(e.toLowerCase())}function Nne(e){return e.get("type")?.toLowerCase()==="cds"}function gg(e){return Nne(e)||!!e.get("subfeatures")?.some(gg)}function x8(e){return!!e.get("subfeatures")?.length&&!gg(e)}function E8(e){let t=e;for(let r=t.parent?.();r&&Ag(r.get("type"));r=r.parent?.())t=r;return t}var nt=g(k()),jH=g(Ye()),WH=g(Ve()),Rs=g(H());var Fr=g(k());I8();var Sg=g(H()),bH=g(Bt());wc();Ju();var Pe=g(k());qp();var Nr=g(H()),sH=g(Y()),aH=g(Bt());var gw=g(k()),v8=g(H());function Lne({children:e,...t}){return gw.default.createElement("div",null,gw.default.createElement(v8.TextField,{...t},e))}var Se=Lne;var hw=g(k()),B8=g(Ye()),T8=g(H()),M8=g(Bt()),Fne=(0,M8.makeStyles)()({dialogContent:{width:"80em"}});function Kr({error:e,children:t}){let{classes:r}=Fne();return hw.default.createElement(T8.DialogContent,{className:r.dialogContent},e?hw.default.createElement(B8.ErrorMessage,{error:e}):null,t)}var yw=g(k()),R8=g(Ye()),k8=g(H());function ho({status:e}){return e==="loading"?yw.default.createElement(R8.LoadingEllipses,{message:"Translating transcript"}):e==="missing"?yw.default.createElement(k8.Typography,{color:"textSecondary",variant:"body2"},"no coding sequence to align"):null}var fi=g(k()),G8=g(Ve()),bo=g(H());var Pne=["stack","splitRight","newTab"],Q8="splitRight",D8="msaView-launchPlacement";function hg(e,t){return t in e&&typeof e[t]=="function"}var _8=!1;function N8(e){return hg(e,"setUseWorkspaces")&&hg(e,"setPendingMove")}function One(e){let t=hg(e,"setUseWorkspaces"),r=hg(e,"setPendingMove");return t!==r&&!_8&&(_8=!0,console.warn(`jbrowse-plugin-msaview: this session supports workspaces but not ${r?"setUseWorkspaces":"setPendingMove"}, so the MSA view was stacked instead of tiled. Expected on releases through v4.3.0, which place views through @jbrowse/app-core instead; on a newer host it means the session API moved and the plugin needs updating to match.`)),t&&r}function L8(e,t,r){r==="stack"||!One(e)||(e.setPendingMove({type:r,viewId:t}),e.setUseWorkspaces(!0))}function Gne(e){return Pne.includes(e)}function mf(){try{let e=globalThis.localStorage.getItem(D8);return Gne(e)?e:Q8}catch(e){return console.error(e),Q8}}function F8(e){try{globalThis.localStorage.setItem(D8,e)}catch(t){console.error(t)}}var yo=g(k());var P8=(0,yo.createContext)(void 0);function O8({children:e}){let t=(0,yo.useState)(()=>mf()==="splitRight");return yo.default.createElement(P8.Provider,{value:t},e)}function yg(){let e=(0,yo.useContext)(P8),t=(0,yo.useState)(()=>mf()==="splitRight");return e??t}function Hne({checked:e,onChange:t}){return fi.default.createElement(bo.FormControlLabel,{label:"Open beside the genome view",control:fi.default.createElement(bo.Checkbox,{checked:e,onChange:r=>{t(r.target.checked)}})})}function Xr({onSubmit:e,onCancel:t,submitDisabled:r,hint:n,submitLabel:o="Submit",cancelLabel:i="Cancel",model:s}){let[a,l]=yg(),c=!!s&&N8((0,G8.getSession)(s));return fi.default.createElement(bo.DialogActions,{sx:{flexWrap:"wrap",rowGap:1}},c?fi.default.createElement(Hne,{checked:a,onChange:l}):null,fi.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8,marginLeft:"auto"}},n,fi.default.createElement(bo.Button,{sx:{flexShrink:0},color:"primary",variant:"contained",disabled:r,onClick:()=>{if(c){let u=a?"splitRight":"stack";F8(u),e(u)}else e(mf())}},o),fi.default.createElement(bo.Button,{sx:{flexShrink:0},color:"secondary",variant:"contained",onClick:()=>{t()}},i)))}var Zr=g(k()),Nc=g(H()),$8=g(Bt());var H8=g(k()),U8=g(Bt());var Une=(0,U8.makeStyles)()({textAreaFont:{fontFamily:"Courier New"}});function bw({value:e}){let{classes:t}=Une();return H8.default.createElement(Se,{variant:"outlined",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,value:e,slotProps:{input:{readOnly:!0,classes:{input:t.textAreaFont}}}})}var $ne=(0,$8.makeStyles)()({flex:{display:"flex"},minWidth:{minWidth:300},centered:{alignContent:"center",marginLeft:20}});function en({feature:e,options:t,selectedId:r,selectedTranscript:n,setSelectedId:o,proteinSequence:i,sequenceStatus:s="ready",validIds:a}){let{classes:l}=$ne(),[c,u]=(0,Zr.useState)(!1);return Zr.default.createElement(Zr.default.Fragment,null,Zr.default.createElement("div",{className:l.flex},Zr.default.createElement(Nc.TextField,{variant:"outlined",label:`Choose isoform of ${Jr(e)}`,helperText:"the query row, so the alignment stays linked to the genome view",select:!0,className:l.minWidth,value:r,onChange:f=>{o(f.target.value)}},t.map(f=>{let m=a?a.some(h=>ms(f,h)):!0,{len:d,mod:p}=MA(f);return Zr.default.createElement(Nc.MenuItem,{value:ds(f),key:f.id(),disabled:!m},ti(f)," (",d," aa)"," ",p?" (possible fragment)":"",a?m?" (has data)":" (no data)":"")})),Zr.default.createElement("div",{className:l.centered},Zr.default.createElement(Nc.Button,{variant:"contained",color:"primary",onClick:()=>{u(!c)}},c?"Hide sequence":"Show sequence"))),c?Zr.default.createElement(bw,{value:i?`>${ti(n)}
94
+ `)){let[o,i,s]=n.split(" ");if(o&&u6(o)===r)return{offset:Number(i),length:Number(s)}}}var m6=g(Ve());function p6({model:e}){let{assemblyManager:t,hovered:r}=(0,m6.getSession)(e),{transcriptToMsaMap:n,connectedView:o,mafRegion:i}=e;if(!o?.initialized||!Es(r)||!$A(e))return;let{coord:s,refName:a}=r.hoverPosition,l=s-1,c=t.get(i?.assemblyName??o.assemblyNames[0]??""),u=m=>(c?.initialized?c.getCanonicalRefName(m):void 0)??m,f=u(a);if(i)return f!==u(i.refName)||!o.assemblyNames.includes(i.assemblyName)||l<i.start||l>=i.end?void 0:_E(e,l-i.start);if(n&&f===u(n.refName)){let m=n.g2p[l];if(m!==void 0)return jA(e,m)}}var tne="jbrowse-msaview-domain-cache",ig="domains",rne=1,A6=ni(tne,rne,e=>{e.objectStoreNames.contains(ig)||e.createObjectStore(ig,{keyPath:"accession"})});function g6(e){return oi("domain cache read",async()=>{let r=(await A6()).transaction(ig,"readonly"),n=await Promise.all(e.map(o=>r.store.get(o)));return await r.done,n},[])}function h6(e){return oi("domain cache write",async()=>{let r=(await A6()).transaction(ig,"readwrite");for(let n of e)await r.store.put(n);await r.done},void 0)}function ui(e,t){let r=new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(e)?.[1];return r===void 0?void 0:Zu(r)}function nne(e){let t={},r=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=r.exec(e))!==null;){let o=ui(n[1],"GBQualifier_name"),i=ui(n[1],"GBQualifier_value");o&&i!==void 0&&t[o]===void 0&&(t[o]=i)}return t}function one(e){let t=[],r=[],n=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,o;for(;(o=n.exec(e))!==null;){let i=o[1],s=ui(i,"GBInterval_from"),a=ui(i,"GBInterval_to"),l=ui(i,"GBInterval_point");s&&a?(t.push(Number(s)),r.push(Number(a))):l&&(t.push(Number(l)),r.push(Number(l)))}return t.length>0?{start:Math.min(...t),end:Math.max(...r)}:void 0}var ine=2;function sne(e){let t=ui(e,"GBFeature_key"),r=nne(e),n=r.db_xref,o=one(e);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&o&&o.end-o.start+1>=ine){let i=n.replace("CDD:",""),s=t==="Region",a=r.note?.split(/[[(]/)[0]?.trim(),l=s?r.region_name??i:a||r.site_type||"site",c=s?i:`${i}:${l}`;return{signature:{entry:{name:l,description:r.note??l,accession:c}},locations:[o]}}}function ane(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 l=sne(a[1]);l&&i.push(l)}for(let l of[ui(o,"GBSeq_accession-version"),ui(o,"GBSeq_primary-accession")])l&&t.set(l,i)}return t}async function y6(e){let t=[...new Set(e)].filter(Boolean),r=new Map,n=await g6(t),o=[];t.forEach((a,l)=>{let c=n[l];c?r.set(a,c.matches):o.push(a)});let i=[],s=100;for(let a=0;a<o.length;a+=s){let l=o.slice(a,a+s),c=await Cs(vc({db:"protein",id:l.join(","),rettype:"gp",retmode:"xml"})),u=ane(c);for(let f of l){let m=u.get(f);m!==void 0&&(r.set(f,m),i.push({accession:f,matches:m}))}}return i.length>0&&await h6(i),r}async function b6(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 y6(n.map(s=>s.accession)),i=n.flatMap(({rowName:s,accession:a})=>(o.get(a)??[]).flatMap(({signature:l,locations:c})=>l.entry?c.map(({start:u,end:f})=>({id:s,accession:l.entry.accession,name:l.entry.name,description:l.entry.description,start:u,end:f})):[]));if(i.length===0)throw new Error("No CDD domain annotations found for these proteins");e.setAnnotations(i)}var cne="jbrowse-msaview-data",lne=1,vs="msa-data",sg=ni(cne,lne,e=>{e.objectStoreNames.contains(vs)||e.createObjectStore(vs,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})});function C6(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function x6(e,t){try{let r=await sg(),n={...t,id:e,timestamp:Date.now()};return await r.put(vs,n),!0}catch(r){return console.warn("Failed to store MSA data:",r),!1}}async function E6(e){try{let t=await sg(),r=await t.get(vs,e);if(!r)return;try{await t.put(vs,{...r,timestamp:Date.now()})}catch(s){console.warn("Failed to refresh MSA data timestamp:",s)}let{id:n,timestamp:o,...i}=r;return i}catch(t){console.warn("Failed to retrieve MSA data:",t);return}}async function w6(e){try{await(await sg()).delete(vs,e)}catch(t){console.warn("Failed to delete MSA data:",t)}}async function S6(e=10080*60*1e3){try{let t=await sg(),r=Date.now()-e,i=await t.transaction(vs,"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}}var I6=g(Ve()),v6=g(Hr());mo();function une(e){if(!(e.rows.length<2))try{e.calculateNeighborJoiningTreeFromMSA()}catch(t){console.error(t);try{(0,I6.getSession)(e).notify(`The alignment loaded, but no tree was built. ${t instanceof Error?t.message:String(t)}`,"warning")}catch(r){console.error(r)}}}function sw(e){(0,v6.untracked)(()=>{fne(e)})}function fne({self:e,message:t,launch:r,onLaunched:n}){e.launchController?.abort();let o=new AbortController,{signal:i}=o;e.setLaunchController(o);let s=l=>{i.aborted||l()},a={signal:i,act:s,onProgress:l=>{s(()=>{e.setProgress(l)})},onRid:l=>{s(()=>{e.setRid(l)})}};(async()=>{try{s(()=>{e.setProgress(t),e.setError(void 0)});let l=await r(a);s(()=>{e.setData(l),n()}),l.tree||s(()=>{une(e)})}catch(l){PA(l)||(s(()=>{e.setError(l)}),console.error(l))}finally{s(()=>{e.setProgress(""),e.launchController===o&&e.setLaunchController(void 0)})}})()}function dne(e){let t=e;return t.type==="ProteinView"&&Array.isArray(t.structures)}function B6(e){return e.filter(dne)}var mne="This view's alignment is no longer in browser storage. Stored alignments are kept for 7 days after they were last used, and are lost when site data is cleared.",pne=" Retry runs the original search again and rebuilds it.",Ane=" Relaunch it from the gene to rebuild it.";function R6(e){let{dataStoreId:t,rows:r}=e;t&&r.length===0&&(async()=>{try{e.setLoadingStoredData(!0);let n=await E6(t);n?(0,ag.transaction)(()=>{n.msa&&e.setMSA(n.msa),n.tree&&e.setTree(n.tree),n.treeMetadata&&e.setTreeMetadata(n.treeMetadata),n.gff&&e.setGFF(n.gff),e.setLastStoredData(k6(e))}):(0,ag.transaction)(()=>{e.setDataStoreId(void 0),e.setError(new Error(mne+(e.blastParams??e.orthologParams?pne:Ane)))})}catch(n){console.error("Failed to load MSA data from IndexedDB:",n)}finally{e.setLoadingStoredData(!1)}})()}function k6(e){let{msa:t,tree:r,treeMetadata:n,gff:o}=e.data;return{msa:t,tree:r,treeMetadata:n,gff:o}}function gne(e,t){return!!e&&e.msa===t.msa&&e.tree===t.tree&&e.treeMetadata===t.treeMetadata&&e.gff===t.gff}function Q6(e){let{rows:t,dataStoreId:r,isStoringData:n,lastStoredData:o,init:i}=e,s=k6(e);t.length===0||n||e.msaFilehandle||e.treeFilehandle||i?.msaIndexedLocation||!(s.msa||s.tree)||gne(o,s)||(e.setIsStoringData(!0),(async()=>{try{let a=r??C6();await x6(a,s)&&e.setDataStoreId(a)}catch(a){console.error("Failed to store MSA data to IndexedDB:",a)}finally{(0,ag.transaction)(()=>{e.setLastStoredData(s),e.setIsStoringData(!1)})}})())}function _6(e){e.orthologParams&&!e.launchCompleted&&!D6(e)&&sw({self:e,message:"Resolving orthologs",launch:t=>D4({self:e,scope:t}),onLaunched:()=>{e.setLaunchCompleted(!0)}})}function D6(e){return!!e.connectedTranscript&&!e.connectedFeature}function N6(e){e.blastParams&&!e.launchCompleted&&!D6(e)&&sw({self:e,message:"Submitting query",launch:t=>M4({self:e,scope:t}),onLaunched:()=>{e.setLaunchCompleted(!0)}})}function L6(e){let{rows:t,domainsRequested:r,annotations:n}=e,o=e.data.treeMetadata?.includes('"Accession"')??!1;t.length>0&&o&&n.length===0&&!r&&(e.setDomainsRequested(!0),(async()=>{try{await b6(e)}catch(i){console.error("[msaview-domains] auto-load failed:",i)}finally{e.setProgress("")}})())}function F6(e){let{init:t}=e;if(t){let{msaUrl:r,msaIndexedLocation:n,msaName:o,querySeqName:i}=t,s=!!(n&&o);if(s&&e.data.msa)return;(async()=>{try{if(e.setError(void 0),r){let a=T4(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 d6({location:n,name:o});if(a)e.setMSA(a);else throw new Error(`No alignment named ${o} in ${n.uri}`)}s||e.setInit(void 0)}catch(a){e.setError(a),console.error(a)}})()}}function P6(e){let t=!1;return()=>{let r=p6({model:e});r!==void 0?(e.setMousePos(r),t=!0):t&&(e.setMousePos(void 0),t=!1)}}function T6(e,t){let{connectedViewId:r,transcriptToMsaMap:n}=e;if(!n||!$A(e))return[];let{g2p:o}=n,i=new Set;for(let s of B6((0,M6.getSession)(e).views))for(let a of s.structures)if(a.connectedViewId===r)for(let l of a[t]??[])for(let c=l.start;c<l.end;c++){let u=o[c],f=u===void 0?void 0:jA(e,u);f!==void 0&&i.add(f)}return[...i]}function hne(e,t){return!e||!t?e===t:e.length===t.length&&e.every((r,n)=>r===t[n])}function O6(e){let t;return()=>{let{connectedViewId:r,transcriptToMsaMap:n}=e;if(!r||!n)return;let o=T6(e,"hoverGenomeHighlights"),i=o.length?[]:T6(e,"clickGenomeHighlights"),s=e.highlightColumns??[],a=o.length?o:i.length?i:s,l=a.length>0?a:void 0;hne(t,l)||(t=l,e.setHighlightedColumns(l))}}function G6(){S6().catch(e=>{console.error("Failed to cleanup old MSA data:",e)})}function cg({model:e,coord:t}){let{querySeqName:r,transcriptToMsaMap:n,mafRegion:o}=e,i=e.visibleColToSeqPos(r,t);if(i===void 0)return[];if(o){let s=o.start+i;return s<o.end?[{refName:o.refName,start:s,end:s+1}]:[]}if(n){let{refName:s,p2gCodon:a}=n,l=i+(e.querySeqOffset??0);return lB(a,l)?.map(([c,u])=>({refName:s,start:c,end:u}))??[]}return[]}function H6(e){let t=cg(e),r=t[0],n=t.at(-1);return r&&n?{refName:r.refName,start:r.start,end:n.end}:void 0}var Y6=g(Ai()),cw=g(Ve()),J6=g(Rt()),fg=g(Hr());var j6=g(Ve());$6();f_();function Cne({cds:e,sequence:t,geneticCodeId:r,translExcept:n}){let{codonTable:o,starts:i}=bC(r);return U6({cds:e,sequence:t,codonTable:o,starts:i,translExcept:n})}function V6(e){return`${e.start}-${e.end}`}function xne(e){return e.filter((t,r,n)=>!r||V6(t)!==V6(n[r-1]))}function Ene(e,t){return e.map(r=>({...r,start:t-r.end,end:t-r.start})).toSorted((r,n)=>r.start-n.start)}function lg({feature:e,seq:t,assemblyGeneticCodeId:r}){let{subfeatures:n,start:o,end:i,strand:s}=e.toJSON(),a=xne(n?.toSorted((f,m)=>f.start-m.start).map(f=>({...f,start:f.start-o,end:f.end-o})).filter(f=>f.type==="CDS")??[]),l=e.get("subfeatures")?.find(f=>f.get("type")?.toLowerCase()==="cds"),c=yC(e.get("transl_table"))??yC(l?.get("transl_table"))??r,u=e.get("transl_except")??l?.get("transl_except");return Cne({cds:s===-1?Ene(a,t.length):a,sequence:s===-1?(0,j6.revcom)(t):t,geneticCodeId:c,translExcept:u?l_({raw:u,featureStart:o,featureLength:i-o,strand:s}):void 0})}var W6=g(Ai());async function ug({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 l="getSequence",c={adapterConfig:(0,W6.getConf)(a,["sequence","adapter"]),sessionId:l,regions:[{start:e,end:t,refName:a.getCanonicalRefName(r)??r,assemblyName:o}]};return{seq:(await s.call(l,"CoreGetFeatures",c))[0]?.get("seq")??"",assemblyGeneticCodeId:wne(a,r)}}function wne(e,t){return e.getGeneticCodeId?.(t)}function q6(e){return e.replace(/\.\d+$/,"")}function Sne(e,t){let r=q6(t);return[e.get("name"),e.get("id"),e.get("transcript_id"),e.id()].some(n=>typeof n=="string"&&(n===t||q6(n)===r))}function z6(e){return e.map(t=>({assemblyName:t.assemblyName,refName:t.refName,start:Math.floor(t.start),end:Math.ceil(t.end)}))}function Ine(e){let t=z6(e.dynamicBlocks?.contentBlocks??[]),r=z6(e.displayedRegions);return t.length>0?[t,r]:[r]}function K6(e){return e.filter(t=>t.type==="FeatureTrack")}async function vne(e,t){let r=e.connectedView,n=(0,cw.getSession)(e),o="msaview-connectedTranscript",i=K6(r.tracks);for(let s of Ine(r))for(let a of i){let l={adapterConfig:(0,Y6.getConf)(a,"adapter"),sessionId:o,regions:s},c=await n.rpcManager.call(o,"CoreGetFeatures",l);for(let u of c){let f=gE(u).find(m=>Sne(m,t));if(f)return f}}}async function Bne(e,t){let{start:r,end:n,refName:o}=t.toJSON(),i=e.connectedView.assemblyNames[0],{seq:s,assemblyGeneticCodeId:a}=await ug({start:r,end:n,refName:o,assemblyName:i,session:(0,cw.getSession)(e)});return lg({seq:s,feature:t,assemblyGeneticCodeId:a})}var aw=new WeakMap;async function Tne({self:e,transcriptId:t,blastParams:r,orthologParams:n,isCurrent:o}){let i=K6(e.connectedView.tracks).length;try{e.setProgress(`Looking up ${t} in the genome view...`);let s=await vne(e,t);if(!s)throw new Error(`Transcript "${t}" was not found in the ${i} feature track(s) open in the connected genome view. Open the gene track that carries it, and make sure the view is on its locus.`);let a=await Bne(e,s);if(!a)throw new Error(`Transcript "${t}" has no CDS to translate`);if(!o())return;let l=s.toJSON();(0,fg.transaction)(()=>{e.setProgress(""),r&&!r.proteinSequence&&e.setBlastParams({...r,selectedTranscript:l,proteinSequence:a}),n&&!n.proteinSequence&&e.setOrthologParams({...n,selectedTranscript:l,proteinSequence:a}),e.setConnectedFeature(l)})}catch(s){console.error(s),o()&&(e.setProgress(""),e.setError(s))}}function X6(e){let{connectedTranscript:t,connectedFeature:r,connectedView:n,blastParams:o,orthologParams:i}=e;if(!t||r||!n?.initialized||n.tracks.length===0)return;let s=(aw.get(e)??0)+1;aw.set(e,s),(0,fg.untracked)(()=>{Tne({self:e,transcriptId:t,blastParams:o,orthologParams:i,isCurrent:()=>(0,J6.isAlive)(e)&&aw.get(e)===s})})}function lw(){return Ke.types.compose(Z6.BaseViewModel,vA(),Ke.types.model("MsaView",{connectedViewId:Ke.types.maybe(Ke.types.string),connectedFeature:Ke.types.frozen(),connectedTranscript:Ke.types.maybe(Ke.types.string),blastParams:Ke.types.frozen(),orthologParams:Ke.types.frozen(),querySeqName:"QUERY",querySeqOffset:0,uniprotId:Ke.types.maybe(Ke.types.string),zoomToBaseLevel:!1,init:Ke.types.frozen(),dataStoreId:Ke.types.maybe(Ke.types.string),launchCompleted:!1,mafRegion:Ke.types.frozen()})).volatile(()=>({rid:void 0,progress:"",loadingStoredData:!1,isStoringData:!1,lastStoredData:void 0,launchController:void 0,domainsRequested:!1})).views(e=>({get transcriptToMsaMap(){return e.connectedFeature?cB(e.connectedFeature):void 0},get connectedView(){let{views:t}=(0,e8.getSession)(e);return t.find(r=>r.id===e.connectedViewId)}})).views(e=>({get connectedHoverHighlights(){let{mouseCol:t}=e;return t===void 0?[]:cg({model:e,coord:t})},get connectedClickHighlights(){let{mouseClickCol:t}=e;return t===void 0?[]:cg({model:e,coord:t})},get connectedHighlights(){return[...this.connectedHoverHighlights,...this.connectedClickHighlights]}})).views(e=>({get hostRestoresData(){let{msaIndexedLocation:t,msaName:r}=e.init??{};return e.hostCarriesData||!!(t&&r)}})).actions(e=>({setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setProgress(t){e.progress=t},setRid(t){e.rid=t},setBlastParams(t){e.blastParams=t},setConnectedFeature(t){e.connectedFeature=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},setLaunchCompleted(t){e.launchCompleted=t},setLoadingStoredData(t){e.loadingStoredData=t},setIsStoringData(t){e.isStoringData=t},setLastStoredData(t){e.lastStoredData=t},setLaunchController(t){e.launchController=t},cancelLaunch(){e.launchController?.abort(),e.launchController=void 0,e.blastParams=void 0,e.orthologParams=void 0,e.init=void 0,e.launchCompleted=!1,e.progress="",e.rid=void 0,e.error=void 0},retryLaunch(){e.launchController?.abort(),e.launchController=void 0,e.progress="",e.rid=void 0,e.error=void 0,e.launchCompleted=!1,e.blastParams&&(e.blastParams={...e.blastParams}),e.orthologParams&&(e.orthologParams={...e.orthologParams}),e.init&&(e.init={...e.init})},setDomainsRequested(t){e.domainsRequested=t},handleMsaClick(t){let{connectedView:r,zoomToBaseLevel:n}=e,o=H6({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)}}}).actions(e=>{let t=e.reset.bind(e);return{reset(){let{displayName:r,minimized:n,zoomToBaseLevel:o,dataStoreId:i}=e;t(),r!==void 0&&e.setDisplayName(r),e.setMinimized(n),e.setZoomToBaseLevel(o),e.setDomainsRequested(!1),e.setLastStoredData(void 0),i&&w6(i)}}}).views(e=>{let t=e.menuItems.bind(e);return{menuItems(){return[...t(),{label:"Zoom to base level on click?",type:"checkbox",checked:e.zoomToBaseLevel,onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}}]}}}).actions(e=>({afterCreate(){G6(),(0,Ke.addDisposer)(e,()=>{e.launchController?.abort()});for(let t of[R6,Q6,X6,N6,_6,F6,L6])(0,Ke.addDisposer)(e,(0,dg.autorun)(()=>{t(e)}));(0,Ke.addDisposer)(e,(0,dg.autorun)(P6(e))),(0,Ke.addDisposer)(e,(0,dg.autorun)(O6(e)))}}))}function Dc(e){return e.type==="MsaView"}var df=g(k()),a8=g(Y());var uw=g(k()),n8=g(Ve()),fw=g(Y());var r8=g(Bt()),mg=(0,r8.makeStyles)()({highlight:{height:"100%",background:"rgba(255,255,0,0.2)",border:"1px solid rgba(50,50,0,0.2)",position:"absolute",zIndex:99,textAlign:"center",pointerEvents:"none",overflow:"hidden"}});var Mne=(0,fw.observer)(function({model:e}){let{hovered:t,views:r}=(0,n8.getSession)(e);return r.some(o=>Dc(o)&&o.connectedViewId===e.id)&&Es(t)?uw.default.createElement(Rne,{model:e,hovered:t}):null}),Rne=(0,fw.observer)(function({model:e,hovered:t}){let{classes:r}=mg(),{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 l=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),c=Math.min(s.offsetPx,a.offsetPx)-n;return uw.default.createElement("div",{className:r.highlight,style:{left:c,width:l}})}return null}),o8=Mne;var ff=g(k()),i8=g(Ve()),dw=g(Y());var kne=(0,dw.observer)(function({model:t}){let{views:r,hovered:n}=(0,i8.getSession)(t),o=r.filter(Dc).find(s=>s.connectedViewId===t.id),i=[...o?.connectedClickHighlights??[],...Es(n)?[]:o?.connectedHoverHighlights??[]];return i.length?ff.default.createElement(Qne,{model:t,highlights:i}):null}),Qne=(0,dw.observer)(function({model:e,highlights:t}){let{classes:r}=mg(),{offsetPx:n}=e;return ff.default.createElement(ff.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 l=Math.max(Math.abs(a.offsetPx-s.offsetPx),4),c=Math.min(s.offsetPx,a.offsetPx)-n;return ff.default.createElement("div",{key:`${o.refName}-${o.start}-${o.end}-${i}`,className:r.highlight,style:{left:c,width:l}})}return null}))}),s8=kne;var _ne=(0,a8.observer)(function({model:t}){return df.default.createElement(df.default.Fragment,null,df.default.createElement(s8,{model:t}),df.default.createElement(o8,{model:t}))}),c8=_ne;function mw(e){e.addToExtensionPoint("LinearGenomeView-TracksContainerComponent",(t,{model:r})=>{let{views:n}=(0,u8.getSession)(r);return n.some(i=>Dc(i)&&i.connectedViewId===r.id)?[...t,l8.default.createElement(c8,{key:"highlight_protein_viewer_msaview",model:r})]:t})}var y8=g(R0());var f8=g(Ai());function pw(e){let t=e.getAdapterType("BgzipFastaAdapter");return(0,f8.ConfigurationSchema)("BgzipFastaMsaAdapter",{msaRegex:{type:"string",defaultValue:"_"}},{baseConfiguration:t.configSchema})}function Aw(e){return e.addAdapterType(()=>new y8.AdapterType({name:"BgzipFastaMsaAdapter",configSchema:pw(e),adapterMetadata:{hiddenFromGUI:!0},getAdapterClass:()=>Promise.resolve().then(()=>(h8(),g8)).then(t=>t.default)}))}var kg=g(Ve());oe();var b8=g(O(),1),C8=$((0,b8.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");var Dne=/gene(_segment)?$|rna$|transcript/;function Ag(e){return typeof e=="string"&&Dne.test(e.toLowerCase())}function Nne(e){return e.get("type")?.toLowerCase()==="cds"}function gg(e){return Nne(e)||!!e.get("subfeatures")?.some(gg)}function x8(e){return!!e.get("subfeatures")?.length&&!gg(e)}function E8(e){let t=e;for(let r=t.parent?.();r&&Ag(r.get("type"));r=r.parent?.())t=r;return t}var nt=g(k()),jH=g(Ye()),WH=g(Ve()),Rs=g(H());var Fr=g(k());I8();var Sg=g(H()),bH=g(Bt());wc();Ju();var Pe=g(k());qp();var Nr=g(H()),sH=g(Y()),aH=g(Bt());var gw=g(k()),v8=g(H());function Lne({children:e,...t}){return gw.default.createElement("div",null,gw.default.createElement(v8.TextField,{...t},e))}var Se=Lne;var hw=g(k()),B8=g(Ye()),T8=g(H()),M8=g(Bt()),Fne=(0,M8.makeStyles)()({dialogContent:{width:"80em"}});function Kr({error:e,children:t}){let{classes:r}=Fne();return hw.default.createElement(T8.DialogContent,{className:r.dialogContent},e?hw.default.createElement(B8.ErrorMessage,{error:e}):null,t)}var yw=g(k()),R8=g(Ye()),k8=g(H());function ho({status:e}){return e==="loading"?yw.default.createElement(R8.LoadingEllipses,{message:"Translating transcript"}):e==="missing"?yw.default.createElement(k8.Typography,{color:"textSecondary",variant:"body2"},"no coding sequence to align"):null}var fi=g(k()),G8=g(Ve()),bo=g(H());var Pne=["stack","splitRight","newTab"],Q8="splitRight",D8="msaView-launchPlacement";function hg(e,t){return t in e&&typeof e[t]=="function"}var _8=!1;function N8(e){return hg(e,"setUseWorkspaces")&&hg(e,"setPendingMove")}function One(e){let t=hg(e,"setUseWorkspaces"),r=hg(e,"setPendingMove");return t!==r&&!_8&&(_8=!0,console.warn(`jbrowse-plugin-msaview: this session supports workspaces but not ${r?"setUseWorkspaces":"setPendingMove"}, so the MSA view was stacked instead of tiled. Expected on releases through v4.3.0, which place views through @jbrowse/app-core instead; on a newer host it means the session API moved and the plugin needs updating to match.`)),t&&r}function L8(e,t,r){r==="stack"||!One(e)||(e.setPendingMove({type:r,viewId:t}),e.setUseWorkspaces(!0))}function Gne(e){return Pne.includes(e)}function mf(){try{let e=globalThis.localStorage.getItem(D8);return Gne(e)?e:Q8}catch(e){return console.error(e),Q8}}function F8(e){try{globalThis.localStorage.setItem(D8,e)}catch(t){console.error(t)}}var yo=g(k());var P8=(0,yo.createContext)(void 0);function O8({children:e}){let t=(0,yo.useState)(()=>mf()==="splitRight");return yo.default.createElement(P8.Provider,{value:t},e)}function yg(){let e=(0,yo.useContext)(P8),t=(0,yo.useState)(()=>mf()==="splitRight");return e??t}function Hne({checked:e,onChange:t}){return fi.default.createElement(bo.FormControlLabel,{label:"Open beside the genome view",control:fi.default.createElement(bo.Checkbox,{checked:e,onChange:r=>{t(r.target.checked)}})})}function Xr({onSubmit:e,onCancel:t,submitDisabled:r,hint:n,submitLabel:o="Submit",cancelLabel:i="Cancel",model:s}){let[a,l]=yg(),c=!!s&&N8((0,G8.getSession)(s));return fi.default.createElement(bo.DialogActions,{sx:{flexWrap:"wrap",rowGap:1}},c?fi.default.createElement(Hne,{checked:a,onChange:l}):null,fi.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8,marginLeft:"auto"}},n,fi.default.createElement(bo.Button,{sx:{flexShrink:0},color:"primary",variant:"contained",disabled:r,onClick:()=>{if(c){let u=a?"splitRight":"stack";F8(u),e(u)}else e(mf())}},o),fi.default.createElement(bo.Button,{sx:{flexShrink:0},color:"secondary",variant:"contained",onClick:()=>{t()}},i)))}var Zr=g(k()),Nc=g(H()),$8=g(Bt());var H8=g(k()),U8=g(Bt());var Une=(0,U8.makeStyles)()({textAreaFont:{fontFamily:"Courier New"}});function bw({value:e}){let{classes:t}=Une();return H8.default.createElement(Se,{variant:"outlined",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,value:e,slotProps:{input:{readOnly:!0,classes:{input:t.textAreaFont}}}})}var $ne=(0,$8.makeStyles)()({flex:{display:"flex"},minWidth:{minWidth:300},centered:{alignContent:"center",marginLeft:20}});function en({feature:e,options:t,selectedId:r,selectedTranscript:n,setSelectedId:o,proteinSequence:i,sequenceStatus:s="ready",validIds:a}){let{classes:l}=$ne(),[c,u]=(0,Zr.useState)(!1);return Zr.default.createElement(Zr.default.Fragment,null,Zr.default.createElement("div",{className:l.flex},Zr.default.createElement(Nc.TextField,{variant:"outlined",label:`Choose isoform of ${Jr(e)}`,helperText:"the query row, so the alignment stays linked to the genome view",select:!0,className:l.minWidth,value:r,onChange:f=>{o(f.target.value)}},t.map(f=>{let m=a?a.some(h=>ms(f,h)):!0,{len:d,mod:p}=MA(f);return Zr.default.createElement(Nc.MenuItem,{value:ds(f),key:f.id(),disabled:!m},ti(f)," (",d," aa)"," ",p?" (possible fragment)":"",a?m?" (has data)":" (no data)":"")})),Zr.default.createElement("div",{className:l.centered},Zr.default.createElement(Nc.Button,{variant:"contained",color:"primary",onClick:()=>{u(!c)}},c?"Hide sequence":"Show sequence"))),c?Zr.default.createElement(bw,{value:i?`>${ti(n)}
95
95
  ${i}`:s==="missing"?"This transcript has no coding sequence, so there is nothing to translate.":"Loading..."}):null)}var V8=g(k()),j8=g(Ve());function Lc(e,{placement:t="stack",...r}){let n=e.addView("MsaView",{type:"MsaView",...r});return L8(e,n.id,t),n}var Fc={drawNodeBubbles:!0,colWidth:10,rowHeight:12};function Qr({view:e,feature:t,placement:r,...n}){Lc((0,j8.getSession)(e),{placement:r,connectedViewId:e.id,connectedFeature:t?.toJSON(),...n})}function Pn(e){let[t,r]=(0,V8.useState)();return{launchError:t,submit:n=>{try{r(void 0),n(),e()}catch(o){console.error(o),r(o)}}}}var Cg=g(k());var q8=g(Ve());var _r=g(k()),W8=e=>e==null||e===!1;function Vne(e){return W8(e)||Array.isArray(e)&&e.some(W8)?null:JSON.stringify(e)}function Dr(e,t,{onSuccess:r}={}){let n=Vne(e),[o,i]=(0,_r.useState)(0),[s,a]=(0,_r.useState)(),l=n===null?null:`${o}\0${n}`,c=s?.attempt===l,u=s?.question===n,f=(0,_r.useRef)({fetcher:t,onSuccess:r});return(0,_r.useEffect)(()=>{f.current={fetcher:t,onSuccess:r}}),(0,_r.useEffect)(()=>{if(l===null||n===null)return;let m=!0;return f.current.fetcher().then(d=>{m&&(a({attempt:l,question:n,data:d}),f.current.onSuccess?.(d))}).catch(d=>{m&&a({attempt:l,question:n,error:d})}),()=>{m=!1}},[l,n]),{data:u?s.data:void 0,error:c?s.error:void 0,isLoading:l!==null&&!c,mutate:(0,_r.useCallback)(()=>{i(m=>m+1)},[])}}function bg(e,t){let[r,n]=(0,_r.useState)(e);return(0,_r.useEffect)(()=>{let o=setTimeout(()=>{n(e)},t);return()=>{clearTimeout(o)}},[e,t]),r}function z8({view:e,feature:t}){let r=e?.assemblyNames?.[0],{data:n,error:o,isLoading:i}=Dr(t&&r?[t.id(),r,"feature-sequence"]:null,async()=>{let{start:s,end:a,refName:l}=t.toJSON();return ug({start:s,end:a,refName:l,assemblyName:r,session:(0,q8.getSession)(e)})});return{proteinSequence:n&&t?lg({seq:n.seq,feature:t,assemblyGeneticCodeId:n.assemblyGeneticCodeId}):"",sequence:n,error:o,isLoading:i}}function jne(e,t,r){if(!r?.length)return e;let n=s=>r.some(a=>ms(s,a)),o=t.find(s=>ds(s)===e);if(o&&n(o))return e;let i=t.find(n);return i?ds(i):e}function Wne({error:e,isLoading:t,proteinSequence:r}){return e?"error":t?"loading":r?"ready":"missing"}function On({feature:e,view:t,validIds:r,preferredTranscriptId:n}){let o=(0,Cg.useMemo)(()=>kA(e),[e]),[i,s]=(0,Cg.useState)(()=>ds(o.find(m=>ms(m,n??""))??o[0])),a=jne(i,o,r),l=o.find(m=>ds(m)===a),{proteinSequence:c,error:u,isLoading:f}=z8({view:t,feature:l});return{options:o,selectedId:a,setSelectedId:s,selectedTranscript:l,proteinSequence:c,error:u,isLoading:f,sequenceStatus:Wne({error:u,isLoading:f,proteinSequence:c}),validIds:r}}var ut=g(k()),X8=g(Ye());oe();var Y8=g(O(),1),J8=$((0,Y8.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 Tt=g(H()),Z8=g(Y()),eH=g(Bt());function xg(e){let{data:t,error:r,isLoading:n,mutate:o}=Dr(`cached-blast-${e.join(",")}`,async()=>(await W3()).filter(s=>s.geneId&&e.includes(s.geneId)));return{results:t??[],error:r,isLoading:n,handleDelete:async i=>{await bE(i),o()},handleClearAll:async()=>{await Promise.all((t??[]).map(i=>bE(i.id))),o()}}}var qne=(0,eH.makeStyles)()({header:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:8},resultList:{maxHeight:300,overflow:"auto"}});function K8(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"}function zne(e){return[e.blastDatabase,e.searchProgram??e.blastProgram??"blastp",e.msaAlgorithm].filter(Boolean).join(" / ")}var Yne=(0,Z8.observer)(function({model:e,handleClose:t,feature:r}){let{classes:n}=qne(),o=Mr(e),[i,s]=(0,ut.useState)(),[a]=yg(),l=(0,ut.useMemo)(()=>hc(r),[r]),{results:c,error:u,isLoading:f,handleDelete:m,handleClearAll:d}=xg(l),p=y=>{let{transcriptId:b,msa:C,tree:I,treeMetadata:x}=y;Qr({view:o,feature:b?kA(r).find(S=>ms(S,b)):void 0,placement:a?"splitRight":"stack",displayName:`BLAST - ${K8(y)}`,...Fc,data:{msa:C,tree:I,treeMetadata:x}}),t()},h=u??i;return h?ut.default.createElement(X8.ErrorMessage,{error:h}):f?ut.default.createElement(Tt.Typography,null,"Loading cached results..."):c.length===0?ut.default.createElement(Tt.Typography,{color:"textSecondary"},"No cached BLAST results found for this gene. Run a BLAST query to cache results."):ut.default.createElement("div",null,ut.default.createElement("div",{className:n.header},ut.default.createElement(Tt.Typography,{variant:"subtitle1"},"Cached BLAST Results (",c.length,")"),ut.default.createElement(Tt.Button,{size:"small",color:"error",onClick:async()=>{try{s(void 0),await d()}catch(y){s(y)}}},"Clear results for this gene")),ut.default.createElement(Tt.List,{dense:!0,className:n.resultList},c.map(y=>ut.default.createElement(Tt.ListItem,{key:y.id,disablePadding:!0,secondaryAction:ut.default.createElement(Tt.IconButton,{edge:"end",size:"small",onClick:async b=>{b.stopPropagation();try{s(void 0),await m(y.id)}catch(C){s(C)}}},ut.default.createElement(J8,{fontSize:"small"}))},ut.default.createElement(Tt.ListItemButton,{onClick:()=>{p(y)}},ut.default.createElement(Tt.ListItemText,{primary:`${K8(y)} - ${zne(y)}`,secondary:`${new Date(y.timestamp).toLocaleString()} - Seq: ${y.proteinSequence.slice(0,30)}...`}))))))}),tH=Yne;var Cw=g(k()),rH=g(H());ps();function pf({value:e,onChange:t,className:r}){return Cw.default.createElement(Se,{variant:"outlined",label:"MSA Algorithm",className:r,select:!0,value:e,helperText:e==="browser"?"no EBI job; rows aligned to the query":void 0,onChange:n=>{t(n.target.value)}},QA.map(n=>Cw.default.createElement(rH.MenuItem,{value:n,key:n},G3[n])))}ps();Ju();ps();var Jne="msaView-blastSearch",Kne="msaView-msaAlgorithm",nH=NA("blastp"),oH="clustalo";function Xne(e){let{program:t,database:r}=e??{},n=_A.find(o=>o===t);return n&&LA(n).some(o=>o===r)?{program:n,database:r}:nH}function Zne(e){return QA.find(t=>t===e)??oH}function iH(){let[e,t]=As(Jne,nH);return[Xne(e),r=>{t(r)}]}function Eg(){let[e,t]=As(Kne,oH);return[Zne(e),r=>{t(r)}]}var eoe=(0,aH.makeStyles)()({selectField:{width:150},databaseField:{width:260},cachedResultsAccordion:{marginTop:20},infoText:{marginTop:20}}),toe=(0,sH.observer)(function({handleClose:e,feature:t,model:r,children:n,preferredTranscriptId:o}){let{classes:i}=eoe(),s=Mr(r),{launchError:a,submit:l}=Pn(e),[c,u]=iH(),[f,m]=Eg(),[d,p]=(0,Pe.useState)(String(DA)),h=Number(d),y=Number.isInteger(h)&&h>=1,b=c.program==="phmmer",C=(0,Pe.useMemo)(()=>hc(t),[t]),{results:I,error:x}=xg(C),S=On({feature:t,view:s,preferredTranscriptId:o}),{selectedTranscript:v,proteinSequence:B,sequenceStatus:Q}=S,_=S.error??a??x;return Pe.default.createElement(Pe.default.Fragment,null,Pe.default.createElement(Kr,{error:_},n,Pe.default.createElement(Se,{variant:"outlined",label:"Search program",className:i.selectField,select:!0,value:c.program,onChange:M=>{u(NA(M.target.value))}},_A.map(M=>Pe.default.createElement(Nr.MenuItem,{value:M,key:M},H3[M]))),Pe.default.createElement(Se,{variant:"outlined",label:"Database",className:i.databaseField,select:!0,value:c.database,onChange:M=>{u({program:c.program,database:M.target.value})}},LA(c.program).map(M=>Pe.default.createElement(Nr.MenuItem,{value:M,key:M},$3(M)))),b?null:Pe.default.createElement(pf,{className:i.selectField,value:f,onChange:m}),Pe.default.createElement(Se,{variant:"outlined",label:"Hits",className:i.selectField,type:"number",value:d,onChange:M=>{p(M.target.value)},error:!y,helperText:"best-scoring sequences to keep"}),Pe.default.createElement(en,{feature:t,...S}),Pe.default.createElement(Nr.Typography,{variant:"body2",className:i.infoText},b?"phmmer aligns the hits as it finds them, so nothing is realigned afterwards.":"The hits come back from EBI and are then run through the chosen aligner."," ","The EBI queue is the wait, and it runs from seconds to many minutes."),I.length>0?Pe.default.createElement(Nr.Accordion,{className:i.cachedResultsAccordion},Pe.default.createElement(Nr.AccordionSummary,{expandIcon:Pe.default.createElement(cc,null)},Pe.default.createElement(Nr.Typography,null,"Previous BLAST Results")),Pe.default.createElement(Nr.AccordionDetails,null,Pe.default.createElement(tH,{model:r,handleClose:e,feature:t}))):null),Pe.default.createElement(Xr,{model:r,hint:Pe.default.createElement(ho,{status:Q}),submitDisabled:!B||!y,onSubmit:M=>{if(v){let N=c.program==="phmmer"?{searchProgram:"phmmer",blastDatabase:c.database,maxHits:h,selectedTranscript:v.toJSON(),proteinSequence:B}:{searchProgram:"blastp",blastDatabase:c.database,msaAlgorithm:f,maxHits:h,selectedTranscript:v.toJSON(),proteinSequence:B};l(()=>{Qr({view:s,feature:v,placement:M,displayName:P3(t,v),...Fc,blastParams:N})})}},onCancel:e}))}),cH=toe;var ke=g(k()),pH=g(Ve()),Ts=g(H()),AH=g(Y()),gH=g(Bt());Ew();var wg=g(k());nc();function uH(e){return ri(e).toUpperCase()}function roe(e,t){let r=Math.min(e.length,t.length);if(r===0)return 0;let n=0;for(let o=0;o<r;o++)e[o]===t[o]&&n++;return n/r}var noe=.9,ooe=.5;function fH(e,t){if(!e.trim())return{names:[]};let r;try{r=Qu(e)}catch{return{names:[]}}let n=r.getNames(),o=uH(t);return{names:n,match:o?ioe(r,n,o):void 0}}function ioe(e,t,r){let n=[];for(let i of t){let s=uH(_u(e.getRow(i)));if(!s)continue;if(s===r)return{name:i,quality:"exact",identity:1,offset:0};let a=r.indexOf(s),l=s.indexOf(r);if(a!==-1||l!==-1){let u=Math.min(s.length,r.length)/Math.max(s.length,r.length);u>=ooe&&n.push({name:i,quality:"partial",identity:u,offset:a===-1?-l:a});continue}let c=roe(s,r);c>=noe&&n.push({name:i,quality:"similar",identity:c,offset:0})}let o=["partial","similar"];return n.sort((i,s)=>o.indexOf(i.quality)-o.indexOf(s.quality)||s.identity-i.identity)[0]}function dH(e,t){return e.querySeqName||(e.names.includes(t)?t:"")}function Pc(e,t){let[r,n]=(0,wg.useState)(),{names:o,match:i}=(0,wg.useMemo)(()=>fH(e,t),[e,t]),s=r??i?.name??"";return{detected:i,names:o,querySeqName:s,querySeqOffset:s===i?.name?i.offset:0,setQuerySeqName:n,isAutoDetected:r===void 0&&!!i}}var tn=g(k()),Oc=g(H()),mH=g(Bt());var soe=(0,mH.makeStyles)()({field:{marginTop:20},alert:{marginTop:10}});function aoe({identity:e,offset:t}){let r=`, covering ${Math.round(e*100)}% of it`;return t>0?`${r} from residue ${t+1}`:t<0?`${r} and running ${-t} residues past its start`:r}function Bs({names:e,detected:t,querySeqName:r,setQuerySeqName:n,isAutoDetected:o}){let{classes:i}=soe();return tn.default.createElement(tn.default.Fragment,null,e.length>0?tn.default.createElement(Se,{variant:"outlined",label:"MSA row matching the selected transcript",select:!0,fullWidth:!0,className:i.field,value:e.includes(r)?r:"",onChange:s=>{n(s.target.value)}},e.map(s=>tn.default.createElement(Oc.MenuItem,{value:s,key:s},s,t?.name===s?" \u2014 matches your protein":""))):tn.default.createElement(Se,{variant:"outlined",label:"MSA row matching the selected transcript",fullWidth:!0,className:i.field,helperText:"Paste an alignment above and this fills in on its own",value:r,onChange:s=>{n(s.target.value)}}),o&&t?t.quality==="similar"?tn.default.createElement(Oc.Alert,{severity:"warning",className:i.alert},tn.default.createElement("strong",null,t.name)," is"," ",Math.round(t.identity*100),"% identical to your protein but is not the same sequence. Clicking the alignment navigates the genome view, approximately: wherever the two differ by an insertion or a deletion, every residue after it lands one codon off."):tn.default.createElement(Oc.Alert,{severity:"success",className:i.alert},"Matched ",tn.default.createElement("strong",null,t.name)," to your protein sequence",t.quality==="exact"?"":aoe(t),". Clicking the alignment will navigate the genome view."):e.length>0&&!r?tn.default.createElement(Oc.Alert,{severity:"warning",className:i.alert},"No row matched your protein sequence \u2014 pick the one for your gene above. Without it the alignment still renders, but clicking it will not navigate the genome view."):null)}ps();var coe=(0,gH.makeStyles)()({ncbiLink:{wordBreak:"break-all"},textAreaFont:{fontFamily:"Courier New"},msaInput:{marginBottom:20},step:{marginTop:20},stepBody:{marginLeft:20,marginTop:8}}),loe=(0,AH.observer)(function({handleClose:e,feature:t,model:r,children:n,preferredTranscriptId:o}){let{classes:i}=coe(),s=Mr(r),{launchError:a,submit:l}=Pn(e),[c,u]=(0,ke.useState)(""),[f,m]=(0,ke.useState)(""),d=On({feature:t,view:s,preferredTranscriptId:o}),{proteinSequence:p,selectedTranscript:h,error:y}=d,b=Pc(c,p),C=ri(p),I=`${hE}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${C}`,x=`${hE}?PAGE_TYPE=BlastSearch&PAGE=Proteins&PROGRAM=blastp&QUERY=${(0,pH.shorten2)(C,10)}`;return ke.default.createElement(ke.default.Fragment,null,ke.default.createElement(Kr,{error:a??y},n,ke.default.createElement(en,{feature:t,...d}),ke.default.createElement("div",{className:i.step},ke.default.createElement(Ts.Typography,{variant:"subtitle2"},"1. Run the search at NCBI"),ke.default.createElement("div",{className:i.stepBody},p?ke.default.createElement("div",{className:i.ncbiLink},ke.default.createElement(Af,{href:I},x)):ke.default.createElement(Ts.Alert,{severity:"info"},"Pick a transcript above to get a link carrying its protein sequence."))),ke.default.createElement("div",{className:i.step},ke.default.createElement(Ts.Typography,{variant:"subtitle2"},"2. Align the hits"),ke.default.createElement("div",{className:i.stepBody},ke.default.createElement(Ts.Typography,null,`On the results page click "Multiple Alignment" to run COBALT, NCBI's aligner. Download the alignment (.aln) and, if you want the tree drawn, the Newick tree (.nh).`))),ke.default.createElement("div",{className:i.step},ke.default.createElement(Ts.Typography,{variant:"subtitle2"},"3. Paste the results back here"),ke.default.createElement("div",{className:i.stepBody},ke.default.createElement(Se,{variant:"outlined",label:"Alignment",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,className:i.msaInput,slotProps:{input:{className:i.textAreaFont}},placeholder:"Paste the .aln contents here",value:c,onChange:S=>{u(S.target.value)}}),ke.default.createElement(Se,{variant:"outlined",label:"Tree (optional)",multiline:!0,minRows:3,maxRows:10,fullWidth:!0,slotProps:{input:{className:i.textAreaFont}},placeholder:"Paste the .nh Newick tree here",value:f,onChange:S=>{m(S.target.value)}}),ke.default.createElement(Bs,{...b})))),ke.default.createElement(Xr,{model:r,submitDisabled:!h||!c.trim(),onSubmit:S=>{h&&l(()=>{Qr({view:s,feature:h,placement:S,displayName:Jr(h),querySeqName:b.querySeqName,querySeqOffset:b.querySeqOffset,data:{msa:c,tree:f}})})},onCancel:e}))}),hH=loe;var Ms=g(k()),Gn=g(H());function ww({lookupMethod:e,setLookupMethod:t}){return Ms.default.createElement(Gn.FormControl,{component:"fieldset"},Ms.default.createElement(Gn.RadioGroup,{row:!0,value:e,onChange:r=>{t(r.target.value)}},Ms.default.createElement(Gn.FormControlLabel,{value:"automatic",control:Ms.default.createElement(Gn.Radio,null),label:"Automatic"}),Ms.default.createElement(Gn.FormControlLabel,{value:"manual",control:Ms.default.createElement(Gn.Radio,null),label:"Manual"})))}var Lr=g(k()),Yt=g(H()),yH=g(Bt());wc();var uoe=(0,yH.makeStyles)()({field:{minWidth:300},help:{marginBottom:8}});function Sw({handleClose:e,ebiEmail:t}){let{classes:r}=uoe(),[n,o]=(0,Lr.useState)(t);return Lr.default.createElement(Yt.Dialog,{open:!0,maxWidth:"lg",onClose:()=>{e()}},Lr.default.createElement(Yt.DialogTitle,null,"EBI settings"),Lr.default.createElement(Yt.DialogContent,null,Lr.default.createElement(Yt.Typography,{variant:"subtitle2",className:r.help},"Every search this tab runs is submitted to EBI with this address, which is how they reach whoever is generating the load. If your site sends real volume, use your own."),Lr.default.createElement(Se,{autoFocus:!0,margin:"dense",label:"EBI contact email",fullWidth:!0,variant:"outlined",value:n,className:r.field,onChange:i=>{o(i.target.value)}}),Lr.default.createElement(Yt.Button,{variant:"contained",onClick:()=>{o(Cc)}},"Reset")),Lr.default.createElement(Yt.DialogActions,null,Lr.default.createElement(Yt.Button,{variant:"contained",color:"secondary",onClick:()=>{e()}},"Cancel"),Lr.default.createElement(Yt.Button,{color:"primary",variant:"contained",onClick:()=>{e({ebiEmail:n})}},"Save")))}var foe=(0,bH.makeStyles)()({settingsButton:{float:"right"}}),doe={automatic:cH,manual:hH};function Iw({handleClose:e,model:t,feature:r,preferredTranscriptId:n}){let[o,i]=(0,Fr.useState)("automatic"),[s,a]=As(wE,Cc),[l,c]=(0,Fr.useState)(!1),{classes:u}=foe(),f=doe[o];return Fr.default.createElement(Fr.default.Fragment,null,Fr.default.createElement(Sg.Tooltip,{title:`EBI settings \u2014 jobs are submitted with ${s}`},Fr.default.createElement(Sg.IconButton,{className:u.settingsButton,"aria-label":"EBI settings",size:"small",onClick:()=>{c(!0)}},Fr.default.createElement(S8,null))),Fr.default.createElement(f,{model:t,feature:r,handleClose:e,preferredTranscriptId:n},Fr.default.createElement(ww,{lookupMethod:o,setLookupMethod:i})),l?Fr.default.createElement(Sw,{ebiEmail:s,handleClose:m=>{m&&a(m.ebiEmail),c(!1)}}):null)}var Kt=g(k());Mb();var Ig=g(H()),moe=(0,Kt.lazy)(()=>Promise.resolve().then(()=>(wH(),EH)));function vw(){let[e,t]=(0,Kt.useState)(!1);return Kt.default.createElement(Kt.default.Fragment,null,Kt.default.createElement(Ig.Tooltip,{title:"What each tab does"},Kt.default.createElement(Ig.IconButton,{"aria-label":"Help",onClick:()=>{t(!0)}},Kt.default.createElement(ip,null))),e?Kt.default.createElement(Kt.Suspense,{fallback:null},Kt.default.createElement(moe,{handleClose:()=>{t(!1)}})):null)}var Ce=g(k()),Bw=g(Ye()),SH=g(CA()),Hn=g(H()),IH=g(Y()),vH=g(Bt());function poe(e){let t=bg(e,500),{data:r}=Dr(t?[JSON.stringify(t),"msa-file-text"]:null,()=>(0,SH.openLocation)(t).readFile("utf8"));return r??""}var Aoe=(0,vH.makeStyles)()({textAreaFont:{fontFamily:"Courier New"},inputContainer:{marginBottom:30},fileContainer:{maxWidth:500},msaInput:{marginBottom:20}}),goe=(0,IH.observer)(function({model:t,feature:r,handleClose:n,preferredTranscriptId:o}){let i=Mr(t),{classes:s}=Aoe(),{launchError:a,submit:l}=Pn(n),[c,u]=(0,Ce.useState)("file"),[f,m]=(0,Ce.useState)(""),[d,p]=(0,Ce.useState)(""),[h,y]=(0,Ce.useState)(),[b,C]=(0,Ce.useState)(),I=On({feature:r,view:i,preferredTranscriptId:o}),{selectedTranscript:x,proteinSequence:S,error:v,sequenceStatus:B}=I,Q=poe(c==="file"?h:void 0),_=Pc(c==="file"?Q:f,S);return Ce.default.createElement(Ce.default.Fragment,null,Ce.default.createElement(Kr,{error:a??v},Ce.default.createElement(Hn.FormControl,{component:"fieldset"},Ce.default.createElement(Hn.RadioGroup,{row:!0,value:c,onChange:N=>{u(N.target.value)}},Ce.default.createElement(Hn.FormControlLabel,{value:"file",control:Ce.default.createElement(Hn.Radio,null),label:"Open files"}),Ce.default.createElement(Hn.FormControlLabel,{value:"text",control:Ce.default.createElement(Hn.Radio,null),label:"Paste text"}))),Ce.default.createElement("div",{className:s.inputContainer},c==="file"?Ce.default.createElement("div",{className:s.fileContainer},Ce.default.createElement(Bw.FileSelector,{name:"MSA File .aln (Clustal), .fa/.mfa (aligned FASTA), .stock (Stockholm), etc)",inline:!0,location:h,setLocation:y}),Ce.default.createElement(Bw.FileSelector,{name:"Tree file .nh (Newick) or .asn (NCBI COBALT ASN.1)",inline:!0,location:b,setLocation:C})):Ce.default.createElement(Ce.default.Fragment,null,Ce.default.createElement(Se,{variant:"outlined",name:"MSA",multiline:!0,minRows:5,className:s.msaInput,maxRows:10,fullWidth:!0,placeholder:"Paste MSA here",value:f,onChange:N=>{m(N.target.value)}}),Ce.default.createElement(Se,{variant:"outlined",name:"Tree",multiline:!0,minRows:5,maxRows:10,fullWidth:!0,placeholder:"Paste newick tree (optional)",value:d,onChange:N=>{p(N.target.value)}}))),Ce.default.createElement(en,{feature:r,...I}),Ce.default.createElement(Bs,{..._})),Ce.default.createElement(Xr,{model:t,hint:Ce.default.createElement(ho,{status:B}),submitDisabled:!x||c==="file"&&!h||c==="text"&&!f.trim(),onSubmit:N=>{x&&l(()=>{Qr({view:i,feature:x,placement:N,displayName:Jr(x),querySeqName:_.querySeqName,querySeqOffset:_.querySeqOffset,...c==="file"?{msaFilehandle:h,treeFilehandle:b}:{data:{msa:f,tree:d}}})})},onCancel:n}))}),BH=goe;var ft=g(k()),DH=g(H()),NH=g(Y()),LH=g(Bt());var Tw=g(k()),TH=g(H());Ju();var hoe="msaview-ortholog-source",MH={ncbi:"NCBI orthologs",panther:"PANTHER",uniref:"UniRef cluster"},RH=Object.keys(MH);function yoe(e){return RH.find(t=>t===e)??"ncbi"}function kH(){let[e,t]=As(hoe,"ncbi");return[yoe(e),r=>{t(r)}]}var boe={ncbi:"vertebrates and insects",panther:"also yeast, worm, fly and plants",uniref:"all of UniProtKB within 50% identity"};function Mw({value:e,onChange:t,className:r}){return Tw.default.createElement(Se,{variant:"outlined",label:"Source",className:r,select:!0,value:e,helperText:boe[e],onChange:n=>{t(n.target.value)}},RH.map(n=>Tw.default.createElement(TH.MenuItem,{value:n,key:n},MH[n])))}var vg=g(k());async function QH(e){let t=e.trim();if(!t)return;if(/^\d+$/.test(t))return Number(t);let n=(await Bc(bs("esearch",{db:"taxonomy",term:t,retmax:"1",retmode:"json"}))).esearchresult?.idlist?.[0];return n?Number(n):void 0}async function _H(e){let t=e.trim();if(!t)return;let n=(await Bc(bs("esearch",{db:"assembly",term:t,retmax:"1",retmode:"json"}))).esearchresult?.idlist?.[0];if(!n)return;let i=(await Bc(bs("esummary",{db:"assembly",id:n,retmode:"json"}))).result?.[n],s=Number(i?.speciestaxid);return i?.speciesname&&s?{taxId:s,speciesName:i.speciesname}:void 0}async function Coe(e){let t=await QH(e);if(!t)throw new Error(`No NCBI taxon matches "${e}"`);let r=(await ii([t])).get(t),n=[r?.sciname,r?.commonName&&`(${r.commonName})`].filter(Boolean).join(" ");return{taxId:t,label:n||`taxon ${t}`}}function Rw({value:e,assemblyName:t,onChange:r,className:n}){let[o,i]=(0,vg.useState)(),s=bg(o,400),{data:a}=Dr(t&&o===void 0?[t,"assembly-species"]:null,()=>_H(t),{onSuccess:m=>{m&&r(m.taxId)}}),{data:l,error:c}=Dr(s?.trim()?[s.trim(),"taxon"]:null,()=>Coe(s),{onSuccess:({taxId:m})=>{r(m)}}),u=o??a?.speciesName??"human",f=o===void 0?a?.speciesName:l?.label;return vg.default.createElement(Se,{variant:"outlined",label:"Query species",className:n,value:u,onChange:m=>{i(m.target.value)},error:!!c,helperText:c?`${c}`:f??`the species this gene is from (taxon ${e})`})}var xoe=(0,LH.makeStyles)()({selectField:{width:180}}),Eoe={ncbi:e=>`the ${e} closest species NCBI has`,panther:e=>`the ${e} closest species PANTHER has`,uniref:e=>`${e} rows, one per species, reviewed entries first`},woe=(0,NH.observer)(function({handleClose:e,feature:t,model:r,preferredTranscriptId:n}){let{classes:o}=xoe(),i=Mr(r),{launchError:s,submit:a}=Pn(e),[l,c]=(0,ft.useState)(9606),[u,f]=kH(),[m,d]=Eg(),[p,h]=(0,ft.useState)(String(si)),y=(0,ft.useMemo)(()=>hc(t),[t]),b=On({feature:t,view:i,preferredTranscriptId:n}),{selectedTranscript:C,proteinSequence:I,sequenceStatus:x}=b,S=b.error??s,v=Number(p),B=Number.isInteger(v)&&v>=2;return ft.default.createElement(ft.default.Fragment,null,ft.default.createElement(Kr,{error:S},ft.default.createElement(DH.Typography,{variant:"body2"},"Precomputed orthologs, one gene per species, looked up rather than searched for. No BLAST job to queue, and with the in-browser aligner no job at all."),ft.default.createElement("div",null,ft.default.createElement(Mw,{className:o.selectField,value:u,onChange:f}),ft.default.createElement(Rw,{className:o.selectField,value:l,assemblyName:i.assemblyNames[0],onChange:c}),ft.default.createElement(pf,{className:o.selectField,value:m,onChange:d}),ft.default.createElement(Se,{variant:"outlined",label:"Rows to align",className:o.selectField,type:"number",value:p,onChange:Q=>{h(Q.target.value)},error:!B,helperText:B?Eoe[u](v):"a whole number, 2 or more"})),ft.default.createElement(en,{feature:t,...b})),ft.default.createElement(Xr,{model:r,hint:ft.default.createElement(ho,{status:x}),submitDisabled:!I||!B,onSubmit:Q=>{C&&a(()=>{Qr({view:i,feature:C,placement:Q,displayName:`Orthologs - ${Jr(t)} - ${ti(C)}`,...Fc,orthologParams:{taxId:l,source:u,maxSpecies:v,geneCandidates:y,msaAlgorithm:m,selectedTranscript:C.toJSON(),proteinSequence:I}})})},onCancel:e}))}),FH=woe;var Xe=g(k()),Gc=g(Ye()),Tg=g(Ve()),Mg=g(H()),UH=g(Y()),$H=g(Bt());HN();async function PH(e,t){return(await fx(e,"msa",t)).dataAdapter}async function OH({config:e,pluginManager:t}){return(await PH(t,e)).getMSAList()}async function GH({config:e,pluginManager:t,msaId:r}){return(await PH(t,e)).getMSA(r)}var HH=g(Ai());function Bg(e){return(0,HH.readConfObject)(e,["msa","datasets"])}var Soe=(0,$H.makeStyles)()({selectedContainer:{marginTop:50}}),Ioe=(0,UH.observer)(function({model:e,feature:t,handleClose:r,preferredTranscriptId:n}){let o=(0,Tg.getSession)(e),i=Mr(e),{classes:s}=Soe(),{pluginManager:a}=(0,Tg.getEnv)(e),{assemblyNames:l}=i,{launchError:c,submit:u}=Pn(r),f=Bg(o.jbrowse),[m,d]=(0,Xe.useState)(f?.[0]?.datasetId),p=f?.find(R=>R.datasetId===m),{data:h,isLoading:y,error:b}=Dr(p?`${p.datasetId}-msa-list`:null,()=>OH({config:p.adapter,pluginManager:a})),C=On({feature:t,view:i,validIds:h,preferredTranscriptId:n}),{selectedId:I,selectedTranscript:x,proteinSequence:S,sequenceStatus:v}=C,{data:B,isLoading:Q,error:_}=Dr(I&&p&&h?`${p.datasetId}-${I}-msa`:null,()=>GH({msaId:I,config:p.adapter,pluginManager:a})),M=(0,Xe.useMemo)(()=>B?.map(R=>`>${R.get("refName")}
96
96
  ${R.get("seq")}`).join(`
97
- `)??"",[B]),N=Pc(M,S),G=dH(N,`${I}_${l[0]??""}`),E=b??_??C.error??c;return Xe.default.createElement(Xe.default.Fragment,null,Xe.default.createElement(Kr,{error:E},Xe.default.createElement(Se,{select:!0,label:"Select MSA dataset",value:m,onChange:R=>{d(R.target.value)}},f?.map(R=>Xe.default.createElement(Mg.MenuItem,{key:R.datasetId,value:R.datasetId},R.name))),p?Xe.default.createElement("div",{className:s.selectedContainer},!y&&Q?Xe.default.createElement(Gc.LoadingEllipses,{variant:"h6",message:`Loading MSA for ${ti(x)||I}`}):null,y?Xe.default.createElement(Gc.LoadingEllipses,{variant:"h6",message:`Loading available MSAs for (${p.name})`}):null,h?Xe.default.createElement("div",null,Xe.default.createElement(Gc.SanitizedHTML,{html:p.description}),Xe.default.createElement(en,{feature:t,...C}),M?Xe.default.createElement(Bs,{...N,querySeqName:G}):null):null):null),Xe.default.createElement(Xr,{model:e,hint:Q?Xe.default.createElement(Gc.LoadingEllipses,{message:"Loading alignment"}):B?.length&&!G?Xe.default.createElement(Mg.Typography,{color:"textSecondary",variant:"body2"},"no row matches this transcript"):Xe.default.createElement(ho,{status:v}),submitDisabled:!x||!B?.length||!G,onSubmit:R=>{x&&M&&u(()=>{Qr({view:i,feature:x,placement:R,displayName:Jr(x),treeAreaWidth:200,treeWidth:100,drawNodeBubbles:!1,labelsAlignRight:!0,showBranchLen:!1,colWidth:10,rowHeight:12,colorSchemeName:"percent_identity_dynamic",querySeqName:G,querySeqOffset:N.querySeqOffset,data:{msa:M}})})},onCancel:r}))}),VH=Ioe;var Rg=g(k());function Hc({children:e,value:t,index:r,...n}){let o=t===r,[i,s]=(0,Rg.useState)(o);return o&&!i&&s(!0),Rg.default.createElement("div",{role:"tabpanel",hidden:!o,...n},i||o?e:null)}function kw({handleClose:e,feature:t,model:r,preferredTranscriptId:n}){let o=(0,WH.getSession)(r),s=!!Bg(o.jbrowse)?.length,[a,l]=(0,nt.useState)("orthologs");return nt.default.createElement(jH.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},nt.default.createElement(O8,null,nt.default.createElement("div",{style:{display:"flex",alignItems:"center"}},nt.default.createElement(Rs.Tabs,{value:a,onChange:(c,u)=>{l(u)}},nt.default.createElement(Rs.Tab,{label:"Orthologs",value:"orthologs"}),nt.default.createElement(Rs.Tab,{label:"BLAST query",value:"ncbi_blast"}),s?nt.default.createElement(Rs.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,nt.default.createElement(Rs.Tab,{label:"Manual upload",value:"manual_msa"})),nt.default.createElement(vw,null)),nt.default.createElement(Hc,{value:a,index:"orthologs"},nt.default.createElement(FH,{handleClose:e,feature:t,model:r,preferredTranscriptId:n})),nt.default.createElement(Hc,{value:a,index:"ncbi_blast"},nt.default.createElement(Iw,{handleClose:e,feature:t,model:r,preferredTranscriptId:n})),s?nt.default.createElement(Hc,{value:a,index:"preloaded_msa"},nt.default.createElement(VH,{model:r,feature:t,handleClose:e,preferredTranscriptId:n})):null,nt.default.createElement(Hc,{value:a,index:"manual_msa"},nt.default.createElement(BH,{model:r,feature:t,handleClose:e,preferredTranscriptId:n}))))}function qH(e){let t=e.contextMenuInfo,r=e.fetchFullFeature;if(t&&r)return Ag(t.item.type)?{fetchFeature:()=>r(t.item.featureId,t.displayedRegionIndex)}:void 0;let n=e.contextMenuFeature;if(!n)return;let o=E8(n);return Ag(o.get("type"))&&!x8(o)?{feature:o,preferredTranscriptId:n.id()}:void 0}function voe(e){return e.name==="LinearBasicDisplay"}function Boe(e){return e.get("name")??e.get("id")??"This feature"}function Toe(e,t){let r=(0,kg.getContainingTrack)(e),n=(0,kg.getSession)(r),{preferredTranscriptId:o}=t,i=s=>{n.queueDialog(a=>[kw,{model:r,handleClose:a,feature:s,preferredTranscriptId:o}])};if("feature"in t){i(t.feature);return}t.fetchFeature().then(s=>{s?gg(s)?i(s):n.notify(`${Boe(s)} has no coding sequence, so there is no protein to align`,"info"):n.notify("Could not load feature for MSA view","warning")}).catch(s=>{n.notifyError(`${s}`,s)})}function Moe(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=qH(t);return[...r.call(t),...n?[{label:"Launch MSA view",icon:C8,onClick:()=>{Toe(t,n)}}]:[]]}}})}function Qw(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(voe(t)&&(t.stateModel=Moe(t.stateModel)),t))}TA();function Roe({msa:e,tree:t,...r}){let n=e?.includes(`
98
- `)?e:void 0,o=t?.trimStart().startsWith("(")?t:void 0,i=n||o?{...r.data,...n?{msa:n}:{},...o?{tree:o}:{}}:r.data;return{...r,data:i,...e&&!n?{msaFileLocation:{uri:e}}:{},...t&&!o?{treeFileLocation:{uri:t}}:{},querySeqName:r.querySeqName??r.query}}function _w(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,query:n,data:o,msaFileLocation:i,msaIndexedLocation:s,msaName:a,treeFileLocation:l,querySeqName:c,searchParams:u,...f}=Roe(t);if(!o&&!i&&!s&&!f.orthologParams&&!u)throw new Error("No MSA data, file location, orthologParams or searchParams provided when launching MSA view");let m={msaUrl:i?.uri,msaIndexedLocation:s,msaName:a,querySeqName:c};return Lc(r,{...Ny({...f,query:n}),...u?{blastParams:u}:{},data:o,...l?{treeFilehandle:{...l,locationType:"UriLocation"}}:{},...Object.values(m).some(d=>d!==void 0)?{init:m}:{}}),t})}var l9=g(k()),u9=g(YH());var Foe=(0,l9.lazy)(()=>Promise.resolve().then(()=>(c9(),a9)));function Lw(e){e.addViewType(()=>new u9.default({name:"MsaView",stateModel:lw(),ReactComponent:Foe}))}var f9="3.7.1";var Dg=class extends d9.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=f9;this.rootConfigurationSchema=r=>({msa:(0,Fw.ConfigurationSchema)("MSA",{datasets:Pw.types.maybe(Pw.types.array((0,Fw.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Lw(r),Qw(r),_w(r),mw(r),Aw(r)}configure(r){try{(0,m9.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:sB,onClick:n=>{Lc(n,{})}})}catch(n){console.error("jbrowse-plugin-msaview: could not add the Add menu item",n)}}};return O9(Poe);})();
97
+ `)??"",[B]),N=Pc(M,S),G=dH(N,`${I}_${l[0]??""}`),E=b??_??C.error??c;return Xe.default.createElement(Xe.default.Fragment,null,Xe.default.createElement(Kr,{error:E},Xe.default.createElement(Se,{select:!0,label:"Select MSA dataset",value:m,onChange:R=>{d(R.target.value)}},f?.map(R=>Xe.default.createElement(Mg.MenuItem,{key:R.datasetId,value:R.datasetId},R.name))),p?Xe.default.createElement("div",{className:s.selectedContainer},!y&&Q?Xe.default.createElement(Gc.LoadingEllipses,{variant:"h6",message:`Loading MSA for ${ti(x)||I}`}):null,y?Xe.default.createElement(Gc.LoadingEllipses,{variant:"h6",message:`Loading available MSAs for (${p.name})`}):null,h?Xe.default.createElement("div",null,Xe.default.createElement(Gc.SanitizedHTML,{html:p.description}),Xe.default.createElement(en,{feature:t,...C}),M?Xe.default.createElement(Bs,{...N,querySeqName:G}):null):null):null),Xe.default.createElement(Xr,{model:e,hint:Q?Xe.default.createElement(Gc.LoadingEllipses,{message:"Loading alignment"}):B?.length&&!G?Xe.default.createElement(Mg.Typography,{color:"textSecondary",variant:"body2"},"no row matches this transcript"):Xe.default.createElement(ho,{status:v}),submitDisabled:!x||!B?.length||!G,onSubmit:R=>{x&&M&&u(()=>{Qr({view:i,feature:x,placement:R,displayName:Jr(x),treeAreaWidth:200,treeWidth:100,drawNodeBubbles:!1,labelsAlignRight:!0,showBranchLen:!1,colWidth:10,rowHeight:12,colorSchemeName:"percent_identity_dynamic",querySeqName:G,querySeqOffset:N.querySeqOffset,data:{msa:M}})})},onCancel:r}))}),VH=Ioe;var Rg=g(k());function Hc({children:e,value:t,index:r,...n}){let o=t===r,[i,s]=(0,Rg.useState)(o);return o&&!i&&s(!0),Rg.default.createElement("div",{role:"tabpanel",hidden:!o,...n},i||o?e:null)}function kw({handleClose:e,feature:t,model:r,preferredTranscriptId:n}){let o=(0,WH.getSession)(r),s=!!Bg(o.jbrowse)?.length,[a,l]=(0,nt.useState)("orthologs");return nt.default.createElement(jH.Dialog,{maxWidth:"xl",title:"Launch MSA view",open:!0,onClose:e},nt.default.createElement(O8,null,nt.default.createElement("div",{style:{display:"flex",alignItems:"center"}},nt.default.createElement(Rs.Tabs,{value:a,onChange:(c,u)=>{l(u)}},nt.default.createElement(Rs.Tab,{label:"Orthologs",value:"orthologs"}),nt.default.createElement(Rs.Tab,{label:"BLAST query",value:"ncbi_blast"}),s?nt.default.createElement(Rs.Tab,{label:"Pre-loaded MSA datasets",value:"preloaded_msa"}):null,nt.default.createElement(Rs.Tab,{label:"Manual upload",value:"manual_msa"})),nt.default.createElement(vw,null)),nt.default.createElement(Hc,{value:a,index:"orthologs"},nt.default.createElement(FH,{handleClose:e,feature:t,model:r,preferredTranscriptId:n})),nt.default.createElement(Hc,{value:a,index:"ncbi_blast"},nt.default.createElement(Iw,{handleClose:e,feature:t,model:r,preferredTranscriptId:n})),s?nt.default.createElement(Hc,{value:a,index:"preloaded_msa"},nt.default.createElement(VH,{model:r,feature:t,handleClose:e,preferredTranscriptId:n})):null,nt.default.createElement(Hc,{value:a,index:"manual_msa"},nt.default.createElement(BH,{model:r,feature:t,handleClose:e,preferredTranscriptId:n}))))}function qH(e){let t=e.contextMenuInfo,r=e.fetchFullFeature;if(t&&r)return Ag(t.item.type)?{fetchFeature:()=>r(t.item.featureId,t.displayedRegionIndex),preferredTranscriptId:t.subfeature?.featureId}:void 0;let n=e.contextMenuFeature;if(!n)return;let o=E8(n);return Ag(o.get("type"))&&!x8(o)?{feature:o,preferredTranscriptId:n.id()}:void 0}function voe(e){return e.name==="LinearBasicDisplay"}function Boe(e){return e.get("name")??e.get("id")??"This feature"}function Toe(e,t){let r=(0,kg.getContainingTrack)(e),n=(0,kg.getSession)(r),{preferredTranscriptId:o}=t,i=s=>{n.queueDialog(a=>[kw,{model:r,handleClose:a,feature:s,preferredTranscriptId:o}])};if("feature"in t){i(t.feature);return}t.fetchFeature().then(s=>{s?gg(s)?i(s):n.notify(`${Boe(s)} has no coding sequence, so there is no protein to align`,"info"):n.notify("Could not load feature for MSA view","warning")}).catch(s=>{n.notifyError(`${s}`,s)})}function Moe(e){return e.views(t=>{let r=t.contextMenuItems;return{contextMenuItems(){let n=qH(t);return[...r.call(t),...n?[{label:"Launch MSA view",icon:C8,onClick:()=>{Toe(t,n)}}]:[]]}}})}function Qw(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(voe(t)&&(t.stateModel=Moe(t.stateModel)),t))}TA();function Roe({msa:e,tree:t,...r}){let n=e?.includes(`
98
+ `)?e:void 0,o=t?.trimStart().startsWith("(")?t:void 0,i=n||o?{...r.data,...n?{msa:n}:{},...o?{tree:o}:{}}:r.data;return{...r,data:i,...e&&!n?{msaFileLocation:{uri:e}}:{},...t&&!o?{treeFileLocation:{uri:t}}:{},querySeqName:r.querySeqName??r.query}}function _w(e){e.addToExtensionPoint("LaunchView-MsaView",t=>{let{session:r,query:n,data:o,msaFileLocation:i,msaIndexedLocation:s,msaName:a,treeFileLocation:l,querySeqName:c,searchParams:u,...f}=Roe(t);if(!o&&!i&&!s&&!f.orthologParams&&!u)throw new Error("No MSA data, file location, orthologParams or searchParams provided when launching MSA view");let m={msaUrl:i?.uri,msaIndexedLocation:s,msaName:a,querySeqName:c};return Lc(r,{...Ny({...f,query:n}),...u?{blastParams:u}:{},data:o,...l?{treeFilehandle:{...l,locationType:"UriLocation"}}:{},...Object.values(m).some(d=>d!==void 0)?{init:m}:{}}),t})}var l9=g(k()),u9=g(YH());var Foe=(0,l9.lazy)(()=>Promise.resolve().then(()=>(c9(),a9)));function Lw(e){e.addViewType(()=>new u9.default({name:"MsaView",stateModel:lw(),ReactComponent:Foe}))}var f9="3.8.0";var Dg=class extends d9.default{constructor(){super(...arguments);this.name="MsaViewPlugin";this.version=f9;this.rootConfigurationSchema=r=>({msa:(0,Fw.ConfigurationSchema)("MSA",{datasets:Pw.types.maybe(Pw.types.array((0,Fw.ConfigurationSchema)("MSAEntry",{datasetId:{type:"string",defaultValue:""},description:{type:"string",defaultValue:""},name:{type:"string",defaultValue:""},adapter:r.pluggableConfigSchemaType("adapter")})))})})}install(r){Lw(r),Qw(r),_w(r),mw(r),Aw(r)}configure(r){try{(0,m9.isAbstractMenuManager)(r.rootModel)&&r.rootModel.appendToSubMenu(["Add"],{label:"Multiple sequence alignment view",icon:sB,onClick:n=>{Lc(n,{})}})}catch(n){console.error("jbrowse-plugin-msaview: could not add the Add menu item",n)}}};return O9(Poe);})();
99
99
  /*! Bundled license information:
100
100
 
101
101
  react-is/cjs/react-is.production.js: