1 // ***************************************************************************
2 // bamtools_cpp (c) 2010 Derek Barnett, Alistair Ward
3 // Marth Lab, Department of Biology, Boston College
4 // All rights reserved.
5 // ---------------------------------------------------------------------------
6 // Last modified: 21 March 2011
7 // ---------------------------------------------------------------------------
8 // Prints general alignment statistics for BAM file(s).
9 // ***************************************************************************
11 #include "bamtools_revert.h"
13 #include <api/BamReader.h>
14 #include <api/BamWriter.h>
15 #include <utils/bamtools_options.h>
16 #include <utils/bamtools_utilities.h>
17 using namespace BamTools;
23 // ---------------------------------------------
24 // RevertSettings implementation
26 struct RevertTool::RevertSettings {
31 bool IsForceCompression;
32 bool IsKeepDuplicateFlag;
37 string OutputFilename;
43 , IsForceCompression(false)
44 , IsKeepDuplicateFlag(false)
45 , IsKeepQualities(false)
46 , InputFilename(Options::StandardIn())
47 , OutputFilename(Options::StandardOut())
51 // ---------------------------------------------
52 // RevertToolPrivate implementation
54 struct RevertTool::RevertToolPrivate {
58 RevertToolPrivate(RevertTool::RevertSettings* settings);
59 ~RevertToolPrivate(void);
67 void RevertAlignment(BamAlignment& al);
71 RevertTool::RevertSettings* m_settings;
75 RevertTool::RevertToolPrivate::RevertToolPrivate(RevertTool::RevertSettings* settings)
76 : m_settings(settings)
80 RevertTool::RevertToolPrivate::~RevertToolPrivate(void) { }
82 // reverts a BAM alignment
83 // default behavior (for now) is : replace Qualities with OQ, clear IsDuplicate flag
84 // can override default behavior using command line options
85 void RevertTool::RevertToolPrivate::RevertAlignment(BamAlignment& al) {
87 // replace Qualities with OQ, if requested
88 if ( !m_settings->IsKeepQualities ) {
89 string originalQualities;
90 if ( al.GetTag(m_OQ, originalQualities) ) {
91 al.Qualities = originalQualities;
96 // clear duplicate flag, if requested
97 if ( !m_settings->IsKeepDuplicateFlag )
98 al.SetIsDuplicate(false);
101 bool RevertTool::RevertToolPrivate::Run(void) {
103 // opens the BAM file without checking for indexes
105 if ( !reader.Open(m_settings->InputFilename) ) {
106 cerr << "bamtools revert ERROR: could not open " << m_settings->InputFilename
107 << " for reading... Aborting." << endl;
111 // get BAM file metadata
112 const string& headerText = reader.GetHeaderText();
113 const RefVector& references = reader.GetReferenceData();
115 // determine compression mode for BamWriter
116 bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() &&
117 !m_settings->IsForceCompression );
118 BamWriter::CompressionMode compressionMode = BamWriter::Compressed;
119 if ( writeUncompressed ) compressionMode = BamWriter::Uncompressed;
123 writer.SetCompressionMode(compressionMode);
124 if ( !writer.Open(m_settings->OutputFilename, headerText, references) ) {
125 cerr << "bamtools revert ERROR: could not open " << m_settings->OutputFilename
126 << " for writing... Aborting." << endl;
131 // plow through file, reverting alignments
133 while ( reader.GetNextAlignment(al) ) {
135 writer.SaveAlignment(al);
144 // ---------------------------------------------
145 // RevertTool implementation
147 RevertTool::RevertTool(void)
149 , m_settings(new RevertSettings)
152 // set program details
153 Options::SetProgramInfo("bamtools revert", "removes duplicate marks and restores original (non-recalibrated) base qualities", "[-in <filename> -in <filename> ...] [-out <filename> | [-forceCompression]] [revertOptions]");
156 OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
157 Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInput, m_settings->InputFilename, IO_Opts, Options::StandardIn());
158 Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutput, m_settings->OutputFilename, IO_Opts, Options::StandardOut());
159 Options::AddOption("-forceCompression", "if results are sent to stdout (like when piping to another tool), default behavior is to leave output uncompressed. Use this flag to override and force compression", m_settings->IsForceCompression, IO_Opts);
161 OptionGroup* RevertOpts = Options::CreateOptionGroup("Revert Options");
162 Options::AddOption("-keepDuplicate", "keep duplicates marked", m_settings->IsKeepDuplicateFlag, RevertOpts);
163 Options::AddOption("-keepQualities", "keep base qualities (do not replace with OQ contents)", m_settings->IsKeepQualities, RevertOpts);
166 RevertTool::~RevertTool(void) {
174 int RevertTool::Help(void) {
175 Options::DisplayHelp();
179 int RevertTool::Run(int argc, char* argv[]) {
181 // parse command line arguments
182 Options::Parse(argc, argv, 1);
184 // run internal RevertTool implementation, return success/fail
185 m_impl = new RevertToolPrivate(m_settings);
187 if ( m_impl->Run() ) return 0;