/** * \brief TODO */ bool Exon::sameRegion(const GenomicRegion &r) const { return ((r.get_chrom() == this->region.get_chrom()) && (r.get_start() == this->region.get_start()) && (r.get_end() == this->region.get_end()) && (r.get_strand() == this->region.get_strand())); }
void merge(istream &cpg_stream, ostream &dmr_stream, double cutoff) { bool skipped_last_cpg, sig_raw; GenomicRegion dmr; dmr.set_name("dmr"); size_t dmr_test_cov = 0; size_t dmr_test_meth = 0; size_t dmr_rest_cov = 0; size_t dmr_rest_meth = 0; size_t test_cov = 0; size_t test_meth = 0; size_t rest_cov = 0; size_t rest_meth = 0; // Find the first significant CpG, or terminate the function if none exist. if (!read_next_significant_cpg(cpg_stream, dmr, cutoff, skipped_last_cpg, sig_raw, test_cov, test_meth, rest_cov, rest_meth)) return; dmr.set_score(sig_raw); dmr_test_cov += test_cov; dmr_test_meth += test_meth; dmr_rest_cov += rest_cov; dmr_rest_meth += rest_meth; GenomicRegion cpg; cpg.set_name("dmr"); while(read_next_significant_cpg(cpg_stream, cpg, cutoff, skipped_last_cpg, sig_raw, test_cov, test_meth, rest_cov, rest_meth)) { if (skipped_last_cpg || cpg.get_chrom() != dmr.get_chrom()) { if (dmr.get_score() != 0) dmr_stream << dmr.get_chrom() << '\t' << dmr.get_start() << '\t' << dmr.get_end() << '\t' << dmr.get_name() << '\t' << dmr.get_score() << '\t' << double(dmr_test_meth)/dmr_test_cov - double(dmr_rest_meth)/dmr_rest_cov << std::endl; dmr = cpg; dmr.set_score(sig_raw); dmr_test_cov = test_cov; dmr_test_meth = test_meth; dmr_rest_cov = rest_cov; dmr_rest_meth = rest_meth; } else { dmr.set_end(cpg.get_end()); dmr.set_score(dmr.get_score() + sig_raw); dmr_test_cov += test_cov; dmr_test_meth += test_meth; dmr_rest_cov += rest_cov; dmr_rest_meth += rest_meth; } } dmr_stream << dmr << std::endl; }
/** * \brief Does this exon partially overlap the given genomic region? This * function doesn't consider an exact region match (i.e. same chrom, * start, end, and strand) to be a 'partial overlap'. */ bool Exon::partialOverlap(const GenomicRegion &r) const { if (r.get_chrom() != this->region.get_chrom()) return false; if (r.get_strand() != this->region.get_strand()) return false; // by now they must be one the same chromosome and strand... first see if // they match exactly if ((r.get_start() == this->region.get_start()) && (r.get_end() == this->region.get_end())) return false; // not an exact match return (r.overlaps(this->region)); }
static void convert_coordinates(const unordered_map<size_t, size_t> &cpgs, GenomicRegion ®ion) { const unordered_map<size_t, size_t>::const_iterator start_itr(cpgs.find(region.get_start())); const unordered_map<size_t, size_t>::const_iterator end_itr(cpgs.find(region.get_end())); if (start_itr == cpgs.end() || end_itr == cpgs.end()) throw runtime_error("could not convert:\n" + region.tostring()); region.set_start(start_itr->second); region.set_end(end_itr->second); }
static bool precedes(const string &chrom, const size_t position, const GenomicRegion &r) { return chrom < r.get_chrom() || (chrom == r.get_chrom() && position < r.get_start()); }
static inline bool start_leq(const GenomicRegion &a, const GenomicRegion &b) { return a.get_start() <= b.get_start(); }