ATLAS Offline Software
Loading...
Searching...
No Matches
UFOTrackParticleThinning.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6// UFOTrackParticleThinning.cxx, (c) ATLAS Detector software
8
10
12
13// Constructor
15 const std::string& n,
16 const IInterface* p ) :
17base_class(t,n,p)
18{
19}
20
21// Destructor
23
24// Athena initialize and finalize
26{
27 // Decide which collections need to be checked for ID TrackParticles
28 ATH_MSG_VERBOSE("initialize() ...");
29 ATH_CHECK( m_inDetSGKey.initialize(m_streamName) );
30 ATH_MSG_INFO("Using " << m_inDetSGKey.key() << " as the source collection for inner detector track particles");
31
32 m_PFOChargedSGKey = m_PFOSGKey+"ChargedParticleFlowObjects";
33 m_PFONeutralSGKey = m_PFOSGKey+"NeutralParticleFlowObjects";
36 ATH_MSG_INFO("Using " << m_PFONeutralSGKey.key() << "and " << m_PFOChargedSGKey.key() << " as the source collection for the PFlow collection");
37
38 for(unsigned int i = 0; i < m_addPFOSGKey.size(); i++){
39 m_tmpAddPFOChargedSGKey = m_addPFOSGKey[i]+"ChargedParticleFlowObjects";
42 m_tmpAddPFONeutralSGKey = m_addPFOSGKey[i]+"NeutralParticleFlowObjects";
45 }
46
47 ATH_CHECK( m_ufoSGKey.initialize(m_streamName));
48 ATH_MSG_INFO("Using " << m_ufoSGKey.key()<< " as the source collection for UFOs");
49
50 ATH_CHECK( m_jetSGKey.initialize());
51 ATH_MSG_INFO("Using " << m_jetSGKey.key() << " as the source collection for UFOs");
52
53 if (!m_selectionString.empty()){
54 // order must match enum order EJetTrPThinningParser
55 ATH_CHECK( initializeParser( m_selectionString ));
56 }
57
58 return StatusCode::SUCCESS;
59}
60
62{
63 return StatusCode::SUCCESS;
64}
65
66// The thinning itself
67StatusCode DerivationFramework::UFOTrackParticleThinning::doThinning(const EventContext& ctx) const
68{
69
70
71 // Retrieve main TrackParticle collection
73
74 // Retrieve PFO collection if required
77
78 // Retrieve main jet collection
80 unsigned int nJets(importedJets->size());
81 std::vector<const xAOD::Jet*> jetToCheck; jetToCheck.clear();
82
83 // Check the event contains tracks
84 unsigned int nTracks = importedTrackParticles->size();
85 // Check the event contains calo clusters
86 const size_t nPFONeutral = importedPFONeutral->size();
87 const size_t nPFOCharged = importedPFOCharged->size() ;
88 unsigned int nPFOs = nPFOCharged + nPFONeutral;
89 if (nPFOs==0 && nTracks==0) return StatusCode::SUCCESS;
90
91 // Set up a mask with the same entries as the full TrackParticle collection
92 std::vector<bool> maskTracks;
93 maskTracks.assign(nTracks,false); // default: don't keep any tracks
94
95 // Set up a mask with the same entries as the full PFO collection(s)
96 std::vector< bool > pfomaskNeutral( nPFONeutral, false );
97 std::vector< bool > pfomaskCharged( nPFOCharged, false );
98
99 // Retrieve containers
100 // ... UFOs
102 unsigned int nUFOs(importedUFOs->size());
103
104 // Set up a mask with the same entries as the full CaloCluster collection
105 std::vector<bool> maskUFOs;
106 maskUFOs.assign(nUFOs,false); // default: don't keep any tracks
107
108 // Execute the text parser if requested
109 if (m_selectionString!="") {
110 std::vector<int> entries = m_parser->evaluateAsVector();
111 unsigned int nEntries = entries.size();
112 // check the sizes are compatible
113 if (nJets != nEntries ) {
114 ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used jets??");
115 return StatusCode::FAILURE;
116 } else {
117 // identify which jets to keep for the thinning check
118 for (unsigned int i=0; i<nJets; ++i) if (entries[i]==1) jetToCheck.push_back((*importedJets)[i]);
119 }
120 }
121
122 if (m_selectionString=="") { // check all jets as user didn't provide a selection string
123 for(const auto *jet : *importedJets){
124 for( size_t j = 0; j < jet->numConstituents(); ++j ) {
125 auto ufo = jet->constituentLinks().at(j);
126 int index = ufo.index();
127 maskUFOs[index] = true;
128 const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
129 if(!ufoO) continue;
130
131 // Retrieve the track if UFO is charged or combined object
133 int index_trk = ufoO->chargedObject(0)->index();
134 if(index_trk>=0) {
135 maskTracks[index_trk] = true;
136 }
137 }
138
139 // Loop over charged and neutral PFOs
140 for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
141 int index_pfo = ufoO->otherObject(n)->index();
142 if(index_pfo<0) continue;
143
144 const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
145
147 pfomaskCharged.at( index_pfo ) = true;
148 }
150 pfomaskNeutral.at( index_pfo ) = true;
151 }
152 }
153 }
154 }
155
156 } else {
157
158 for (auto & jetIt : jetToCheck) {
159 for( size_t j = 0; j < jetIt->numConstituents(); ++j ) {
160 auto ufo = jetIt->constituentLinks().at(j);
161 int index = ufo.index();
162 maskUFOs[index] = true;
163
164 const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
165 if(!ufoO) continue;
166
168 int index_trk = ufoO->chargedObject(0)->index();
169 if(index_trk>=0) {
170 maskTracks[index_trk] = true;
171 }
172 }
173
174 for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
175 int index_pfo = ufoO->otherObject(n)->index();
176 if(index_pfo<0) continue;
177
178 const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
179
181 pfomaskCharged.at( index_pfo ) = true;
182 }
184 pfomaskNeutral.at( index_pfo ) = true;
185 }
186 }
187 }
188 }
189 }
190
191 // Execute the thinning service based on the mask. Finish.
192 if(m_thinTracks){
193 importedTrackParticles.keep (maskTracks);
194 }
195 importedPFONeutral.keep (pfomaskNeutral);
196 importedPFOCharged.keep (pfomaskCharged);
197 importedUFOs.keep (maskUFOs);
198
199 for(unsigned int i = 0; i < m_addPFOChargedSGKey.size(); i++){
202
203 tempPFOCharged.keep(pfomaskCharged);
204 tempPFONeutral.keep(pfomaskNeutral);
205 }
206
207 return StatusCode::SUCCESS;
208}
209
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
size_t size() const
Number of registered mappings.
Handle for requesting thinning for a data object.
SG::ReadHandleKey< xAOD::JetContainer > m_jetSGKey
SG::ThinningHandleKey< xAOD::TrackParticleContainer > m_inDetSGKey
SG::ThinningHandleKey< xAOD::FlowElementContainer > m_PFOChargedSGKey
std::vector< SG::ThinningHandleKey< xAOD::FlowElementContainer > > m_addPFOChargedSGKey
SG::ThinningHandleKey< xAOD::FlowElementContainer > m_ufoSGKey
SG::ThinningHandleKey< xAOD::FlowElementContainer > m_tmpAddPFOChargedSGKey
Gaudi::Property< std::vector< std::string > > m_addPFOSGKey
SG::ThinningHandleKey< xAOD::FlowElementContainer > m_PFONeutralSGKey
SG::ThinningHandleKey< xAOD::FlowElementContainer > m_tmpAddPFONeutralSGKey
virtual StatusCode doThinning(const EventContext &ctx) const override
std::vector< SG::ThinningHandleKey< xAOD::FlowElementContainer > > m_addPFONeutralSGKey
UFOTrackParticleThinning(const std::string &t, const std::string &n, const IInterface *p)
void keep(size_t ndx)
Mark that index ndx in the container should be kept (not thinned away).
Handle for requesting thinning for a data object.
std::vector< const xAOD::IParticle * > otherObjects() const
signal_t signalType() const
const xAOD::IParticle * chargedObject(std::size_t i) const
const xAOD::IParticle * otherObject(std::size_t i) const
double entries
Definition listroot.cxx:49
Definition index.py:1
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition FlowElement.h:16