]> git.donarmstrong.com Git - bamtools.git/blobdiff - BamReader.cpp
json output
[bamtools.git] / BamReader.cpp
index ff20c11df3447588785cc8016c840b93363329f2..7213b237d753f18399e5f1379800492e0f943b7d 100644 (file)
@@ -3,7 +3,7 @@
 // Marth Lab, Department of Biology, Boston College\r
 // All rights reserved.\r
 // ---------------------------------------------------------------------------\r
-// Last modified: 6 April 2010 (DB)\r
+// Last modified: 14 April 2010 (DB)\r
 // ---------------------------------------------------------------------------\r
 // Uses BGZF routines were adapted from the bgzf.c code developed at the Broad\r
 // Institute.\r
@@ -39,7 +39,7 @@ struct BamReader::BamReaderPrivate {
     // data members\r
     // -------------------------------\r
 \r
-    // general data\r
+    // general file data\r
     BgzfData  mBGZF;\r
     string    HeaderText;\r
     BamIndex  Index;\r
@@ -49,6 +49,7 @@ struct BamReader::BamReaderPrivate {
     string    Filename;\r
     string    IndexFilename;\r
     \r
+    // system data\r
     bool IsBigEndian;\r
 \r
     // user-specified region values\r
@@ -70,7 +71,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
@@ -95,8 +96,6 @@ struct BamReader::BamReaderPrivate {
     int BinsFromRegion(int refID, int left, uint16_t[MAX_BIN]);\r
     // fills out character data for BamAlignment data\r
     bool BuildCharData(BamAlignment& bAlignment, const BamAlignmentSupportData& supportData);\r
-    // calculates alignment end position based on starting position and provided CIGAR operations\r
-    int CalculateAlignmentEnd(const int& position, const std::vector<CigarOp>& cigarData);\r
     // calculate file offset for first alignment chunk overlapping 'left'\r
     int64_t GetOffset(int refID, int left);\r
     // checks to see if alignment overlaps current region\r
@@ -155,6 +154,7 @@ const string BamReader::GetHeaderText(void) const { return d->HeaderText; }
 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
@@ -465,24 +465,6 @@ bool BamReader::BamReaderPrivate::BuildIndex(void) {
     return Rewind();\r
 }\r
 \r
-// calculates alignment end position based on starting position and provided CIGAR operations\r
-int BamReader::BamReaderPrivate::CalculateAlignmentEnd(const int& position, const vector<CigarOp>& cigarData) {\r
-\r
-    // initialize alignment end to starting position\r
-    int alignEnd = position;\r
-\r
-    // iterate over cigar operations\r
-    vector<CigarOp>::const_iterator cigarIter = cigarData.begin();\r
-    vector<CigarOp>::const_iterator cigarEnd  = cigarData.end();\r
-    for ( ; cigarIter != cigarEnd; ++cigarIter) {\r
-        char cigarType = (*cigarIter).Type;\r
-        if ( cigarType == 'M' || cigarType == 'D' || cigarType == 'N' ) {\r
-            alignEnd += (*cigarIter).Length;\r
-        }\r
-    }\r
-    return alignEnd;\r
-}\r
-\r
 \r
 // clear index data structure\r
 void BamReader::BamReaderPrivate::ClearIndex(void) {\r
@@ -634,7 +616,7 @@ void BamReader::BamReaderPrivate::InsertLinearOffset(LinearOffsetVector& offsets
 {\r
     // get converted offsets\r
     int beginOffset = bAlignment.Position >> BAM_LIDX_SHIFT;\r
-    int endOffset   = ( CalculateAlignmentEnd(bAlignment.Position, bAlignment.CigarData) - 1) >> BAM_LIDX_SHIFT;\r
+    int endOffset   = (bAlignment.GetEndPosition() - 1) >> BAM_LIDX_SHIFT;\r
 \r
     // resize vector if necessary\r
     int oldSize = offsets.size();\r
@@ -659,7 +641,7 @@ bool BamReader::BamReaderPrivate::IsOverlap(BamAlignment& bAlignment) {
     if ( bAlignment.Position >= CurrentLeft) { return true; }\r
 \r
     // return whether alignment end overlaps left boundary\r
-    return ( CalculateAlignmentEnd(bAlignment.Position, bAlignment.CigarData) >= CurrentLeft );\r
+    return ( bAlignment.GetEndPosition() >= CurrentLeft );\r
 }\r
 \r
 // jumps to specified region(refID, leftBound) in BAM file, returns success/fail\r
@@ -894,12 +876,10 @@ bool BamReader::BamReaderPrivate::LoadNextAlignment(BamAlignment& bAlignment, Ba
     else {\r
      \r
         // store alignment name and length\r
-//         bAlignment.Name.clear();\r
         bAlignment.Name.assign((const char*)(allCharData));\r
         bAlignment.Length = supportData.QuerySequenceLength;\r
       \r
         // store remaining 'allCharData' in supportData structure\r
-//         supportData.AllCharData.clear();\r
         supportData.AllCharData.assign((const char*)allCharData, dataLength);\r
         \r
         // save CigarOps for BamAlignment\r