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; }