X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Ftoolkit%2Fbamtools_convert.cpp;h=0e1743ffcba56a1859fbe946c3a345f890ac037a;hb=3052ce4f428518b5d75fe744d37a7e7946b10ded;hp=730a061e62a407cc42b2834c2206179c458e4d30;hpb=2b99e4788a395d5cde8c7d857fa5c6532b6222dd;p=bamtools.git diff --git a/src/toolkit/bamtools_convert.cpp b/src/toolkit/bamtools_convert.cpp index 730a061..0e1743f 100644 --- a/src/toolkit/bamtools_convert.cpp +++ b/src/toolkit/bamtools_convert.cpp @@ -1,71 +1,71 @@ // *************************************************************************** // bamtools_convert.cpp (c) 2010 Derek Barnett, Erik Garrison // Marth Lab, Department of Biology, Boston College -// All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 23 September 2010 +// Last modified: 11 November 2012 // --------------------------------------------------------------------------- // Converts between BAM and a number of other formats // *************************************************************************** +#include "bamtools_convert.h" + +#include +#include +#include +#include +#include +#include +using namespace BamTools; + #include #include #include #include #include -#include "bamtools_convert.h" -#include "bamtools_fasta.h" -#include "bamtools_options.h" -#include "bamtools_pileup_engine.h" -#include "bamtools_utilities.h" -#include "BGZF.h" -#include "BamMultiReader.h" using namespace std; -using namespace BamTools; namespace BamTools { - // --------------------------------------------- - // ConvertTool constants - - // supported conversion format command-line names - static const string FORMAT_BED = "bed"; - static const string FORMAT_BEDGRAPH = "bedgraph"; - static const string FORMAT_FASTA = "fasta"; - static const string FORMAT_FASTQ = "fastq"; - static const string FORMAT_JSON = "json"; - static const string FORMAT_SAM = "sam"; - static const string FORMAT_PILEUP = "pileup"; - static const string FORMAT_WIGGLE = "wig"; - - // other constants - static const unsigned int FASTA_LINE_MAX = 50; - - // --------------------------------------------- - // ConvertPileupFormatVisitor declaration - - class ConvertPileupFormatVisitor : public PileupVisitor { - - // ctor & dtor - public: - ConvertPileupFormatVisitor(const RefVector& references, - const string& fastaFilename, - const bool isPrintingMapQualities, - ostream* out); - ~ConvertPileupFormatVisitor(void); - - // PileupVisitor interface implementation - public: - void Visit(const PileupPosition& pileupData); - - // data members - private: - Fasta m_fasta; - bool m_hasFasta; - bool m_isPrintingMapQualities; - ostream* m_out; - RefVector m_references; - }; +// --------------------------------------------- +// ConvertTool constants + +// supported conversion format command-line names +static const string FORMAT_BED = "bed"; +static const string FORMAT_FASTA = "fasta"; +static const string FORMAT_FASTQ = "fastq"; +static const string FORMAT_JSON = "json"; +static const string FORMAT_SAM = "sam"; +static const string FORMAT_PILEUP = "pileup"; +static const string FORMAT_YAML = "yaml"; + +// other constants +static const unsigned int FASTA_LINE_MAX = 50; + +// --------------------------------------------- +// ConvertPileupFormatVisitor declaration + +class ConvertPileupFormatVisitor : public PileupVisitor { + + // ctor & dtor + public: + ConvertPileupFormatVisitor(const RefVector& references, + const string& fastaFilename, + const bool isPrintingMapQualities, + ostream* out); + ~ConvertPileupFormatVisitor(void); + + // PileupVisitor interface implementation + public: + void Visit(const PileupPosition& pileupData); + + // data members + private: + Fasta m_fasta; + bool m_hasFasta; + bool m_isPrintingMapQualities; + ostream* m_out; + RefVector m_references; +}; } // namespace BamTools @@ -74,7 +74,7 @@ namespace BamTools { struct ConvertTool::ConvertSettings { - // flags + // flag bool HasInput; bool HasOutput; bool HasFormat; @@ -115,8 +115,12 @@ struct ConvertTool::ConvertToolPrivate { // ctor & dtor public: - ConvertToolPrivate(ConvertTool::ConvertSettings* settings); - ~ConvertToolPrivate(void); + ConvertToolPrivate(ConvertTool::ConvertSettings* settings) + : m_settings(settings) + , m_out(cout.rdbuf()) + { } + + ~ConvertToolPrivate(void) { } // interface public: @@ -125,12 +129,11 @@ struct ConvertTool::ConvertToolPrivate { // internal methods private: void PrintBed(const BamAlignment& a); - void PrintBedGraph(const BamAlignment& a); void PrintFasta(const BamAlignment& a); void PrintFastq(const BamAlignment& a); void PrintJson(const BamAlignment& a); void PrintSam(const BamAlignment& a); - void PrintWiggle(const BamAlignment& a); + void PrintYaml(const BamAlignment& a); // special case - uses the PileupEngine bool RunPileupConversion(BamMultiReader* reader); @@ -142,13 +145,6 @@ struct ConvertTool::ConvertToolPrivate { ostream m_out; }; -ConvertTool::ConvertToolPrivate::ConvertToolPrivate(ConvertTool::ConvertSettings* settings) - : m_settings(settings) - , m_out(cout.rdbuf()) // default output to cout -{ } - -ConvertTool::ConvertToolPrivate::~ConvertToolPrivate(void) { } - bool ConvertTool::ConvertToolPrivate::Run(void) { // ------------------------------------ @@ -160,22 +156,40 @@ bool ConvertTool::ConvertToolPrivate::Run(void) { // open input files BamMultiReader reader; - if (!reader.Open(m_settings->InputFiles, false)) { - cerr << "Could not open input files" << endl; + if ( !reader.Open(m_settings->InputFiles) ) { + cerr << "bamtools convert ERROR: could not open input BAM file(s)... Aborting." << endl; return false; } + + // if input is not stdin & a region is provided, look for index files + if ( m_settings->HasInput && m_settings->HasRegion ) { + if ( !reader.LocateIndexes() ) { + cerr << "bamtools convert ERROR: could not locate index file(s)... Aborting." << endl; + return false; + } + } + + // retrieve reference data m_references = reader.GetReferenceData(); // set region if specified BamRegion region; if ( m_settings->HasRegion ) { if ( Utilities::ParseRegionString(m_settings->Region, reader, region) ) { - if ( !reader.SetRegion(region) ) { - cerr << "Could not set BamReader region to REGION: " << m_settings->Region << endl; - return false; + + if ( reader.HasIndexes() ) { + if ( !reader.SetRegion(region) ) { + cerr << "bamtools convert ERROR: set region failed. Check that REGION describes a valid range" << endl; + reader.Close(); + return false; + } } + } else { - cerr << "Could not parse REGION: " << m_settings->Region << endl; + cerr << "bamtools convert ERROR: could not parse REGION: " << m_settings->Region << endl; + cerr << "Check that REGION is in valid format (see documentation) and that the coordinates are valid" + << endl; + reader.Close(); return false; } } @@ -187,7 +201,8 @@ bool ConvertTool::ConvertToolPrivate::Run(void) { // open output file stream outFile.open(m_settings->OutputFilename.c_str()); if ( !outFile ) { - cerr << "Could not open " << m_settings->OutputFilename << " for output" << endl; + cerr << "bamtools convert ERROR: could not open " << m_settings->OutputFilename + << " for output" << endl; return false; } @@ -212,16 +227,15 @@ bool ConvertTool::ConvertToolPrivate::Run(void) { // set function pointer to proper conversion method void (BamTools::ConvertTool::ConvertToolPrivate::*pFunction)(const BamAlignment&) = 0; - if ( m_settings->Format == FORMAT_BED ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintBed; - else if ( m_settings->Format == FORMAT_BEDGRAPH ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintBedGraph; - else if ( m_settings->Format == FORMAT_FASTA ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFasta; - else if ( m_settings->Format == FORMAT_FASTQ ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFastq; - else if ( m_settings->Format == FORMAT_JSON ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintJson; - else if ( m_settings->Format == FORMAT_SAM ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintSam; - else if ( m_settings->Format == FORMAT_WIGGLE ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintWiggle; + if ( m_settings->Format == FORMAT_BED ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintBed; + else if ( m_settings->Format == FORMAT_FASTA ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFasta; + else if ( m_settings->Format == FORMAT_FASTQ ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintFastq; + else if ( m_settings->Format == FORMAT_JSON ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintJson; + else if ( m_settings->Format == FORMAT_SAM ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintSam; + else if ( m_settings->Format == FORMAT_YAML ) pFunction = &BamTools::ConvertTool::ConvertToolPrivate::PrintYaml; else { - cerr << "Unrecognized format: " << m_settings->Format << endl; - cerr << "Please see help|README (?) for details on supported formats " << endl; + cerr << "bamtools convert ERROR: unrecognized format: " << m_settings->Format << endl; + cerr << "Please see documentation for list of supported formats " << endl; formatError = true; convertedOk = false; } @@ -235,8 +249,8 @@ bool ConvertTool::ConvertToolPrivate::Run(void) { // iterate through file, doing conversion BamAlignment a; - while ( reader.GetNextAlignment(a) ) - (this->*pFunction)(a); + while ( reader.GetNextAlignment(a) ) + (this->*pFunction)(a); // set flag for successful conversion convertedOk = true; @@ -245,9 +259,9 @@ bool ConvertTool::ConvertToolPrivate::Run(void) { // ------------------------ // clean up & exit - reader.Close(); - if ( m_settings->HasOutput ) outFile.close(); + if ( m_settings->HasOutput ) + outFile.close(); return convertedOk; } @@ -263,16 +277,12 @@ void ConvertTool::ConvertToolPrivate::PrintBed(const BamAlignment& a) { m_out << m_references.at(a.RefID).RefName << "\t" << a.Position << "\t" - << a.GetEndPosition() + 1 << "\t" + << a.GetEndPosition() << "\t" << a.Name << "\t" << a.MapQuality << "\t" << (a.IsReverseStrand() ? "-" : "+") << endl; } -void ConvertTool::ConvertToolPrivate::PrintBedGraph(const BamAlignment& a) { - ; -} - // print BamAlignment in FASTA format // N.B. - uses QueryBases NOT AlignedBases void ConvertTool::ConvertToolPrivate::PrintFasta(const BamAlignment& a) { @@ -284,7 +294,7 @@ void ConvertTool::ConvertToolPrivate::PrintFasta(const BamAlignment& a) { // N.B. - QueryBases are reverse-complemented if aligned to reverse strand // print header - m_out << "> " << a.Name << endl; + m_out << ">" << a.Name << endl; // handle reverse strand alignment - bases string sequence = a.QueryBases; @@ -362,11 +372,12 @@ void ConvertTool::ConvertToolPrivate::PrintJson(const BamAlignment& a) { if ( !cigarData.empty() ) { m_out << "\"cigar\":["; vector::const_iterator cigarBegin = cigarData.begin(); - vector::const_iterator cigarIter = cigarBegin; - vector::const_iterator cigarEnd = cigarData.end(); + vector::const_iterator cigarIter = cigarBegin; + vector::const_iterator cigarEnd = cigarData.end(); for ( ; cigarIter != cigarEnd; ++cigarIter ) { const CigarOp& op = (*cigarIter); - if (cigarIter != cigarBegin) m_out << ","; + if (cigarIter != cigarBegin) + m_out << ","; m_out << "\"" << op.Length << op.Type << "\""; } m_out << "],"; @@ -385,27 +396,29 @@ void ConvertTool::ConvertToolPrivate::PrintJson(const BamAlignment& a) { m_out << "\"queryBases\":\"" << a.QueryBases << "\","; // write qualities - if ( !a.Qualities.empty() ) { + if ( !a.Qualities.empty() && a.Qualities.at(0) != (char)0xFF ) { string::const_iterator s = a.Qualities.begin(); m_out << "\"qualities\":[" << static_cast(*s) - 33; ++s; - for (; s != a.Qualities.end(); ++s) { + for ( ; s != a.Qualities.end(); ++s ) m_out << "," << static_cast(*s) - 33; - } m_out << "],"; } + // write alignment's source BAM file + m_out << "\"filename\":" << a.Filename << ","; + // write tag data const char* tagData = a.TagData.c_str(); const size_t tagDataLength = a.TagData.length(); size_t index = 0; - if (index < tagDataLength) { + if ( index < tagDataLength ) { m_out << "\"tags\":{"; while ( index < tagDataLength ) { - if (index > 0) + if ( index > 0 ) m_out << ","; // write tag name @@ -415,55 +428,51 @@ void ConvertTool::ConvertToolPrivate::PrintJson(const BamAlignment& a) { // get data type char type = a.TagData.at(index); ++index; - - switch (type) { - case('A') : + switch ( type ) { + case (Constants::BAM_TAG_TYPE_ASCII) : m_out << "\"" << tagData[index] << "\""; ++index; break; - case('C') : - m_out << (int)tagData[index]; - ++index; + case (Constants::BAM_TAG_TYPE_INT8) : + // force value into integer-type (instead of char value) + m_out << static_cast(tagData[index]); + ++index; break; - - case('c') : - m_out << (int)tagData[index]; + + case (Constants::BAM_TAG_TYPE_UINT8) : + // force value into integer-type (instead of char value) + m_out << static_cast(tagData[index]); ++index; break; - case('S') : - m_out << BgzfData::UnpackUnsignedShort(&tagData[index]); - index += 2; - break; - - case('s') : - m_out << BgzfData::UnpackSignedShort(&tagData[index]); - index += 2; + case (Constants::BAM_TAG_TYPE_INT16) : + m_out << BamTools::UnpackSignedShort(&tagData[index]); + index += sizeof(int16_t); break; - - case('I') : - m_out << BgzfData::UnpackUnsignedInt(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_UINT16) : + m_out << BamTools::UnpackUnsignedShort(&tagData[index]); + index += sizeof(uint16_t); break; - - case('i') : - m_out << BgzfData::UnpackSignedInt(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_INT32) : + m_out << BamTools::UnpackSignedInt(&tagData[index]); + index += sizeof(int32_t); break; - - case('f') : - m_out << BgzfData::UnpackFloat(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_UINT32) : + m_out << BamTools::UnpackUnsignedInt(&tagData[index]); + index += sizeof(uint32_t); break; - - case('d') : - m_out << BgzfData::UnpackDouble(&tagData[index]); - index += 8; + + case (Constants::BAM_TAG_TYPE_FLOAT) : + m_out << BamTools::UnpackFloat(&tagData[index]); + index += sizeof(float); break; - case('Z') : - case('H') : + case (Constants::BAM_TAG_TYPE_HEX) : + case (Constants::BAM_TAG_TYPE_STRING) : m_out << "\""; while (tagData[index]) { if (tagData[index] == '\"') @@ -494,8 +503,8 @@ void ConvertTool::ConvertToolPrivate::PrintSam(const BamAlignment& a) { // [ :: [...] ] // write name & alignment flag - m_out << a.Name << "\t" << a.AlignmentFlag << "\t"; - + m_out << a.Name << "\t" << a.AlignmentFlag << "\t"; + // write reference name if ( (a.RefID >= 0) && (a.RefID < (int)m_references.size()) ) m_out << m_references[a.RefID].RefName << "\t"; @@ -520,19 +529,26 @@ void ConvertTool::ConvertToolPrivate::PrintSam(const BamAlignment& a) { // write mate reference name, mate position, & insert size if ( a.IsPaired() && (a.MateRefID >= 0) && (a.MateRefID < (int)m_references.size()) ) { - if ( a.MateRefID == a.RefID ) m_out << "=\t"; - else m_out << m_references[a.MateRefID].RefName << "\t"; + if ( a.MateRefID == a.RefID ) + m_out << "=\t"; + else + m_out << m_references[a.MateRefID].RefName << "\t"; m_out << a.MatePosition+1 << "\t" << a.InsertSize << "\t"; } - else m_out << "*\t0\t0\t"; + else + m_out << "*\t0\t0\t"; // write sequence - if ( a.QueryBases.empty() ) m_out << "*\t"; - else m_out << a.QueryBases << "\t"; + if ( a.QueryBases.empty() ) + m_out << "*\t"; + else + m_out << a.QueryBases << "\t"; // write qualities - if ( a.Qualities.empty() ) m_out << "*"; - else m_out << a.Qualities; + if ( a.Qualities.empty() || (a.Qualities.at(0) == (char)0xFF) ) + m_out << "*"; + else + m_out << a.Qualities; // write tag data const char* tagData = a.TagData.c_str(); @@ -549,72 +565,104 @@ void ConvertTool::ConvertToolPrivate::PrintSam(const BamAlignment& a) { // get data type char type = a.TagData.at(index); ++index; - switch (type) { - case('A') : - m_out << "A:" << tagData[index]; - ++index; + switch ( type ) { + case (Constants::BAM_TAG_TYPE_ASCII) : + m_out << "A:" << tagData[index]; + ++index; break; - - case('C') : - m_out << "i:" << (int)tagData[index]; - ++index; - break; - - case('c') : - m_out << "i:" << (int)tagData[index]; - ++index; + + case (Constants::BAM_TAG_TYPE_INT8) : + // force value into integer-type (instead of char value) + m_out << "i:" << static_cast(tagData[index]); + ++index; break; - - case('S') : - m_out << "i:" << BgzfData::UnpackUnsignedShort(&tagData[index]); - index += 2; + + case (Constants::BAM_TAG_TYPE_UINT8) : + // force value into integer-type (instead of char value) + m_out << "i:" << static_cast(tagData[index]); + ++index; break; - - case('s') : - m_out << "i:" << BgzfData::UnpackSignedShort(&tagData[index]); - index += 2; + + case (Constants::BAM_TAG_TYPE_INT16) : + m_out << "i:" << BamTools::UnpackSignedShort(&tagData[index]); + index += sizeof(int16_t); break; - - case('I') : - m_out << "i:" << BgzfData::UnpackUnsignedInt(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_UINT16) : + m_out << "i:" << BamTools::UnpackUnsignedShort(&tagData[index]); + index += sizeof(uint16_t); break; - - case('i') : - m_out << "i:" << BgzfData::UnpackSignedInt(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_INT32) : + m_out << "i:" << BamTools::UnpackSignedInt(&tagData[index]); + index += sizeof(int32_t); break; - - case('f') : - m_out << "f:" << BgzfData::UnpackFloat(&tagData[index]); - index += 4; + + case (Constants::BAM_TAG_TYPE_UINT32) : + m_out << "i:" << BamTools::UnpackUnsignedInt(&tagData[index]); + index += sizeof(uint32_t); break; - - case('d') : - m_out << "d:" << BgzfData::UnpackDouble(&tagData[index]); - index += 8; + + case (Constants::BAM_TAG_TYPE_FLOAT) : + m_out << "f:" << BamTools::UnpackFloat(&tagData[index]); + index += sizeof(float); break; - - case('Z') : - case('H') : + + case (Constants::BAM_TAG_TYPE_HEX) : // fall-through + case (Constants::BAM_TAG_TYPE_STRING) : m_out << type << ":"; while (tagData[index]) { m_out << tagData[index]; ++index; } - ++index; - break; + ++index; + break; } - if ( tagData[index] == '\0') + if ( tagData[index] == '\0' ) break; } m_out << endl; } -void ConvertTool::ConvertToolPrivate::PrintWiggle(const BamAlignment& a) { - ; +// Print BamAlignment in YAML format +void ConvertTool::ConvertToolPrivate::PrintYaml(const BamAlignment& a) { + + // write alignment name + m_out << "---" << endl; + m_out << a.Name << ":" << endl; + + // write alignment data + m_out << " " << "AlndBases: " << a.AlignedBases << endl; + m_out << " " << "Qualities: " << a.Qualities << endl; + m_out << " " << "Name: " << a.Name << endl; + m_out << " " << "Length: " << a.Length << endl; + m_out << " " << "TagData: " << a.TagData << endl; + m_out << " " << "RefID: " << a.RefID << endl; + m_out << " " << "RefName: " << m_references[a.RefID].RefName << endl; + m_out << " " << "Position: " << a.Position << endl; + m_out << " " << "Bin: " << a.Bin << endl; + m_out << " " << "MapQuality: " << a.MapQuality << endl; + m_out << " " << "AlignmentFlag: " << a.AlignmentFlag << endl; + m_out << " " << "MateRefID: " << a.MateRefID << endl; + m_out << " " << "MatePosition: " << a.MatePosition << endl; + m_out << " " << "InsertSize: " << a.InsertSize << endl; + m_out << " " << "Filename: " << a.Filename << endl; + + // write Cigar data + const vector& cigarData = a.CigarData; + if ( !cigarData.empty() ) { + m_out << " " << "Cigar: "; + vector::const_iterator cigarBegin = cigarData.begin(); + vector::const_iterator cigarIter = cigarBegin; + vector::const_iterator cigarEnd = cigarData.end(); + for ( ; cigarIter != cigarEnd; ++cigarIter ) { + const CigarOp& op = (*cigarIter); + m_out << op.Length << op.Type; + } + m_out << endl; + } } bool ConvertTool::ConvertToolPrivate::RunPileupConversion(BamMultiReader* reader) { @@ -655,19 +703,17 @@ ConvertTool::ConvertTool(void) , m_impl(0) { // set program details - Options::SetProgramInfo("bamtools convert", "converts BAM to a number of other formats", "-format [-in -in ...] [-out ] [other options]"); + Options::SetProgramInfo("bamtools convert", "converts BAM to a number of other formats", "-format [-in -in ...] [-out ] [-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 .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"); @@ -675,6 +721,7 @@ ConvertTool::ConvertTool(void) } ConvertTool::~ConvertTool(void) { + delete m_settings; m_settings = 0; @@ -692,9 +739,10 @@ int ConvertTool::Run(int argc, char* argv[]) { // parse command line arguments Options::Parse(argc, argv, 1); - // run internal ConvertTool implementation, return success/fail + // initialize ConvertTool with settings m_impl = new ConvertToolPrivate(m_settings); + // run ConvertTool, return success/fail if ( m_impl->Run() ) return 0; else @@ -749,7 +797,7 @@ void ConvertPileupFormatVisitor::Visit(const PileupPosition& pileupData ) { char referenceBase('N'); if ( m_hasFasta && (pileupData.Position < m_references[pileupData.RefId].RefLength) ) { if ( !m_fasta.GetBase(pileupData.RefId, pileupData.Position, referenceBase ) ) { - cerr << "Pileup error : Could not read reference base from FASTA file" << endl; + cerr << "bamtools convert ERROR: pileup conversion - could not read reference base from FASTA file" << endl; return; } } @@ -786,11 +834,11 @@ void ConvertPileupFormatVisitor::Visit(const PileupPosition& pileupData ) { toupper(base) == toupper(referenceBase) || tolower(base) == tolower(referenceBase) ) { - base = (ba.IsReverseStrand() ? ',' : '.' ); + base = ( ba.IsReverseStrand() ? ',' : '.' ); } // mismatches reference - else base = (ba.IsReverseStrand() ? tolower(base) : toupper(base) ); + else base = ( ba.IsReverseStrand() ? tolower(base) : toupper(base) ); // store base bases << base; @@ -811,7 +859,7 @@ void ConvertPileupFormatVisitor::Visit(const PileupPosition& pileupData ) { char deletedBase('N'); if ( m_hasFasta && (pileupData.Position+i < m_references[pileupData.RefId].RefLength) ) { if ( !m_fasta.GetBase(pileupData.RefId, pileupData.Position+i, deletedBase ) ) { - cerr << "Pileup error : Could not read reference base from FASTA file" << endl; + cerr << "bamtools convert ERROR: pileup conversion - could not read reference base from FASTA file" << endl; return; } } @@ -824,7 +872,8 @@ void ConvertPileupFormatVisitor::Visit(const PileupPosition& pileupData ) { else bases << '*'; // if end of read segment - if ( pa.IsSegmentEnd ) bases << '$'; + if ( pa.IsSegmentEnd ) + bases << '$'; // store current base quality baseQualities << ba.Qualities.at(pa.PositionInAlignment);