diff --git a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/UserAnalysisUtils/UserAnalysisOverlapRemovalTool.h b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/UserAnalysisUtils/UserAnalysisOverlapRemovalTool.h index bc1688773ce8dc2d36f7edf5a38b1fd70dd3d1a8..cbd4ef1240e5b58d5e3891dd75ab9781546ca576 100644 --- a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/UserAnalysisUtils/UserAnalysisOverlapRemovalTool.h +++ b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/UserAnalysisUtils/UserAnalysisOverlapRemovalTool.h @@ -39,6 +39,7 @@ Purpose : User tools for analyis overlap removal on ESD/AOD/DPD in Athena #include "NavFourMom/IParticleContainer.h" #include "NavFourMom/INavigable4MomentumCollection.h" +#include "DataModel/ConstDataVector.h" #include <string> #include <map> @@ -100,16 +101,29 @@ protected: virtual ~UserAnalysisOverlapRemovalTool(); private: + struct Vectors { + ConstDataVector<INavigable4MomentumCollection>* m_outputParticles; + ConstDataVector<INavigable4MomentumCollection>* m_outputLeptons; + ConstDataVector<ElectronContainer>* m_outputElectrons; + ConstDataVector<PhotonContainer>* m_outputPhotons; + ConstDataVector<Analysis::MuonContainer>* m_outputMuons; + ConstDataVector<Analysis::TauJetContainer>* m_outputTauJets; + ConstDataVector<JetCollection>* m_outputJets; + ConstDataVector<JetCollection>* m_outputBJets; + ConstDataVector<JetCollection>* m_outputLightJets; + ConstDataVector<Rec::TrackParticleContainer>* m_outputTrackParticles; + ConstDataVector<CaloClusterContainer>* m_outputCaloClusters; + }; /** container preparation */ - StatusCode prepareContainers(); - StatusCode electronPreparation( std::string key ); - StatusCode photonPreparation( std::string key ); - StatusCode muonPreparation( std::string key ); - StatusCode tauJetPreparation( std::string key ); - StatusCode jetPreparation( std::string key ); - StatusCode trackParticlePreparation( std::string key ); - StatusCode caloClusterPreparation( std::string key ); + StatusCode prepareContainers(Vectors& v); + StatusCode electronPreparation( Vectors& v, std::string key ); + StatusCode photonPreparation( Vectors& v, std::string key ); + StatusCode muonPreparation( Vectors& v, std::string key ); + StatusCode tauJetPreparation( Vectors& v, std::string key ); + StatusCode jetPreparation( Vectors& v, std::string key ); + StatusCode trackParticlePreparation( Vectors& v, std::string key ); + StatusCode caloClusterPreparation( Vectors& v, std::string key ); StatusCode lockContainers(); /** for debugging purposes - called if MSG_Level = DEBUG */ diff --git a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisOverlapRemovalTool.cxx b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisOverlapRemovalTool.cxx index 18de31fbef123db27e90b972997a6d3f657f6099..21c7dc9c8cf92acc07d9f3f939665e6c8e79cdd5 100644 --- a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisOverlapRemovalTool.cxx +++ b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisOverlapRemovalTool.cxx @@ -73,7 +73,6 @@ UserAnalysisOverlapRemovalTool::UserAnalysisOverlapRemovalTool( const std::strin m_numLightJets = std::make_pair(0,0); m_numTrackParticles = std::make_pair(0,0); m_numCaloClusters = std::make_pair(0,0); - } //------------------------------------------------------------------------------ @@ -122,36 +121,37 @@ StatusCode UserAnalysisOverlapRemovalTool::execute() { } /** prepare the container for selection and overlap removal */ - StatusCode sc = this->prepareContainers(); + Vectors v; + StatusCode sc = this->prepareContainers(v); if ( sc.isFailure() ) return sc; /** now object preparation with overlap removal */ for ( unsigned int i=0; i<m_inputContainerKeys.size(); ++i ) { string::size_type loc = m_inputContainerKeys[i].find( "Electron", 0); - if( loc != string::npos ) sc = this->electronPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->electronPreparation( v, m_inputContainerKeys[i] ); loc = m_inputContainerKeys[i].find( "Photon", 0); - if( loc != string::npos ) sc = this->photonPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->photonPreparation( v, m_inputContainerKeys[i] ); loc = m_inputContainerKeys[i].find( "Muon", 0); - if( loc != string::npos ) sc = this->muonPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->muonPreparation( v, m_inputContainerKeys[i] ); std::string tau = "Tau"; if ( m_isAtlfast ) tau = "TauJet"; loc = m_inputContainerKeys[i].find( tau, 0); - if( loc != string::npos ) sc = this->tauJetPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->tauJetPreparation( v, m_inputContainerKeys[i] ); std::string jet = "Jets"; if ( m_isAtlfast ) jet = "Jet"; loc = m_inputContainerKeys[i].find( jet, 0); - if( loc != string::npos ) sc = this->jetPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->jetPreparation( v, m_inputContainerKeys[i] ); loc = m_inputContainerKeys[i].find( "Track", 0); - if( loc != string::npos ) sc = this->trackParticlePreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->trackParticlePreparation( v, m_inputContainerKeys[i] ); loc = m_inputContainerKeys[i].find( "Cluster", 0); - if( loc != string::npos ) sc = this->caloClusterPreparation( m_inputContainerKeys[i] ); + if( loc != string::npos ) sc = this->caloClusterPreparation( v, m_inputContainerKeys[i] ); if ( sc.isFailure() ) return sc; @@ -267,19 +267,10 @@ const CaloClusterContainer * UserAnalysisOverlapRemovalTool::finalStateCaloClust } /** container preparation */ -StatusCode UserAnalysisOverlapRemovalTool::electronPreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::electronPreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in electronPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - INavigable4MomentumCollection * leptons = this->allLeptons(); - if ( !leptons ) return sc; - - ElectronContainer * electrons = this->allElectrons(); - if ( !electrons ) return sc; - const ElectronContainer * aod_electrons = 0; sc = evtStore()->retrieve( aod_electrons, key ); if ( sc.isFailure() ) { @@ -296,21 +287,16 @@ StatusCode UserAnalysisOverlapRemovalTool::electronPreparation( std::string key for (; elecItr != elecItrE; ++elecItr) { /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *elecItr ); - // leptons->push_back( *elecItr ); - // electrons->push_back( *elecItr ); - // FIXME: cast needed for copying between containers - Electron* el = const_cast<Electron*> (*elecItr); - particles->push_back( el ); - leptons->push_back( el ); - electrons->push_back( el ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *elecItr ); + v.m_outputLeptons->push_back( *elecItr ); + v.m_outputElectrons->push_back( *elecItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + ConstDataVector<INavigable4MomentumCollection>::const_iterator nav4MomItr = v.m_outputParticles->begin(); + ConstDataVector<INavigable4MomentumCollection>::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -324,34 +310,23 @@ StatusCode UserAnalysisOverlapRemovalTool::electronPreparation( std::string key /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *elecItr ); - // leptons->push_back( *elecItr ); - // electrons->push_back( *elecItr ); - // FIXME: cast needed for copying between containers - Electron* el = const_cast<Electron*> (*elecItr); - particles->push_back( el ); - leptons->push_back( el ); - electrons->push_back( el ); + v.m_outputParticles->push_back( *elecItr ); + v.m_outputLeptons->push_back( *elecItr ); + v.m_outputElectrons->push_back( *elecItr ); } } } - m_numElectrons.second += electrons->size(); + m_numElectrons.second += v.m_outputElectrons->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::photonPreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::photonPreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in photonPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - PhotonContainer * photons = this->allPhotons(); - if ( !photons ) return sc; - const PhotonContainer * aod_photons = 0; sc = evtStore()->retrieve( aod_photons, key ); if ( sc.isFailure() ) { @@ -368,18 +343,14 @@ StatusCode UserAnalysisOverlapRemovalTool::photonPreparation( std::string key ) for (; photItr != photItrE; ++photItr) { /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *photItr ); - // photons->push_back( *photItr ); - // FIXME: cast needed for copying between containers - Photon * photon = const_cast<Photon*>(*photItr); - particles->push_back( photon ); - photons->push_back( photon ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *photItr ); + v.m_outputPhotons->push_back( *photItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -393,31 +364,21 @@ StatusCode UserAnalysisOverlapRemovalTool::photonPreparation( std::string key ) /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *photItr ); - // photons->push_back( *photItr ); - // FIXME: cast needed for copying between containers - Photon * photon = const_cast<Photon*>(*photItr); - particles->push_back( photon ); - photons->push_back( photon ); + v.m_outputParticles->push_back( *photItr ); + v.m_outputPhotons->push_back( *photItr ); } } } - m_numPhotons.second += photons->size(); + m_numPhotons.second += v.m_outputPhotons->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::muonPreparation( std:: string key ) { +StatusCode UserAnalysisOverlapRemovalTool::muonPreparation( Vectors& v, std:: string key ) { ATH_MSG_DEBUG("in muonPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - MuonContainer * muons = this->allMuons(); - if ( !muons ) return sc; - const MuonContainer * aod_muons = 0; sc = evtStore()->retrieve( aod_muons, key ); if ( sc.isFailure() ) { @@ -434,19 +395,15 @@ StatusCode UserAnalysisOverlapRemovalTool::muonPreparation( std:: string key ) { for (; muonItr != muonItrE; ++muonItr) { /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *muonItr ); - // muons->push_back( *muonItr ); - // FIXME: cast needed for copying between containers. - Analysis::Muon* mu = const_cast<Analysis::Muon*> (*muonItr); - particles->push_back( mu ); - muons->push_back( mu ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *muonItr ); + v.m_outputMuons->push_back( *muonItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -460,27 +417,21 @@ StatusCode UserAnalysisOverlapRemovalTool::muonPreparation( std:: string key ) { /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *muonItr ); - // muons->push_back( *muonItr ); - Analysis::Muon* mu = const_cast<Analysis::Muon*> (*muonItr); - particles->push_back( mu ); - muons->push_back( mu ); + v.m_outputParticles->push_back( *muonItr ); + v.m_outputMuons->push_back( *muonItr ); } } } - m_numMuons.second += muons->size(); + m_numMuons.second += v.m_outputMuons->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::tauJetPreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::tauJetPreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in tauJetPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - TauJetContainer * tauJets = this->allTauJets(); if ( !tauJets ) return sc; @@ -500,18 +451,14 @@ StatusCode UserAnalysisOverlapRemovalTool::tauJetPreparation( std::string key ) for (; tauJetItr != tauJetItrE; ++tauJetItr) { /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *tauJetItr ); - // tauJets->push_back( *tauJetItr ); - // FIXME: cast needed for copying between containers. - Analysis::TauJet* tau = const_cast<Analysis::TauJet*> (*tauJetItr); - particles->push_back( tau ); - tauJets->push_back( tau ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *tauJetItr ); + v.m_outputTauJets->push_back( *tauJetItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -525,37 +472,21 @@ StatusCode UserAnalysisOverlapRemovalTool::tauJetPreparation( std::string key ) /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *tauJetItr ); - // tauJets->push_back( *tauJetItr ); - // FIXME: cast needed for copying between containers. - Analysis::TauJet* tau = const_cast<Analysis::TauJet*> (*tauJetItr); - particles->push_back( tau ); - tauJets->push_back( tau ); + v.m_outputParticles->push_back( *tauJetItr ); + v.m_outputTauJets->push_back( *tauJetItr ); } } } - m_numTauJets.second += tauJets->size(); + m_numTauJets.second += v.m_outputTauJets->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::jetPreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::jetPreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in jetPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - JetCollection * jets = this->allJets(); - if ( !jets ) return sc; - - JetCollection * bJets = this->allBJets(); - if ( !bJets ) return sc; - - JetCollection * lightJets = this->allLightJets(); - if ( !lightJets ) return sc; - const JetCollection * aod_jets = 0; sc = evtStore()->retrieve( aod_jets, key ); if ( sc.isFailure() ) { @@ -574,25 +505,17 @@ StatusCode UserAnalysisOverlapRemovalTool::jetPreparation( std::string key ) { for (; jetItr != jetItrE; ++jetItr) { /** check if this jet passes pre-selection */ /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - /* - particles->push_back( *jetItr ); - jets->push_back( *jetItr ); - if ( m_userSelectionTool->isBJet( *jetItr ) ) bJets->push_back( *jetItr); - else lightJets->push_back( *jetItr ); - */ - // FIXME: cast needed for copying between containers. - Jet* jet = const_cast<Jet*> (*jetItr); - particles->push_back( jet ); - jets->push_back( jet ); - if ( m_userSelectionTool->isBJet( *jetItr ) ) bJets->push_back( jet); - else lightJets->push_back( jet ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *jetItr ); + v.m_outputJets->push_back( *jetItr ); + if ( m_userSelectionTool->isBJet( *jetItr ) ) v.m_outputBJets->push_back( *jetItr); + else v.m_outputLightJets->push_back( *jetItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -605,40 +528,26 @@ StatusCode UserAnalysisOverlapRemovalTool::jetPreparation( std::string key ) { /** if no overlap then save */ if ( !overlap ) { - /* - particles->push_back( *jetItr ); - jets->push_back( *jetItr ); - if ( m_userSelectionTool->isBJet( *jetItr ) ) bJets->push_back( *jetItr); - else lightJets->push_back( *jetItr ); - */ - // FIXME: cast needed for copying between containers. - Jet* jet = const_cast<Jet*> (*jetItr); - particles->push_back( jet ); - jets->push_back( jet ); - if ( m_userSelectionTool->isBJet( *jetItr ) ) bJets->push_back( jet); - else lightJets->push_back( jet ); + v.m_outputParticles->push_back( *jetItr ); + v.m_outputJets->push_back( *jetItr ); + if ( m_userSelectionTool->isBJet( *jetItr ) ) v.m_outputBJets->push_back( *jetItr); + else v.m_outputLightJets->push_back( *jetItr ); } } } - m_numJets.second += jets->size(); - m_numBJets.second += bJets->size(); - m_numLightJets.second += lightJets->size(); + m_numJets.second += v.m_outputJets->size(); + m_numBJets.second += v.m_outputBJets->size(); + m_numLightJets.second += v.m_outputLightJets->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::trackParticlePreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::trackParticlePreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in trackParticlePreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - TrackParticleContainer * trackParticles = this->allTrackParticles(); - if ( !trackParticles ) return sc; - const TrackParticleContainer * aod_trackParticles = 0; sc = evtStore()->retrieve( aod_trackParticles, key ); if ( sc.isFailure() ) { @@ -654,19 +563,15 @@ StatusCode UserAnalysisOverlapRemovalTool::trackParticlePreparation( std::string for (; trackParticleItr != trackParticleItrE; ++trackParticleItr) { /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *trackParticleItr ); - // trackParticles->push_back( *trackParticleItr ); - // FIXME: cast needed for copying between containers - Rec::TrackParticle* tp = const_cast<Rec::TrackParticle*> (*trackParticleItr); - particles->push_back( tp ); - trackParticles->push_back( tp ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *trackParticleItr ); + v.m_outputTrackParticles->push_back( *trackParticleItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -679,31 +584,21 @@ StatusCode UserAnalysisOverlapRemovalTool::trackParticlePreparation( std::string /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *trackParticleItr ); - // trackParticles->push_back( *trackParticleItr ); - // FIXME: cast needed for copying between containers - Rec::TrackParticle* tp = const_cast<Rec::TrackParticle*> (*trackParticleItr); - particles->push_back( tp ); - trackParticles->push_back( tp ); + v.m_outputParticles->push_back( *trackParticleItr ); + v.m_outputTrackParticles->push_back( *trackParticleItr ); } } } - m_numTrackParticles.second += trackParticles->size(); + m_numTrackParticles.second += v.m_outputTrackParticles->size(); return sc; } -StatusCode UserAnalysisOverlapRemovalTool::caloClusterPreparation( std::string key ) { +StatusCode UserAnalysisOverlapRemovalTool::caloClusterPreparation( Vectors& v, std::string key ) { ATH_MSG_DEBUG("in caloClusterPreparation() " ); StatusCode sc = StatusCode::SUCCESS; - INavigable4MomentumCollection * particles = this->allParticles(); - if ( !particles ) return sc; - - CaloClusterContainer * caloClusters = this->allCaloClusters(); - if ( !caloClusters ) return sc; - const CaloClusterContainer * aod_caloClusters = 0; sc = evtStore()->retrieve( aod_caloClusters, key ); if ( sc.isFailure() ) { @@ -722,19 +617,15 @@ StatusCode UserAnalysisOverlapRemovalTool::caloClusterPreparation( std::string k if ( !m_userSelectionTool->isSelected( *caloClusterItr ) ) continue; /** if this is the first particle, just put it in */ - if ( particles->size() == 0 ) { - // particles->push_back( *caloClusterItr ); - // caloClusters->push_back( *caloClusterItr ); - // FIXME: cast needed for copying between containers. - CaloCluster* cl = const_cast<CaloCluster*> (*caloClusterItr); - particles->push_back( cl ); - caloClusters->push_back( cl ); + if ( v.m_outputParticles->size() == 0 ) { + v.m_outputParticles->push_back( *caloClusterItr ); + v.m_outputCaloClusters->push_back( *caloClusterItr ); } /** check for the overlap and save non overlapping ones */ else { - INavigable4MomentumCollection::const_iterator nav4MomItr = particles->begin(); - INavigable4MomentumCollection::const_iterator nav4MomItrE = particles->end(); + INavigable4MomentumCollection::const_iterator nav4MomItr = v.m_outputParticles->begin(); + INavigable4MomentumCollection::const_iterator nav4MomItrE = v.m_outputParticles->end(); bool overlap = false; for (; nav4MomItr != nav4MomItrE; ++nav4MomItr) { /** overlap checking */ @@ -747,18 +638,14 @@ StatusCode UserAnalysisOverlapRemovalTool::caloClusterPreparation( std::string k /** if no overlap then save */ if ( !overlap ) { - // particles->push_back( *caloClusterItr ); - // caloClusters->push_back( *caloClusterItr ); - // FIXME: cast needed for copying between containers. - CaloCluster* cl = const_cast<CaloCluster*> (*caloClusterItr); - particles->push_back( cl ); - caloClusters->push_back( cl ); + v.m_outputParticles->push_back( *caloClusterItr ); + v.m_outputCaloClusters->push_back( *caloClusterItr ); } } } - m_numCaloClusters.second += caloClusters->size(); + m_numCaloClusters.second += v.m_outputCaloClusters->size(); return sc; } @@ -864,96 +751,118 @@ CaloClusterContainer * UserAnalysisOverlapRemovalTool::allCaloClusters() { } //------------------------------------------------------------------------------- -StatusCode UserAnalysisOverlapRemovalTool::prepareContainers() { +StatusCode UserAnalysisOverlapRemovalTool::prepareContainers(Vectors& v) { ATH_MSG_DEBUG("in prepareContainers()" ); /** create an empty container of all particles and record it */ - CaloClusterContainer * caloClusters = new CaloClusterContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<CaloClusterContainer> * caloClusters = + new ConstDataVector<CaloClusterContainer>( SG::VIEW_ELEMENTS ); StatusCode sc = evtStore()->record ( caloClusters, m_outputCaloClusterKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of CaloClusters in StoreGate: key= " << m_outputCaloClusterKey ); return sc; } + v.m_outputCaloClusters = caloClusters; /** create an empty container of TrackParticles and record it */ - TrackParticleContainer * trackParticles = new TrackParticleContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<TrackParticleContainer> * trackParticles = + new ConstDataVector<TrackParticleContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( trackParticles, m_outputTrackParticleKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of TrackParticles in StoreGate: key= " << m_outputTrackParticleKey ); return sc; } + v.m_outputTrackParticles = trackParticles; /** create an empty container of all particles and record it */ - INavigable4MomentumCollection * particles = new INavigable4MomentumCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<INavigable4MomentumCollection> * particles = + new ConstDataVector<INavigable4MomentumCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( particles, m_outputObjectKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of particles in StoreGate: key= " << m_outputObjectKey ); return sc; } + v.m_outputParticles = particles; /** create an empty container of all leptons and record it */ - INavigable4MomentumCollection * leptons = new INavigable4MomentumCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<INavigable4MomentumCollection> * leptons = + new ConstDataVector<INavigable4MomentumCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( leptons, m_outputLeptonKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of leptons in StoreGate: key= " << m_outputLeptonKey ); return sc; } + v.m_outputLeptons = leptons; /** create an empty container of all electrons and record it */ - ElectronContainer * electrons = new ElectronContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<ElectronContainer> * electrons = + new ConstDataVector<ElectronContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( electrons, m_outputElectronKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of electrons in StoreGate: key= " << m_outputElectronKey ); return sc; } + v.m_outputElectrons = electrons; /** create an empty container of all photons and record it */ - PhotonContainer * photons = new PhotonContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<PhotonContainer> * photons = + new ConstDataVector<PhotonContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( photons, m_outputPhotonKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of photons in StoreGate: key= " << m_outputPhotonKey ); return sc; } + v.m_outputPhotons = photons; /** create an empty container of all muons and record it */ - MuonContainer * muons = new MuonContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<MuonContainer> * muons = + new ConstDataVector<MuonContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( muons, m_outputMuonKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of muons in StoreGate: key= " << m_outputMuonKey ); return sc; } + v.m_outputMuons = muons; /** create an empty container of all tauJets and record it */ - TauJetContainer * tauJets = new TauJetContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<TauJetContainer> * tauJets = + new ConstDataVector<TauJetContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( tauJets, m_outputTauJetKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of tau jets in StoreGate: key= " << m_outputTauJetKey ); return sc; } + v.m_outputTauJets = tauJets; /** create an empty container of all jets and record it */ - JetCollection * jets = new JetCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<JetCollection> * jets = + new ConstDataVector<JetCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( jets, m_outputJetKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of jets in StoreGate: key= " << m_outputJetKey ); return sc; } + v.m_outputJets = jets; /** create an empty container of b-jets and record it */ - JetCollection * bjets = new JetCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<JetCollection> * bjets = + new ConstDataVector<JetCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( bjets, m_outputBJetKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of b-jets in StoreGate: key= " << m_outputBJetKey ); return sc; } + v.m_outputBJets = bjets; /** create an empty container of light (non b-jet) jets and record it */ - JetCollection * lightJets = new JetCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<JetCollection> * lightJets = + new ConstDataVector<JetCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( lightJets, m_outputLightJetKey); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of lightJets in StoreGate: key= " << m_outputLightJetKey ); return sc; } + v.m_outputLightJets = lightJets; return StatusCode::SUCCESS; } @@ -1080,4 +989,3 @@ bool UserAnalysisOverlapRemovalTool::isExecuted() { ATH_MSG_DEBUG("in isExecuted() " ); return evtStore()->contains<INavigable4MomentumCollection>( m_outputObjectKey ); } - diff --git a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisPreparationTool.cxx b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisPreparationTool.cxx index 3609b193a3306b3613e90fada33348125bb94213..110586e3495d059dde7fdc50cbc80f8a9c758d27 100644 --- a/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisPreparationTool.cxx +++ b/PhysicsAnalysis/AnalysisCommon/UserAnalysisUtils/src/UserAnalysisPreparationTool.cxx @@ -18,6 +18,7 @@ Purpose : User Analysis Preparation - see UserAnalysisPreparationTool.h for deta // User Tools #include "UserAnalysisUtils/UserAnalysisPreparationTool.h" +#include "DataModel/ConstDataVector.h" #include <sstream> #include <iomanip> @@ -291,7 +292,8 @@ StatusCode UserAnalysisPreparationTool::muonPreparation( std::string key ) { StatusCode sc = StatusCode::SUCCESS; /** create an empty container of all muons and record it */ - MuonContainer * muons = new MuonContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<MuonContainer> * muons = + new ConstDataVector<MuonContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( muons, m_outputMuonKey ); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of muons in StoreGate: key= " << m_outputMuonKey); @@ -315,8 +317,7 @@ StatusCode UserAnalysisPreparationTool::muonPreparation( std::string key ) { for (; muonItr != muonItrE; ++muonItr) { // if ( m_userSelectionTool->isSelected( *muonItr ) ) muons->push_back( *muonItr ); if ( m_userSelectionTool->isSelected( *muonItr ) ) { - // FIXME: cast needed for copying between containers - muons->push_back( const_cast<Analysis::Muon*> (*muonItr) ); + muons->push_back( *muonItr ); } } @@ -333,7 +334,8 @@ StatusCode UserAnalysisPreparationTool::tauJetPreparation( std::string key ) { StatusCode sc = StatusCode::SUCCESS; /** create an empty container of all tauJets and record it */ - TauJetContainer * tauJets = new TauJetContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<TauJetContainer> * tauJets = + new ConstDataVector<TauJetContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( tauJets, m_outputTauJetKey ); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of tau jets in StoreGate: key= " << m_outputTauJetKey); @@ -357,8 +359,7 @@ StatusCode UserAnalysisPreparationTool::tauJetPreparation( std::string key ) { for (; tauJetItr != tauJetItrE; ++tauJetItr) { // if ( m_userSelectionTool->isSelected( *tauJetItr ) ) tauJets->push_back( *tauJetItr ); if ( m_userSelectionTool->isSelected( *tauJetItr ) ) { - // FIXME: cast needed for copying between containers. - tauJets->push_back( const_cast<Analysis::TauJet*> (*tauJetItr) ); + tauJets->push_back( *tauJetItr ); } } @@ -375,7 +376,8 @@ StatusCode UserAnalysisPreparationTool::jetPreparation( std::string key ) { StatusCode sc = StatusCode::SUCCESS; /** create an empty container of all jets and record it */ - JetCollection * jets = new JetCollection( SG::VIEW_ELEMENTS ); + ConstDataVector<JetCollection> * jets = + new ConstDataVector<JetCollection>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( jets, m_outputJetKey ); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of jets in StoreGate: key= " << m_outputJetKey); @@ -399,8 +401,7 @@ StatusCode UserAnalysisPreparationTool::jetPreparation( std::string key ) { for (; jetItr != jetItrE; ++jetItr) { // if ( m_userSelectionTool->isSelected( *jetItr ) ) jets->push_back( *jetItr ); if ( m_userSelectionTool->isSelected( *jetItr ) ) { - // FIXME: Cast needed for copying between containers. - jets->push_back( const_cast<Jet*> (*jetItr) ); + jets->push_back( *jetItr ); } } @@ -417,7 +418,8 @@ StatusCode UserAnalysisPreparationTool::trackParticlePreparation( std::string ke StatusCode sc = StatusCode::SUCCESS; /** create an empty container of TrackParticles and record it */ - TrackParticleContainer * trackParticles = new TrackParticleContainer( SG::VIEW_ELEMENTS ); + ConstDataVector<TrackParticleContainer> * trackParticles = + new ConstDataVector<TrackParticleContainer>( SG::VIEW_ELEMENTS ); sc = evtStore()->record ( trackParticles, m_outputTrackParticleKey ); if ( sc.isFailure() ) { ATH_MSG_WARNING("Not able to create a collection of TrackParticles in StoreGate: key= " << m_outputTrackParticleKey); @@ -441,8 +443,7 @@ StatusCode UserAnalysisPreparationTool::trackParticlePreparation( std::string ke for (; trackParticleItr != trackParticleItrE; ++trackParticleItr) { // if ( m_userSelectionTool->isSelected( *trackParticleItr ) ) trackParticles->push_back( *trackParticleItr ); if ( m_userSelectionTool->isSelected( *trackParticleItr ) ) { - // FIXME: cast needed for copying between containers. - trackParticles->push_back( const_cast<Rec::TrackParticle*> (*trackParticleItr) ); + trackParticles->push_back( *trackParticleItr ); } }