@rcsb/rcsb-saguaro
Version:
RCSB 1D Feature Viewer
86 lines (85 loc) • 2.88 kB
JavaScript
/**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.";
}
}
}