From 5580b247bf3ef7b0cd1afd3aa16dc15cd7523636 Mon Sep 17 00:00:00 2001 From: Derek Date: Mon, 28 Jun 2010 15:10:28 -0400 Subject: [PATCH] Modified BamReader(and BGZF)::Open() to return bool. Tried to eliminate most exit() calls. These changes should allow for more graceful error handling. Some 'code cleanup' in BW, but no logic changes. --- BGZF.cpp | 151 +++++++++++++++++++++------------------- BGZF.h | 188 +++++++++++++++++++++++++------------------------- BGZF.o | Bin 0 -> 8336 bytes BamReader.cpp | 23 +++--- BamReader.h | 4 +- BamReader.o | Bin 0 -> 70160 bytes BamWriter.cpp | 46 ++++++------ 7 files changed, 213 insertions(+), 199 deletions(-) create mode 100644 BGZF.o create mode 100644 BamReader.o diff --git a/BGZF.cpp b/BGZF.cpp index 225ddf0..5aeb26a 100644 --- a/BGZF.cpp +++ b/BGZF.cpp @@ -1,5 +1,5 @@ // *************************************************************************** -// BGZF.cpp (c) 2009 Derek Barnett, Michael Strömberg +// BGZF.cpp (c) 2009 Derek Barnett, Michael Str�mberg // Marth Lab, Department of Biology, Boston College // All rights reserved. // --------------------------------------------------------------------------- @@ -33,31 +33,31 @@ BgzfData::BgzfData(void) CompressedBlock = new char[CompressedBlockSize]; UncompressedBlock = new char[UncompressedBlockSize]; } catch( std::bad_alloc& ba ) { - printf("ERROR: Unable to allocate memory for our BGZF object.\n"); + printf("BGZF ERROR: unable to allocate memory for our BGZF object.\n"); exit(1); } } // destructor BgzfData::~BgzfData(void) { - if(CompressedBlock) { delete[] CompressedBlock; } - if(UncompressedBlock) { delete[] UncompressedBlock; } + if( CompressedBlock ) { delete[] CompressedBlock; } + if( UncompressedBlock ) { delete[] UncompressedBlock; } } // closes BGZF file void BgzfData::Close(void) { // skip if file not open, otherwise set flag - if (!IsOpen) { return; } + if ( !IsOpen ) return; IsOpen = false; // flush the current BGZF block - if (IsWriteOnly) { FlushBlock(); } + if ( IsWriteOnly ) FlushBlock(); - // write an empty block (as EOF marker) - int blockLength = DeflateBlock(); - fwrite(CompressedBlock, 1, blockLength, Stream); - + // write an empty block (as EOF marker) + int blockLength = DeflateBlock(); + fwrite(CompressedBlock, 1, blockLength, Stream); + // flush and close fflush(Stream); fclose(Stream); @@ -82,11 +82,11 @@ int BgzfData::DeflateBlock(void) { // loop to retry for blocks that do not compress enough int inputLength = BlockOffset; int compressedLength = 0; - unsigned int bufferSize = CompressedBlockSize; + unsigned int bufferSize = CompressedBlockSize; while(true) { - - // initialize zstream values + + // initialize zstream values z_stream zs; zs.zalloc = NULL; zs.zfree = NULL; @@ -94,10 +94,10 @@ int BgzfData::DeflateBlock(void) { zs.avail_in = inputLength; zs.next_out = (Bytef*)&buffer[BLOCK_HEADER_LENGTH]; zs.avail_out = bufferSize - BLOCK_HEADER_LENGTH - BLOCK_FOOTER_LENGTH; - + // initialize the zlib compression algorithm if(deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, GZIP_WINDOW_BITS, Z_DEFAULT_MEM_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK) { - printf("ERROR: zlib deflate initialization failed.\n"); + printf("BGZF ERROR: zlib deflate initialization failed.\n"); exit(1); } @@ -111,27 +111,26 @@ int BgzfData::DeflateBlock(void) { if(status == Z_OK) { inputLength -= 1024; if(inputLength < 0) { - printf("ERROR: input reduction failed.\n"); + printf("BGZF ERROR: input reduction failed.\n"); exit(1); } continue; } - printf("ERROR: zlib deflate failed.\n"); + printf("BGZF ERROR: zlib::deflateEnd() failed.\n"); exit(1); } // finalize the compression routine if(deflateEnd(&zs) != Z_OK) { - printf("ERROR: deflate end failed.\n"); + printf("BGZF ERROR: zlib::deflateEnd() failed.\n"); exit(1); } compressedLength = zs.total_out; compressedLength += BLOCK_HEADER_LENGTH + BLOCK_FOOTER_LENGTH; - if(compressedLength > MAX_BLOCK_SIZE) { - printf("ERROR: deflate overflow.\n"); + printf("BGZF ERROR: deflate overflow.\n"); exit(1); } @@ -151,7 +150,7 @@ int BgzfData::DeflateBlock(void) { int remaining = BlockOffset - inputLength; if(remaining > 0) { if(remaining > inputLength) { - printf("ERROR: remainder too large.\n"); + printf("BGZF ERROR: after deflate, remainder too large.\n"); exit(1); } memcpy(UncompressedBlock, UncompressedBlock + inputLength, remaining); @@ -174,10 +173,10 @@ void BgzfData::FlushBlock(void) { int numBytesWritten = fwrite(CompressedBlock, 1, blockLength, Stream); if(numBytesWritten != blockLength) { - printf("ERROR: Expected to write %u bytes during flushing, but wrote %u bytes.\n", blockLength, numBytesWritten); - exit(1); - } - + printf("BGZF ERROR: expected to write %u bytes during flushing, but wrote %u bytes.\n", blockLength, numBytesWritten); + exit(1); + } + BlockAddress += blockLength; } } @@ -196,27 +195,28 @@ int BgzfData::InflateBlock(const int& blockLength) { int status = inflateInit2(&zs, GZIP_WINDOW_BITS); if (status != Z_OK) { - printf("inflateInit failed\n"); - exit(1); + printf("BGZF ERROR: could not decompress block - zlib::inflateInit() failed\n"); + return -1; } status = inflate(&zs, Z_FINISH); if (status != Z_STREAM_END) { inflateEnd(&zs); - printf("inflate failed\n"); - exit(1); + printf("BGZF ERROR: could not decompress block - zlib::inflate() failed\n"); + return -1; } status = inflateEnd(&zs); if (status != Z_OK) { - printf("inflateEnd failed\n"); - exit(1); + printf("BGZF ERROR: could not decompress block - zlib::inflateEnd() failed\n"); + return -1; } return zs.total_out; } -void BgzfData::Open(const string& filename, const char* mode) { +// opens the BGZF file for reading (mode is either "rb" for reading, or "wb" for writing) +bool BgzfData::Open(const string& filename, const char* mode) { // determine open mode if ( strcmp(mode, "rb") == 0 ) { @@ -224,45 +224,49 @@ void BgzfData::Open(const string& filename, const char* mode) { } else if ( strcmp(mode, "wb") == 0) { IsWriteOnly = true; } else { - printf("ERROR: Unknown file mode: %s\n", mode); - exit(1); + printf("BGZF ERROR: unknown file mode: %s\n", mode); + return false; + } + + // open Stream to read to/write from file, stdin, or stdout + // stdin/stdout option contributed by Aaron Quinlan (2010-Jan-03) + if ( (filename != "stdin") && (filename != "stdout") ) { + // read/write BGZF data to/from a file + Stream = fopen(filename.c_str(), mode); + } + else if ( (filename == "stdin") && (strcmp(mode, "rb") == 0 ) ) { + // read BGZF data from stdin + Stream = freopen(NULL, mode, stdin); + } + else if ( (filename == "stdout") && (strcmp(mode, "wb") == 0) ) { + // write BGZF data to stdout + Stream = freopen(NULL, mode, stdout); } - // open Stream to read to/write from file, stdin, or stdout - // stdin/stdout option contributed by Aaron Quinlan (2010-Jan-03) - if ( (filename != "stdin") && (filename != "stdout") ) { - // read/wrtie BGZF data to/from a file - Stream = fopen(filename.c_str(), mode); - } - else if ( (filename == "stdin") && (strcmp(mode, "rb") == 0 ) ) { - // read BGZF data from stdin - Stream = freopen(NULL, mode, stdin); - } - else if ( (filename == "stdout") && (strcmp(mode, "wb") == 0) ) { - // write BGZF data to stdout - Stream = freopen(NULL, mode, stdout); - } - if(!Stream) { - printf("ERROR: Unable to open the BAM file %s\n", filename.c_str() ); - exit(1); + printf("BGZF ERROR: unable to open file %s\n", filename.c_str() ); + return false; } + + // set flag, return success IsOpen = true; + return true; } +// reads BGZF data into a byte buffer int BgzfData::Read(char* data, const unsigned int dataLength) { - if (dataLength == 0) { return 0; } + if (dataLength == 0) return 0; char* output = data; unsigned int numBytesRead = 0; while (numBytesRead < dataLength) { int bytesAvailable = BlockLength - BlockOffset; - if (bytesAvailable <= 0) { - if ( ReadBlock() != 0 ) { return -1; } + if ( bytesAvailable <= 0 ) { + if (!ReadBlock()) return -1; bytesAvailable = BlockLength - BlockOffset; - if ( bytesAvailable <= 0 ) { break; } + if (bytesAvailable <= 0) break; } char* buffer = UncompressedBlock; @@ -283,7 +287,8 @@ int BgzfData::Read(char* data, const unsigned int dataLength) { return numBytesRead; } -int BgzfData::ReadBlock(void) { +// reads a BGZF block +bool BgzfData::ReadBlock(void) { char header[BLOCK_HEADER_LENGTH]; int64_t blockAddress = ftell(Stream); @@ -291,17 +296,17 @@ int BgzfData::ReadBlock(void) { int count = fread(header, 1, sizeof(header), Stream); if (count == 0) { BlockLength = 0; - return 0; + return true; } if (count != sizeof(header)) { - printf("read block failed - count != sizeof(header)\n"); - return -1; + printf("BGZF ERROR: read block failed - could not read block header\n"); + return false; } if (!BgzfData::CheckBlockHeader(header)) { - printf("read block failed - CheckBlockHeader() returned false\n"); - return -1; + printf("BGZF ERROR: read block failed - invalid block header\n"); + return false; } int blockLength = BgzfData::UnpackUnsignedShort(&header[16]) + 1; @@ -311,30 +316,33 @@ int BgzfData::ReadBlock(void) { count = fread(&compressedBlock[BLOCK_HEADER_LENGTH], 1, remaining, Stream); if (count != remaining) { - printf("read block failed - count != remaining\n"); - return -1; + printf("BGZF ERROR: read block failed - could not read data from block\n"); + return false; } count = InflateBlock(blockLength); - if (count < 0) { return -1; } + if (count < 0) { + printf("BGZF ERROR: read block failed - could not decompress block data\n"); + return false; + } - if ( BlockLength != 0 ) { + if ( BlockLength != 0 ) BlockOffset = 0; - } BlockAddress = blockAddress; BlockLength = count; - return 0; + return true; } +// seek to position in BGZF file bool BgzfData::Seek(int64_t position) { int blockOffset = (position & 0xFFFF); int64_t blockAddress = (position >> 16) & 0xFFFFFFFFFFFFLL; if (fseek(Stream, blockAddress, SEEK_SET) != 0) { - printf("ERROR: Unable to seek in BAM file\n"); - exit(1); + printf("BGZF ERROR: unable to seek in file\n"); + return false; } BlockLength = 0; @@ -343,6 +351,7 @@ bool BgzfData::Seek(int64_t position) { return true; } +// get file position in BGZF file int64_t BgzfData::Tell(void) { return ( (BlockAddress << 16) | (BlockOffset & 0xFFFF) ); } @@ -357,6 +366,7 @@ unsigned int BgzfData::Write(const char* data, const unsigned int dataLen) { // copy the data to the buffer while(numBytesWritten < dataLen) { + unsigned int copyLength = min(blockLength - BlockOffset, dataLen - numBytesWritten); char* buffer = UncompressedBlock; memcpy(buffer + BlockOffset, input, copyLength); @@ -365,9 +375,8 @@ unsigned int BgzfData::Write(const char* data, const unsigned int dataLen) { input += copyLength; numBytesWritten += copyLength; - if(BlockOffset == blockLength) { + if(BlockOffset == blockLength) FlushBlock(); - } } return numBytesWritten; diff --git a/BGZF.h b/BGZF.h index 0cca24c..29d6d14 100644 --- a/BGZF.h +++ b/BGZF.h @@ -3,7 +3,7 @@ // Marth Lab, Department of Biology, Boston College // All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 11 January 2010 (DB) +// Last modified: 22 June 2010 (DB) // --------------------------------------------------------------------------- // BGZF routines were adapted from the bgzf.c code developed at the Broad // Institute. @@ -28,18 +28,18 @@ // Platform-specific type definitions #ifndef BAMTOOLS_TYPES #define BAMTOOLS_TYPES - #ifdef _MSC_VER - typedef char int8_t; - typedef unsigned char uint8_t; - typedef short int16_t; - typedef unsigned short uint16_t; - typedef int int32_t; - typedef unsigned int uint32_t; - typedef long long int64_t; - typedef unsigned long long uint64_t; - #else - #include - #endif + #ifdef _MSC_VER + typedef char int8_t; + typedef unsigned char uint8_t; + typedef short int16_t; + typedef unsigned short uint16_t; + typedef int int32_t; + typedef unsigned int uint32_t; + typedef long long int64_t; + typedef unsigned long long uint64_t; + #else + #include + #endif #endif // BAMTOOLS_TYPES namespace BamTools { @@ -65,7 +65,9 @@ const int DEFAULT_BLOCK_SIZE = 65536; struct BgzfData { + // --------------------------------- // data members + unsigned int UncompressedBlockSize; unsigned int CompressedBlockSize; unsigned int BlockLength; @@ -77,67 +79,73 @@ struct BgzfData { char* UncompressedBlock; char* CompressedBlock; + // --------------------------------- // constructor & destructor + BgzfData(void); ~BgzfData(void); + // --------------------------------- + // main interface methods + // closes BGZF file void Close(void); - // compresses the current block - int DeflateBlock(void); - // flushes the data in the BGZF block - void FlushBlock(void); - // de-compresses the current block - int InflateBlock(const int& blockLength); // opens the BGZF file for reading (mode is either "rb" for reading, or "wb" for writing - void Open(const std::string& filename, const char* mode); + bool Open(const std::string& filename, const char* mode); // reads BGZF data into a byte buffer int Read(char* data, const unsigned int dataLength); - // reads BGZF block - int ReadBlock(void); - // seek to position in BAM file + // seek to position in BGZF file bool Seek(int64_t position); - // get file position in BAM file + // get file position in BGZF file int64_t Tell(void); // writes the supplied data into the BGZF buffer unsigned int Write(const char* data, const unsigned int dataLen); + // --------------------------------- + // internal methods + + // compresses the current block + int DeflateBlock(void); + // flushes the data in the BGZF block + void FlushBlock(void); + // de-compresses the current block + int InflateBlock(const int& blockLength); + // reads a BGZF block + bool ReadBlock(void); + + // --------------------------------- + // static 'utility' methods + // checks BGZF block header static inline bool CheckBlockHeader(char* header); // packs an unsigned integer into the specified buffer static inline void PackUnsignedInt(char* buffer, unsigned int value); // packs an unsigned short into the specified buffer static inline void PackUnsignedShort(char* buffer, unsigned short value); - - // unpacks a buffer into a signed int - static inline signed int UnpackSignedInt(char* buffer); - // unpacks a buffer into an unsigned int - static inline unsigned int UnpackUnsignedInt(char* buffer); - // unpacks a buffer into a signed short - static inline signed short UnpackSignedShort(char* buffer); - // unpacks a buffer into an unsigned short - static inline unsigned short UnpackUnsignedShort(char* buffer); // unpacks a buffer into a double static inline double UnpackDouble(char* buffer); + static inline double UnpackDouble(const char* buffer); // unpacks a buffer into a float - static inline float UnpackFloat(char* buffer); - + static inline float UnpackFloat(char* buffer); + static inline float UnpackFloat(const char* buffer); // unpacks a buffer into a signed int + static inline signed int UnpackSignedInt(char* buffer); static inline signed int UnpackSignedInt(const char* buffer); - // unpacks a buffer into an unsigned int - static inline unsigned int UnpackUnsignedInt(const char* buffer); // unpacks a buffer into a signed short + static inline signed short UnpackSignedShort(char* buffer); static inline signed short UnpackSignedShort(const char* buffer); + // unpacks a buffer into an unsigned int + static inline unsigned int UnpackUnsignedInt(char* buffer); + static inline unsigned int UnpackUnsignedInt(const char* buffer); // unpacks a buffer into an unsigned short + static inline unsigned short UnpackUnsignedShort(char* buffer); static inline unsigned short UnpackUnsignedShort(const char* buffer); - // unpacks a buffer into a double - static inline double UnpackDouble(const char* buffer); - // unpacks a buffer into a float - static inline float UnpackFloat(const char* buffer); }; // ------------------------------------------------------------- +// static 'utility' method implementations +// checks BGZF block header inline bool BgzfData::CheckBlockHeader(char* header) { return (header[0] == GZIP_ID1 && @@ -166,70 +174,64 @@ void BgzfData::PackUnsignedShort(char* buffer, unsigned short value) { buffer[1] = (char)(value >> 8); } -// 'unpacks' a buffer into a signed int +// 'unpacks' a buffer into a double (includes both non-const & const char* flavors) inline -signed int BgzfData::UnpackSignedInt(char* buffer) { - union { signed int value; unsigned char valueBuffer[sizeof(signed int)]; } un; +double BgzfData::UnpackDouble(char* buffer) { + union { double value; unsigned char valueBuffer[sizeof(double)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; un.valueBuffer[2] = buffer[2]; un.valueBuffer[3] = buffer[3]; + un.valueBuffer[4] = buffer[4]; + un.valueBuffer[5] = buffer[5]; + un.valueBuffer[6] = buffer[6]; + un.valueBuffer[7] = buffer[7]; return un.value; } -// 'unpacks' a buffer into an unsigned int inline -unsigned int BgzfData::UnpackUnsignedInt(char* buffer) { - union { unsigned int value; unsigned char valueBuffer[sizeof(unsigned int)]; } un; +double BgzfData::UnpackDouble(const char* buffer) { + union { double value; unsigned char valueBuffer[sizeof(double)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; un.valueBuffer[2] = buffer[2]; un.valueBuffer[3] = buffer[3]; + un.valueBuffer[4] = buffer[4]; + un.valueBuffer[5] = buffer[5]; + un.valueBuffer[6] = buffer[6]; + un.valueBuffer[7] = buffer[7]; return un.value; } -// 'unpacks' a buffer into a signed short -inline -signed short BgzfData::UnpackSignedShort(char* buffer) { - union { signed short value; unsigned char valueBuffer[sizeof(signed short)]; } un; - un.value = 0; - un.valueBuffer[0] = buffer[0]; - un.valueBuffer[1] = buffer[1]; - return un.value; -} - -// 'unpacks' a buffer into an unsigned short +// 'unpacks' a buffer into a float (includes both non-const & const char* flavors) inline -unsigned short BgzfData::UnpackUnsignedShort(char* buffer) { - union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)]; } un; +float BgzfData::UnpackFloat(char* buffer) { + union { float value; unsigned char valueBuffer[sizeof(float)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; + un.valueBuffer[2] = buffer[2]; + un.valueBuffer[3] = buffer[3]; return un.value; } -// 'unpacks' a buffer into a double inline -double BgzfData::UnpackDouble(char* buffer) { - union { double value; unsigned char valueBuffer[sizeof(double)]; } un; +float BgzfData::UnpackFloat(const char* buffer) { + union { float value; unsigned char valueBuffer[sizeof(float)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; un.valueBuffer[2] = buffer[2]; un.valueBuffer[3] = buffer[3]; - un.valueBuffer[4] = buffer[4]; - un.valueBuffer[5] = buffer[5]; - un.valueBuffer[6] = buffer[6]; - un.valueBuffer[7] = buffer[7]; return un.value; } -// 'unpacks' a buffer into a float +// 'unpacks' a buffer into a signed int (includes both non-const & const char* flavors) inline -float BgzfData::UnpackFloat(char* buffer) { - union { float value; unsigned char valueBuffer[sizeof(float)]; } un; +signed int BgzfData::UnpackSignedInt(char* buffer) { + union { signed int value; unsigned char valueBuffer[sizeof(signed int)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; @@ -238,9 +240,6 @@ float BgzfData::UnpackFloat(char* buffer) { return un.value; } -// --------- - -// 'unpacks' a buffer into a signed int inline signed int BgzfData::UnpackSignedInt(const char* buffer) { union { signed int value; unsigned char valueBuffer[sizeof(signed int)]; } un; @@ -252,19 +251,16 @@ signed int BgzfData::UnpackSignedInt(const char* buffer) { return un.value; } -// 'unpacks' a buffer into an unsigned int +// 'unpacks' a buffer into a signed short (includes both non-const & const char* flavors) inline -unsigned int BgzfData::UnpackUnsignedInt(const char* buffer) { - union { unsigned int value; unsigned char valueBuffer[sizeof(unsigned int)]; } un; +signed short BgzfData::UnpackSignedShort(char* buffer) { + union { signed short value; unsigned char valueBuffer[sizeof(signed short)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; - un.valueBuffer[2] = buffer[2]; - un.valueBuffer[3] = buffer[3]; return un.value; } -// 'unpacks' a buffer into a signed short inline signed short BgzfData::UnpackSignedShort(const char* buffer) { union { signed short value; unsigned char valueBuffer[sizeof(signed short)]; } un; @@ -274,41 +270,45 @@ signed short BgzfData::UnpackSignedShort(const char* buffer) { return un.value; } -// 'unpacks' a buffer into an unsigned short +// 'unpacks' a buffer into an unsigned int (includes both non-const & const char* flavors) inline -unsigned short BgzfData::UnpackUnsignedShort(const char* buffer) { - union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)]; } un; +unsigned int BgzfData::UnpackUnsignedInt(char* buffer) { + union { unsigned int value; unsigned char valueBuffer[sizeof(unsigned int)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; + un.valueBuffer[2] = buffer[2]; + un.valueBuffer[3] = buffer[3]; return un.value; } -// 'unpacks' a buffer into a double inline -double BgzfData::UnpackDouble(const char* buffer) { - union { double value; unsigned char valueBuffer[sizeof(double)]; } un; +unsigned int BgzfData::UnpackUnsignedInt(const char* buffer) { + union { unsigned int value; unsigned char valueBuffer[sizeof(unsigned int)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; un.valueBuffer[2] = buffer[2]; un.valueBuffer[3] = buffer[3]; - un.valueBuffer[4] = buffer[4]; - un.valueBuffer[5] = buffer[5]; - un.valueBuffer[6] = buffer[6]; - un.valueBuffer[7] = buffer[7]; return un.value; } -// 'unpacks' a buffer into a float +// 'unpacks' a buffer into an unsigned short (includes both non-const & const char* flavors) inline -float BgzfData::UnpackFloat(const char* buffer) { - union { float value; unsigned char valueBuffer[sizeof(float)]; } un; +unsigned short BgzfData::UnpackUnsignedShort(char* buffer) { + union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)]; } un; + un.value = 0; + un.valueBuffer[0] = buffer[0]; + un.valueBuffer[1] = buffer[1]; + return un.value; +} + +inline +unsigned short BgzfData::UnpackUnsignedShort(const char* buffer) { + union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)]; } un; un.value = 0; un.valueBuffer[0] = buffer[0]; un.valueBuffer[1] = buffer[1]; - un.valueBuffer[2] = buffer[2]; - un.valueBuffer[3] = buffer[3]; return un.value; } diff --git a/BGZF.o b/BGZF.o new file mode 100644 index 0000000000000000000000000000000000000000..b2fc10d5e058cd9e337810615236c8db5d55f434 GIT binary patch literal 8336 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 T8hg)LfpTBBY33#Avo`)Oyj7e2 literal 0 HcmV?d00001 diff --git a/BamReader.cpp b/BamReader.cpp index 41e3dc2..6ebc488 100644 --- a/BamReader.cpp +++ b/BamReader.cpp @@ -3,7 +3,7 @@ // Marth Lab, Department of Biology, Boston College // All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 17 June 2010 (DB) +// Last modified: 22 June 2010 (DB) // --------------------------------------------------------------------------- // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad // Institute. @@ -77,7 +77,7 @@ struct BamReader::BamReaderPrivate { // file operations void Close(void); bool Jump(int refID, int position = 0); - void Open(const string& filename, const string& indexFilename = ""); + bool Open(const string& filename, const string& indexFilename = ""); bool Rewind(void); bool SetRegion(const BamRegion& region); @@ -154,7 +154,7 @@ bool BamReader::Jump(int refID, int position) { d->IsRightBoundSpecified = false; return d->Jump(refID, position); } -void BamReader::Open(const string& filename, const string& indexFilename) { d->Open(filename, indexFilename); } +bool BamReader::Open(const string& filename, const string& indexFilename) { return d->Open(filename, indexFilename); } bool BamReader::Rewind(void) { return d->Rewind(); } bool BamReader::SetRegion(const BamRegion& region) { return d->SetRegion(region); } bool BamReader::SetRegion(const int& leftRefID, const int& leftBound, const int& rightRefID, const int& rightBound) { @@ -244,7 +244,7 @@ bool BamReader::BamReaderPrivate::BuildCharData(BamAlignment& bAlignment) { const char* allCharData = bAlignment.SupportData.AllCharData.data(); const char* seqData = ((const char*)allCharData) + seqDataOffset; const char* qualData = ((const char*)allCharData) + qualDataOffset; - char* tagData = ((char*)allCharData) + tagDataOffset; + char* tagData = ((char*)allCharData) + tagDataOffset; // save query sequence bAlignment.QueryBases.clear(); @@ -982,14 +982,15 @@ bool BamReader::BamReaderPrivate::LoadNextAlignment(BamAlignment& bAlignment) { bAlignment.SupportData.AllCharData.assign((const char*)allCharData, dataLength); // save CigarOps for BamAlignment + CigarOp op; bAlignment.CigarData.clear(); + bAlignment.CigarData.reserve(bAlignment.SupportData.NumCigarOperations); for (unsigned int i = 0; i < bAlignment.SupportData.NumCigarOperations; ++i) { // swap if necessary if ( IsBigEndian ) { SwapEndian_32(cigarData[i]); } // build CigarOp structure - CigarOp op; op.Length = (cigarData[i] >> BAM_CIGAR_SHIFT); op.Type = CIGAR_LOOKUP[ (cigarData[i] & BAM_CIGAR_MASK) ]; @@ -1097,13 +1098,16 @@ void BamReader::BamReaderPrivate::MergeChunks(void) { } // opens BAM file (and index) -void BamReader::BamReaderPrivate::Open(const string& filename, const string& indexFilename) { +bool BamReader::BamReaderPrivate::Open(const string& filename, const string& indexFilename) { Filename = filename; IndexFilename = indexFilename; - // open the BGZF file for reading, retrieve header text & reference data - mBGZF.Open(filename, "rb"); + // open the BGZF file for reading, return false on failure + if ( !mBGZF.Open(filename, "rb") ) + return false; + + // retrieve header text & reference data LoadHeaderData(); LoadReferenceData(); @@ -1114,6 +1118,9 @@ void BamReader::BamReaderPrivate::Open(const string& filename, const string& ind if ( !IndexFilename.empty() ) { LoadIndex(); } + + // return success + return true; } // returns BAM file pointer to beginning of alignment data diff --git a/BamReader.h b/BamReader.h index fc9a003..92de17e 100644 --- a/BamReader.h +++ b/BamReader.h @@ -3,7 +3,7 @@ // Marth Lab, Department of Biology, Boston College // All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 16 June 2010 (DB) +// Last modified: 22 June 2010 (DB) // --------------------------------------------------------------------------- // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad // Institute. @@ -41,7 +41,7 @@ class BamReader { // performs random-access jump to reference, position bool Jump(int refID, int position = 0); // opens BAM file (and optional BAM index file, if provided) - void Open(const std::string& filename, const std::string& indexFilename = ""); + bool Open(const std::string& filename, const std::string& indexFilename = ""); // returns file pointer to beginning of alignments bool Rewind(void); // sets a region of interest (with left & right bound reference/position) diff --git a/BamReader.o b/BamReader.o new file mode 100644 index 0000000000000000000000000000000000000000..d6895e1800e009b6dc1de6979e0faf5e01ae0770 GIT binary patch literal 70160 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 i{vr#%OPcienO& cigar unsigned int cigarOp; vector::const_iterator coIter; - for(coIter = cigarOperations.begin(); coIter != cigarOperations.end(); coIter++) { + for(coIter = cigarOperations.begin(); coIter != cigarOperations.end(); ++coIter) { switch(coIter->Type) { case 'M': @@ -206,17 +206,16 @@ void BamWriter::BamWriterPrivate::Open(const string& filename, const string& sam // write the SAM header text length uint32_t samHeaderLen = samHeader.size(); - if ( IsBigEndian ) { SwapEndian_32(samHeaderLen); } + if (IsBigEndian) SwapEndian_32(samHeaderLen); mBGZF.Write((char*)&samHeaderLen, BT_SIZEOF_INT); // write the SAM header text - if(samHeaderLen > 0) { + if(samHeaderLen > 0) mBGZF.Write(samHeader.data(), samHeaderLen); - } // write the number of reference sequences uint32_t numReferenceSequences = referenceSequences.size(); - if ( IsBigEndian ) { SwapEndian_32(numReferenceSequences); } + if (IsBigEndian) SwapEndian_32(numReferenceSequences); mBGZF.Write((char*)&numReferenceSequences, BT_SIZEOF_INT); // ============================= @@ -228,7 +227,7 @@ void BamWriter::BamWriterPrivate::Open(const string& filename, const string& sam // write the reference sequence name length uint32_t referenceSequenceNameLen = rsIter->RefName.size() + 1; - if ( IsBigEndian ) { SwapEndian_32(referenceSequenceNameLen); } + if (IsBigEndian) SwapEndian_32(referenceSequenceNameLen); mBGZF.Write((char*)&referenceSequenceNameLen, BT_SIZEOF_INT); // write the reference sequence name @@ -236,7 +235,7 @@ void BamWriter::BamWriterPrivate::Open(const string& filename, const string& sam // write the reference sequence length int32_t referenceLength = rsIter->RefLength; - if ( IsBigEndian ) { SwapEndian_32(referenceLength); } + if (IsBigEndian) SwapEndian_32(referenceLength); mBGZF.Write((char*)&referenceLength, BT_SIZEOF_INT); } } @@ -257,14 +256,13 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) { // write the block size unsigned int blockSize = al.SupportData.BlockLength; - if ( IsBigEndian ) { SwapEndian_32(blockSize); } + if (IsBigEndian) SwapEndian_32(blockSize); mBGZF.Write((char*)&blockSize, BT_SIZEOF_INT); // swap BAM core endian-ness, if necessary if ( IsBigEndian ) { - for ( int i = 0; i < 8; ++i ) { + for ( int i = 0; i < 8; ++i ) SwapEndian_32(buffer[i]); - } } // write the BAM core @@ -279,9 +277,9 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) { else { // initialize - const unsigned int nameLen = al.Name.size() + 1; - const unsigned int queryLen = al.QueryBases.size(); - const unsigned int tagDataLength = al.TagData.size(); + const unsigned int nameLen = al.Name.size() + 1; + const unsigned int queryLen = al.QueryBases.size(); + const unsigned int tagDataLength = al.TagData.size(); // create our packed cigar string string packedCigar; @@ -303,25 +301,25 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) { memcpy(cigarData, packedCigar.data(), packedCigarLen); for (unsigned int i = 0; i < packedCigarLen; ++i) { - if ( IsBigEndian ) { + if ( IsBigEndian ) SwapEndian_32p(&cigarData[i]); - } } mBGZF.Write(cigarData, packedCigarLen); - free(cigarData); - - } else { + free(cigarData); + } + else mBGZF.Write(packedCigar.data(), packedCigarLen); - } // write the encoded query sequence mBGZF.Write(encodedQuery.data(), encodedQueryLen); // write the base qualities - string baseQualities = al.Qualities; + string baseQualities(al.Qualities); char* pBaseQualities = (char*)al.Qualities.data(); - for(unsigned int i = 0; i < queryLen; i++) { pBaseQualities[i] -= 33; } + for(unsigned int i = 0; i < queryLen; i++) { + pBaseQualities[i] -= 33; + } mBGZF.Write(pBaseQualities, queryLen); // write the read group tag @@ -375,8 +373,8 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) { mBGZF.Write(tagData, tagDataLength); free(tagData); - } else { - mBGZF.Write(al.TagData.data(), tagDataLength); - } + } + else + mBGZF.Write(al.TagData.data(), tagDataLength); } } -- 2.39.5