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: 5 December 2010
7 // ---------------------------------------------------------------------------
8 // Prints general alignment statistics for BAM file(s).
9 // ***************************************************************************
13 #include "bamtools_revert.h"
14 #include "bamtools_options.h"
15 #include "bamtools_utilities.h"
16 #include "BamReader.h"
17 #include "BamWriter.h"
19 using namespace BamTools;
21 // ---------------------------------------------
22 // RevertSettings implementation
24 struct RevertTool::RevertSettings {
29 bool IsForceCompression;
30 bool IsKeepDuplicateFlag;
35 string OutputFilename;
41 , IsForceCompression(false)
42 , IsKeepDuplicateFlag(false)
43 , IsKeepQualities(false)
44 , InputFilename(Options::StandardIn())
45 , OutputFilename(Options::StandardOut())
49 // ---------------------------------------------
50 // RevertToolPrivate implementation
52 struct RevertTool::RevertToolPrivate {
56 RevertToolPrivate(RevertTool::RevertSettings* settings);
57 ~RevertToolPrivate(void);
65 void RevertAlignment(BamAlignment& al);
69 RevertTool::RevertSettings* m_settings;
73 RevertTool::RevertToolPrivate::RevertToolPrivate(RevertTool::RevertSettings* settings)
74 : m_settings(settings)
78 RevertTool::RevertToolPrivate::~RevertToolPrivate(void) { }
80 // reverts a BAM alignment
81 // default behavior (for now) is : replace Qualities with OQ, clear IsDuplicate flag
82 // can override default behavior using command line options
83 void RevertTool::RevertToolPrivate::RevertAlignment(BamAlignment& al) {
85 // replace Qualities with OQ, if requested
86 if ( !m_settings->IsKeepQualities ) {
87 string originalQualities;
88 if ( al.GetTag(m_OQ, originalQualities) ) {
89 al.Qualities = originalQualities;
94 // clear duplicate flag, if requested
95 if ( !m_settings->IsKeepDuplicateFlag )
96 al.SetIsDuplicate(false);
99 bool RevertTool::RevertToolPrivate::Run(void) {
101 // opens the BAM file without checking for indexes
103 if ( !reader.Open(m_settings->InputFilename) ) {
104 cerr << "Could not open input BAM file... quitting." << endl;
108 // get BAM file metadata
109 const string& headerText = reader.GetHeaderText();
110 const RefVector& references = reader.GetReferenceData();
114 bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() && !m_settings->IsForceCompression );
115 if ( !writer.Open(m_settings->OutputFilename, headerText, references, writeUncompressed) ) {
116 cerr << "Could not open " << m_settings->OutputFilename << " for writing." << endl;
120 // plow through file, reverting alignments
122 while ( reader.GetNextAlignment(al) ) {
124 writer.SaveAlignment(al);
133 // ---------------------------------------------
134 // RevertTool implementation
136 RevertTool::RevertTool(void)
138 , m_settings(new RevertSettings)
141 // set program details
142 Options::SetProgramInfo("bamtools revert", "removes duplicate marks and restores original (non-recalibrated) base qualities", "[-in <filename> ... ]");
145 OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
146 Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInput, m_settings->InputFilename, IO_Opts, Options::StandardIn());
147 Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutput, m_settings->OutputFilename, IO_Opts, Options::StandardOut());
148 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);
150 OptionGroup* RevertOpts = Options::CreateOptionGroup("Revert Options");
151 Options::AddOption("-keepDuplicate", "keep duplicates marked", m_settings->IsKeepDuplicateFlag, RevertOpts);
152 Options::AddOption("-keepQualities", "keep base qualities (do not replace with OQ contents)", m_settings->IsKeepQualities, RevertOpts);
155 RevertTool::~RevertTool(void) {
163 int RevertTool::Help(void) {
164 Options::DisplayHelp();
168 int RevertTool::Run(int argc, char* argv[]) {
170 // parse command line arguments
171 Options::Parse(argc, argv, 1);
173 // run internal RevertTool implementation, return success/fail
174 m_impl = new RevertToolPrivate(m_settings);
176 if ( m_impl->Run() ) return 0;