X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fapi%2FSamHeader.cpp;h=5de2abcd9006d6eb86693973c416b0a61b9b2998;hb=9f1ce8c47aeadb6dc1320b52ee671c3341b97935;hp=7a69162027a07fca6a2aa641048481e3d6245498;hpb=8c80d760637f8df39262683cd2570f0589423d36;p=bamtools.git diff --git a/src/api/SamHeader.cpp b/src/api/SamHeader.cpp index 7a69162..5de2abc 100644 --- a/src/api/SamHeader.cpp +++ b/src/api/SamHeader.cpp @@ -1,17 +1,18 @@ // *************************************************************************** // SamHeader.cpp (c) 2010 Derek Barnett // Marth Lab, Department of Biology, Boston College -// All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 4 March 2011 (DB) +// Last modified: 10 October 2011 (DB) // --------------------------------------------------------------------------- // Provides direct read/write access to the SAM header data fields. // *************************************************************************** -#include -#include -#include -#include +#include "api/SamConstants.h" +#include "api/SamHeader.h" +#include "api/internal/BamException_p.h" +#include "api/internal/SamFormatParser_p.h" +#include "api/internal/SamFormatPrinter_p.h" +#include "api/internal/SamHeaderValidator_p.h" using namespace BamTools; using namespace BamTools::Internal; using namespace std; @@ -21,10 +22,12 @@ using namespace std; Provides direct read/write access to the SAM header data fields. - \sa http://samtools.sourceforge.net/SAM-1.3.pdf + \sa \samSpecURL */ /*! \var SamHeader::Version \brief corresponds to \@HD VN:\ + + Required for valid SAM header, if \@HD record is present. */ /*! \var SamHeader::SortOrder \brief corresponds to \@HD SO:\ @@ -40,14 +43,9 @@ using namespace std; \brief corresponds to \@RG entries \sa SamReadGroup, SamReadGroupDictionary */ -/*! \var SamHeader::ProgramName - \brief corresponds to \@PG ID:\ -*/ -/*! \var SamHeader::ProgramVersion - \brief corresponds to \@PG VN:\ -*/ -/*! \var SamHeader::ProgramCommandLine - \brief corresponds to \@PG CL:\ +/*! \var SamHeader::Programs + \brief corresponds to \@PG entries + \sa SamProgram, SamProgramChain */ /*! \var SamHeader::Comments \brief corresponds to \@CO entries @@ -58,14 +56,10 @@ using namespace std; */ SamHeader::SamHeader(const std::string& headerText) : Version("") - , SortOrder("") + , SortOrder(Constants::SAM_HD_SORTORDER_UNKNOWN) , GroupOrder("") - , ProgramName("") - , ProgramVersion("") - , ProgramCommandLine("") { - SamFormatParser parser(*this); - parser.Parse(headerText); + SetHeaderText(headerText); } /*! \fn SamHeader::SamHeader(const SamHeader& other) @@ -77,9 +71,7 @@ SamHeader::SamHeader(const SamHeader& other) , GroupOrder(other.GroupOrder) , Sequences(other.Sequences) , ReadGroups(other.ReadGroups) - , ProgramName(other.ProgramName) - , ProgramVersion(other.ProgramVersion) - , ProgramCommandLine(other.ProgramCommandLine) + , Programs(other.Programs) { } /*! \fn SamHeader::~SamHeader(void) @@ -91,15 +83,37 @@ SamHeader::~SamHeader(void) { } \brief Clears all header contents. */ void SamHeader::Clear(void) { + + // clear SAM header components Version.clear(); SortOrder.clear(); GroupOrder.clear(); Sequences.Clear(); ReadGroups.Clear(); - ProgramName.clear(); - ProgramVersion.clear(); - ProgramCommandLine.clear(); + Programs.Clear(); Comments.clear(); + + // clear error string + m_errorString.clear(); +} + +/*! \fn std::string SamHeader::GetErrorString(void) const + \brief Returns a human-readable description of the last error that occurred + + This method allows elimination of STDERR pollution. Developers of client code + may choose how the messages are displayed to the user, if at all. + + \return error description +*/ +std::string SamHeader::GetErrorString(void) const { + return m_errorString; +} + +/*! \fn bool SamHeader::HasError(void) const + \brief Returns \c true if header encountered an error +*/ +bool SamHeader::HasError(void) const { + return (!m_errorString.empty()); } /*! \fn bool SamHeader::HasVersion(void) const @@ -137,25 +151,11 @@ bool SamHeader::HasReadGroups(void) const { return (!ReadGroups.IsEmpty()); } -/*! \fn bool SamHeader::HasProgramName(void) const - \brief Returns \c true if header contains \@PG ID:\ +/*! \fn bool SamHeader::HasPrograms(void) const + \brief Returns \c true if header contains any \@PG entries */ -bool SamHeader::HasProgramName(void) const { - return (!ProgramName.empty()); -} - -/*! \fn bool SamHeader::HasProgramVersion(void) const - \brief Returns \c true if header contains \@PG VN:\ -*/ -bool SamHeader::HasProgramVersion(void) const { - return (!ProgramVersion.empty()); -} - -/*! \fn bool SamHeader::HasProgramCommandLine(void) const - \brief Returns \c true if header contains \@PG CL:\ -*/ -bool SamHeader::HasProgramCommandLine(void) const { - return (!ProgramCommandLine.empty()); +bool SamHeader::HasPrograms(void) const { + return (!Programs.IsEmpty()); } /*! \fn bool SamHeader::HasComments(void) const @@ -167,27 +167,58 @@ bool SamHeader::HasComments(void) const { /*! \fn bool SamHeader::IsValid(bool verbose = false) const \brief Checks header contents for required data and proper formatting. - \param verbose If set to true, validation errors & warnings will be printed to stderr. - Otherwise, output is suppressed and only validation check occurs. + + \param[in] verbose If set to true, validation errors & warnings will be printed to stderr. + Otherwise, messages are available through SamHeader::GetErrorString(). \return \c true if SAM header is well-formed */ bool SamHeader::IsValid(bool verbose) const { + SamHeaderValidator validator(*this); - return validator.Validate(verbose); + + // if SAM header is valid, return success + if ( validator.Validate() ) + return true; + + // otherwiser + else { + + // print messages to stderr + if ( verbose ) + validator.PrintMessages(std::cerr); + + // or catch in local error string + else { + stringstream errorStream(""); + validator.PrintMessages(errorStream); + m_errorString = errorStream.str(); + } + return false; + } } /*! \fn void SamHeader::SetHeaderText(const std::string& headerText) \brief Replaces header contents with \a headerText. - \param headerText SAM formatted-text that will be parsed into data fields + + \param[in] headerText SAM formatted-text that will be parsed into data fields */ void SamHeader::SetHeaderText(const std::string& headerText) { // clear prior data Clear(); - // parse header text into data - SamFormatParser parser(*this); - parser.Parse(headerText); + try { + SamFormatParser parser(*this); + parser.Parse(headerText); + } catch ( BamException& e ) { + + // clear anything parsed so far + // no telling what's valid and what's partially parsed + Clear(); + + // set error string + m_errorString = e.what(); + } } /*! \fn std::string SamHeader::ToString(void) const