ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaFastElectronReAlgo.cxx
Go to the documentation of this file.
1// -*- C++ -*-
2/*
3 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
4*/
5
6/**************************************************************************
7 ** Description: Hypothesis algorithms to be run at Level 2 after
8 ** tracking algorithms: creates TrigElectrons
9 **
10 ** Author: R.Goncalo <r.goncalo@rhul.ac.uk> Thu Jan 20 22:02:43 BST 2005
11 ** P.Urquijo <Phillip.Urquijo@cern.ch>
12 **
13 ** Created: Sat Mar 1 19:55:56 GMT 2005
14 ** Modified: RG 18 Mar 06 - fix to always generate TrigElectrons
15 ** - use key2keyStore for collection names
16 ** N.Berger Dec.06 - migrate to new steering (RG)
17 **************************************************************************/
18
25
26
27
28
29
30TrigEgammaFastElectronReAlgo::TrigEgammaFastElectronReAlgo(const std::string & name, ISvcLocator* pSvcLocator)
31 : AthReentrantAlgorithm(name, pSvcLocator)
32{}
33
34
36{
37 ATH_MSG_DEBUG("Initialization:");
38
39 if (!m_monTool.empty()) {
40 ATH_MSG_DEBUG("Retrieving monTool");
41 CHECK(m_monTool.retrieve());
42 } else {
43 ATH_MSG_DEBUG("No monTool configured => NO MONITOING");
44 }
45
46 if ( m_caloExtensionTool.retrieve().isFailure() ) {
47 ATH_MSG_ERROR("Unable to locate TrackExtrapolator tool ");
48 return StatusCode::FAILURE;
49 }
50
51 // print out settings
52 ATH_MSG_DEBUG("Initialization completed successfully:");
53 ATH_MSG_DEBUG( "AcceptAll = "<< (m_acceptAll==true ? "True" : "False"));
54 ATH_MSG_DEBUG("TrackPt = " << m_trackPtthr);
55 ATH_MSG_DEBUG("TrackPtHighEt = " << m_trackPtthr_highet);
56 ATH_MSG_DEBUG("ClusEt = " << m_clusEtthr);
57 ATH_MSG_DEBUG("CaloTrackdEtaNoExtrap= " << m_calotrkdeta_noextrap);
58 ATH_MSG_DEBUG("CaloTrackdEtaNoExtrapHighEt= " << m_calotrkdeta_noextrap_highet);
59 ATH_MSG_DEBUG("CaloTrackdETA = " << m_calotrackdeta);
60 ATH_MSG_DEBUG("CaloTrackdPHI = " << m_calotrackdphi);
61 ATH_MSG_DEBUG("CaloTrackdEoverPLow = " << m_calotrackdeoverp_low);
62 ATH_MSG_DEBUG("CaloTrackdEoverPHigh = " << m_calotrackdeoverp_high);
63
64 ATH_CHECK( m_roiCollectionKey.initialize() );
67 ATH_CHECK( m_caloDetDescrMgrKey.initialize() );
68 ATH_CHECK( m_outputElectronsKey.initialize() );
70
71 return StatusCode::SUCCESS;
72}
73
74
75
76StatusCode TrigEgammaFastElectronReAlgo::execute(const EventContext& ctx) const
77{
78 using namespace xAOD;
79
80 ATH_MSG_DEBUG( "Executing " <<name());
81
82 auto trigElecColl = SG::makeHandle (m_outputElectronsKey, ctx);
83 ATH_CHECK( trigElecColl.record (std::make_unique<xAOD::TrigElectronContainer>(),
84 std::make_unique<xAOD::TrigEMClusterAuxContainer>()) );
85
86 ATH_MSG_DEBUG( "Made WriteHandle " << m_outputElectronsKey );
87
88 auto trigDummyElecColl = SG::makeHandle (m_outputDummyElectronsKey, ctx);
89
90 ATH_MSG_DEBUG( "Made Dummy WriteHandle " << m_outputDummyElectronsKey );
91 ATH_CHECK( trigDummyElecColl.record (std::make_unique<xAOD::TrigElectronContainer>(),
92 std::make_unique<xAOD::TrigEMClusterAuxContainer>()) );
93
94 auto roiCollection = SG::makeHandle(m_roiCollectionKey, ctx);
95 ATH_MSG_DEBUG( "Made handle " << m_roiCollectionKey );
96
97
98 if (roiCollection->size()==0) {
99 ATH_MSG_DEBUG(" RoI collection size = 0");
100 return StatusCode::SUCCESS;
101 }
102
103 const TrigRoiDescriptor* roiDescriptor = *(roiCollection->begin());
104
105 ATH_MSG_DEBUG(" RoI ID = " << (roiDescriptor)->roiId() << ": Eta = " << (roiDescriptor)->eta()
106 << ", Phi = " << (roiDescriptor)->phi());
107
108 float calo_eta(999), calo_phi(999), calo_et(-1);
109
110 auto clusterCont = SG::makeHandle (m_TrigEMClusterContainerKey, ctx);
111 ATH_MSG_DEBUG( "Made handle " << m_TrigEMClusterContainerKey );
112
113 //JTB Should only be 1 cluster in each RoI
114
115 const xAOD::TrigEMCluster *emCluster=(*clusterCont->begin());
117
118 // copy relevant quantities to local variables
119 calo_eta = emCluster->eta();
120 calo_phi = emCluster->phi();
121 calo_et = emCluster->et();
122
123
124 // Transverse em energy
125 ATH_MSG_DEBUG("Cluster: ET=" << calo_et);
126 ATH_MSG_DEBUG("searching a matching track: loop over tracks");
127
129 ATH_MSG_DEBUG( "Made handle " << m_TrackParticleContainerKey );
130
131
132 if (tracks->size() == 0){
133 return StatusCode::SUCCESS; // Exit early if there are no tracks
134 }
135
136 size_t coll_size = tracks->size();
137 trigElecColl->reserve(coll_size);
138
139 // monitoring
140 std::vector<float> calotrkdeta_noextrap_mon;
141
142 auto caloPtMon = Monitored::Collection("PtCalo", *trigElecColl, getCaloPt );
143 auto trackPtMon = Monitored::Collection("PtTrack", *trigElecColl, getTkPt );
144 auto caloTrackDEtaMon = Monitored::Collection("CaloTrackdEta", *trigElecColl, &xAOD::TrigElectron::trkClusDeta );
145 auto caloTrackDPhiMon = Monitored::Collection("CaloTrackdPhi", *trigElecColl, &xAOD::TrigElectron::trkClusDphi );
146 auto etOverPtMon = Monitored::Collection("CaloTrackEoverP", *trigElecColl, &xAOD::TrigElectron::etOverPt );
147 auto caloTrackDEtaNoExtrapMon = Monitored::Collection("CaloTrackdEtaNoExtrapMon", calotrkdeta_noextrap_mon );
148
149 auto mon = Monitored::Group(m_monTool, caloPtMon, trackPtMon, caloTrackDEtaMon, caloTrackDPhiMon, etOverPtMon, caloTrackDEtaNoExtrapMon );
150
151 // Make Dummy Electron
152 xAOD::TrigElectron* trigDummyElec = new xAOD::TrigElectron();
153
155
156 trigDummyElecColl->push_back(trigDummyElec);
157 trigDummyElec->init( 0, 0, 0, 0, clusEL, trackDummyEL);
158
159 //Pick the Calo Det Descr
160 SG::ReadCondHandle<CaloDetDescrManager> caloDetDescrMgrHandle{
162 ATH_CHECK(caloDetDescrMgrHandle.isValid());
163 const CaloDetDescrManager* caloDD = *caloDetDescrMgrHandle;
164
165 // loop over tracks
166 for(unsigned int track_index = 0; track_index < tracks->size(); track_index++)
167 {
168 const xAOD::TrackParticle_v1* trkIter = (*tracks)[track_index];
169 ATH_MSG_DEBUG("Track loop starts");
170 ATH_MSG_VERBOSE("AlgoId = " << (trkIter)->patternRecoInfo());
171 ATH_MSG_VERBOSE("At perigee:");
172 ATH_MSG_DEBUG(" Pt = " << std::abs((trkIter)->pt()));
173 ATH_MSG_DEBUG(" phi = " << std::abs((trkIter)->phi0()));
174 ATH_MSG_DEBUG(" eta = " << std::abs((trkIter)->eta()));
175 ATH_MSG_DEBUG(" z0 = " << std::abs((trkIter)->z0()));
176 ATH_MSG_DEBUG(" d0 = " << std::abs((trkIter)->d0()));
177 // ============================================= //
178 // Pt cut
179 float trkPt = std::abs((trkIter)->pt());
180 float etoverpt = std::abs(calo_et/trkPt);
181 float calotrkdeta_noextrap = (trkIter)->eta() - calo_eta;
182
183 double etaAtCalo=999.;
184 double phiAtCalo=999.;
185 if(m_acceptAll){
186 if(!extrapolate(ctx,*caloDD,emCluster,trkIter,etaAtCalo,phiAtCalo)){
187 ATH_MSG_VERBOSE("extrapolator failed");
188 continue;
189 }
190 else{
191 ATH_MSG_VERBOSE("REGTEST: TrigElectron: cluster index = " << clusEL.index() <<
192 " eta = " << etaAtCalo << " phi = " << phiAtCalo);
193
194 xAOD::TrigElectron* trigElec = new xAOD::TrigElectron();
195 trigElecColl->push_back(trigElec);
197 trigElec->init( roiDescriptor->roiWord(),
198 etaAtCalo, phiAtCalo, etoverpt,
199 clusEL,
200 trackEL);
201 calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
202 }
203 }else {
204
205 ATH_MSG_DEBUG("Apply cuts on track with index: "<<track_index);
206 if(trkPt < m_trackPtthr){
207 ATH_MSG_DEBUG("Failed track pt cut " << trkPt);
208 continue;
209 }
210 if(std::abs(calotrkdeta_noextrap) > m_calotrkdeta_noextrap){
211 ATH_MSG_DEBUG("Failed pre extrapolation calo track deta " << calotrkdeta_noextrap);
212 continue;
213 }
214 if(calo_et > m_clusEtthr){
215 if(trkPt < m_trackPtthr_highet){
216 ATH_MSG_DEBUG("Failed track pt cut for high et cluster");
217 continue;
218 }
219 if(calotrkdeta_noextrap > m_calotrkdeta_noextrap_highet){
220 ATH_MSG_DEBUG("Failed pre extrapolation calo track deta for high et");
221 continue;
222 }
223 }
224 if (etoverpt < m_calotrackdeoverp_low){
225 ATH_MSG_DEBUG("failed low cut on ET/PT");
226 continue;
227 }
228 if (etoverpt > m_calotrackdeoverp_high){
229 ATH_MSG_DEBUG("failed high cut on ET/PT");
230 continue;
231 }
232 if(!extrapolate(ctx,*caloDD,emCluster,trkIter,etaAtCalo,phiAtCalo)){
233 ATH_MSG_DEBUG("extrapolator failed 1");
234 continue;
235 }
236 // all ok: do track-matching cuts
237 ATH_MSG_DEBUG("extrapolated eta/phi=" << etaAtCalo << "/" << phiAtCalo);
238 // match in eta
239 float dEtaCalo = std::abs(etaAtCalo - calo_eta);
240 ATH_MSG_DEBUG("deta = " << dEtaCalo);
241 if ( dEtaCalo > m_calotrackdeta){
242 ATH_MSG_DEBUG("failed eta match cut " << dEtaCalo);
243 continue;
244 }
245 // match in phi: deal with differences larger than Pi
246 float dPhiCalo = std::abs(phiAtCalo - calo_phi);
247 dPhiCalo = ( dPhiCalo < M_PI ? dPhiCalo : 2*M_PI - dPhiCalo );
248 ATH_MSG_DEBUG("dphi = " << dPhiCalo);
249 if ( dPhiCalo > m_calotrackdphi) {
250 ATH_MSG_DEBUG("failed phi match cut " << dPhiCalo);
251 continue;
252 }
253 // all cuts passed
259 ATH_MSG_DEBUG("pT of trackEL: "<<(*trackEL)->pt());
260
261 ATH_MSG_DEBUG("REGTEST: TrigElectron: cluster index = " << clusEL.index() <<
262 " track index= " << track_index << " eta = " << etaAtCalo << " phi = " << phiAtCalo <<
263 " deta = " << dEtaCalo << "dphi = " << dPhiCalo);
264 xAOD::TrigElectron* trigElec = new xAOD::TrigElectron();
265 trigElecColl->push_back(trigElec);
266 trigElec->init( roiDescriptor->roiWord(),
267 etaAtCalo, phiAtCalo, etoverpt,
268 clusEL,
269 trackEL);
270
271 ATH_MSG_DEBUG(" deta = " << dEtaCalo << " deta = " << trigElec->trkClusDeta()
272 << " dphi = " << dPhiCalo << " dphi = " << trigElec->trkClusDphi()
273 << " caloEta = " << calo_eta << " caloEta = " << trigElec->caloEta()
274 << " caloPhi = " << calo_phi << " calophi = " << trigElec->caloPhi()
275 << " etaAtCalo = " << etaAtCalo << " etaAtCalo = " << trigElec->trkEtaAtCalo()
276 << " phiAtCalo = " << phiAtCalo << " phiAtCalo = " << trigElec->trkPhiAtCalo()
277 );
278 calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
279
280 }
281
282 }
283
284
285 ATH_MSG_DEBUG("REGTEST: returning an xAOD::TrigElectronContainer with size "<< trigElecColl->size() << ".");
286
287 return StatusCode::SUCCESS;
288}
289
291 const EventContext& ctx, const CaloDetDescrManager& caloDD,
292 const xAOD::TrigEMCluster* clus, const xAOD::TrackParticle* trk,
293 double& etaAtCalo, double& phiAtCalo) const {
294
295 // use the provided EM cluster to "guide" the extrapolation
296 // 1st figure which layer we want to shoot at
297 // in this case we chose between EMB2 or EME2
298 // given the cluster.
299 std::vector<CaloSampling::CaloSample> samples;
300 if (clus->energy(CaloSampling::CaloSample::EME2) >
301 clus->energy(CaloSampling::CaloSample::EMB2)) {
302 samples.push_back(CaloSampling::CaloSample::EME2);
303 } else {
304 samples.push_back(CaloSampling::CaloSample::EMB2);
305 }
306
307 // create the surfaces we want to reach.
308 // Aka either a cylinder for EME2 or a disc for EMB2
309 std::vector<std::unique_ptr<Trk::Surface>> caloSurfaces =
310 m_caloExtensionTool->caloSurfacesFromLayers(samples, clus->eta(), caloDD);
311
312 // And then try to reach them
313 const auto extension = m_caloExtensionTool->surfaceCaloExtension(
314 ctx, trk->perigeeParameters(), samples, caloSurfaces,
316
317 if (extension.empty()) {
318 ATH_MSG_VERBOSE("extrapolator failed 1");
319 return false;
320 }
321 // We target exactly one EMB2 or EME2 (the vector has 1 entry if not empty)
322 etaAtCalo = extension[0].second->position().eta();
323 phiAtCalo = extension[0].second->position().phi();
324
325 ATH_MSG_VERBOSE("Hit sampling :" << extension.at(0).first << " at eta : "
326 << etaAtCalo << " at phi : " << phiAtCalo);
327
328 return true;
329}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
Header file to be included by clients of the Monitored infrastructure.
An algorithm that can be simultaneously executed in multiple threads.
This class provides the client interface for accessing the detector description information common to...
Group of local monitoring quantities and retain correlation when filling histograms
Gaudi::Property< float > m_calotrackdeoverp_high
SG::WriteHandleKey< xAOD::TrigElectronContainer > m_outputElectronsKey
static double getCaloPt(const xAOD::TrigElectron *el)
Gaudi::Property< float > m_calotrkdeta_noextrap_highet
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloDetDescrMgrKey
Gaudi::Property< float > m_trackPtthr_highet
SG::ReadHandleKey< xAOD::TrigEMClusterContainer > m_TrigEMClusterContainerKey
bool extrapolate(const EventContext &ctx, const CaloDetDescrManager &caloDD, const xAOD::TrigEMCluster *, const xAOD::TrackParticle *, double &, double &) const
Gaudi::Property< float > m_calotrkdeta_noextrap
TrigEgammaFastElectronReAlgo(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrackParticleContainerKey
static double getTkPt(const xAOD::TrigElectron *el)
Gaudi::Property< float > m_calotrackdeoverp_low
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiCollectionKey
SG::WriteHandleKey< xAOD::TrigElectronContainer > m_outputDummyElectronsKey
ToolHandle< GenericMonitoringTool > m_monTool
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
virtual unsigned int roiWord() const override final
Class describing a TrackParticle.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
float et() const
get Et (calibrated)
float eta() const
get Eta (calibrated)
float phi() const
get Phi (calibrated)
float energy() const
get Energy (calibrated)
float trkClusDeta() const
The absolute value of the track-calo eta measurement difference.
float trkEtaAtCalo() const
Get the track's pseudorapidity extrapolated to the calorimeter.
float trkPhiAtCalo() const
Get the track's azimuthal angle extrapolated to the calorimeter.
float etOverPt() const
Get for the electron.
float caloEta() const
Pseudorapidity ( ) of the electron in the calorimeter.
void init(uint32_t roi, float trkEtaAtCalo, float trkPhiAtCalo, float etOverPt, const EMClusterLink_t &clLink, const TrackParticleLink_t &tpLink)
Initialisation function, setting most properties of the object.
float caloPhi() const
Azimuthal angle ( ) of the electron in the calorimeter.
float trkClusDphi() const
The absolute value of the track-calo phi measurement difference.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
setRcore setEtHad setFside pt
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrigElectron_v1 TrigElectron
Declare the latest version of the class.
TrigEMCluster_v1 TrigEMCluster
Define the latest version of the trigger EM cluster class.
setTeId setLumiBlock roiId