void parseIt(SamParser *parser) { // record_val & record_read are copies of val & read for record purpose int val, record_val; ReadType read, record_read; HitType hit; HitContainer<HitType> hits; nHits = 0; nUnique = nMulti = nIsoMulti = 0; memset(N, 0, sizeof(N)); READ_INT_TYPE cnt = 0; record_val = -2; //indicate no recorded read now while ((val = parser->parseNext(read, hit)) >= 0) { if (val >= 0 && val <= 2) { // flush out previous read's info if needed if (record_val >= 0) { record_read.write(n_os, cat[record_val]); ++N[record_val]; } // flush out previous read's hits if the read is alignable reads if (record_val == 1) { hits.updateRI(); nHits += hits.getNHits(); nMulti += hits.calcNumGeneMultiReads(gi); nIsoMulti += hits.calcNumIsoformMultiReads(); hits.write(hit_out); iter = counter.find(hits.getNHits()); if (iter != counter.end()) { iter->second++; } else { counter[hits.getNHits()] = 1; } } hits.clear(); record_val = val; record_read = read; // no pointer, thus safe } if (val == 1 || val == 5) { hits.push_back(hit); } ++cnt; if (verbose && (cnt % 1000000 == 0)) { cout<< "Parsed "<< cnt<< " entries"<< endl; } } if (record_val >= 0) { record_read.write(n_os, cat[record_val]); ++N[record_val]; } if (record_val == 1) { hits.updateRI(); nHits += hits.getNHits(); nMulti += hits.calcNumGeneMultiReads(gi); nIsoMulti += hits.calcNumIsoformMultiReads(); hits.write(hit_out); iter = counter.find(hits.getNHits()); if (iter != counter.end()) { iter->second++; } else { counter[hits.getNHits()] = 1; } } nUnique = N[1] - nMulti; }