@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
129 lines • 7.42 kB
JavaScript
import { __awaiter } from "tslib";
import { SequenceTrackFactory } from "./SequenceTrackFactory";
import { range } from "lodash";
import { AlignmentTrackTitleFactory } from "../TrackTitleFactoryImpl/AlignmentTrackTitleFactory";
import { TrackUtils } from "./Helper/TrackUtils";
import { Assertions } from "../../../../RcsbUtils/Helpers/Assertions";
var assertDefined = Assertions.assertDefined;
export class PlainAlignmentTrackFactory {
constructor(entityInstanceTranslator) {
this.sequenceTrackFactory = new SequenceTrackFactory(entityInstanceTranslator);
this.trackTitleFactory = new AlignmentTrackTitleFactory(entityInstanceTranslator);
}
getTrack(alignmentRequestContext, targetAlignment, alignedRegionToTrackElementList, alignmentColor) {
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-area" /* RcsbFvDisplayTypes.BLOCK_AREA */,
displayColor: alignmentColor !== null && alignmentColor !== void 0 ? alignmentColor : {
colors: ["#dcdcdc", "#c7c7ff"],
thresholds: [50]
},
displayData: alignedBlocks
};
return {
trackId: "targetSequenceTrack_" + targetAlignment.target_id,
displayType: "composite" /* RcsbFvDisplayTypes.COMPOSITE */,
overlap: true,
trackColor: "#F9F9F9",
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, _d;
const alignedBlocks = [];
const mismatchData = [];
const targetSequence = targetAlignment.target_sequence;
const sequenceData = [];
const queryId = (_a = alignmentQueryContext.queryId) !== null && _a !== void 0 ? _a : alignmentQueryContext.groupId;
assertDefined(queryId), assertDefined(targetAlignment.target_id);
const alignmentContext = {
queryId,
targetId: targetAlignment.target_id,
from: alignmentQueryContext.from,
to: alignmentQueryContext.to,
targetSequenceLength: (_b = targetAlignment.target_sequence) === null || _b === void 0 ? void 0 : _b.length,
querySequenceLength: (_c = alignmentQueryContext.querySequence) === null || _c === void 0 ? void 0 : _c.length
};
(_d = targetAlignment.aligned_regions) === null || _d === void 0 ? void 0 : _d.forEach(region => {
if (!(region === null || region === void 0 ? void 0 : region.target_begin) || !(region === null || region === void 0 ? void 0 : region.target_end))
return;
const regionSequence = targetSequence === null || targetSequence === void 0 ? void 0 : targetSequence.substring(region.target_begin - 1, region.target_end);
if (regionSequence)
this.sequenceTrackFactory.buildSequenceData(Object.assign(Object.assign({}, alignmentContext), { sequence: regionSequence, begin: region.query_begin, oriBegin: region.target_begin }), "to").forEach(sd => {
sequenceData.push(sd);
});
alignedRegionToTrackElementList(region, alignmentContext).forEach(r => {
alignedBlocks.push(r);
});
if (regionSequence && alignmentQueryContext.querySequence)
findMismatch(regionSequence, alignmentQueryContext.querySequence.substring(region.query_begin - 1, region.query_end)).forEach(m => {
if (alignmentQueryContext.querySequence && targetAlignment.target_id && alignmentContext.to)
mismatchData.push(this.sequenceTrackFactory.addAuthorResIds({
begin: (m + region.query_begin),
oriBegin: (m + region.target_begin),
sourceId: targetAlignment.target_id,
source: TrackUtils.transformSourceFromTarget(alignmentContext.targetId, alignmentContext.to),
provenanceName: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentContext.to).name,
provenanceColor: TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentContext.to).color,
type: "MISMATCH",
title: "MISMATCH"
}, alignmentContext));
});
});
return { alignedBlocks, mismatchData, sequenceData };
}
alignedRegionToTrackElementList(region, alignmentContext) {
let openBegin = false;
if (region.target_begin != 1)
openBegin = true;
let openEnd = false;
if (region.target_end != alignmentContext.targetSequenceLength && alignmentContext.querySequenceLength)
openEnd = true;
return range(region.query_begin, region.query_end + 1).map((p, n) => {
assertDefined(alignmentContext.to);
return this.addAuthorResIds({
begin: p,
oriBegin: region.target_begin + n,
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",
value: 100
}, 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);
}
}
}
return out;
}
//# sourceMappingURL=PlainAlignmentTrackFactory.js.map