#ifndef PAIREDENDREADQ_H_ #define PAIREDENDREADQ_H_ #include<cassert> #include<iostream> #include<string> #include "Read.h" #include "SingleReadQ.h" class PairedEndReadQ : public Read { public: PairedEndReadQ() : mate1(), mate2() {} PairedEndReadQ(const SingleReadQ& mate1, const SingleReadQ& mate2) { this->mate1 = mate1; this->mate2 = mate2; this->name = mate1.getName(); } bool read(int argc, std::istream* argv[], int flags = 7); void write(int argc, std::ostream* argv[]); const SingleReadQ& getMate1() const { return mate1; } const SingleReadQ& getMate2() const { return mate2; } const SingleReadQ& getMate(int i) const { if (i == 1) return mate1; else return mate2; } void calc_lq(bool, int); // calculate if this read is low quality. Without calling this function, isLowQuality() will always be false private: SingleReadQ mate1, mate2; }; bool PairedEndReadQ::read(int argc, std::istream* argv[], int flags) { bool success; std::istream *inpMate1[1], *inpMate2[1]; assert(argc == 2); inpMate1[0] = argv[0]; inpMate2[0] = argv[1]; success = mate1.read(1, inpMate1, flags) && mate2.read(1, inpMate2, flags); name = ""; if (flags & 4) { name = mate1.getName(); } //May chop 1 char later if we want return success; } void PairedEndReadQ::write(int argc, std::ostream* argv[]) { std::ostream *outMate1[1], *outMate2[1]; assert(argc == 2); outMate1[0] = argv[0]; outMate2[0] = argv[1]; mate1.write(1, outMate1); mate2.write(1, outMate2); } //calculate if this read is low quality void PairedEndReadQ::calc_lq(bool hasPolyA, int seedLen) { low_quality = false; mate1.calc_lq(hasPolyA, seedLen); mate2.calc_lq(hasPolyA, seedLen); if (mate1.getReadLength() < seedLen || mate2.getReadLength() < seedLen) low_quality = true; else low_quality = mate1.isLowQuality() && mate2.isLowQuality(); } #endif /* PAIREDENDREADQ_H_ */