12 #include "range_source.h"
13 #include "row_chaser.h"
14 #include "range_chaser.h"
15 #include "ref_aligner.h"
18 * Concrete factory class for constructing unpaired exact aligners.
20 class Unpaired1mmAlignerV1Factory : public AlignerFactory {
21 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
22 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
23 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
25 Unpaired1mmAlignerV1Factory(
26 Ebwt<String<Dna> >& ebwtFw,
27 Ebwt<String<Dna> >* ebwtBw,
31 const HitSinkPerThreadFactory& sinkPtFactory,
36 BitPairReference* refs,
37 vector<String<Dna5> >& os,
50 sinkPtFactory_(sinkPtFactory),
53 cacheLimit_(cacheLimit),
57 maqPenalty_(maqPenalty),
58 qualOrder_(qualOrder),
59 strandFix_(strandFix),
60 rangeMode_(rangeMode),
65 assert(ebwtFw.isInMemory());
66 assert(ebwtBw != NULL);
67 assert(ebwtBw->isInMemory());
71 * Create a new UnpairedExactAlignerV1s.
73 virtual Aligner* create() const {
75 HitSinkPerThread* sinkPt = sinkPtFactory_.create();
76 EbwtSearchParams<String<Dna> >* params =
77 new EbwtSearchParams<String<Dna> >(*sinkPt, os_);
79 const int halfAndHalf = 0;
80 const bool seeded = false;
82 EbwtRangeSource *rFw_Bw = new EbwtRangeSource(
83 ebwtBw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
84 EbwtRangeSource *rFw_Fw = new EbwtRangeSource(
85 &ebwtFw_, true, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
87 EbwtRangeSourceDriver * drFw_Bw = new EbwtRangeSourceDriver(
88 *params, rFw_Bw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
89 0, // seedLen (0 = whole read is seed)
90 false, // nudgeLeft (true for Fw index, false for Bw)
91 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
92 PIN_TO_LEN, // allow 1 mismatch in rest of read
95 os_, verbose_, quiet_, true, pool_, NULL);
97 EbwtRangeSourceDriver * drFw_Fw = new EbwtRangeSourceDriver(
98 *params, rFw_Fw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
99 0, // seedLen (0 = whole read is seed)
100 true, // nudgeLeft (true for Fw index, false for Bw)
101 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
102 PIN_TO_LEN, // allow 1 mismatch in rest of read
105 os_, verbose_, quiet_, true, pool_, NULL);
106 TRangeSrcDrPtrVec *drVec = new TRangeSrcDrPtrVec();
108 drVec->push_back(drFw_Bw);
109 drVec->push_back(drFw_Fw);
112 EbwtRangeSource *rRc_Fw = new EbwtRangeSource(
113 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
114 EbwtRangeSource *rRc_Bw = new EbwtRangeSource(
115 ebwtBw_, false, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
117 EbwtRangeSourceDriver * drRc_Fw = new EbwtRangeSourceDriver(
118 *params, rRc_Fw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
119 0, // seedLen (0 = whole read is seed)
120 true, // nudgeLeft (true for Fw index, false for Bw)
121 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
122 PIN_TO_LEN, // allow 1 mismatch in rest of read
125 os_, verbose_, quiet_, true, pool_, NULL);
127 EbwtRangeSourceDriver * drRc_Bw = new EbwtRangeSourceDriver(
128 *params, rRc_Bw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
129 0, // seedLen (0 = whole read is seed)
130 false, // nudgeLeft (true for Fw index, false for Bw)
131 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
132 PIN_TO_LEN, // allow 1 mismatch in rest of read
135 os_, verbose_, quiet_, true, pool_, NULL);
137 drVec->push_back(drRc_Fw);
138 drVec->push_back(drRc_Bw);
140 TCostAwareRangeSrcDr* dr = new TCostAwareRangeSrcDr(strandFix_, drVec, verbose_, quiet_, false);
143 // Set up a RangeChaser
144 RangeChaser<String<Dna> > *rchase =
145 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_);
147 // Set up the aligner
148 return new UnpairedAlignerV2<EbwtRangeSource>(
150 sink_, sinkPtFactory_, sinkPt, os_, refs_,
151 rangeMode_, verbose_, quiet_, INT_MAX, pool_, NULL, NULL);
155 Ebwt<String<Dna> >& ebwtFw_;
156 Ebwt<String<Dna> >* ebwtBw_;
160 const HitSinkPerThreadFactory& sinkPtFactory_;
161 RangeCache *cacheFw_;
162 RangeCache *cacheBw_;
163 const uint32_t cacheLimit_;
165 BitPairReference* refs_;
166 vector<String<Dna5> >& os_;
167 const bool maqPenalty_;
168 const bool qualOrder_;
177 * Concrete factory class for constructing unpaired exact aligners.
179 class Paired1mmAlignerV1Factory : public AlignerFactory {
180 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
181 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
182 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
184 Paired1mmAlignerV1Factory(
185 Ebwt<String<Dna> >& ebwtFw,
186 Ebwt<String<Dna> >* ebwtBw,
192 const HitSinkPerThreadFactory& sinkPtFactory,
199 uint32_t mixedThresh,
200 uint32_t mixedAttemptLim,
205 BitPairReference* refs,
206 vector<String<Dna5> >& os,
222 sinkPtFactory_(sinkPtFactory),
227 dontReconcile_(dontReconcile),
229 mixedThresh_(mixedThresh),
230 mixedAttemptLim_(mixedAttemptLim),
233 cacheLimit_(cacheLimit),
235 refs_(refs), os_(os),
237 maqPenalty_(maqPenalty),
238 qualOrder_(qualOrder),
239 strandFix_(strandFix),
240 rangeMode_(rangeMode),
245 assert(ebwtBw != NULL);
246 assert(ebwtFw.isInMemory());
247 assert(ebwtBw->isInMemory());
251 * Create a new UnpairedExactAlignerV1s.
253 virtual Aligner* create() const {
254 HitSinkPerThread* sinkPt = sinkPtFactory_.createMult(2);
255 HitSinkPerThread* sinkPtSe1 = NULL, * sinkPtSe2 = NULL;
256 EbwtSearchParams<String<Dna> >* params =
257 new EbwtSearchParams<String<Dna> >(*sinkPt, os_);
258 EbwtSearchParams<String<Dna> >* paramsSe1 = NULL, * paramsSe2 = NULL;
260 sinkPtSe1 = sinkPtFactory_.create();
261 sinkPtSe2 = sinkPtFactory_.create();
263 new EbwtSearchParams<String<Dna> >(*sinkPtSe1, os_);
265 new EbwtSearchParams<String<Dna> >(*sinkPtSe2, os_);
268 const int halfAndHalf = 0;
269 const bool seeded = false;
276 if(mate1fw_) do1Fw = false;
278 if(mate2fw_) do2Fw = false;
282 if(mate1fw_) do1Rc = false;
284 if(mate2fw_) do2Rc = false;
288 TRangeSrcDrPtrVec *dr1FwVec;
289 dr1FwVec = new TRangeSrcDrPtrVec();
291 EbwtRangeSource *r1Fw_Bw = new EbwtRangeSource(
292 ebwtBw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
293 EbwtRangeSource *r1Fw_Fw = new EbwtRangeSource(
294 &ebwtFw_, true, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
296 EbwtRangeSourceDriver * dr1Fw_Bw = new EbwtRangeSourceDriver(
297 *params, r1Fw_Bw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
298 0, // seedLen (0 = whole read is seed)
299 true, // nudgeLeft (true for Fw index, false for Bw)
300 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
301 PIN_TO_LEN, // allow 1 mismatch in rest of read
304 os_, verbose_, quiet_, true, pool_, NULL);
305 EbwtRangeSourceDriver * dr1Fw_Fw = new EbwtRangeSourceDriver(
306 *params, r1Fw_Fw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
308 false, // nudgeLeft (true for Fw index, false for Bw)
309 PIN_TO_HI_HALF_EDGE, // right-hand half alignment is unrevisitable
313 os_, verbose_, quiet_, true, pool_, NULL);
315 dr1FwVec->push_back(dr1Fw_Bw);
316 dr1FwVec->push_back(dr1Fw_Fw);
319 TRangeSrcDrPtrVec *dr1RcVec;
321 dr1RcVec = new TRangeSrcDrPtrVec();
326 EbwtRangeSource *r1Rc_Fw = new EbwtRangeSource(
327 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
328 EbwtRangeSource *r1Rc_Bw = new EbwtRangeSource(
329 ebwtBw_, false, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
331 EbwtRangeSourceDriver * dr1Rc_Fw = new EbwtRangeSourceDriver(
332 *params, r1Rc_Fw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
334 true, // nudgeLeft (true for Fw index, false for Bw)
335 PIN_TO_HI_HALF_EDGE, // right-hand half alignment is unrevisitable
339 os_, verbose_, quiet_, true, pool_, NULL);
340 EbwtRangeSourceDriver * dr1Rc_Bw = new EbwtRangeSourceDriver(
341 *params, r1Rc_Bw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
342 0, // seedLen (0 = whole read is seed)
343 false, // nudgeLeft (true for Fw index, false for Bw)
344 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
345 PIN_TO_LEN, // allow 1 mismatch in rest of read
348 os_, verbose_, quiet_, true, pool_, NULL);
349 dr1RcVec->push_back(dr1Rc_Fw);
350 dr1RcVec->push_back(dr1Rc_Bw);
353 TRangeSrcDrPtrVec *dr2FwVec;
355 dr2FwVec = new TRangeSrcDrPtrVec();
360 EbwtRangeSource *r2Fw_Bw = new EbwtRangeSource(
361 ebwtBw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
362 EbwtRangeSource *r2Fw_Fw = new EbwtRangeSource(
363 &ebwtFw_, true, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
365 EbwtRangeSourceDriver * dr2Fw_Bw = new EbwtRangeSourceDriver(
366 *params, r2Fw_Bw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
367 0, // seedLen (0 = whole read is seed)
368 true, // nudgeLeft (true for Fw index, false for Bw)
369 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
370 PIN_TO_LEN, // allow 1 mismatch in rest of read
373 os_, verbose_, quiet_, false, pool_, NULL);
374 EbwtRangeSourceDriver * dr2Fw_Fw = new EbwtRangeSourceDriver(
375 *params, r2Fw_Fw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
377 false, // nudgeLeft (true for Fw index, false for Bw)
378 PIN_TO_HI_HALF_EDGE, // right-hand half alignment is unrevisitable
382 os_, verbose_, quiet_, false, pool_, NULL);
383 dr2FwVec->push_back(dr2Fw_Bw);
384 dr2FwVec->push_back(dr2Fw_Fw);
387 TRangeSrcDrPtrVec *dr2RcVec;
389 dr2RcVec = new TRangeSrcDrPtrVec();
394 EbwtRangeSource *r2Rc_Fw = new EbwtRangeSource(
395 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
396 EbwtRangeSource *r2Rc_Bw = new EbwtRangeSource(
397 ebwtBw_, false, 0xffffffff, false, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
399 EbwtRangeSourceDriver * dr2Rc_Fw = new EbwtRangeSourceDriver(
400 *params, r2Rc_Fw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
402 true, // nudgeLeft (true for Fw index, false for Bw)
403 PIN_TO_HI_HALF_EDGE, // right-hand half alignment is unrevisitable
407 os_, verbose_, quiet_, false, pool_, NULL);
408 EbwtRangeSourceDriver * dr2Rc_Bw = new EbwtRangeSourceDriver(
409 *params, r2Rc_Bw, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
410 0, // seedLen (0 = whole read is seed)
411 false, // nudgeLeft (true for Fw index, false for Bw)
412 PIN_TO_HI_HALF_EDGE, // right half is unrevisitable
413 PIN_TO_LEN, // allow 1 mismatch in rest of read
416 os_, verbose_, quiet_, false, pool_, NULL);
417 dr2RcVec->push_back(dr2Rc_Fw);
418 dr2RcVec->push_back(dr2Rc_Bw);
421 RefAligner<String<Dna5> >* refAligner =
422 new OneMMRefAligner<String<Dna5> >(color_, verbose_, quiet_);
424 // Set up a RangeChaser
425 RangeChaser<String<Dna> > *rchase =
426 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_);
429 PairedBWAlignerV1<EbwtRangeSource>* al = new PairedBWAlignerV1<EbwtRangeSource>(
431 new TCostAwareRangeSrcDr(strandFix_, dr1FwVec, verbose_, quiet_, false),
432 new TCostAwareRangeSrcDr(strandFix_, dr1RcVec, verbose_, quiet_, false),
433 new TCostAwareRangeSrcDr(strandFix_, dr2FwVec, verbose_, quiet_, false),
434 new TCostAwareRangeSrcDr(strandFix_, dr2RcVec, verbose_, quiet_, false),
436 sink_, sinkPtFactory_, sinkPt, mate1fw_, mate2fw_,
437 peInner_, peOuter_, dontReconcile_, symCeil_, mixedThresh_,
438 mixedAttemptLim_, refs_, rangeMode_, verbose_,
439 quiet_, INT_MAX, pool_, NULL);
446 PairedBWAlignerV2<EbwtRangeSource>* al = new PairedBWAlignerV2<EbwtRangeSource>(
447 params, paramsSe1, paramsSe2,
448 new TCostAwareRangeSrcDr(strandFix_, dr1FwVec, verbose_, quiet_, true),
450 sink_, sinkPtFactory_,
451 sinkPt, sinkPtSe1, sinkPtSe2,
454 mixedAttemptLim_, refs_, rangeMode_,
455 verbose_, quiet_, INT_MAX, pool_, NULL);
462 Ebwt<String<Dna> >& ebwtFw_;
463 Ebwt<String<Dna> >* ebwtBw_;
469 const HitSinkPerThreadFactory& sinkPtFactory_;
472 const uint32_t peInner_;
473 const uint32_t peOuter_;
474 const bool dontReconcile_;
475 const uint32_t symCeil_;
476 const uint32_t mixedThresh_;
477 const uint32_t mixedAttemptLim_;
478 RangeCache *cacheFw_;
479 RangeCache *cacheBw_;
480 const uint32_t cacheLimit_;
482 BitPairReference* refs_;
483 vector<String<Dna5> >& os_;
484 const bool reportSe_;
485 const bool maqPenalty_;
486 const bool qualOrder_;
487 const bool strandFix_;
488 const bool rangeMode_;
491 const uint32_t seed_;
494 #endif /* ALIGNER_1MM_H_ */