1 // ***************************************************************************
2 // bamtools_merge.cpp (c) 2010 Derek Barnett, Erik Garrison
3 // Marth Lab, Department of Biology, Boston College
4 // All rights reserved.
5 // ---------------------------------------------------------------------------
6 // Last modified: 2 June 2010
7 // ---------------------------------------------------------------------------
8 // Merges multiple BAM files into one.
10 // ** Provide selectable region? eg chr2:10000..20000
12 // ***************************************************************************
18 #include "bamtools_merge.h"
19 #include "bamtools_options.h"
20 #include "bamtools_utilities.h"
21 #include "BamMultiReader.h"
22 #include "BamWriter.h"
25 using namespace BamTools;
27 // ---------------------------------------------
28 // MergeSettings implementation
30 struct MergeTool::MergeSettings {
33 bool HasInputBamFilename;
34 bool HasOutputBamFilename;
38 vector<string> InputFiles;
41 string OutputFilename;
46 : HasInputBamFilename(false)
47 , HasOutputBamFilename(false)
49 , OutputFilename(Options::StandardOut())
53 // ---------------------------------------------
54 // MergeTool implementation
56 MergeTool::MergeTool(void)
58 , m_settings(new MergeSettings)
60 // set program details
61 Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename>]");
64 OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
65 Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts);
66 Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutputBamFilename, m_settings->OutputFilename, IO_Opts);
68 // OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
69 // Options::AddValueOption("-region", "REGION", "genomic region. See README for more details", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
72 MergeTool::~MergeTool(void) {
77 int MergeTool::Help(void) {
78 Options::DisplayHelp();
82 int MergeTool::Run(int argc, char* argv[]) {
84 // parse command line arguments
85 Options::Parse(argc, argv, 1);
87 // set to default input if none provided
88 if ( !m_settings->HasInputBamFilename ) m_settings->InputFiles.push_back(Options::StandardIn());
90 // opens the BAM files without checking for indexes
91 BamMultiReader reader;
92 reader.Open(m_settings->InputFiles, false, true);
94 // retrieve header & reference dictionary info
95 std::string mergedHeader = reader.GetHeaderText();
96 RefVector references = reader.GetReferenceData();
100 writer.Open(m_settings->OutputFilename, mergedHeader, references);
102 // store alignments to output file
103 BamAlignment bAlignment;
104 while (reader.GetNextAlignmentCore(bAlignment)) {
105 writer.SaveAlignment(bAlignment);