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: 31 August 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;
35 bool IsForceCompression;
39 vector<string> InputFiles;
42 string OutputFilename;
47 : HasInputBamFilename(false)
48 , HasOutputBamFilename(false)
49 , IsForceCompression(false)
51 , OutputFilename(Options::StandardOut())
55 // ---------------------------------------------
56 // MergeTool implementation
58 MergeTool::MergeTool(void)
60 , m_settings(new MergeSettings)
62 // set program details
63 Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename>]");
66 OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
67 Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts);
68 Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutputBamFilename, m_settings->OutputFilename, IO_Opts);
69 Options::AddOption("-forceCompression", "if results are sent to stdout (like when piping to another tool), default behavior is to leave output uncompressed. Use this flag to override and force compression", m_settings->IsForceCompression, IO_Opts);
71 // OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
72 // Options::AddValueOption("-region", "REGION", "genomic region. See README for more details", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
75 MergeTool::~MergeTool(void) {
80 int MergeTool::Help(void) {
81 Options::DisplayHelp();
85 int MergeTool::Run(int argc, char* argv[]) {
87 // parse command line arguments
88 Options::Parse(argc, argv, 1);
90 // set to default input if none provided
91 if ( !m_settings->HasInputBamFilename ) m_settings->InputFiles.push_back(Options::StandardIn());
93 // opens the BAM files without checking for indexes
94 BamMultiReader reader;
95 reader.Open(m_settings->InputFiles, false, true);
97 // retrieve header & reference dictionary info
98 std::string mergedHeader = reader.GetHeaderText();
99 RefVector references = reader.GetReferenceData();
103 bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() && !m_settings->IsForceCompression );
104 writer.Open(m_settings->OutputFilename, mergedHeader, references, writeUncompressed);
106 // store alignments to output file
107 BamAlignment bAlignment;
108 while (reader.GetNextAlignmentCore(bAlignment)) {
109 writer.SaveAlignment(bAlignment);