UNPKG

@rcsb/rcsb-saguaro-app

Version:
129 lines 7.69 kB
import { __awaiter } from "tslib"; import { FeatureTools } from "../../../../RcsbCollectTools/FeatureTools/FeatureTools"; import { SequenceTrackFactory } from "./SequenceTrackFactory"; import { AlignmentTrackTitleFactory } from "../TrackTitleFactoryImpl/AlignmentTrackTitleFactory"; import { TrackUtils } from "./Helper/TrackUtils"; import { Assertions } from "../../../../RcsbUtils/Helpers/Assertions"; var assertDefined = Assertions.assertDefined; export class AlignmentTrackFactory { constructor(entityInstanceTranslator, trackTitleFactory) { this.sequenceTrackFactory = new SequenceTrackFactory(entityInstanceTranslator); this.trackTitleFactory = trackTitleFactory !== null && trackTitleFactory !== void 0 ? trackTitleFactory : new AlignmentTrackTitleFactory(entityInstanceTranslator); } getTrack(alignmentRequestContext, targetAlignment, alignedRegionToTrackElementList) { return __awaiter(this, void 0, void 0, function* () { const { alignedBlocks, mismatchData, sequenceData } = this.getAlignmentTrackConfiguration(alignmentRequestContext, targetAlignment, alignedRegionToTrackElementList !== null && alignedRegionToTrackElementList !== void 0 ? alignedRegionToTrackElementList : this.alignedRegionToTrackElementList.bind(this)); const sequenceDisplay = { displayType: "sequence" /* RcsbFvDisplayTypes.SEQUENCE */, displayColor: "#000000", displayData: sequenceData }; const mismatchDisplay = { displayType: "pin" /* RcsbFvDisplayTypes.PIN */, displayColor: "#FF9999", displayData: mismatchData }; const alignmentDisplay = { displayType: "block" /* RcsbFvDisplayTypes.BLOCK */, displayColor: "#9999FF", displayData: alignedBlocks }; return { trackId: "targetSequenceTrack_" + targetAlignment.target_id, displayType: "composite" /* RcsbFvDisplayTypes.COMPOSITE */, overlap: true, trackColor: "#F9F9F9", rowPrefix: yield this.trackTitleFactory.getTrackTitlePrefix(alignmentRequestContext, targetAlignment), rowTitle: yield this.trackTitleFactory.getTrackTitle(alignmentRequestContext, targetAlignment), fitTitleWidth: alignmentRequestContext.fitTitleWidth, titleFlagColor: yield this.trackTitleFactory.getTrackTitleFlagColor(alignmentRequestContext, targetAlignment), displayConfig: [alignmentDisplay, mismatchDisplay, sequenceDisplay] }; }); } getAlignmentTrackConfiguration(alignmentQueryContext, targetAlignment, alignedRegionToTrackElementList) { var _a, _b, _c; assertDefined(alignmentQueryContext.queryId), assertDefined(targetAlignment.target_id); const alignedBlocks = []; const mismatchData = []; const targetSequence = targetAlignment.target_sequence; const sequenceData = []; const alignmentContext = { queryId: alignmentQueryContext.queryId, targetId: targetAlignment.target_id, from: alignmentQueryContext.from, to: alignmentQueryContext.to, targetSequenceLength: (_a = targetAlignment.target_sequence) === null || _a === void 0 ? void 0 : _a.length, querySequenceLength: (_b = alignmentQueryContext.querySequence) === null || _b === void 0 ? void 0 : _b.length }; (_c = targetAlignment.aligned_regions) === null || _c === void 0 ? void 0 : _c.forEach(region => { var _a, _b; assertDefined(region); const regionSequence = targetSequence && region.target_begin && region.target_end ? targetSequence.substring(region.target_begin - 1, region.target_end) : ""; this.sequenceTrackFactory.buildSequenceData(Object.assign(Object.assign({}, alignmentContext), { sequence: regionSequence, begin: region.query_begin, oriBegin: region === null || region === void 0 ? void 0 : region.target_begin }), "to").forEach(sd => { sequenceData.push(sd); }); alignedRegionToTrackElementList(region, Object.assign(Object.assign({}, alignmentContext), { targetSequenceLength: (_a = alignmentContext.targetSequenceLength) !== null && _a !== void 0 ? _a : (_b = targetAlignment.target_sequence) === null || _b === void 0 ? void 0 : _b.length })).forEach(r => { alignedBlocks.push(r); }); if (alignmentQueryContext.querySequence) findMismatch(regionSequence, alignmentQueryContext.querySequence.substring(region.query_begin - 1, region.query_end)).forEach(m => { var _a; assertDefined(alignmentContext.to), assertDefined(alignmentQueryContext.to); mismatchData.push(this.sequenceTrackFactory.addAuthorResIds({ begin: (m + region.query_begin), oriBegin: (m + region.target_begin), sourceId: (_a = targetAlignment.target_id) !== null && _a !== void 0 ? _a : undefined, source: TrackUtils.transformSourceFromTarget(alignmentContext.targetId, alignmentContext.to), provenanceName: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentQueryContext.to).name, provenanceColor: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentQueryContext.to).color, type: "MISMATCH", title: "MISMATCH" }, alignmentContext)); }); }); FeatureTools.mergeBlocks(alignedBlocks); return { alignedBlocks, mismatchData, sequenceData }; } alignedRegionToTrackElementList(region, alignmentContext) { let openBegin = false; if (region.target_begin != 1) openBegin = true; let openEnd = false; if (alignmentContext.targetSequenceLength && region.target_end != alignmentContext.targetSequenceLength) openEnd = true; assertDefined(alignmentContext.to); return [this.sequenceTrackFactory.addAuthorResIds({ begin: region.query_begin, end: region.query_end, oriBegin: region.target_begin, oriEnd: region.target_end, sourceId: alignmentContext.targetId, source: TrackUtils.transformSourceFromTarget(alignmentContext.targetId, alignmentContext.to), provenanceName: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentContext.to).name, provenanceColor: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentContext.to).color, openBegin: openBegin, openEnd: openEnd, type: "ALIGNED_BLOCK", title: "ALIGNED REGION" }, alignmentContext)]; } addAuthorResIds(e, alignmentContext) { return this.sequenceTrackFactory.addAuthorResIds(e, alignmentContext); } } function findMismatch(seqA, seqB) { const out = []; if (seqA.length === seqB.length) { for (let i = 0; i < seqA.length; i++) { if (seqA.charAt(i) !== seqB.charAt(i)) { out.push(i); } } } else { console.error("Find alignment missmatch failed. Sequence regions of different length"); } return out; } //# sourceMappingURL=AlignmentTrackFactory.js.map