#include #include #include #include #include #include #include #include #include #include "split.h" #include "Utility.h" #include "BedReader.h" #include "Logging.h" #include using namespace std; vector BedReader::entries(void) { vector entries; if (!is_open()) { cerr << "bed targets file is not open" << endl; exit(1); } string line; while (std::getline(*this, line)) { // BED is base-numbered, 0-origin, half-open. This parse turns that // into base-numbered, 0-origin, fully-closed for internal use. All // coordinates used internally should be in the latter, and coordinates // from the user in the former should be converted immediately to the // internal format. if (line.at(0)=='#'){ continue; } vector fields = split(line, " \t"); BedTarget entry(strip(fields[0]), atoi(strip(fields[1]).c_str()), atoi(strip(fields[2]).c_str()) - 1, // use inclusive format internally (fields.size() >= 4) ? strip(fields[3]) : ""); entries.push_back(entry); } return entries; } bool BedReader::targetsContained(string& seq, long left, long right) { vector > results = intervals[seq].findContained(left, right); return !results.empty(); } bool BedReader::targetsOverlap(string& seq, long left, long right) { vector > results = intervals[seq].findOverlapping(left, right); return !results.empty(); } vector BedReader::targetsContaining(BedTarget& target) { vector > results = intervals[target.seq].findContained(target.left, target.right); vector contained; for (vector >::iterator r = results.begin(); r != results.end(); ++r) { contained.push_back(r->value); } return contained; } vector BedReader::targetsOverlapping(BedTarget& target) { vector > results = intervals[target.seq].findOverlapping(target.left, target.right); vector overlapping; for (vector >::iterator r = results.begin(); r != results.end(); ++r) { overlapping.push_back(r->value); } return overlapping; }