]> git.donarmstrong.com Git - bamtools.git/blob - src/toolkit/bamtools_merge.cpp
Added uncompressed output as default behavior for Filter-, Merge-, and RandomTools...
[bamtools.git] / src / toolkit / bamtools_merge.cpp
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.
9 //
10 // ** Provide selectable region? eg chr2:10000..20000
11 //
12 // ***************************************************************************
13
14 #include <iostream>
15 #include <string>
16 #include <vector>
17
18 #include "bamtools_merge.h"
19 #include "bamtools_options.h"
20 #include "bamtools_utilities.h"
21 #include "BamMultiReader.h"
22 #include "BamWriter.h"
23
24 using namespace std;
25 using namespace BamTools;
26
27 // ---------------------------------------------
28 // MergeSettings implementation
29
30 struct MergeTool::MergeSettings {
31
32     // flags
33     bool HasInputBamFilename;
34     bool HasOutputBamFilename;
35     bool IsForceCompression;
36 //     bool HasRegion;
37     
38     // filenames
39     vector<string> InputFiles;
40     
41     // other parameters
42     string OutputFilename;
43 //     string Region;
44     
45     // constructor
46     MergeSettings(void)
47         : HasInputBamFilename(false)
48         , HasOutputBamFilename(false)
49         , IsForceCompression(false)
50 //         , HasRegion(false)
51         , OutputFilename(Options::StandardOut())
52     { }
53 };  
54
55 // ---------------------------------------------
56 // MergeTool implementation
57
58 MergeTool::MergeTool(void)
59     : AbstractTool()
60     , m_settings(new MergeSettings)
61 {
62     // set program details
63     Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename>]");
64     
65     // set up options 
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);
70     
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);
73 }
74
75 MergeTool::~MergeTool(void) {
76     delete m_settings;
77     m_settings = 0;
78 }
79
80 int MergeTool::Help(void) {
81     Options::DisplayHelp();
82     return 0;
83 }
84
85 int MergeTool::Run(int argc, char* argv[]) {
86   
87     // parse command line arguments
88     Options::Parse(argc, argv, 1);
89     
90      // set to default input if none provided
91     if ( !m_settings->HasInputBamFilename ) m_settings->InputFiles.push_back(Options::StandardIn());
92     
93     // opens the BAM files without checking for indexes
94     BamMultiReader reader;
95     reader.Open(m_settings->InputFiles, false, true); 
96
97     // retrieve header & reference dictionary info
98     std::string mergedHeader = reader.GetHeaderText();
99     RefVector references = reader.GetReferenceData();
100
101     // open writer
102     BamWriter writer;
103     bool writeUncompressed = ( m_settings->OutputFilename == Options::StandardOut() && !m_settings->IsForceCompression );
104     writer.Open(m_settings->OutputFilename, mergedHeader, references, writeUncompressed);
105
106     // store alignments to output file
107     BamAlignment bAlignment;
108     while (reader.GetNextAlignmentCore(bAlignment)) {
109         writer.SaveAlignment(bAlignment);
110     }
111     
112     // clean & exit
113     reader.Close();
114     writer.Close();
115     return 0;  
116 }