]> git.donarmstrong.com Git - bamtools.git/blob - BamMultiMergeMain.cpp
a4bed5589aa562fa129e8f97099a943a9b1d77e2
[bamtools.git] / BamMultiMergeMain.cpp
1 #include "BamMultiReader.h"\r
2 #include "BamWriter.h"\r
3 #include <boost/algorithm/string.hpp>\r
4 #include <iostream>\r
5 \r
6 using namespace BamTools;\r
7 using namespace std;\r
8 \r
9 int main(int argc, char** argv) {\r
10 \r
11     if (argc == 1) {\r
12         cerr << "USAGE: ./BamMultiMerge <output file> [input files]" << endl;\r
13         exit(0);\r
14     }\r
15 \r
16     string outputFilename = argv[1];\r
17 \r
18     BamMultiReader reader;\r
19     vector<string> filenames;\r
20     for (int i = 2; i<argc; ++i) {\r
21         filenames.push_back(argv[i]);\r
22     }\r
23 \r
24     reader.Open(filenames);\r
25 \r
26     //cerr << "merging to " << outputFilename << endl;\r
27     string mergedHeader = reader.GetUnifiedHeaderText();\r
28     //cerr << "mergedHeader = " << endl << mergedHeader << endl;\r
29 \r
30     // check that we are merging files which have the same sets of references\r
31     RefVector references;\r
32     int referencesSize = 0; bool first = true;\r
33     for (int i = 2; i<argc; ++i) {\r
34         BamReader areader;\r
35         areader.Open( argv[i] );\r
36         if (first) {\r
37             references = areader.GetReferenceData();\r
38             referencesSize = references.size();\r
39             first = false;\r
40         } else {\r
41             RefVector newreferences = areader.GetReferenceData();\r
42             int i = 0;\r
43             for (RefVector::const_iterator it = references.begin(); it != references.end(); it++) {\r
44                 if (newreferences.at(i++).RefName != it->RefName) {\r
45                     cerr << "BAM FILES ALIGNED AGAINST DIFFERING SETS OF REFERENCES, NOT MERGING" << endl;\r
46                     exit(1);\r
47                 }\r
48             }\r
49         }\r
50     }\r
51 \r
52     // open BamWriter\r
53     BamWriter writer;\r
54     writer.Open( outputFilename.c_str(), mergedHeader, references);\r
55 \r
56     BamAlignment bAlignment;\r
57     while (reader.GetNextAlignment(bAlignment)) {\r
58         // write to output file\r
59         writer.SaveAlignment(bAlignment);\r
60     }\r
61 \r
62     // close output file\r
63     writer.Close();\r
64     // close input files\r
65     reader.Close();\r
66 \r
67     //cerr << "done" << endl;\r
68 \r
69     return 0;\r
70 }\r