1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
* 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);
}
|