]> git.donarmstrong.com Git - bamtools.git/blob - bamtools_merge.cpp
added warning for duplicate @RG tag in header
[bamtools.git] / 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: 2 June 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 HasRegion;
36     
37     // filenames
38     vector<string> InputFiles;
39     
40     // other parameters
41     string OutputFilename;
42 //     string Region;
43     
44     // constructor
45     MergeSettings(void)
46         : HasInputBamFilename(false)
47         , HasOutputBamFilename(false)
48 //         , HasRegion(false)
49         , OutputFilename(Options::StandardOut())
50     { }
51 };  
52
53 // ---------------------------------------------
54 // MergeTool implementation
55
56 MergeTool::MergeTool(void)
57     : AbstractTool()
58     , m_settings(new MergeSettings)
59 {
60     // set program details
61     Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename>]");
62     
63     // set up options 
64     OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
65     Options::AddValueOption("-in",  "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename,  m_settings->InputFiles,     IO_Opts);
66     Options::AddValueOption("-out", "BAM filename", "the output BAM file",   "", m_settings->HasOutputBamFilename, m_settings->OutputFilename, IO_Opts);
67     
68 //     OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
69 //     Options::AddValueOption("-region", "REGION", "genomic region. See README for more details", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
70 }
71
72 MergeTool::~MergeTool(void) {
73     delete m_settings;
74     m_settings = 0;
75 }
76
77 int MergeTool::Help(void) {
78     Options::DisplayHelp();
79     return 0;
80 }
81
82 int MergeTool::Run(int argc, char* argv[]) {
83   
84     // parse command line arguments
85     Options::Parse(argc, argv, 1);
86     
87      // set to default input if none provided
88     if ( !m_settings->HasInputBamFilename ) m_settings->InputFiles.push_back(Options::StandardIn());
89     
90     // opens the BAM files without checking for indexes
91     BamMultiReader reader;
92     reader.Open(m_settings->InputFiles, false); 
93
94     // retrieve header & reference dictionary info
95     std::string mergedHeader = reader.GetHeaderText();
96     RefVector references = reader.GetReferenceData();
97
98     // open BamWriter
99     BamWriter writer;
100     writer.Open(m_settings->OutputFilename, mergedHeader, references);
101
102     // store alignments to output file
103     BamAlignment bAlignment;
104     while (reader.GetNextAlignment(bAlignment)) {
105         writer.SaveAlignment(bAlignment);
106     }
107
108     // clean & exit
109     reader.Close();
110     writer.Close();
111     return 0;  
112 }