From 77f7ccd20d2a255f5f2f4200b458500144551ad6 Mon Sep 17 00:00:00 2001 From: Erik Garrison Date: Fri, 21 May 2010 16:53:26 -0400 Subject: [PATCH] bamtools executable Merge a number of useful tools into a single executable. Also in this commit, addition of verification that reference sequences are identical among readers opened by the BamMultiReader. Without this check the behavior of the MultiReader is undefined. --- bamtools.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 bamtools.cpp diff --git a/bamtools.cpp b/bamtools.cpp new file mode 100644 index 0000000..e4d7769 --- /dev/null +++ b/bamtools.cpp @@ -0,0 +1,126 @@ +// *************************************************************************** +// bamtools.cpp (c) 2010 Erik Garrison +// Marth Lab, Department of Biology, Boston College +// All rights reserved. +// --------------------------------------------------------------------------- +// Integrates a number of BamTools functionalities into a single executable. +// *************************************************************************** + +// Std C/C++ includes +#include +#include +#include +#include +using namespace std; + +// BamTools includes +#include "BamReader.h" +#include "BamWriter.h" +#include "BamMultiReader.h" +using namespace BamTools; + +void usageSummary() { + cerr << "usage: bamtools [options]" << endl + << "actions:" << endl + << " index " << endl + << " merge [ ...]" << endl + << " dump [ ...]" << endl; + //<< " trim " << endl; +} + + +void BamMerge(string outputFilename, vector filenames) { + + BamMultiReader reader; + + reader.Open(filenames); + + string mergedHeader = reader.GetHeaderText(); + + RefVector references = reader.GetReferenceData(); + + // open BamWriter + BamWriter writer; + writer.Open( outputFilename.c_str(), mergedHeader, references); + + BamAlignment bAlignment; + while (reader.GetNextAlignment(bAlignment)) { + // write to output file + writer.SaveAlignment(bAlignment); + } + + // close output file + writer.Close(); + // close input files + reader.Close(); + +} + +void BamCreateIndex(const char* inputFilename) { + + // open our BAM reader + BamReader reader; + reader.Open(inputFilename); + + // create index file + reader.CreateIndex(); + + // close our file + reader.Close(); + +} + +// Spit out basic BamAlignment data +void PrintAlignment(const BamAlignment& alignment) { + cout << "---------------------------------" << endl; + cout << "Name: " << alignment.Name << endl; + cout << "Aligned to: " << alignment.RefID; + cout << ":" << alignment.Position << endl; + cout << endl; +} + +void BamDump(vector files) { + + BamMultiReader reader; + reader.Open(files); + + BamAlignment bAlignment; + while (reader.GetNextAlignment(bAlignment)) { + PrintAlignment(bAlignment); + } + + reader.Close(); + +} + + +int main(int argc, char* argv[]) { + + // validate argument count + if( argc < 2 ) { + usageSummary(); + exit(1); + } + + string command = argv[1]; + + if (command == "index") { + BamCreateIndex(argv[2]); + } else if (command == "merge") { + vector files; + string outputFile = argv[2]; + for (int i = 3; i files; + for (int i = 2; i