SamRecordHelper.cpp
/*
* Copyright (C) 2012 Regents of the University of Michigan
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "SamRecordHelper.h"
#include <stdexcept>
int SamRecordHelper::checkSequence(SamRecord& record, int32_t pos0Based,
const char* sequence)
{
const char* readSeq = record.getSequence();
// Get the cigar.
Cigar* cigar = record.getCigarInfo();
if(cigar == NULL)
{
throw std::runtime_error("Failed to get Cigar.");
}
int32_t readStartIndex =
cigar->getQueryIndex(pos0Based, record.get0BasedPosition());
// if the read start is negative, this position was deleted, so
// return false, it doesn't match.
if(readStartIndex == Cigar::INDEX_NA)
{
return(false);
}
// Increment the readSeq start to where this position is found.
readSeq += readStartIndex;
if(strncmp(readSeq, sequence, strlen(sequence)) == 0)
{
// Match, so return the readStartIndex (cycle).
return(readStartIndex);
}
// Did not match.
return(-1);
}
bool SamRecordHelper::genSamTagsString(SamRecord& record,
String& returnString,
char delim)
{
char tag[3];
char vtype;
void* value;
// Reset the tag iterator to ensure that all the tags are written.
record.resetTagIter();
// While there are more tags, write them to the recordString.
bool firstEntry = true;
bool returnStatus = true;
while(record.getNextSamTag(tag, vtype, &value) != false)
{
if(!firstEntry)
{
returnString += delim;
}
else
{
firstEntry = false;
}
returnStatus &= genSamTagString(tag, vtype, value, returnString);
}
return(returnStatus);
}
bool SamRecordHelper::genSamTagString(const char* tag, char vtype,
void* value, String& returnString)
{
returnString += tag;
returnString += ":";
returnString += vtype;
returnString += ":";
if(SamRecord::isIntegerType(vtype))
{
returnString += (int)*(int*)value;
}
else if(SamRecord::isFloatType(vtype))
{
returnString.appendFullFloat(*(float*)value);
}
else if(SamRecord::isCharType(vtype))
{
returnString += (char)*(char*)value;
}
else if(SamRecord::isStringType(vtype))
{
// String type.
returnString += (String)*(String*)value;
}
else
{
// Could not determine the type.
return(false);
}
return(true);
}
Cigar
This class represents the CIGAR without any methods to set the cigar (see CigarRoller for that).
Definition: Cigar.h:83
SamRecord::get0BasedPosition
int32_t get0BasedPosition()
Get the 0-based(BAM) leftmost position of the record.
Definition: SamRecord.cpp:1307
String
Definition: StringBasics.h:38
SamRecord::isCharType
static bool isCharType(char vtype)
Returns whether or not the specified vtype is a char type.
Definition: SamRecord.cpp:2050
SamRecord::isStringType
static bool isStringType(char vtype)
Returns whether or not the specified vtype is a string type.
Definition: SamRecord.cpp:2060
SamRecordHelper::checkSequence
static int checkSequence(SamRecord &record, int32_t pos0Based, const char *sequence)
Helper method that checks if the record's read sequence starting at the specified 0-based reference p...
Definition: SamRecordHelper.cpp:21
Cigar::INDEX_NA
static const int32_t INDEX_NA
Value associated with an index that is not applicable/does not exist, used for converting between que...
Definition: Cigar.h:492
SamRecordHelper::genSamTagString
static bool genSamTagString(const char *tag, char vtype, void *value, String &returnString)
Helper to append the SAM string representation of the specified tag to the specified string.
Definition: SamRecordHelper.cpp:86
SamRecord::resetTagIter
void resetTagIter()
Reset the tag iterator to the beginning of the tags.
Definition: SamRecord.cpp:2022
SamRecord::getSequence
const char * getSequence()
Returns the SAM formatted sequence string (SEQ), translating the base as specified by setSequenceTran...
Definition: SamRecord.cpp:1556
SamRecord::isIntegerType
static bool isIntegerType(char vtype)
Returns whether or not the specified vtype is an integer type.
Definition: SamRecord.cpp:2028
Cigar::getQueryIndex
int32_t getQueryIndex(int32_t refOffset)
Return the query index associated with the specified reference offset or INDEX_NA based on this cigar...
Definition: Cigar.cpp:202
SamRecord
Class providing an easy to use interface to get/set/operate on the fields in a SAM/BAM record.
Definition: SamRecord.h:51
SamRecord::getCigarInfo
Cigar * getCigarInfo()
Returns a pointer to the Cigar object associated with this record.
Definition: SamRecord.cpp:1824
SamRecord::isFloatType
static bool isFloatType(char vtype)
Returns whether or not the specified vtype is a float type.
Definition: SamRecord.cpp:2040
SamRecordHelper::genSamTagsString
static bool genSamTagsString(SamRecord &record, String &returnString, char delim='\t')
Helper to append the SAM string representation of all the tags to the specified string.
Definition: SamRecordHelper.cpp:56
SamRecord::getNextSamTag
bool getNextSamTag(char *tag, char &vtype, void **value)
Get the next tag from the record.
Definition: SamRecord.cpp:1950