ATLAS Offline Software
TrigEgammaEmulationPrecisionElectronHypoTool.cxx
Go to the documentation of this file.
2 #include "GaudiKernel/SystemOfUnits.h"
3 
4 
5 using namespace Trig;
6 
7 //**********************************************************************
8 
11 {}
12 
13 
14 
15 //=================================================================
16 
18 {
20  return StatusCode::SUCCESS;
21 }
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 
xAOD::Iso::topoetcone20
@ topoetcone20
Topo-cluster ET-sum.
Definition: IsolationType.h:48
xAOD::EgammaParameters::Reta
@ Reta
e237/e277
Definition: EgammaEnums.h:154
Trig
The common trigger namespace for trigger analysis tools.
Definition: LArCellMonAlg.h:33
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::initialize
virtual StatusCode initialize() override
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.cxx:17
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_pidName
Gaudi::Property< std::string > m_pidName
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:40
xAOD::Iso::ptcone30
@ ptcone30
Definition: IsolationType.h:41
M_PI
#define M_PI
Definition: ActiveFraction.h:11
xAOD::Iso::ptcone20
@ ptcone20
Track isolation.
Definition: IsolationType.h:40
xAOD::Iso::etcone40
@ etcone40
Definition: IsolationType.h:34
xAOD::Iso::topoetcone30
@ topoetcone30
Definition: IsolationType.h:49
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::findCutIndex
int findCutIndex(float eta) const
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.cxx:288
TrigRoiDescriptor
nope - should be used for standalone also, perhaps need to protect the class def bits #ifndef XAOD_AN...
Definition: TrigRoiDescriptor.h:56
xAOD::Iso::etcone30
@ etcone30
Definition: IsolationType.h:33
xAOD::EgammaParameters::Rphi
@ Rphi
e233/e237
Definition: EgammaEnums.h:156
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::TrigEgammaEmulationPrecisionElectronHypoTool
TrigEgammaEmulationPrecisionElectronHypoTool(const std::string &myname)
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.cxx:9
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_doNoPid
Gaudi::Property< bool > m_doNoPid
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:49
TrigEgammaEmulationPrecisionElectronHypoTool.h
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_acceptAll
Gaudi::Property< bool > m_acceptAll
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:48
xAOD::EgammaParameters::wtots1
@ wtots1
shower width is determined in a window detaxdphi = 0,0625 ×~0,2, corresponding typically to 20 strips...
Definition: EgammaEnums.h:140
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_etabin
Gaudi::Property< std::vector< float > > m_etabin
selection variable for PRECISION electron selection:eta bins
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:44
Trig::TrigEgammaEmulationBaseHypoTool
Definition: TrigEgammaEmulationBaseHypoTool.h:22
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::emulate
virtual bool emulate(const TrigData &input, bool &pass) const override
==========================================================================
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.cxx:25
xAOD::EgammaParameters::f1
@ f1
E1/E = fraction of energy reconstructed in the first sampling, where E1 is energy in all strips belon...
Definition: EgammaEnums.h:52
Trig::TrigEgammaEmulationBaseHypoTool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: TrigEgammaEmulationBaseHypoTool.cxx:17
xAOD::Iso::etcone20
@ etcone20
Calorimeter isolation.
Definition: IsolationType.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TauGNNUtils::Variables::Track::dPhi
bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:538
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::decide
bool decide(const Trig::TrigData &input, const xAOD::Electron *el) const
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.cxx:54
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::EgammaParameters::Rhad1
@ Rhad1
ethad1/et
Definition: EgammaEnums.h:162
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_detacluster
Gaudi::Property< float > m_detacluster
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:41
xAOD::Electron_v1
Definition: Electron_v1.h:34
TrigRoiDescriptor::roiId
virtual unsigned int roiId() const override final
these quantities probably don't need to be used any more
Definition: TrigRoiDescriptor.h:133
xAOD::Iso::ptcone40
@ ptcone40
Definition: IsolationType.h:42
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_d0
Gaudi::Property< float > m_d0
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:46
RoiDescriptor::phi
virtual double phi() const override final
Methods to retrieve data members.
Definition: RoiDescriptor.h:100
Trig::TrigEgammaEmulationBaseHypoTool::avgmu
float avgmu() const
Definition: TrigEgammaEmulationBaseHypoTool.cxx:26
Trig::TrigData
Definition: TrigEgammaEmulationToolMT.h:40
TauGNNUtils::Variables::absEta
bool absEta(const xAOD::TauJet &tau, double &out)
Definition: TauGNNUtils.cxx:234
RoiDescriptor::eta
virtual double eta() const override final
Definition: RoiDescriptor.h:101
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_eTthr
Gaudi::Property< std::vector< float > > m_eTthr
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:45
xAOD::EgammaParameters::e277
@ e277
uncalibrated energy (sum of cells) of the middle sampling in a rectangle of size 7x7
Definition: EgammaEnums.h:80
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_dphicluster
Gaudi::Property< float > m_dphicluster
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:42
xAOD::EgammaParameters::weta1
@ weta1
shower width using +/-3 strips around the one with the maximal energy deposit: w3 strips = sqrt{sum(E...
Definition: EgammaEnums.h:97
xAOD::EgammaParameters::Eratio
@ Eratio
(emaxs1-e2tsts1)/(emaxs1+e2tsts1)
Definition: EgammaEnums.h:158
xAOD::Iso::topoetcone40
@ topoetcone40
Definition: IsolationType.h:50
Trig::TrigEgammaEmulationPrecisionElectronHypoTool::m_RelPtConeCut
Gaudi::Property< float > m_RelPtConeCut
Definition: TrigEgammaEmulationPrecisionElectronHypoTool.h:43
xAOD::EgammaParameters::Rhad
@ Rhad
ethad/et
Definition: EgammaEnums.h:160
TauGNNUtils::Variables::Track::dEta
bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:527
xAOD::EgammaParameters::DeltaE
@ DeltaE
e2tsts1-emins1
Definition: EgammaEnums.h:164
xAOD::EgammaParameters::fracs1
@ fracs1
shower shape in the shower core : [E(+/-3)-E(+/-1)]/E(+/-1), where E(+/-n) is the energy in ± n strip...
Definition: EgammaEnums.h:111
read_hist_ntuple.f1
f1
Definition: read_hist_ntuple.py:4
xAOD::EgammaParameters::weta2
@ weta2
the lateral width is calculated with a window of 3x5 cells using the energy weighted sum over all cel...
Definition: EgammaEnums.h:103