// ***************************************************************************
-// bamtools_cpp (c) 2010 Derek Barnett, Alistair Ward
+// bamtools_revert.cpp (c) 2010 Derek Barnett, Alistair Ward
// Marth Lab, Department of Biology, Boston College
-// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 5 December 2010
+// Last modified: 7 April 2011
// ---------------------------------------------------------------------------
-// Prints general alignment statistics for BAM file(s).
+// Removes duplicate marks and restores original base qualities
// ***************************************************************************
+#include "bamtools_revert.h"
+
+#include <api/BamReader.h>
+#include <api/BamWriter.h>
+#include <utils/bamtools_options.h>
+#include <utils/bamtools_utilities.h>
+using namespace BamTools;
+
#include <iostream>
#include <string>
-#include "bamtools_revert.h"
-#include "bamtools_options.h"
-#include "bamtools_utilities.h"
-#include "BamReader.h"
-#include "BamWriter.h"
using namespace std;
-using namespace BamTools;
+
+namespace BamTools {
+
+static const string OQ_TAG = "OQ";
+
+} // namespace BamTools;
// ---------------------------------------------
// RevertSettings implementation
// constructor
RevertSettings(void)
: HasInput(false)
- , HasOutput(false)
- , IsForceCompression(false)
- , IsKeepDuplicateFlag(false)
- , IsKeepQualities(false)
- , InputFilename(Options::StandardIn())
- , OutputFilename(Options::StandardOut())
+ , HasOutput(false)
+ , IsForceCompression(false)
+ , IsKeepDuplicateFlag(false)
+ , IsKeepQualities(false)
+ , InputFilename(Options::StandardIn())
+ , OutputFilename(Options::StandardOut())
{ }
};
// ctor & dtor
public:
- RevertToolPrivate(RevertTool::RevertSettings* settings);
- ~RevertToolPrivate(void);
+ RevertToolPrivate(RevertTool::RevertSettings* settings)
+ : m_settings(settings)
+ { }
+ ~RevertToolPrivate(void) { }
// 'public' interface
public:
// internal methods
private:
- void RevertAlignment(BamAlignment& al);
+ void RevertAlignment(BamAlignment& al);
// data members
private:
RevertTool::RevertSettings* m_settings;
- string m_OQ;
};
-RevertTool::RevertToolPrivate::RevertToolPrivate(RevertTool::RevertSettings* settings)
- : m_settings(settings)
- , m_OQ("OQ")
-{ }
-
-RevertTool::RevertToolPrivate::~RevertToolPrivate(void) { }
-
-// reverts a BAM alignment
-// default behavior (for now) is : replace Qualities with OQ, clear IsDuplicate flag
+// 'reverts' a BAM alignment
+// default behavior (for now) is:
+// 1 - replace Qualities with OQ contents
+// 2 - clear IsDuplicate flag
// can override default behavior using command line options
void RevertTool::RevertToolPrivate::RevertAlignment(BamAlignment& al) {
- // replace Qualities with OQ, if requested
+ // replace Qualities with OQ contents, if requested
if ( !m_settings->IsKeepQualities ) {
- string originalQualities;
- if ( al.GetTag(m_OQ, originalQualities) ) {
- al.Qualities = originalQualities;
- al.RemoveTag(m_OQ);
- }
+ string originalQualities;
+ if ( al.GetTag(OQ_TAG, originalQualities) ) {
+ al.Qualities = originalQualities;
+ al.RemoveTag(OQ_TAG);
+ }
}
// clear duplicate flag, if requested
if ( !m_settings->IsKeepDuplicateFlag )
- al.SetIsDuplicate(false);
+ al.SetIsDuplicate(false);
}
bool RevertTool::RevertToolPrivate::Run(void) {
// opens the BAM file without checking for indexes
BamReader reader;
if ( !reader.Open(m_settings->InputFilename) ) {
- cerr << "Could not open input BAM file... quitting." << endl;
+ cerr << "bamtools revert ERROR: could not open " << m_settings->InputFilename
+ << " for reading... Aborting." << endl;
return false;
}
const string& headerText = reader.GetHeaderText();
const RefVector& references = reader.GetReferenceData();
- // open writer
+ // determine compression mode for BamWriter
+ bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() &&
+ !m_settings->IsForceCompression );
+ BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
+ if ( writeUncompressed ) compressionMode = BamWriter::Uncompressed;
+
+ // open BamWriter
BamWriter writer;
- bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() && !m_settings->IsForceCompression );
- if ( !writer.Open(m_settings->OutputFilename, headerText, references, writeUncompressed) ) {
- cerr << "Could not open " << m_settings->OutputFilename << " for writing." << endl;
+ writer.SetCompressionMode(compressionMode);
+ if ( !writer.Open(m_settings->OutputFilename, headerText, references) ) {
+ cerr << "bamtools revert ERROR: could not open " << m_settings->OutputFilename
+ << " for writing... Aborting." << endl;
+ reader.Close();
return false;
}
// plow through file, reverting alignments
BamAlignment al;
while ( reader.GetNextAlignment(al) ) {
- RevertAlignment(al);
+ RevertAlignment(al);
writer.SaveAlignment(al);
}
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools revert", "removes duplicate marks and restores original (non-recalibrated) base qualities", "[-in <filename> ... ]");
+ Options::SetProgramInfo("bamtools revert", "removes duplicate marks and restores original (non-recalibrated) base qualities", "[-in <filename> -in <filename> ...] [-out <filename> | [-forceCompression]] [revertOptions]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
}
RevertTool::~RevertTool(void) {
+
delete m_settings;
m_settings = 0;
// parse command line arguments
Options::Parse(argc, argv, 1);
- // run internal RevertTool implementation, return success/fail
+ // intialize RevertTool with settings
m_impl = new RevertToolPrivate(m_settings);
- if ( m_impl->Run() ) return 0;
- else return 1;
+ // run RevertTool, return success/fail
+ if ( m_impl->Run() )
+ return 0;
+ else
+ return 1;
}