package org.nextprot.api.commons.bio.variation.prot.impl.format; import org.nextprot.api.commons.bio.variation.prot.ParsingMode; import org.nextprot.api.commons.bio.variation.prot.SequenceVariation; import org.nextprot.api.commons.bio.variation.prot.SequenceVariationBuilder; import org.nextprot.api.commons.bio.variation.prot.SequenceVariationFormat; import org.nextprot.api.commons.bio.variation.prot.impl.seqchange.format.*; import org.nextprot.api.commons.bio.variation.prot.impl.varseq.format.SequenceVariantHGVSFormatter; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChange; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChangeHGVSFormat; import java.text.ParseException; import java.util.Collection; import java.util.EnumMap; import java.util.Map; /** * Format and parse SequenceVariation as recommended by the Human Genome Variation Society * * @link http://www.hgvs.org/mutnomen/recs-prot.html#prot * * Created by fnikitin on 10/07/15. */ public class SequenceVariantHGVSFormat extends SequenceVariationFormat { private final SequenceVariantHGVSFormatter sequenceVariantFormatter; private final Map<SequenceChange.Type, SequenceChangeHGVSFormat> changeFormats; private final ParsingMode parsingMode; public SequenceVariantHGVSFormat() { this(ParsingMode.STRICT); } public SequenceVariantHGVSFormat(ParsingMode parsingMode) { this.parsingMode = parsingMode; sequenceVariantFormatter = new SequenceVariantHGVSFormatter(); changeFormats = new EnumMap<>(SequenceChange.Type.class); changeFormats.put(SequenceChange.Type.INSERTION, new InsertionHGVSFormat()); changeFormats.put(SequenceChange.Type.DUPLICATION, new DuplicationHGVSFormat()); changeFormats.put(SequenceChange.Type.SUBSTITUTION, new SubstitutionHGVSFormat()); changeFormats.put(SequenceChange.Type.DELETION, new DeletionHGVSFormat()); changeFormats.put(SequenceChange.Type.DELETION_INSERTION, new DeletionInsertionHGVSFormat()); changeFormats.put(SequenceChange.Type.FRAMESHIFT, new FrameshiftHGVSFormat()); changeFormats.put(SequenceChange.Type.EXTENSION_INIT, new ExtensionInitiationHGVSFormat()); changeFormats.put(SequenceChange.Type.EXTENSION_TERM, new ExtensionTerminationHGVSFormat()); } @Override protected String prefixFormatter() { // protein sequence variation return "p."; } @Override protected SequenceVariantHGVSFormatter getChangingSequenceFormatter() { return sequenceVariantFormatter; } @Override protected SequenceChangeHGVSFormat getSequenceChangeFormat(SequenceChange.Type changeType) { return changeFormats.get(changeType); } @Override protected Collection<SequenceChange.Type> getAvailableChangeTypes() { return changeFormats.keySet(); } @Override public SequenceVariation parse(String source, SequenceVariationBuilder.FluentBuilding builder) throws ParseException { for (SequenceChange.Type changeType : getAvailableChangeTypes()) { SequenceChangeHGVSFormat format = getSequenceChangeFormat(changeType); if (format.matchesWithMode(source, parsingMode)) return format.parseWithMode(source, builder, parsingMode); } throw new ParseException(source + ": not a valid protein sequence variant", 0); } }