]> git.donarmstrong.com Git - bamtools.git/blobdiff - BamWriter.cpp
added warning for duplicate @RG tag in header
[bamtools.git] / BamWriter.cpp
index 075989a6f015a09340a9392d856a37ed0914ce30..9d18fae6ba616b1d243913e7e07c4a55c70a88b4 100644 (file)
@@ -3,7 +3,7 @@
 // Marth Lab, Department of Biology, Boston College\r
 // All rights reserved.\r
 // ---------------------------------------------------------------------------\r
-// Last modified: 29 March 2010 (DB)\r
+// Last modified: 30 March 2010 (DB)\r
 // ---------------------------------------------------------------------------\r
 // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad\r
 // Institute.\r
@@ -35,12 +35,13 @@ struct BamWriter::BamWriterPrivate {
 \r
     // "public" interface\r
     void Close(void);\r
-    void Open(const std::string& filename, const std::string& samHeader, const BamTools::RefVector& referenceSequences);\r
-    void SaveAlignment(const BamTools::BamAlignment& al);\r
+    void Open(const string& filename, const string& samHeader, const RefVector& referenceSequences);\r
+    void SaveAlignment(const BamAlignment& al);\r
+    void SaveAlignment(const BamAlignment& al, const BamAlignmentSupportData& supportData);\r
 \r
     // internal methods\r
-    void CreatePackedCigar(const std::vector<CigarOp>& cigarOperations, std::string& packedCigar);\r
-    void EncodeQuerySequence(const std::string& query, std::string& encodedQuery);\r
+    void CreatePackedCigar(const vector<CigarOp>& cigarOperations, string& packedCigar);\r
+    void EncodeQuerySequence(const string& query, string& encodedQuery);\r
 };\r
 \r
 // -----------------------------------------------------\r
@@ -59,8 +60,8 @@ BamWriter::~BamWriter(void) {
 }\r
 \r
 // closes the alignment archive\r
-void BamWriter::Close(void) {\r
-    d->Close();\r
+void BamWriter::Close(void) { \r
+  d->Close(); \r
 }\r
 \r
 // opens the alignment archive\r
@@ -69,10 +70,14 @@ void BamWriter::Open(const string& filename, const string& samHeader, const RefV
 }\r
 \r
 // saves the alignment to the alignment archive\r
-void BamWriter::SaveAlignment(const BamAlignment& al) {\r
+void BamWriter::SaveAlignment(const BamAlignment& al) { \r
     d->SaveAlignment(al);\r
 }\r
 \r
+void BamWriter::SaveAlignment(const BamAlignment& al, const BamAlignmentSupportData& supportData) {\r
+    d->SaveAlignment(al, supportData);\r
+}\r
+\r
 // -----------------------------------------------------\r
 // BamWriterPrivate implementation\r
 // -----------------------------------------------------\r
@@ -305,7 +310,7 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) {
         \r
         for (unsigned int i = 0; i < packedCigarLen; ++i) {\r
             if ( IsBigEndian ) { \r
-              SwapEndian_32(cigarData[i]); \r
+              SwapEndian_32p(&cigarData[i]); \r
             }\r
         }\r
         \r
@@ -332,7 +337,7 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) {
         memcpy(tagData, al.TagData.data(), tagDataLength);\r
       \r
         int i = 0;\r
-        while ( i < tagDataLength ) {\r
+        while ( (unsigned int)i < tagDataLength ) {\r
             \r
             i += 2;                                 // skip tag type (e.g. "RG", "NM", etc)\r
             uint8_t type = toupper(tagData[i]);     // lower & upper case letters have same meaning \r
@@ -380,3 +385,34 @@ void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al) {
         mBGZF.Write(al.TagData.data(), tagDataLength);\r
     }\r
 }\r
+\r
+void BamWriter::BamWriterPrivate::SaveAlignment(const BamAlignment& al, const BamAlignmentSupportData& supportData) {\r
+  \r
+    // assign the BAM core data\r
+    uint32_t buffer[8];\r
+    buffer[0] = al.RefID;\r
+    buffer[1] = al.Position;\r
+    buffer[2] = (al.Bin << 16) | (al.MapQuality << 8) | supportData.QueryNameLength;\r
+    buffer[3] = (al.AlignmentFlag << 16) | supportData.NumCigarOperations;\r
+    buffer[4] = supportData.QuerySequenceLength;\r
+    buffer[5] = al.MateRefID;\r
+    buffer[6] = al.MatePosition;\r
+    buffer[7] = al.InsertSize;\r
+\r
+    // write the block size\r
+    unsigned int blockSize = supportData.BlockLength;\r
+    if ( IsBigEndian ) { SwapEndian_32(blockSize); }\r
+    mBGZF.Write((char*)&blockSize, BT_SIZEOF_INT);\r
+\r
+    // write the BAM core\r
+    if ( IsBigEndian ) { \r
+        for ( int i = 0; i < 8; ++i ) { \r
+            SwapEndian_32(buffer[i]); \r
+        } \r
+    }\r
+    mBGZF.Write((char*)&buffer, BAM_CORE_SIZE);\r
+\r
+    // write the raw char data\r
+    mBGZF.Write((char*)supportData.AllCharData.data(), supportData.BlockLength-BAM_CORE_SIZE);\r
+}\r
+\r