ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaEmulationPrecisionElectronHypoTool.cxx
Go to the documentation of this file.
2#include "GaudiKernel/SystemOfUnits.h"
3
4
5using namespace Trig;
6
7//**********************************************************************
8
12
13
14
15//=================================================================
16
22
24
26 bool &pass) const
27{
28 pass=false;
29
30 if( !input.roi ) return false;
31
32 if( input.electrons.empty() ) return false;
33
34 if (m_acceptAll){
35 pass=true;
36 return true;
37 }
38
39 for ( const auto& el : input.electrons )
40 {
41 if( decide( input, el ) ){
42 pass=true;
43 return true;
44 }
45 }
46 return false;
47
48}
49
50
51//=================================================================
52
53
55 const xAOD::Electron *el
56 ) const
57
58{
59 const TrigRoiDescriptor *roi = input.roi;
60
61 // when leaving scope it will ship data to monTool
62 unsigned PassedCuts = 0; //got called (data in place)
63
64
65 if ( std::abs( roi->eta() ) > 2.6 ) {
66 ATH_MSG_DEBUG( "REJECT The electron had eta coordinates beyond the EM fiducial volume : " << roi->eta() << "; stop the chain now" );
67 return false;
68 }
69
70 ATH_MSG_DEBUG( "RoI ID = " << roi->roiId() << ": Eta = " << roi->eta() << ", Phi = " << roi->phi() );
71
72 // fill local variables for RoI reference position
73 double etaRef = roi->eta();
74 double phiRef = roi->phi();
75 ATH_MSG_DEBUG("etaRef: "<<etaRef);
76 // correct phi the to right range ( probably not needed anymore )
77 if ( std::abs( phiRef ) > M_PI ) phiRef -= 2*M_PI; // correct phi if outside range
78
79
80 ATH_MSG_DEBUG("Electron : et " << el->pt() << " eta = " << el->eta() << " phi = " << el->phi());
81
82 auto pClus = el->caloCluster();
83
84 if(!pClus){
85 ATH_MSG_DEBUG("No calo cluster for this electron");
86 return false;
87 }
88
89 float absEta = std::abs( pClus->eta() );
90
91 ATH_MSG_DEBUG("absEta: "<<absEta);
92
93 const int cutIndex = findCutIndex( absEta );
94
95
96
97
98 float dEta = pClus->eta() - etaRef;
99 // Deal with angle diferences greater than Pi
100 float dPhi = std::abs( pClus->phi() - phiRef );
101 dPhi = ( dPhi < M_PI ? dPhi : 2*M_PI - dPhi ); // TB why only <
102 float ET = pClus->et();
103
104
105 // eta range
106 if( absEta > 2.47 ){
107 ATH_MSG_DEBUG( "Electron : " << absEta << " outside eta range ");
108 return false;
109 }
110
111 PassedCuts = PassedCuts + 1; // passed eta cut
112
113
114 // apply cuts: DeltaEta( clus-ROI )
115 ATH_MSG_DEBUG( "Electron : eta=" << pClus->eta() << " roi eta=" << etaRef << " DeltaEta=" << dEta
116 << " cut: <" << m_detacluster );
117
118 if ( std::abs( pClus->eta() - etaRef ) > m_detacluster ) {
119 ATH_MSG_DEBUG("REJECT Electron a cut failed");
120 return false;
121 }
122 PassedCuts = PassedCuts + 1; //Deta
123
124 // DeltaPhi( clus-ROI )
125 ATH_MSG_DEBUG( ": phi=" << pClus->phi() << " roi phi="<< phiRef << " DeltaPhi="<< dPhi << " cut: <" << m_dphicluster );
126
127 if( dPhi > m_dphicluster ) {
128 ATH_MSG_DEBUG("REJECT Clsuter dPhi cut failed");
129 return false;
130 }
131 PassedCuts = PassedCuts + 1; //DPhi
132
133
134
135 // eta range
136 if ( cutIndex == -1 ) { // VD
137 ATH_MSG_DEBUG( "Electron : " << absEta << " outside eta range " << m_etabin[m_etabin.size()-1] );
138 return false;
139 } else {
140 ATH_MSG_DEBUG( "eta bin used for cuts " << cutIndex );
141 }
142 PassedCuts = PassedCuts + 1; // passed eta cut
143
144 // ET_em
145 ATH_MSG_DEBUG( "Electron: ET_em=" << ET << " cut: >" << m_eTthr[cutIndex] );
146 if ( ET < m_eTthr[cutIndex] ) {
147 ATH_MSG_DEBUG("REJECT et cut failed");
148 return false;
149 }
150 PassedCuts = PassedCuts + 1; // ET_em
151 if(m_doNoPid) return true;
152
153
154
155 // d0 for LRT
156 if (m_d0 and m_d0>0.)
157 {
158 float trk_d0 = std::abs(el->trackParticle()->d0());
159 ATH_MSG_DEBUG( "Electron: trk_d0=" << trk_d0 << " cut: >" << m_d0 );
160 if ( trk_d0 < m_d0 ) {
161 ATH_MSG_DEBUG("REJECT d0 cut failed");
162 return false;
163 }
164 PassedCuts = PassedCuts + 1; // d0
165 }
166
167
168 ATH_MSG_DEBUG("Average mu " << avgmu());
169
170 bool pass = input.isPassed(el , avgmu(), m_pidName);
171
172
173 float Rhad1(0), Rhad(0), Reta(0), Rphi(0), e277(0), weta2c(0), //emax2(0),
174 Eratio(0), DeltaE(0), f1(0), weta1c(0), wtot(0), fracm(0);
175 float ptcone20(999), ptcone30(999), ptcone40(999), etcone20(999), etcone30(999), etcone40(999), topoetcone20(999), topoetcone30(999), topoetcone40(999), relptcone20(999);
176
177
178 // variables based on HCAL
179 // transverse energy in 1st scintillator of hadronic calorimeter/ET
180 el->showerShapeValue(Rhad1, xAOD::EgammaParameters::Rhad1);
181 // transverse energy in hadronic calorimeter/ET
182 el->showerShapeValue(Rhad, xAOD::EgammaParameters::Rhad);
183
184 // variables based on S2 of EM CAL
185 // E(7*7) in 2nd sampling
186 el->showerShapeValue(e277, xAOD::EgammaParameters::e277);
187 // E(3*7)/E(7*7) in 2nd sampling
188 el->showerShapeValue(Reta, xAOD::EgammaParameters::Reta);
189 // E(3*3)/E(3*7) in 2nd sampling
190 el->showerShapeValue(Rphi, xAOD::EgammaParameters::Rphi);
191 // shower width in 2nd sampling
192 el->showerShapeValue(weta2c, xAOD::EgammaParameters::weta2);
193
194 // variables based on S1 of EM CAL
195 // fraction of energy reconstructed in the 1st sampling
196 el->showerShapeValue(f1, xAOD::EgammaParameters::f1);
197 // shower width in 3 strips in 1st sampling
198 el->showerShapeValue(weta1c, xAOD::EgammaParameters::weta1);
199 // E of 2nd max between max and min in strips [NOT USED]
200 // eg->showerShapeValue(emax2, xAOD::EgammaParameters::e2tsts1);
201 // (E of 1st max in strips-E of 2nd max)/(E of 1st max+E of 2nd max)
202 el->showerShapeValue(Eratio, xAOD::EgammaParameters::Eratio);
203 // E(2nd max)-E(min) in strips
204 el->showerShapeValue(DeltaE, xAOD::EgammaParameters::DeltaE);
205 // total shower width in 1st sampling
206 el->showerShapeValue(wtot, xAOD::EgammaParameters::wtots1);
207 // E(+/-3)-E(+/-1)/E(+/-1)
208 el->showerShapeValue(fracm, xAOD::EgammaParameters::fracs1);
209
210 el->isolationValue(ptcone20, xAOD::Iso::ptcone20);
211
212 el->isolationValue(ptcone30, xAOD::Iso::ptcone30);
213
214 el->isolationValue(ptcone40, xAOD::Iso::ptcone40);
215
216 el->isolationValue(etcone20, xAOD::Iso::etcone20);
217
218 el->isolationValue(etcone30, xAOD::Iso::etcone30);
219
220 el->isolationValue(etcone40, xAOD::Iso::etcone40);
221
222 el->isolationValue(topoetcone20, xAOD::Iso::topoetcone20);
223
224 el->isolationValue(topoetcone30, xAOD::Iso::topoetcone30);
225
226 el->isolationValue(topoetcone40, xAOD::Iso::topoetcone40);
227
228 ATH_MSG_DEBUG(" electron Cluster Et "<<ET);
229 ATH_MSG_DEBUG( " Rhad1 " << Rhad1 ) ;
230 ATH_MSG_DEBUG( " Rhad " << Rhad ) ;
231 ATH_MSG_DEBUG( " e277 " << e277 ) ;
232 ATH_MSG_DEBUG( " Reta " << Reta ) ;
233 ATH_MSG_DEBUG( " Rphi " << Rphi ) ;
234 ATH_MSG_DEBUG( " weta2c " << weta2c ) ;
235 ATH_MSG_DEBUG( " f1 " << f1 ) ;
236 ATH_MSG_DEBUG( " weta1c " << weta1c ) ;
237 ATH_MSG_DEBUG( " Eratio " << Eratio ) ;
238 ATH_MSG_DEBUG( " DeltaE " << DeltaE ) ;
239 ATH_MSG_DEBUG( " wtot " << wtot ) ;
240 ATH_MSG_DEBUG( " fracm " << fracm ) ;
241 ATH_MSG_DEBUG( " trackPT "<<el->trackParticle()->pt());
242 ATH_MSG_DEBUG( " d0 "<<el->trackParticle()->d0());
243 ATH_MSG_DEBUG( " z0 "<<el->trackParticle()->z0());
244 ATH_MSG_DEBUG( " ptcone20 " << ptcone20 ) ;
245 ATH_MSG_DEBUG( " ptcone30 " << ptcone30 ) ;
246 ATH_MSG_DEBUG( " ptcone40 " << ptcone40 ) ;
247 ATH_MSG_DEBUG( " etcone20 " << etcone20 ) ;
248 ATH_MSG_DEBUG( " etcone30 " << etcone30 ) ;
249 ATH_MSG_DEBUG( " etcone40 " << etcone40 ) ;
250 ATH_MSG_DEBUG( " topoetcone20 " << topoetcone20 ) ;
251 ATH_MSG_DEBUG( " topoetcone30 " << topoetcone30 ) ;
252 ATH_MSG_DEBUG( " topoetcone40 " << topoetcone40 ) ;
253
254 // Monitor showershapes
255 relptcone20 = ptcone20/el->pt();
256 ATH_MSG_DEBUG("relptcone20 = " <<relptcone20 );
257 ATH_MSG_DEBUG("m_RelPtConeCut = " << m_RelPtConeCut );
258
259 // Evaluating lh *after* retrieving variables for monitoing and DEBUGing purposes
260 ATH_MSG_DEBUG("AthenaLHSelectorTool: TAccept = " << pass);
261 if ( !pass ){
262 ATH_MSG_DEBUG("REJECT Likelihood failed");
263 return false;
264 } else {
265 ATH_MSG_DEBUG("ACCEPT Likelihood passed");
266 }
267
268 // Check if need to apply isolation
269 // First check logic. if cut is very negative, then no isolation cut is defined
270 // if m_RelPtConeCut <-100 then hypo is configured not to apply isolation
271 if (m_RelPtConeCut < -100){
272 ATH_MSG_DEBUG(" not applying isolation. Returning NOW");
273 ATH_MSG_DEBUG("TAccept = " << pass);
274 return true;
275 }
276 // Then, It will pass if relptcone20 is less than cut:
277 pass = (relptcone20 < m_RelPtConeCut);
278 //
279 // Reach this point successfully
280 ATH_MSG_DEBUG( "pass = " << pass );
281 return pass;
282
283
284
285}
286
287
289 const float absEta = std::abs(eta);
290 auto binIterator = std::adjacent_find( m_etabin.begin(), m_etabin.end(), [=](float left, float right){ return left < absEta and absEta < right; } );
291 if ( binIterator == m_etabin.end() ) {
292 return -1;
293 }
294 return binIterator - m_etabin.begin();
295}
296
#define M_PI
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
virtual double phi() const override final
Methods to retrieve data members.
virtual double eta() const override final
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
virtual unsigned int roiId() const override final
these quantities probably don't need to be used any more
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
bool decide(const Trig::TrigData &input, const xAOD::Electron *el) const
virtual bool emulate(const TrigData &input, bool &pass) const override
==========================================================================
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Gaudi::Property< std::vector< float > > m_etabin
selection variable for PRECISION electron selection:eta bins
The common trigger namespace for trigger analysis tools.
@ wtots1
shower width is determined in a window detaxdphi = 0,0625 ×~0,2, corresponding typically to 20 strips...
@ e277
uncalibrated energy (sum of cells) of the middle sampling in a rectangle of size 7x7
Definition EgammaEnums.h:81
@ f1
E1/E = fraction of energy reconstructed in the first sampling, where E1 is energy in all strips belon...
Definition EgammaEnums.h:53
@ Eratio
(emaxs1-e2tsts1)/(emaxs1+e2tsts1)
@ DeltaE
e2tsts1-emins1
@ fracs1
shower shape in the shower core : [E(+/-3)-E(+/-1)]/E(+/-1), where E(+/-n) is the energy in ± n strip...
@ weta2
the lateral width is calculated with a window of 3x5 cells using the energy weighted sum over all cel...
@ weta1
shower width using +/-3 strips around the one with the maximal energy deposit: w3 strips = sqrt{sum(E...
Definition EgammaEnums.h:98
@ topoetcone20
Topo-cluster ET-sum.
@ etcone20
Calorimeter isolation.
@ ptcone20
Track isolation.
Electron_v1 Electron
Definition of the current "egamma version".