12 #include "row_chaser.h"
13 #include "range_chaser.h"
16 * Concrete factory class for constructing unpaired exact aligners.
18 class UnpairedExactAlignerV1Factory : public AlignerFactory {
20 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
21 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
22 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
25 UnpairedExactAlignerV1Factory(
26 Ebwt<String<Dna> >& ebwtFw,
27 Ebwt<String<Dna> >* ebwtBw,
31 const HitSinkPerThreadFactory& sinkPtFactory,
36 BitPairReference* refs,
37 vector<String<Dna5> >& os,
47 doFw_(doFw), doRc_(doRc),
49 sinkPtFactory_(sinkPtFactory),
52 cacheLimit_(cacheLimit),
56 maqPenalty_(maqPenalty),
57 qualOrder_(qualOrder),
58 strandFix_(strandFix),
59 rangeMode_(rangeMode),
64 assert(ebwtFw.isInMemory());
68 * Create a new UnpairedExactAlignerV1s.
70 virtual Aligner* create() const {
71 HitSinkPerThread* sinkPt = sinkPtFactory_.create();
72 EbwtSearchParams<String<Dna> >* params =
73 new EbwtSearchParams<String<Dna> >(*sinkPt, os_, true, true);
75 const int halfAndHalf = 0;
76 const bool seeded = false;
78 EbwtRangeSource *rFw = new EbwtRangeSource(
79 &ebwtFw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
80 EbwtRangeSource *rRc = new EbwtRangeSource(
81 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
83 EbwtRangeSourceDriver * driverFw = new EbwtRangeSourceDriver(
84 *params, rFw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
86 true, // nudgeLeft (not applicable)
87 PIN_TO_LEN, // whole alignment is unrevisitable
91 os_, verbose_, quiet_, true, pool_, NULL);
92 EbwtRangeSourceDriver * driverRc = new EbwtRangeSourceDriver(
93 *params, rRc, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
95 true, // nudgeLeft (not applicable)
96 PIN_TO_LEN, // whole alignment is unrevisitable
100 os_, verbose_, quiet_, true, pool_, NULL);
101 TRangeSrcDrPtrVec *drVec = new TRangeSrcDrPtrVec();
102 if(doFw_) drVec->push_back(driverFw);
103 if(doRc_) drVec->push_back(driverRc);
104 TCostAwareRangeSrcDr* dr = new TCostAwareRangeSrcDr(strandFix_, drVec, verbose_, quiet_, false);
107 // Set up a RangeChaser
108 RangeChaser<String<Dna> > *rchase =
109 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_);
111 return new UnpairedAlignerV2<EbwtRangeSource>(
113 sink_, sinkPtFactory_, sinkPt, os_, refs_,
114 rangeMode_, verbose_, quiet_, INT_MAX, pool_, NULL, NULL);
118 Ebwt<String<Dna> >& ebwtFw_;
119 Ebwt<String<Dna> >* ebwtBw_;
123 const HitSinkPerThreadFactory& sinkPtFactory_;
124 RangeCache *cacheFw_;
125 RangeCache *cacheBw_;
126 const uint32_t cacheLimit_;
128 BitPairReference* refs_;
129 vector<String<Dna5> >& os_;
140 * Concrete factory class for constructing unpaired exact aligners.
142 class PairedExactAlignerV1Factory : public AlignerFactory {
143 typedef RangeSourceDriver<EbwtRangeSource> TRangeSrcDr;
144 typedef CostAwareRangeSourceDriver<EbwtRangeSource> TCostAwareRangeSrcDr;
145 typedef std::vector<TRangeSrcDr*> TRangeSrcDrPtrVec;
147 PairedExactAlignerV1Factory(
148 Ebwt<String<Dna> >& ebwtFw,
149 Ebwt<String<Dna> >* ebwtBw,
155 const HitSinkPerThreadFactory& sinkPtFactory,
162 uint32_t mixedThresh,
163 uint32_t mixedAttemptLim,
168 BitPairReference* refs,
169 vector<String<Dna5> >& os,
184 sinkPtFactory_(sinkPtFactory),
189 dontReconcile_(dontReconcile),
191 mixedThresh_(mixedThresh),
192 mixedAttemptLim_(mixedAttemptLim),
195 cacheLimit_(cacheLimit),
197 refs_(refs), os_(os),
199 maqPenalty_(maqPenalty),
200 qualOrder_(qualOrder),
201 strandFix_(strandFix),
202 rangeMode_(rangeMode),
207 assert(ebwtFw.isInMemory());
211 * Create a new UnpairedExactAlignerV1s.
213 virtual Aligner* create() const {
214 HitSinkPerThread* sinkPt = sinkPtFactory_.createMult(2);
215 HitSinkPerThread* sinkPtSe1 = NULL, * sinkPtSe2 = NULL;
216 EbwtSearchParams<String<Dna> >* params =
217 new EbwtSearchParams<String<Dna> >(*sinkPt, os_, true, true);
218 EbwtSearchParams<String<Dna> >* paramsSe1 = NULL, * paramsSe2 = NULL;
220 sinkPtSe1 = sinkPtFactory_.create();
221 sinkPtSe2 = sinkPtFactory_.create();
223 new EbwtSearchParams<String<Dna> >(*sinkPtSe1, os_, true, true);
225 new EbwtSearchParams<String<Dna> >(*sinkPtSe2, os_, true, true);
228 const int halfAndHalf = 0;
229 const bool seeded = false;
236 if(mate1fw_) do1Fw = false;
238 if(mate2fw_) do2Fw = false;
242 if(mate1fw_) do1Rc = false;
244 if(mate2fw_) do2Rc = false;
248 EbwtRangeSource *r1Fw = NULL;
249 EbwtRangeSource *r1Rc = NULL;
250 TRangeSrcDr * driver1Fw = NULL;
251 TRangeSrcDr * driver1Rc = NULL;
252 EbwtRangeSource *r2Fw = NULL;
253 EbwtRangeSource *r2Rc = NULL;
254 TRangeSrcDr * driver2Fw = NULL;
255 TRangeSrcDr * driver2Rc = NULL;
257 r1Fw = new EbwtRangeSource(
258 &ebwtFw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
259 driver1Fw = new EbwtRangeSourceDriver(
260 *params, r1Fw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
262 true, // nudgeLeft (not applicable)
263 PIN_TO_LEN, // whole alignment is unrevisitable
267 os_, verbose_, quiet_, true, pool_, NULL);
270 r2Fw = new EbwtRangeSource(
271 &ebwtFw_, true, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
272 driver2Fw = new EbwtRangeSourceDriver(
273 *params, r2Fw, true, false, maqPenalty_, qualOrder_, sink_, sinkPt,
275 true, // nudgeLeft (not applicable)
276 PIN_TO_LEN, // whole alignment is unrevisitable
280 os_, verbose_, quiet_, false, pool_, NULL);
283 r1Rc = new EbwtRangeSource(
284 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
285 driver1Rc = new EbwtRangeSourceDriver(
286 *params, r1Rc, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
288 true, // nudgeLeft (not applicable)
289 PIN_TO_LEN, // whole alignment is unrevisitable
293 os_, verbose_, quiet_, true, pool_, NULL);
296 r2Rc = new EbwtRangeSource(
297 &ebwtFw_, false, 0xffffffff, true, verbose_, quiet_, halfAndHalf, seeded, maqPenalty_, qualOrder_);
298 driver2Rc = new EbwtRangeSourceDriver(
299 *params, r2Rc, false, false, maqPenalty_, qualOrder_, sink_, sinkPt,
301 true, // nudgeLeft (not applicable)
302 PIN_TO_LEN, // whole alignment is unrevisitable
306 os_, verbose_, quiet_, false, pool_, NULL);
309 RefAligner<String<Dna5> >* refAligner
310 = new ExactRefAligner<String<Dna5> >(color_, verbose_, quiet_);
312 // Set up a RangeChaser
313 RangeChaser<String<Dna> > *rchase =
314 new RangeChaser<String<Dna> >(cacheLimit_, cacheFw_, cacheBw_);
317 PairedBWAlignerV1<EbwtRangeSource>* al = new PairedBWAlignerV1<EbwtRangeSource>(
319 driver1Fw == NULL ? (new StubRangeSourceDriver<EbwtRangeSource>()) : driver1Fw,
320 driver1Rc == NULL ? (new StubRangeSourceDriver<EbwtRangeSource>()) : driver1Rc,
321 driver2Fw == NULL ? (new StubRangeSourceDriver<EbwtRangeSource>()) : driver2Fw,
322 driver2Rc == NULL ? (new StubRangeSourceDriver<EbwtRangeSource>()) : driver2Rc,
324 rchase, sink_, sinkPtFactory_, sinkPt, mate1fw_, mate2fw_,
325 peInner_, peOuter_, dontReconcile_, symCeil_, mixedThresh_,
326 mixedAttemptLim_, refs_, rangeMode_, verbose_,
327 quiet_, INT_MAX, pool_, NULL);
330 TRangeSrcDrPtrVec *drVec = new TRangeSrcDrPtrVec();
331 if(driver1Fw != NULL) drVec->push_back(driver1Fw);
332 if(driver1Rc != NULL) drVec->push_back(driver1Rc);
333 if(driver2Fw != NULL) drVec->push_back(driver2Fw);
334 if(driver2Rc != NULL) drVec->push_back(driver2Rc);
335 PairedBWAlignerV2<EbwtRangeSource>* al = new PairedBWAlignerV2<EbwtRangeSource>(
336 params, paramsSe1, paramsSe2,
337 new TCostAwareRangeSrcDr(strandFix_, drVec, verbose_, quiet_, true),
339 rchase, sink_, sinkPtFactory_, sinkPt,
340 sinkPtSe1, sinkPtSe2, mate1fw_, mate2fw_,
342 mixedAttemptLim_, refs_, rangeMode_,
343 verbose_, quiet_, INT_MAX, pool_, NULL);
350 Ebwt<String<Dna> >& ebwtFw_;
351 Ebwt<String<Dna> >* ebwtBw_;
357 const HitSinkPerThreadFactory& sinkPtFactory_;
360 const uint32_t peInner_;
361 const uint32_t peOuter_;
362 const bool dontReconcile_;
363 const uint32_t symCeil_;
364 const uint32_t mixedThresh_;
365 const uint32_t mixedAttemptLim_;
366 RangeCache *cacheFw_;
367 RangeCache *cacheBw_;
368 const uint32_t cacheLimit_;
370 BitPairReference* refs_;
371 vector<String<Dna5> >& os_;
372 const bool reportSe_;
373 const bool maqPenalty_;
374 const bool qualOrder_;
375 const bool strandFix_;
376 const bool rangeMode_;
379 const uint32_t seed_;
382 #endif /* ALIGNER_0MM_H_ */