]> git.donarmstrong.com Git - bamtools.git/blobdiff - src/toolkit/bamtools_coverage.cpp
Fixed: bamtools coverage not flushing at end (issue #64)
[bamtools.git] / src / toolkit / bamtools_coverage.cpp
index d46ba2050b37337b96456e98ce3ae494d38d8acb..6a4493de9992a5366f12e4997cd12dffeb2adcde 100644 (file)
@@ -1,23 +1,24 @@
 // ***************************************************************************
 // bamtools_coverage.cpp (c) 2010 Derek Barnett, Erik Garrison
 // Marth Lab, Department of Biology, Boston College
-// All rights reserved.
 // ---------------------------------------------------------------------------
-// Last modified: 16 September 2010
+// Last modified: 24 July 2013
 // ---------------------------------------------------------------------------
 // Prints coverage data for a single BAM file 
 // ***************************************************************************
 
+#include "bamtools_coverage.h"
+
+#include <api/BamReader.h>
+#include <utils/bamtools_options.h>
+#include <utils/bamtools_pileup_engine.h>
+using namespace BamTools;
+
 #include <iostream>
 #include <fstream>
 #include <string>
 #include <vector>
-#include "bamtools_coverage.h"
-#include "bamtools_options.h"
-#include "bamtools_pileup_engine.h"
-#include "BamReader.h"
 using namespace std;
-using namespace BamTools; 
   
 namespace BamTools {
  
@@ -36,12 +37,8 @@ class CoverageVisitor : public PileupVisitor {
   
     // PileupVisitor interface implementation
     public:
-//         void Visit(const int& refId, const int& position, const vector<BamAlignment>& alignments) {
+       // prints coverage results ( tab-delimited )
         void Visit(const PileupPosition& pileupData) {
-            // -----------------------------------------
-            // print coverage results ( tab-delimited )
-            // <refName> <0-based pos> <number of alleles>
-//             *m_out << m_references[refId].RefName << "\t" << position << "\t" << alignments.size() << endl;
             *m_out << m_references[pileupData.RefId].RefName << "\t" 
                    << pileupData.Position << "\t" 
                    << pileupData.PileupAlignments.size() << endl;
@@ -83,8 +80,12 @@ struct CoverageTool::CoverageToolPrivate {
   
     // ctor & dtor
     public:
-        CoverageToolPrivate(CoverageTool::CoverageSettings* settings);
-        ~CoverageToolPrivate(void);
+        CoverageToolPrivate(CoverageTool::CoverageSettings* settings)
+            : m_settings(settings)
+            , m_out(cout.rdbuf())
+        { }
+
+        ~CoverageToolPrivate(void) { }
     
     // interface
     public:
@@ -97,13 +98,6 @@ struct CoverageTool::CoverageToolPrivate {
         RefVector m_references;
 };  
 
-CoverageTool::CoverageToolPrivate::CoverageToolPrivate(CoverageTool::CoverageSettings* settings)
-    : m_settings(settings)
-    , m_out(cout.rdbuf()) // default output to cout
-{ }
-
-CoverageTool::CoverageToolPrivate::~CoverageToolPrivate(void) { }  
-  
 bool CoverageTool::CoverageToolPrivate::Run(void) {  
   
     // if output filename given
@@ -113,7 +107,8 @@ bool CoverageTool::CoverageToolPrivate::Run(void) {
         // open output file stream
         outFile.open(m_settings->OutputFilename.c_str());
         if ( !outFile ) {
-            cerr << "Could not open " << m_settings->OutputFilename << " for output." << endl; 
+            cerr << "bamtools coverage ERROR: could not open " << m_settings->OutputFilename
+                 << " for output" << endl;
             return false; 
         }
         
@@ -123,10 +118,12 @@ bool CoverageTool::CoverageToolPrivate::Run(void) {
     
     //open our BAM reader
     BamReader reader;
-    if (!reader.Open(m_settings->InputBamFilename)) {
-        cerr << "Could not open " << m_settings->InputBamFilename << " for reading." << endl;
+    if ( !reader.Open(m_settings->InputBamFilename) ) {
+        cerr << "bamtools coverage ERROR: could not open input BAM file: " << m_settings->InputBamFilename << endl;
         return false;
     }
+
+    // retrieve references
     m_references = reader.GetReferenceData();
     
     // set up our output 'visitor'
@@ -140,10 +137,12 @@ bool CoverageTool::CoverageToolPrivate::Run(void) {
     BamAlignment al;    
     while ( reader.GetNextAlignment(al) ) 
         pileup.AddAlignment(al);
+    pileup.Flush();
     
     // clean up 
     reader.Close();
-    if ( m_settings->HasOutputFile ) outFile.close();
+    if ( m_settings->HasOutputFile )
+        outFile.close();
     delete cv;
     cv = 0;
     
@@ -169,6 +168,7 @@ CoverageTool::CoverageTool(void)
 }
 
 CoverageTool::~CoverageTool(void) { 
+
     delete m_settings;
     m_settings = 0;
     
@@ -186,9 +186,10 @@ int CoverageTool::Run(int argc, char* argv[]) {
     // parse command line arguments
     Options::Parse(argc, argv, 1);
     
-    // run internal ConvertTool implementation, return success/fail
+    // initialize CoverageTool with settings
     m_impl = new CoverageToolPrivate(m_settings);
     
+    // run CoverageTool, return success/fail
     if ( m_impl->Run() ) 
         return 0;
     else