X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fapi%2Finternal%2FSamHeaderValidator_p.cpp;h=094e79adb795ecb4a3560fab9700dce91ecbf80d;hb=9f1ce8c47aeadb6dc1320b52ee671c3341b97935;hp=936da49c04bf13ae431ee01f875f1eab450cdeb6;hpb=c1fc1c5423ca73a1b5bcbe790650821d73e5959c;p=bamtools.git diff --git a/src/api/internal/SamHeaderValidator_p.cpp b/src/api/internal/SamHeaderValidator_p.cpp index 936da49..094e79a 100644 --- a/src/api/internal/SamHeaderValidator_p.cpp +++ b/src/api/internal/SamHeaderValidator_p.cpp @@ -2,27 +2,28 @@ // SamHeaderValidator.cpp (c) 2010 Derek Barnett // Marth Lab, Department of Biology, Boston College // --------------------------------------------------------------------------- -// Last modified: 18 April 2011 (DB) +// Last modified: 10 October 2011 (DB) // --------------------------------------------------------------------------- // Provides functionality for validating SamHeader data // *************************************************************************** -#include -#include -#include -#include +#include "api/SamConstants.h" +#include "api/SamHeader.h" +#include "api/internal/SamHeaderValidator_p.h" +#include "api/internal/SamHeaderVersion_p.h" using namespace BamTools; using namespace BamTools::Internal; #include -#include #include #include using namespace std; -namespace BamTools { -namespace Internal { +// ------------------------ +// static utility methods +// ------------------------- +static bool caseInsensitiveCompare(const string& lhs, const string& rhs) { // can omit checking chars if lengths not equal @@ -41,9 +42,6 @@ bool caseInsensitiveCompare(const string& lhs, const string& rhs) { return true; } -} // namespace Internal -} // namespace BamTools - // ------------------------------------------------------------------------ // Allow validation rules to vary, as needed, between SAM header versions // @@ -76,25 +74,62 @@ SamHeaderValidator::SamHeaderValidator(const SamHeader& header) SamHeaderValidator::~SamHeaderValidator(void) { } -bool SamHeaderValidator::Validate(bool verbose) { +void SamHeaderValidator::AddError(const string& message) { + m_errorMessages.push_back(ERROR_PREFIX + message + NEWLINE); +} + +void SamHeaderValidator::AddWarning(const string& message) { + m_warningMessages.push_back(WARN_PREFIX + message + NEWLINE); +} + +void SamHeaderValidator::PrintErrorMessages(ostream& stream) { + + // skip if no error messages + if ( m_errorMessages.empty() ) + return; + + // print error header line + stream << "* SAM header has " << m_errorMessages.size() << " errors:" << endl; + + // print each error message + vector::const_iterator errorIter = m_errorMessages.begin(); + vector::const_iterator errorEnd = m_errorMessages.end(); + for ( ; errorIter != errorEnd; ++errorIter ) + stream << (*errorIter); +} + +void SamHeaderValidator::PrintMessages(ostream& stream) { + PrintErrorMessages(stream); + PrintWarningMessages(stream); +} + +void SamHeaderValidator::PrintWarningMessages(ostream& stream) { + + // skip if no warning messages + if ( m_warningMessages.empty() ) + return; + + // print warning header line + stream << "* SAM header has " << m_warningMessages.size() << " warnings:" << endl; + + // print each warning message + vector::const_iterator warnIter = m_warningMessages.begin(); + vector::const_iterator warnEnd = m_warningMessages.end(); + for ( ; warnIter != warnEnd; ++warnIter ) + stream << (*warnIter); +} - // validate header components +// entry point for validation +bool SamHeaderValidator::Validate(void) { bool isValid = true; isValid &= ValidateMetadata(); isValid &= ValidateSequenceDictionary(); isValid &= ValidateReadGroupDictionary(); isValid &= ValidateProgramChain(); - - // report errors if desired - if ( verbose ) { - PrintErrorMessages(); - PrintWarningMessages(); - } - - // return validation status return isValid; } +// check all SAM header 'metadata' bool SamHeaderValidator::ValidateMetadata(void) { bool isValid = true; isValid &= ValidateVersion(); @@ -103,6 +138,7 @@ bool SamHeaderValidator::ValidateMetadata(void) { return isValid; } +// check SAM header version tag bool SamHeaderValidator::ValidateVersion(void) { const string& version = m_header.Version; @@ -147,6 +183,7 @@ bool SamHeaderValidator::ContainsOnlyDigits(const string& s) { return ( nonDigitPosition == string::npos ) ; } +// validate SAM header sort order tag bool SamHeaderValidator::ValidateSortOrder(void) { const string& sortOrder = m_header.SortOrder; @@ -171,6 +208,7 @@ bool SamHeaderValidator::ValidateSortOrder(void) { return false; } +// validate SAM header group order tag bool SamHeaderValidator::ValidateGroupOrder(void) { const string& groupOrder = m_header.GroupOrder; @@ -193,6 +231,7 @@ bool SamHeaderValidator::ValidateGroupOrder(void) { return false; } +// validate SAM header sequence dictionary bool SamHeaderValidator::ValidateSequenceDictionary(void) { bool isValid = true; @@ -213,6 +252,7 @@ bool SamHeaderValidator::ValidateSequenceDictionary(void) { return isValid; } +// make sure all SQ names are unique bool SamHeaderValidator::ContainsUniqueSequenceNames(void) { bool isValid = true; @@ -244,6 +284,7 @@ bool SamHeaderValidator::ContainsUniqueSequenceNames(void) { return isValid; } +// validate SAM header sequence entry bool SamHeaderValidator::ValidateSequence(const SamSequence& seq) { bool isValid = true; isValid &= CheckNameFormat(seq.Name); @@ -251,6 +292,7 @@ bool SamHeaderValidator::ValidateSequence(const SamSequence& seq) { return isValid; } +// check sequence name is valid format bool SamHeaderValidator::CheckNameFormat(const string& name) { // invalid if name is empty @@ -269,6 +311,7 @@ bool SamHeaderValidator::CheckNameFormat(const string& name) { return true; } +// check that sequence length is within accepted range bool SamHeaderValidator::CheckLengthInRange(const string& length) { // invalid if empty @@ -292,6 +335,7 @@ bool SamHeaderValidator::CheckLengthInRange(const string& length) { return true; } +// validate SAM header read group dictionary bool SamHeaderValidator::ValidateReadGroupDictionary(void) { bool isValid = true; @@ -312,6 +356,7 @@ bool SamHeaderValidator::ValidateReadGroupDictionary(void) { return isValid; } +// make sure RG IDs and platform units are unique bool SamHeaderValidator::ContainsUniqueIDsAndPlatformUnits(void) { bool isValid = true; @@ -364,6 +409,7 @@ bool SamHeaderValidator::ContainsUniqueIDsAndPlatformUnits(void) { return isValid; } +// validate SAM header read group entry bool SamHeaderValidator::ValidateReadGroup(const SamReadGroup& rg) { bool isValid = true; isValid &= CheckReadGroupID(rg.ID); @@ -371,6 +417,7 @@ bool SamHeaderValidator::ValidateReadGroup(const SamReadGroup& rg) { return isValid; } +// make sure RG ID exists bool SamHeaderValidator::CheckReadGroupID(const string& id) { // invalid if empty @@ -383,6 +430,7 @@ bool SamHeaderValidator::CheckReadGroupID(const string& id) { return true; } +// make sure RG sequencing tech is one of the accepted keywords bool SamHeaderValidator::CheckSequencingTechnology(const string& technology) { // if no technology provided, no problem, just return OK @@ -407,6 +455,7 @@ bool SamHeaderValidator::CheckSequencingTechnology(const string& technology) { return false; } +// validate the SAM header "program chain" bool SamHeaderValidator::ValidateProgramChain(void) { bool isValid = true; isValid &= ContainsUniqueProgramIds(); @@ -414,6 +463,7 @@ bool SamHeaderValidator::ValidateProgramChain(void) { return isValid; } +// make sure all PG IDs are unique bool SamHeaderValidator::ContainsUniqueProgramIds(void) { bool isValid = true; @@ -445,6 +495,7 @@ bool SamHeaderValidator::ContainsUniqueProgramIds(void) { return isValid; } +// make sure that any PP tags present point to existing @PG IDs bool SamHeaderValidator::ValidatePreviousProgramIds(void) { bool isValid = true; @@ -471,40 +522,3 @@ bool SamHeaderValidator::ValidatePreviousProgramIds(void) { // return validation state return isValid; } -void SamHeaderValidator::AddError(const string& message) { - m_errorMessages.push_back(ERROR_PREFIX + message + NEWLINE); -} - -void SamHeaderValidator::AddWarning(const string& message) { - m_warningMessages.push_back(WARN_PREFIX + message + NEWLINE); -} - -void SamHeaderValidator::PrintErrorMessages(void) { - - // skip if no error messages - if ( m_errorMessages.empty() ) return; - - // print error header line - cerr << "* SAM header has " << m_errorMessages.size() << " errors:" << endl; - - // print each error message - vector::const_iterator errorIter = m_errorMessages.begin(); - vector::const_iterator errorEnd = m_errorMessages.end(); - for ( ; errorIter != errorEnd; ++errorIter ) - cerr << (*errorIter); -} - -void SamHeaderValidator::PrintWarningMessages(void) { - - // skip if no warning messages - if ( m_warningMessages.empty() ) return; - - // print warning header line - cerr << "* SAM header has " << m_warningMessages.size() << " warnings:" << endl; - - // print each warning message - vector::const_iterator warnIter = m_warningMessages.begin(); - vector::const_iterator warnEnd = m_warningMessages.end(); - for ( ; warnIter != warnEnd; ++warnIter ) - cerr << (*warnIter); -}