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