Esempio n. 1
0
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;
}