示例#1
0
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;
}