I am trying to open .bam files in C++ to extract reads occurring at specific scaffolds and loci. I essentially want to call "samtools view sample.bam -o sample.sam scaffold:pos-pos" from C++. I have tried system("samtools view sample.bam -o sample.sam scaffold:pos-pos") and can explain the issues if you want to know, but for the sake of conciseness I will leave the details out of this post. So, I am using SeqAn. When I run my script, I get the following error:
terminate called after throwing an instance of 'seqan::UnknownExtensionError'
what(): Unknown file extension of copyPolly_SRR6511930.bam: iostream error
I am running my program on my institution's supercomputer clusters (Texas A&M Terra cluster), to which I do not have sudo access. I have loaded the following modules:
GCC/9.3.0
SeqAn/2.4.0-GCCcore-9.3.0
zlib/1.2.11-GCCcore-9.3.0
Here is my minimal script:
#include <seqan/bam_io.h>
#include <zlib.h>
using namespace seqan;
int main(){
CharString bamFileName = "copyPolly_SRR6511930.bam";
// Open input file.
BamFileIn bamFileIn(toCString(bamFileName));
if (!open(bamFileIn, toCString(bamFileName))){
std::cerr << "ERROR: Could not open " << bamFileName << std::endl;
return 1;
}
unsigned numUnmappedReads = 0;
try{
// Read header.
BamHeader header;
readHeader(header, bamFileIn);
// Read records.
BamAlignmentRecord record;
while (!atEnd(bamFileIn)){
readRecord(record, bamFileIn);
if (hasFlagUnmapped(record))
numUnmappedReads += 1;
}
}
catch (Exception const & e)
{
std::cout << "ERROR: " << e.what() << std::endl;
return 1;
}
return 0;
}
I have tried the following solutions:
-Adding #define SEQAN_HAS_ZLIB (1)
to my script's header
-Adding -D SEQAN_HAS_ZLIB
to my compilation such that it reads g++ script.cpp -D SEQAN_HAS_ZLIB
-Adding -lz
to my compilation such that it reads g++ script.cpp -lz
I am not dead-set on using SeqAn for this project, so if anyone knows of another C++ library which extracts specific reads from .bam files, please share.
Update: I've never used HTSlib and it seems to have a fairly steep learning curve, so if anyone has an answer for the SeqAn error, that would still be very much appreciated.