@rcsb/rcsb-saguaro-3d
Version:
RCSB Molstar/Saguaro Web App
121 lines (120 loc) • 5.93 kB
JavaScript
;
/*
* Copyright (c) 2021 RCSB PDB and contributors, licensed under MIT, See LICENSE file for more info.
* @author Joan Segura Mora <joan.segura@rcsb.org>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.AlignmentMapper = void 0;
var AlignmentMapper;
(function (AlignmentMapper) {
function mapRangeToRegionList(range, regionList, pointer) {
return regionList.map(region => mapRangeToRegion(range, region, pointer)).filter((o) => o != null);
}
AlignmentMapper.mapRangeToRegionList = mapRangeToRegionList;
function mapRangeToRegion(range, region, pointer) {
var _a, _b;
if (!areIntersectingRegions({ query_begin: range.begin, query_end: range.end, target_begin: range.begin, target_end: range.end }, region, pointer))
return;
const cPointer = pointer == "query" ? "target" : "query";
return {
begin: (_a = mapPointToRegion(range.begin, region, pointer)) !== null && _a !== void 0 ? _a : region[ALIGNMENT_POINTER[cPointer].begin],
end: (_b = mapPointToRegion(range.end, region, pointer)) !== null && _b !== void 0 ? _b : region[ALIGNMENT_POINTER[cPointer].end]
};
}
AlignmentMapper.mapRangeToRegion = mapRangeToRegion;
function mapPointToRegion(p, region, pointer) {
if (region[ALIGNMENT_POINTER[pointer].begin] <= p && p <= region[ALIGNMENT_POINTER[pointer].end]) {
const cPointer = pointer == "query" ? "target" : "query";
return region[ALIGNMENT_POINTER[cPointer].begin] + (p - region[ALIGNMENT_POINTER[pointer].begin]);
}
return;
}
AlignmentMapper.mapPointToRegion = mapPointToRegion;
function areIntersectingRegions(regionA, regionB, pointer) {
return !(regionA[ALIGNMENT_POINTER[pointer].begin] > regionB[ALIGNMENT_POINTER[pointer].end] || regionA[ALIGNMENT_POINTER[pointer].end] < regionB[ALIGNMENT_POINTER[pointer].begin]);
}
AlignmentMapper.areIntersectingRegions = areIntersectingRegions;
function getAllQueryIntersections(regionListA, regionListB) {
return regionListA.map(regionA => regionListB.filter(regionB => areIntersectingRegions(regionA, regionB, "target")).map(regionB => getQueryIntersection(regionA, regionB))).flat();
}
AlignmentMapper.getAllQueryIntersections = getAllQueryIntersections;
function getAllTargetIntersections(regionListA, regionListB) {
return regionListA.map(regionA => regionListB.filter(regionB => areIntersectingRegions(regionA, regionB, "query")).map(regionB => getTargetIntersection(regionA, regionB))).flat();
}
AlignmentMapper.getAllTargetIntersections = getAllTargetIntersections;
function getQueryIntersection(regionA, regionB) {
const [targetRegionA, targetRegionB] = getTargetIntersection(swapQueryAndTarget(regionA), swapQueryAndTarget(regionB));
return [{
query_begin: targetRegionA.target_begin,
query_end: targetRegionA.target_end
}, {
query_begin: targetRegionB.target_begin,
query_end: targetRegionB.target_end
}];
}
AlignmentMapper.getQueryIntersection = getQueryIntersection;
function getTargetIntersection(regionA, regionB) {
const out = {
target_begin_A: 0,
target_end_A: 0,
target_begin_B: 0,
target_end_B: 0
};
if (typeof mapPointToRegion(regionA.query_begin, regionB, "query") === "number") {
out.target_begin_A = regionA.target_begin;
out.target_begin_B = mapPointToRegion(regionA.query_begin, regionB, "query");
}
else if (typeof mapPointToRegion(regionB.query_begin, regionA, "query") === "number") {
out.target_begin_A = mapPointToRegion(regionB.query_begin, regionA, "query");
out.target_begin_B = regionB.target_begin;
}
else {
throw "Intersection Error: No intersection was found";
}
if (typeof mapPointToRegion(regionA.query_end, regionB, "query") === "number") {
out.target_end_A = regionA.target_end;
out.target_end_B = mapPointToRegion(regionA.query_end, regionB, "query");
}
else if (typeof mapPointToRegion(regionB.query_end, regionA, "query") === "number") {
out.target_end_A = mapPointToRegion(regionB.query_end, regionA, "query");
out.target_end_B = regionB.target_end;
}
else {
throw "Intersection Error: No intersection was found";
}
if (out.target_end_A - out.target_begin_A != out.target_end_B - out.target_begin_B)
throw `Intersection Error: Inconsistent intersection range [${out.target_begin_A},${out.target_end_A}] [${out.target_begin_B},${out.target_end_B}]`;
return [{
target_begin: out.target_begin_A,
target_end: out.target_end_A
}, {
target_begin: out.target_begin_B,
target_end: out.target_end_B
}];
}
AlignmentMapper.getTargetIntersection = getTargetIntersection;
function range(start, stop, step = 1) {
const length = Math.ceil((stop + 1 - start) / step);
return Array.from({ length }, (_, i) => (i * step) + start);
}
AlignmentMapper.range = range;
function swapQueryAndTarget(region) {
return {
query_begin: region.target_begin,
query_end: region.target_end,
target_begin: region.query_begin,
target_end: region.query_end
};
}
AlignmentMapper.swapQueryAndTarget = swapQueryAndTarget;
})(AlignmentMapper || (exports.AlignmentMapper = AlignmentMapper = {}));
const ALIGNMENT_POINTER = {
query: {
begin: "query_begin",
end: "query_end"
},
target: {
begin: "target_begin",
end: "target_end"
}
};