// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 19 September 2010
+// Last modified: 12 October 2010
// ---------------------------------------------------------------------------
// Integrates a number of BamTools functionalities into a single executable.
// ***************************************************************************
// ------------------------------------------
// bamtools subtool names
+
static const string CONVERT = "convert";
static const string COUNT = "count";
static const string COVERAGE = "coverage";
// ------------------------------------------
// bamtools help/version names
+
static const string HELP = "help";
static const string LONG_HELP = "--help";
static const string SHORT_HELP = "-h";
static const string LONG_VERSION = "--version";
static const string SHORT_VERSION = "-v";
+static bool IsHelp(char* str) {
+ return ( str == HELP ||
+ str == LONG_HELP ||
+ str == SHORT_HELP );
+}
+
+static bool IsVersion(char* str) {
+ return ( str == VERSION ||
+ str == LONG_VERSION ||
+ str == SHORT_VERSION );
+}
+
// ------------------------------------------
// Subtool factory method
AbstractTool* CreateTool(const string& arg) {
// Print help info
int Help(int argc, char* argv[]) {
- // 'bamtools help COMMAND'
+ // check for 'bamtools help COMMAND' to print tool-specific help message
if (argc > 2) {
+ // determine desired sub-tool
AbstractTool* tool = CreateTool( argv[2] );
-// if ( argv[2] == CONVERT ) tool = new ConvertTool;
-// if ( argv[2] == COUNT ) tool = new CountTool;
-// if ( argv[2] == COVERAGE ) tool = new CoverageTool;
-// if ( argv[2] == FILTER ) tool = new FilterTool;
-// if ( argv[2] == HEADER ) tool = new HeaderTool;
-// if ( argv[2] == INDEX ) tool = new IndexTool;
-// if ( argv[2] == MERGE ) tool = new MergeTool;
-// if ( argv[2] == RANDOM ) tool = new RandomTool;
-// if ( argv[2] == SORT ) tool = new SortTool;
-// if ( argv[2] == SPLIT ) tool = new SplitTool;
-// if ( argv[2] == STATS ) tool = new StatsTool;
-
+
// if tool known, print its help screen
if ( tool ) return tool->Help();
}
- // either 'bamtools help' or unrecognized argument after 'help'
+ // print general BamTools help message
cerr << endl;
cerr << "usage: bamtools [--help] COMMAND [ARGS]" << endl;
cerr << endl;
if ( (argc == 1) ) return Help(argc, argv);
// 'bamtools help', 'bamtools --help', or 'bamtools -h'
- if ( (argv[1] == HELP) || (argv[1] == LONG_HELP) || (argv[1] == SHORT_HELP) ) return Help(argc, argv);
+ if ( IsHelp(argv[1]) ) return Help(argc, argv);
// 'bamtools version', 'bamtools --version', or 'bamtools -v'
- if ( (argv[1] == VERSION) || (argv[1] == LONG_VERSION) || (argv[1] == SHORT_VERSION) ) return Version();
+ if ( IsVersion(argv[1]) ) return Version();
// determine desired sub-tool
AbstractTool* tool = CreateTool( argv[1] );
-// if ( argv[1] == CONVERT ) tool = new ConvertTool;
-// if ( argv[1] == COUNT ) tool = new CountTool;
-// if ( argv[1] == COVERAGE ) tool = new CoverageTool;
-// if ( argv[1] == FILTER ) tool = new FilterTool;
-// if ( argv[1] == HEADER ) tool = new HeaderTool;
-// if ( argv[1] == INDEX ) tool = new IndexTool;
-// if ( argv[1] == MERGE ) tool = new MergeTool;
-// if ( argv[1] == RANDOM ) tool = new RandomTool;
-// if ( argv[1] == SORT ) tool = new SortTool;
-// if ( argv[1] == SPLIT ) tool = new SplitTool;
-// if ( argv[1] == STATS ) tool = new StatsTool;
- // if found, run tool
+ // if found, run tool... otherwise show help
if ( tool ) return tool->Run(argc, argv);
- // no match found, show help
else return Help(argc, argv);
}
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools convert", "converts BAM to a number of other formats", "-format <FORMAT> [-in <filename> -in <filename> ...] [-out <filename>] [other options]");
+ Options::SetProgramInfo("bamtools convert", "converts BAM to a number of other formats", "-format <FORMAT> [-in <filename> -in <filename> ...] [-out <filename>] [-region <REGION>] [format-specific options]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInput, m_settings->InputFiles, IO_Opts, Options::StandardIn());
Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutput, m_settings->OutputFilename, IO_Opts, Options::StandardOut());
Options::AddValueOption("-format", "FORMAT", "the output file format - see README for recognized formats", "", m_settings->HasFormat, m_settings->Format, IO_Opts);
-
- OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
- Options::AddValueOption("-region", "REGION", "genomic region. Index file is recommended for better performance, and is read automatically if it exists as <filename>.bai. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
+ Options::AddValueOption("-region", "REGION", "genomic region. Index file is recommended for better performance, and is used automatically if it exists. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, IO_Opts);
OptionGroup* PileupOpts = Options::CreateOptionGroup("Pileup Options");
- Options::AddValueOption("-fasta", "FASTA filename", "FASTA reference file", "", m_settings->HasFastaFilename, m_settings->FastaFilename, PileupOpts, "");
+ Options::AddValueOption("-fasta", "FASTA filename", "FASTA reference file", "", m_settings->HasFastaFilename, m_settings->FastaFilename, PileupOpts);
Options::AddOption("-mapqual", "print the mapping qualities", m_settings->IsPrintingPileupMapQualities, PileupOpts);
OptionGroup* SamOpts = Options::CreateOptionGroup("SAM Options");
, m_settings(new CountSettings)
{
// set program details
- Options::SetProgramInfo("bamtools count", "prints alignment counts for a BAM file", "[-in <filename> -in <filename> ...] [-region <REGION>]");
+ Options::SetProgramInfo("bamtools count", "prints number of alignments in BAM file(s)", "[-in <filename> -in <filename> ...] [-region <REGION>]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
- Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInput, m_settings->InputFiles, IO_Opts, Options::StandardIn());
-
- OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
- Options::AddValueOption("-region", "REGION", "genomic region. Index file is required and is read automatically if it exists as <filename>.bai or <filename>.bti. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
+ Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInput, m_settings->InputFiles, IO_Opts, Options::StandardIn());
+ Options::AddValueOption("-region", "REGION", "genomic region. Index file is recommended for better performance, and is used automatically if it exists. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, IO_Opts);
}
CountTool::~CountTool(void) {
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools filter", "filters BAM file(s)", "-in <filename> [-in <filename> ... ] -out <filename> -region <REGION> [ [-script <filename] | [filterOptions] ]");
+ Options::SetProgramInfo("bamtools filter", "filters BAM file(s)", "[-in <filename> -in <filename> ...] [-out <filename> | [-forceCompression]] [-region <REGION>] [ [-script <filename] | [filterOptions] ]");
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts, Options::StandardIn());
#include <iostream>
#include <string>
#include <vector>
-
#include "bamtools_header.h"
#include "bamtools_options.h"
#include "BamReader.h"
#include "BamMultiReader.h"
-
using namespace std;
using namespace BamTools;
, m_settings(new HeaderSettings)
{
// set program details
- Options::SetProgramInfo("bamtools header", "prints header from BAM file(s)", "-in <filename> [-in <filename> ... ] ");
+ Options::SetProgramInfo("bamtools header", "prints header from BAM file(s)", "[-in <filename> -in <filename> ...] ");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
if ( !m_settings->HasInputBamFilename )
m_settings->InputFiles.push_back(Options::StandardIn());
- // open files
+ // if able to open files, dump (merged) header contents to stdout
BamMultiReader reader;
- if ( reader.Open(m_settings->InputFiles, false) ) {
- // dump header contents to stdout
+ if ( reader.Open(m_settings->InputFiles, false) )
cout << reader.GetHeaderText() << endl;
- }
// clean up & exit
reader.Close();
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInputBamFilename, m_settings->InputBamFilename, IO_Opts, Options::StandardIn());
- Options::AddOption("-bti", "create (non-standard) BamTools index file", m_settings->IsUsingBamtoolsIndex, IO_Opts);
+ Options::AddOption("-bti", "create (non-standard) BamTools index file (*.bti). Default behavior is to create standard BAM index (*.bai)", m_settings->IsUsingBamtoolsIndex, IO_Opts);
}
IndexTool::~IndexTool(void) {
// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 7 September 2010
+// Last modified: 13 October 2010
// ---------------------------------------------------------------------------
// Merges multiple BAM files into one.
// ***************************************************************************
#include <iostream>
#include <string>
#include <vector>
-
#include "bamtools_merge.h"
#include "bamtools_options.h"
#include "bamtools_utilities.h"
#include "BamMultiReader.h"
#include "BamWriter.h"
-
using namespace std;
using namespace BamTools;
, m_settings(new MergeSettings)
{
// set program details
- Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename>]");
+ Options::SetProgramInfo("bamtools merge", "merges multiple BAM files into one", "[-in <filename> -in <filename> ...] [-out <filename> | [-forceCompression]] [-region <REGION>]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
Options::AddValueOption("-in", "BAM filename", "the input BAM file(s)", "", m_settings->HasInputBamFilename, m_settings->InputFiles, IO_Opts);
Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutputBamFilename, m_settings->OutputFilename, IO_Opts);
Options::AddOption("-forceCompression", "if results are sent to stdout (like when piping to another tool), default behavior is to leave output uncompressed. Use this flag to override and force compression", m_settings->IsForceCompression, IO_Opts);
-
- OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
- Options::AddValueOption("-region", "REGION", "genomic region. See README for more details", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
+ Options::AddValueOption("-region", "REGION", "genomic region. See README for more details", "", m_settings->HasRegion, m_settings->Region, IO_Opts);
}
MergeTool::~MergeTool(void) {
Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInput, m_settings->InputFiles, IO_Opts, Options::StandardIn());
Options::AddValueOption("-out", "BAM filename", "the output BAM file", "", m_settings->HasOutput, m_settings->OutputFilename, IO_Opts, Options::StandardOut());
Options::AddOption("-forceCompression", "if results are sent to stdout (like when piping to another tool), default behavior is to leave output uncompressed. Use this flag to override and force compression", m_settings->IsForceCompression, IO_Opts);
+ Options::AddValueOption("-region", "REGION", "only pull random alignments from within this genomic region. Index file is recommended for better performance, and is used automatically if it exists. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, IO_Opts);
- OptionGroup* FilterOpts = Options::CreateOptionGroup("Filters");
- Options::AddValueOption("-n", "count", "number of alignments to grab. Note - no duplicate checking is performed", "", m_settings->HasAlignmentCount, m_settings->AlignmentCount, FilterOpts, RANDOM_MAX_ALIGNMENT_COUNT);
- Options::AddValueOption("-region", "REGION", "limit source of random alignment subset to a particular genomic region. Index file is recommended for better performance, and is read automatically if it exists as <filename>.bai or <filename>.bti. See \'bamtools help index\' for more details on creating one", "", m_settings->HasRegion, m_settings->Region, FilterOpts);
+ OptionGroup* SettingsOpts = Options::CreateOptionGroup("Settings");
+ Options::AddValueOption("-n", "count", "number of alignments to grab. Note - no duplicate checking is performed", "", m_settings->HasAlignmentCount, m_settings->AlignmentCount, SettingsOpts, RANDOM_MAX_ALIGNMENT_COUNT);
}
RandomTool::~RandomTool(void) {
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools sort", "sorts a BAM file", "[-in <filename>] [-out <filename>]");
+ Options::SetProgramInfo("bamtools sort", "sorts a BAM file", "[-in <filename>] [-out <filename>] [sortOptions]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools split", "splits a BAM file on user-specified property, creating a new BAM output file for each value found", "[-in <filename>] [-stub <filename>] < -mapped | -paired | -reference | -tag <TAG> > ");
+ Options::SetProgramInfo("bamtools split", "splits a BAM file on user-specified property, creating a new BAM output file for each value found", "[-in <filename>] [-stub <filename stub>] < -mapped | -paired | -reference | -tag <TAG> > ");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");
- Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInputFilename, m_settings->InputFilename, IO_Opts, Options::StandardIn());
+ Options::AddValueOption("-in", "BAM filename", "the input BAM file", "", m_settings->HasInputFilename, m_settings->InputFilename, IO_Opts, Options::StandardIn());
Options::AddValueOption("-stub", "filename stub", "prefix stub for output BAM files (default behavior is to use input filename, without .bam extension, as stub). If input is stdin and no stub provided, a timestamp is generated as the stub.", "", m_settings->HasCustomOutputStub, m_settings->CustomOutputStub, IO_Opts);
OptionGroup* SplitOpts = Options::CreateOptionGroup("Split Options");
// Marth Lab, Department of Biology, Boston College
// All rights reserved.
// ---------------------------------------------------------------------------
-// Last modified: 5 October 2010
+// Last modified: 12 October 2010
// ---------------------------------------------------------------------------
// Prints general alignment statistics for BAM file(s).
// ***************************************************************************
#include <numeric>
#include <string>
#include <vector>
-
#include "bamtools_stats.h"
#include "bamtools_options.h"
#include "BamMultiReader.h"
// plow through file, keeping track of stats
BamAlignment al;
- while ( reader.GetNextAlignmentCore(al) ) {
+ while ( reader.GetNextAlignmentCore(al) )
ProcessAlignment(al);
- }
// print stats
PrintStats();
, m_impl(0)
{
// set program details
- Options::SetProgramInfo("bamtools stats", "prints general alignment statistics", "[-in <filename> -in <filename> ... ]");
+ Options::SetProgramInfo("bamtools stats", "prints general alignment statistics", "[-in <filename> -in <filename> ...] [statsOptions]");
// set up options
OptionGroup* IO_Opts = Options::CreateOptionGroup("Input & Output");