void bam_likes_destroy(){ // fprintf(stderr,"bam_likes_destroy\n"); if(mod!=NULL) errmod_destroy(mod); }
int main_ld(int argc, char *argv[]) { int chr; //! chromosome identifier int beg; //! beginning coordinate for analysis int end; //! end coordinate for analysis int ref; //! ref long num_windows; //! number of windows std::string msg; //! string for error message bam_plbuf_t *buf; //! pileup buffer ldData t; // parse the command line options std::string region = t.parseCommandLine(argc, argv); // check input BAM file for errors t.checkBAM(); // initialize the sample data structure t.bam_smpl_init(); // add samples t.bam_smpl_add(); // initialize error model t.em = errmod_init(1.0-0.83); // parse genomic region int k = bam_parse_region(t.h, region, &chr, &beg, &end); if (k < 0) { msg = "Bad genome coordinates: " + region; fatal_error(msg, __FILE__, __LINE__, 0); } // fetch reference sequence t.ref_base = faidx_fetch_seq(t.fai_file, t.h->target_name[chr], 0, 0x7fffffff, &(t.len)); // calculate the number of windows if (t.flag & BAM_WINDOW) num_windows = ((end-beg)-1)/t.win_size; else { t.win_size = (end-beg); num_windows = 1; } // iterate through all windows along specified genomic region for (long cw=0; cw < num_windows; cw++) { // construct genome coordinate string std::string scaffold_name(t.h->target_name[chr]); std::ostringstream winc(scaffold_name); winc.seekp(0, std::ios::end); winc << ":" << beg+(cw*t.win_size)+1 << "-" << ((cw+1)*t.win_size)+(beg-1); std::string winCoord = winc.str(); // initialize number of sites to zero t.num_sites = 0; // parse the BAM file and check if region is retrieved from the reference if (t.flag & BAM_WINDOW) { k = bam_parse_region(t.h, winCoord, &ref, &(t.beg), &(t.end)); if (k < 0) { msg = "Bad window coordinates " + winCoord; fatal_error(msg, __FILE__, __LINE__, 0); } } else { ref = chr; t.beg = beg; t.end = end; if (ref < 0) { msg = "Bad scaffold name: " + region; fatal_error(msg, __FILE__, __LINE__, 0); } } // initialize nucdiv variables t.init_ld(); // create population assignments t.assign_pops(); // initialize pileup buf = bam_plbuf_init(make_ld, &t); // fetch region from bam file if ((bam_fetch(t.bam_in->x.bam, t.idx, ref, t.beg, t.end, buf, fetch_func)) < 0) { msg = "Failed to retrieve region " + region + " due to corrupted BAM index file"; fatal_error(msg, __FILE__, __LINE__, 0); } // finalize pileup bam_plbuf_push(0, buf); // calculate linkage disequilibrium statistics ld_func fp[3] = {&ldData::calc_zns, &ldData::calc_omegamax, &ldData::calc_wall}; (t.*fp[t.output])(); // print results to stdout t.print_ld(chr); // take out the garbage t.destroy_ld(); bam_plbuf_destroy(buf); } // end of window interation errmod_destroy(t.em); samclose(t.bam_in); bam_index_destroy(t.idx); t.bam_smpl_destroy(); free(t.ref_base); return 0; }