]> git.donarmstrong.com Git - bamtools.git/blob - bamtools_merge.cpp
bfb5de7fef462ee5d3dc3c84466f70fe49814051
[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     BamReader reader;
95     reader.Open(m_settings->InputFiles.at(0));
96
97     // retrieve header & reference dictionary info
98     std::string mergedHeader = reader.GetHeaderText();
99     RefVector references = reader.GetReferenceData();
100
101     // open BamWriter
102     BamWriter writer;
103     writer.Open(m_settings->OutputFilename, mergedHeader, references);
104
105     // store alignments to output file
106 //     BamAlignment bAlignment;
107 //     while (reader.GetNextAlignment(bAlignment)) {
108 //         writer.SaveAlignment(bAlignment);
109 //     }
110     
111     BamAlignment bAlignment;
112     while (reader.GetNextAlignment(bAlignment)) {
113         writer.SaveAlignment(bAlignment);
114     }
115
116     // clean & exit
117     reader.Close();
118     writer.Close();
119     return 0;  
120 }