@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
111 lines • 6.25 kB
JavaScript
import { __awaiter } from "tslib";
import { Operator } from "../../../../RcsbUtils/Helpers/Operator";
import { range } from "lodash";
import { PlainAlignmentTrackFactory } from "./PlainAlignmentTrackFactory";
import { TrackUtils } from "./Helper/TrackUtils";
import { rcsbRequestCtxManager } from "../../../../RcsbRequest/RcsbRequestContextManager";
import { Assertions } from "../../../../RcsbUtils/Helpers/Assertions";
var assertDefined = Assertions.assertDefined;
import { TagDelimiter } from "@rcsb/rcsb-api-tools/lib/RcsbUtils/TagDelimiter";
export class PlainObservedAlignmentTrackFactory {
constructor(entityInstanceTranslator) {
this.unObservedResidues = new Map();
this.instanceEntityMap = new Map();
this.entityInstanceNumberMap = new Map();
this.alignmentTrackFactory = new PlainAlignmentTrackFactory(entityInstanceTranslator);
}
getTrack(alignmentRequestContext, targetAlignment) {
return __awaiter(this, void 0, void 0, function* () {
return this.alignmentTrackFactory.getTrack(alignmentRequestContext, targetAlignment, this.alignedRegionToTrackElementList.bind(this));
});
}
prepareFeatures(unObservedRegions) {
return __awaiter(this, void 0, void 0, function* () {
yield this.collectFeatureEntryProperties(unObservedRegions);
this.prepareFeaturesAlignmentMap(unObservedRegions);
});
}
collectFeatureEntryProperties(unObservedRegions) {
return __awaiter(this, void 0, void 0, function* () {
const entryIds = Operator.uniqueValues(unObservedRegions.map(uor => {
assertDefined(uor.target_id);
return uor.target_id.split(TagDelimiter.instance)[0];
}));
//TODO define a Translator class for multiple entry entry data
const entryProperties = (yield Promise.all(Operator.arrayChunk(entryIds, 100).map(ids => rcsbRequestCtxManager.getEntryProperties(ids)))).flat();
entryProperties.forEach(ep => {
ep.entityToInstance.forEach((instanceList, entityId) => {
this.entityInstanceNumberMap.set(entityId, instanceList.length);
instanceList.forEach(instanceId => {
this.instanceEntityMap.set(instanceId, entityId);
});
});
});
});
}
prepareFeaturesAlignmentMap(unObservedRegions) {
const uoInstanceFeatureMap = new Map();
unObservedRegions.forEach(ur => {
var _a;
if (!ur.target_id)
return;
const instanceId = ur.target_id;
if (!uoInstanceFeatureMap.has(instanceId))
uoInstanceFeatureMap.set(instanceId, new Set());
(_a = ur.features) === null || _a === void 0 ? void 0 : _a.forEach(feature => {
var _a;
(_a = feature === null || feature === void 0 ? void 0 : feature.feature_positions) === null || _a === void 0 ? void 0 : _a.forEach(fp => {
var _a;
if ((fp === null || fp === void 0 ? void 0 : fp.beg_seq_id) && (fp === null || fp === void 0 ? void 0 : fp.end_seq_id))
for (let i = fp.beg_seq_id; i <= fp.end_seq_id; i++) {
(_a = uoInstanceFeatureMap.get(instanceId)) === null || _a === void 0 ? void 0 : _a.add(i);
}
});
});
});
const uoEntityFeatureMap = new Map();
uoInstanceFeatureMap.forEach((uoSet, instanceId) => {
const entityId = this.instanceEntityMap.get(instanceId);
if (!entityId)
return;
if (!uoEntityFeatureMap.has(entityId))
uoEntityFeatureMap.set(entityId, new Map());
uoSet.forEach(i => {
var _a, _b, _c, _d;
if ((_a = uoEntityFeatureMap.get(entityId)) === null || _a === void 0 ? void 0 : _a.has(i)) {
const v = (_b = uoEntityFeatureMap.get(entityId)) === null || _b === void 0 ? void 0 : _b.get(i);
if (v)
(_c = uoEntityFeatureMap.get(entityId)) === null || _c === void 0 ? void 0 : _c.set(i, v + 1);
}
else {
(_d = uoEntityFeatureMap.get(entityId)) === null || _d === void 0 ? void 0 : _d.set(i, 1);
}
});
});
uoEntityFeatureMap.forEach((unObservedMap, entityId) => {
this.unObservedResidues.set(entityId, Array.from(unObservedMap.entries()).filter(e => (e[1] == this.entityInstanceNumberMap.get(entityId))).map(e => e[0]).sort((a, b) => a - b));
});
}
alignedRegionToTrackElementList(region, alignmentContext) {
var _a;
if (!this.unObservedResidues.has(alignmentContext.targetId) || ((_a = this.unObservedResidues.get(alignmentContext.targetId)) === null || _a === void 0 ? void 0 : _a.length) == 0)
return this.alignmentTrackFactory.alignedRegionToTrackElementList(region, alignmentContext);
const unModelledSet = new Set(this.unObservedResidues.get(alignmentContext.targetId));
const delta = region.target_begin - region.query_begin;
return range(region.query_begin, region.query_end + 1).map((i) => {
assertDefined(alignmentContext.to);
return this.alignmentTrackFactory.addAuthorResIds({
begin: i,
oriBegin: i + delta,
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,
type: "ALIGNED_BLOCK",
title: unModelledSet.has(i) ? "UNMODELED REGION" : "ALIGNED REGION",
value: unModelledSet.has(i) ? 0 : 100
}, alignmentContext);
});
}
}
//# sourceMappingURL=PlainObservedAlignmentTrackFactory.js.map