UNPKG

@rcsb/rcsb-saguaro

Version:
92 lines (91 loc) 3.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RcsbDataManager = exports.RcsbFvTrackDataMap = exports.RcsbFvTrackData = void 0; /**Array of annotation elements*/ class RcsbFvTrackData extends Array { } exports.RcsbFvTrackData = RcsbFvTrackData; /**Map of annotation elements*/ class RcsbFvTrackDataMap extends Map { } exports.RcsbFvTrackDataMap = RcsbFvTrackDataMap; /**Class to load, process and check for spatial overlapping annotation data*/ class RcsbDataManager { /**Join multiple arrays of annotation data elements into one * @param dataList Array of annotation arrays * @return RcsbFvTrackData Single array of annotations * */ static joinTrackDataArray(dataList) { const out = new RcsbFvTrackData(); dataList.forEach(d => { d.forEach(e => { out.push(e); }); }); return out; } /**Check spatial overlapping between annotation elements and return an array with non-overlapping sets of annotations * @param data Array of annotations * @return Array Multiple array of non-overlapping annotations * */ static getNonOverlappingData(data) { const out = new Array(); data.sort((a, b) => { if (typeof a.begin === "number" && typeof b.begin === "number") { return (a.begin - b.begin); } else { throw "Unknown rowConfigData element structure"; } }); for (const a of data) { let pushed = false; for (const track of out) { let overlap = false; for (const b of track) { if (this.doOverlap(a, b)) { overlap = true; break; } } if (!overlap) { track.push(a); pushed = true; break; } } if (!pushed) { out.push(new RcsbFvTrackData()); out[out.length - 1].push(a); } } return out; } /**Check if twon annotation elements overlap in the space*/ static doOverlap(a, b) { if (typeof a.begin === "number" && typeof b.begin === "number" && typeof a.end === "number" && typeof b.end === "number") { if (a.end < b.begin || b.end < a.begin) return false; } else if (typeof a.begin === "number" && typeof b.begin === "number") { if (a.begin != b.begin) return false; } return true; } /**Checks annotation data*/ static processData(dataTrack) { if (dataTrack instanceof Array) { const rcsbFvDataClass = new RcsbFvTrackData(); for (const dataElement of dataTrack) { rcsbFvDataClass.push(dataElement); } return rcsbFvDataClass; } else { console.error(dataTrack); throw "Data format error."; } } } exports.RcsbDataManager = RcsbDataManager;