// Copyright (C) 2011-2012 CRS4. // // This file is part of Seal. // // Seal is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // Seal is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with Seal. If not, see <http://www.gnu.org/licenses/>. package it.crs4.seal.common; import java.util.List; /** * Abstract readable mapping that contains the data in a SAM record. * * This class provides interpretation of the SAM CIGAR string. It does not * enforce any kind of storage format or medium. */ public abstract class AbstractSamMapping extends AbstractTaggedMapping { //////////////////////////////////////////////// // variables //////////////////////////////////////////////// /** * Cache the alignment returned by getAlignment(). */ protected List<AlignOp> alignment; //////////////////////////////////////////////// // methods //////////////////////////////////////////////// /** * Get the entire text related to tag so it can be scanned. * For instance, given a SAM record with tags * ...XT:A:U NM:i:0 SM:i:37 AM:i:0 X0:i:1... * getTagText("NM") should return "NM:i:0" * while * getTagText("XX") should return null. * @return null if the tag isn't found. The tag's text otherwise. */ abstract protected String getTagText(String name); /** * Scan a SAM tag to produce an AbstractTaggedMapping.TagCacheItem. */ protected TagCacheItem makeTagItem(String name) throws NoSuchFieldException { String text = getTagText(name); if (text == null) throw new NoSuchFieldException("no tag with name " + name); String[] fields = text.split(":", 3); if (fields.length < 3) throw new FormatException("Invalid SAM tag syntax " + text); if (fields[1].length() != 1) throw new FormatException("Invalid SAM tag type syntax: " + text); return new TagCacheItem(TagDataType.fromSamType(fields[1].charAt(0)), fields[2]); } public List<AlignOp> getAlignment() throws IllegalStateException { if (isUnmapped()) throw new IllegalStateException(); // scan the CIGAR string and cache the results if (alignment == null) alignment = AlignOp.scanCigar(getCigarStr()); return alignment; } abstract public String getCigarStr() throws IllegalStateException; }