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 
21 int 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 
86 bool SamRecordHelper::genSamTagString(const char* tag, char vtype,
87  void* value, String& returnString)
88 {
89  returnString += tag;
90  returnString += ":";
91  returnString += vtype;
92  returnString += ":";
93  if(SamRecord::isIntegerType(vtype))
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 }
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