void BedIntersectPE::IntersectBamPE(string bamFile) { // load the "B" bed file into a map so // that we can easily compare "A" to it for overlaps _bedB->loadBedFileIntoMap(); // open the BAM file BamReader reader; BamWriter writer; reader.Open(bamFile); // get header & reference information string bamHeader = reader.GetHeaderText(); RefVector refs = reader.GetReferenceData(); // open a BAM output to stdout if we are writing BAM if (_bamOutput == true) { // set compression mode BamWriter::CompressionMode compressionMode = BamWriter::Compressed; if ( _isUncompressedBam ) compressionMode = BamWriter::Uncompressed; writer.SetCompressionMode(compressionMode); // open our BAM writer writer.Open("stdout", bamHeader, refs); } // track the previous and current sequence // names so that we can identify blocks of // alignments for a given read ID. string prevName, currName; prevName = currName = ""; vector<BamAlignment> alignments; // vector of BAM alignments for a given ID in a BAM file. alignments.reserve(100); _bedA->bedType = 10; // it's a full BEDPE given it's BAM // rip through the BAM file and convert each mapped entry to BEDPE BamAlignment bam1, bam2; while (reader.GetNextAlignment(bam1)) { // the alignment must be paired if (bam1.IsPaired() == true) { // grab the second alignment for the pair. reader.GetNextAlignment(bam2); // require that the alignments are from the same query if (bam1.Name == bam2.Name) { ProcessBamBlock(bam1, bam2, refs, writer); } else { cerr << "*****ERROR: -bedpe requires BAM to be sorted or grouped by query name. " << endl; exit(1); } } } // close up reader.Close(); if (_bamOutput == true) { writer.Close(); } }
void BedIntersectPE::IntersectBamPE(string bamFile) { // load the "B" bed file into a map so // that we can easily compare "A" to it for overlaps _bedB->loadBedFileIntoMap(); // open the BAM file BamReader reader; BamWriter writer; reader.Open(bamFile); // get header & reference information string bamHeader = reader.GetHeaderText(); RefVector refs = reader.GetReferenceData(); // open a BAM output to stdout if we are writing BAM if (_bamOutput == true) { // set compression mode BamWriter::CompressionMode compressionMode = BamWriter::Compressed; if ( _isUncompressedBam ) compressionMode = BamWriter::Uncompressed; writer.SetCompressionMode(compressionMode); // open our BAM writer writer.Open("stdout", bamHeader, refs); } // track the previous and current sequence // names so that we can identify blocks of // alignments for a given read ID. string prevName, currName; prevName = currName = ""; vector<BamAlignment> alignments; // vector of BAM alignments for a given ID in a BAM file. alignments.reserve(100); _bedA->bedType = 10; // it's a full BEDPE given it's BAM // rip through the BAM file and convert each mapped entry to BEDPE BamAlignment bam1, bam2; while (reader.GetNextAlignment(bam1)) { reader.GetNextAlignment(bam2); if (bam1.Name != bam2.Name) { while (bam1.Name != bam2.Name) { if (bam1.IsPaired()) { cerr << "*****WARNING: Query " << bam1.Name << " is marked as paired, but it's mate does not occur" << " next to it in your BAM file. Skipping. " << endl; } bam1 = bam2; reader.GetNextAlignment(bam2); } } else if (bam1.IsPaired() && bam1.IsPaired()) { ProcessBamBlock(bam1, bam2, refs, writer); } } // close up reader.Close(); if (_bamOutput == true) { writer.Close(); } }