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.DeletionAndInsertion; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChangeHGVSFormat; import org.nextprot.api.commons.utils.StringUtils; import java.text.ParseException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DeletionInsertionHGVSFormat implements SequenceChangeHGVSFormat<DeletionAndInsertion> { private static final Pattern PATTERN = Pattern.compile("^p\\.([A-Z])([a-z]{2})?(\\d+)(?:_([A-Z])([a-z]{2})?(\\d+))?delins((?:[A-Z\\*]([a-z]{2})?)+)$"); private static final Pattern PATTERN_PERMISSIVE = Pattern.compile("^p\\.([A-Z])([a-z]{2})?(\\d+)(?:_([A-Z])([a-z]{2})?(\\d+))?(?:delins|>)((?:[A-Z\\*]([a-z]{2})?)+)$"); @Override public SequenceVariation parseWithMode(String source, SequenceVariationBuilder.FluentBuilding builder, ParsingMode mode) throws ParseException { Matcher m = (mode == ParsingMode.STRICT) ? PATTERN.matcher(source) : PATTERN_PERMISSIVE.matcher(source); if (m.matches()) { AminoAcidCode affectedAAFirst = AminoAcidCode.parseAminoAcidCode(StringUtils.concat(m.group(1), m.group(2))); int affectedAAPosFirst = Integer.parseInt(m.group(3)); AminoAcidCode[] insertedAAs = AminoAcidCode.valueOfAminoAcidCodeSequence(m.group(7)); if (m.group(4) == null) { return builder.selectAminoAcid(affectedAAFirst, affectedAAPosFirst) .thenDeleteAndInsert(insertedAAs).build(); } AminoAcidCode affectedAALast = AminoAcidCode.parseAminoAcidCode(StringUtils.concat(m.group(4), m.group(5))); int affectedAAPosLast = Integer.parseInt(m.group(6)); return builder.selectAminoAcidRange(affectedAAFirst, affectedAAPosFirst, affectedAALast, affectedAAPosLast) .thenDeleteAndInsert(insertedAAs).build(); } return null; } @Override public boolean matchesWithMode(String source, ParsingMode mode) { return (mode == ParsingMode.STRICT) ? source.matches(PATTERN.pattern()) : source.matches(PATTERN_PERMISSIVE.pattern()); } @Override public void format(StringBuilder sb, DeletionAndInsertion change, AminoAcidCode.CodeType type) { sb.append("delins").append(AminoAcidCode.formatAminoAcidCode(type, change.getValue())); } }