]> git.donarmstrong.com Git - bamtools.git/blobdiff - BamReader.cpp
added warning for duplicate @RG tag in header
[bamtools.git] / BamReader.cpp
index a2f975f9659032bed75b5cb280b12a97e97b94df..53c32e9e1db6bf144a6c8ba6edec0a7ab2cc9d40 100644 (file)
@@ -3,7 +3,7 @@
 // Marth Lab, Department of Biology, Boston College\r
 // All rights reserved.\r
 // ---------------------------------------------------------------------------\r
-// Last modified: 14 April 2010 (DB)\r
+// Last modified: 8 June 2010 (DB)\r
 // ---------------------------------------------------------------------------\r
 // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad\r
 // Institute.\r
 using namespace BamTools;\r
 using namespace std;\r
 \r
-namespace BamTools {\r
-  struct BamAlignmentSupportData {\r
-      string   AllCharData;\r
-      uint32_t BlockLength;\r
-      uint32_t NumCigarOperations;\r
-      uint32_t QueryNameLength;\r
-      uint32_t QuerySequenceLength;\r
-  };\r
-} // namespace BamTools\r
-\r
 struct BamReader::BamReaderPrivate {\r
 \r
     // -------------------------------\r
@@ -48,7 +38,7 @@ struct BamReader::BamReaderPrivate {
     int64_t   AlignmentsBeginOffset;\r
     string    Filename;\r
     string    IndexFilename;\r
-    
+    \r
     // system data\r
     bool IsBigEndian;\r
 \r
@@ -71,7 +61,7 @@ struct BamReader::BamReaderPrivate {
     // "public" interface\r
     // -------------------------------\r
 \r
-    // flie operations\r
+    // file operations\r
     void Close(void);\r
     bool Jump(int refID, int position = 0);\r
     void Open(const string& filename, const string& indexFilename = "");\r
@@ -79,6 +69,7 @@ struct BamReader::BamReaderPrivate {
 \r
     // access alignment data\r
     bool GetNextAlignment(BamAlignment& bAlignment);\r
+    bool GetNextAlignmentCore(BamAlignment& bAlignment, BamAlignmentSupportData& supportData);\r
 \r
     // access auxiliary data\r
     int GetReferenceID(const string& refName) const;\r
@@ -148,12 +139,14 @@ bool BamReader::Rewind(void) { return d->Rewind(); }
 \r
 // access alignment data\r
 bool BamReader::GetNextAlignment(BamAlignment& bAlignment) { return d->GetNextAlignment(bAlignment); }\r
+bool BamReader::GetNextAlignmentCore(BamAlignment& bAlignment, BamAlignmentSupportData& supportData) { return d->GetNextAlignmentCore(bAlignment, supportData); }\r
 \r
 // access auxiliary data\r
 const string BamReader::GetHeaderText(void) const { return d->HeaderText; }\r
 int BamReader::GetReferenceCount(void) const { return d->References.size(); }\r
 const RefVector BamReader::GetReferenceData(void) const { return d->References; }\r
 int BamReader::GetReferenceID(const string& refName) const { return d->GetReferenceID(refName); }\r
+const std::string BamReader::GetFilename(void) const { return d->Filename; }\r
 \r
 // index operations\r
 bool BamReader::CreateIndex(void) { return d->CreateIndex(); }\r
@@ -525,7 +518,7 @@ bool BamReader::BamReaderPrivate::GetNextAlignment(BamAlignment& bAlignment) {
         // load next alignment until region overlap is found\r
         while ( !IsOverlap(bAlignment) ) {\r
             // if no valid alignment available (likely EOF) return failure\r
-            if ( !LoadNextAlignment(bAlignment, supportData) ) { return false; }\r
+            if ( !LoadNextAlignment(bAlignment, supportData) ) return false;\r
         }\r
 \r
         // return success (alignment found that overlaps region)\r
@@ -534,7 +527,35 @@ bool BamReader::BamReaderPrivate::GetNextAlignment(BamAlignment& bAlignment) {
     }\r
 \r
     // no valid alignment\r
-    else { return false; }\r
+    else \r
+        return false;\r
+}\r
+\r
+// retrieves next available alignment core data (returns success/fail)\r
+// ** DOES NOT parse any character data (bases, qualities, tag data)\r
+//    these can be accessed, if necessary, from the supportData \r
+// useful for operations requiring ONLY positional or other alignment-related information\r
+bool BamReader::BamReaderPrivate::GetNextAlignmentCore(BamAlignment& bAlignment, BamAlignmentSupportData& supportData) {\r
+\r
+    // if valid alignment available\r
+    if ( LoadNextAlignment(bAlignment, supportData) ) {\r
+\r
+        // if region not specified, return success\r
+        if ( !IsRegionSpecified ) return true;\r
+\r
+        // load next alignment until region overlap is found\r
+        while ( !IsOverlap(bAlignment) ) {\r
+            // if no valid alignment available (likely EOF) return failure\r
+            if ( !LoadNextAlignment(bAlignment, supportData) ) return false;\r
+        }\r
+\r
+        // return success (alignment found that overlaps region)\r
+        return true;\r
+    }\r
+\r
+    // no valid alignment\r
+    else\r
+        return false;\r
 }\r
 \r
 // calculate closest indexed file offset for region specified\r
@@ -614,7 +635,7 @@ void BamReader::BamReaderPrivate::InsertLinearOffset(LinearOffsetVector& offsets
                                                      const uint64_t&     lastOffset)\r
 {\r
     // get converted offsets\r
-    int beginOffset = bAlignment.Position >> BAM_LIDX_SHIFT;
+    int beginOffset = bAlignment.Position >> BAM_LIDX_SHIFT;\r
     int endOffset   = (bAlignment.GetEndPosition() - 1) >> BAM_LIDX_SHIFT;\r
 \r
     // resize vector if necessary\r
@@ -639,7 +660,7 @@ bool BamReader::BamReaderPrivate::IsOverlap(BamAlignment& bAlignment) {
     // read starts after left boundary\r
     if ( bAlignment.Position >= CurrentLeft) { return true; }\r
 \r
-    // return whether alignment end overlaps left boundary
+    // return whether alignment end overlaps left boundary\r
     return ( bAlignment.GetEndPosition() >= CurrentLeft );\r
 }\r
 \r