5 #ifndef ALIGNER_SEED_MM_H_
6 #define ALIGNER_SEED_MM_H_
12 #include "row_chaser.h"
13 #include "range_chaser.h"
14 #include "aligner_metrics.h"
17 * Concrete factory class for constructing unpaired exact aligners.
19 class UnpairedSeedAlignerFactory : public AlignerFactory {
21 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
22 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
23 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
26 UnpairedSeedAlignerFactory(
27 Ebwt<String<Dna> >& ebwtFw,
28 Ebwt<String<Dna> >* ebwtBw,
36 const HitSinkPerThreadFactory& sinkPtFactory,
41 BitPairReference* refs,
42 vector<String<Dna5> >& os,
50 AlignerMetrics *metrics) :
53 doFw_(doFw), doRc_(doRc),
56 qualCutoff_(qualCutoff),
59 sinkPtFactory_(sinkPtFactory),
62 cacheLimit_(cacheLimit),
66 strandFix_(strandFix),
67 maqPenalty_(maqPenalty),
68 qualOrder_(qualOrder),
69 rangeMode_(rangeMode),
74 assert(ebwtFw.isInMemory());
78 * Create a new UnpairedExactAlignerV1s.
80 virtual Aligner* create() const {
81 HitSinkPerThread* sinkPt = sinkPtFactory_.create();
82 EbwtSearchParams<String<Dna> >* params =
83 new EbwtSearchParams<String<Dna> >(*sinkPt, os_);
84 int *btCnt = new int[1];
87 TRangeSrcDrPtrVec *drVec = new TRangeSrcDrPtrVec();
89 const int halfAndHalf = 0;
91 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
92 ebwtBw_, true, qualCutoff_, true, verbose_, quiet_,
93 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
94 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
95 &ebwtFw_, false, qualCutoff_, true, verbose_, quiet_,
96 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
97 EbwtRangeSourceDriver * driverFw = new EbwtRangeSourceDriver(
98 *params, rFw_Bw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
100 true, // nudgeLeft (not applicable)
101 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
102 PIN_TO_SEED_EDGE, // "
103 PIN_TO_SEED_EDGE, // "
104 PIN_TO_SEED_EDGE, // "
105 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
106 EbwtRangeSourceDriver * driverRc = new EbwtRangeSourceDriver(
107 *params, rRc_Fw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
109 true, // nudgeLeft (not applicable)
110 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
111 PIN_TO_SEED_EDGE, // "
112 PIN_TO_SEED_EDGE, // "
113 PIN_TO_SEED_EDGE, // "
114 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
115 if(doFw_) drVec->push_back(driverFw);
116 if(doRc_) drVec->push_back(driverRc);
118 } else if(seedMms_ == 1) {
119 const int halfAndHalf = 0;
123 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
124 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
125 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
126 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
127 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
128 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
129 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
130 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
131 halfAndHalf, true, maqPenalty_, qualOrder_, metrics_);
133 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
134 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_,
135 sink_, sinkPt, seedLen_,
141 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
142 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
143 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_,
144 sink_, sinkPt, seedLen_,
150 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
151 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
152 *params, rFw_FwSeedGen, fw, true, maqPenalty_,
153 qualOrder_, sink_, sinkPt, seedLen_,
159 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
160 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
161 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
165 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
166 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
167 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
168 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
169 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
170 halfAndHalf, false, maqPenalty_, qualOrder_, metrics_);
171 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
172 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
173 halfAndHalf, true, maqPenalty_, qualOrder_, metrics_);
175 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
176 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
183 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
184 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
185 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
192 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
193 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
194 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
201 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
202 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
203 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, true);
206 drVec->push_back(drFw_Bw);
207 drVec->push_back(drFw_Seed);
210 drVec->push_back(drRc_Fw);
211 drVec->push_back(drRc_Seed);
213 } else if(seedMms_ == 2) {
218 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
219 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_, metrics_);
220 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
221 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_, metrics_);
222 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
223 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_, metrics_);
224 EbwtRangeSource *rFw_BwHalf = new EbwtRangeSource(
225 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_, metrics_);
227 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
228 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
235 os_, verbose_, quiet_, mate1, pool_, btCnt);
236 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
237 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
244 os_, verbose_, quiet_, mate1, pool_, btCnt);
245 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
246 *params, rFw_FwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
253 os_, verbose_, quiet_, mate1, pool_, btCnt);
254 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
255 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
256 EbwtRangeSourceDriver * drFw_BwHalf = new EbwtRangeSourceDriver(
257 *params, rFw_BwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
260 PIN_TO_BEGINNING, // nothing's unrevisitable
264 os_, verbose_, quiet_, mate1, pool_, btCnt);
268 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
269 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_, metrics_);
270 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
271 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_, metrics_);
272 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
273 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_, metrics_);
274 EbwtRangeSource *rRc_FwHalf = new EbwtRangeSource(
275 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_, metrics_);
277 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
278 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
281 PIN_TO_HI_HALF_EDGE, // no mismatches in hi half
283 PIN_TO_SEED_EDGE, // up to 2 in lo half
285 os_, verbose_, quiet_, mate1, pool_, btCnt);
286 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
287 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
294 os_, verbose_, quiet_, mate1, pool_, btCnt);
295 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
296 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
299 PIN_TO_HI_HALF_EDGE, // no mismatches in lo half
301 PIN_TO_SEED_EDGE, // up to 2 in hi half
303 os_, verbose_, quiet_, mate1, pool_, btCnt);
304 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
305 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, true);
306 EbwtRangeSourceDriver * drRc_FwHalf = new EbwtRangeSourceDriver(
307 *params, rRc_FwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
310 PIN_TO_BEGINNING, // nothing's unrevisitable
314 os_, verbose_, quiet_, mate1, pool_, btCnt);
317 drVec->push_back(drFw_Bw);
318 drVec->push_back(drFw_Seed);
319 drVec->push_back(drFw_BwHalf);
322 drVec->push_back(drRc_Fw);
323 drVec->push_back(drRc_Seed);
324 drVec->push_back(drRc_FwHalf);
326 } else if(seedMms_ > 2) {
331 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
332 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
333 0, false, maqPenalty_, qualOrder_, metrics_);
335 // Partial and full aligners for alignments with 0
336 // mismatches in the lo-half and up to 3 mismatches in the
338 EbwtRangeSourceFactory *rFw_BwSeed03 = new EbwtRangeSourceFactory(
339 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
340 0, false, maqPenalty_, qualOrder_, metrics_);
341 EbwtRangeSource *rFw_FwSeedGen03 = new EbwtRangeSource(
342 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
343 0, true, maqPenalty_, qualOrder_, metrics_);
345 // Partial and full aligners for alignments with 1
346 // mismatch in the lo-half and up to 2 mismatches in the
348 EbwtRangeSourceFactory *rFw_BwSeed12 = new EbwtRangeSourceFactory(
349 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
350 0, false, maqPenalty_, qualOrder_, metrics_);
351 // Note: the following is half-and-half (unlike the 03 version)
352 EbwtRangeSource *rFw_FwSeedGen12 = new EbwtRangeSource(
353 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
354 3, true, maqPenalty_, qualOrder_, metrics_);
356 EbwtRangeSource *rFw_BwHalf12 = new EbwtRangeSource(
357 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
358 2, false, maqPenalty_, qualOrder_, metrics_);
360 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
361 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_,
362 sink_, sinkPt, seedLen_,
364 PIN_TO_HI_HALF_EDGE, // 0 mismatches in hi-half
367 PIN_TO_SEED_EDGE, // up to 3 mismatches in lo-half
368 os_, verbose_, quiet_, mate1, pool_, btCnt);
370 EbwtRangeSourceDriverFactory * drFw_BwSeed03 = new EbwtRangeSourceDriverFactory(
371 *params, rFw_BwSeed03, fw, false, maqPenalty_, qualOrder_,
372 sink_, sinkPt, seedLen_,
378 os_, verbose_, quiet_, mate1, pool_, btCnt);
379 EbwtRangeSourceDriver * drFw_FwSeedGen03 = new EbwtRangeSourceDriver(
380 *params, rFw_FwSeedGen03, fw, true, maqPenalty_, qualOrder_,
381 sink_, sinkPt, seedLen_,
387 os_, verbose_, quiet_, mate1, pool_, btCnt);
388 EbwtSeededRangeSourceDriver * drFw_Seed03 = new EbwtSeededRangeSourceDriver(
389 drFw_BwSeed03, drFw_FwSeedGen03, fw, seedLen_, verbose_, quiet_, mate1);
391 EbwtRangeSourceDriverFactory * drFw_BwSeed12 = new EbwtRangeSourceDriverFactory(
392 *params, rFw_BwSeed12, fw, false, maqPenalty_, qualOrder_,
393 sink_, sinkPt, seedLen_,
399 os_, verbose_, quiet_, mate1, pool_, btCnt);
400 EbwtRangeSourceDriver * drFw_FwSeedGen12 = new EbwtRangeSourceDriver(
401 *params, rFw_FwSeedGen12, fw, true, maqPenalty_, qualOrder_,
402 sink_, sinkPt, seedLen_,
405 PIN_TO_HI_HALF_EDGE, // 1-mismatch in lo-half
407 PIN_TO_SEED_EDGE, // 1 or 2 mismatches in hi-half
408 os_, verbose_, quiet_, mate1, pool_, btCnt);
409 EbwtSeededRangeSourceDriver * drFw_Seed12 = new EbwtSeededRangeSourceDriver(
410 drFw_BwSeed12, drFw_FwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
412 EbwtRangeSourceDriver * drFw_BwHalf12 = new EbwtRangeSourceDriver(
413 *params, rFw_BwHalf12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
416 PIN_TO_BEGINNING, // nothing's unrevisitable
420 os_, verbose_, quiet_, mate1, pool_, btCnt);
424 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
425 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
426 0, false, maqPenalty_, qualOrder_, metrics_);
428 // Partial and full aligners for alignments with 0
429 // mismatches in the lo-half and up to 3 mismatches in the
431 EbwtRangeSourceFactory *rRc_FwSeed03 = new EbwtRangeSourceFactory(
432 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
433 0, false, maqPenalty_, qualOrder_, metrics_);
434 EbwtRangeSource *rRc_BwSeedGen03 = new EbwtRangeSource(
435 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
436 0, true, maqPenalty_, qualOrder_, metrics_);
438 // Partial and full aligners for alignments with 1
439 // mismatch in the lo-half and up to 2 mismatches in the
441 EbwtRangeSourceFactory *rRc_FwSeed12 = new EbwtRangeSourceFactory(
442 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
443 0, false, maqPenalty_, qualOrder_, metrics_);
444 EbwtRangeSource *rRc_BwSeedGen12 = new EbwtRangeSource(
445 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
446 3, true, maqPenalty_, qualOrder_, metrics_);
448 EbwtRangeSource *rRc_FwHalf12 = new EbwtRangeSource(
449 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
450 2, false, maqPenalty_, qualOrder_, metrics_);
452 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
453 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
460 os_, verbose_, quiet_, mate1, pool_, btCnt);
462 EbwtRangeSourceDriverFactory * drRc_FwSeed03 = new EbwtRangeSourceDriverFactory(
463 *params, rRc_FwSeed03, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
470 os_, verbose_, quiet_, mate1, pool_, btCnt);
471 EbwtRangeSourceDriver * drRc_BwSeedGen03 = new EbwtRangeSourceDriver(
472 *params, rRc_BwSeedGen03, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
479 os_, verbose_, quiet_, mate1, pool_, btCnt);
480 EbwtSeededRangeSourceDriver * drRc_Seed03 = new EbwtSeededRangeSourceDriver(
481 drRc_FwSeed03, drRc_BwSeedGen03, fw, seedLen_, verbose_, quiet_, mate1);
483 EbwtRangeSourceDriverFactory * drRc_FwSeed12 = new EbwtRangeSourceDriverFactory(
484 *params, rRc_FwSeed12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
491 os_, verbose_, quiet_, mate1, pool_, btCnt);
492 EbwtRangeSourceDriver * drRc_BwSeedGen12 = new EbwtRangeSourceDriver(
493 *params, rRc_BwSeedGen12, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
500 os_, verbose_, quiet_, mate1, pool_, btCnt);
501 EbwtSeededRangeSourceDriver * drRc_Seed12 = new EbwtSeededRangeSourceDriver(
502 drRc_FwSeed12, drRc_BwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
504 EbwtRangeSourceDriver * drRc_FwHalf12 = new EbwtRangeSourceDriver(
505 *params, rRc_FwHalf12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
508 PIN_TO_BEGINNING, // nothing's unrevisitable
512 os_, verbose_, quiet_, mate1, pool_, btCnt);
515 drVec->push_back(drFw_Bw);
516 drVec->push_back(drFw_Seed03);
517 drVec->push_back(drFw_Seed12);
518 drVec->push_back(drFw_BwHalf12);
521 drVec->push_back(drRc_Fw);
522 drVec->push_back(drRc_Seed03);
523 drVec->push_back(drRc_Seed12);
524 drVec->push_back(drRc_FwHalf12);
527 cerr << "Unsupported --stateful mode: " << seedMms_ << endl;
529 TCostAwareRangeSrcDr* dr = new TCostAwareRangeSrcDr(strandFix_, drVec, verbose_, quiet_, false);
532 // Set up a RangeChaser
533 RangeChaser<String<Dna> > *rchase =
534 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_, metrics_);
536 return new UnpairedAlignerV2<EbwtRangeSource>(
538 sink_, sinkPtFactory_, sinkPt, os_, refs_,
539 rangeMode_, verbose_, quiet_, maxBts_, pool_, btCnt,
544 Ebwt<String<Dna> >& ebwtFw_;
545 Ebwt<String<Dna> >* ebwtBw_;
548 const uint32_t seedMms_;
549 const uint32_t seedLen_;
550 const int qualCutoff_;
553 const HitSinkPerThreadFactory& sinkPtFactory_;
554 RangeCache *cacheFw_;
555 RangeCache *cacheBw_;
556 const uint32_t cacheLimit_;
558 BitPairReference* refs_;
559 vector<String<Dna5> >& os_;
566 AlignerMetrics *metrics_;
570 * Concrete factory class for constructing unpaired exact aligners.
572 class PairedSeedAlignerFactory : public AlignerFactory {
573 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
574 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
575 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
577 PairedSeedAlignerFactory(
578 Ebwt<String<Dna> >& ebwtFw,
579 Ebwt<String<Dna> >* ebwtBw,
589 const HitSinkPerThreadFactory& sinkPtFactory,
596 uint32_t mixedThresh,
597 uint32_t mixedAttemptLim,
602 BitPairReference* refs,
603 vector<String<Dna5> >& os,
620 qualCutoff_(qualCutoff),
623 sinkPtFactory_(sinkPtFactory),
628 dontReconcile_(dontReconcile),
630 mixedThresh_(mixedThresh),
631 mixedAttemptLim_(mixedAttemptLim),
634 cacheLimit_(cacheLimit),
636 refs_(refs), os_(os),
638 maqPenalty_(maqPenalty),
639 qualOrder_(qualOrder),
640 strandFix_(strandFix),
641 rangeMode_(rangeMode),
645 assert(ebwtFw.isInMemory());
646 assert(ebwtBw->isInMemory());
650 * Create a new UnpairedExactAlignerV1s.
652 virtual Aligner* create() const {
653 HitSinkPerThread* sinkPt = sinkPtFactory_.createMult(2);
654 HitSinkPerThread* sinkPtSe1 = NULL, * sinkPtSe2 = NULL;
655 EbwtSearchParams<String<Dna> >* params =
656 new EbwtSearchParams<String<Dna> >(*sinkPt, os_);
657 EbwtSearchParams<String<Dna> >* paramsSe1 = NULL, * paramsSe2 = NULL;
659 sinkPtSe1 = sinkPtFactory_.create();
660 sinkPtSe2 = sinkPtFactory_.create();
662 new EbwtSearchParams<String<Dna> >(*sinkPtSe1, os_);
664 new EbwtSearchParams<String<Dna> >(*sinkPtSe2, os_);
666 RefAligner<String<Dna5> >* refAligner = NULL;
667 int *btCnt = new int[1];
670 refAligner = new Seed0RefAligner<String<Dna5> >(color_, verbose_, quiet_, seedLen_, qualCutoff_, maqPenalty_);
671 } else if(seedMms_ == 1) {
672 refAligner = new Seed1RefAligner<String<Dna5> >(color_, verbose_, quiet_, seedLen_, qualCutoff_, maqPenalty_);
673 } else if(seedMms_ == 2) {
674 refAligner = new Seed2RefAligner<String<Dna5> >(color_, verbose_, quiet_, seedLen_, qualCutoff_, maqPenalty_);
676 refAligner = new Seed3RefAligner<String<Dna5> >(color_, verbose_, quiet_, seedLen_, qualCutoff_, maqPenalty_);
683 if(mate1fw_) do1Fw = false;
685 if(mate2fw_) do2Fw = false;
689 if(mate1fw_) do1Rc = false;
691 if(mate2fw_) do2Rc = false;
694 TRangeSrcDrPtrVec *dr1FwVec = new TRangeSrcDrPtrVec();
695 TRangeSrcDrPtrVec *dr1RcVec;
696 TRangeSrcDrPtrVec *dr2FwVec;
697 TRangeSrcDrPtrVec *dr2RcVec;
699 dr1RcVec = new TRangeSrcDrPtrVec();
700 dr2FwVec = new TRangeSrcDrPtrVec();
701 dr2RcVec = new TRangeSrcDrPtrVec();
708 const int halfAndHalf = 0;
712 EbwtRangeSource *r1Fw_Bw = new EbwtRangeSource(
713 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
714 halfAndHalf, false, maqPenalty_, qualOrder_);
715 EbwtRangeSourceDriver *dr1Fw_Bw = new EbwtRangeSourceDriver(
716 *params, r1Fw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
718 true, // nudgeLeft (not applicable)
719 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
720 PIN_TO_SEED_EDGE, // "
721 PIN_TO_SEED_EDGE, // "
722 PIN_TO_SEED_EDGE, // "
723 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
724 dr1FwVec->push_back(dr1Fw_Bw);
729 EbwtRangeSource *r2Fw_Bw = new EbwtRangeSource(
730 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, halfAndHalf,
731 false, maqPenalty_, qualOrder_);
732 EbwtRangeSourceDriver *dr2Fw_Bw = new EbwtRangeSourceDriver(
733 *params, r2Fw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
735 true, // nudgeLeft (not applicable)
736 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
737 PIN_TO_SEED_EDGE, // "
738 PIN_TO_SEED_EDGE, // "
739 PIN_TO_SEED_EDGE, // "
740 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
741 dr2FwVec->push_back(dr2Fw_Bw);
746 EbwtRangeSource *r1Rc_Fw = new EbwtRangeSource(
747 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
748 halfAndHalf, false, maqPenalty_, qualOrder_);
749 EbwtRangeSourceDriver *dr1Rc_Fw = new EbwtRangeSourceDriver(
750 *params, r1Rc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
752 true, // nudgeLeft (not applicable)
753 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
754 PIN_TO_SEED_EDGE, // "
755 PIN_TO_SEED_EDGE, // "
756 PIN_TO_SEED_EDGE, // "
757 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
758 dr1RcVec->push_back(dr1Rc_Fw);
763 EbwtRangeSource *r2Rc_Fw = new EbwtRangeSource(
764 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
765 halfAndHalf, false, maqPenalty_, qualOrder_);
766 EbwtRangeSourceDriver *dr2Rc_Fw = new EbwtRangeSourceDriver(
767 *params, r2Rc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
769 true, // nudgeLeft (not applicable)
770 PIN_TO_SEED_EDGE, // whole alignment is unrevisitable
771 PIN_TO_SEED_EDGE, // "
772 PIN_TO_SEED_EDGE, // "
773 PIN_TO_SEED_EDGE, // "
774 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
775 dr2RcVec->push_back(dr2Rc_Fw);
777 } else if(seedMms_ == 1) {
778 const int halfAndHalf = 0;
782 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
783 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
784 halfAndHalf, false, maqPenalty_, qualOrder_);
785 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
786 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
787 halfAndHalf, false, maqPenalty_, qualOrder_);
788 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
789 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
790 halfAndHalf, true, maqPenalty_, qualOrder_);
791 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
792 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
799 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
800 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
801 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
808 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
809 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
810 *params, rFw_FwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
817 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
818 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
819 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
820 dr1FwVec->push_back(drFw_Bw);
821 dr1FwVec->push_back(drFw_Seed);
826 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
827 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
828 halfAndHalf, false, maqPenalty_, qualOrder_);
829 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
830 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_,
831 halfAndHalf, false, maqPenalty_, qualOrder_);
832 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
833 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_,
834 halfAndHalf, true, maqPenalty_, qualOrder_);
835 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
836 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
843 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
844 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
845 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
852 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
853 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
854 *params, rFw_FwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
861 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
862 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
863 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
864 dr2FwVec->push_back(drFw_Bw);
865 dr2FwVec->push_back(drFw_Seed);
870 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
871 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
872 halfAndHalf, false, maqPenalty_, qualOrder_);
873 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
874 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
875 halfAndHalf, false, maqPenalty_, qualOrder_);
876 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
877 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
878 halfAndHalf, true, maqPenalty_, qualOrder_);
879 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
880 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
887 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
888 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
889 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
896 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
897 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
898 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
905 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
906 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
907 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
908 dr1RcVec->push_back(drRc_Fw);
909 dr1RcVec->push_back(drRc_Seed);
914 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
915 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
916 halfAndHalf, false, maqPenalty_, qualOrder_);
917 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
918 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_,
919 halfAndHalf, false, maqPenalty_, qualOrder_);
920 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
921 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_,
922 halfAndHalf, true, maqPenalty_, qualOrder_);
923 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
924 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
931 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
932 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
933 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
940 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
941 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
942 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
949 os_, verbose_, quiet_, mate1, pool_, NULL); // no backtrack limit for -n 1/2
950 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
951 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
952 dr2RcVec->push_back(drRc_Fw);
953 dr2RcVec->push_back(drRc_Seed);
955 } else if(seedMms_ > 1) {
956 bool two = seedMms_ == 2;
960 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
961 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
962 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
963 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
964 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
965 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_);
966 EbwtRangeSource *rFw_BwHalf = new EbwtRangeSource(
967 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_);
968 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
969 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
974 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
976 os_, verbose_, quiet_, mate1, pool_, btCnt);
977 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
978 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
985 os_, verbose_, quiet_, mate1, pool_, btCnt);
986 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
987 *params, rFw_FwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
992 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
994 os_, verbose_, quiet_, mate1, pool_, btCnt);
995 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
996 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
997 EbwtRangeSourceDriverFactory * drFw_BwSeed12 = NULL;
999 EbwtRangeSourceFactory *rFw_BwSeed12 = new EbwtRangeSourceFactory(
1000 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1001 drFw_BwSeed12 = new EbwtRangeSourceDriverFactory(
1002 *params, rFw_BwSeed12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1003 seedLen_, // seedLen
1009 os_, verbose_, quiet_, mate1, pool_, btCnt);
1011 EbwtRangeSourceDriver * drFw_FwSeedGen12 = NULL;
1013 EbwtRangeSource *rFw_FwSeedGen12 = new EbwtRangeSource(
1014 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 3, true, maqPenalty_, qualOrder_);
1015 drFw_FwSeedGen12 = new EbwtRangeSourceDriver(
1016 *params, rFw_FwSeedGen12, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1017 seedLen_, // seedLen
1020 PIN_TO_HI_HALF_EDGE,
1021 PIN_TO_HI_HALF_EDGE,
1023 os_, verbose_, quiet_, mate1, pool_, btCnt);
1025 EbwtSeededRangeSourceDriver * drFw_Seed12 = NULL;
1027 drFw_Seed12 = new EbwtSeededRangeSourceDriver(
1028 drFw_BwSeed12, drFw_FwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
1030 EbwtRangeSourceDriver * drFw_BwHalf = new EbwtRangeSourceDriver(
1031 *params, rFw_BwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1032 seedLen_, // seedLen
1034 PIN_TO_BEGINNING, // nothing's unrevisitable
1035 PIN_TO_HI_HALF_EDGE,
1036 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1038 os_, verbose_, quiet_, mate1, pool_, btCnt);
1039 dr1FwVec->push_back(drFw_Bw);
1040 dr1FwVec->push_back(drFw_Seed);
1041 if(drFw_Seed12 != NULL) {
1042 dr1FwVec->push_back(drFw_Seed12);
1044 dr1FwVec->push_back(drFw_BwHalf);
1049 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
1050 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1051 EbwtRangeSourceFactory *rFw_BwSeed = new EbwtRangeSourceFactory(
1052 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1053 EbwtRangeSource *rFw_FwSeedGen = new EbwtRangeSource(
1054 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_);
1055 EbwtRangeSource *rFw_BwHalf = new EbwtRangeSource(
1056 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_);
1058 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
1059 *params, rFw_Bw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1060 seedLen_, // seedLen
1062 PIN_TO_HI_HALF_EDGE,
1063 PIN_TO_HI_HALF_EDGE,
1064 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1066 os_, verbose_, quiet_, mate1, pool_, btCnt);
1067 EbwtRangeSourceDriverFactory * drFw_BwSeed = new EbwtRangeSourceDriverFactory(
1068 *params, rFw_BwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1069 seedLen_, // seedLen
1075 os_, verbose_, quiet_, mate1, pool_, btCnt);
1076 EbwtRangeSourceDriver * drFw_FwSeedGen = new EbwtRangeSourceDriver(
1077 *params, rFw_FwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1078 seedLen_, // seedLen
1080 PIN_TO_HI_HALF_EDGE,
1081 PIN_TO_HI_HALF_EDGE,
1082 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1084 os_, verbose_, quiet_, mate1, pool_, btCnt);
1085 EbwtSeededRangeSourceDriver * drFw_Seed = new EbwtSeededRangeSourceDriver(
1086 drFw_BwSeed, drFw_FwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
1087 EbwtRangeSourceDriverFactory * drFw_BwSeed12 = NULL;
1089 EbwtRangeSourceFactory *rFw_BwSeed12 = new EbwtRangeSourceFactory(
1090 ebwtBw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1091 drFw_BwSeed12 = new EbwtRangeSourceDriverFactory(
1092 *params, rFw_BwSeed12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1093 seedLen_, // seedLen
1099 os_, verbose_, quiet_, mate1, pool_, btCnt);
1101 EbwtRangeSourceDriver * drFw_FwSeedGen12 = NULL;
1103 EbwtRangeSource *rFw_FwSeedGen12 = new EbwtRangeSource(
1104 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 3, true, maqPenalty_, qualOrder_);
1105 drFw_FwSeedGen12 = new EbwtRangeSourceDriver(
1106 *params, rFw_FwSeedGen12, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1107 seedLen_, // seedLen
1110 PIN_TO_HI_HALF_EDGE,
1111 PIN_TO_HI_HALF_EDGE,
1113 os_, verbose_, quiet_, mate1, pool_, btCnt);
1115 EbwtSeededRangeSourceDriver * drFw_Seed12 = NULL;
1117 drFw_Seed12 = new EbwtSeededRangeSourceDriver(
1118 drFw_BwSeed12, drFw_FwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
1120 EbwtRangeSourceDriver * drFw_BwHalf = new EbwtRangeSourceDriver(
1121 *params, rFw_BwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1122 seedLen_, // seedLen
1124 PIN_TO_BEGINNING, // nothing's unrevisitable
1125 PIN_TO_HI_HALF_EDGE,
1126 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1128 os_, verbose_, quiet_, mate1, pool_, btCnt);
1129 dr2FwVec->push_back(drFw_Bw);
1130 dr2FwVec->push_back(drFw_Seed);
1131 if(drFw_Seed12 != NULL) {
1132 dr2FwVec->push_back(drFw_Seed12);
1134 dr2FwVec->push_back(drFw_BwHalf);
1139 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
1140 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1141 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
1142 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1143 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
1144 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_);
1145 EbwtRangeSource *rRc_FwHalf = new EbwtRangeSource(
1146 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_);
1148 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
1149 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1150 seedLen_, // seedLen
1152 PIN_TO_HI_HALF_EDGE,
1153 PIN_TO_HI_HALF_EDGE,
1154 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1156 os_, verbose_, quiet_, mate1, pool_, btCnt);
1157 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
1158 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1159 seedLen_, // seedLen
1165 os_, verbose_, quiet_, mate1, pool_, btCnt);
1166 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
1167 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1168 seedLen_, // seedLen
1170 PIN_TO_HI_HALF_EDGE,
1171 PIN_TO_HI_HALF_EDGE,
1172 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1174 os_, verbose_, quiet_, mate1, pool_, btCnt);
1175 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
1176 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
1177 EbwtRangeSourceDriverFactory * drRc_FwSeed12 = NULL;
1179 EbwtRangeSourceFactory *rRc_FwSeed12 = new EbwtRangeSourceFactory(
1180 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1181 drRc_FwSeed12 = new EbwtRangeSourceDriverFactory(
1182 *params, rRc_FwSeed12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1183 seedLen_, // seedLen
1189 os_, verbose_, quiet_, mate1, pool_, btCnt);
1191 EbwtRangeSourceDriver * drRc_BwSeedGen12 = NULL;
1193 EbwtRangeSource *rRc_BwSeedGen12 = new EbwtRangeSource(
1194 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 3, true, maqPenalty_, qualOrder_);
1195 drRc_BwSeedGen12 = new EbwtRangeSourceDriver(
1196 *params, rRc_BwSeedGen12, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1197 seedLen_, // seedLen
1200 PIN_TO_HI_HALF_EDGE,
1201 PIN_TO_HI_HALF_EDGE,
1203 os_, verbose_, quiet_, mate1, pool_, btCnt);
1205 EbwtSeededRangeSourceDriver * drRc_Seed12 = NULL;
1207 drRc_Seed12 = new EbwtSeededRangeSourceDriver(
1208 drRc_FwSeed12, drRc_BwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
1210 EbwtRangeSourceDriver * drRc_FwHalf = new EbwtRangeSourceDriver(
1211 *params, rRc_FwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1212 seedLen_, // seedLen
1214 PIN_TO_BEGINNING, // nothing's unrevisitable
1215 PIN_TO_HI_HALF_EDGE,
1216 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1218 os_, verbose_, quiet_, mate1, pool_, btCnt);
1219 dr1RcVec->push_back(drRc_Fw);
1220 dr1RcVec->push_back(drRc_Seed);
1221 if(drRc_Seed12 != NULL) {
1222 dr1RcVec->push_back(drRc_Seed12);
1224 dr1RcVec->push_back(drRc_FwHalf);
1229 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
1230 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1231 EbwtRangeSourceFactory *rRc_FwSeed = new EbwtRangeSourceFactory(
1232 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1233 EbwtRangeSource *rRc_BwSeedGen = new EbwtRangeSource(
1234 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 0, true, maqPenalty_, qualOrder_);
1235 EbwtRangeSource *rRc_FwHalf = new EbwtRangeSource(
1236 &ebwtFw_, fw, qualCutoff_, false, verbose_, quiet_, 2, false, maqPenalty_, qualOrder_);
1238 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
1239 *params, rRc_Fw, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1240 seedLen_, // seedLen
1242 PIN_TO_HI_HALF_EDGE,
1243 PIN_TO_HI_HALF_EDGE,
1244 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1246 os_, verbose_, quiet_, mate1, pool_, btCnt);
1247 EbwtRangeSourceDriverFactory * drRc_FwSeed = new EbwtRangeSourceDriverFactory(
1248 *params, rRc_FwSeed, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1249 seedLen_, // seedLen
1255 os_, verbose_, quiet_, mate1, pool_, btCnt);
1256 EbwtRangeSourceDriver * drRc_BwSeedGen = new EbwtRangeSourceDriver(
1257 *params, rRc_BwSeedGen, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1258 seedLen_, // seedLen
1260 PIN_TO_HI_HALF_EDGE,
1261 PIN_TO_HI_HALF_EDGE,
1262 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1264 os_, verbose_, quiet_, mate1, pool_, btCnt);
1265 EbwtSeededRangeSourceDriver * drRc_Seed = new EbwtSeededRangeSourceDriver(
1266 drRc_FwSeed, drRc_BwSeedGen, fw, seedLen_, verbose_, quiet_, mate1);
1267 EbwtRangeSourceDriverFactory * drRc_FwSeed12 = NULL;
1269 EbwtRangeSourceFactory *rRc_FwSeed12 = new EbwtRangeSourceFactory(
1270 &ebwtFw_, fw, qualCutoff_, true, verbose_, quiet_, 0, false, maqPenalty_, qualOrder_);
1271 drRc_FwSeed12 = new EbwtRangeSourceDriverFactory(
1272 *params, rRc_FwSeed12, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1273 seedLen_, // seedLen
1279 os_, verbose_, quiet_, mate1, pool_, btCnt);
1281 EbwtRangeSourceDriver * drRc_BwSeedGen12 = NULL;
1283 EbwtRangeSource *rRc_BwSeedGen12 = new EbwtRangeSource(
1284 ebwtBw_, fw, qualCutoff_, false, verbose_, quiet_, 3, true, maqPenalty_, qualOrder_);
1285 drRc_BwSeedGen12 = new EbwtRangeSourceDriver(
1286 *params, rRc_BwSeedGen12, fw, true, maqPenalty_, qualOrder_, sink_, sinkPt,
1287 seedLen_, // seedLen
1290 PIN_TO_HI_HALF_EDGE,
1291 PIN_TO_HI_HALF_EDGE,
1293 os_, verbose_, quiet_, mate1, pool_, btCnt);
1295 EbwtSeededRangeSourceDriver * drRc_Seed12 = NULL;
1297 drRc_Seed12 = new EbwtSeededRangeSourceDriver(
1298 drRc_FwSeed12, drRc_BwSeedGen12, fw, seedLen_, verbose_, quiet_, mate1);
1300 EbwtRangeSourceDriver * drRc_FwHalf = new EbwtRangeSourceDriver(
1301 *params, rRc_FwHalf, fw, false, maqPenalty_, qualOrder_, sink_, sinkPt,
1302 seedLen_, // seedLen
1304 PIN_TO_BEGINNING, // nothing's unrevisitable
1305 PIN_TO_HI_HALF_EDGE,
1306 two ? PIN_TO_SEED_EDGE : PIN_TO_HI_HALF_EDGE,
1308 os_, verbose_, quiet_, mate1, pool_, btCnt);
1309 dr2RcVec->push_back(drRc_Fw);
1310 dr2RcVec->push_back(drRc_Seed);
1311 if(drRc_Seed12 != NULL) {
1312 dr2RcVec->push_back(drRc_Seed12);
1314 dr2RcVec->push_back(drRc_FwHalf);
1317 cerr << "Unsupported --stateful mode: " << seedMms_ << endl;
1319 // Set up a RangeChaser
1320 RangeChaser<String<Dna> > *rchase =
1321 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_);
1324 PairedBWAlignerV1<EbwtRangeSource>* al = new PairedBWAlignerV1<EbwtRangeSource>(
1326 new TCostAwareRangeSrcDr(strandFix_, dr1FwVec, verbose_, quiet_, false),
1327 new TCostAwareRangeSrcDr(strandFix_, dr1RcVec, verbose_, quiet_, false),
1328 new TCostAwareRangeSrcDr(strandFix_, dr2FwVec, verbose_, quiet_, false),
1329 new TCostAwareRangeSrcDr(strandFix_, dr2RcVec, verbose_, quiet_, false),
1330 refAligner, rchase, sink_, sinkPtFactory_, sinkPt,
1331 mate1fw_, mate2fw_, peInner_, peOuter_, dontReconcile_,
1332 symCeil_, mixedThresh_, mixedAttemptLim_, refs_,
1333 rangeMode_, verbose_, quiet_, maxBts_, pool_,
1341 // We dumped all the drivers into dr1FwVec
1342 PairedBWAlignerV2<EbwtRangeSource>* al = new PairedBWAlignerV2<EbwtRangeSource>(
1343 params, paramsSe1, paramsSe2,
1344 new TCostAwareRangeSrcDr(strandFix_, dr1FwVec, verbose_, quiet_, true),
1345 refAligner, rchase, sink_, sinkPtFactory_, sinkPt,
1346 sinkPtSe1, sinkPtSe2, mate1fw_, mate2fw_, peInner_, peOuter_,
1347 mixedAttemptLim_, refs_, rangeMode_, verbose_,
1348 quiet_, maxBts_, pool_, btCnt);
1355 Ebwt<String<Dna> >& ebwtFw_;
1356 Ebwt<String<Dna> >* ebwtBw_;
1358 const bool v1_; // whether to use V1 PairedAligner
1361 const uint32_t seedMms_;
1362 const uint32_t seedLen_;
1363 const int qualCutoff_;
1366 const HitSinkPerThreadFactory& sinkPtFactory_;
1367 const bool mate1fw_;
1368 const bool mate2fw_;
1369 const uint32_t peInner_;
1370 const uint32_t peOuter_;
1371 const bool dontReconcile_;
1372 const uint32_t symCeil_;
1373 const uint32_t mixedThresh_;
1374 const uint32_t mixedAttemptLim_;
1375 RangeCache *cacheFw_;
1376 RangeCache *cacheBw_;
1377 const uint32_t cacheLimit_;
1379 BitPairReference* refs_;
1380 vector<String<Dna5> >& os_;
1381 const bool reportSe_;
1382 const bool maqPenalty_;
1383 const bool qualOrder_;
1384 const bool strandFix_;
1385 const bool rangeMode_;
1386 const bool verbose_;
1390 #endif /* ALIGNER_SEED_MM_H_ */