bool OperationList::waitFor(bool interruptible) { bool rval = true; if(mLocking) { mLock.lock(); } // copy operations to wait for OpList opList = mOperations; if(mLocking) { mLock.unlock(); } // wait for operations OpList::iterator end = opList.end(); for(OpList::iterator i = opList.begin(); i != end; ++i) { rval = (*i)->waitFor(interruptible); // break out if interruptible and interrupted if(interruptible && !rval) { break; } } return rval; }
void Scaffold::merge(const Scaffold& lhs, const Scaffold& rhs, Scaffold& merged, bool introns_overwrite_matches) { OpList ops; assert (merged.ref_id() == 0); assert (lhs.ref_id() == rhs.ref_id()); ops.insert(ops.end(), lhs._augmented_ops.begin(), lhs._augmented_ops.end()); ops.insert(ops.end(), rhs._augmented_ops.begin(), rhs._augmented_ops.end()); sort(ops.begin(), ops.end(), AugmentedCuffOp::g_left_lt); AugmentedCuffOp::merge_ops(ops, merged._augmented_ops, introns_overwrite_matches); assert (ops.empty() || !(merged._augmented_ops.empty())); merged._ref_id = lhs.ref_id(); merged._mates_in_scaff.insert(merged._mates_in_scaff.end(), lhs._mates_in_scaff.begin(), lhs._mates_in_scaff.end()); merged._mates_in_scaff.insert(merged._mates_in_scaff.end(), rhs._mates_in_scaff.begin(), rhs._mates_in_scaff.end()); sort(merged._mates_in_scaff.begin(), merged._mates_in_scaff.end()); vector<const MateHit*>::iterator new_end = unique(merged._mates_in_scaff.begin(), merged._mates_in_scaff.end()); merged._mates_in_scaff.erase(new_end, merged._mates_in_scaff.end()); int r_check = merged.left(); for (size_t i = 0; i < merged._augmented_ops.size(); ++i) r_check += merged._augmented_ops[i].genomic_length; assert(r_check == merged.right()); if (lhs.strand() != CUFF_STRAND_UNKNOWN) merged._strand = lhs.strand(); if (rhs.strand() != CUFF_STRAND_UNKNOWN) merged._strand = rhs.strand(); merged._has_intron = has_intron(merged); assert(merged._strand != CUFF_STRAND_UNKNOWN || !merged.has_intron() ); assert(!merged.is_ref()); if (library_type == "transfrags") { double avg_fpkm = lhs.fpkm() + rhs.fpkm(); avg_fpkm /= 2; merged.fpkm(avg_fpkm); } }
void Scaffold::merge(const vector<Scaffold>& s, Scaffold& merged, bool introns_overwrite_matches) { OpList ops; CuffStrand strand = CUFF_STRAND_UNKNOWN; for (size_t i = 0; i < s.size(); ++i) { ops.insert(ops.end(), s[i]._augmented_ops.begin(), s[i]._augmented_ops.end()); merged._mates_in_scaff.insert(merged._mates_in_scaff.end(), s[i]._mates_in_scaff.begin(), s[i]._mates_in_scaff.end()); if (s[i].strand() != CUFF_STRAND_UNKNOWN) { //assert (strand == CUFF_STRAND_UNKNOWN || strand == s[i].strand()); strand = s[i].strand(); } } sort(merged._mates_in_scaff.begin(),merged._mates_in_scaff.end()); vector<const MateHit*>::iterator new_end = unique(merged._mates_in_scaff.begin(), merged._mates_in_scaff.end()); merged._mates_in_scaff.erase(new_end, merged._mates_in_scaff.end()); sort(ops.begin(), ops.end(), AugmentedCuffOp::g_left_lt); //merged._contigs.push_back(CuffAlign(ops.front().g_left(), vector<CuffOp>())); if (ops.empty()) return; AugmentedCuffOp::merge_ops(ops, merged._augmented_ops, introns_overwrite_matches); //assert (ops.empty() || !(merged._augmented_ops.empty())); #ifdef DEBUG if (merged._augmented_ops.empty() || merged._augmented_ops.front().opcode != CUFF_MATCH || merged._augmented_ops.back().opcode != CUFF_MATCH) { AugmentedCuffOp::merge_ops(ops, merged._augmented_ops, introns_overwrite_matches); } #endif merged._ref_id = s.front().ref_id(); merged._strand = strand; int r_check = merged.left(); for (size_t i = 0; i < merged._augmented_ops.size(); ++i) r_check += merged._augmented_ops[i].genomic_length; #ifdef DEBUG if (r_check != merged.right()) { AugmentedCuffOp::merge_ops(ops, merged._augmented_ops, introns_overwrite_matches); } #endif assert (r_check == merged.right()); merged._has_intron = has_intron(merged); assert(merged._strand != CUFF_STRAND_UNKNOWN || !merged.has_strand_support()); if (library_type == "transfrags") { double avg_fpkm = 0.0; BOOST_FOREACH (const Scaffold& sc, s) { avg_fpkm += sc.fpkm(); } avg_fpkm /= s.size(); merged.fpkm(avg_fpkm); }