// 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)); } } }
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; }