jbrowse-plugin-msaview 2.7.3 → 2.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/LaunchMsaView/components/LaunchMsaViewDialog.js +7 -1
- package/dist/LaunchMsaView/components/OrthologQuery/OrthologPanel.d.ts +8 -0
- package/dist/LaunchMsaView/components/OrthologQuery/OrthologPanel.js +86 -0
- package/dist/LaunchMsaView/components/OrthologQuery/orthologLaunchView.d.ts +9 -0
- package/dist/LaunchMsaView/components/OrthologQuery/orthologLaunchView.js +13 -0
- package/dist/MsaViewPanel/afterCreateAutoruns.d.ts +8 -0
- package/dist/MsaViewPanel/afterCreateAutoruns.js +28 -0
- package/dist/MsaViewPanel/doLaunchOrthologs.d.ts +23 -0
- package/dist/MsaViewPanel/doLaunchOrthologs.js +97 -0
- package/dist/MsaViewPanel/model.d.ts +21 -5
- package/dist/MsaViewPanel/model.js +12 -1
- package/dist/jbrowse-plugin-msaview.umd.production.min.js +31 -27
- package/dist/jbrowse-plugin-msaview.umd.production.min.js.map +4 -4
- package/dist/utils/ncbiOrthologs.d.ts +105 -0
- package/dist/utils/ncbiOrthologs.js +211 -0
- package/dist/utils/ncbiOrthologs.test.d.ts +1 -0
- package/dist/utils/ncbiOrthologs.test.js +41 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/LaunchMsaView/components/LaunchMsaViewDialog.tsx +13 -2
- package/src/LaunchMsaView/components/OrthologQuery/OrthologPanel.tsx +172 -0
- package/src/LaunchMsaView/components/OrthologQuery/orthologLaunchView.ts +28 -0
- package/src/MsaViewPanel/afterCreateAutoruns.ts +27 -0
- package/src/MsaViewPanel/doLaunchOrthologs.ts +123 -0
- package/src/MsaViewPanel/model.ts +24 -0
- package/src/utils/ncbiOrthologs.test.ts +56 -0
- package/src/utils/ncbiOrthologs.ts +320 -0
- package/src/version.ts +1 -1
|
@@ -4,6 +4,7 @@ import { getSession } from '@jbrowse/core/util';
|
|
|
4
4
|
import { Tab, Tabs } from '@mui/material';
|
|
5
5
|
import ManualMSALoader from './ManualMSALoader/ManualMSALoader';
|
|
6
6
|
import NCBIBlastPanel from './NCBIBlastQuery/NCBIBlastPanel';
|
|
7
|
+
import OrthologPanel from './OrthologQuery/OrthologPanel';
|
|
7
8
|
import PreLoadedMSA from './PreLoadedMSA/PreLoadedMSADataPanel';
|
|
8
9
|
import { readMsaDatasets } from './PreLoadedMSA/types';
|
|
9
10
|
import TabPanel from './TabPanel';
|
|
@@ -11,14 +12,19 @@ export default function LaunchMsaViewDialog({ handleClose, feature, model, }) {
|
|
|
11
12
|
const session = getSession(model);
|
|
12
13
|
const datasets = readMsaDatasets(session.jbrowse);
|
|
13
14
|
const hasPreloadedDatasets = !!datasets?.length;
|
|
14
|
-
|
|
15
|
+
// orthologs first, and the default: it answers the same question in ~10s
|
|
16
|
+
// that BLAST takes 10+ minutes to answer worse (see utils/ncbiOrthologs.ts)
|
|
17
|
+
const [value, setValue] = useState('orthologs');
|
|
15
18
|
return (React.createElement(Dialog, { maxWidth: "xl", title: "Launch MSA view", open: true, onClose: handleClose },
|
|
16
19
|
React.createElement(Tabs, { value: value, onChange: (_event, newValue) => {
|
|
17
20
|
setValue(newValue);
|
|
18
21
|
} },
|
|
22
|
+
React.createElement(Tab, { label: "Orthologs (fast)", value: "orthologs" }),
|
|
19
23
|
React.createElement(Tab, { label: "NCBI BLAST query", value: "ncbi_blast" }),
|
|
20
24
|
hasPreloadedDatasets ? (React.createElement(Tab, { label: "Pre-loaded MSA datasets", value: "preloaded_msa" })) : null,
|
|
21
25
|
React.createElement(Tab, { label: "Manual upload", value: "manual_msa" })),
|
|
26
|
+
React.createElement(TabPanel, { value: value, index: "orthologs" },
|
|
27
|
+
React.createElement(OrthologPanel, { handleClose: handleClose, feature: feature, model: model })),
|
|
22
28
|
React.createElement(TabPanel, { value: value, index: "ncbi_blast" },
|
|
23
29
|
React.createElement(NCBIBlastPanel, { handleClose: handleClose, feature: feature, model: model })),
|
|
24
30
|
hasPreloadedDatasets ? (React.createElement(TabPanel, { value: value, index: "preloaded_msa" },
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AbstractTrackModel, Feature } from '@jbrowse/core/util';
|
|
3
|
+
declare const OrthologPanel: ({ handleClose, feature, model, }: {
|
|
4
|
+
model: AbstractTrackModel;
|
|
5
|
+
feature: Feature;
|
|
6
|
+
handleClose: () => void;
|
|
7
|
+
}) => React.JSX.Element;
|
|
8
|
+
export default OrthologPanel;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import React, { useMemo, useState } from 'react';
|
|
2
|
+
import { Checkbox, FormControlLabel, MenuItem, Typography } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
import { makeStyles } from 'tss-react/mui';
|
|
5
|
+
import { orthologLaunchView } from './orthologLaunchView';
|
|
6
|
+
import TextField2 from '../../../components/TextField2';
|
|
7
|
+
import { COMMON_SPECIES } from '../../../utils/ncbiOrthologs';
|
|
8
|
+
import { getGeneDisplayName, getGeneIdentifiers, getLinearGenomeView, getTranscriptDisplayName, } from '../../util';
|
|
9
|
+
import LaunchPanelContent from '../LaunchPanelContent';
|
|
10
|
+
import MsaAlgorithmSelect from '../NCBIBlastQuery/MsaAlgorithmSelect';
|
|
11
|
+
import SubmitCancelActions from '../SubmitCancelActions';
|
|
12
|
+
import TranscriptSelector from '../TranscriptSelector';
|
|
13
|
+
import { useTranscriptSelection } from '../useTranscriptSelection';
|
|
14
|
+
const useStyles = makeStyles()({
|
|
15
|
+
selectField: {
|
|
16
|
+
width: 180,
|
|
17
|
+
},
|
|
18
|
+
speciesBox: {
|
|
19
|
+
display: 'flex',
|
|
20
|
+
flexWrap: 'wrap',
|
|
21
|
+
maxWidth: 560,
|
|
22
|
+
marginTop: 12,
|
|
23
|
+
},
|
|
24
|
+
species: {
|
|
25
|
+
width: 160,
|
|
26
|
+
},
|
|
27
|
+
infoText: {
|
|
28
|
+
marginTop: 20,
|
|
29
|
+
maxWidth: 620,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const OrthologPanel = observer(function ({ handleClose, feature, model, }) {
|
|
33
|
+
const { classes } = useStyles();
|
|
34
|
+
const view = getLinearGenomeView(model);
|
|
35
|
+
const [launchViewError, setLaunchViewError] = useState();
|
|
36
|
+
const [taxId, setTaxId] = useState(9606);
|
|
37
|
+
const [msaAlgorithm, setMsaAlgorithm] = useState('clustalo');
|
|
38
|
+
const [excluded, setExcluded] = useState([]);
|
|
39
|
+
const geneCandidates = useMemo(() => getGeneIdentifiers(feature), [feature]);
|
|
40
|
+
const transcriptSelection = useTranscriptSelection({ feature, view });
|
|
41
|
+
const { selectedTranscript, proteinSequence } = transcriptSelection;
|
|
42
|
+
const e = transcriptSelection.error ?? launchViewError;
|
|
43
|
+
const taxa = COMMON_SPECIES.map(s => s.taxId).filter(t => !excluded.includes(t));
|
|
44
|
+
return (React.createElement(React.Fragment, null,
|
|
45
|
+
React.createElement(LaunchPanelContent, { error: e },
|
|
46
|
+
React.createElement(Typography, null, "Builds the alignment from NCBI's precomputed orthologs \u2014 one gene per species \u2014 instead of searching. There is no job to wait on: the NCBI lookups take about a second, and only the multiple alignment at EBI costs real time (~10s), against 10+ minutes for BLAST. Rows come out labelled by species rather than by accession, and NCBI's CDD domains are overlaid automatically."),
|
|
47
|
+
React.createElement("div", null,
|
|
48
|
+
React.createElement(TextField2, { variant: "outlined", label: "Query species", className: classes.selectField, select: true, value: taxId, onChange: event => {
|
|
49
|
+
setTaxId(Number(event.target.value));
|
|
50
|
+
}, helperText: "the species this gene is from" }, COMMON_SPECIES.map(s => (React.createElement(MenuItem, { value: s.taxId, key: s.taxId }, s.label)))),
|
|
51
|
+
React.createElement(MsaAlgorithmSelect, { className: classes.selectField, value: msaAlgorithm, onChange: setMsaAlgorithm })),
|
|
52
|
+
React.createElement(Typography, { variant: "subtitle2", style: { marginTop: 12 } }, "Species to include (those without an ortholog are skipped)"),
|
|
53
|
+
React.createElement("div", { className: classes.speciesBox }, COMMON_SPECIES.map(s => (React.createElement(FormControlLabel, { className: classes.species, key: s.taxId, control: React.createElement(Checkbox, { checked: !excluded.includes(s.taxId), onChange: event => {
|
|
54
|
+
setExcluded(event.target.checked
|
|
55
|
+
? excluded.filter(t => t !== s.taxId)
|
|
56
|
+
: [...excluded, s.taxId]);
|
|
57
|
+
} }), label: s.label })))),
|
|
58
|
+
React.createElement(TranscriptSelector, { feature: feature, ...transcriptSelection }),
|
|
59
|
+
React.createElement(Typography, { className: classes.infoText, variant: "body2" }, "The query row is the transcript selected above, not NCBI's representative protein, so the alignment stays linked to the genome view at codon resolution.")),
|
|
60
|
+
React.createElement(SubmitCancelActions, { submitDisabled: !proteinSequence || taxa.length < 2, onSubmit: () => {
|
|
61
|
+
try {
|
|
62
|
+
if (selectedTranscript) {
|
|
63
|
+
setLaunchViewError(undefined);
|
|
64
|
+
orthologLaunchView({
|
|
65
|
+
feature: selectedTranscript,
|
|
66
|
+
view,
|
|
67
|
+
newViewTitle: `Orthologs - ${getGeneDisplayName(feature)} - ${getTranscriptDisplayName(selectedTranscript)}`,
|
|
68
|
+
orthologParams: {
|
|
69
|
+
taxId,
|
|
70
|
+
taxa,
|
|
71
|
+
geneCandidates,
|
|
72
|
+
msaAlgorithm,
|
|
73
|
+
selectedTranscript,
|
|
74
|
+
proteinSequence,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
handleClose();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(e);
|
|
82
|
+
setLaunchViewError(e);
|
|
83
|
+
}
|
|
84
|
+
}, onCancel: handleClose })));
|
|
85
|
+
});
|
|
86
|
+
export default OrthologPanel;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OrthologParams } from '../../../MsaViewPanel/model';
|
|
2
|
+
import type { Feature } from '@jbrowse/core/util';
|
|
3
|
+
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
|
|
4
|
+
export declare function orthologLaunchView({ newViewTitle, view, feature, orthologParams, }: {
|
|
5
|
+
newViewTitle: string;
|
|
6
|
+
view: LinearGenomeViewModel;
|
|
7
|
+
feature: Feature;
|
|
8
|
+
orthologParams: OrthologParams;
|
|
9
|
+
}): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getSession } from '@jbrowse/core/util';
|
|
2
|
+
export function orthologLaunchView({ newViewTitle, view, feature, orthologParams, }) {
|
|
3
|
+
getSession(view).addView('MsaView', {
|
|
4
|
+
type: 'MsaView',
|
|
5
|
+
displayName: newViewTitle,
|
|
6
|
+
connectedViewId: view.id,
|
|
7
|
+
connectedFeature: feature.toJSON(),
|
|
8
|
+
drawNodeBubbles: true,
|
|
9
|
+
colWidth: 10,
|
|
10
|
+
rowHeight: 12,
|
|
11
|
+
orthologParams,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { JBrowsePluginMsaViewModel } from './model';
|
|
2
2
|
export declare function loadStoredData(self: JBrowsePluginMsaViewModel): void;
|
|
3
3
|
export declare function storeDataToIndexedDB(self: JBrowsePluginMsaViewModel): void;
|
|
4
|
+
/**
|
|
5
|
+
* Same shape as launchBlastIfNeeded, for the ortholog path: the params ARE the
|
|
6
|
+
* request, and clearing them on success is what marks it done. They are left in
|
|
7
|
+
* place on failure so the error stays attributable to a specific request; the
|
|
8
|
+
* autorun's only tracked read is orthologParams itself, so nothing refires
|
|
9
|
+
* until a new request replaces them.
|
|
10
|
+
*/
|
|
11
|
+
export declare function launchOrthologsIfNeeded(self: JBrowsePluginMsaViewModel): void;
|
|
4
12
|
export declare function launchBlastIfNeeded(self: JBrowsePluginMsaViewModel): void;
|
|
5
13
|
/**
|
|
6
14
|
* Once an accession-bearing alignment is present (fresh from BLAST or restored
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getSession } from '@jbrowse/core/util';
|
|
2
2
|
import { doLaunchBlast } from './doLaunchBlast';
|
|
3
|
+
import { doLaunchOrthologs } from './doLaunchOrthologs';
|
|
3
4
|
import { fetchIndexedMsa } from './fetchIndexedMsa';
|
|
4
5
|
import { genomeToMSA } from './genomeToMSA';
|
|
5
6
|
import { loadProteinDomains } from './loadProteinDomains';
|
|
@@ -69,6 +70,33 @@ export function storeDataToIndexedDB(self) {
|
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Same shape as launchBlastIfNeeded, for the ortholog path: the params ARE the
|
|
75
|
+
* request, and clearing them on success is what marks it done. They are left in
|
|
76
|
+
* place on failure so the error stays attributable to a specific request; the
|
|
77
|
+
* autorun's only tracked read is orthologParams itself, so nothing refires
|
|
78
|
+
* until a new request replaces them.
|
|
79
|
+
*/
|
|
80
|
+
export function launchOrthologsIfNeeded(self) {
|
|
81
|
+
if (self.orthologParams) {
|
|
82
|
+
void (async () => {
|
|
83
|
+
try {
|
|
84
|
+
self.setProgress('Resolving orthologs');
|
|
85
|
+
self.setError(undefined);
|
|
86
|
+
const data = await doLaunchOrthologs({ self });
|
|
87
|
+
self.setData(data);
|
|
88
|
+
self.setOrthologParams(undefined);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
self.setError(e);
|
|
92
|
+
console.error(e);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
self.setProgress('');
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
72
100
|
export function launchBlastIfNeeded(self) {
|
|
73
101
|
if (self.blastParams) {
|
|
74
102
|
void (async () => {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { JBrowsePluginMsaViewModel } from './model';
|
|
2
|
+
/**
|
|
3
|
+
* The no-search-job alternative to doLaunchBlast.
|
|
4
|
+
*
|
|
5
|
+
* BLAST spends 10+ minutes answering "what looks like this sequence" and
|
|
6
|
+
* returns a redundant, accession-labelled hit list. This asks NCBI the question
|
|
7
|
+
* the alignment actually wants — "what is this gene's ortholog in each species"
|
|
8
|
+
* — which NCBI has already computed, so the whole NCBI half returns in about a
|
|
9
|
+
* second and only the EBI alignment (~10s) costs real time.
|
|
10
|
+
*
|
|
11
|
+
* The query row is the user's OWN selected transcript, not NCBI's
|
|
12
|
+
* representative protein for the query species, because `connectedFeature`
|
|
13
|
+
* maps genome coordinates through that row — swapping in a different isoform
|
|
14
|
+
* would silently break the genome<->MSA linkage. The query species is therefore
|
|
15
|
+
* excluded from the ortholog set rather than appearing twice.
|
|
16
|
+
*/
|
|
17
|
+
export declare function doLaunchOrthologs({ self, }: {
|
|
18
|
+
self: JBrowsePluginMsaViewModel;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
treeMetadata: string;
|
|
21
|
+
msa: string;
|
|
22
|
+
tree: string;
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { cleanProteinSequence } from '../LaunchMsaView/util';
|
|
2
|
+
import { launchMSA } from '../utils/msa';
|
|
3
|
+
import { fetchOrthologRows, fetchProteinForGene, resolveGeneId, } from '../utils/ncbiOrthologs';
|
|
4
|
+
/**
|
|
5
|
+
* The no-search-job alternative to doLaunchBlast.
|
|
6
|
+
*
|
|
7
|
+
* BLAST spends 10+ minutes answering "what looks like this sequence" and
|
|
8
|
+
* returns a redundant, accession-labelled hit list. This asks NCBI the question
|
|
9
|
+
* the alignment actually wants — "what is this gene's ortholog in each species"
|
|
10
|
+
* — which NCBI has already computed, so the whole NCBI half returns in about a
|
|
11
|
+
* second and only the EBI alignment (~10s) costs real time.
|
|
12
|
+
*
|
|
13
|
+
* The query row is the user's OWN selected transcript, not NCBI's
|
|
14
|
+
* representative protein for the query species, because `connectedFeature`
|
|
15
|
+
* maps genome coordinates through that row — swapping in a different isoform
|
|
16
|
+
* would silently break the genome<->MSA linkage. The query species is therefore
|
|
17
|
+
* excluded from the ortholog set rather than appearing twice.
|
|
18
|
+
*/
|
|
19
|
+
export async function doLaunchOrthologs({ self, }) {
|
|
20
|
+
const { taxId, taxa, geneCandidates, msaAlgorithm, proteinSequence } = self.orthologParams;
|
|
21
|
+
const cleanedSeq = cleanProteinSequence(proteinSequence);
|
|
22
|
+
const onProgress = (arg) => {
|
|
23
|
+
self.setProgress(arg);
|
|
24
|
+
};
|
|
25
|
+
onProgress('Resolving gene at NCBI...');
|
|
26
|
+
const resolved = await resolveGeneId(geneCandidates, taxId);
|
|
27
|
+
if (!resolved) {
|
|
28
|
+
throw new Error(`Could not resolve any of ${geneCandidates.join(', ')} to an NCBI gene in taxon ${taxId}. Try the NCBI BLAST tab, which needs no gene identifier.`);
|
|
29
|
+
}
|
|
30
|
+
// the query species is represented by the user's own transcript below
|
|
31
|
+
const wanted = new Set(taxa.filter(t => t !== taxId));
|
|
32
|
+
const rows = await fetchOrthologRows({
|
|
33
|
+
geneId: resolved.geneId,
|
|
34
|
+
taxa: wanted,
|
|
35
|
+
onProgress,
|
|
36
|
+
});
|
|
37
|
+
const treeMetadata = {
|
|
38
|
+
QUERY: await buildQueryMetadata(self, resolved.geneId, cleanedSeq),
|
|
39
|
+
};
|
|
40
|
+
for (const row of rows) {
|
|
41
|
+
treeMetadata[row.label] = buildRowMetadata(row);
|
|
42
|
+
}
|
|
43
|
+
const result = await launchMSA({
|
|
44
|
+
algorithm: msaAlgorithm,
|
|
45
|
+
sequence: [
|
|
46
|
+
`>QUERY\n${cleanedSeq}`,
|
|
47
|
+
...rows.map(r => `>${r.label}\n${r.sequence}`),
|
|
48
|
+
].join('\n'),
|
|
49
|
+
onProgress,
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
...result,
|
|
53
|
+
treeMetadata: JSON.stringify(treeMetadata),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The query row is the user's own translated transcript, so it carries an
|
|
58
|
+
* Accession — which is what drives the automatic CDD overlay
|
|
59
|
+
* (afterCreateAutoruns.autoLoadProteinDomains -> loadProteinDomains) — ONLY
|
|
60
|
+
* when its sequence is byte-identical to the RefSeq protein that accession
|
|
61
|
+
* names. Attaching it unconditionally would put every domain box at an offset
|
|
62
|
+
* whenever the user picked a non-representative isoform, which is a silently
|
|
63
|
+
* wrong figure rather than a missing one.
|
|
64
|
+
*/
|
|
65
|
+
async function buildQueryMetadata(self, geneId, proteinSequence) {
|
|
66
|
+
const transcript = self.orthologParams?.selectedTranscript;
|
|
67
|
+
const metadata = { 'Gene ID': geneId };
|
|
68
|
+
const name = transcript?.get('name') ?? transcript?.get('id');
|
|
69
|
+
if (name) {
|
|
70
|
+
metadata.Transcript = name;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const representative = await fetchProteinForGene(geneId);
|
|
74
|
+
if (representative?.sequence === proteinSequence) {
|
|
75
|
+
metadata.Accession = representative.accession;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
// a failed lookup only costs the query row its domain overlay, so it must
|
|
80
|
+
// not take down an alignment that is otherwise complete
|
|
81
|
+
console.warn('[msaview-orthologs] query protein lookup failed:', e);
|
|
82
|
+
}
|
|
83
|
+
return metadata;
|
|
84
|
+
}
|
|
85
|
+
function buildRowMetadata(row) {
|
|
86
|
+
const metadata = {
|
|
87
|
+
'Scientific name': row.scientificName,
|
|
88
|
+
// Accession drives the automatic CDD domain overlay
|
|
89
|
+
// (afterCreateAutoruns.autoLoadProteinDomains -> loadProteinDomains)
|
|
90
|
+
Accession: row.protein,
|
|
91
|
+
'Gene ID': row.geneId,
|
|
92
|
+
};
|
|
93
|
+
if (row.commonName) {
|
|
94
|
+
metadata['Common name'] = row.commonName;
|
|
95
|
+
}
|
|
96
|
+
return metadata;
|
|
97
|
+
}
|
|
@@ -20,6 +20,17 @@ export interface BlastParams {
|
|
|
20
20
|
proteinSequence: string;
|
|
21
21
|
rid?: string;
|
|
22
22
|
}
|
|
23
|
+
export interface OrthologParams {
|
|
24
|
+
/** NCBI taxon id of the assembly the query gene came from */
|
|
25
|
+
taxId: number;
|
|
26
|
+
/** taxon ids to include as rows (the query taxon is represented by QUERY) */
|
|
27
|
+
taxa: number[];
|
|
28
|
+
/** candidate gene identifiers off the feature, tried in order */
|
|
29
|
+
geneCandidates: string[];
|
|
30
|
+
msaAlgorithm: MsaAlgorithm;
|
|
31
|
+
selectedTranscript?: Feature;
|
|
32
|
+
proteinSequence: string;
|
|
33
|
+
}
|
|
23
34
|
/**
|
|
24
35
|
* #stateModel MsaViewPlugin
|
|
25
36
|
* extends
|
|
@@ -42,7 +53,7 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
42
53
|
bgColor: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
43
54
|
colorSchemeName: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
44
55
|
showColumnStats: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
45
|
-
msaFormat: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<import("
|
|
56
|
+
msaFormat: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<import("msa-parsers").MSAFormat>>;
|
|
46
57
|
}, "height" | "id" | "type" | "allowedGappyness" | "colWidth" | "collapsed" | "currentAlignment" | "data" | "drawMsaLetters" | "featureFilters" | "gffFilehandle" | "hideGaps" | "highlightColumns" | "msaFilehandle" | "relativeTo" | "rowHeight" | "scrollX" | "scrollY" | "scrollZoom" | "showDomains" | "showOnly" | "subFeatureRows" | "treeFilehandle" | "treeMetadataFilehandle" | "turnedOffTracks"> & {
|
|
47
58
|
id: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
48
59
|
showDomains: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>, [undefined]>;
|
|
@@ -456,10 +467,11 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
456
467
|
featureFilters: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").IMapType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>>, [undefined]>;
|
|
457
468
|
relativeTo: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<string>>;
|
|
458
469
|
highlightColumns: import("@jbrowse/mobx-state-tree").IType<number[] | undefined, number[] | undefined, number[] | undefined>;
|
|
459
|
-
}, "init" | "querySeqName" | "zoomToBaseLevel" | "connectedViewId" | "connectedFeature" | "blastParams" | "uniprotId" | "dataStoreId" | "mafRegion"> & {
|
|
470
|
+
}, "init" | "querySeqName" | "zoomToBaseLevel" | "connectedViewId" | "connectedFeature" | "blastParams" | "orthologParams" | "uniprotId" | "dataStoreId" | "mafRegion"> & {
|
|
460
471
|
connectedViewId: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<string>>;
|
|
461
472
|
connectedFeature: import("@jbrowse/mobx-state-tree").IType<any, any, any>;
|
|
462
473
|
blastParams: import("@jbrowse/mobx-state-tree").IType<BlastParams | undefined, BlastParams | undefined, BlastParams | undefined>;
|
|
474
|
+
orthologParams: import("@jbrowse/mobx-state-tree").IType<OrthologParams | undefined, OrthologParams | undefined, OrthologParams | undefined>;
|
|
463
475
|
querySeqName: import("@jbrowse/mobx-state-tree").IType<string | undefined, string, string>;
|
|
464
476
|
uniprotId: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<string>>;
|
|
465
477
|
zoomToBaseLevel: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
@@ -495,7 +507,7 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
495
507
|
setColorSchemeName(name: string): void;
|
|
496
508
|
setBgColor(arg: boolean): void;
|
|
497
509
|
setShowColumnStats(arg: boolean): void;
|
|
498
|
-
setMSAFormat(arg?: import("
|
|
510
|
+
setMSAFormat(arg?: import("msa-parsers").MSAFormat): void;
|
|
499
511
|
} & {
|
|
500
512
|
headerHeight: number;
|
|
501
513
|
status: {
|
|
@@ -582,7 +594,7 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
582
594
|
readonly noDomains: boolean;
|
|
583
595
|
menuItems(): never[];
|
|
584
596
|
readonly treeMetadata: Record<string, Record<string, string> | undefined>;
|
|
585
|
-
readonly MSA: import("
|
|
597
|
+
readonly MSA: import("msa-parsers").MSAParserType | null;
|
|
586
598
|
readonly numColumns: number;
|
|
587
599
|
readonly tree: import("react-msaview").NodeWithIds;
|
|
588
600
|
readonly rowNames: string[];
|
|
@@ -879,6 +891,10 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
879
891
|
* #action
|
|
880
892
|
*/
|
|
881
893
|
setBlastParams(args?: BlastParams): void;
|
|
894
|
+
/**
|
|
895
|
+
* #action
|
|
896
|
+
*/
|
|
897
|
+
setOrthologParams(args?: OrthologParams): void;
|
|
882
898
|
/**
|
|
883
899
|
* #action
|
|
884
900
|
*/
|
|
@@ -940,7 +956,7 @@ export default function stateModelFactory(): import("@jbrowse/mobx-state-tree").
|
|
|
940
956
|
bgColor: boolean;
|
|
941
957
|
colorSchemeName: string;
|
|
942
958
|
showColumnStats: boolean;
|
|
943
|
-
msaFormat: import("
|
|
959
|
+
msaFormat: import("msa-parsers").MSAFormat | undefined;
|
|
944
960
|
drawLabels: boolean;
|
|
945
961
|
labelsAlignRight: boolean;
|
|
946
962
|
treeAreaWidth: number;
|
|
@@ -4,7 +4,7 @@ import { addDisposer, types } from '@jbrowse/mobx-state-tree';
|
|
|
4
4
|
import { genomeToTranscriptSeqMapping } from 'g2p_mapper';
|
|
5
5
|
import { autorun } from 'mobx';
|
|
6
6
|
import { MSAModelF } from 'react-msaview';
|
|
7
|
-
import { autoLoadProteinDomains, launchBlastIfNeeded, loadStoredData, observeProteinHighlights, processInit, runCleanup, storeDataToIndexedDB, syncGenomeHoverToMsaColumn, } from './afterCreateAutoruns';
|
|
7
|
+
import { autoLoadProteinDomains, launchBlastIfNeeded, launchOrthologsIfNeeded, loadStoredData, observeProteinHighlights, processInit, runCleanup, storeDataToIndexedDB, syncGenomeHoverToMsaColumn, } from './afterCreateAutoruns';
|
|
8
8
|
import { msaCoordToGenomeCoord, msaCoordToGenomeRegions, } from './msaCoordToGenomeCoord';
|
|
9
9
|
/**
|
|
10
10
|
* #stateModel MsaViewPlugin
|
|
@@ -26,6 +26,10 @@ export default function stateModelFactory() {
|
|
|
26
26
|
* #property
|
|
27
27
|
*/
|
|
28
28
|
blastParams: types.frozen(),
|
|
29
|
+
/**
|
|
30
|
+
* #property
|
|
31
|
+
*/
|
|
32
|
+
orthologParams: types.frozen(),
|
|
29
33
|
/**
|
|
30
34
|
* #property
|
|
31
35
|
*/
|
|
@@ -183,6 +187,12 @@ export default function stateModelFactory() {
|
|
|
183
187
|
setBlastParams(args) {
|
|
184
188
|
self.blastParams = args;
|
|
185
189
|
},
|
|
190
|
+
/**
|
|
191
|
+
* #action
|
|
192
|
+
*/
|
|
193
|
+
setOrthologParams(args) {
|
|
194
|
+
self.orthologParams = args;
|
|
195
|
+
},
|
|
186
196
|
/**
|
|
187
197
|
* #action
|
|
188
198
|
*/
|
|
@@ -289,6 +299,7 @@ export default function stateModelFactory() {
|
|
|
289
299
|
loadStoredData,
|
|
290
300
|
storeDataToIndexedDB,
|
|
291
301
|
launchBlastIfNeeded,
|
|
302
|
+
launchOrthologsIfNeeded,
|
|
292
303
|
processInit,
|
|
293
304
|
autoLoadProteinDomains,
|
|
294
305
|
]) {
|