Permalink
Browse files

many changes to bring bowtie batch parsing more in line with bowtie2.…

… passes simple tests but bugs likely remain and colorspace support has been re-added only for -c mode.
  • Loading branch information...
1 parent ab04acb commit f2f6e8d319d3109e3b8747c910ea876f8c995138 @BenLangmead committed Oct 19, 2016
Showing with 1,916 additions and 2,960 deletions.
  1. +35 −41 aligner.h
  2. +25 −54 ebwt_search.cpp
  3. +2 −2 ebwt_search_backtrack.h
  4. +6 −3 hit.h
  5. +1,127 −178 pat.cpp
  6. +717 −2,678 pat.h
  7. +1 −1 range_cache.h
  8. +3 −3 range_source.h
View
@@ -72,9 +72,9 @@ class Aligner {
// Current read pair
PatternSourcePerThread* patsrc_;
- ReadBuf* bufa_;
+ Read* bufa_;
uint32_t alen_;
- ReadBuf* bufb_;
+ Read* bufb_;
uint32_t blen_;
bool rangeMode_;
RandomSource rand_;
@@ -155,24 +155,21 @@ class MultiAligner {
* try to hide all the latency.
*/
void run() {
- bool done = false;
- while(!done) {
- done = true;
+ bool saw_last_read = false;
+ while(!saw_last_read) {
for(uint32_t i = 0; i < n_; i++) {
if(!(*aligners_)[i]->done) {
// Advance an aligner already in progress
- done = false;
(*aligners_)[i]->advance();
} else {
+ if(saw_last_read) {
+ break;
+ }
// Get a new read and initialize an aligner with it
- (*patsrcs_)[i]->nextReadPair();
- if(!(*patsrcs_)[i]->empty() && (*patsrcs_)[i]->patid() < qUpto_) {
+ pair<bool, bool> ret = (*patsrcs_)[i]->nextReadPair();
+ saw_last_read = ret.second;
+ if(ret.first && (*patsrcs_)[i]->rdid() < qUpto_) {
(*aligners_)[i]->setQuery((*patsrcs_)[i]);
- assert(!(*aligners_)[i]->done);
- done = false;
- } else {
- // No more reads; if done == true, it remains
- // true
}
}
}
@@ -253,12 +250,12 @@ class MixedMultiAligner {
msg = ss.str();
Timer timer(std::cout, msg.c_str());
#endif
- bool done = false;
bool first = true;
+ bool saw_last_read = false;
if(n_ == 1) {
Aligner *al = seOrPe_[0] ? (*alignersSE_)[0] : (*alignersPE_)[0];
PatternSourcePerThread *ps = (*patsrcs_)[0];
- while(!done) {
+ while(true) {
#ifdef PER_THREAD_TIMING
int cpu = 0, node = 0;
get_cpu_and_node(cpu, node);
@@ -271,16 +268,18 @@ class MixedMultiAligner {
current_node = node;
}
#endif
- done = true;
if(!first && !al->done) {
// Advance an aligner already in progress; this is
// the common case
- done = false;
al->advance();
} else {
+ if(saw_last_read) {
+ break;
+ }
// Get a new read
- ps->nextReadPair();
- if(ps->patid() < qUpto_ && !ps->empty()) {
+ pair<bool, bool> ret = ps->nextReadPair();
+ saw_last_read = ret.second;
+ if(ps->rdid() < qUpto_ && ret.first) {
if(ps->paired()) {
// Read currently in buffer is paired-end
(*alignersPE_)[0]->setQuery(ps);
@@ -292,16 +291,12 @@ class MixedMultiAligner {
al = (*alignersSE_)[0];
seOrPe_[0] = true; // true = unpaired
}
- done = false;
- } else {
- // No more reads; if done == true, it remains
- // true
}
}
first = false;
}
} else {
- while(!done) {
+ while(true) {
#ifdef PER_THREAD_TIMING
int cpu = 0, node = 0;
get_cpu_and_node(cpu, node);
@@ -314,21 +309,24 @@ class MixedMultiAligner {
current_node = node;
}
#endif
- done = true;
+ bool saw_last_read = false;
for(uint32_t i = 0; i < n_; i++) {
Aligner *al = seOrPe_[i] ? (*alignersSE_)[i] :
(*alignersPE_)[i];
if(!first && !al->done) {
// Advance an aligner already in progress; this is
// the common case
- done = false;
al->advance();
} else {
+ if(saw_last_read) {
+ break;
+ }
// Feed a new read to a vacant aligner
PatternSourcePerThread *ps = (*patsrcs_)[i];
// Get a new read
- ps->nextReadPair();
- if(ps->patid() < qUpto_ && !ps->empty()) {
+ pair<bool, bool> ret = ps->nextReadPair();
+ saw_last_read = ret.second;
+ if(ps->rdid() < qUpto_ && ret.first) {
if(ps->paired()) {
// Read currently in buffer is paired-end
(*alignersPE_)[i]->setQuery(ps);
@@ -338,10 +336,6 @@ class MixedMultiAligner {
(*alignersSE_)[i]->setQuery(ps);
seOrPe_[i] = true; // true = unpaired
}
- done = false;
- } else {
- // No more reads; if done == true, it remains
- // true
}
}
}
@@ -433,7 +427,7 @@ class UnpairedAlignerV2 : public Aligner {
if(metrics_ != NULL) {
metrics_->nextRead(patsrc->bufa().patFw);
}
- pool_->reset(&patsrc->bufa().name, patsrc->patid());
+ pool_->reset(&patsrc->bufa().name, (uint32_t)patsrc->rdid());
if(patsrc->bufa().length() < 4) {
if(!quiet_) {
cerr << "Warning: Skipping read " << patsrc->bufa().name
@@ -496,7 +490,7 @@ class UnpairedAlignerV2 : public Aligner {
ra.stratum, // alignment stratum
ra.cost, // cost, including qual penalty
ra.bot - ra.top - 1, // # other hits
- patsrc_->patid(), // pattern id
+ (uint32_t)patsrc_->rdid(),// pattern id
bufa_->seed, // pseudo-random seed
0); // mate (0 = unpaired)
}
@@ -745,7 +739,7 @@ class PairedBWAlignerV1 : public Aligner {
assert(!patsrc->bufb().empty());
// Give all of the drivers pointers to the relevant read info
patsrc_ = patsrc;
- pool_->reset(&patsrc->bufa().name, patsrc->patid());
+ pool_->reset(&patsrc->bufa().name, (uint32_t)patsrc->rdid());
if(patsrc->bufa().length() < 4 || patsrc->bufb().length() < 4) {
if(!quiet_) {
cerr << "Warning: Skipping pair " << patsrc->bufa().name
@@ -875,8 +869,8 @@ class PairedBWAlignerV1 : public Aligner {
TIndexOffU spreadL = rL.bot - rL.top;
TIndexOffU spreadR = rR.bot - rR.top;
TIndexOffU oms = min(spreadL, spreadR) - 1;
- ReadBuf* bufL = pairFw ? bufa_ : bufb_;
- ReadBuf* bufR = pairFw ? bufb_ : bufa_;
+ Read* bufL = pairFw ? bufa_ : bufb_;
+ Read* bufR = pairFw ? bufb_ : bufa_;
TIndexOffU lenL = pairFw ? alen_ : blen_;
TIndexOffU lenR = pairFw ? blen_ : alen_;
bool ret;
@@ -1598,7 +1592,7 @@ class PairedBWAlignerV2 : public Aligner {
assert(!patsrc->bufb().empty());
// Give all of the drivers pointers to the relevant read info
patsrc_ = patsrc;
- pool_->reset(&patsrc->bufa().name, patsrc->patid());
+ pool_->reset(&patsrc->bufa().name, (uint32_t)patsrc->rdid());
if(patsrc->bufa().length() < 4 || patsrc->bufb().length() < 4) {
if(!quiet_) {
cerr << "Warning: Skipping pair " << patsrc->bufa().name
@@ -1754,8 +1748,8 @@ class PairedBWAlignerV2 : public Aligner {
TIndexOffU spreadL = rL.bot - rL.top;
TIndexOffU spreadR = rR.bot - rR.top;
TIndexOffU oms = min(spreadL, spreadR) - 1;
- ReadBuf* bufL = pairFw ? bufa_ : bufb_;
- ReadBuf* bufR = pairFw ? bufb_ : bufa_;
+ Read* bufL = pairFw ? bufa_ : bufb_;
+ Read* bufR = pairFw ? bufb_ : bufa_;
TIndexOffU lenL = pairFw ? alen_ : blen_;
TIndexOffU lenR = pairFw ? blen_ : alen_;
bool ret;
@@ -1840,7 +1834,7 @@ class PairedBWAlignerV2 : public Aligner {
EbwtSearchParams<String<Dna> >*params = (r.mate1 ? paramsSe1_ : paramsSe2_);
assert(!(r.mate1 ? doneSe1_ : doneSe2_));
params->setFw(r.fw);
- ReadBuf* buf = r.mate1 ? bufa_ : bufb_;
+ Read* buf = r.mate1 ? bufa_ : bufb_;
bool ebwtFw = r.ebwt->fw();
uint32_t len = r.mate1 ? alen_ : blen_;
assert_eq(buf->color, color);
Oops, something went wrong.

0 comments on commit f2f6e8d

Please sign in to comment.