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] [--region REGION] [--in FILE [FILE] [FILE] ...] " << std::endl;
31 std::cerr << std::endl;
32 std::cerr << "\t--in FILE Input BAM file(s) [stdin]" << std::endl;
33 std::cerr << "\t--region REGION Only keep alignments from this region. [all alignments]" << std::endl;
34 std::cerr << "\t REGION format - (eg chr2:1000..2000)" << std::endl;
35 std::cerr << "\t--out FILE Destination for merge results [stdout]" << std::endl;
36 std::cerr << std::endl;
40 int RunBamMerge(int argc, char* argv[]) {
42 // only 'bamtool merge', show help
43 if ( argc == 2 ) return BamMergeHelp();
45 // else parse command line for args
46 GetOpt options(argc, argv, 1);
48 std::string outputFilename = "";
49 options.addOption("out", &outputFilename);
51 std::vector<std::string> inputFilenames;
52 options.addVariableLengthOption("in", &inputFilenames);
54 std::string regionString;
55 options.addOption("region", ®ionString);
57 if ( !options.parse() || inputFilenames.empty() ) return BamMergeHelp();
58 if ( inputFilenames.empty() ) { inputFilenames.push_back("stdin"); }
59 if ( outputFilename.empty() ) { outputFilename = "stdout"; }
61 // opens the BAM files without checking for indexes
62 BamMultiReader reader;
63 reader.Open(inputFilenames, false);
65 // retrieve header & reference dictionary info
66 std::string mergedHeader = reader.GetHeaderText();
67 RefVector references = reader.GetReferenceData();
71 writer.Open(outputFilename, mergedHeader, references);
73 // if desired region provided
74 if ( !regionString.empty() ) {
75 // parse region string
76 // only get alignments from this region
79 // else get all alignments
81 // store alignments to output file
82 BamAlignment bAlignment;
83 while (reader.GetNextAlignment(bAlignment)) {
84 writer.SaveAlignment(bAlignment);
93 } // namespace BamTools
95 #endif // BAMTOOLS_MERGE_H