1 // ***************************************************************************
2 // bamtools_merge.h (c) 2010 Derek Barnett, Erik Garrison
3 // Marth Lab, Department of Biology, Boston College
4 // All rights reserved.
5 // ---------------------------------------------------------------------------
6 // Last modified: 26 May 2010
7 // ---------------------------------------------------------------------------
8 // Merges multiple BAM files into one.
10 // ** Provide selectable region? eg chr2:10000..20000
12 // ***************************************************************************
14 #ifndef BAMTOOLS_MERGE_H
15 #define BAMTOOLS_MERGE_H
21 #include "BamMultiReader.h"
22 #include "BamWriter.h"
23 // #include "GetOpt.h"
24 #include "bamtools_getopt.h"
28 int BamMergeHelp(void) {
29 std::cerr << std::endl;
30 std::cerr << "usage:\tbamtools merge [--out FILE] --in <BAM file1> [BAM file2] [BAM file3]..." << std::endl;
31 std::cerr << "\t--in\tInput BAM file(s)\t\t[at least 1 req'd]" << std::endl;
32 std::cerr << "\t--out\tDestination for merge results\t[default=stdout]" << std::endl;
33 std::cerr << std::endl;
37 int RunBamMerge(int argc, char* argv[]) {
39 // only 'bamtool merge', show help
40 if ( argc == 2 ) return BamMergeHelp();
42 // else parse command line for args
43 GetOpt options(argc, argv, 1);
45 std::string outputFilename = "";
46 options.addOption('o', "out", &outputFilename);
48 std::vector<std::string> inputFilenames;
49 options.addVariableLengthOption("in", &inputFilenames);
51 if ( !options.parse() || inputFilenames.empty() ) return BamMergeHelp();
52 if ( outputFilename.empty() ) { outputFilename = "stdout"; }
54 // opens the BAM files without checking for indexes
55 BamMultiReader reader;
56 reader.Open(inputFilenames, false);
58 // retrieve header & reference dictionary info
59 std::string mergedHeader = reader.GetHeaderText();
60 RefVector references = reader.GetReferenceData();
64 writer.Open(outputFilename, mergedHeader, references);
66 // store alignments to output file
67 BamAlignment bAlignment;
68 while (reader.GetNextAlignment(bAlignment)) {
69 writer.SaveAlignment(bAlignment);
78 } // namespace BamTools
80 #endif // BAMTOOLS_MERGE_H