CigarRoller.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <stdio.h>
00019 #include <stdlib.h>
00020 #include "CigarRoller.h"
00021
00022
00023
00024
00025
00026
00027
00028 CigarRoller & CigarRoller::operator += (CigarRoller &rhs)
00029 {
00030 std::vector<CigarOperator>::iterator i;
00031 for (i = rhs.cigarOperations.begin(); i != rhs.cigarOperations.end(); i++)
00032 {
00033 (*this) += *i;
00034 }
00035 return *this;
00036 }
00037
00038
00039
00040
00041
00042 CigarRoller & CigarRoller::operator += (const CigarOperator &rhs)
00043 {
00044
00045
00046 clearQueryAndReferenceIndexes();
00047
00048 if (rhs.count==0)
00049 {
00050
00051 }
00052 else if (cigarOperations.empty() || cigarOperations.back() != rhs)
00053 {
00054 cigarOperations.push_back(rhs);
00055 }
00056 else
00057 {
00058
00059 cigarOperations.back().count += rhs.count;
00060 }
00061 return *this;
00062 }
00063
00064
00065 CigarRoller & CigarRoller::operator = (CigarRoller &rhs)
00066 {
00067 clear();
00068
00069 (*this) += rhs;
00070
00071 return *this;
00072 }
00073
00074
00075
00076 void CigarRoller::Add(Operation operation, int count)
00077 {
00078 CigarOperator rhs(operation, count);
00079 (*this) += rhs;
00080 }
00081
00082
00083 void CigarRoller::Add(char operation, int count)
00084 {
00085 switch (operation)
00086 {
00087 case 0:
00088 case 'M':
00089 Add(match, count);
00090 break;
00091 case 1:
00092 case 'I':
00093 Add(insert, count);
00094 break;
00095 case 2:
00096 case 'D':
00097 Add(del, count);
00098 break;
00099 case 3:
00100 case 'N':
00101 Add(skip, count);
00102 break;
00103 case 4:
00104 case 'S':
00105 Add(softClip, count);
00106 break;
00107 case 5:
00108 case 'H':
00109 Add(hardClip, count);
00110 break;
00111 case 6:
00112 case 'P':
00113 Add(pad, count);
00114 break;
00115 default:
00116
00117 std::cerr << "ERROR parsing CIGAR - invalid character";
00118 break;
00119 }
00120 }
00121
00122
00123 void CigarRoller::Add(const char *cigarString)
00124 {
00125 int operationCount = 0;
00126 while (*cigarString)
00127 {
00128 if (isdigit(*cigarString))
00129 {
00130 char *endPtr;
00131 operationCount = strtol((char *) cigarString, &endPtr, 10);
00132 cigarString = endPtr;
00133 }
00134 else
00135 {
00136 Add(*cigarString, operationCount);
00137 cigarString++;
00138 }
00139 }
00140 }
00141
00142
00143 void CigarRoller::Set(const char *cigarString)
00144 {
00145 clear();
00146 Add(cigarString);
00147 }
00148
00149
00150 void CigarRoller::Set(const uint32_t* cigarBuffer, uint16_t bufferLen)
00151 {
00152 clear();
00153
00154
00155 for (int i = 0; i < bufferLen; i++)
00156 {
00157 int opLen = cigarBuffer[i] >> 4;
00158
00159 Add(cigarBuffer[i] & 0xF, opLen);
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 int CigarRoller::getMatchPositionOffset()
00184 {
00185 int offset = 0;
00186 std::vector<CigarOperator>::iterator i;
00187
00188 for (i = cigarOperations.begin(); i != cigarOperations.end(); i++)
00189 {
00190 switch (i->operation)
00191 {
00192 case insert:
00193 offset += i->count;
00194 break;
00195 case del:
00196 offset -= i->count;
00197 break;
00198
00199 default:
00200 break;
00201 }
00202 }
00203 return offset;
00204 }
00205
00206
00207
00208
00209
00210
00211 const char * CigarRoller::getString()
00212 {
00213
00214
00215
00216
00217 static char *ret = NULL;
00218 static unsigned int retSize = 0;
00219
00220 if (ret == NULL)
00221 {
00222 retSize = cigarOperations.size() * 12 + 1;
00223 ret = (char*) malloc(sizeof(char) * retSize);
00224 assert(ret != NULL);
00225
00226 }
00227 else
00228 {
00229
00230 if (retSize > cigarOperations.size() * 12 + 1)
00231 {
00232 }
00233 else
00234 {
00235 retSize = cigarOperations.size() * 12 + 1;
00236 free(ret);
00237 ret = (char*) malloc(sizeof(char) * retSize);
00238 }
00239 assert(ret != NULL);
00240 }
00241
00242 char *ptr = ret;
00243 char buf[12];
00244
00245 std::vector<CigarOperator>::iterator i;
00246
00247
00248
00249
00250 *ptr = '\0';
00251 for (i = cigarOperations.begin(); i != cigarOperations.end(); i++)
00252 {
00253 sprintf(buf, "%d%c", (*i).count, (*i).getChar());
00254 strcat(ptr, buf);
00255 while (*ptr)
00256 {
00257 ptr++;
00258 }
00259 }
00260 return ret;
00261 }
00262
00263
00264 void CigarRoller::clear()
00265 {
00266
00267
00268 clearQueryAndReferenceIndexes();
00269 cigarOperations.clear();
00270 }