RegionAnnotation RegionAnnotations::TheHQRegion() const { std::vector<RegionAnnotation> hqs_ = HQRegions(); if (hqs_.size() == 0) return RegionAnnotation(holeNumber_, RegionTypeMap::ToIndex(HQRegion, types_), 0, 0, 0); else if (hqs_.size() == 1) return hqs_[0]; else assert(false && "Zmw has more than one HQRegion."); }
bool HDFPulseWriter::WriteOneZmw(const SMRTSequence& seq, const std::vector<RegionAnnotation>& regions) { if (not this->WriteOneZmw(seq)) { return false; } if (HasRegions()) { if (regions.size() == 0) { std::vector<RegionAnnotation> fake = { RegionAnnotation(seq.HoleNumber(), HQRegion, 0, 0, 0)}; return regionsWriter_->Write(fake); } else { return regionsWriter_->Write(regions); } } return true; }
std::vector<ReadInterval> RegionAnnotations::SubreadIntervals(const DNALength wholeLength, const bool byAdapter, const bool byHQRegion) const { std::vector<RegionAnnotation> inserts; if (not byAdapter) { inserts = Inserts(); } else { if (Adapters().size() != 0) { // Must have at least one adapter in order find inserts by adapter. std::vector<DNALength> starts, ends; starts.push_back(0); for(auto adapter: Adapters()) { assert(wholeLength >= static_cast<DNALength>(adapter.GetStart()) and wholeLength >= static_cast<DNALength>(adapter.GetEnd())); // bug if fail assert starts.push_back(adapter.GetEnd()); ends.push_back(adapter.GetStart()); } ends.push_back(wholeLength); for (size_t i = 0; i < starts.size(); i++) { // Use adapter to infer subreads, read score considered unknown. if (ends[i] > starts[i]) { inserts.push_back(RegionAnnotation(holeNumber_, Insert, starts[i], ends[i], 0)); } } } // else no inserts can be found } std::vector<ReadInterval> ret; for (auto insert: inserts) { if (byHQRegion) { if (HasHQRegion()) { DNALength s = std::max(static_cast<UInt>(insert.GetStart()), HQStart()); DNALength e = std::min(static_cast<UInt>(insert.GetEnd()), HQEnd()); if (s < e) { // subreads' read score = HQRegion score. ret.push_back(ReadInterval(s, e, HQScore())); } } // else ret = {} } else { ret.push_back(ReadInterval(insert)); } } return ret; }