]> git.donarmstrong.com Git - bamtools.git/blob - bamtools_merge.h
Reorganization of toolkit. Split subtools out to own headers. Added custom getopt...
[bamtools.git] / bamtools_merge.h
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.
9 //
10 // ** Provide selectable region? eg chr2:10000..20000
11 //
12 // ***************************************************************************
13
14 #ifndef BAMTOOLS_MERGE_H
15 #define BAMTOOLS_MERGE_H
16
17 #include <iostream>
18 #include <string>
19 #include <vector>
20
21 #include "BamMultiReader.h"
22 #include "BamWriter.h"
23 // #include "GetOpt.h"
24 #include "bamtools_getopt.h"
25
26 namespace BamTools {
27
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;
34     return 0;
35 }
36
37 int RunBamMerge(int argc, char* argv[]) {
38   
39     // only 'bamtool merge', show help
40     if ( argc == 2 ) return BamMergeHelp();
41   
42     // else parse command line for args
43     GetOpt options(argc, argv, 1);
44     
45     std::string outputFilename = "";
46     options.addOption('o', "out", &outputFilename);
47     
48     std::vector<std::string> inputFilenames;
49     options.addVariableLengthOption("in", &inputFilenames);
50     
51     if ( !options.parse() || inputFilenames.empty() ) return BamMergeHelp();   
52     if ( outputFilename.empty() ) { outputFilename = "stdout"; }
53     
54     // opens the BAM files without checking for indexes
55     BamMultiReader reader;
56     reader.Open(inputFilenames, false); 
57
58     // retrieve header & reference dictionary info
59     std::string mergedHeader = reader.GetHeaderText();
60     RefVector references = reader.GetReferenceData();
61
62     // open BamWriter
63     BamWriter writer;
64     writer.Open(outputFilename, mergedHeader, references);
65
66     // store alignments to output file
67     BamAlignment bAlignment;
68     while (reader.GetNextAlignment(bAlignment)) {
69         writer.SaveAlignment(bAlignment);
70     }
71
72     // clean & exit
73     reader.Close();
74     writer.Close();
75     return 0;  
76 }
77
78 } // namespace BamTools
79
80 #endif // BAMTOOLS_MERGE_H