/* * The MIT License * * Copyright (c) 2009 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package htsjdk.samtools; /** * The operators that can appear in a cigar string, and information about their disk representations. */ public enum CigarOperator { /** Match or mismatch */ M(true, true, 'M'), /** Insertion vs. the reference. */ I(true, false, 'I'), /** Deletion vs. the reference. */ D(false, true, 'D'), /** Skipped region from the reference. */ N(false, true, 'N'), /** Soft clip. */ S(true, false, 'S'), /** Hard clip. */ H(false, false, 'H'), /** Padding. */ P(false, false, 'P'), /** Matches the reference. */ EQ(true, true, '='), /** Mismatches the reference. */ X(true, true, 'X') ; // Representation of CigarOperator in BAM file private static final byte OP_M = 0; private static final byte OP_I = 1; private static final byte OP_D = 2; private static final byte OP_N = 3; private static final byte OP_S = 4; private static final byte OP_H = 5; private static final byte OP_P = 6; private static final byte OP_EQ = 7; private static final byte OP_X = 8; private final boolean consumesReadBases; private final boolean consumesReferenceBases; private final byte character; private final String string; // Readable synonyms of the above enums public static final CigarOperator MATCH_OR_MISMATCH = M; public static final CigarOperator INSERTION = I; public static final CigarOperator DELETION = D; public static final CigarOperator SKIPPED_REGION = N; public static final CigarOperator SOFT_CLIP = S; public static final CigarOperator HARD_CLIP = H; public static final CigarOperator PADDING = P; /** Default constructor. */ CigarOperator(boolean consumesReadBases, boolean consumesReferenceBases, char character) { this.consumesReadBases = consumesReadBases; this.consumesReferenceBases = consumesReferenceBases; this.character = (byte) character; this.string = new String(new char[] {character}).intern(); } /** If true, represents that this cigar operator "consumes" bases from the read bases. */ public boolean consumesReadBases() { return consumesReadBases; } /** If true, represents that this cigar operator "consumes" bases from the reference sequence. */ public boolean consumesReferenceBases() { return consumesReferenceBases; } /** * @param b CIGAR operator in character form as appears in a text CIGAR string * @return CigarOperator enum value corresponding to the given character. */ public static CigarOperator characterToEnum(final int b) { switch (b) { case 'M': return M; case 'I': return I; case 'D': return D; case 'N': return N; case 'S': return S; case 'H': return H; case 'P': return P; case '=': return EQ; case 'X': return X; default: throw new IllegalArgumentException("Unrecognized CigarOperator: " + b); } } /** * @param i CIGAR operator in binary form as appears in a BAMRecord. * @return CigarOperator enum value corresponding to the given int value. */ public static CigarOperator binaryToEnum(final int i) { switch(i) { case OP_M: return M; case OP_I: return I; case OP_D: return D; case OP_N: return N; case OP_S: return S; case OP_H: return H; case OP_P: return P; case OP_EQ: return EQ; case OP_X: return X; default: throw new IllegalArgumentException("Unrecognized CigarOperator: " + i); } } /** * * @param e CigarOperator enum value. * @return CIGAR operator corresponding to the enum value in binary form as appears in a BAMRecord. */ public static int enumToBinary(final CigarOperator e) { switch(e) { case M: return OP_M; case I: return OP_I; case D: return OP_D; case N: return OP_N; case S: return OP_S; case H: return OP_H; case P: return OP_P; case EQ: return OP_EQ; case X: return OP_X; default: throw new IllegalArgumentException("Unrecognized CigarOperator: " + e); } } /** Returns the character that should be used within a SAM file. */ public static byte enumToCharacter(final CigarOperator e) { return e.character; } /** Returns the cigar operator as it would be seen in a SAM file. */ @Override public String toString() { return this.string; } }