// 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 <api/SamConstants.h>
-#include <api/SamHeader.h>
-#include <api/internal/SamHeaderValidator_p.h>
-#include <api/internal/SamHeaderVersion_p.h>
+#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 <cctype>
-#include <iostream>
#include <set>
#include <sstream>
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
return true;
}
-} // namespace Internal
-} // namespace BamTools
-
// ------------------------------------------------------------------------
// Allow validation rules to vary, as needed, between SAM header versions
//
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<string>::const_iterator errorIter = m_errorMessages.begin();
+ vector<string>::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<string>::const_iterator warnIter = m_warningMessages.begin();
+ vector<string>::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();
return isValid;
}
+// check SAM header version tag
bool SamHeaderValidator::ValidateVersion(void) {
const string& version = m_header.Version;
return ( nonDigitPosition == string::npos ) ;
}
+// validate SAM header sort order tag
bool SamHeaderValidator::ValidateSortOrder(void) {
const string& sortOrder = m_header.SortOrder;
return false;
}
+// validate SAM header group order tag
bool SamHeaderValidator::ValidateGroupOrder(void) {
const string& groupOrder = m_header.GroupOrder;
return false;
}
+// validate SAM header sequence dictionary
bool SamHeaderValidator::ValidateSequenceDictionary(void) {
bool isValid = true;
return isValid;
}
+// make sure all SQ names are unique
bool SamHeaderValidator::ContainsUniqueSequenceNames(void) {
bool isValid = true;
return isValid;
}
+// validate SAM header sequence entry
bool SamHeaderValidator::ValidateSequence(const SamSequence& seq) {
bool isValid = true;
isValid &= CheckNameFormat(seq.Name);
return isValid;
}
+// check sequence name is valid format
bool SamHeaderValidator::CheckNameFormat(const string& name) {
// invalid if name is empty
return true;
}
+// check that sequence length is within accepted range
bool SamHeaderValidator::CheckLengthInRange(const string& length) {
// invalid if empty
return true;
}
+// validate SAM header read group dictionary
bool SamHeaderValidator::ValidateReadGroupDictionary(void) {
bool isValid = true;
return isValid;
}
+// make sure RG IDs and platform units are unique
bool SamHeaderValidator::ContainsUniqueIDsAndPlatformUnits(void) {
bool isValid = true;
return isValid;
}
+// validate SAM header read group entry
bool SamHeaderValidator::ValidateReadGroup(const SamReadGroup& rg) {
bool isValid = true;
isValid &= CheckReadGroupID(rg.ID);
return isValid;
}
+// make sure RG ID exists
bool SamHeaderValidator::CheckReadGroupID(const string& id) {
// invalid if empty
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
return false;
}
+// validate the SAM header "program chain"
bool SamHeaderValidator::ValidateProgramChain(void) {
bool isValid = true;
isValid &= ContainsUniqueProgramIds();
return isValid;
}
+// make sure all PG IDs are unique
bool SamHeaderValidator::ContainsUniqueProgramIds(void) {
bool isValid = true;
return isValid;
}
+// make sure that any PP tags present point to existing @PG IDs
bool SamHeaderValidator::ValidatePreviousProgramIds(void) {
bool isValid = true;
// 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<string>::const_iterator errorIter = m_errorMessages.begin();
- vector<string>::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<string>::const_iterator warnIter = m_warningMessages.begin();
- vector<string>::const_iterator warnEnd = m_warningMessages.end();
- for ( ; warnIter != warnEnd; ++warnIter )
- cerr << (*warnIter);
-}