\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
}\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
}\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
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