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
68{
69
70 const EventContext& ctx = Gaudi::Hive::currentContext();
71
72 // Retrieve main TrackParticle collection
74
75 // Retrieve PFO collection if required
78
79 // Retrieve main jet collection
81 unsigned int nJets(importedJets->size());
82 std::vector<const xAOD::Jet*> jetToCheck; jetToCheck.clear();
83
84 // Check the event contains tracks
85 unsigned int nTracks = importedTrackParticles->size();
86 // Check the event contains calo clusters
87 const size_t nPFONeutral = importedPFONeutral->size();
88 const size_t nPFOCharged = importedPFOCharged->size() ;
89 unsigned int nPFOs = nPFOCharged + nPFONeutral;
90 if (nPFOs==0 && nTracks==0) return StatusCode::SUCCESS;
91
92 // Set up a mask with the same entries as the full TrackParticle collection
93 std::vector<bool> maskTracks;
94 maskTracks.assign(nTracks,false); // default: don't keep any tracks
95
96 // Set up a mask with the same entries as the full PFO collection(s)
97 std::vector< bool > pfomaskNeutral( nPFONeutral, false );
98 std::vector< bool > pfomaskCharged( nPFOCharged, false );
99
100 // Retrieve containers
101 // ... UFOs
103 unsigned int nUFOs(importedUFOs->size());
104
105 // Set up a mask with the same entries as the full CaloCluster collection
106 std::vector<bool> maskUFOs;
107 maskUFOs.assign(nUFOs,false); // default: don't keep any tracks
108
109 // Execute the text parser if requested
110 if (m_selectionString!="") {
111 std::vector<int> entries = m_parser->evaluateAsVector();
112 unsigned int nEntries = entries.size();
113 // check the sizes are compatible
114 if (nJets != nEntries ) {
115 ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used jets??");
116 return StatusCode::FAILURE;
117 } else {
118 // identify which jets to keep for the thinning check
119 for (unsigned int i=0; i<nJets; ++i) if (entries[i]==1) jetToCheck.push_back((*importedJets)[i]);
120 }
121 }
122
123 if (m_selectionString=="") { // check all jets as user didn't provide a selection string
124 for(const auto *jet : *importedJets){
125 for( size_t j = 0; j < jet->numConstituents(); ++j ) {
126 auto ufo = jet->constituentLinks().at(j);
127 int index = ufo.index();
128 maskUFOs[index] = true;
129 const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
130 if(!ufoO) continue;
131
132 // Retrieve the track if UFO is charged or combined object
134 int index_trk = ufoO->chargedObject(0)->index();
135 if(index_trk>=0) {
136 maskTracks[index_trk] = true;
137 }
138 }
139
140 // Loop over charged and neutral PFOs
141 for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
142 int index_pfo = ufoO->otherObject(n)->index();
143 if(index_pfo<0) continue;
144
145 const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
146
148 pfomaskCharged.at( index_pfo ) = true;
149 }
151 pfomaskNeutral.at( index_pfo ) = true;
152 }
153 }
154 }
155 }
156
157 } else {
158
159 for (auto & jetIt : jetToCheck) {
160 for( size_t j = 0; j < jetIt->numConstituents(); ++j ) {
161 auto ufo = jetIt->constituentLinks().at(j);
162 int index = ufo.index();
163 maskUFOs[index] = true;
164
165 const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
166 if(!ufoO) continue;
167
169 int index_trk = ufoO->chargedObject(0)->index();
170 if(index_trk>=0) {
171 maskTracks[index_trk] = true;
172 }
173 }
174
175 for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
176 int index_pfo = ufoO->otherObject(n)->index();
177 if(index_pfo<0) continue;
178
179 const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
180
182 pfomaskCharged.at( index_pfo ) = true;
183 }
185 pfomaskNeutral.at( index_pfo ) = true;
186 }
187 }
188 }
189 }
190 }
191
192 // Execute the thinning service based on the mask. Finish.
193 if(m_thinTracks){
194 importedTrackParticles.keep (maskTracks);
195 }
196 importedPFONeutral.keep (pfomaskNeutral);
197 importedPFOCharged.keep (pfomaskCharged);
198 importedUFOs.keep (maskUFOs);
199
200 for(unsigned int i = 0; i < m_addPFOChargedSGKey.size(); i++){
203
204 tempPFOCharged.keep(pfomaskCharged);
205 tempPFONeutral.keep(pfomaskNeutral);
206 }
207
208 return StatusCode::SUCCESS;
209}
210
#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)
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
std::vector< SG::ThinningHandleKey< xAOD::FlowElementContainer > > m_addPFONeutralSGKey
UFOTrackParticleThinning(const std::string &t, const std::string &n, const IInterface *p)
size_t index() const
Return the index of this element within its container.
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