@jbrowse/plugin-canvas 4.0.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.
- package/LICENSE +201 -0
- package/esm/CanvasFeatureRenderer/CanvasFeatureRenderer.d.ts +6 -0
- package/esm/CanvasFeatureRenderer/CanvasFeatureRenderer.js +30 -0
- package/esm/CanvasFeatureRenderer/CanvasFeatureRendering.d.ts +17 -0
- package/esm/CanvasFeatureRenderer/CanvasFeatureRendering.js +192 -0
- package/esm/CanvasFeatureRenderer/configSchema.d.ts +136 -0
- package/esm/CanvasFeatureRenderer/configSchema.js +152 -0
- package/esm/CanvasFeatureRenderer/configSchema2.d.ts +136 -0
- package/esm/CanvasFeatureRenderer/configSchema2.js +5 -0
- package/esm/CanvasFeatureRenderer/doAll.d.ts +21 -0
- package/esm/CanvasFeatureRenderer/doAll.js +42 -0
- package/esm/CanvasFeatureRenderer/drawChevrons.d.ts +1 -0
- package/esm/CanvasFeatureRenderer/drawChevrons.js +25 -0
- package/esm/CanvasFeatureRenderer/drawFeature.d.ts +3 -0
- package/esm/CanvasFeatureRenderer/drawFeature.js +27 -0
- package/esm/CanvasFeatureRenderer/filterSubparts.d.ts +5 -0
- package/esm/CanvasFeatureRenderer/filterSubparts.js +92 -0
- package/esm/CanvasFeatureRenderer/floatingLabels.d.ts +23 -0
- package/esm/CanvasFeatureRenderer/floatingLabels.js +65 -0
- package/esm/CanvasFeatureRenderer/glyphs/box.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/box.js +87 -0
- package/esm/CanvasFeatureRenderer/glyphs/cds.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/cds.js +93 -0
- package/esm/CanvasFeatureRenderer/glyphs/childGlyphs.d.ts +5 -0
- package/esm/CanvasFeatureRenderer/glyphs/childGlyphs.js +18 -0
- package/esm/CanvasFeatureRenderer/glyphs/glyphUtils.d.ts +14 -0
- package/esm/CanvasFeatureRenderer/glyphs/glyphUtils.js +125 -0
- package/esm/CanvasFeatureRenderer/glyphs/index.d.ts +9 -0
- package/esm/CanvasFeatureRenderer/glyphs/index.js +29 -0
- package/esm/CanvasFeatureRenderer/glyphs/matureProteinRegion.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/matureProteinRegion.js +121 -0
- package/esm/CanvasFeatureRenderer/glyphs/processed.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/processed.js +53 -0
- package/esm/CanvasFeatureRenderer/glyphs/repeatRegion.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/repeatRegion.js +104 -0
- package/esm/CanvasFeatureRenderer/glyphs/segments.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/segments.js +65 -0
- package/esm/CanvasFeatureRenderer/glyphs/subfeatures.d.ts +2 -0
- package/esm/CanvasFeatureRenderer/glyphs/subfeatures.js +132 -0
- package/esm/CanvasFeatureRenderer/index.d.ts +3 -0
- package/esm/CanvasFeatureRenderer/index.js +23 -0
- package/esm/CanvasFeatureRenderer/labelUtils.d.ts +9 -0
- package/esm/CanvasFeatureRenderer/labelUtils.js +35 -0
- package/esm/CanvasFeatureRenderer/layout/index.d.ts +3 -0
- package/esm/CanvasFeatureRenderer/layout/index.js +3 -0
- package/esm/CanvasFeatureRenderer/layout/layoutFeature.d.ts +14 -0
- package/esm/CanvasFeatureRenderer/layout/layoutFeature.js +40 -0
- package/esm/CanvasFeatureRenderer/layout/layoutFeatures.d.ts +13 -0
- package/esm/CanvasFeatureRenderer/layout/layoutFeatures.js +59 -0
- package/esm/CanvasFeatureRenderer/layout/layoutUtils.d.ts +19 -0
- package/esm/CanvasFeatureRenderer/layout/layoutUtils.js +129 -0
- package/esm/CanvasFeatureRenderer/makeImageData.d.ts +14 -0
- package/esm/CanvasFeatureRenderer/makeImageData.js +90 -0
- package/esm/CanvasFeatureRenderer/peptides/aggregateAminoAcids.d.ts +8 -0
- package/esm/CanvasFeatureRenderer/peptides/aggregateAminoAcids.js +45 -0
- package/esm/CanvasFeatureRenderer/peptides/drawCDSBackground.d.ts +16 -0
- package/esm/CanvasFeatureRenderer/peptides/drawCDSBackground.js +24 -0
- package/esm/CanvasFeatureRenderer/peptides/drawPeptidesOnCDS.d.ts +15 -0
- package/esm/CanvasFeatureRenderer/peptides/drawPeptidesOnCDS.js +28 -0
- package/esm/CanvasFeatureRenderer/peptides/index.d.ts +5 -0
- package/esm/CanvasFeatureRenderer/peptides/index.js +5 -0
- package/esm/CanvasFeatureRenderer/peptides/peptideUtils.d.ts +5 -0
- package/esm/CanvasFeatureRenderer/peptides/peptideUtils.js +129 -0
- package/esm/CanvasFeatureRenderer/peptides/prepareAminoAcidData.d.ts +9 -0
- package/esm/CanvasFeatureRenderer/peptides/prepareAminoAcidData.js +5 -0
- package/esm/CanvasFeatureRenderer/renderConfig.d.ts +26 -0
- package/esm/CanvasFeatureRenderer/renderConfig.js +35 -0
- package/esm/CanvasFeatureRenderer/types.d.ts +97 -0
- package/esm/CanvasFeatureRenderer/types.js +1 -0
- package/esm/CanvasFeatureRenderer/util.d.ts +22 -0
- package/esm/CanvasFeatureRenderer/util.js +50 -0
- package/esm/CanvasFeatureRenderer/zoomThresholds.d.ts +4 -0
- package/esm/CanvasFeatureRenderer/zoomThresholds.js +8 -0
- package/esm/glyphs/index.d.ts +2 -0
- package/esm/glyphs/index.js +2 -0
- package/esm/index.d.ts +6 -0
- package/esm/index.js +10 -0
- package/package.json +53 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { RenderConfigContext } from './renderConfig.ts';
|
|
2
|
+
import type PluginManager from '@jbrowse/core/PluginManager';
|
|
3
|
+
import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
4
|
+
import type { Feature, Region } from '@jbrowse/core/util';
|
|
5
|
+
import type { BaseLayout } from '@jbrowse/core/util/layouts';
|
|
6
|
+
import type { Theme } from '@mui/material';
|
|
7
|
+
export interface SequenceData {
|
|
8
|
+
seq: string;
|
|
9
|
+
cds: {
|
|
10
|
+
start: number;
|
|
11
|
+
end: number;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export interface PeptideData {
|
|
15
|
+
sequenceData: SequenceData;
|
|
16
|
+
protein?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface FeatureLayout {
|
|
19
|
+
feature: Feature;
|
|
20
|
+
glyphType: GlyphType;
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
totalLayoutHeight: number;
|
|
26
|
+
totalLayoutWidth: number;
|
|
27
|
+
leftPadding: number;
|
|
28
|
+
children: FeatureLayout[];
|
|
29
|
+
}
|
|
30
|
+
export interface LayoutArgs {
|
|
31
|
+
feature: Feature;
|
|
32
|
+
bpPerPx: number;
|
|
33
|
+
reversed: boolean;
|
|
34
|
+
configContext: RenderConfigContext;
|
|
35
|
+
pluginManager?: PluginManager;
|
|
36
|
+
parentFeature?: Feature;
|
|
37
|
+
}
|
|
38
|
+
export interface DrawContext {
|
|
39
|
+
region: Region;
|
|
40
|
+
bpPerPx: number;
|
|
41
|
+
configContext: RenderConfigContext;
|
|
42
|
+
theme: Theme;
|
|
43
|
+
canvasWidth: number;
|
|
44
|
+
peptideDataMap?: Map<string, PeptideData>;
|
|
45
|
+
colorByCDS?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface Glyph {
|
|
48
|
+
type: GlyphType;
|
|
49
|
+
match(feature: Feature, configContext: RenderConfigContext): boolean;
|
|
50
|
+
layout(args: LayoutArgs): FeatureLayout;
|
|
51
|
+
draw(ctx: CanvasRenderingContext2D, layout: FeatureLayout, drawContext: DrawContext): void;
|
|
52
|
+
getSubfeatureMouseover?(feature: Feature): string | undefined;
|
|
53
|
+
hasIndexableChildren?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface LayoutRecord {
|
|
56
|
+
feature: Feature;
|
|
57
|
+
layout: FeatureLayout;
|
|
58
|
+
topPx: number;
|
|
59
|
+
label: string;
|
|
60
|
+
description: string;
|
|
61
|
+
}
|
|
62
|
+
export interface FlatbushItem {
|
|
63
|
+
featureId: string;
|
|
64
|
+
type: string;
|
|
65
|
+
startBp: number;
|
|
66
|
+
endBp: number;
|
|
67
|
+
leftPx: number;
|
|
68
|
+
rightPx: number;
|
|
69
|
+
topPx: number;
|
|
70
|
+
bottomPx: number;
|
|
71
|
+
tooltip?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface SubfeatureInfo {
|
|
74
|
+
featureId: string;
|
|
75
|
+
parentFeatureId: string;
|
|
76
|
+
displayLabel: string;
|
|
77
|
+
type: string;
|
|
78
|
+
leftPx: number;
|
|
79
|
+
topPx: number;
|
|
80
|
+
rightPx: number;
|
|
81
|
+
bottomPx: number;
|
|
82
|
+
}
|
|
83
|
+
export interface RenderArgs {
|
|
84
|
+
features: Map<string, Feature>;
|
|
85
|
+
layout: BaseLayout<unknown>;
|
|
86
|
+
regions: Region[];
|
|
87
|
+
bpPerPx: number;
|
|
88
|
+
config: AnyConfigurationModel;
|
|
89
|
+
displayMode: string;
|
|
90
|
+
theme: Record<string, any>;
|
|
91
|
+
highResolutionScaling?: number;
|
|
92
|
+
stopToken?: string;
|
|
93
|
+
peptideDataMap?: Map<string, PeptideData>;
|
|
94
|
+
colorByCDS?: boolean;
|
|
95
|
+
pluginManager?: PluginManager;
|
|
96
|
+
}
|
|
97
|
+
export type GlyphType = 'Box' | 'ProcessedTranscript' | 'Segments' | 'Subfeatures' | 'CDS' | 'MatureProteinRegion' | 'RepeatRegion';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RenderConfigContext } from './renderConfig.ts';
|
|
2
|
+
import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
3
|
+
import type { Feature } from '@jbrowse/core/util';
|
|
4
|
+
import type { Theme } from '@mui/material';
|
|
5
|
+
export declare function getEffectiveStrand(strand: number, reversed: boolean): number;
|
|
6
|
+
export declare function getStrandAwareX(left: number, width: number, index: number, pxPerBp: number, effectiveStrand: number): number;
|
|
7
|
+
export declare function truncateLabel(text: string, maxLength?: number): string;
|
|
8
|
+
export declare function isOffScreen(left: number, width: number, canvasWidth: number): boolean;
|
|
9
|
+
export declare function isUTR(feature: Feature): boolean;
|
|
10
|
+
export declare function getBoxColor({ feature, config, configContext, colorByCDS, theme, }: {
|
|
11
|
+
feature: Feature;
|
|
12
|
+
config: AnyConfigurationModel;
|
|
13
|
+
configContext: RenderConfigContext;
|
|
14
|
+
colorByCDS: boolean;
|
|
15
|
+
theme: Theme;
|
|
16
|
+
}): string;
|
|
17
|
+
export declare function getStrokeColor({ feature, config, configContext, theme, }: {
|
|
18
|
+
feature: Feature;
|
|
19
|
+
config: AnyConfigurationModel;
|
|
20
|
+
configContext: RenderConfigContext;
|
|
21
|
+
theme: Theme;
|
|
22
|
+
}): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getFrame, stripAlpha } from '@jbrowse/core/util';
|
|
2
|
+
import { readCachedConfig } from "./renderConfig.js";
|
|
3
|
+
const MAX_LABEL_LENGTH = 50;
|
|
4
|
+
const UTR_REGEX = /(\bUTR|_UTR|untranslated[_\s]region)\b/i;
|
|
5
|
+
export function getEffectiveStrand(strand, reversed) {
|
|
6
|
+
return strand * (reversed ? -1 : 1);
|
|
7
|
+
}
|
|
8
|
+
export function getStrandAwareX(left, width, index, pxPerBp, effectiveStrand) {
|
|
9
|
+
if (effectiveStrand === -1) {
|
|
10
|
+
return left + width - pxPerBp * index;
|
|
11
|
+
}
|
|
12
|
+
return left + pxPerBp * index;
|
|
13
|
+
}
|
|
14
|
+
export function truncateLabel(text, maxLength = MAX_LABEL_LENGTH) {
|
|
15
|
+
return text.length > maxLength ? `${text.slice(0, maxLength - 1)}…` : text;
|
|
16
|
+
}
|
|
17
|
+
export function isOffScreen(left, width, canvasWidth) {
|
|
18
|
+
return left + width < 0 || left > canvasWidth;
|
|
19
|
+
}
|
|
20
|
+
export function isUTR(feature) {
|
|
21
|
+
return UTR_REGEX.test(feature.get('type') || '');
|
|
22
|
+
}
|
|
23
|
+
export function getBoxColor({ feature, config, configContext, colorByCDS, theme, }) {
|
|
24
|
+
const { color1, color3 } = configContext;
|
|
25
|
+
let fill;
|
|
26
|
+
fill = isUTR(feature)
|
|
27
|
+
? readCachedConfig(color3, config, 'color3', feature)
|
|
28
|
+
: readCachedConfig(color1, config, 'color1', feature);
|
|
29
|
+
const featureType = feature.get('type');
|
|
30
|
+
const featureStrand = feature.get('strand');
|
|
31
|
+
const featurePhase = feature.get('phase');
|
|
32
|
+
if (colorByCDS &&
|
|
33
|
+
featureType === 'CDS' &&
|
|
34
|
+
featureStrand !== undefined &&
|
|
35
|
+
featurePhase !== undefined) {
|
|
36
|
+
const featureStart = feature.get('start');
|
|
37
|
+
const featureEnd = feature.get('end');
|
|
38
|
+
const frame = getFrame(featureStart, featureEnd, featureStrand, featurePhase);
|
|
39
|
+
const frameColor = theme.palette.framesCDS.at(frame)?.main;
|
|
40
|
+
if (frameColor) {
|
|
41
|
+
fill = frameColor;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return fill;
|
|
45
|
+
}
|
|
46
|
+
export function getStrokeColor({ feature, config, configContext, theme, }) {
|
|
47
|
+
const { color2 } = configContext;
|
|
48
|
+
const c = readCachedConfig(color2, config, 'color2', feature);
|
|
49
|
+
return c === '#f0f' ? stripAlpha(theme.palette.text.secondary) : c;
|
|
50
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const ZOOM_THRESHOLD_FOR_PEPTIDE_BACKGROUND = 1;
|
|
2
|
+
export declare const ZOOM_THRESHOLD_FOR_PEPTIDE_TEXT = 8;
|
|
3
|
+
export declare function shouldRenderPeptideBackground(bpPerPx: number): boolean;
|
|
4
|
+
export declare function shouldRenderPeptideText(bpPerPx: number): boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const ZOOM_THRESHOLD_FOR_PEPTIDE_BACKGROUND = 1;
|
|
2
|
+
export const ZOOM_THRESHOLD_FOR_PEPTIDE_TEXT = 8;
|
|
3
|
+
export function shouldRenderPeptideBackground(bpPerPx) {
|
|
4
|
+
return 1 / bpPerPx >= ZOOM_THRESHOLD_FOR_PEPTIDE_BACKGROUND;
|
|
5
|
+
}
|
|
6
|
+
export function shouldRenderPeptideText(bpPerPx) {
|
|
7
|
+
return 1 / bpPerPx >= ZOOM_THRESHOLD_FOR_PEPTIDE_TEXT;
|
|
8
|
+
}
|
package/esm/index.d.ts
ADDED
package/esm/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Plugin from '@jbrowse/core/Plugin';
|
|
2
|
+
import CanvasFeatureRendererF from "./CanvasFeatureRenderer/index.js";
|
|
3
|
+
import registerGlyphs from "./glyphs/index.js";
|
|
4
|
+
export default class CanvasPlugin extends Plugin {
|
|
5
|
+
name = 'CanvasPlugin';
|
|
6
|
+
install(pluginManager) {
|
|
7
|
+
registerGlyphs(pluginManager);
|
|
8
|
+
CanvasFeatureRendererF(pluginManager);
|
|
9
|
+
}
|
|
10
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jbrowse/plugin-canvas",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "JBrowse 2 plugin for canvas features",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"jbrowse",
|
|
7
|
+
"jbrowse2"
|
|
8
|
+
],
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"homepage": "https://jbrowse.org",
|
|
11
|
+
"bugs": "https://github.com/GMOD/jbrowse-components/issues",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/GMOD/jbrowse-components.git",
|
|
15
|
+
"directory": "plugins/canvas"
|
|
16
|
+
},
|
|
17
|
+
"author": "JBrowse Team",
|
|
18
|
+
"main": "esm/index.js",
|
|
19
|
+
"files": [
|
|
20
|
+
"esm"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@jbrowse/mobx-state-tree": "^5.5.0",
|
|
24
|
+
"@mui/material": "^7.3.6",
|
|
25
|
+
"g2p_mapper": "^2.0.0",
|
|
26
|
+
"mobx": "^6.15.0",
|
|
27
|
+
"mobx-react": "^9.2.1",
|
|
28
|
+
"rxjs": "^7.8.2",
|
|
29
|
+
"@jbrowse/core": "^4.0.0",
|
|
30
|
+
"@jbrowse/plugin-linear-genome-view": "^4.0.0"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"react": ">=18.0.0"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "pnpm run /^build:/",
|
|
41
|
+
"test": "cd ../..; jest --passWithNoTests plugins/canvas",
|
|
42
|
+
"prebuild": "pnpm clean",
|
|
43
|
+
"build:esm": "tsc -p tsconfig.build.esm.json",
|
|
44
|
+
"clean": "rimraf esm *.tsbuildinfo"
|
|
45
|
+
},
|
|
46
|
+
"types": "esm/index.d.ts",
|
|
47
|
+
"exports": {
|
|
48
|
+
".": {
|
|
49
|
+
"types": "./esm/index.d.ts",
|
|
50
|
+
"import": "./esm/index.js"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|