in client/client/modules/render/variant-render/transformers/short-variant-transformer.js [6:349]
static transformSequences(variant, alternativeAlleleInfo){
const referenceSequence = [];
const alternativeSequence = [];
const consensusSequence = [];
const consensusSequenceForReverseStrand = [];
variant.reference.forEach((x) => { x.position = x.startIndex; });
const referenceAminoacidsData = ShortVariantTransformer.getAminoacidSequences(variant.reference, null, alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts);
switch (variant.variantInfo.type.toLowerCase()) {
case 'ins':
{
for (let i = 0; i < referenceAminoacidsData.length; i++){
const referenceAminoacids = referenceAminoacidsData[i].aminoacids;
for (let j = 0; j < referenceAminoacids.length; j++){
if (referenceAminoacids[j].startIndex >= variant.variantInfo.startIndexCorrected){
referenceAminoacids[j].startIndex += alternativeAlleleInfo.info.length || 0;
referenceAminoacids[j].endIndex += alternativeAlleleInfo.info.length || 0;
}
else if (referenceAminoacids[j].startIndex < variant.variantInfo.startIndexCorrected && referenceAminoacids[j].endIndex >= variant.variantInfo.startIndexCorrected){
referenceAminoacids[j].endIndex += alternativeAlleleInfo.info.length || 0;
}
}
}
for (let i = 0; i < alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts.length; i++) {
const affectedTranscript = alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts[i];
if (affectedTranscript.transcript !== null){
affectedTranscript.transcript.value.modifiedExons = [];
const isNegativeStrand = affectedTranscript.gene.value.strand.toLowerCase() === 'negative';
for (let j = 0; j < affectedTranscript.transcript.value.exon.length; j++) {
const ex = Object.assign({}, affectedTranscript.transcript.value.exon[j]);
if (isNegativeStrand) {
if (ex.end + affectedTranscript.gene.value.startIndex <= variant.variantInfo.startIndexCorrected) {
ex.start -= alternativeAlleleInfo.info.length || 0;
ex.end -= alternativeAlleleInfo.info.length || 0;
}
else if (ex.start + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected && ex.end + affectedTranscript.gene.value.startIndex >= variant.variantInfo.startIndexCorrected) {
ex.start -= alternativeAlleleInfo.info.length || 0;
}
}
else {
if (ex.start + affectedTranscript.gene.value.startIndex >= variant.variantInfo.startIndexCorrected) {
ex.start += alternativeAlleleInfo.info.length || 0;
ex.end += alternativeAlleleInfo.info.length || 0;
}
else if (ex.start + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected && ex.end + affectedTranscript.gene.value.startIndex >= variant.variantInfo.startIndexCorrected) {
ex.end += alternativeAlleleInfo.info.length || 0;
}
}
affectedTranscript.transcript.value.modifiedExons.push(ex);
}
}
}
}
break;
case 'del':
for (let i = 0; i < alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts.length; i++) {
const affectedTranscript = alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts[i];
if (affectedTranscript.transcript !== null){
affectedTranscript.transcript.value.modifiedExons = [];
const isNegativeStrand = affectedTranscript.gene.value.strand.toLowerCase() === 'negative';
for (let j = 0; j < affectedTranscript.transcript.value.exon.length; j++) {
const ex = Object.assign({}, affectedTranscript.transcript.value.exon[j]);
if (isNegativeStrand) {
if (ex.end + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected) {
ex.end += (alternativeAlleleInfo.info.length || 0);
}
else if (ex.end + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0)) {
ex.end = variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0) - affectedTranscript.gene.value.startIndex;
}
if (ex.start + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected) {
ex.start += (alternativeAlleleInfo.info.length || 0);
}
else if (ex.start + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0)) {
ex.start = variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0) - affectedTranscript.gene.value.startIndex;
}
}
else {
if (ex.end + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0)) {
ex.end -= (alternativeAlleleInfo.info.length || 0);
}
else if (ex.end + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected) {
ex.end = affectedTranscript.gene.value.startIndex - variant.variantInfo.startIndexCorrected;
}
if (ex.start + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected + (alternativeAlleleInfo.info.length || 0)) {
ex.start -= (alternativeAlleleInfo.info.length || 0);
}
else if (ex.start + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected) {
ex.start = affectedTranscript.gene.value.startIndex - variant.variantInfo.startIndexCorrected;
}
}
affectedTranscript.transcript.value.modifiedExons.push(ex);
}
}
}
break;
default:
for (let i = 0; i < alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts.length; i++) {
const affectedTranscript = alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts[i];
if (affectedTranscript.transcript !== null){
affectedTranscript.transcript.value.modifiedExons = affectedTranscript.transcript.value.exon;
}
}
break;
}
if (variant.variantInfo.type.toLowerCase() === 'ins') {
for (let j = 0; j < alternativeAlleleInfo.info.sequence.length; j++) {
alternativeSequence.push({
position: variant.variantInfo.startIndexCorrected + j,
text: alternativeAlleleInfo.info.sequence[j]
});
alternativeSequence.push({
position: variant.variantInfo.startIndexCorrected + j,
text: alternativeAlleleInfo.info.sequence[j]
});
consensusSequence.push({
position: variant.variantInfo.startIndexCorrected + j,
text: alternativeAlleleInfo.info.sequence[j]
});
consensusSequenceForReverseStrand.push({
position: variant.variantInfo.startIndexCorrected + j - alternativeAlleleInfo.info.length,
text: alternativeAlleleInfo.info.sequence[j]
});
}
}
for (let i = 0; i < variant.reference.length; i++) {
const position = variant.reference[i].startIndex;
switch (variant.variantInfo.type.toLowerCase()) {
case 'ins':
{
referenceSequence.push({
position: position + (position >= variant.variantInfo.startIndexCorrected ? alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
alternativeSequence.push({
position: position + (position >= variant.variantInfo.startIndexCorrected ? alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
consensusSequence.push({
position: position + (position >= variant.variantInfo.startIndexCorrected ? alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
consensusSequenceForReverseStrand.push({
position: position + (position < variant.variantInfo.startIndexCorrected ? - alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
}
break;
case 'del':
{
referenceSequence.push({
position: position,
text: variant.reference[i].text
});
if (position < variant.variantInfo.startIndexCorrected || position >= variant.variantInfo.startIndexCorrected + alternativeAlleleInfo.info.length) {
alternativeSequence.push({
position: position,
text: variant.reference[i].text
});
consensusSequence.push({
position: position + (position >= variant.variantInfo.startIndexCorrected ? - alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
consensusSequenceForReverseStrand.push({
position: position + (position < variant.variantInfo.startIndexCorrected ? alternativeAlleleInfo.info.length : 0),
text: variant.reference[i].text
});
}
}
break;
default:
{
if (position < variant.variantInfo.startIndexCorrected || position >= variant.variantInfo.startIndexCorrected + alternativeAlleleInfo.info.length) {
referenceSequence.push({
position: position,
text: variant.reference[i].text
});
alternativeSequence.push({
position: position,
text: variant.reference[i].text
});
consensusSequence.push({
position: position,
text: variant.reference[i].text
});
consensusSequenceForReverseStrand.push({
position: position,
text: variant.reference[i].text
});
}
else
{
referenceSequence.push({
position: position,
text: variant.reference[i].text
});
alternativeSequence.push({
position: position,
text: alternativeAlleleInfo.info.sequence[position - variant.variantInfo.startIndexCorrected]
});
consensusSequence.push({
position: position,
text: alternativeAlleleInfo.info.sequence[position - variant.variantInfo.startIndexCorrected]
});
consensusSequenceForReverseStrand.push({
position: position,
text: alternativeAlleleInfo.info.sequence[position - variant.variantInfo.startIndexCorrected]
});
}
}
break;
}
}
const alternativeAminoacidsData = ShortVariantTransformer.getAminoacidSequences(consensusSequence, consensusSequenceForReverseStrand, alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts, false);
if (variant.variantInfo.type.toLowerCase() === 'del'){
for (let i = 0; i < alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts.length; i++) {
const affectedTranscript = alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts[i];
if (affectedTranscript.transcript !== null){
if (affectedTranscript.gene.value.strand.toLowerCase() === 'negative' && affectedTranscript.transcript.value.modifiedExons !== null && affectedTranscript.transcript.value.modifiedExons !== undefined) {
for (let j = 0; j < affectedTranscript.transcript.value.modifiedExons.length; j++) {
if (affectedTranscript.transcript.value.modifiedExons[j].start + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected) {
affectedTranscript.transcript.value.modifiedExons[j].start -= alternativeAlleleInfo.info.length;
}
if (affectedTranscript.transcript.value.modifiedExons[j].end + affectedTranscript.gene.value.startIndex < variant.variantInfo.startIndexCorrected) {
affectedTranscript.transcript.value.modifiedExons[j].end -= alternativeAlleleInfo.info.length;
}
}
}
else {
for (let j = 0; j < affectedTranscript.transcript.value.modifiedExons.length; j++) {
if (affectedTranscript.transcript.value.modifiedExons[j].start + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected) {
affectedTranscript.transcript.value.modifiedExons[j].start += alternativeAlleleInfo.info.length;
}
if (affectedTranscript.transcript.value.modifiedExons[j].end + affectedTranscript.gene.value.startIndex > variant.variantInfo.startIndexCorrected) {
affectedTranscript.transcript.value.modifiedExons[j].end += alternativeAlleleInfo.info.length;
}
}
}
}
}
for (let i = 0; i < alternativeAminoacidsData.length; i++){
const alternativeAminoacids = alternativeAminoacidsData[i].aminoacids;
const isNegativeStrand = alternativeAminoacidsData[i].negativeStrand;
for (let j = 0; j < alternativeAminoacids.length; j++){
if (isNegativeStrand){
if (alternativeAminoacids[j].endIndex <= variant.variantInfo.startIndexCorrected) {
alternativeAminoacids[j].endIndex -= alternativeAlleleInfo.info.length || 0;
}
if (alternativeAminoacids[j].startIndex <= variant.variantInfo.startIndexCorrected) {
alternativeAminoacids[j].startIndex -= alternativeAlleleInfo.info.length || 0;
}
}
else {
if (alternativeAminoacids[j].startIndex >= variant.variantInfo.startIndexCorrected) {
alternativeAminoacids[j].startIndex += alternativeAlleleInfo.info.length || 0;
}
if (alternativeAminoacids[j].endIndex >= variant.variantInfo.startIndexCorrected) {
alternativeAminoacids[j].endIndex += alternativeAlleleInfo.info.length || 0;
}
}
}
}
}
else if (variant.variantInfo.type.toLowerCase() === 'ins'){
for (let i = 0; i < alternativeAminoacidsData.length; i++){
const alternativeAminoacids = alternativeAminoacidsData[i].aminoacids;
const isNegativeStrand = alternativeAminoacidsData[i].negativeStrand;
for (let j = 0; j < alternativeAminoacids.length; j++){
if (isNegativeStrand){
alternativeAminoacids[j].endIndex += alternativeAlleleInfo.info.length || 0;
alternativeAminoacids[j].startIndex += alternativeAlleleInfo.info.length || 0;
}
}
}
for (let i = 0; i < alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts.length; i++) {
const affectedTranscript = alternativeAlleleInfo.affectedFeaturesStructure.affectedTranscripts[i];
if (affectedTranscript.transcript !== null){
if (affectedTranscript.gene.value.strand.toLowerCase() === 'negative' && affectedTranscript.transcript.value.modifiedExons !== null && affectedTranscript.transcript.value.modifiedExons !== undefined) {
for (let j = 0; j < affectedTranscript.transcript.value.modifiedExons.length; j++) {
affectedTranscript.transcript.value.modifiedExons[j].start += alternativeAlleleInfo.info.length;
affectedTranscript.transcript.value.modifiedExons[j].end += alternativeAlleleInfo.info.length;
}
}
}
}
}
for (let i = 0; i < alternativeAminoacidsData.length; i++){
const alternativeAminoacids = alternativeAminoacidsData[i].aminoacids;
if (referenceAminoacidsData.length > i){
const referenceAminoacids = referenceAminoacidsData[i].aminoacids;
let minModifiedPosition = null;
let maxModifiedPosition = null;
alternativeAminoacids.forEach(a => a.modified = false);
referenceAminoacids.forEach(a => a.modified = false);
for (let position = alternativeAminoacidsData[i].gene.startIndex; position < alternativeAminoacidsData[i].gene.endIndex; position++){
let altAminoacid = null;
let refAminoacid = null;
for (let altIndex = 0; altIndex < alternativeAminoacids.length; altIndex++){
if (alternativeAminoacids[altIndex].startIndex <= position && alternativeAminoacids[altIndex].endIndex >= position){
altAminoacid = alternativeAminoacids[altIndex];
break;
}
}
for (let refIndex = 0; refIndex < referenceAminoacids.length; refIndex++){
if (referenceAminoacids[refIndex].startIndex <= position && referenceAminoacids[refIndex].endIndex >= position){
refAminoacid = referenceAminoacids[refIndex];
break;
}
}
if (altAminoacid !== null && refAminoacid !== null){
if (altAminoacid.aminoacid !== refAminoacid.aminoacid) {
if (minModifiedPosition === null || minModifiedPosition > altAminoacid.startIndex) {
minModifiedPosition = altAminoacid.startIndex;
}
if (maxModifiedPosition === null || maxModifiedPosition < altAminoacid.endIndex) {
maxModifiedPosition = altAminoacid.endIndex;
}
altAminoacid.modified = true;
}
}
}
for (let position = minModifiedPosition; position <= maxModifiedPosition; position++){
for (let altIndex = 0; altIndex < alternativeAminoacids.length; altIndex++){
if (alternativeAminoacids[altIndex].startIndex <= position && alternativeAminoacids[altIndex].endIndex >= position){
alternativeAminoacids[altIndex].modified = true;
break;
}
}
}
}
}
return {
reference: referenceSequence,
alternative: alternativeSequence,
referenceAminoacidsData: referenceAminoacidsData,
alternativeAminoacidsData: alternativeAminoacidsData
};
}