33 static std::map< SG::auxid_t, ::TClass* > s_dictCache =
34 std::map< SG::auxid_t, ::TClass* >();
36 TFileChecker::TFileChecker()
37 : ::TObject(), m_stopOnError( kFALSE ), m_ignoredVariables(),
38 m_orpannedContainers() {
45 m_orpannedContainers.clear();
49 return StatusCode::SUCCESS;
55 XAOD_MESSAGE(
"Couldn't load event 0 from the input" ) );
56 return StatusCode::FAILURE;
60 std::set< std::string > containerNames;
62 EventFormat::const_iterator ef_itr =
ef->begin();
63 EventFormat::const_iterator ef_end =
ef->end();
64 for( ; ef_itr != ef_end; ++ef_itr ) {
67 if( ef_itr->first.find(
"Aux." ) == ( ef_itr->first.size() - 4 ) ) {
70 if( ef_itr->second.parentName() !=
"" ) {
80 containerNames.insert( ef_itr->first );
84 const ::Long64_t
entries =
event.getEntries();
90 XAOD_MESSAGE(
"Failed to load event %i from the input" ),
91 static_cast< int >(
entry ) );
92 return StatusCode::FAILURE;
96 if( ! (
entry % 100 ) ) {
97 Info(
"check",
"Now validating entry %i / %i",
98 static_cast< int >(
entry ),
static_cast< int >(
entries ) );
102 for(
const std::string& cname : containerNames ) {
110 if( m_stopOnError ) {
112 checkContainer( *
vec, cname ) );
114 if( checkContainer( *
vec, cname ).isFailure() ) {
118 cname.c_str(),
static_cast< int >(
entry ) );
125 return StatusCode::SUCCESS;
128 void TFileChecker::setStopOnError( ::Bool_t
value ) {
130 m_stopOnError =
value;
134 ::Bool_t TFileChecker::stopOnError()
const {
136 return m_stopOnError;
139 void TFileChecker::addIgnoredVariable(
const std::string&
name ) {
141 m_ignoredVariables.insert(
name );
146 TFileChecker::setIgnoredVariables(
const std::set< std::string >&
value ) {
148 m_ignoredVariables =
value;
152 const std::set< std::string >& TFileChecker::ignoredVariables()
const {
154 return m_ignoredVariables;
158 const std::string&
name ) {
168 if( m_orpannedContainers.find(
name ) ==
169 m_orpannedContainers.end() ) {
170 Error(
"checkContainer",
174 m_orpannedContainers.insert(
name );
175 return StatusCode::FAILURE;
177 return StatusCode::SUCCESS;
184 return StatusCode::SUCCESS;
189 const size_t size =
vec.size_v();
200 const void* vecPtr = ioStore->
getIOData( auxid );
202 Error(
"checkContainer",
205 return StatusCode::FAILURE;
210 auto itr = s_dictCache.find( auxid );
211 if( itr != s_dictCache.end() ) {
214 const std::type_info* typeId = reg.
getVecType( auxid );
216 Error(
"checkContainer",
219 reg.
getName( auxid ).c_str() );
220 return StatusCode::FAILURE;
222 cl = ::TClass::GetClass( *typeId );
223 s_dictCache[ auxid ] =
cl;
226 Error(
"checkContainer",
227 XAOD_MESSAGE(
"Couldn't get dictionary for variable %s" ),
228 reg.
getName( auxid ).c_str() );
229 return StatusCode::FAILURE;
233 ::TVirtualCollectionProxy*
proxy =
cl->GetCollectionProxy();
235 Error(
"checkContainer",
238 reg.
getName( auxid ).c_str() );
239 return StatusCode::FAILURE;
243 proxy->PushProxy( (
void* ) vecPtr );
244 const size_t varSize =
static_cast< size_t >(
proxy->Size() );
248 if( (
size != varSize ) &&
249 ( m_ignoredVariables.find( reg.
getName( auxid ) ) ==
250 m_ignoredVariables.end() ) ) {
251 Error(
"checkContainer",
252 XAOD_MESSAGE(
"%s.size() (%i) != %sAux.%s.size() (%i)" ),
253 name.c_str(),
static_cast< int >(
size ),
255 static_cast< int >( varSize ) );
256 return StatusCode::FAILURE;
261 return StatusCode::SUCCESS;