@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
129 lines • 7.69 kB
JavaScript
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