X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fapi%2FSamHeader.cpp;h=967957ac15dde882fd56677553fd6389afcacfa6;hb=d87a3d2b453e3f4b6c5acc376870ef46f86a0337;hp=9104978ba7492c77db439b3c037984c5874051d1;hpb=cdf4bbcb19025398d429035fe672661a8c8d1a80;p=bamtools.git diff --git a/src/api/SamHeader.cpp b/src/api/SamHeader.cpp index 9104978..967957a 100644 --- a/src/api/SamHeader.cpp +++ b/src/api/SamHeader.cpp @@ -1,18 +1,18 @@ // *************************************************************************** // SamHeader.cpp (c) 2010 Derek Barnett // Marth Lab, Department of Biology, Boston College -// All rights reserved. // --------------------------------------------------------------------------- -// Last modified: 19 April 2011 (DB) +// Last modified: 25 October 2011 (DB) // --------------------------------------------------------------------------- // Provides direct read/write access to the SAM header data fields. // *************************************************************************** -#include -#include -#include -#include -#include +#include "api/SamConstants.h" +#include "api/SamHeader.h" +#include "api/internal/utils/BamException_p.h" +#include "api/internal/sam/SamFormatParser_p.h" +#include "api/internal/sam/SamFormatPrinter_p.h" +#include "api/internal/sam/SamHeaderValidator_p.h" using namespace BamTools; using namespace BamTools::Internal; using namespace std; @@ -27,7 +27,7 @@ using namespace std; /*! \var SamHeader::Version \brief corresponds to \@HD VN:\ - Required for valid SAM header, if @HD record is present. + Required for valid SAM header, if \@HD record is present. */ /*! \var SamHeader::SortOrder \brief corresponds to \@HD SO:\ @@ -43,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 @@ -64,8 +59,7 @@ SamHeader::SamHeader(const std::string& headerText) , SortOrder(Constants::SAM_HD_SORTORDER_UNKNOWN) , GroupOrder("") { - SamFormatParser parser(*this); - parser.Parse(headerText); + SetHeaderText(headerText); } /*! \fn SamHeader::SamHeader(const SamHeader& other) @@ -78,6 +72,7 @@ SamHeader::SamHeader(const SamHeader& other) , Sequences(other.Sequences) , ReadGroups(other.ReadGroups) , Programs(other.Programs) + , Comments(other.Comments) { } /*! \fn SamHeader::~SamHeader(void) @@ -89,6 +84,8 @@ SamHeader::~SamHeader(void) { } \brief Clears all header contents. */ void SamHeader::Clear(void) { + + // clear SAM header components Version.clear(); SortOrder.clear(); GroupOrder.clear(); @@ -96,6 +93,28 @@ void SamHeader::Clear(void) { ReadGroups.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 @@ -149,27 +168,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