Changeset 3200 for trunk/yat/utility/Aligner.cc
- Timestamp:
- May 3, 2014, 1:36:31 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/yat/utility/Aligner.cc
r3194 r3200 26 26 #include "Matrix.h" 27 27 28 29 // FIXME fix this so it works also --without-samtools 30 #include <yat/omic/config_bam.h> 31 #include YAT_BAM_HEADER 32 33 // FIXME we should include yat/omic/BamRead.h so we get #defines for 34 // e.g. bam_cigar_op also if not included in bam.h 35 28 36 #include <cassert> 29 37 #include <limits> 38 39 #include <iostream> // debug 30 40 31 41 namespace theplu { … … 118 128 119 129 130 const Aligner::Cigar Aligner::cigar(size_t row, size_t column) const 131 { 132 Cigar cig; 133 while (row || column) { 134 switch (alignment(row, column)) { 135 case(diagonal): 136 assert(row); 137 --row; 138 assert(column); 139 --column; 140 cig.push_front(BAM_CMATCH); 141 break; 142 case (right): 143 assert(column); 144 --column; 145 cig.push_front(BAM_CINS); 146 break; 147 case (down): 148 assert(row); 149 --row; 150 cig.push_front(BAM_CDEL); 151 break; 152 default: 153 return cig; 154 } 155 } 156 return cig; 157 } 158 159 120 160 Aligner::direction& Aligner::directions(size_t i, size_t j) 121 161 { … … 123 163 } 124 164 165 166 // ================ Cigar ======================= 167 168 void Aligner::Cigar::clear(void) 169 { 170 cigar_.clear(); 171 } 172 173 174 uint8_t Aligner::Cigar::op(size_t i) const 175 { 176 assert(i<cigar_.size()); 177 return bam_cigar_op(cigar_[i]); 178 } 179 180 181 char Aligner::Cigar::opchr(size_t i) const 182 { 183 assert(i<cigar_.size()); 184 return bam_cigar_opchr(cigar_[i]); 185 } 186 187 188 uint32_t Aligner::Cigar::oplen(size_t i) const 189 { 190 assert(i<cigar_.size()); 191 return bam_cigar_oplen(cigar_[i]); 192 } 193 194 195 void Aligner::Cigar::pop_back(uint32_t len) 196 { 197 while (len) { 198 assert(size()); 199 size_t i = size()-1; 200 if (len < oplen(i)) { 201 cigar_[i] -= (len<<BAM_CIGAR_SHIFT); 202 return; 203 } 204 else { 205 len -= oplen(i); 206 cigar_.pop_back(); 207 } 208 } 209 } 210 211 212 void Aligner::Cigar::pop_front(uint32_t len) 213 { 214 while (len) { 215 assert(size()); 216 if (len < oplen(0)) { 217 cigar_[0] -= (len<<BAM_CIGAR_SHIFT); 218 return; 219 } 220 else { 221 len -= oplen(0); 222 cigar_.pop_front(); 223 } 224 } 225 } 226 227 228 void Aligner::Cigar::push_back(uint8_t op, uint32_t len) 229 { 230 if (cigar_.empty() || this->op(size()-1)!=op) 231 cigar_.push_front(bam_cigar_gen(len, op)); 232 else 233 cigar_[size()-1] += (len<<BAM_CIGAR_SHIFT); 234 } 235 236 237 void Aligner::Cigar::push_front(uint8_t op, uint32_t len) 238 { 239 if (cigar_.empty() || this->op(0)!=op) 240 cigar_.push_front(bam_cigar_gen(len, op)); 241 else 242 cigar_[0] += (len<<BAM_CIGAR_SHIFT); 243 } 244 245 246 size_t Aligner::Cigar::size(void) const 247 { 248 return cigar_.size(); 249 } 250 251 252 uint32_t Aligner::Cigar::operator[](size_t i) const 253 { 254 assert(i<cigar_.size()); 255 return cigar_[i]; 256 } 257 258 259 std::ostream& operator<<(std::ostream& os, const Aligner::Cigar& cigar) 260 { 261 for (size_t i=0; i<cigar.size(); ++i) 262 os << cigar.oplen(i) << cigar.opchr(i); 263 return os; 264 } 265 125 266 }}} // of namespace utility, yat, and theplu
Note: See TracChangeset
for help on using the changeset viewer.