11 #include "GaudiKernel/ITHistSvc.h"
42 #include "CLHEP/Vector/LorentzVector.h"
43 using CLHEP::HepLorentzVector;
47 m_ValidationNtupleTools(),
48 m_ValTrkParticleNtupleTool(
"Trk::BasicValTrkParticleNtupleTool/BasicValTrkParticleNtupleTool"),
49 m_truthNtupleTool(
"Trk::TruthNtupleTool/TruthNtupleTool"),
50 m_jetTruthNtupleTool(
""),
51 m_trackTruthClassifierHandles(),
52 m_trackTruthClassifiers(0),
53 m_eventPropertyNtupleHandles(),
54 m_eventPropertyNtupleTools(0),
55 m_inputTrackCollection(0),
56 m_trackTruthCollectionName(0),
57 m_McEventCollectionName(
"TruthEvent"),
58 m_inputPrimaryVertexCollection(
""),
59 m_ntupleFileName(
"TRKVAL"),
60 m_ntupleDirName(
"Validation"),
61 m_truthToTrack(
"Trk::TruthToTrack/TruthToTrack"),
62 m_trackSelector(
"InDet::InDetTrackSelectorTool/InDetTrackSelectorTool"),
63 m_genPartSelector(
"Trk::InDetReconstructableSelector/InDetReconstructableSelector"),
64 m_genJetFinder(
"Trk::GenParticleJetFinder/GenParticleJetFinder"),
65 m_useExternalEventLinkTree(false),
67 m_doTrackParticle(false),
68 m_visibleParticleWithoutTruth(nullptr),
69 m_nTrackTreeRecords(0),
71 m_eventLinkTree(nullptr)
89 declareProperty(
"PrimaryVertexCollection",
m_inputPrimaryVertexCollection,
"SG key of input PrimaryVertex collection (needed for TrackSelector, if no vertex collection is given, the selector will not use the vertex position)");
112 msg(MSG::INFO) <<
"TrackValidationNtupleWriter initialize()" <<
endmsg;
115 if (m_doTruth && (m_inputTrackCollection.size() != m_trackTruthCollectionName.size())) {
116 msg(
MSG::FATAL) <<
"joboptions TrackCollection and TrackTruthCollection have different sizes!" <<
endmsg;
118 msg(
MSG::FATAL) <<
" please make sure to set for each TrackCollection the corresponding TrackTruthCollection" <<
endmsg;
119 return StatusCode::FAILURE;
124 if (
sc.isFailure()) {
125 msg(
MSG::FATAL) <<
"Could not retrieve "<< m_ValidationNtupleTools <<
" (to write validation ntuple) "<<
endmsg;
128 if(m_doTrackParticle){
130 sc = m_ValTrkParticleNtupleTool.retrieve();
131 if (
sc.isFailure()) {
132 msg(
MSG::FATAL) <<
"Could not retrieve "<< m_ValTrkParticleNtupleTool <<
" (to write TrackParticle validation ntuple) "<<
endmsg;
138 if ( !m_trackSelector.empty() ) {
139 sc = m_trackSelector.retrieve();
140 if (
sc.isFailure()) {
141 msg(
MSG::FATAL) <<
"Could not retrieve "<< m_trackSelector <<
" (to select the tracks which are written to the ntuple) "<<
endmsg;
142 msg(MSG::INFO) <<
"Set the ToolHandle to None if track selection is supposed to be disabled" <<
endmsg;
147 msg(MSG::INFO) <<
"Track Selector retrieved" <<
endmsg;
151 if ( m_eventPropertyNtupleHandles.retrieve().isFailure() ) {
152 msg(MSG::ERROR) <<
"Failed to retreive " << m_eventPropertyNtupleHandles <<
endmsg;
154 msg(MSG::INFO) <<
"Retrieved " << m_eventPropertyNtupleHandles <<
endmsg;
159 itTools = m_eventPropertyNtupleHandles.begin();
160 for ( ; itTools != m_eventPropertyNtupleHandles.end(); ++itTools ) {
162 m_eventPropertyNtupleTools.push_back(&(*(*itTools)));
167 sc = m_truthToTrack.retrieve();
168 if (
sc.isFailure()) {
174 sc = m_genPartSelector.retrieve();
175 if (
sc.isFailure()) {
183 if ( m_trackTruthClassifierHandles.retrieve().isFailure() ) {
184 msg(MSG::ERROR) <<
"Failed to retreive " << m_trackTruthClassifierHandles <<
endmsg;
186 msg(MSG::INFO) <<
"Retrieved " << m_trackTruthClassifierHandles <<
endmsg;
189 itTools = m_trackTruthClassifierHandles.begin();
190 for ( ; itTools != m_trackTruthClassifierHandles.end(); ++itTools ) {
192 m_trackTruthClassifiers.push_back(&(*(*itTools)));
197 if (! m_jetTruthNtupleTool.empty()) {
198 sc = m_jetTruthNtupleTool.retrieve();
199 if (
sc.isFailure()) {
200 msg(MSG::ERROR) <<
"Could not retrieve "<< m_jetTruthNtupleTool
201 <<
" (to write jet data)."<<
endmsg <<
"--> Instead configure "
202 <<
"to empty string if jet data not desired." <<
endmsg;
205 sc = m_genJetFinder.retrieve();
206 if (
sc.isFailure()) {
207 msg(MSG::ERROR) <<
"Could not retrieve "<< m_genJetFinder
208 <<
" (to find jets at truth level)."<<
endmsg;
214 sc = m_truthNtupleTool.retrieve();
215 if (
sc.isFailure()) {
216 msg(
MSG::FATAL) <<
"Could not retrieve "<< m_truthNtupleTool <<
" (to write truth data) "<<
endmsg;
219 bool include_jets = (! m_jetTruthNtupleTool.empty());
220 sc = m_truthNtupleTool->initBranches(m_trackTruthClassifiers, include_jets, m_inputTrackCollection);
221 if (
sc.isFailure())
return sc;
230 sc = service(
"THistSvc", tHistSvc);
231 if (
sc.isFailure()) {
232 msg(MSG::ERROR) <<
"Unable to retrieve pointer to THistSvc" <<
endmsg;
237 std::vector<std::string>::const_iterator trackColNameIter = m_inputTrackCollection.begin();
239 for (; trackColNameIter != m_inputTrackCollection.end(); ++trackColNameIter) {
240 TTree*
tree =
new TTree((*trackColNameIter).c_str(), ((*trackColNameIter)+
" Validation").c_str());
241 m_trees.push_back(
tree);
242 std::string fullNtupleName =
"/"+m_ntupleFileName+
"/"+m_ntupleDirName+
"/"+(*trackColNameIter);
243 sc = tHistSvc->regTree(fullNtupleName,
tree);
244 if (
sc.isFailure()) {
245 msg(MSG::ERROR) <<
"Unable to register TTree : " << fullNtupleName <<
endmsg;
250 itTools = m_ValidationNtupleTools.begin();
251 for ( ; itTools != m_ValidationNtupleTools.end(); ++itTools ) {
252 if (((*itTools)->addNtupleItems(
tree)).isFailure()) {
253 msg(MSG::ERROR) <<
"ValidationNtupleTool could not add its branches"
254 <<
" for tree " << fullNtupleName <<
endmsg;
255 return StatusCode::FAILURE;
259 m_nTrackTreeRecords.push_back( 0 );
264 std::vector<std::string>::const_iterator trackParticleColNameIter = m_inputTrackParticleCollection.begin();
266 for (; trackParticleColNameIter != m_inputTrackParticleCollection.end(); ++trackParticleColNameIter ) {
267 TTree*
tree =
new TTree((*trackParticleColNameIter).c_str(), ((*trackParticleColNameIter)+
" Validation").c_str());
268 m_trees.push_back(
tree);
269 std::string fullNtupleName =
"/"+m_ntupleFileName+
"/"+m_ntupleDirName+
"/"+(*trackParticleColNameIter);
270 sc = tHistSvc->regTree(fullNtupleName,
tree);
271 if (
sc.isFailure()) {
272 msg(MSG::ERROR) <<
"Unable to register TTree : " << fullNtupleName <<
endmsg;
276 sc = m_ValTrkParticleNtupleTool->addNtupleItems(
tree);
277 if (
sc.isFailure()) {
278 msg(MSG::ERROR) <<
"ValidationNtupleTool could not add its branches for tree " << fullNtupleName <<
endmsg;
284 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ) {
285 if( m_eventPropertyNtupleTools[toolIndex]->isTrackLinkTool( ) ) {
286 m_eventPropertyNtupleTools[toolIndex]->registerTrackCollections( m_inputTrackCollection,
289 else if(m_eventPropertyNtupleTools[toolIndex]->isTrkParticleLinkTool() )
290 m_eventPropertyNtupleTools[toolIndex]->registerTrackCollections( m_inputTrackParticleCollection, m_doTruth );
295 if (!m_useExternalEventLinkTree) {
296 m_eventLinkTree =
new TTree(
"EventToTrackLink",
"Event to track entry link");
297 std::string fullNtupleName =
"/"+m_ntupleFileName+
"/"+m_ntupleDirName+
"/EventToTrackLink";
298 sc = tHistSvc->regTree(fullNtupleName, m_eventLinkTree);
299 if (
sc.isFailure()) {
300 msg(MSG::ERROR) <<
"Unable to register TTree : " << fullNtupleName <<
endmsg;
304 for (
unsigned int toolIndex=0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ) {
305 if( m_eventPropertyNtupleTools[toolIndex]->isTrkParticleLinkTool() ||
306 m_eventPropertyNtupleTools[toolIndex]->isTrackLinkTool( ) ||
307 m_eventPropertyNtupleTools[toolIndex]->isEvtPropertyTool( ) ) {
308 if( m_eventPropertyNtupleTools[toolIndex]->addNtupleItems( m_eventLinkTree ).isFailure() )
310 msg(MSG::ERROR) <<
"Unable to add items into the event tree: " << m_eventLinkTree->GetTitle() <<
endmsg;
311 return StatusCode::SUCCESS;
316 return StatusCode::SUCCESS;
325 ATH_MSG_DEBUG (
"TrackValidationNtupleWriter execute() start");
328 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ) {
329 if (m_eventPropertyNtupleTools[toolIndex]->resetVariables( ).isFailure()){};
334 unsigned int nTruthTreeRecordsAtCurrentEvent = 0;
335 std::vector<Trk::ValidationTrackTruthData> truthData;
336 std::vector<HepMC::ConstGenParticlePtr>* selecParticles =
nullptr;
339 std::vector< Trk::GenParticleJet >* genParticleJets =
nullptr;
344 if (evtStore()->
retrieve(mcEventColl, m_McEventCollectionName).isFailure())
346 std::string
key =
"G4Truth";
347 if (evtStore()->
retrieve(mcEventColl,
key).isFailure())
349 msg(MSG::WARNING) <<
"Could not find the McEventCollection" <<
endmsg;
350 return StatusCode::SUCCESS;
357 selecParticles = m_genPartSelector->selectGenSignal(mcEventColl);
366 for (
unsigned int toolIndex = 0 ; toolIndex < m_trackTruthClassifiers.size(); ++toolIndex )
368 m_trackTruthClassifiers[toolIndex]->initClassification(*mcEventColl, selecParticles);
371 for (
const auto& genParticle: *selecParticles)
378 if ( genParticle->production_vertex() )
380 generatedTrackPerigee = m_truthToTrack->makePerigeeParameters( genParticle );
382 ATH_MSG_DEBUG (
"No perigee available for interacting truth particle."
383 <<
" -> This is OK for particles from the TrackRecord, but probably"
384 <<
" a bug for production vertex particles.");
391 for (
unsigned int toolIndex = 0 ; toolIndex < m_trackTruthClassifiers.size(); ++toolIndex )
398 truthData.push_back(partData);
404 if (! m_jetTruthNtupleTool.empty()) {
407 genParticleJets = m_genJetFinder->jetMCFinder(*selecParticles);
409 else ATH_MSG_DEBUG (
"jets found: " << genParticleJets->size());
414 nTruthTreeRecordsAtCurrentEvent = m_truthNtupleTool->getNumberOfTreeRecords();
420 const VxContainer* primaryVertexContainer =
nullptr;
421 if (!m_trackSelector.empty() && !m_inputPrimaryVertexCollection.empty()) {
422 sc = evtStore()->retrieve(primaryVertexContainer, m_inputPrimaryVertexCollection);
423 if ( !primaryVertexContainer ||
sc.isFailure() ) {
424 ATH_MSG_ERROR(
" Primary Vertex container (" << m_inputPrimaryVertexCollection <<
") not found in StoreGate" );
425 delete genParticleJets;
426 return StatusCode::FAILURE;
430 if (primaryVertexContainer) {
431 if (!primaryVertexContainer->
empty())
vertex = &((*primaryVertexContainer)[0]->recVertex());
435 for (
unsigned int trackColIndex = 0; trackColIndex<m_inputTrackCollection.size(); trackColIndex++)
437 sc = writeTrackData(trackColIndex, truthData,
vertex);
438 if (
sc.isFailure()) {
439 ATH_MSG_ERROR (
"Failure when writing track data for collection " << m_inputTrackCollection[trackColIndex]);
440 delete genParticleJets;
446 if(m_doTrackParticle){
447 for (
unsigned int trackParticleColIndex = 0; trackParticleColIndex<m_inputTrackParticleCollection.size(); trackParticleColIndex++)
449 sc = writeTrackParticleData(trackParticleColIndex);
450 if (
sc.isFailure()) {
451 msg(MSG::ERROR) <<
"Failure when writing TrackParticle data for collection " << m_inputTrackParticleCollection[trackParticleColIndex] <<
endmsg;
452 delete genParticleJets;
458 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex )
459 if( m_eventPropertyNtupleTools[toolIndex]->isTrackLinkTool() ) {
460 m_eventPropertyNtupleTools[toolIndex]->setGenParticleTreeIndices
461 (nTruthTreeRecordsAtCurrentEvent,
462 selecParticles ? (
int)selecParticles->size() : 0);
467 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ) {
468 sc = m_eventPropertyNtupleTools[toolIndex]->fillEventData( );
469 if (
sc.isFailure()) {
470 msg(MSG::ERROR) <<
"Failure when filling event data." <<
endmsg;
471 delete genParticleJets;
476 if (!m_useExternalEventLinkTree) m_eventLinkTree->Fill();
479 std::vector<unsigned int> truthToJetIndices(selecParticles ? selecParticles->size() : 0);
480 if (m_doTruth && selecParticles && genParticleJets && !m_jetTruthNtupleTool.empty() ) {
482 const unsigned int nJetTruthTreeRecordsAtCurrentEvent
483 = m_jetTruthNtupleTool->getNumberOfTreeRecords();
486 itrMcJet < genParticleJets->
end() ; ++itrMcJet) {
488 std::vector<int>
indices = (*itrMcJet).getIndicesInEvent();
490 for (std::vector<int>::const_iterator
k =
indices.begin();
k !=
indices.end(); ++
k) {
491 if (*
k >= 0 && *
k <= (
int)selecParticles->size() ) {
492 truthData[*
k].truthToJetIndex = nJetTruthTreeRecordsAtCurrentEvent
493 +
int(itrMcJet - genParticleJets->begin()) + 1;
495 msg(MSG::WARNING) <<
" mistake with jet::indexInEvent !! " << *
k <<
endmsg;
499 sc = m_jetTruthNtupleTool->writeJetTruthData(*genParticleJets,
500 nTruthTreeRecordsAtCurrentEvent);
501 if (
sc.isFailure() ){
502 msg(MSG::ERROR) <<
"Jet Truth Ntuple Tool could not fill data" <<
endmsg;
503 delete genParticleJets;
504 return StatusCode::FAILURE;
509 if (m_doTruth && selecParticles){
510 sc = m_truthNtupleTool->writeTruthData( truthData );
511 if (
sc.isFailure() ){
512 msg(MSG::ERROR) <<
"Truth Ntuple Tool could not fill data" <<
endmsg;
513 delete genParticleJets;
514 return StatusCode::FAILURE;
518 delete selecParticles;
519 delete genParticleJets;
521 for (; truthDataIter != truthData.end(); ++truthDataIter) {
522 delete (*truthDataIter).truthPerigee;
523 (*truthDataIter).truthPerigee =
nullptr;
525 return StatusCode::SUCCESS;
529 std::vector<Trk::ValidationTrackTruthData>& truthData,
534 if (!m_inputTrackCollection[trackColIndex].
empty() && evtStore()->contains<TrackCollection>(m_inputTrackCollection[trackColIndex])) {
535 sc = evtStore()->retrieve(tracks, m_inputTrackCollection[trackColIndex]);
536 if (
sc.isFailure()) {
537 msg(MSG::WARNING) <<
"Tracks not found: " << m_inputTrackCollection[trackColIndex] <<
endmsg;
538 return StatusCode::SUCCESS;
543 msg(MSG::WARNING) <<
"TrackCollection " << m_inputTrackCollection[trackColIndex] <<
" not found in StoreGate." <<
endmsg;
544 return StatusCode::SUCCESS;
550 if (!m_trackTruthCollectionName[trackColIndex].
empty() && evtStore()->contains<TrackTruthCollection>(m_trackTruthCollectionName[trackColIndex])) {
551 sc = evtStore()->retrieve(trackTruthCollection, m_trackTruthCollectionName[trackColIndex]);
552 if (
sc.isFailure()) {
553 msg(MSG::WARNING) <<
"TrackTruthCollection not found: " << m_trackTruthCollectionName[trackColIndex] <<
endmsg;
555 return StatusCode::SUCCESS;
557 ATH_MSG_DEBUG (
"TrackTruthColl found: " << m_trackTruthCollectionName[trackColIndex]);
561 msg(MSG::WARNING) <<
"TrackTruthCollection " << m_trackTruthCollectionName[trackColIndex] <<
" not found in StoreGate." <<
endmsg;
563 return StatusCode::SUCCESS;
567 const unsigned int nTruthTreeRecordsAtCurrentEvent =
568 (m_doTruth ? m_truthNtupleTool->getNumberOfTreeRecords() : 0 );
570 int trackTreeIndexBegin = m_trees[trackColIndex]->GetEntries();
571 int nTracksPerEvent = 0;
575 for ( ; trackIterator < (*tracks).end(); ++trackIterator) {
576 if (!((*trackIterator))) {
577 msg(MSG::WARNING) <<
"TrackCollection " << m_inputTrackCollection[trackColIndex] <<
"contains empty entries" <<
endmsg;
580 if (m_trackSelector.empty() || m_trackSelector->decision(*(*trackIterator), primaryVertex)) {
583 itTools = m_ValidationNtupleTools.begin();
584 for ( ; itTools != m_ValidationNtupleTools.end(); ++itTools ) {
585 if (((*itTools)->fillTrackData( *(*trackIterator), 0 )).isFailure()) {
586 ATH_MSG_ERROR (
"Validation Ntuple Tool could not fill track data.");
587 return StatusCode::FAILURE;
590 nTracksPerEvent += 1;
596 TrackTruthCollection::const_iterator truthIterator = trackTruthCollection->find( trackIterator - (*tracks).begin() );
597 if ( truthIterator == trackTruthCollection->end() ){
598 ATH_MSG_DEBUG (
"No matching truth particle found for track");
600 trackTruth = &((*truthIterator).second);
602 if (msgLvl(
MSG::DEBUG))
msg(
MSG::DEBUG) <<
"Link to generated particle information is not there - assuming a lost G4 particle ('fake fake')." <<
endmsg;
603 genParticle = m_visibleParticleWithoutTruth;
610 if ( genParticle!=
nullptr && genParticle->pdg_id() == 0 ) {
612 <<
" does not conform to PDG requirements... ignore it!" <<
endmsg;
613 genParticle =
nullptr;
626 for (; matchedPartIter != truthData.end(); ++matchedPartIter) {
628 if ((*matchedPartIter).genParticle == genParticle)
break;
630 if (matchedPartIter == truthData.end()) {
634 if ( genParticle->production_vertex() ) {
635 newTrackPerigee = m_truthToTrack->makePerigeeParameters( genParticle );
636 generatedTrackPerigee = newTrackPerigee;
640 (*matchedPartIter).truthToTrackIndices[trackColIndex].push_back(m_nTrackTreeRecords[trackColIndex]);
641 (*matchedPartIter).truthToTrackMatchingProbabilities[trackColIndex].push_back(trackTruth->
probability());
642 generatedTrackPerigee = (*matchedPartIter).truthPerigee;
644 truthIndex += nTruthTreeRecordsAtCurrentEvent;
647 itTools = m_ValidationNtupleTools.begin();
648 for ( ; itTools != m_ValidationNtupleTools.end(); ++itTools ) {
649 if (((*itTools)->fillTrackTruthData( generatedTrackPerigee, *trackTruth, truthIndex )).isFailure()) {
650 ATH_MSG_ERROR (
"Validation Ntuple Tool could not fill track truth data.");
651 delete newTrackPerigee;
652 return StatusCode::FAILURE;
656 delete newTrackPerigee;
661 m_trees[trackColIndex]->Fill();
662 itTools = m_ValidationNtupleTools.begin();
663 for ( ; itTools != m_ValidationNtupleTools.end(); ++itTools )
664 (*itTools)->resetVariables();
667 m_nTrackTreeRecords[trackColIndex]++;
673 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex )
674 if( m_eventPropertyNtupleTools[toolIndex]->isTrackLinkTool() ) m_eventPropertyNtupleTools[toolIndex]->setTrackTreeIndices
675 (trackColIndex, trackTreeIndexBegin, nTracksPerEvent );
677 return StatusCode::SUCCESS;
687 if (!m_inputTrackParticleCollection[trackParticleColIndex].
empty() &&
688 evtStore()->contains<Trk::TrackParticleBaseCollection>(m_inputTrackParticleCollection[trackParticleColIndex])) {
689 if (evtStore()->
retrieve(trackParticles, m_inputTrackParticleCollection[trackParticleColIndex]).isFailure()) {
690 msg(MSG::WARNING) <<
"Trk::TrackParticleBasesContainer not found:" << m_inputTrackParticleCollection[trackParticleColIndex] <<
endmsg;
691 return StatusCode::SUCCESS;
693 if (msgLvl(
MSG::DEBUG))
msg(
MSG::DEBUG) <<
"Trk::TrackParticleBasesContainer found: "<< m_inputTrackParticleCollection[trackParticleColIndex] <<
endmsg;
696 msg(MSG::WARNING) <<
"Trk::TrackParticleBasesContainer " << m_inputTrackParticleCollection[trackParticleColIndex] <<
" not found in StoreGate." <<
endmsg;
697 return StatusCode::SUCCESS;
701 int trackTreeIndexBegin = m_trees[trackParticleColIndex + m_inputTrackCollection.size()]->GetEntries();
702 int nTrkParticlesPerEvent = 0;
706 for ( ; trackParticleIterator < (*trackParticles).end(); ++trackParticleIterator) {
707 if (!((*trackParticleIterator))) {
708 msg(MSG::WARNING) <<
"TrackParticleCollection " << m_inputTrackParticleCollection[trackParticleColIndex] <<
"contains empty entries" <<
endmsg;
712 if ( m_ValTrkParticleNtupleTool->fillTrackParticleData( *(*trackParticleIterator) ).isFailure() ){
713 msg(MSG::ERROR) <<
"Validation Ntuple Tool could not fill track data." <<
endmsg;
714 return StatusCode::FAILURE;
716 nTrkParticlesPerEvent += 1;
718 if ( m_ValTrkParticleNtupleTool->writeRecord(m_trees[trackParticleColIndex + m_inputTrackCollection.size()]).isFailure() ){
719 msg(MSG::ERROR) <<
"Validation Ntuple Tool could not write track data." <<
endmsg;
720 return StatusCode::FAILURE;
725 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ){
726 if( m_eventPropertyNtupleTools[toolIndex]->isTrkParticleLinkTool() )
727 m_eventPropertyNtupleTools[toolIndex]->setTrackTreeIndices(trackParticleColIndex, trackTreeIndexBegin, nTrkParticlesPerEvent );
731 return StatusCode::SUCCESS;
737 msg(MSG::INFO) <<
"TrackValidationNtupleWriter finalize()" <<
endmsg;
742 delete m_visibleParticleWithoutTruth;
744 for (
unsigned int toolIndex = 0 ; toolIndex < m_eventPropertyNtupleTools.size(); ++toolIndex ){
745 if (m_eventPropertyNtupleTools[toolIndex]->resetVariables( ).isFailure()){};
748 return StatusCode::SUCCESS;