]> git.donarmstrong.com Git - bamtools.git/blobdiff - BamWriter.cpp
added warning for duplicate @RG tag in header
[bamtools.git] / BamWriter.cpp
index 2cd2742dce5c5acc9a679927cb06af5e88bdeb63..9d18fae6ba616b1d243913e7e07c4a55c70a88b4 100644 (file)
@@ -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
@@ -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