1 #ifndef theplu_yat_omic_pileup 2 #define theplu_yat_omic_pileup 27 #include "yat/utility/CigarIterator.h" 28 #include "yat/utility/yat_assert.h" 30 #include <boost/iterator/iterator_traits.hpp> 31 #include <boost/iterator/iterator_concepts.hpp> 32 #include <boost/concept/assert.hpp> 56 template<
typename Iterator>
83 YAT_ASSERT(bam_.get());
90 uint8_t
cigar_op(
void)
const {
return *cigar_; }
98 YAT_ASSERT(bam_.get());
99 YAT_ASSERT(cigar_.
base() >= bam_->cigar());
100 return bam_cigar_oplen(*cigar_.
base());
107 unsigned short qual(
void)
const 109 YAT_ASSERT(bam_.get());
110 YAT_ASSERT(qpos_ < bam_->sequence_length());
111 return bam_->qual(qpos_);
133 return cigar_type()==2;
139 size_t qpos(
void)
const {
return qpos_; }
141 std::shared_ptr<BamRead> bam_;
147 uint8_t cigar_type(
void)
const {
return bam_cigar_type(
cigar_op()); }
165 typedef typename std::list<Entry>::const_reverse_iterator
179 Pileup(Iterator first, Iterator last);
199 bool good(
void)
const {
return !(bam_ == bam_end_ && data_.empty()); }
219 size_t size(
void)
const;
243 int32_t
tid(
void)
const {
return tid_; }
251 int32_t
pos(
void)
const {
return pos_; }
259 typedef typename std::list<Entry>::iterator iterator;
265 std::list<Entry> data_;
275 template<
typename Iterator>
283 template<
typename Iterator>
285 : bam_(first), bam_end_(last), pos_(0), tid_(0), skip_ref_(0)
287 BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Iterator>));
288 BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Iterator>));
289 using boost::Convertible;
290 typedef typename boost::iterator_value<Iterator>::type value_type;
291 BOOST_CONCEPT_ASSERT((Convertible<value_type, BamRead>));
296 template<
typename Iterator>
299 return data_.begin();
303 template<
typename Iterator>
307 return data_.rbegin();
311 template<
typename Iterator>
318 template<
typename Iterator>
326 template<
typename Iterator>
329 if (!data_.empty()) {
332 for (iterator it = data_.begin(); it!=data_.end(); ++it) {
333 if (it->cigar_type() == 1) {
343 typename std::list<Entry>::iterator read = data_.begin();
344 while (read != data_.end()) {
346 if (read->bam().end() <= pos_) {
352 if (read->cigar_op() == BAM_CINS) {
353 skip_ref_ =
std::max(skip_ref_, read->cigar_oplen());
360 for (iterator iter=data_.begin(); iter!=data_.end(); ++iter)
361 iter->skip_ = skip_ref_;
370 tid_ = bam_->core().tid;
371 pos_ = bam_->core().pos;
375 while (bam_!=bam_end_ && bam_->core().tid==tid_ && bam_->pos()<=pos_) {
377 if (!(bam_->core().flag & BAM_FUNMAP)) {
378 data_.push_back(
Entry(*bam_));
385 template<
typename Iterator>
392 template<
typename Iterator>
399 template<
typename Iterator>
401 : bam_(new
BamRead(b)), qpos_(0), cigar_(bam_->cigar()), skip_(0)
403 YAT_ASSERT(cigar_.
base() == bam_->cigar());
404 if (bam_->core().n_cigar==0)
407 while (qpos_ < bam_->sequence_length() && cigar_type() != 3) {
409 YAT_ASSERT(cigar_type()!=2);
410 if (cigar_type() == 1)
417 template<
typename Iterator>
420 YAT_ASSERT(cigar_.base() >= bam_->cigar());
421 if (cigar_type() & 1)
424 YAT_ASSERT(cigar_.base() >= bam_->cigar());
428 template<
typename Iterator>
432 if (cigar_type() & 1)
433 return bam_->sequence(qpos_);
436 if (cigar_op()!=BAM_CINS)
438 return bam_->sequence(qpos_);
size_t size(void) const
Definition: Pileup.h:393
bool skip_ref(void) const
Definition: Pileup.h:386
uint8_t cigar_op(void) const
Definition: Pileup.h:90
bool is_del(void) const
Definition: Pileup.h:131
const_reverse_iterator rbegin(void) const
Definition: Pileup.h:305
The Department of Theoretical Physics namespace as we define it.
std::list< Entry >::const_iterator const_iterator
Definition: Pileup.h:156
void increment(void)
step to next position.
Definition: Pileup.h:327
const_reverse_iterator rend(void) const
Definition: Pileup.h:320
Class holding a bam query.
Definition: BamRead.h:51
Pileup< Iterator > make_pileup(Iterator first, Iterator last)
Definition: Pileup.h:276
T max(const T &a, const T &b, const T &c)
Definition: stl_utility.h:699
size_t qpos(void) const
Definition: Pileup.h:139
unsigned short qual(void) const
Definition: Pileup.h:107
Iterator over a CIGAR.
Definition: CigarIterator.h:60
Entry(void)
default constructor
Definition: Pileup.h:70
int32_t tid(void) const
Definition: Pileup.h:243
BASE base(void) const
Definition: CigarIterator.h:119
uint8_t sequence(void) const
Definition: Pileup.h:429
int32_t pos(void) const
Definition: Pileup.h:251
bool good(void) const
Definition: Pileup.h:199
void increment(void)
Definition: Pileup.h:418
std::list< Entry >::const_reverse_iterator const_reverse_iterator
Definition: Pileup.h:166
uint32_t cigar_oplen(void) const
Definition: Pileup.h:96
const BamRead & bam(void) const
Definition: Pileup.h:81
const_iterator begin(void) const
Definition: Pileup.h:297
const_iterator end(void) const
Definition: Pileup.h:312
Pileup(void)
Definition: Pileup.h:171