]> git.donarmstrong.com Git - bamtools.git/blob - bamtools_merge.cpp
Implemented Mosaik-style command line parser, instead of former GetOpt parser. Setup...
[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: 26 May 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> ...] [-region REGION] [-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",  "", 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 //     // if desired region provided
103 //     if ( m_settings->HasRegion ) {
104 //         // parse region string
105 //         // only get alignments from this region
106 //     } 
107 //     
108 //     // else get all alignments
109 //     else {
110 //         // store alignments to output file
111 //         BamAlignment bAlignment;
112 //         while (reader.GetNextAlignment(bAlignment)) {
113 //             writer.SaveAlignment(bAlignment);
114 //         }
115 //     }
116 //
117 //     // clean & exit
118 //     reader.Close();
119 //     writer.Close();
120     return 0;  
121 }