@jbrowse/plugin-alignments 2.16.0 → 2.17.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/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -3
- package/dist/AlignmentsFeatureDetail/Flags.js +2 -2
- package/dist/AlignmentsFeatureDetail/LinkedPairedAlignments.js +2 -2
- package/dist/AlignmentsFeatureDetail/SupplementaryAlignments.js +2 -2
- package/dist/AlignmentsFeatureDetail/getSAFeatures.js +2 -2
- package/dist/AlignmentsFeatureDetail/stateModelFactory.d.ts +1 -1
- package/dist/BamAdapter/BamAdapter.d.ts +3 -2
- package/dist/BamAdapter/BamAdapter.js +34 -11
- package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -17
- package/dist/BamAdapter/BamSlightlyLazyFeature.js +42 -72
- package/dist/CramAdapter/CramAdapter.d.ts +4 -3
- package/dist/CramAdapter/CramAdapter.js +24 -7
- package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +21 -27
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +74 -73
- package/dist/CramAdapter/util.d.ts +1 -10
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -1
- package/dist/LinearAlignmentsDisplay/index.js +2 -2
- package/dist/LinearAlignmentsDisplay/{models/model.d.ts → model.d.ts} +6 -3
- package/dist/LinearAlignmentsDisplay/{models/model.js → model.js} +11 -7
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +6 -27
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +43 -21
- package/dist/LinearPileupDisplay/components/ColorByTagDialog.d.ts +5 -4
- package/dist/LinearPileupDisplay/components/ColorByTagDialog.js +3 -1
- package/dist/LinearPileupDisplay/components/GroupByDialog.js +8 -6
- package/dist/LinearPileupDisplay/components/SortByTagDialog.js +6 -4
- package/dist/LinearPileupDisplay/model.d.ts +41 -45
- package/dist/LinearPileupDisplay/model.js +118 -41
- package/dist/LinearReadArcsDisplay/components/ReactComponent.js +1 -1
- package/dist/LinearReadArcsDisplay/model.d.ts +22 -21
- package/dist/LinearReadArcsDisplay/model.js +13 -14
- package/dist/LinearReadCloudDisplay/components/ReactComponent.js +1 -1
- package/dist/LinearReadCloudDisplay/model.d.ts +14 -22
- package/dist/LinearReadCloudDisplay/model.js +12 -13
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +49 -19
- package/dist/LinearSNPCoverageDisplay/index.js +3 -2
- package/dist/LinearSNPCoverageDisplay/{models/model.d.ts → model.d.ts} +3 -13
- package/dist/LinearSNPCoverageDisplay/{models/model.js → model.js} +71 -45
- package/dist/MismatchParser/cigarToMismatches.d.ts +3 -0
- package/dist/MismatchParser/cigarToMismatches.js +94 -0
- package/dist/MismatchParser/getNextRefPos.d.ts +4 -0
- package/dist/MismatchParser/getNextRefPos.js +40 -0
- package/dist/MismatchParser/index.d.ts +4 -29
- package/dist/MismatchParser/index.js +10 -321
- package/dist/MismatchParser/mdToMismatches.d.ts +3 -0
- package/dist/MismatchParser/mdToMismatches.js +80 -0
- package/dist/ModificationParser/index.d.ts +19 -0
- package/dist/ModificationParser/index.js +144 -0
- package/dist/PileupRPC/methods/GetGlobalValueForTag.js +1 -2
- package/dist/PileupRPC/methods/GetReducedFeatures.d.ts +1 -1
- package/dist/PileupRPC/methods/GetReducedFeatures.js +19 -16
- package/dist/PileupRPC/methods/GetVisibleModifications.d.ts +2 -1
- package/dist/PileupRPC/methods/GetVisibleModifications.js +9 -6
- package/dist/PileupRenderer/PileupLayoutSession.d.ts +8 -7
- package/dist/PileupRenderer/PileupRenderer.d.ts +6 -14
- package/dist/PileupRenderer/PileupRenderer.js +7 -5
- package/dist/PileupRenderer/renderAlignment.js +17 -4
- package/dist/PileupRenderer/renderAlignmentShape.js +102 -21
- package/dist/PileupRenderer/renderMethylation.d.ts +2 -1
- package/dist/PileupRenderer/renderMethylation.js +17 -9
- package/dist/PileupRenderer/renderMismatches.js +19 -19
- package/dist/PileupRenderer/renderModifications.d.ts +3 -2
- package/dist/PileupRenderer/renderModifications.js +31 -34
- package/dist/PileupRenderer/renderPerBaseLettering.d.ts +2 -1
- package/dist/PileupRenderer/renderPerBaseLettering.js +1 -3
- package/dist/PileupRenderer/renderPerBaseQuality.d.ts +2 -1
- package/dist/PileupRenderer/renderPerBaseQuality.js +1 -3
- package/dist/PileupRenderer/renderSoftClipping.js +6 -6
- package/dist/PileupRenderer/sortUtil.d.ts +2 -7
- package/dist/PileupRenderer/sortUtil.js +13 -13
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +10 -5
- package/dist/SNPCoverageAdapter/generateCoverageBins.d.ts +13 -9
- package/dist/SNPCoverageAdapter/generateCoverageBins.js +269 -166
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -1
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +171 -54
- package/dist/shared/color.d.ts +0 -10
- package/dist/shared/color.js +1 -7
- package/{esm/shared → dist/shared/components}/BaseDisplayComponent.d.ts +2 -2
- package/{esm/shared → dist/shared/components}/FilterByTagDialog.d.ts +3 -3
- package/dist/shared/{FilterByTagDialog.js → components/FilterByTagDialog.js} +5 -1
- package/dist/shared/fetchChains.js +1 -2
- package/dist/shared/getMaximumModificationAtEachPosition.d.ts +8 -0
- package/dist/shared/getMaximumModificationAtEachPosition.js +42 -0
- package/dist/shared/getUniqueModifications.d.ts +14 -0
- package/dist/shared/getUniqueModifications.js +16 -0
- package/dist/shared/getUniqueTags.d.ts +15 -0
- package/dist/shared/getUniqueTags.js +18 -0
- package/dist/shared/types.d.ts +94 -0
- package/dist/shared/util.d.ts +8 -0
- package/dist/shared/util.js +26 -0
- package/dist/util.d.ts +7 -4
- package/dist/util.js +30 -30
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -3
- package/esm/AlignmentsFeatureDetail/Flags.js +1 -1
- package/esm/AlignmentsFeatureDetail/LinkedPairedAlignments.js +1 -1
- package/esm/AlignmentsFeatureDetail/SupplementaryAlignments.js +1 -1
- package/esm/AlignmentsFeatureDetail/getSAFeatures.js +2 -2
- package/esm/AlignmentsFeatureDetail/stateModelFactory.d.ts +1 -1
- package/esm/BamAdapter/BamAdapter.d.ts +3 -2
- package/esm/BamAdapter/BamAdapter.js +31 -8
- package/esm/BamAdapter/BamSlightlyLazyFeature.d.ts +3 -17
- package/esm/BamAdapter/BamSlightlyLazyFeature.js +43 -73
- package/esm/CramAdapter/CramAdapter.d.ts +4 -3
- package/esm/CramAdapter/CramAdapter.js +22 -5
- package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +21 -27
- package/esm/CramAdapter/CramSlightlyLazyFeature.js +74 -73
- package/esm/CramAdapter/util.d.ts +1 -10
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +1 -1
- package/esm/LinearAlignmentsDisplay/index.js +2 -2
- package/esm/LinearAlignmentsDisplay/{models/model.d.ts → model.d.ts} +6 -3
- package/esm/LinearAlignmentsDisplay/{models/model.js → model.js} +11 -7
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +6 -27
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +45 -23
- package/esm/LinearPileupDisplay/components/ColorByTagDialog.d.ts +5 -4
- package/esm/LinearPileupDisplay/components/ColorByTagDialog.js +3 -1
- package/esm/LinearPileupDisplay/components/GroupByDialog.js +8 -6
- package/esm/LinearPileupDisplay/components/SortByTagDialog.js +6 -4
- package/esm/LinearPileupDisplay/model.d.ts +41 -45
- package/esm/LinearPileupDisplay/model.js +119 -42
- package/esm/LinearReadArcsDisplay/components/ReactComponent.js +1 -1
- package/esm/LinearReadArcsDisplay/model.d.ts +22 -21
- package/esm/LinearReadArcsDisplay/model.js +14 -15
- package/esm/LinearReadCloudDisplay/components/ReactComponent.js +1 -1
- package/esm/LinearReadCloudDisplay/model.d.ts +14 -22
- package/esm/LinearReadCloudDisplay/model.js +13 -14
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +49 -19
- package/esm/LinearSNPCoverageDisplay/index.js +3 -2
- package/esm/LinearSNPCoverageDisplay/{models/model.d.ts → model.d.ts} +3 -13
- package/esm/LinearSNPCoverageDisplay/{models/model.js → model.js} +72 -46
- package/esm/MismatchParser/cigarToMismatches.d.ts +3 -0
- package/esm/MismatchParser/cigarToMismatches.js +91 -0
- package/esm/MismatchParser/getNextRefPos.d.ts +4 -0
- package/esm/MismatchParser/getNextRefPos.js +37 -0
- package/esm/MismatchParser/index.d.ts +4 -29
- package/esm/MismatchParser/index.js +5 -311
- package/esm/MismatchParser/mdToMismatches.d.ts +3 -0
- package/esm/MismatchParser/mdToMismatches.js +77 -0
- package/esm/ModificationParser/index.d.ts +19 -0
- package/esm/ModificationParser/index.js +138 -0
- package/esm/PileupRPC/methods/GetGlobalValueForTag.js +1 -2
- package/esm/PileupRPC/methods/GetReducedFeatures.d.ts +1 -1
- package/esm/PileupRPC/methods/GetReducedFeatures.js +19 -16
- package/esm/PileupRPC/methods/GetVisibleModifications.d.ts +2 -1
- package/esm/PileupRPC/methods/GetVisibleModifications.js +9 -6
- package/esm/PileupRenderer/PileupLayoutSession.d.ts +8 -7
- package/esm/PileupRenderer/PileupRenderer.d.ts +6 -14
- package/esm/PileupRenderer/PileupRenderer.js +8 -6
- package/esm/PileupRenderer/renderAlignment.js +17 -4
- package/esm/PileupRenderer/renderAlignmentShape.js +102 -21
- package/esm/PileupRenderer/renderMethylation.d.ts +2 -1
- package/esm/PileupRenderer/renderMethylation.js +17 -9
- package/esm/PileupRenderer/renderMismatches.js +19 -19
- package/esm/PileupRenderer/renderModifications.d.ts +3 -2
- package/esm/PileupRenderer/renderModifications.js +30 -33
- package/esm/PileupRenderer/renderPerBaseLettering.d.ts +2 -1
- package/esm/PileupRenderer/renderPerBaseLettering.js +1 -3
- package/esm/PileupRenderer/renderPerBaseQuality.d.ts +2 -1
- package/esm/PileupRenderer/renderPerBaseQuality.js +1 -3
- package/esm/PileupRenderer/renderSoftClipping.js +6 -6
- package/esm/PileupRenderer/sortUtil.d.ts +2 -7
- package/esm/PileupRenderer/sortUtil.js +13 -13
- package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +10 -5
- package/esm/SNPCoverageAdapter/generateCoverageBins.d.ts +13 -9
- package/esm/SNPCoverageAdapter/generateCoverageBins.js +269 -166
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.d.ts +2 -1
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +171 -54
- package/esm/shared/color.d.ts +0 -10
- package/esm/shared/color.js +0 -6
- package/{dist/shared → esm/shared/components}/BaseDisplayComponent.d.ts +2 -2
- package/{dist/shared → esm/shared/components}/FilterByTagDialog.d.ts +3 -3
- package/esm/shared/{FilterByTagDialog.js → components/FilterByTagDialog.js} +5 -1
- package/esm/shared/fetchChains.js +1 -2
- package/esm/shared/getMaximumModificationAtEachPosition.d.ts +8 -0
- package/esm/shared/getMaximumModificationAtEachPosition.js +39 -0
- package/esm/shared/getUniqueModifications.d.ts +14 -0
- package/esm/shared/getUniqueModifications.js +13 -0
- package/esm/shared/getUniqueTags.d.ts +15 -0
- package/esm/shared/getUniqueTags.js +15 -0
- package/esm/shared/types.d.ts +94 -0
- package/esm/shared/util.d.ts +8 -0
- package/esm/shared/util.js +23 -0
- package/esm/util.d.ts +7 -4
- package/esm/util.js +28 -27
- package/package.json +4 -4
- package/dist/LinearPileupDisplay/components/ColorByModificationsDialog.d.ts +0 -15
- package/dist/LinearPileupDisplay/components/ColorByModificationsDialog.js +0 -41
- package/dist/LinearPileupDisplay/components/ModificationsTable.d.ts +0 -4
- package/dist/LinearPileupDisplay/components/ModificationsTable.js +0 -28
- package/dist/SNPCoverageAdapter/util.d.ts +0 -25
- package/dist/shared/index.d.ts +0 -49
- package/dist/shared/index.js +0 -41
- package/esm/LinearPileupDisplay/components/ColorByModificationsDialog.d.ts +0 -15
- package/esm/LinearPileupDisplay/components/ColorByModificationsDialog.js +0 -36
- package/esm/LinearPileupDisplay/components/ModificationsTable.d.ts +0 -4
- package/esm/LinearPileupDisplay/components/ModificationsTable.js +0 -22
- package/esm/SNPCoverageAdapter/util.d.ts +0 -25
- package/esm/shared/index.d.ts +0 -49
- package/esm/shared/index.js +0 -36
- /package/dist/LinearAlignmentsDisplay/{models/alignmentsModel.d.ts → alignmentsModel.d.ts} +0 -0
- /package/dist/LinearAlignmentsDisplay/{models/alignmentsModel.js → alignmentsModel.js} +0 -0
- /package/dist/LinearAlignmentsDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
- /package/dist/LinearAlignmentsDisplay/{models/configSchema.js → configSchema.js} +0 -0
- /package/dist/LinearAlignmentsDisplay/{models/util.d.ts → util.d.ts} +0 -0
- /package/dist/LinearAlignmentsDisplay/{models/util.js → util.js} +0 -0
- /package/dist/LinearSNPCoverageDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
- /package/dist/LinearSNPCoverageDisplay/{models/configSchema.js → configSchema.js} +0 -0
- /package/dist/shared/{BaseDisplayComponent.js → components/BaseDisplayComponent.js} +0 -0
- /package/dist/shared/{renderSvg.d.ts → renderSvgUtil.d.ts} +0 -0
- /package/dist/shared/{renderSvg.js → renderSvgUtil.js} +0 -0
- /package/dist/{SNPCoverageAdapter/util.js → shared/types.js} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/alignmentsModel.d.ts → alignmentsModel.d.ts} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/alignmentsModel.js → alignmentsModel.js} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/configSchema.js → configSchema.js} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/util.d.ts → util.d.ts} +0 -0
- /package/esm/LinearAlignmentsDisplay/{models/util.js → util.js} +0 -0
- /package/esm/LinearSNPCoverageDisplay/{models/configSchema.d.ts → configSchema.d.ts} +0 -0
- /package/esm/LinearSNPCoverageDisplay/{models/configSchema.js → configSchema.js} +0 -0
- /package/esm/shared/{BaseDisplayComponent.js → components/BaseDisplayComponent.js} +0 -0
- /package/esm/shared/{renderSvg.d.ts → renderSvgUtil.d.ts} +0 -0
- /package/esm/shared/{renderSvg.js → renderSvgUtil.js} +0 -0
- /package/esm/{SNPCoverageAdapter/util.js → shared/types.js} +0 -0
|
@@ -8,7 +8,6 @@ const operators_1 = require("rxjs/operators");
|
|
|
8
8
|
const rxjs_1 = require("rxjs");
|
|
9
9
|
// locals
|
|
10
10
|
const base_1 = __importDefault(require("../base"));
|
|
11
|
-
const util_1 = require("../../util");
|
|
12
11
|
class PileupGetGlobalValueForTag extends base_1.default {
|
|
13
12
|
constructor() {
|
|
14
13
|
super(...arguments);
|
|
@@ -21,7 +20,7 @@ class PileupGetGlobalValueForTag extends base_1.default {
|
|
|
21
20
|
const featuresArray = await (0, rxjs_1.firstValueFrom)(features.pipe((0, operators_1.toArray)()));
|
|
22
21
|
return [
|
|
23
22
|
...new Set(featuresArray
|
|
24
|
-
.map(feature => (
|
|
23
|
+
.map(feature => { var _a; return (_a = feature.get('tags')) === null || _a === void 0 ? void 0 : _a[tag]; })
|
|
25
24
|
.filter(f => f !== undefined)
|
|
26
25
|
.map(f => `${f}`)),
|
|
27
26
|
];
|
|
@@ -10,7 +10,7 @@ const rxjs_1 = require("rxjs");
|
|
|
10
10
|
// locals
|
|
11
11
|
const util_2 = require("../util");
|
|
12
12
|
const base_1 = __importDefault(require("../base"));
|
|
13
|
-
const
|
|
13
|
+
const MismatchParser_1 = require("../../MismatchParser");
|
|
14
14
|
// specialized get features to return limited data about alignments
|
|
15
15
|
class PileupGetReducedFeatures extends base_1.default {
|
|
16
16
|
constructor() {
|
|
@@ -22,21 +22,24 @@ class PileupGetReducedFeatures extends base_1.default {
|
|
|
22
22
|
const { adapterConfig, sessionId, regions } = des;
|
|
23
23
|
const dataAdapter = (await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
|
|
24
24
|
const featuresArray = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeaturesInMultipleRegions(regions, des).pipe((0, operators_1.toArray)()));
|
|
25
|
-
const reduced = (0, util_1.dedupe)(featuresArray.map(f =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
25
|
+
const reduced = (0, util_1.dedupe)(featuresArray.map(f => {
|
|
26
|
+
var _a;
|
|
27
|
+
return ({
|
|
28
|
+
id: f.id(),
|
|
29
|
+
refName: f.get('refName'),
|
|
30
|
+
name: f.get('name'),
|
|
31
|
+
start: f.get('start'),
|
|
32
|
+
strand: f.get('strand'),
|
|
33
|
+
end: f.get('end'),
|
|
34
|
+
flags: f.get('flags'),
|
|
35
|
+
tlen: f.get('template_length'),
|
|
36
|
+
pair_orientation: f.get('pair_orientation'),
|
|
37
|
+
next_ref: f.get('next_ref'),
|
|
38
|
+
next_pos: f.get('next_pos'),
|
|
39
|
+
clipPos: (0, MismatchParser_1.getClip)(f.get('CIGAR'), f.get('strand')),
|
|
40
|
+
SA: (_a = f.get('tags')) === null || _a === void 0 ? void 0 : _a.SA,
|
|
41
|
+
});
|
|
42
|
+
}), f => f.id);
|
|
40
43
|
const filtered = (0, util_2.filterForPairs)(reduced);
|
|
41
44
|
const stats = filtered.length ? (0, util_2.getInsertSizeStats)(filtered) : undefined;
|
|
42
45
|
const chains = (0, util_1.groupBy)(reduced, f => f.name);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals';
|
|
2
2
|
import { Region } from '@jbrowse/core/util';
|
|
3
|
+
import { ModificationType } from '../../shared/types';
|
|
3
4
|
import PileupBaseRPC from '../base';
|
|
4
5
|
export default class PileupGetVisibleModifications extends PileupBaseRPC {
|
|
5
6
|
name: string;
|
|
@@ -10,5 +11,5 @@ export default class PileupGetVisibleModifications extends PileupBaseRPC {
|
|
|
10
11
|
regions: Region[];
|
|
11
12
|
sessionId: string;
|
|
12
13
|
tag: string;
|
|
13
|
-
}, rpcDriver: string): Promise<
|
|
14
|
+
}, rpcDriver: string): Promise<ModificationType[]>;
|
|
14
15
|
}
|
|
@@ -6,10 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
|
|
7
7
|
const operators_1 = require("rxjs/operators");
|
|
8
8
|
const rxjs_1 = require("rxjs");
|
|
9
|
-
|
|
10
|
-
const MismatchParser_1 = require("../../MismatchParser");
|
|
11
|
-
const base_1 = __importDefault(require("../base"));
|
|
9
|
+
const ModificationParser_1 = require("../../ModificationParser");
|
|
12
10
|
const util_1 = require("../../util");
|
|
11
|
+
const base_1 = __importDefault(require("../base"));
|
|
13
12
|
class PileupGetVisibleModifications extends base_1.default {
|
|
14
13
|
constructor() {
|
|
15
14
|
super(...arguments);
|
|
@@ -19,11 +18,15 @@ class PileupGetVisibleModifications extends base_1.default {
|
|
|
19
18
|
const { adapterConfig, sessionId, regions } = await this.deserializeArguments(args, rpcDriver);
|
|
20
19
|
const dataAdapter = (await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, adapterConfig)).dataAdapter;
|
|
21
20
|
const featuresArray = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeaturesInMultipleRegions(regions).pipe((0, operators_1.toArray)()));
|
|
22
|
-
const
|
|
21
|
+
const uniqueModifications = new Map();
|
|
23
22
|
featuresArray.forEach(f => {
|
|
24
|
-
(0,
|
|
23
|
+
for (const mod of (0, ModificationParser_1.getModTypes)((0, util_1.getTagAlt)(f, 'MM', 'Mm') || '')) {
|
|
24
|
+
if (!uniqueModifications.has(mod.type)) {
|
|
25
|
+
uniqueModifications.set(mod.type, mod);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
25
28
|
});
|
|
26
|
-
return [...
|
|
29
|
+
return [...uniqueModifications.values()];
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
32
|
exports.default = PileupGetVisibleModifications;
|
|
@@ -3,26 +3,27 @@ import { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
|
3
3
|
import SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain';
|
|
4
4
|
import GranularRectLayout from '@jbrowse/core/util/layouts/GranularRectLayout';
|
|
5
5
|
import MultiLayout from '@jbrowse/core/util/layouts/MultiLayout';
|
|
6
|
+
import { FilterBy, SortedBy } from '../shared/types';
|
|
6
7
|
export interface PileupLayoutSessionProps {
|
|
7
8
|
config: AnyConfigurationModel;
|
|
8
9
|
bpPerPx: number;
|
|
9
10
|
filters: SerializableFilterChain;
|
|
10
|
-
filterBy:
|
|
11
|
-
sortedBy:
|
|
12
|
-
showSoftClip:
|
|
11
|
+
filterBy: FilterBy;
|
|
12
|
+
sortedBy: SortedBy;
|
|
13
|
+
showSoftClip: boolean;
|
|
13
14
|
}
|
|
14
15
|
type MyMultiLayout = MultiLayout<GranularRectLayout<unknown>, unknown>;
|
|
15
16
|
interface CachedPileupLayout {
|
|
16
17
|
layout: MyMultiLayout;
|
|
17
18
|
config: AnyConfigurationModel;
|
|
18
19
|
filters?: SerializableFilterChain;
|
|
19
|
-
filterBy
|
|
20
|
-
sortedBy
|
|
20
|
+
filterBy?: FilterBy;
|
|
21
|
+
sortedBy?: SortedBy;
|
|
21
22
|
showSoftClip: boolean;
|
|
22
23
|
}
|
|
23
24
|
export declare class PileupLayoutSession extends LayoutSession {
|
|
24
|
-
sortedBy
|
|
25
|
-
filterBy
|
|
25
|
+
sortedBy?: SortedBy;
|
|
26
|
+
filterBy?: FilterBy;
|
|
26
27
|
showSoftClip: boolean;
|
|
27
28
|
constructor(args: PileupLayoutSessionProps);
|
|
28
29
|
cachedLayoutIsValid(cachedLayout: CachedPileupLayout): boolean;
|
|
@@ -2,20 +2,12 @@ import BoxRendererType, { RenderArgsDeserialized as BoxRenderArgsDeserialized }
|
|
|
2
2
|
import { Feature, Region } from '@jbrowse/core/util';
|
|
3
3
|
import { BaseLayout } from '@jbrowse/core/util/layouts/BaseLayout';
|
|
4
4
|
import { PileupLayoutSession, PileupLayoutSessionProps } from './PileupLayoutSession';
|
|
5
|
+
import { ColorBy, ModificationTypeWithColor, SortedBy } from '../shared/types';
|
|
5
6
|
export interface RenderArgsDeserialized extends BoxRenderArgsDeserialized {
|
|
6
|
-
colorBy?:
|
|
7
|
-
type: string;
|
|
8
|
-
tag?: string;
|
|
9
|
-
};
|
|
7
|
+
colorBy?: ColorBy;
|
|
10
8
|
colorTagMap?: Record<string, string>;
|
|
11
|
-
|
|
12
|
-
sortedBy?:
|
|
13
|
-
type: string;
|
|
14
|
-
pos: number;
|
|
15
|
-
refName: string;
|
|
16
|
-
assemblyName: string;
|
|
17
|
-
tag?: string;
|
|
18
|
-
};
|
|
9
|
+
visibleModifications?: Record<string, ModificationTypeWithColor>;
|
|
10
|
+
sortedBy?: SortedBy;
|
|
19
11
|
showSoftClip: boolean;
|
|
20
12
|
highResolutionScaling: number;
|
|
21
13
|
}
|
|
@@ -30,8 +22,8 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
30
22
|
getExpandedRegion(region: Region, renderArgs: RenderArgsDeserialized): {
|
|
31
23
|
start: number;
|
|
32
24
|
end: number;
|
|
33
|
-
refName: string;
|
|
34
25
|
reversed?: boolean | undefined;
|
|
26
|
+
refName: string;
|
|
35
27
|
assemblyName: string;
|
|
36
28
|
};
|
|
37
29
|
render(renderProps: RenderArgsDeserialized): Promise<{
|
|
@@ -63,4 +55,4 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
63
55
|
}>;
|
|
64
56
|
createSession(args: PileupLayoutSessionProps): PileupLayoutSession;
|
|
65
57
|
}
|
|
66
|
-
export {
|
|
58
|
+
export type { RenderArgs, RenderResults, RenderArgsSerialized, ResultsSerialized, ResultsDeserialized, } from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType';
|
|
@@ -45,10 +45,13 @@ class PileupRenderer extends BoxRendererType_1.default {
|
|
|
45
45
|
if (!sequenceAdapter) {
|
|
46
46
|
return undefined;
|
|
47
47
|
}
|
|
48
|
-
const
|
|
49
|
-
const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(pm, sessionId, sequenceAdapter);
|
|
48
|
+
const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(this.pluginManager, sessionId, sequenceAdapter);
|
|
50
49
|
const region = regions[0];
|
|
51
|
-
return (0, util_2.fetchSequence)(
|
|
50
|
+
return (0, util_2.fetchSequence)({
|
|
51
|
+
...region,
|
|
52
|
+
start: Math.max(0, region.start - 1),
|
|
53
|
+
end: region.end + 1,
|
|
54
|
+
}, dataAdapter);
|
|
52
55
|
}
|
|
53
56
|
getExpandedRegion(region, renderArgs) {
|
|
54
57
|
const { config, showSoftClip } = renderArgs;
|
|
@@ -63,7 +66,6 @@ class PileupRenderer extends BoxRendererType_1.default {
|
|
|
63
66
|
};
|
|
64
67
|
}
|
|
65
68
|
async render(renderProps) {
|
|
66
|
-
var _a;
|
|
67
69
|
const features = await this.getFeatures(renderProps);
|
|
68
70
|
const layout = this.createLayoutInWorker(renderProps);
|
|
69
71
|
const { regions, bpPerPx } = renderProps;
|
|
@@ -75,7 +77,7 @@ class PileupRenderer extends BoxRendererType_1.default {
|
|
|
75
77
|
});
|
|
76
78
|
// only need reference sequence if there are features and only for some
|
|
77
79
|
// cases
|
|
78
|
-
const regionSequence = features.size
|
|
80
|
+
const regionSequence = features.size
|
|
79
81
|
? await this.fetchSequence(renderProps)
|
|
80
82
|
: undefined;
|
|
81
83
|
const width = (region.end - region.start) / bpPerPx;
|
|
@@ -7,6 +7,7 @@ const renderPerBaseQuality_1 = require("./renderPerBaseQuality");
|
|
|
7
7
|
const renderPerBaseLettering_1 = require("./renderPerBaseLettering");
|
|
8
8
|
const renderModifications_1 = require("./renderModifications");
|
|
9
9
|
const renderMethylation_1 = require("./renderMethylation");
|
|
10
|
+
const MismatchParser_1 = require("../MismatchParser");
|
|
10
11
|
function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase, charWidth, charHeight, defaultColor, canvasWidth, }) {
|
|
11
12
|
const { config, bpPerPx, regions, colorBy, colorTagMap = {} } = renderArgs;
|
|
12
13
|
const { tag = '', type: colorType = '' } = colorBy || {};
|
|
@@ -24,16 +25,20 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
|
|
|
24
25
|
// second pass for color types that render per-base things that go over the
|
|
25
26
|
// existing drawing
|
|
26
27
|
switch (colorType) {
|
|
27
|
-
case 'perBaseQuality':
|
|
28
|
+
case 'perBaseQuality': {
|
|
29
|
+
const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
|
|
28
30
|
(0, renderPerBaseQuality_1.renderPerBaseQuality)({
|
|
29
31
|
ctx,
|
|
30
32
|
feat,
|
|
31
33
|
region,
|
|
32
34
|
bpPerPx,
|
|
33
35
|
canvasWidth,
|
|
36
|
+
cigarOps,
|
|
34
37
|
});
|
|
35
38
|
break;
|
|
36
|
-
|
|
39
|
+
}
|
|
40
|
+
case 'perBaseLettering': {
|
|
41
|
+
const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
|
|
37
42
|
(0, renderPerBaseLettering_1.renderPerBaseLettering)({
|
|
38
43
|
ctx,
|
|
39
44
|
feat,
|
|
@@ -44,9 +49,12 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
|
|
|
44
49
|
charWidth,
|
|
45
50
|
charHeight,
|
|
46
51
|
canvasWidth,
|
|
52
|
+
cigarOps,
|
|
47
53
|
});
|
|
48
54
|
break;
|
|
49
|
-
|
|
55
|
+
}
|
|
56
|
+
case 'modifications': {
|
|
57
|
+
const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
|
|
50
58
|
(0, renderModifications_1.renderModifications)({
|
|
51
59
|
ctx,
|
|
52
60
|
feat,
|
|
@@ -54,9 +62,12 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
|
|
|
54
62
|
bpPerPx,
|
|
55
63
|
renderArgs,
|
|
56
64
|
canvasWidth,
|
|
65
|
+
cigarOps,
|
|
57
66
|
});
|
|
58
67
|
break;
|
|
59
|
-
|
|
68
|
+
}
|
|
69
|
+
case 'methylation': {
|
|
70
|
+
const cigarOps = (0, MismatchParser_1.parseCigar)(feature.get('CIGAR'));
|
|
60
71
|
(0, renderMethylation_1.renderMethylation)({
|
|
61
72
|
ctx,
|
|
62
73
|
feat,
|
|
@@ -64,7 +75,9 @@ function renderAlignment({ ctx, feat, renderArgs, colorForBase, contrastForBase,
|
|
|
64
75
|
bpPerPx,
|
|
65
76
|
renderArgs,
|
|
66
77
|
canvasWidth,
|
|
78
|
+
cigarOps,
|
|
67
79
|
});
|
|
68
80
|
break;
|
|
81
|
+
}
|
|
69
82
|
}
|
|
70
83
|
}
|
|
@@ -2,38 +2,119 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderAlignmentShape = renderAlignmentShape;
|
|
4
4
|
const util_1 = require("@jbrowse/core/util");
|
|
5
|
+
const MismatchParser_1 = require("../MismatchParser");
|
|
5
6
|
function renderAlignmentShape({ ctx, feat, renderArgs, }) {
|
|
6
7
|
const { regions, bpPerPx } = renderArgs;
|
|
7
8
|
const { heightPx, topPx, feature } = feat;
|
|
8
9
|
const region = regions[0];
|
|
9
10
|
const s = feature.get('start');
|
|
10
11
|
const e = feature.get('end');
|
|
11
|
-
const
|
|
12
|
+
const CIGAR = feature.get('CIGAR');
|
|
12
13
|
const flip = region.reversed ? -1 : 1;
|
|
13
14
|
const strand = feature.get('strand') * flip;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
const renderChevrons = bpPerPx < 10 && heightPx > 5;
|
|
16
|
+
if (CIGAR.includes('N')) {
|
|
17
|
+
const cigarOps = (0, MismatchParser_1.parseCigar)(CIGAR);
|
|
18
|
+
if (strand === 1) {
|
|
19
|
+
let drawLen = 0;
|
|
20
|
+
let drawStart = s;
|
|
21
|
+
for (let i = 0; i < cigarOps.length; i += 2) {
|
|
22
|
+
const opLen = +cigarOps[i];
|
|
23
|
+
const op = cigarOps[i + 1];
|
|
24
|
+
if (op === 'M' || op === 'X' || op === '=' || op === 'D') {
|
|
25
|
+
drawLen += opLen;
|
|
26
|
+
}
|
|
27
|
+
else if (op === 'N') {
|
|
28
|
+
if (drawStart !== drawLen) {
|
|
29
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart, drawStart + drawLen, region, bpPerPx);
|
|
30
|
+
const w = rightPx - leftPx;
|
|
31
|
+
ctx.fillRect(leftPx, topPx, w, heightPx);
|
|
32
|
+
}
|
|
33
|
+
drawStart += drawLen + opLen;
|
|
34
|
+
drawLen = 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (drawStart !== drawLen) {
|
|
38
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart, drawStart + drawLen, region, bpPerPx);
|
|
39
|
+
const w = rightPx - leftPx;
|
|
40
|
+
if (renderChevrons) {
|
|
41
|
+
ctx.beginPath();
|
|
42
|
+
ctx.moveTo(leftPx, topPx);
|
|
43
|
+
ctx.lineTo(leftPx, topPx + heightPx);
|
|
44
|
+
ctx.lineTo(rightPx, topPx + heightPx);
|
|
45
|
+
ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
|
|
46
|
+
ctx.lineTo(rightPx, topPx);
|
|
47
|
+
ctx.closePath();
|
|
48
|
+
ctx.fill();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
ctx.fillRect(leftPx, topPx, w, heightPx);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
24
54
|
}
|
|
25
|
-
else {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
55
|
+
else if (strand === -1) {
|
|
56
|
+
let drawLen = 0;
|
|
57
|
+
let drawStart = e;
|
|
58
|
+
for (let i = cigarOps.length - 2; i >= 0; i -= 2) {
|
|
59
|
+
const opLen = +cigarOps[i];
|
|
60
|
+
const op = cigarOps[i + 1];
|
|
61
|
+
if (op === 'M' || op === 'X' || op === '=' || op === 'D') {
|
|
62
|
+
drawLen += opLen;
|
|
63
|
+
}
|
|
64
|
+
else if (op === 'N') {
|
|
65
|
+
if (drawLen !== 0) {
|
|
66
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart - drawLen, drawStart, region, bpPerPx);
|
|
67
|
+
ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
|
|
68
|
+
}
|
|
69
|
+
drawStart -= drawLen + opLen;
|
|
70
|
+
drawLen = 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (drawLen !== 0) {
|
|
74
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(drawStart - drawLen, drawStart, region, bpPerPx);
|
|
75
|
+
const w = rightPx - leftPx;
|
|
76
|
+
if (renderChevrons) {
|
|
77
|
+
ctx.beginPath();
|
|
78
|
+
ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
|
|
79
|
+
ctx.lineTo(leftPx, topPx + heightPx);
|
|
80
|
+
ctx.lineTo(rightPx, topPx + heightPx);
|
|
81
|
+
ctx.lineTo(rightPx, topPx);
|
|
82
|
+
ctx.lineTo(leftPx, topPx);
|
|
83
|
+
ctx.closePath();
|
|
84
|
+
ctx.fill();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
ctx.fillRect(leftPx, topPx, w, heightPx);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
34
90
|
}
|
|
35
91
|
}
|
|
36
92
|
else {
|
|
37
|
-
|
|
93
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s, e, region, bpPerPx);
|
|
94
|
+
if (bpPerPx < 10 && heightPx > 5) {
|
|
95
|
+
if (strand === -1) {
|
|
96
|
+
ctx.beginPath();
|
|
97
|
+
ctx.moveTo(leftPx - 5, topPx + heightPx / 2);
|
|
98
|
+
ctx.lineTo(leftPx, topPx + heightPx);
|
|
99
|
+
ctx.lineTo(rightPx, topPx + heightPx);
|
|
100
|
+
ctx.lineTo(rightPx, topPx);
|
|
101
|
+
ctx.lineTo(leftPx, topPx);
|
|
102
|
+
ctx.closePath();
|
|
103
|
+
ctx.fill();
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
ctx.beginPath();
|
|
107
|
+
ctx.moveTo(leftPx, topPx);
|
|
108
|
+
ctx.lineTo(leftPx, topPx + heightPx);
|
|
109
|
+
ctx.lineTo(rightPx, topPx + heightPx);
|
|
110
|
+
ctx.lineTo(rightPx + 5, topPx + heightPx / 2);
|
|
111
|
+
ctx.lineTo(rightPx, topPx);
|
|
112
|
+
ctx.closePath();
|
|
113
|
+
ctx.fill();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
ctx.fillRect(leftPx, topPx, rightPx - leftPx, heightPx);
|
|
118
|
+
}
|
|
38
119
|
}
|
|
39
120
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Region } from '@jbrowse/core/util';
|
|
2
2
|
import { LayoutFeature } from './util';
|
|
3
3
|
import { RenderArgsWithColor } from './makeImageData';
|
|
4
|
-
export declare function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }: {
|
|
4
|
+
export declare function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }: {
|
|
5
5
|
ctx: CanvasRenderingContext2D;
|
|
6
6
|
feat: LayoutFeature;
|
|
7
7
|
region: Region;
|
|
8
8
|
bpPerPx: number;
|
|
9
9
|
renderArgs: RenderArgsWithColor;
|
|
10
10
|
canvasWidth: number;
|
|
11
|
+
cigarOps: string[];
|
|
11
12
|
}): void;
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderMethylation = renderMethylation;
|
|
4
4
|
const util_1 = require("@jbrowse/core/util");
|
|
5
|
-
const MismatchParser_1 = require("../MismatchParser");
|
|
6
|
-
const util_2 = require("./util");
|
|
7
5
|
const colord_1 = require("@jbrowse/core/util/colord");
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
// locals
|
|
7
|
+
const util_2 = require("./util");
|
|
8
|
+
const ModificationParser_1 = require("../ModificationParser");
|
|
9
|
+
// Color by methylation is slightly modified version of color by modifications
|
|
10
|
+
// at reference CpG sites, with non-methylated CpG colored (looking only at the
|
|
11
|
+
// MM tag can not tell you where reference CpG sites are)
|
|
12
|
+
function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }) {
|
|
12
13
|
const { regionSequence } = renderArgs;
|
|
13
14
|
const { feature, topPx, heightPx } = feat;
|
|
14
15
|
if (!regionSequence) {
|
|
@@ -20,7 +21,7 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
|
|
|
20
21
|
}
|
|
21
22
|
const fstart = feature.get('start');
|
|
22
23
|
const fend = feature.get('end');
|
|
23
|
-
const { methBins, methProbs } = (0,
|
|
24
|
+
const { methBins, methProbs, hydroxyMethBins, hydroxyMethProbs } = (0, ModificationParser_1.getMethBins)(feature, cigarOps);
|
|
24
25
|
function getCol(k) {
|
|
25
26
|
if (methBins[k]) {
|
|
26
27
|
const p = methProbs[k] || 0;
|
|
@@ -28,12 +29,19 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
|
|
|
28
29
|
? (0, colord_1.colord)('red').alpha((p - 0.5) * 2)
|
|
29
30
|
: (0, colord_1.colord)('blue').alpha(1 - p * 2)).toHslString();
|
|
30
31
|
}
|
|
32
|
+
if (hydroxyMethBins[k]) {
|
|
33
|
+
const p = hydroxyMethProbs[k] || 0;
|
|
34
|
+
return (p > 0.5
|
|
35
|
+
? (0, colord_1.colord)('pink').alpha((p - 0.5) * 2)
|
|
36
|
+
: (0, colord_1.colord)('purple').alpha(1 - p * 2)).toHslString();
|
|
37
|
+
}
|
|
31
38
|
return undefined;
|
|
32
39
|
}
|
|
40
|
+
const r = regionSequence.toLowerCase();
|
|
33
41
|
for (let i = 0; i < fend - fstart; i++) {
|
|
34
42
|
const j = i + fstart;
|
|
35
|
-
const l1 =
|
|
36
|
-
const l2 =
|
|
43
|
+
const l1 = r[j - region.start + 1];
|
|
44
|
+
const l2 = r[j - region.start + 2];
|
|
37
45
|
if (l1 === 'c' && l2 === 'g') {
|
|
38
46
|
if (bpPerPx > 2) {
|
|
39
47
|
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(j, j + 2, region, bpPerPx);
|
|
@@ -12,8 +12,8 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
12
12
|
const pxPerBp = Math.min(1 / bpPerPx, 2);
|
|
13
13
|
const mismatches = feature.get('mismatches');
|
|
14
14
|
const heightLim = charHeight - 2;
|
|
15
|
-
// extraHorizontallyFlippedOffset is used to draw interbase items, which
|
|
16
|
-
//
|
|
15
|
+
// extraHorizontallyFlippedOffset is used to draw interbase items, which are
|
|
16
|
+
// located to the left when forward and right when reversed
|
|
17
17
|
const extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx + 1 : -1;
|
|
18
18
|
if (!mismatches) {
|
|
19
19
|
return;
|
|
@@ -25,16 +25,14 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
25
25
|
const mlen = mismatch.length;
|
|
26
26
|
const mbase = mismatch.base;
|
|
27
27
|
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
|
|
28
|
-
const widthPx = Math.max(minSubfeatureWidth,
|
|
28
|
+
const widthPx = Math.max(minSubfeatureWidth, rightPx - leftPx);
|
|
29
29
|
if (mismatch.type === 'mismatch') {
|
|
30
30
|
if (!drawSNPsMuted) {
|
|
31
31
|
const baseColor = colorForBase[mismatch.base] || '#888';
|
|
32
|
-
const c = mismatchAlpha
|
|
33
|
-
?
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.alpha(Math.min(1, mismatch.qual / 50))
|
|
37
|
-
.toHslString()
|
|
32
|
+
const c = mismatchAlpha && mismatch.qual !== undefined
|
|
33
|
+
? (0, colord_1.colord)(baseColor)
|
|
34
|
+
.alpha(Math.min(1, mismatch.qual / 50))
|
|
35
|
+
.toHslString()
|
|
38
36
|
: baseColor;
|
|
39
37
|
(0, util_2.fillRect)(ctx, Math.round(leftPx), topPx, widthPx, heightPx, canvasWidth, c);
|
|
40
38
|
}
|
|
@@ -43,13 +41,12 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
43
41
|
const contrastColor = drawSNPsMuted
|
|
44
42
|
? 'black'
|
|
45
43
|
: contrastForBase[mismatch.base] || 'black';
|
|
46
|
-
ctx.fillStyle =
|
|
47
|
-
|
|
48
|
-
? contrastColor
|
|
49
|
-
: (0, colord_1.colord)(contrastColor)
|
|
44
|
+
ctx.fillStyle =
|
|
45
|
+
mismatchAlpha && mismatch.qual !== undefined
|
|
46
|
+
? (0, colord_1.colord)(contrastColor)
|
|
50
47
|
.alpha(Math.min(1, mismatch.qual / 50))
|
|
51
48
|
.toHslString()
|
|
52
|
-
|
|
49
|
+
: contrastColor;
|
|
53
50
|
ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
|
|
54
51
|
}
|
|
55
52
|
}
|
|
@@ -63,7 +60,6 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
63
60
|
}
|
|
64
61
|
}
|
|
65
62
|
else if (mismatch.type === 'insertion' && drawIndels) {
|
|
66
|
-
ctx.fillStyle = 'purple';
|
|
67
63
|
const pos = leftPx + extraHorizontallyFlippedOffset;
|
|
68
64
|
const len = +mismatch.base || mismatch.length;
|
|
69
65
|
const insW = Math.max(0, Math.min(1.2, 1 / bpPerPx));
|
|
@@ -92,12 +88,16 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
92
88
|
else if (mismatch.type === 'skip') {
|
|
93
89
|
// fix to avoid bad rendering note that this was also related to chrome
|
|
94
90
|
// bug https://bugs.chromium.org/p/chromium/issues/detail?id=1131528
|
|
91
|
+
//
|
|
95
92
|
// also affected firefox ref #1236 #2750
|
|
96
93
|
if (leftPx + widthPx > 0) {
|
|
97
94
|
// make small exons more visible when zoomed far out
|
|
98
95
|
const adjustPx = widthPx - (bpPerPx > 10 ? 1.5 : 0);
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
const l = Math.max(0, leftPx);
|
|
97
|
+
const t = topPx + heightPx / 2 - 1;
|
|
98
|
+
const w = adjustPx + Math.min(leftPx, 0);
|
|
99
|
+
const h = 1;
|
|
100
|
+
(0, util_2.fillRect)(ctx, l, t, w, h, canvasWidth, 'rgb(151,184,201)');
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
@@ -106,10 +106,10 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
106
106
|
for (const mismatch of mismatches) {
|
|
107
107
|
const mstart = start + mismatch.start;
|
|
108
108
|
const mlen = mismatch.length;
|
|
109
|
-
const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
|
|
110
109
|
const len = +mismatch.base || mismatch.length;
|
|
111
|
-
const txt = `${len}`;
|
|
112
110
|
if (mismatch.type === 'insertion' && len >= 10) {
|
|
111
|
+
const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
|
|
112
|
+
const txt = `${len}`;
|
|
113
113
|
if (bpPerPx > largeInsertionIndicatorScale) {
|
|
114
114
|
(0, util_2.fillRect)(ctx, leftPx - 1, topPx, 2, heightPx, canvasWidth, 'purple');
|
|
115
115
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { Region } from '@jbrowse/core/util';
|
|
1
|
+
import type { Region } from '@jbrowse/core/util';
|
|
2
2
|
import { LayoutFeature } from './util';
|
|
3
3
|
import { RenderArgsWithColor } from './makeImageData';
|
|
4
|
-
export declare function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }: {
|
|
4
|
+
export declare function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, cigarOps, }: {
|
|
5
5
|
ctx: CanvasRenderingContext2D;
|
|
6
6
|
feat: LayoutFeature;
|
|
7
7
|
region: Region;
|
|
8
8
|
bpPerPx: number;
|
|
9
9
|
renderArgs: RenderArgsWithColor;
|
|
10
10
|
canvasWidth: number;
|
|
11
|
+
cigarOps: string[];
|
|
11
12
|
}): void;
|