@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
115 lines (114 loc) • 6.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PlainObservedAlignmentTrackFactory = void 0;
const tslib_1 = require("tslib");
const Operator_1 = require("../../../../RcsbUtils/Helpers/Operator");
const lodash_1 = require("lodash");
const PlainAlignmentTrackFactory_1 = require("./PlainAlignmentTrackFactory");
const TrackUtils_1 = require("./Helper/TrackUtils");
const RcsbRequestContextManager_1 = require("../../../../RcsbRequest/RcsbRequestContextManager");
const Assertions_1 = require("../../../../RcsbUtils/Helpers/Assertions");
var assertDefined = Assertions_1.Assertions.assertDefined;
const TagDelimiter_1 = require("@rcsb/rcsb-api-tools/lib/RcsbUtils/TagDelimiter");
class PlainObservedAlignmentTrackFactory {
constructor(entityInstanceTranslator) {
this.unObservedResidues = new Map();
this.instanceEntityMap = new Map();
this.entityInstanceNumberMap = new Map();
this.alignmentTrackFactory = new PlainAlignmentTrackFactory_1.PlainAlignmentTrackFactory(entityInstanceTranslator);
}
getTrack(alignmentRequestContext, targetAlignment) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
return this.alignmentTrackFactory.getTrack(alignmentRequestContext, targetAlignment, this.alignedRegionToTrackElementList.bind(this));
});
}
prepareFeatures(unObservedRegions) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
yield this.collectFeatureEntryProperties(unObservedRegions);
this.prepareFeaturesAlignmentMap(unObservedRegions);
});
}
collectFeatureEntryProperties(unObservedRegions) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const entryIds = Operator_1.Operator.uniqueValues(unObservedRegions.map(uor => {
assertDefined(uor.target_id);
return uor.target_id.split(TagDelimiter_1.TagDelimiter.instance)[0];
}));
//TODO define a Translator class for multiple entry entry data
const entryProperties = (yield Promise.all(Operator_1.Operator.arrayChunk(entryIds, 100).map(ids => RcsbRequestContextManager_1.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 (0, lodash_1.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_1.TrackUtils.transformSourceFromTarget(alignmentContext.targetId, alignmentContext.to),
provenanceName: TrackUtils_1.TrackUtils.getProvenanceConfigFormTarget(alignmentContext.targetId, alignmentContext.to).name,
provenanceColor: TrackUtils_1.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);
});
}
}
exports.PlainObservedAlignmentTrackFactory = PlainObservedAlignmentTrackFactory;