UNPKG

@rcsb/rcsb-saguaro-app

Version:
100 lines 4.74 kB
import { Logo } from "./Logo"; import { RcsbAnnotationConstants } from "../../RcsbAnnotationConfig/RcsbAnnotationConstants"; import { Assertions } from "../Helpers/Assertions"; import { GroupGapLessTransformer } from "../Groups/GroupGapLessTransformer"; import { GroupProvenanceId } from "@rcsb/rcsb-api-tools/lib/RcsbDw/Types/DwEnums"; var assertElementListDefined = Assertions.assertElementListDefined; export function groupExternalTrackBuilder(groupProvenance) { const seqName = "CONSENSUS SEQUENCE"; const conservationName = "SEQUENCE VARIATION"; const querySequenceLogo = new Array(); const gapLessTransformer = new GroupGapLessTransformer(); let variationRowData; return { addTo(tracks) { if (querySequenceLogo.length == 0) return new Promise((resolve) => { resolve(); }); variationRowData.forEach(track => tracks.alignmentTracks.unshift(track)); return new Promise((resolve) => { resolve(); }); }, processAlignmentAndFeatures(data) { return new Promise((resolve) => { resolve(); }); }, filterFeatures(data) { gapLessTransformer.gapLessFeatures(data.annotations); data.annotations.forEach(ann => { var _a; ann.features = (_a = ann.features) === null || _a === void 0 ? void 0 : _a.filter(f => ((f === null || f === void 0 ? void 0 : f.name) != "automated matches")); }); return new Promise((resolve) => { resolve(data.annotations); }); }, filterAlignments(data) { if (groupProvenance === GroupProvenanceId.ProvenanceSequenceIdentity) { gapLessTransformer.gapLessAlignments(data.alignments); processAlignments(data.alignments); } return new Promise((resolve) => { resolve(data.alignments); }); } }; function processAlignments(alignment) { var _a, _b; if (querySequenceLogo.length > 0) { return; } if (alignment.alignment_length && alignment.alignment_logo && alignment.alignment_length != ((_a = alignment.alignment_logo) === null || _a === void 0 ? void 0 : _a.length)) throw new Error("ERROR Alignment length and logo should match"); (_b = alignment.alignment_logo) === null || _b === void 0 ? void 0 : _b.forEach(al => { assertElementListDefined(al); querySequenceLogo.push(new Logo(al)); }); const sequenceRowData = querySequenceLogo.map((s, n) => { const nFreq = 5; const maxFreqList = s.frequency().filter(f => f.symbol != "-").slice(0, nFreq).map(f => Math.trunc(f.value * 100) / 100); const gapFreq = Math.trunc(s.frequency().filter(f => f.symbol == "-")[0].value * 100) / 100; return { begin: n + 1, values: maxFreqList.map((f, n) => maxFreqList.slice(0, (n + 1)).reduce((v, n) => v + n)).concat([1 - gapFreq, 1]), value: s.frequency()[0].symbol != "-" ? Math.trunc(s.frequency()[0].value * 100) / 100 : 0 }; }); const logoRowData = querySequenceLogo.map((s, n) => ({ begin: n + 1, label: s.mode(), description: [s.frequency().filter(s => (s.value >= 0.01)).slice(0, 14).map(s => (s.symbol.replace("-", "gap") + ": " + Math.trunc(s.value * 100) / 100)).join(", ")] })); variationRowData = [{ trackId: "annotationTrack_ALIGNMENT_FREQ", displayType: "multi-area" /* RcsbFvDisplayTypes.MULTI_AREA */, overlap: true, trackColor: "#F9F9F9", displayColor: { thresholds: [], colors: ["#5289e9", "#76bbf6", "#91cef6", "#b9d9f8", "#d6eafd", "#e6f5fd", "#f9f9f9"] }, trackHeight: 20, titleFlagColor: RcsbAnnotationConstants.provenanceColorCode.rcsbPdb, rowTitle: conservationName, trackData: sequenceRowData }, { trackId: "annotationTrack_ALIGNMENT_MODE", displayType: "sequence" /* RcsbFvDisplayTypes.SEQUENCE */, overlap: true, trackColor: "#F9F9F9", titleFlagColor: RcsbAnnotationConstants.provenanceColorCode.rcsbPdb, rowTitle: seqName, nonEmptyDisplay: true, trackData: logoRowData }]; } } //# sourceMappingURL=GroupExternalTrackBuilder.js.map