]> git.donarmstrong.com Git - bamtools.git/blob - src/toolkit/bamtools_header.cpp
Added the "-list" option to all toolkit utilities that accept multiple
[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: 10 December 2012
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 <fstream>
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 HasInput;
30     bool HasInputFilelist;
31
32     // filenames
33     vector<string> InputFiles;
34     string InputFilelist;
35     
36     // constructor
37     HeaderSettings(void)
38         : HasInput(false)
39         , HasInputFilelist(false)
40     { }
41 };  
42
43 struct HeaderTool::HeaderToolPrivate {
44
45     // ctor & dtor
46     public:
47         HeaderToolPrivate(HeaderTool::HeaderSettings* settings)
48             : m_settings(settings)
49         { }
50
51         ~HeaderToolPrivate(void) { }
52
53     // interface
54     public:
55         bool Run(void);
56
57     // data members
58     private:
59         HeaderTool::HeaderSettings* m_settings;
60 };
61
62 bool HeaderTool::HeaderToolPrivate::Run(void) {
63
64     // set to default input if none provided
65     if ( !m_settings->HasInput && !m_settings->HasInputFilelist )
66         m_settings->InputFiles.push_back(Options::StandardIn());
67
68     // add files in the filelist to the input file list
69     if ( m_settings->HasInputFilelist ) {
70
71         ifstream filelist(m_settings->InputFilelist.c_str(), ios::in);
72         if ( !filelist.is_open() ) {
73             cerr << "bamtools header ERROR: could not open input BAM file list... Aborting." << endl;
74             return false;
75         }
76
77         string line;
78         while ( getline(filelist, line) )
79             m_settings->InputFiles.push_back(line);
80     }
81
82     // attemp to open BAM files
83     BamMultiReader reader;
84     if ( !reader.Open(m_settings->InputFiles) ) {
85         cerr << "bamtools header ERROR: could not open BAM file(s) for reading... Aborting." << endl;
86         return false;
87     }
88
89     // dump (merged) header contents to stdout
90     cout << reader.GetHeaderText() << endl;
91
92     // clean up & exit
93     reader.Close();
94     return true;
95 }
96
97 // ---------------------------------------------
98 // HeaderTool implementation
99
100 HeaderTool::HeaderTool(void)
101     : AbstractTool()
102     , m_settings(new HeaderSettings)
103     , m_impl(0)
104 {
105     // set program details
106     Options::SetProgramInfo("bamtools header", "prints header from BAM file(s)", "[-in <filename> -in <filename> ... | -list <filelist>]");
107     
108     // set up options 
109     OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
110     Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInput, m_settings->InputFiles, IO_Opts, Options::StandardIn());
111     Options::AddValueOption("-list", "filename", "the input BAM file list, one line per file", "", m_settings->HasInputFilelist,  m_settings->InputFilelist, IO_Opts);
112 }
113
114 HeaderTool::~HeaderTool(void) {
115
116     delete m_settings;
117     m_settings = 0;
118
119     delete m_impl;
120     m_impl = 0;
121 }
122
123 int HeaderTool::Help(void) {
124     Options::DisplayHelp();
125     return 0;
126 }
127
128 int HeaderTool::Run(int argc, char* argv[]) {
129   
130     // parse command line arguments
131     Options::Parse(argc, argv, 1);
132   
133     // initialize HeaderTool with settings
134     m_impl = new HeaderToolPrivate(m_settings);
135
136     // run HeaderTool, return success/fail
137     if ( m_impl->Run() )
138         return 0;
139     else
140         return 1;
141 }