@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
100 lines • 4.74 kB
JavaScript
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