UNPKG

@rcsb/rcsb-saguaro

Version:
86 lines (85 loc) 2.88 kB
/**Array of annotation elements*/ export class RcsbFvTrackData extends Array { } /**Map of annotation elements*/ export class RcsbFvTrackDataMap extends Map { } /**Class to load, process and check for spatial overlapping annotation data*/ export 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."; } } }