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 // ***************************************************************************
11 #include "bamtools_header.h"
13 #include <api/BamMultiReader.h>
14 #include <utils/bamtools_options.h>
15 using namespace BamTools;
23 // ---------------------------------------------
24 // HeaderSettings implementation
26 struct HeaderTool::HeaderSettings {
30 bool HasInputFilelist;
33 vector<string> InputFiles;
39 , HasInputFilelist(false)
43 struct HeaderTool::HeaderToolPrivate {
47 HeaderToolPrivate(HeaderTool::HeaderSettings* settings)
48 : m_settings(settings)
51 ~HeaderToolPrivate(void) { }
59 HeaderTool::HeaderSettings* m_settings;
62 bool HeaderTool::HeaderToolPrivate::Run(void) {
64 // set to default input if none provided
65 if ( !m_settings->HasInput && !m_settings->HasInputFilelist )
66 m_settings->InputFiles.push_back(Options::StandardIn());
68 // add files in the filelist to the input file list
69 if ( m_settings->HasInputFilelist ) {
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;
78 while ( getline(filelist, line) )
79 m_settings->InputFiles.push_back(line);
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;
89 // dump (merged) header contents to stdout
90 cout << reader.GetHeaderText() << endl;
97 // ---------------------------------------------
98 // HeaderTool implementation
100 HeaderTool::HeaderTool(void)
102 , m_settings(new HeaderSettings)
105 // set program details
106 Options::SetProgramInfo("bamtools header", "prints header from BAM file(s)", "[-in <filename> -in <filename> ... | -list <filelist>]");
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);
114 HeaderTool::~HeaderTool(void) {
123 int HeaderTool::Help(void) {
124 Options::DisplayHelp();
128 int HeaderTool::Run(int argc, char* argv[]) {
130 // parse command line arguments
131 Options::Parse(argc, argv, 1);
133 // initialize HeaderTool with settings
134 m_impl = new HeaderToolPrivate(m_settings);
136 // run HeaderTool, return success/fail