]> git.donarmstrong.com Git - bamtools.git/blob - src/toolkit/bamtools_header.cpp
Minor cleanup
[bamtools.git] / src / toolkit / bamtools_header.cpp
1 // ***************************************************************************
2 // bamtools_header.cpp (c) 2010 Derek Barnett, Erik Garrison
3 // Marth Lab, Department of Biology, Boston College
4 // ---------------------------------------------------------------------------
5 // Last modified: 7 April 2011
6 // ---------------------------------------------------------------------------
7 // Prints the SAM-style header from a single BAM file ( or merged header from
8 // multiple BAM files) to stdout
9 // ***************************************************************************
10
11 #include "bamtools_header.h"
12
13 #include <api/BamMultiReader.h>
14 #include <utils/bamtools_options.h>
15 using namespace BamTools;
16
17 #include <iostream>
18 #include <string>
19 #include <vector>
20 using namespace std;
21   
22 // ---------------------------------------------
23 // HeaderSettings implementation
24
25 struct HeaderTool::HeaderSettings {
26
27     // flags
28     bool HasInputBamFilename;
29
30     // filenames
31     vector<string> InputFiles;
32     
33     // constructor
34     HeaderSettings(void)
35         : HasInputBamFilename(false)
36     { }
37 };  
38
39 struct HeaderTool::HeaderToolPrivate {
40
41     // ctor & dtor
42     public:
43         HeaderToolPrivate(HeaderTool::HeaderSettings* settings)
44             : m_settings(settings)
45         { }
46
47         ~HeaderToolPrivate(void) { }
48
49     // interface
50     public:
51         bool Run(void);
52
53     // data members
54     private:
55         HeaderTool::HeaderSettings* m_settings;
56 };
57
58 bool HeaderTool::HeaderToolPrivate::Run(void) {
59
60     // set to default input if none provided
61     if ( !m_settings->HasInputBamFilename )
62         m_settings->InputFiles.push_back(Options::StandardIn());
63
64     // attemp to open BAM files
65     BamMultiReader reader;
66     if ( !reader.Open(m_settings->InputFiles) ) {
67         cerr << "bamtools header ERROR: could not open BAM file(s) for reading... Aborting." << endl;
68         return false;
69     }
70
71     // dump (merged) header contents to stdout
72     cout << reader.GetHeaderText() << endl;
73
74     // clean up & exit
75     reader.Close();
76     return true;
77 }
78
79 // ---------------------------------------------
80 // HeaderTool implementation
81
82 HeaderTool::HeaderTool(void)
83     : AbstractTool()
84     , m_settings(new HeaderSettings)
85     , m_impl(0)
86 {
87     // set program details
88     Options::SetProgramInfo("bamtools header", "prints header from BAM file(s)", "[-in <filename> -in <filename> ...] ");
89     
90     // set up options 
91     OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
92     Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts, Options::StandardIn());
93 }
94
95 HeaderTool::~HeaderTool(void) {
96
97     delete m_settings;
98     m_settings = 0;
99
100     delete m_impl;
101     m_impl = 0;
102 }
103
104 int HeaderTool::Help(void) {
105     Options::DisplayHelp();
106     return 0;
107 }
108
109 int HeaderTool::Run(int argc, char* argv[]) {
110   
111     // parse command line arguments
112     Options::Parse(argc, argv, 1);
113   
114     // initialize HeaderTool with settings
115     m_impl = new HeaderToolPrivate(m_settings);
116
117     // run HeaderTool, return success/fail
118     if ( m_impl->Run() )
119         return 0;
120     else
121         return 1;
122 }