@jbrowse/core 4.1.3 → 4.1.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/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +8 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +1 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +49 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +8 -2
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +2 -2
- package/esm/data_adapters/BaseAdapter/stats.js +4 -0
- package/esm/pluggableElementTypes/renderers/FeatureRendererType.d.ts +13 -3
- package/esm/pluggableElementTypes/renderers/RenderResult.d.ts +8 -0
- package/esm/pluggableElementTypes/renderers/RenderResult.js +4 -0
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +16 -45
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.js +30 -38
- package/esm/pluggableElementTypes/renderers/ServerSideRendererTypes.d.ts +42 -0
- package/esm/pluggableElementTypes/renderers/ServerSideRendererTypes.js +1 -0
- package/esm/pluggableElementTypes/renderers/SvgRenderResult.d.ts +8 -0
- package/esm/pluggableElementTypes/renderers/SvgRenderResult.js +10 -0
- package/esm/pluggableElementTypes/renderers/index.d.ts +1 -1
- package/esm/rpc/methods/CoreRender.d.ts +12 -2
- package/esm/rpc/methods/util.d.ts +2 -2
- package/esm/util/stats.d.ts +2 -0
- package/esm/util/stats.js +7 -1
- package/package.json +21 -7
|
@@ -4,13 +4,19 @@ import { Button, Typography } from '@mui/material';
|
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
5
|
import SequenceFeatureMenu from "./dialogs/SequenceFeatureMenu.js";
|
|
6
6
|
import SequenceTypeSelector from "./dialogs/SequenceTypeSelector.js";
|
|
7
|
+
import { createSequenceFeatureDetailsModel, destroySequenceFeatureDetailsModel, } from "./model.js";
|
|
7
8
|
import { ErrorMessage, LoadingEllipses } from "../../ui/index.js";
|
|
8
9
|
import { SimpleFeature, getSession } from "../../util/index.js";
|
|
9
10
|
import { useFeatureSequence } from "../../util/useFeatureSequence.js";
|
|
10
11
|
const SequencePanel = lazy(() => import("./SequencePanel.js"));
|
|
11
12
|
const SequenceDialog = lazy(() => import("./dialogs/SequenceDialog.js"));
|
|
12
13
|
const SequenceFeatureDetails = observer(function SequenceFeatureDetails({ model, feature, }) {
|
|
13
|
-
const
|
|
14
|
+
const [sequenceFeatureDetails] = useState(() => createSequenceFeatureDetailsModel());
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
return () => {
|
|
17
|
+
destroySequenceFeatureDetailsModel(sequenceFeatureDetails);
|
|
18
|
+
};
|
|
19
|
+
}, [sequenceFeatureDetails]);
|
|
14
20
|
const { upDownBp } = sequenceFeatureDetails;
|
|
15
21
|
const seqPanelRef = useRef(null);
|
|
16
22
|
const [openInDialog, setOpenInDialog] = useState(false);
|
|
@@ -35,7 +41,7 @@ const SequenceFeatureDetails = observer(function SequenceFeatureDetails({ model,
|
|
|
35
41
|
setOpenInDialog(true);
|
|
36
42
|
},
|
|
37
43
|
},
|
|
38
|
-
] })] }), openInDialog ? (_jsxs("div", { children: ["Open in dialog...", _jsx(Suspense, { fallback: _jsx(LoadingEllipses, {}), children: _jsx(SequenceDialog, { model: model, feature: feature, handleClose: () => {
|
|
44
|
+
] })] }), openInDialog ? (_jsxs("div", { children: ["Open in dialog...", _jsx(Suspense, { fallback: _jsx(LoadingEllipses, {}), children: _jsx(SequenceDialog, { model: model, sequenceFeatureDetails: sequenceFeatureDetails, feature: feature, handleClose: () => {
|
|
39
45
|
setOpenInDialog(false);
|
|
40
46
|
} }) })] })) : (_jsxs("div", { children: [feature.type === 'gene' ? (_jsx(Typography, { children: "Note: inspect subfeature sequences for protein/CDS computations" })) : null, error ? (_jsx(ErrorMessage, { error: error })) : !sequence ? (_jsx(LoadingEllipses, {})) : 'error' in sequence ? (_jsxs(_Fragment, { children: [_jsx(Typography, { color: "error", children: sequence.error }), _jsx(Button, { variant: "contained", color: "inherit", onClick: () => {
|
|
41
47
|
setForceLoad(true);
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type SimpleFeatureSerialized } from '../../../util/index.ts';
|
|
2
2
|
import type { BaseFeatureWidgetModel } from '../../stateModelFactory.ts';
|
|
3
|
-
|
|
3
|
+
import type { SequenceFeatureDetailsModel } from '../model.ts';
|
|
4
|
+
declare const SequenceDialog: ({ handleClose, model, sequenceFeatureDetails, feature, }: {
|
|
4
5
|
handleClose: () => void;
|
|
5
6
|
feature: SimpleFeatureSerialized;
|
|
6
7
|
model: BaseFeatureWidgetModel;
|
|
8
|
+
sequenceFeatureDetails: SequenceFeatureDetailsModel;
|
|
7
9
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
8
10
|
export default SequenceDialog;
|
|
@@ -14,8 +14,7 @@ const useStyles = makeStyles()({
|
|
|
14
14
|
width: '80em',
|
|
15
15
|
},
|
|
16
16
|
});
|
|
17
|
-
const SequenceDialog = observer(function SequenceDialog({ handleClose, model, feature, }) {
|
|
18
|
-
const { sequenceFeatureDetails } = model;
|
|
17
|
+
const SequenceDialog = observer(function SequenceDialog({ handleClose, model, sequenceFeatureDetails, feature, }) {
|
|
19
18
|
const { upDownBp } = sequenceFeatureDetails;
|
|
20
19
|
const { classes } = useStyles();
|
|
21
20
|
const seqPanelRef = useRef(null);
|
|
@@ -24,8 +24,56 @@ export declare function SequenceFeatureDetailsF(): import("@jbrowse/mobx-state-t
|
|
|
24
24
|
readonly hasExon: boolean | undefined;
|
|
25
25
|
readonly hasExonOrCDS: boolean | undefined;
|
|
26
26
|
} & {
|
|
27
|
-
|
|
27
|
+
afterCreate(): void;
|
|
28
28
|
}, import("@jbrowse/mobx-state-tree")._NotCustomized, import("@jbrowse/mobx-state-tree")._NotCustomized>;
|
|
29
|
+
export declare function createSequenceFeatureDetailsModel(): {} & import("@jbrowse/mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
30
|
+
showCoordinatesSetting: string;
|
|
31
|
+
intronBp: number;
|
|
32
|
+
upDownBp: number;
|
|
33
|
+
upperCaseCDS: boolean;
|
|
34
|
+
charactersPerRow: number;
|
|
35
|
+
feature: SimpleFeatureSerialized | undefined;
|
|
36
|
+
mode: SequenceDisplayMode;
|
|
37
|
+
} & {
|
|
38
|
+
setFeature(f: SimpleFeatureSerialized): void;
|
|
39
|
+
setUpDownBp(f: number): void;
|
|
40
|
+
setIntronBp(f: number): void;
|
|
41
|
+
setUpperCaseCDS(f: boolean): void;
|
|
42
|
+
setShowCoordinates(f: ShowCoordinatesMode): void;
|
|
43
|
+
setMode(mode: SequenceDisplayMode): void;
|
|
44
|
+
} & {
|
|
45
|
+
readonly showCoordinates: boolean;
|
|
46
|
+
readonly showGenomicCoordsOption: boolean;
|
|
47
|
+
readonly hasCDS: boolean | undefined;
|
|
48
|
+
readonly hasExon: boolean | undefined;
|
|
49
|
+
readonly hasExonOrCDS: boolean | undefined;
|
|
50
|
+
} & {
|
|
51
|
+
afterCreate(): void;
|
|
52
|
+
} & import("@jbrowse/mobx-state-tree").IStateTreeNode<import("@jbrowse/mobx-state-tree").IModelType<{}, {
|
|
53
|
+
showCoordinatesSetting: string;
|
|
54
|
+
intronBp: number;
|
|
55
|
+
upDownBp: number;
|
|
56
|
+
upperCaseCDS: boolean;
|
|
57
|
+
charactersPerRow: number;
|
|
58
|
+
feature: SimpleFeatureSerialized | undefined;
|
|
59
|
+
mode: SequenceDisplayMode;
|
|
60
|
+
} & {
|
|
61
|
+
setFeature(f: SimpleFeatureSerialized): void;
|
|
62
|
+
setUpDownBp(f: number): void;
|
|
63
|
+
setIntronBp(f: number): void;
|
|
64
|
+
setUpperCaseCDS(f: boolean): void;
|
|
65
|
+
setShowCoordinates(f: ShowCoordinatesMode): void;
|
|
66
|
+
setMode(mode: SequenceDisplayMode): void;
|
|
67
|
+
} & {
|
|
68
|
+
readonly showCoordinates: boolean;
|
|
69
|
+
readonly showGenomicCoordsOption: boolean;
|
|
70
|
+
readonly hasCDS: boolean | undefined;
|
|
71
|
+
readonly hasExon: boolean | undefined;
|
|
72
|
+
readonly hasExonOrCDS: boolean | undefined;
|
|
73
|
+
} & {
|
|
74
|
+
afterCreate(): void;
|
|
75
|
+
}, import("@jbrowse/mobx-state-tree")._NotCustomized, import("@jbrowse/mobx-state-tree")._NotCustomized>>;
|
|
76
|
+
export declare function destroySequenceFeatureDetailsModel(model: SequenceFeatureDetailsModel): void;
|
|
29
77
|
export type SequenceFeatureDetailsStateModel = ReturnType<typeof SequenceFeatureDetailsF>;
|
|
30
78
|
export type SequenceFeatureDetailsModel = Instance<SequenceFeatureDetailsStateModel>;
|
|
31
79
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addDisposer, types } from '@jbrowse/mobx-state-tree';
|
|
1
|
+
import { addDisposer, destroy, types } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
import { autorun } from 'mobx';
|
|
3
3
|
import { localStorageGetBoolean, localStorageGetItem, localStorageGetNumber, localStorageSetItem, } from "../../util/index.js";
|
|
4
4
|
function localStorageSetNumber(key, value) {
|
|
@@ -68,7 +68,7 @@ export function SequenceFeatureDetailsF() {
|
|
|
68
68
|
},
|
|
69
69
|
}))
|
|
70
70
|
.actions(self => ({
|
|
71
|
-
|
|
71
|
+
afterCreate() {
|
|
72
72
|
addDisposer(self, autorun(function sequenceFeatureLocalStorageAutorun() {
|
|
73
73
|
localStorageSetNumber(`${p}-upDownBp`, self.upDownBp);
|
|
74
74
|
localStorageSetNumber(`${p}-intronBp`, self.intronBp);
|
|
@@ -81,3 +81,9 @@ export function SequenceFeatureDetailsF() {
|
|
|
81
81
|
},
|
|
82
82
|
}));
|
|
83
83
|
}
|
|
84
|
+
export function createSequenceFeatureDetailsModel() {
|
|
85
|
+
return SequenceFeatureDetailsF().create({});
|
|
86
|
+
}
|
|
87
|
+
export function destroySequenceFeatureDetailsModel(model) {
|
|
88
|
+
destroy(model);
|
|
89
|
+
}
|
|
@@ -35,7 +35,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
35
35
|
readonly hasExon: boolean | undefined;
|
|
36
36
|
readonly hasExonOrCDS: boolean | undefined;
|
|
37
37
|
} & {
|
|
38
|
-
|
|
38
|
+
afterCreate(): void;
|
|
39
39
|
}, import("@jbrowse/mobx-state-tree")._NotCustomized, import("@jbrowse/mobx-state-tree")._NotCustomized>, [undefined]>;
|
|
40
40
|
descriptions: import("@jbrowse/mobx-state-tree").IType<Record<string, unknown> | undefined, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
|
|
41
41
|
}, {
|
|
@@ -81,7 +81,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
81
81
|
readonly hasExon: boolean | undefined;
|
|
82
82
|
readonly hasExonOrCDS: boolean | undefined;
|
|
83
83
|
} & {
|
|
84
|
-
|
|
84
|
+
afterCreate(): void;
|
|
85
85
|
}, import("@jbrowse/mobx-state-tree")._NotCustomized, import("@jbrowse/mobx-state-tree")._NotCustomized>, [undefined]>;
|
|
86
86
|
descriptions: import("@jbrowse/mobx-state-tree").IType<Record<string, unknown> | undefined, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
|
|
87
87
|
}>>, {
|
|
@@ -6,6 +6,8 @@ const DENSITY_SAMPLE_INITIAL_INTERVAL = 1000;
|
|
|
6
6
|
const DENSITY_SAMPLE_MIN_FEATURES = 70;
|
|
7
7
|
const DENSITY_SAMPLE_TIMEOUT_MS = 5000;
|
|
8
8
|
export function aggregateQuantitativeStats(stats) {
|
|
9
|
+
const meanMins = stats.map(s => s.scoreMeanMin).filter(s => s !== undefined);
|
|
10
|
+
const meanMaxs = stats.map(s => s.scoreMeanMax).filter(s => s !== undefined);
|
|
9
11
|
return rectifyStats({
|
|
10
12
|
scoreMax: max(stats.map(s => s.scoreMax)),
|
|
11
13
|
scoreMin: min(stats.map(s => s.scoreMin)),
|
|
@@ -13,6 +15,8 @@ export function aggregateQuantitativeStats(stats) {
|
|
|
13
15
|
scoreSumSquares: sum(stats.map(s => s.scoreSumSquares)),
|
|
14
16
|
featureCount: sum(stats.map(s => s.featureCount)),
|
|
15
17
|
basesCovered: sum(stats.map(s => s.basesCovered)),
|
|
18
|
+
...(meanMins.length > 0 ? { scoreMeanMin: min(meanMins) } : {}),
|
|
19
|
+
...(meanMaxs.length > 0 ? { scoreMeanMax: max(meanMaxs) } : {}),
|
|
16
20
|
});
|
|
17
21
|
}
|
|
18
22
|
export function sampleFeaturesForInterval(region, interval, getFeatures, opts) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import ServerSideRendererType from './ServerSideRendererType.
|
|
2
|
-
import type { RenderArgs as ServerSideRenderArgs, RenderArgsDeserialized as ServerSideRenderArgsDeserialized, RenderArgsSerialized as ServerSideRenderArgsSerialized, RenderResults as ServerSideRenderResults, RenderReturn, ResultsDeserialized as ServerSideResultsDeserialized, ResultsSerialized as ServerSideResultsSerialized } from './ServerSideRendererType.
|
|
1
|
+
import ServerSideRendererType from './ServerSideRendererType.ts';
|
|
2
|
+
import type { RenderArgs as ServerSideRenderArgs, RenderArgsDeserialized as ServerSideRenderArgsDeserialized, RenderArgsSerialized as ServerSideRenderArgsSerialized, RenderResults as ServerSideRenderResults, RenderReturn, ResultsDeserialized as ServerSideResultsDeserialized, ResultsSerialized as ServerSideResultsSerialized } from './ServerSideRendererType.ts';
|
|
3
3
|
import type { AnyConfigurationModel } from '../../configuration/index.ts';
|
|
4
4
|
import type { Feature, SimpleFeatureSerialized } from '../../util/simpleFeature.ts';
|
|
5
5
|
import type { AugmentedRegion as Region } from '../../util/types/index.ts';
|
|
@@ -45,7 +45,17 @@ export default class FeatureRendererType extends ServerSideRendererType {
|
|
|
45
45
|
html?: string;
|
|
46
46
|
} | {
|
|
47
47
|
blockKey: string;
|
|
48
|
-
reactElement: import("react
|
|
48
|
+
reactElement: import("react").FunctionComponentElement<{
|
|
49
|
+
res: ServerSideResultsSerialized;
|
|
50
|
+
args: ServerSideRenderArgs;
|
|
51
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
52
|
+
supportsSVG: boolean;
|
|
53
|
+
}> | import("react").FunctionComponentElement<{
|
|
54
|
+
res: ServerSideResultsSerialized;
|
|
55
|
+
args: ServerSideRenderArgs;
|
|
56
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
57
|
+
renderingProps?: Record<string, unknown>;
|
|
58
|
+
}>;
|
|
49
59
|
html?: string;
|
|
50
60
|
}>;
|
|
51
61
|
serializeArgsInClient(args: RenderArgs): ServerSideRenderArgsSerialized;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { RenderArgs, ResultsSerialized } from './ServerSideRendererTypes.ts';
|
|
3
|
+
export default function RenderResult({ res, args, ReactComponent, renderingProps, }: {
|
|
4
|
+
res: ResultsSerialized;
|
|
5
|
+
args: RenderArgs;
|
|
6
|
+
ReactComponent: ComponentType<any>;
|
|
7
|
+
renderingProps?: Record<string, unknown>;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,57 +1,28 @@
|
|
|
1
1
|
import RendererType from './RendererType.tsx';
|
|
2
|
-
import
|
|
3
|
-
import type {
|
|
4
|
-
import type { SerializedFilterChain } from './util/serializableFilterChain.ts';
|
|
5
|
-
import type { AnyConfigurationModel } from '../../configuration/index.ts';
|
|
2
|
+
import type { RenderResults } from './RendererType.tsx';
|
|
3
|
+
import type { RenderArgs, RenderArgsDeserialized, RenderArgsSerialized, ResultsDeserialized, ResultsSerialized } from './ServerSideRendererTypes.ts';
|
|
6
4
|
import type RpcManager from '../../rpc/RpcManager.ts';
|
|
7
|
-
|
|
8
|
-
import type { SnapshotIn, SnapshotOrInstance } from '@jbrowse/mobx-state-tree';
|
|
9
|
-
import type { ThemeOptions } from '@mui/material';
|
|
10
|
-
interface BaseRenderArgs extends RenderProps {
|
|
11
|
-
sessionId: string;
|
|
12
|
-
trackInstanceId: string;
|
|
13
|
-
stopToken?: string;
|
|
14
|
-
theme: ThemeOptions;
|
|
15
|
-
exportSVG?: {
|
|
16
|
-
rasterizeLayers?: boolean;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export interface RenderArgs extends BaseRenderArgs {
|
|
20
|
-
config: SnapshotOrInstance<AnyConfigurationModel>;
|
|
21
|
-
filters?: SerializableFilterChain;
|
|
22
|
-
renderingProps?: Record<string, unknown>;
|
|
23
|
-
}
|
|
24
|
-
export interface RenderArgsSerialized extends BaseRenderArgs {
|
|
25
|
-
statusCallback?: (arg: string) => void;
|
|
26
|
-
config: SnapshotIn<AnyConfigurationModel>;
|
|
27
|
-
filters?: SerializedFilterChain;
|
|
28
|
-
}
|
|
29
|
-
export interface RenderArgsDeserialized extends BaseRenderArgs {
|
|
30
|
-
config: AnyConfigurationModel;
|
|
31
|
-
filters?: SerializableFilterChain;
|
|
32
|
-
stopTokenCheck?: LastStopTokenCheck;
|
|
33
|
-
}
|
|
34
|
-
export type ResultsSerialized = Omit<RenderResults, 'reactElement'> & {
|
|
35
|
-
imageData?: ImageBitmap;
|
|
36
|
-
};
|
|
37
|
-
export interface ResultsSerializedSvgExport extends ResultsSerialized {
|
|
38
|
-
canvasRecordedData: unknown;
|
|
39
|
-
width: number;
|
|
40
|
-
height: number;
|
|
41
|
-
reactElement: unknown;
|
|
42
|
-
}
|
|
43
|
-
export type ResultsDeserialized = RenderResults;
|
|
5
|
+
export type { RenderArgs, RenderArgsDeserialized, RenderArgsSerialized, ResultsDeserialized, ResultsSerialized, ResultsSerializedSvgExport, } from './ServerSideRendererTypes.ts';
|
|
44
6
|
export default class ServerSideRenderer extends RendererType {
|
|
7
|
+
private createReactElement;
|
|
45
8
|
renderDirect(args: RenderArgs): Promise<RenderResults | {
|
|
46
|
-
reactElement: import("react
|
|
9
|
+
reactElement: import("react").FunctionComponentElement<{
|
|
10
|
+
res: ResultsSerialized;
|
|
11
|
+
args: RenderArgs;
|
|
12
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
13
|
+
supportsSVG: boolean;
|
|
14
|
+
}> | import("react").FunctionComponentElement<{
|
|
15
|
+
res: ResultsSerialized;
|
|
16
|
+
args: RenderArgs;
|
|
17
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
18
|
+
renderingProps?: Record<string, unknown>;
|
|
19
|
+
}>;
|
|
47
20
|
html?: string;
|
|
48
21
|
}>;
|
|
49
22
|
serializeArgsInClient(args: RenderArgs): RenderArgsSerialized;
|
|
50
23
|
deserializeResultsInClient(res: ResultsSerialized, args: RenderArgs): ResultsDeserialized;
|
|
51
24
|
deserializeArgsInWorker(args: RenderArgsSerialized): RenderArgsDeserialized;
|
|
52
|
-
serializeResultsInWorker(results: RenderResults
|
|
53
|
-
imageData?: ImageBitmap;
|
|
54
|
-
}, _args: RenderArgsDeserialized): ResultsSerialized;
|
|
25
|
+
serializeResultsInWorker(results: RenderResults, _args: RenderArgsDeserialized): ResultsSerialized;
|
|
55
26
|
renderInClient(rpcManager: RpcManager, args: RenderArgs): Promise<ResultsSerialized>;
|
|
56
27
|
renderInWorker(args: RenderArgsSerialized): Promise<ResultsSerialized>;
|
|
57
28
|
freeResourcesInClient(rpcManager: RpcManager, args: RenderArgs): Promise<void>;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createElement } from 'react';
|
|
2
2
|
import { getSnapshot, isStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
3
|
+
import RenderResult from "./RenderResult.js";
|
|
3
4
|
import RendererType from "./RendererType.js";
|
|
5
|
+
import SvgRenderResult from "./SvgRenderResult.js";
|
|
4
6
|
import SerializableFilterChain from "./util/serializableFilterChain.js";
|
|
5
7
|
import { getSerializedSvg, updateStatus } from "../../util/index.js";
|
|
6
8
|
import { isRpcResult } from "../../util/rpc.js";
|
|
@@ -8,22 +10,22 @@ import { checkStopToken2, createStopTokenChecker, } from "../../util/stopToken.j
|
|
|
8
10
|
function isCanvasRecordedSvgExport(e) {
|
|
9
11
|
return 'canvasRecordedData' in e;
|
|
10
12
|
}
|
|
11
|
-
function hasPreRenderedContent(res) {
|
|
12
|
-
return !!res.html;
|
|
13
|
-
}
|
|
14
|
-
function createSvgExportElement(res, args, ReactComponent, supportsSVG) {
|
|
15
|
-
if (hasPreRenderedContent(res)) {
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
if (supportsSVG) {
|
|
19
|
-
return _jsx(ReactComponent, { ...args, ...res });
|
|
20
|
-
}
|
|
21
|
-
return (_jsx("text", { y: "12", fill: "black", children: "SVG export not supported for this track" }));
|
|
22
|
-
}
|
|
23
|
-
function createNormalElement(res, args, ReactComponent, renderingProps) {
|
|
24
|
-
return _jsx(ReactComponent, { ...args, ...res, ...renderingProps });
|
|
25
|
-
}
|
|
26
13
|
export default class ServerSideRenderer extends RendererType {
|
|
14
|
+
createReactElement(res, args) {
|
|
15
|
+
return args.exportSVG
|
|
16
|
+
? createElement(SvgRenderResult, {
|
|
17
|
+
res,
|
|
18
|
+
args,
|
|
19
|
+
ReactComponent: this.ReactComponent,
|
|
20
|
+
supportsSVG: this.supportsSVG,
|
|
21
|
+
})
|
|
22
|
+
: createElement(RenderResult, {
|
|
23
|
+
res,
|
|
24
|
+
args,
|
|
25
|
+
ReactComponent: this.ReactComponent,
|
|
26
|
+
renderingProps: args.renderingProps,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
27
29
|
async renderDirect(args) {
|
|
28
30
|
const { renderingProps, ...rest } = args;
|
|
29
31
|
const config = isStateTreeNode(args.config)
|
|
@@ -36,15 +38,12 @@ export default class ServerSideRenderer extends RendererType {
|
|
|
36
38
|
config,
|
|
37
39
|
});
|
|
38
40
|
if (isRpcResult(results)) {
|
|
39
|
-
|
|
40
|
-
return this.deserializeResultsInClient(unwrapped, args);
|
|
41
|
+
return this.deserializeResultsInClient(results.value, args);
|
|
41
42
|
}
|
|
42
43
|
const { reactElement, ...resultRest } = results;
|
|
43
44
|
return {
|
|
44
45
|
...resultRest,
|
|
45
|
-
reactElement: args
|
|
46
|
-
? createSvgExportElement(resultRest, args, this.ReactComponent, this.supportsSVG)
|
|
47
|
-
: createNormalElement(resultRest, args, this.ReactComponent, renderingProps),
|
|
46
|
+
reactElement: this.createReactElement(resultRest, args),
|
|
48
47
|
};
|
|
49
48
|
}
|
|
50
49
|
serializeArgsInClient(args) {
|
|
@@ -58,12 +57,9 @@ export default class ServerSideRenderer extends RendererType {
|
|
|
58
57
|
};
|
|
59
58
|
}
|
|
60
59
|
deserializeResultsInClient(res, args) {
|
|
61
|
-
const { renderingProps } = args;
|
|
62
60
|
return {
|
|
63
61
|
...res,
|
|
64
|
-
reactElement: args
|
|
65
|
-
? createSvgExportElement(res, args, this.ReactComponent, this.supportsSVG)
|
|
66
|
-
: createNormalElement(res, args, this.ReactComponent, renderingProps),
|
|
62
|
+
reactElement: this.createReactElement(res, args),
|
|
67
63
|
};
|
|
68
64
|
}
|
|
69
65
|
deserializeArgsInWorker(args) {
|
|
@@ -88,30 +84,26 @@ export default class ServerSideRenderer extends RendererType {
|
|
|
88
84
|
const results = (await rpcManager.call(args.sessionId, 'CoreRender', args));
|
|
89
85
|
if (isCanvasRecordedSvgExport(results)) {
|
|
90
86
|
const { reactElement, ...rest } = results;
|
|
91
|
-
return {
|
|
92
|
-
...rest,
|
|
93
|
-
html: await getSerializedSvg(results),
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
return results;
|
|
87
|
+
return { ...rest, html: await getSerializedSvg(results) };
|
|
98
88
|
}
|
|
89
|
+
return results;
|
|
99
90
|
}
|
|
100
91
|
async renderInWorker(args) {
|
|
101
92
|
const { stopToken, statusCallback = () => { } } = args;
|
|
102
93
|
const stopTokenCheck = createStopTokenChecker(stopToken);
|
|
103
|
-
const
|
|
104
|
-
|
|
94
|
+
const deserializedArgs = {
|
|
95
|
+
...this.deserializeArgsInWorker(args),
|
|
96
|
+
stopTokenCheck,
|
|
97
|
+
};
|
|
98
|
+
const results = await updateStatus('Rendering plot', statusCallback, () => this.render(deserializedArgs));
|
|
105
99
|
checkStopToken2(stopTokenCheck);
|
|
106
100
|
if (isRpcResult(results)) {
|
|
107
101
|
return results;
|
|
108
102
|
}
|
|
109
|
-
return updateStatus('Serializing results', statusCallback, () => this.serializeResultsInWorker(results,
|
|
103
|
+
return updateStatus('Serializing results', statusCallback, () => this.serializeResultsInWorker(results, deserializedArgs));
|
|
110
104
|
}
|
|
111
105
|
async freeResourcesInClient(rpcManager, args) {
|
|
112
|
-
|
|
113
|
-
const { sessionId } = args;
|
|
114
|
-
await rpcManager.call(sessionId, 'CoreFreeResources', serializedArgs);
|
|
106
|
+
await rpcManager.call(args.sessionId, 'CoreFreeResources', this.serializeArgsInClient(args));
|
|
115
107
|
}
|
|
116
108
|
}
|
|
117
109
|
export {} from "./RendererType.js";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { RenderProps, RenderResults } from './RendererType.tsx';
|
|
2
|
+
import type SerializableFilterChain from './util/serializableFilterChain.ts';
|
|
3
|
+
import type { SerializedFilterChain } from './util/serializableFilterChain.ts';
|
|
4
|
+
import type { AnyConfigurationModel } from '../../configuration/index.ts';
|
|
5
|
+
import type { LastStopTokenCheck } from '../../util/stopToken.ts';
|
|
6
|
+
import type { SnapshotIn, SnapshotOrInstance } from '@jbrowse/mobx-state-tree';
|
|
7
|
+
import type { ThemeOptions } from '@mui/material';
|
|
8
|
+
interface BaseRenderArgs extends RenderProps {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
trackInstanceId: string;
|
|
11
|
+
stopToken?: string;
|
|
12
|
+
theme: ThemeOptions;
|
|
13
|
+
exportSVG?: {
|
|
14
|
+
rasterizeLayers?: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface RenderArgs extends BaseRenderArgs {
|
|
18
|
+
config: SnapshotOrInstance<AnyConfigurationModel>;
|
|
19
|
+
filters?: SerializableFilterChain;
|
|
20
|
+
renderingProps?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface RenderArgsSerialized extends BaseRenderArgs {
|
|
23
|
+
statusCallback?: (arg: string) => void;
|
|
24
|
+
config: SnapshotIn<AnyConfigurationModel>;
|
|
25
|
+
filters?: SerializedFilterChain;
|
|
26
|
+
}
|
|
27
|
+
export interface RenderArgsDeserialized extends BaseRenderArgs {
|
|
28
|
+
config: AnyConfigurationModel;
|
|
29
|
+
filters?: SerializableFilterChain;
|
|
30
|
+
stopTokenCheck?: LastStopTokenCheck;
|
|
31
|
+
}
|
|
32
|
+
export type ResultsSerialized = Omit<RenderResults, 'reactElement'> & {
|
|
33
|
+
imageData?: ImageBitmap;
|
|
34
|
+
};
|
|
35
|
+
export interface ResultsSerializedSvgExport extends ResultsSerialized {
|
|
36
|
+
canvasRecordedData: unknown;
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
reactElement: unknown;
|
|
40
|
+
}
|
|
41
|
+
export type ResultsDeserialized = RenderResults;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import type { RenderArgs, ResultsSerialized } from './ServerSideRendererTypes.ts';
|
|
3
|
+
export default function SvgRenderResult({ res, args, ReactComponent, supportsSVG, }: {
|
|
4
|
+
res: ResultsSerialized;
|
|
5
|
+
args: RenderArgs;
|
|
6
|
+
ReactComponent: ComponentType<any>;
|
|
7
|
+
supportsSVG: boolean;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export default function SvgRenderResult({ res, args, ReactComponent, supportsSVG, }) {
|
|
3
|
+
if (res.html) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
if (supportsSVG) {
|
|
7
|
+
return _jsx(ReactComponent, { ...args, ...res });
|
|
8
|
+
}
|
|
9
|
+
return (_jsx("text", { y: "12", fill: "black", children: "SVG export not supported for this track" }));
|
|
10
|
+
}
|
|
@@ -2,5 +2,5 @@ export { default as BoxRendererType } from './BoxRendererType.ts';
|
|
|
2
2
|
export { default as CircularChordRendererType } from './CircularChordRendererType.tsx';
|
|
3
3
|
export { default as RendererType } from './RendererType.tsx';
|
|
4
4
|
export { default as FeatureRendererType } from './FeatureRendererType.ts';
|
|
5
|
-
export { default as ServerSideRendererType } from './ServerSideRendererType.
|
|
5
|
+
export { default as ServerSideRendererType } from './ServerSideRendererType.ts';
|
|
6
6
|
export { type RenderProps } from './RendererType.tsx';
|
|
@@ -2,9 +2,19 @@ import RpcMethodType from '../../pluggableElementTypes/RpcMethodType.ts';
|
|
|
2
2
|
import type { RenderArgs, RenderArgsSerialized, RenderResults, ResultsSerialized } from './util.ts';
|
|
3
3
|
export default class CoreRender extends RpcMethodType {
|
|
4
4
|
name: string;
|
|
5
|
-
serializeArguments(args: RenderArgs, rpcDriver: string): Promise<import("../../pluggableElementTypes/renderers/
|
|
5
|
+
serializeArguments(args: RenderArgs, rpcDriver: string): Promise<import("../../pluggableElementTypes/renderers/ServerSideRendererTypes.ts").RenderArgsSerialized>;
|
|
6
6
|
executeDirect(args: RenderArgs): Promise<RenderResults | {
|
|
7
|
-
reactElement: import("react
|
|
7
|
+
reactElement: import("react").FunctionComponentElement<{
|
|
8
|
+
res: ResultsSerialized;
|
|
9
|
+
args: import("../../pluggableElementTypes/renderers/ServerSideRendererTypes.ts").RenderArgs;
|
|
10
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
11
|
+
supportsSVG: boolean;
|
|
12
|
+
}> | import("react").FunctionComponentElement<{
|
|
13
|
+
res: ResultsSerialized;
|
|
14
|
+
args: import("../../pluggableElementTypes/renderers/ServerSideRendererTypes.ts").RenderArgs;
|
|
15
|
+
ReactComponent: import("react").ComponentType<any>;
|
|
16
|
+
renderingProps?: Record<string, unknown>;
|
|
17
|
+
}>;
|
|
8
18
|
html?: string;
|
|
9
19
|
}>;
|
|
10
20
|
execute(args: RenderArgsSerialized & {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ServerSideRendererType } from '../../pluggableElementTypes/index.ts';
|
|
2
|
-
import type { RenderArgs as ServerSideRenderArgs, RenderArgsSerialized as ServerSideRenderArgsSerialized } from '../../pluggableElementTypes/renderers/ServerSideRendererType.
|
|
2
|
+
import type { RenderArgs as ServerSideRenderArgs, RenderArgsSerialized as ServerSideRenderArgsSerialized } from '../../pluggableElementTypes/renderers/ServerSideRendererType.ts';
|
|
3
3
|
import type { Region } from '../../util/index.ts';
|
|
4
4
|
export interface RenderArgs extends ServerSideRenderArgs {
|
|
5
5
|
adapterConfig: Record<string, unknown>;
|
|
@@ -12,4 +12,4 @@ export interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {
|
|
|
12
12
|
rendererType: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function validateRendererType<T>(rendererType: string, RendererType: T): ServerSideRendererType;
|
|
15
|
-
export { type RenderResults, type ResultsSerialized, } from '../../pluggableElementTypes/renderers/ServerSideRendererType.
|
|
15
|
+
export { type RenderResults, type ResultsSerialized, } from '../../pluggableElementTypes/renderers/ServerSideRendererType.ts';
|
package/esm/util/stats.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface UnrectifiedQuantitativeStats {
|
|
|
8
8
|
scoreSumSquares: number;
|
|
9
9
|
featureCount: number;
|
|
10
10
|
basesCovered: number;
|
|
11
|
+
scoreMeanMin?: number;
|
|
12
|
+
scoreMeanMax?: number;
|
|
11
13
|
}
|
|
12
14
|
export interface RectifiedQuantitativeStats extends UnrectifiedQuantitativeStats {
|
|
13
15
|
featureDensity: number;
|
package/esm/util/stats.js
CHANGED
|
@@ -29,17 +29,21 @@ export async function scoresToStats(region, feats) {
|
|
|
29
29
|
const seed = {
|
|
30
30
|
scoreMin: Number.MAX_VALUE,
|
|
31
31
|
scoreMax: Number.MIN_VALUE,
|
|
32
|
+
scoreMeanMin: Number.MAX_VALUE,
|
|
33
|
+
scoreMeanMax: Number.MIN_VALUE,
|
|
32
34
|
scoreSum: 0,
|
|
33
35
|
scoreSumSquares: 0,
|
|
34
36
|
featureCount: 0,
|
|
35
37
|
};
|
|
36
38
|
let found = false;
|
|
37
|
-
const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } = await firstValueFrom(feats.pipe(reduce((acc, f) => {
|
|
39
|
+
const { scoreMin, scoreMax, scoreMeanMin, scoreMeanMax, scoreSum, scoreSumSquares, featureCount, } = await firstValueFrom(feats.pipe(reduce((acc, f) => {
|
|
38
40
|
const s = f.get('score');
|
|
39
41
|
const summary = f.get('summary');
|
|
40
42
|
const { scoreMax, scoreMin } = acc;
|
|
41
43
|
acc.scoreMax = Math.max(scoreMax, summary ? f.get('maxScore') : s);
|
|
42
44
|
acc.scoreMin = Math.min(scoreMin, summary ? f.get('minScore') : s);
|
|
45
|
+
acc.scoreMeanMin = Math.min(acc.scoreMeanMin, s);
|
|
46
|
+
acc.scoreMeanMax = Math.max(acc.scoreMeanMax, s);
|
|
43
47
|
acc.scoreSum += s;
|
|
44
48
|
acc.scoreSumSquares += s * s;
|
|
45
49
|
acc.featureCount += 1;
|
|
@@ -50,6 +54,8 @@ export async function scoresToStats(region, feats) {
|
|
|
50
54
|
? rectifyStats({
|
|
51
55
|
scoreMax,
|
|
52
56
|
scoreMin,
|
|
57
|
+
scoreMeanMin,
|
|
58
|
+
scoreMeanMax,
|
|
53
59
|
scoreSum,
|
|
54
60
|
scoreSumSquares,
|
|
55
61
|
featureCount,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/core",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "JBrowse 2 core libraries used by plugins",
|
|
6
6
|
"keywords": [
|
|
@@ -459,6 +459,14 @@
|
|
|
459
459
|
"./util/fileHandleStore": {
|
|
460
460
|
"types": "./esm/util/fileHandleStore.d.ts",
|
|
461
461
|
"import": "./esm/util/fileHandleStore.js"
|
|
462
|
+
},
|
|
463
|
+
"./util/tss-react/types": {
|
|
464
|
+
"types": "./esm/util/tss-react/types.d.ts",
|
|
465
|
+
"import": "./esm/util/tss-react/types.js"
|
|
466
|
+
},
|
|
467
|
+
"./configuration/configurationSchema": {
|
|
468
|
+
"types": "./esm/configuration/configurationSchema.d.ts",
|
|
469
|
+
"import": "./esm/configuration/configurationSchema.js"
|
|
462
470
|
}
|
|
463
471
|
},
|
|
464
472
|
"files": [
|
|
@@ -468,7 +476,7 @@
|
|
|
468
476
|
"@emotion/react": "^11.14.0",
|
|
469
477
|
"@emotion/serialize": "^1.3.3",
|
|
470
478
|
"@emotion/utils": "^1.4.2",
|
|
471
|
-
"@floating-ui/react": "^0.27.
|
|
479
|
+
"@floating-ui/react": "^0.27.17",
|
|
472
480
|
"@gmod/abortable-promise-cache": "^3.0.4",
|
|
473
481
|
"@gmod/bgzf-filehandle": "^6.0.12",
|
|
474
482
|
"@gmod/http-range-fetcher": "^5.0.7",
|
|
@@ -476,11 +484,11 @@
|
|
|
476
484
|
"@jbrowse/mobx-state-tree": "^5.5.0",
|
|
477
485
|
"@jbrowse/quick-lru": "^7.3.5",
|
|
478
486
|
"@leeoniya/ufuzzy": "^1.0.19",
|
|
479
|
-
"@mui/icons-material": "^7.3.
|
|
480
|
-
"@mui/material": "^7.3.
|
|
481
|
-
"@mui/system": "^7.3.
|
|
482
|
-
"@mui/types": "^7.4.
|
|
483
|
-
"@mui/x-data-grid": "^8.
|
|
487
|
+
"@mui/icons-material": "^7.3.8",
|
|
488
|
+
"@mui/material": "^7.3.8",
|
|
489
|
+
"@mui/system": "^7.3.8",
|
|
490
|
+
"@mui/types": "^7.4.11",
|
|
491
|
+
"@mui/x-data-grid": "^8.27.1",
|
|
484
492
|
"@types/file-saver-es": "^2.0.3",
|
|
485
493
|
"canvas-sequencer-ts": "^3.1.3",
|
|
486
494
|
"canvas2svg": "^1.0.16",
|
|
@@ -850,6 +858,12 @@
|
|
|
850
858
|
],
|
|
851
859
|
"util/fileHandleStore": [
|
|
852
860
|
"esm/util/fileHandleStore.d.ts"
|
|
861
|
+
],
|
|
862
|
+
"util/tss-react/types": [
|
|
863
|
+
"esm/util/tss-react/types.d.ts"
|
|
864
|
+
],
|
|
865
|
+
"configuration/configurationSchema": [
|
|
866
|
+
"esm/configuration/configurationSchema.d.ts"
|
|
853
867
|
]
|
|
854
868
|
}
|
|
855
869
|
}
|