UNPKG

@rcsb/rcsb-saguaro-3d

Version:
121 lines (120 loc) 5.93 kB
"use strict"; /* * 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" } };