/** * Report a maxed-out read. */ void VerboseHitSink::reportMaxed( vector<Hit>& hs, size_t threadId, PatternSourcePerThread& p) { HitSink::reportMaxed(hs, threadId, p); if(sampleMax_) { RandomSource rand; rand.init(p.bufa().seed); assert_gt(hs.size(), 0); bool paired = hs.front().mate > 0; size_t num = 1; if(paired) { num = 0; int bestStratum = 999; for(size_t i = 0; i < hs.size()-1; i += 2) { int strat = min(hs[i].stratum, hs[i+1].stratum); if(strat < bestStratum) { bestStratum = strat; num = 1; } else if(strat == bestStratum) { num++; } } assert_leq(num, hs.size()); uint32_t r = rand.nextU32() % num; num = 0; for(size_t i = 0; i < hs.size()-1; i += 2) { int strat = min(hs[i].stratum, hs[i+1].stratum); if(strat == bestStratum) { if(num == r) { hs[i].oms = hs[i+1].oms = (uint32_t)(hs.size()/2); reportHits(NULL, &hs, i, i+2, threadId, 0, 0, true, p.rdid()); break; } num++; } } assert_eq(num, r); } else { for(size_t i = 1; i < hs.size(); i++) { assert_geq(hs[i].stratum, hs[i-1].stratum); if(hs[i].stratum == hs[i-1].stratum) num++; else break; } assert_leq(num, hs.size()); uint32_t r = rand.nextU32() % num; Hit& h = hs[r]; h.oms = (uint32_t)hs.size(); reportHits(&h, NULL, 0, 1, threadId, 0, 0, true, p.rdid()); } } }
/** * Report maxed-out read; if sampleMax_ is set, then report 1 alignment * at random. */ void SAMHitSink::reportMaxed(vector<Hit>& hs, PatternSourcePerThread& p) { if(sampleMax_) { HitSink::reportMaxed(hs, p); RandomSource rand; rand.init(p.bufa().seed); assert_gt(hs.size(), 0); bool paired = hs.front().mate > 0; size_t num = 1; if(paired) { num = 0; int bestStratum = 999; for(size_t i = 0; i < hs.size()-1; i += 2) { int strat = min(hs[i].stratum, hs[i+1].stratum); if(strat < bestStratum) { bestStratum = strat; num = 1; } else if(strat == bestStratum) { num++; } } assert_leq(num, hs.size()); uint32_t r = rand.nextU32() % num; num = 0; for(size_t i = 0; i < hs.size()-1; i += 2) { int strat = min(hs[i].stratum, hs[i+1].stratum); if(strat == bestStratum) { if(num == r) { reportSamHits(hs, i, i+2, 0, hs.size()/2+1); break; } num++; } } assert_eq(num, r); } else { for(size_t i = 1; i < hs.size(); i++) { assert_geq(hs[i].stratum, hs[i-1].stratum); if(hs[i].stratum == hs[i-1].stratum) num++; else break; } assert_leq(num, hs.size()); uint32_t r = rand.nextU32() % num; reportSamHit(hs[r], /*MAPQ*/0, /*XM:I*/hs.size()+1); } } else { reportUnOrMax(p, &hs, false); } }