in client/client/app/shared/components/ngbVariantDetails/ngbVariantVisualizer/ngbVariantVisualizer.service.js [574:660]
buildTranscriptExonsPositions(transcripts) {
let parts = [];
const addPart = ({start, end}) => {
let startPartIndex = null;
let endPartIndex = null;
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
if (start >= part.start && start <= part.end) {
startPartIndex = i;
}
if (end >= part.start && end <= part.end) {
endPartIndex = i;
}
}
let partsToDelete = [];
if (startPartIndex !== null && endPartIndex !== null) {
parts[startPartIndex].end = parts[endPartIndex].end;
for (let i = startPartIndex + 1; i <= endPartIndex; i++) {
partsToDelete.push(i);
}
} else if (startPartIndex !== null) {
for (let i = startPartIndex + 1; i < parts.length; i++) {
const part = parts[i];
if (part.end < end) {
partsToDelete.push(i);
}
}
parts[startPartIndex].end = end;
} else if (endPartIndex !== null) {
for (let i = 0; i < endPartIndex - 1; i++) {
const part = parts[i];
if (part.start > start) {
partsToDelete.push(i);
}
}
parts[endPartIndex].start = start;
} else {
parts.push({start, end});
}
partsToDelete = Sorting.quickSort(partsToDelete, false);
for (let i = 0; i < partsToDelete.length; i++) {
parts.splice(partsToDelete[i], 1);
}
parts = Sorting.quickSort(parts, true, x => x.start);
};
for (let i = 0; i < transcripts.length; i++) {
const transcript = transcripts[i];
for (let j = 0; j < transcript.canonicalCds.length; j++) {
addPart(transcript.canonicalCds[j]);
}
}
const getPositionFromStart = (position) => {
let result = 0;
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
if (position > part.end) {
result += part.end - part.start + 1;
} else {
if (position > part.start) {
result += (position - part.start);
}
break;
}
}
return result;
};
for (let i = 0; i < transcripts.length; i++) {
const transcript = transcripts[i];
for (let j = 0; j < transcript.canonicalCds.length; j++) {
const cds = transcript.canonicalCds[j];
const p1 = getPositionFromStart(cds.start);
const p2 = getPositionFromStart(cds.end);
const diff = p1 - cds.relativePosition.start;
cds.positionFromStart = {
start: cds.relativePosition.start + diff,
end: cds.relativePosition.end + diff
};
for (let d = 0; d < cds.domains.length; d++) {
const domain = cds.domains[d];
domain.rangeFromStart = {
start: domain.range.start + diff,
end: domain.range.end + diff
};
}
}
}
}