package org.nextprot.api.commons.bio.variation.prot.impl;
import org.nextprot.api.commons.bio.AminoAcidCode;
import org.nextprot.api.commons.bio.variation.prot.SequenceVariation;
import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChange;
import org.nextprot.api.commons.bio.variation.prot.VariantSequenceBuilder;
import org.nextprot.api.commons.bio.variation.prot.varseq.VaryingSequence;
import java.util.Optional;
/**
* Operator used to build a sequence variant from an original sequence and SequenceVariation
*
* Created by fnikitin on 31.03.17.
*/
public enum VariantSequenceOperator implements VariantSequenceBuilder {
DELETION() {
@Override
public int selectBeginPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public int selectEndPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getLastAminoAcidPos();
}
@Override
public String getAminoAcidReplacementString(String originalSequence, SequenceVariation sequenceVariation) {
return "";
}
},
DUPLICATION() {
@Override
public int selectBeginPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getLastAminoAcidPos();
}
@Override
public int selectEndPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getLastAminoAcidPos();
}
@Override
public String getAminoAcidReplacementString(String originalSequence, SequenceVariation sequenceVariation) {
// p.Leu103_Met106dup
// .--.
// v v
// ...MLISM...
// ...MLISMLISM...
// [original=M, variant=MLISM]
return originalSequence.charAt(sequenceVariation.getVaryingSequence().getLastAminoAcidPos()-1)+
originalSequence.substring(sequenceVariation.getVaryingSequence().getFirstAminoAcidPos() - 1, sequenceVariation.getVaryingSequence().getLastAminoAcidPos());
}
},
SUBSTITUTION() {
@Override
public int selectBeginPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public int selectEndPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public String getAminoAcidReplacementString(String originalSequence, SequenceVariation sequenceVariation) {
return AminoAcidCode.formatAminoAcidCode(AminoAcidCode.CodeType.ONE_LETTER, ((SequenceChange<AminoAcidCode>)sequenceVariation.getSequenceChange())
.getValue());
}
},
INSERTION() {
@Override
public int selectBeginPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public int selectEndPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public String getAminoAcidReplacementString(String originalSequence, SequenceVariation sequenceVariation) {
return AminoAcidCode.formatAminoAcidCode(AminoAcidCode.CodeType.ONE_LETTER, sequenceVariation.getVaryingSequence().getFirstAminoAcid()) +
AminoAcidCode.formatAminoAcidCode(AminoAcidCode.CodeType.ONE_LETTER, ((SequenceChange<AminoAcidCode[]>) sequenceVariation.getSequenceChange()).getValue());
}
},
DELETION_INSERTION() {
@Override
public int selectBeginPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getFirstAminoAcidPos();
}
@Override
public int selectEndPositionInReferenceSequence(VaryingSequence varyingSequence) {
return varyingSequence.getLastAminoAcidPos();
}
@Override
public String getAminoAcidReplacementString(String originalSequence, SequenceVariation sequenceVariation) {
return AminoAcidCode.formatAminoAcidCode(AminoAcidCode.CodeType.ONE_LETTER, ((SequenceChange<AminoAcidCode[]>)sequenceVariation.getSequenceChange())
.getValue());
}
}
;
public static Optional<VariantSequenceOperator> findOperator(SequenceChange sequenceChange) {
SequenceChange.Type sequenceType = sequenceChange.getType();
switch (sequenceType) {
case DELETION:
return Optional.of(DELETION);
case DUPLICATION:
return Optional.of(DUPLICATION);
case INSERTION:
return Optional.of(INSERTION);
case SUBSTITUTION:
return Optional.of(SUBSTITUTION);
case DELETION_INSERTION:
return Optional.of(DELETION_INSERTION);
}
return Optional.empty();
}
}
/**
* Some examples:
*
* VARIATION TYPE \ OPERATIONS (on reference sequence) OFFSET
* ---------------------------------------------------------------------------------------------------------------------
* Duplication : CEBPA-p.Arg306_Lys313dup | 1) select K313 2) replace by K RNVETQQK | last:last
* Delins : BRCA1-p.Lys503_Pro508delinsLysLeuPro | 1) select K503RKRRP508 2) replace by KLP | first:last
* Del : APC-p.Val2843del | 1) select V2843 2) replace by "" (or delete) | first:last
* Subst : WT1-iso1-p.Gly201Asp | 1) select Gly201 2) replace by Asp | first:first
* Ins : CEBPA-p.Gln311_Gln312insLeu | 1) select Q311 2) replace by GlnLeu | first:first
* Ext term : SDHD-p.*160Leuext*3 | NA (missing genomic sequence) | NA
* Frameshift : APC-p.Ser673Phefs*10 | NA (missing genomic sequence) | NA
*/