예제 #1
0
// Can be either unique or multi-mapping reads
inline void PROBerReadModel_iCLIP::update(AlignmentGroup& ag) {
	int size = ag.size();
	BamAlignment *ba = NULL;
	char dir;

	if (size > 1) {
		assert(model_type >= 2);
		double frac = 1.0 / size;
		for (int i = 0; i < size; ++i) {
			ba = ag.getAlignment(i);
			fld->update(ba->getInsertSize(), frac);
		}
		return;
	}

	assert(ag.getSEQ(seq));
	if (model_type & 1) assert(ag.getQUAL(qual));
	for (int i = 0; i < size; ++i) {
		ba = ag.getAlignment(i);
		dir = ba->getMateDir();
		assert(ba->getCIGAR(cigar));
		assert(ba->getMD(mdstr));
		refseq.setUp(dir, cigar, mdstr, seq);
		seqmodel->update(1.0, dir, 0, &refseq, &cigar, &seq, ((model_type & 1) ? &qual : NULL));
	}

	if (model_type >= 2) {
		assert(ag.getSEQ(seq, 2));
		if (model_type & 1) assert(ag.getQUAL(qual, 2));
		for (int i = 0; i < size; ++i) {
			ba = ag.getAlignment(i);
			dir = ba->getMateDir(2);
			assert(ba->getCIGAR(cigar, 2));
			assert(ba->getMD(mdstr, 2));
			refseq.setUp(dir, cigar, mdstr, seq);
			seqmodel->update(1.0, dir, 0, &refseq, &cigar, &seq, ((model_type & 1) ? &qual : NULL));
		}
	}
}
예제 #2
0
inline void PROBerReadModel_iCLIP::calcProbs(AlignmentGroup& ag, double* conprbs) {
	int size = ag.size();
	BamAlignment *ba = NULL;
	char dir;

	assert(ag.getSEQ(seq));
	if (model_type & 1) assert(ag.getQUAL(qual));
	for (int i = 0; i < size; ++i) {
		ba = ag.getAlignment(i);
		dir = ba->getMateDir();
		assert(ba->getCIGAR(cigar));
		assert(ba->getMD(mdstr));
		refseq.setUp(dir, cigar, mdstr, seq);
		conprbs[i] = seqmodel->getProb(dir, 0, &refseq, &cigar, &seq, ((model_type & 1) ? &qual : NULL));
	}

	if (model_type >= 2) {
		assert(ag.getSEQ(seq, 2));
		if (model_type & 1) assert(ag.getQUAL(qual, 2));
		for (int i = 0; i < size; ++i) {
			ba = ag.getAlignment(i);
			dir = ba->getMateDir(2);
			assert(ba->getCIGAR(cigar, 2));
			assert(ba->getMD(mdstr, 2));
			refseq.setUp(dir, cigar, mdstr, seq);
			conprbs[i] *= seqmodel->getProb(dir, 0, &refseq, &cigar, &seq, ((model_type & 1) ? &qual : NULL));

			conprbs[i] *= fld->getProb(ba->getInsertSize()); // fragment length distribution
		}
	}

	double sum = 0.0;
	for (int i = 0; i < size; ++i) sum += conprbs[i];

	//assert(sum > 0.0);
	if (sum <= 0.0) sum = 1.0;
	
	for (int i = 0; i < size; ++i) conprbs[i] /= sum;  
}