]> git.donarmstrong.com Git - bamtools.git/blob - bamtools_merge.h
Mostly cleaned up help & usage messages. Added MIT license.
[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] [--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;
37     return 0;
38 }
39
40 int RunBamMerge(int argc, char* argv[]) {
41   
42     // only 'bamtool merge', show help
43     if ( argc == 2 ) return BamMergeHelp();
44   
45     // else parse command line for args
46     GetOpt options(argc, argv, 1);
47     
48     std::string outputFilename = "";
49     options.addOption("out", &outputFilename);
50     
51     std::vector<std::string> inputFilenames;
52     options.addVariableLengthOption("in", &inputFilenames);
53     
54     std::string regionString;
55     options.addOption("region", &regionString);
56     
57     if ( !options.parse() || inputFilenames.empty() ) return BamMergeHelp();   
58     if ( inputFilenames.empty() ) { inputFilenames.push_back("stdin"); }
59     if ( outputFilename.empty() ) { outputFilename = "stdout"; }
60     
61     // opens the BAM files without checking for indexes
62     BamMultiReader reader;
63     reader.Open(inputFilenames, false); 
64
65     // retrieve header & reference dictionary info
66     std::string mergedHeader = reader.GetHeaderText();
67     RefVector references = reader.GetReferenceData();
68
69     // open BamWriter
70     BamWriter writer;
71     writer.Open(outputFilename, mergedHeader, references);
72
73     // if desired region provided
74     if ( !regionString.empty() ) {
75         // parse region string
76         // only get alignments from this region
77     } 
78     
79     // else get all alignments
80     else {
81         // store alignments to output file
82         BamAlignment bAlignment;
83         while (reader.GetNextAlignment(bAlignment)) {
84             writer.SaveAlignment(bAlignment);
85         }
86     }
87     // clean & exit
88     reader.Close();
89     writer.Close();
90     return 0;  
91 }
92
93 } // namespace BamTools
94
95 #endif // BAMTOOLS_MERGE_H