package org.nextprot.api.commons.bio.variation.prot.impl.seqchange.format; import org.nextprot.api.commons.bio.AminoAcidCode; 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.impl.seqchange.ExtensionInitiation; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChangeHGVSFormat; import java.text.ParseException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Specifications: http://varnomen.hgvs.org/recommendations/protein/variant/extension/ */ public class ExtensionInitiationHGVSFormat implements SequenceChangeHGVSFormat<ExtensionInitiation> { private static final Pattern PATTERN = Pattern.compile("^p\\.M(?:et)?1((?:[A-Z])(?:[a-z]{2})?)?ext(-\\d+)$"); @Override public SequenceVariation parseWithMode(String source, SequenceVariationBuilder.FluentBuilding builder, ParsingMode mode) throws ParseException { Matcher m = PATTERN.matcher(source); if (m.matches()) { AminoAcidCode newAminoAcid = AminoAcidCode.METHIONINE; if (m.group(1) != null) { newAminoAcid = AminoAcidCode.parseAminoAcidCode(m.group(1)); } int newUpstreamPos = Integer.parseInt(m.group(2)); return builder.selectAminoAcid(AminoAcidCode.METHIONINE, 1).thenInitiationExtension(newUpstreamPos, newAminoAcid).build(); } return null; } @Override public boolean matchesWithMode(String source, ParsingMode mode) { return source.matches(PATTERN.pattern()); } @Override public void format(StringBuilder sb, ExtensionInitiation change, AminoAcidCode.CodeType type) { if (change.getValue() != AminoAcidCode.METHIONINE) { sb.append(AminoAcidCode.formatAminoAcidCode(type, change.getValue())); } sb.append("ext").append(change.getNewPos()); } }