X-Git-Url: https://git.donarmstrong.com/?p=rsem.git;a=blobdiff_plain;f=ReadReader.h;h=141585aa5cfe78ff3cd1aca0899f227f092928af;hp=f1bd1f59a8395c5938a034199e7cd48b70d6a9fb;hb=da57529b92adbb7ae74a89861cb39fb35ac7c62d;hpb=a95154919f950f86de9104b2b9dcf1f0c7e83387 diff --git a/ReadReader.h b/ReadReader.h index f1bd1f5..141585a 100644 --- a/ReadReader.h +++ b/ReadReader.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "utils.h" #include "SingleRead.h" @@ -19,19 +20,21 @@ template class ReadReader { public: - ReadReader() { s = 0; indices = NULL; arr = NULL; } - ReadReader(int s, char readFs[][STRLEN]); + ReadReader() { s = 0; indices = NULL; arr = NULL; hasPolyA = false; seedLen = -1; } + ReadReader(int s, char readFs[][STRLEN], bool hasPolyA = false, int seedLen = -1); ~ReadReader(); void setIndices(ReadIndex** indices) { this->indices = indices; } - bool locate(long); // You should guarantee that indices exist and rid is valid, otherwise return false; If it fails, you should reset it manually! + bool locate(READ_INT_TYPE); // You should guarantee that indices exist and rid is valid, otherwise return false; If it fails, you should reset it manually! void reset(); bool next(ReadType& read, int flags = 7) { - return read.read(s, (std::istream**)arr, flags); + bool success = read.read(s, (std::istream**)arr, flags); + if (success && seedLen > 0) { read.calc_lq(hasPolyA, seedLen); } + return success; } private: @@ -39,10 +42,13 @@ private: ReadIndex **indices; std::ifstream** arr; std::streampos *locations; + + bool hasPolyA; + int seedLen; }; template -ReadReader::ReadReader(int s, char readFs[][STRLEN]) { +ReadReader::ReadReader(int s, char readFs[][STRLEN], bool hasPolyA, int seedLen) { assert(s > 0); this->s = s; arr = new std::ifstream*[s]; @@ -53,6 +59,8 @@ ReadReader::ReadReader(int s, char readFs[][STRLEN]) { if (!arr[i]->is_open()) { fprintf(stderr, "Cannot open %s! It may not exist.\n", readFs[i]); exit(-1); } locations[i] = arr[i]->tellg(); } + this->hasPolyA = hasPolyA; + this->seedLen = seedLen; } template @@ -71,15 +79,15 @@ ReadReader::~ReadReader() { } template -bool ReadReader::locate(long rid) { - long crid = -1; +bool ReadReader::locate(READ_INT_TYPE rid) { + READ_INT_TYPE crid = -1; ReadType read; if (indices == NULL) return false; //We should make sure that crid returned by each indices is the same for (int i = 0; i < s; i++) { - long val = indices[i]->locate(rid, *arr[i]); + READ_INT_TYPE val = indices[i]->locate(rid, *arr[i]); if (i == 0) { crid = val; } else { assert(crid == val); } } assert(crid <= rid); @@ -87,7 +95,7 @@ bool ReadReader::locate(long rid) { if (crid < rid) return false; - std::streampos tmp[s]; + std::vector tmp(s); for (int i = 0; i < s; i++) { tmp[i] = arr[i]->tellg(); } if (!read.read(s, (std::istream**)arr, 0)) return false;