libStatGen Software 1
SamRecordHelper.cpp
1/*
2 * Copyright (C) 2012 Regents of the University of Michigan
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "SamRecordHelper.h"
19#include <stdexcept>
20
21int SamRecordHelper::checkSequence(SamRecord& record, int32_t pos0Based,
22 const char* sequence)
23{
24 const char* readSeq = record.getSequence();
25
26 // Get the cigar.
27 Cigar* cigar = record.getCigarInfo();
28
29 if(cigar == NULL)
30 {
31 throw std::runtime_error("Failed to get Cigar.");
32 }
33
34 int32_t readStartIndex =
35 cigar->getQueryIndex(pos0Based, record.get0BasedPosition());
36
37 // if the read start is negative, this position was deleted, so
38 // return false, it doesn't match.
39 if(readStartIndex == Cigar::INDEX_NA)
40 {
41 return(false);
42 }
43
44 // Increment the readSeq start to where this position is found.
45 readSeq += readStartIndex;
46 if(strncmp(readSeq, sequence, strlen(sequence)) == 0)
47 {
48 // Match, so return the readStartIndex (cycle).
49 return(readStartIndex);
50 }
51 // Did not match.
52 return(-1);
53}
54
55
57 String& returnString,
58 char delim)
59{
60 char tag[3];
61 char vtype;
62 void* value;
63
64 // Reset the tag iterator to ensure that all the tags are written.
65 record.resetTagIter();
66
67 // While there are more tags, write them to the recordString.
68 bool firstEntry = true;
69 bool returnStatus = true;
70 while(record.getNextSamTag(tag, vtype, &value) != false)
71 {
72 if(!firstEntry)
73 {
74 returnString += delim;
75 }
76 else
77 {
78 firstEntry = false;
79 }
80 returnStatus &= genSamTagString(tag, vtype, value, returnString);
81 }
82 return(returnStatus);
83}
84
85
86bool SamRecordHelper::genSamTagString(const char* tag, char vtype,
87 void* value, String& returnString)
88{
89 returnString += tag;
90 returnString += ":";
91 returnString += vtype;
92 returnString += ":";
94 {
95 returnString += (int)*(int*)value;
96 }
97 else if(SamRecord::isFloatType(vtype))
98 {
99 returnString.appendFullFloat(*(float*)value);
100 }
101 else if(SamRecord::isCharType(vtype))
102 {
103 returnString += (char)*(char*)value;
104 }
105 else if(SamRecord::isStringType(vtype))
106 {
107 // String type.
108 returnString += (String)*(String*)value;
109 }
110 else
111 {
112 // Could not determine the type.
113 return(false);
114 }
115 return(true);
116}
This class represents the CIGAR without any methods to set the cigar (see CigarRoller for that).
Definition: Cigar.h:84
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
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
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.
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.
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...
Class providing an easy to use interface to get/set/operate on the fields in a SAM/BAM record.
Definition: SamRecord.h:52
static bool isIntegerType(char vtype)
Returns whether or not the specified vtype is an integer type.
Definition: SamRecord.cpp:2040
Cigar * getCigarInfo()
Returns a pointer to the Cigar object associated with this record.
Definition: SamRecord.cpp:1836
static bool isFloatType(char vtype)
Returns whether or not the specified vtype is a float type.
Definition: SamRecord.cpp:2052
static bool isCharType(char vtype)
Returns whether or not the specified vtype is a char type.
Definition: SamRecord.cpp:2062
bool getNextSamTag(char *tag, char &vtype, void **value)
Get the next tag from the record.
Definition: SamRecord.cpp:1962
int32_t get0BasedPosition()
Get the 0-based(BAM) leftmost position of the record.
Definition: SamRecord.cpp:1319
void resetTagIter()
Reset the tag iterator to the beginning of the tags.
Definition: SamRecord.cpp:2034
const char * getSequence()
Returns the SAM formatted sequence string (SEQ), translating the base as specified by setSequenceTran...
Definition: SamRecord.cpp:1568
static bool isStringType(char vtype)
Returns whether or not the specified vtype is a string type.
Definition: SamRecord.cpp:2072