buildTranscriptExonsPositions()

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
                    };
                }
            }
        }
    }