]> git.donarmstrong.com Git - bamtools.git/commitdiff
Fixed: Calls to GetEndPosition() rely on CIGAR data being parsed. Previously this...
authorDerek <derekwbarnett@gmail.com>
Mon, 30 Aug 2010 19:57:55 +0000 (15:57 -0400)
committerDerek <derekwbarnett@gmail.com>
Mon, 30 Aug 2010 20:03:05 +0000 (16:03 -0400)
src/api/BamReader.cpp

index b1b1b5de2ab79a76416bd5267f6dc5cc1ecccd02..10aaa5e405045475bc44d5e66b3668a6d90f7025 100644 (file)
@@ -3,7 +3,7 @@
 // Marth Lab, Department of Biology, Boston College\r
 // All rights reserved.\r
 // ---------------------------------------------------------------------------\r
-// Last modified: 15 July 2010 (DB)\r
+// Last modified: 30 August 2010 (DB)\r
 // ---------------------------------------------------------------------------\r
 // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad\r
 // Institute.\r
@@ -196,7 +196,7 @@ bool BamReader::BamReaderPrivate::BuildCharData(BamAlignment& bAlignment) {
   \r
     // calculate character lengths/offsets\r
     const unsigned int dataLength      = bAlignment.SupportData.BlockLength - BAM_CORE_SIZE;\r
-    const unsigned int cigarDataOffset = bAlignment.SupportData.QueryNameLength;\r
+//     const unsigned int cigarDataOffset = bAlignment.SupportData.QueryNameLength;\r
     const unsigned int seqDataOffset   = bAlignment.SupportData.QueryNameLength + (bAlignment.SupportData.NumCigarOperations * 4);\r
     const unsigned int qualDataOffset  = seqDataOffset + (bAlignment.SupportData.QuerySequenceLength+1)/2;\r
     const unsigned int tagDataOffset   = qualDataOffset + bAlignment.SupportData.QuerySequenceLength;\r
@@ -204,31 +204,30 @@ bool BamReader::BamReaderPrivate::BuildCharData(BamAlignment& bAlignment) {
       \r
     // set up char buffers\r
     const char*     allCharData = bAlignment.SupportData.AllCharData.data();\r
-          uint32_t* cigarData   = (uint32_t*)(allCharData + cigarDataOffset);\r
+//           uint32_t* cigarData   = (uint32_t*)(allCharData + cigarDataOffset);\r
     const char*     seqData     = ((const char*)allCharData) + seqDataOffset;\r
     const char*     qualData    = ((const char*)allCharData) + qualDataOffset;\r
           char*     tagData     = ((char*)allCharData) + tagDataOffset;\r
   \r
-    // store alignment name (depends on null char as terminator)\r
+    // store alignment name (relies on null char in name as terminator)\r
     bAlignment.Name.assign((const char*)(allCharData));    \r
           \r
-    // save CigarOps \r
-    CigarOp op;\r
-    bAlignment.CigarData.clear();\r
-    bAlignment.CigarData.reserve(bAlignment.SupportData.NumCigarOperations);\r
-    for (unsigned int i = 0; i < bAlignment.SupportData.NumCigarOperations; ++i) {\r
-\r
-        // swap if necessary\r
-        if ( IsBigEndian ) { SwapEndian_32(cigarData[i]); }\r
-      \r
-        // build CigarOp structure\r
-        op.Length = (cigarData[i] >> BAM_CIGAR_SHIFT);\r
-        op.Type   = CIGAR_LOOKUP[ (cigarData[i] & BAM_CIGAR_MASK) ];\r
-\r
-        // save CigarOp\r
-        bAlignment.CigarData.push_back(op);\r
-    }\r
-          \r
+//     // save CigarOps \r
+//     CigarOp op;\r
+//     bAlignment.CigarData.clear();\r
+//     bAlignment.CigarData.reserve(bAlignment.SupportData.NumCigarOperations);\r
+//     for (unsigned int i = 0; i < bAlignment.SupportData.NumCigarOperations; ++i) {\r
+// \r
+//         // swap if necessary\r
+//         if ( IsBigEndian ) { SwapEndian_32(cigarData[i]); }\r
+//       \r
+//         // build CigarOp structure\r
+//         op.Length = (cigarData[i] >> BAM_CIGAR_SHIFT);\r
+//         op.Type   = CIGAR_LOOKUP[ (cigarData[i] & BAM_CIGAR_MASK) ];\r
+// \r
+//         // save CigarOp\r
+//         bAlignment.CigarData.push_back(op);\r
+//     }\r
           \r
     // save query sequence\r
     bAlignment.QueryBases.clear();\r
@@ -663,6 +662,27 @@ bool BamReader::BamReaderPrivate::LoadNextAlignment(BamAlignment& bAlignment) {
         \r
         // set success flag\r
         readCharDataOK = true;\r
+        \r
+        // save CIGAR ops \r
+        // need to calculate this here so that  BamAlignment::GetEndPosition() performs correctly, \r
+        // even when BamReader::GetNextAlignmentCore() is called \r
+        const unsigned int cigarDataOffset = bAlignment.SupportData.QueryNameLength;\r
+        uint32_t* cigarData = (uint32_t*)(allCharData + cigarDataOffset);\r
+        CigarOp op;\r
+        bAlignment.CigarData.clear();\r
+        bAlignment.CigarData.reserve(bAlignment.SupportData.NumCigarOperations);\r
+        for (unsigned int i = 0; i < bAlignment.SupportData.NumCigarOperations; ++i) {\r
+\r
+            // swap if necessary\r
+            if ( IsBigEndian ) SwapEndian_32(cigarData[i]);\r
+          \r
+            // build CigarOp structure\r
+            op.Length = (cigarData[i] >> BAM_CIGAR_SHIFT);\r
+            op.Type   = CIGAR_LOOKUP[ (cigarData[i] & BAM_CIGAR_MASK) ];\r
+\r
+            // save CigarOp\r
+            bAlignment.CigarData.push_back(op);\r
+        }\r
     }\r
 \r
     free(allCharData);\r