ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaEmulationPrecisionPhotonHypoTool.cxx
Go to the documentation of this file.
2#include "GaudiKernel/SystemOfUnits.h"
3
4
5using namespace Trig;
6
7//**********************************************************************
8
12
14
20
22
24 bool &pass) const
25{
26 pass=false;
27 if( !input.roi ) return false;
28 if( input.photons.empty() ) return false;
29
30 for ( const auto& ph : input.photons )
31 {
32 if( decide( input, ph ) ){
33 pass=true;
34 return true;
35 }
36 }
37
38 return true;
39
40}
41
43
45 const xAOD::Photon *ph
46 ) const
47
48{
49
50 const TrigRoiDescriptor *roi = input.roi;
51 unsigned PassedCuts=0;
52
53
54 // when leaving scope it will ship data to monTool
55 PassedCuts = PassedCuts + 1; //got called (data in place)
56
57 if ( std::abs( roi->eta() ) > 2.6 ) {
58 ATH_MSG_DEBUG( "REJECT The photon had eta coordinates beyond the EM fiducial volume : "
59 << roi->eta() << "; stop the chain now" );
60 return false;
61 }
62
63 ATH_MSG_DEBUG( "; RoI ID = " << roi->roiId() << ": Eta = " << roi->eta() << ", Phi = " << roi->phi() );
64
65 // fill local variables for RoI reference position
66 double etaRef = roi->eta();
67 double phiRef = roi->phi();
68 // correct phi the to right range ( probably not needed anymore )
69 if ( std::abs( phiRef ) > M_PI ) phiRef -= 2*M_PI; // correct phi if outside range
70
71 auto pClus = ph->caloCluster();
72
73 if(!pClus){
74 ATH_MSG_DEBUG("No calo cluster for this photon");
75 return false;
76 }
77
78
79 float absEta = std::abs( pClus->eta() );
80 const int cutIndex = findCutIndex( absEta );
81
82
83
84 float dEta = pClus->eta() - etaRef;
85 // Deal with angle diferences greater than Pi
86 float dPhi = std::abs( pClus->phi() - phiRef );
87 dPhi = ( dPhi < M_PI ? dPhi : 2*M_PI - dPhi ); // TB why only <
88 float ET = pClus->et();
89
90
91 // eta range
92 if ( absEta > 2.47) { // VD
93 ATH_MSG_DEBUG( "Photon : " << absEta << " outside eta range " );
94 return false;
95 }
96 PassedCuts = PassedCuts + 1; // passed eta cut
97
98 // eta range
99 if ( cutIndex == -1 ) { // VD
100 ATH_MSG_DEBUG( "Photon : " << absEta << " outside eta range " << m_etabin[m_etabin.size()-1] );
101 return false;
102 } else {
103 ATH_MSG_DEBUG( "eta bin used for cuts " << cutIndex );
104 }
105 PassedCuts = PassedCuts + 1; // passed eta cut
106
107 // ET_em
108 ATH_MSG_DEBUG( "Photon: ET_em=" << ET << " cut: >" << m_eTthr[cutIndex] );
109 if ( ET < m_eTthr[cutIndex] ) {
110 ATH_MSG_DEBUG("REJECT et cut failed");
111 return false;
112 }
113 PassedCuts = PassedCuts + 1; // ET_em
114
115
116
117
118 // apply cuts: DeltaEta( clus-ROI )
119 ATH_MSG_DEBUG( "Photon : eta=" << pClus->eta() << " roi eta=" << etaRef << " DeltaEta=" << dEta
120 << " cut: <" << m_detacluster );
121
122 if ( std::abs( pClus->eta() - etaRef ) > m_detacluster ) {
123 ATH_MSG_DEBUG("REJECT Photon a cut failed");
124 return false;
125 }
126 PassedCuts = PassedCuts + 1; //Deta
127
128 // DeltaPhi( clus-ROI )
129 ATH_MSG_DEBUG( ": phi=" << pClus->phi() << " roi phi="<< phiRef << " DeltaPhi="<< dPhi
130 << " cut: <" << m_dphicluster );
131
132 if( dPhi > m_dphicluster ) {
133 ATH_MSG_DEBUG("REJECT Clsuter dPhi cut failed");
134 return false;
135 }
136 PassedCuts = PassedCuts + 1; //DPhi
137
138
139 // Apply phootn offline like selection
140 bool pass = input.isPassed(ph, m_pidName);
141
142
143
144 float Rhad1(0), Rhad(0), Reta(0), Rphi(0), e277(0), weta2c(0), //emax2(0),
145 Eratio(0), DeltaE(0), f1(0), weta1c(0), wtot(0), fracm(0);
146 float ptcone20(999), ptcone30(999), ptcone40(999), etcone20(999), etcone30(999), etcone40(999), topoetcone20(999), topoetcone30(999), topoetcone40(999), reletcone20(999);
147
148
149 // variables based on HCAL
150 // transverse energy in 1st scintillator of hadronic calorimeter/ET
152 // transverse energy in hadronic calorimeter/ET
154
155 // variables based on S2 of EM CAL
156 // E(7*7) in 2nd sampling
158 // E(3*7)/E(7*7) in 2nd sampling
160 // E(3*3)/E(3*7) in 2nd sampling
162 // shower width in 2nd sampling
164
165 // variables based on S1 of EM CAL
166 // fraction of energy reconstructed in the 1st sampling
168 // shower width in 3 strips in 1st sampling
170 // E of 2nd max between max and min in strips [NOT USED]
171 // eg->showerShapeValue(emax2, xAOD::EgammaParameters::e2tsts1);
172 // (E of 1st max in strips-E of 2nd max)/(E of 1st max+E of 2nd max)
174 // E(2nd max)-E(min) in strips
176 // total shower width in 1st sampling
178 // E(+/-3)-E(+/-1)/E(+/-1)
180
181 ph->isolationValue(ptcone20, xAOD::Iso::ptcone20);
182
183 ph->isolationValue(ptcone30, xAOD::Iso::ptcone30);
184
185 ph->isolationValue(ptcone40, xAOD::Iso::ptcone40);
186
187 ph->isolationValue(etcone20, xAOD::Iso::etcone20);
188
189 ph->isolationValue(etcone30, xAOD::Iso::etcone30);
190
191 ph->isolationValue(etcone40, xAOD::Iso::etcone40);
192
193 ph->isolationValue(topoetcone20, xAOD::Iso::topoetcone20);
194
195 ph->isolationValue(topoetcone30, xAOD::Iso::topoetcone30);
196
197 ph->isolationValue(topoetcone40, xAOD::Iso::topoetcone40);
198
199 ATH_MSG_DEBUG( " Rhad1 " << Rhad1 ) ;
200 ATH_MSG_DEBUG( " Rhad " << Rhad ) ;
201 ATH_MSG_DEBUG( " e277 " << e277 ) ;
202 ATH_MSG_DEBUG( " Reta " << Reta ) ;
203 ATH_MSG_DEBUG( " Rphi " << Rphi ) ;
204 ATH_MSG_DEBUG( " weta2c " << weta2c ) ;
205 ATH_MSG_DEBUG( " f1 " << f1 ) ;
206 ATH_MSG_DEBUG( " weta1c " << weta1c ) ;
207 ATH_MSG_DEBUG( " Eratio " << Eratio ) ;
208 ATH_MSG_DEBUG( " DeltaE " << DeltaE ) ;
209 ATH_MSG_DEBUG( " wtot " << wtot ) ;
210 ATH_MSG_DEBUG( " fracm " << fracm ) ;
211 ATH_MSG_DEBUG( " ptcone20 " << ptcone20 ) ;
212 ATH_MSG_DEBUG( " ptcone30 " << ptcone30 ) ;
213 ATH_MSG_DEBUG( " ptcone40 " << ptcone40 ) ;
214 ATH_MSG_DEBUG( " etcone20 " << etcone20 ) ;
215 ATH_MSG_DEBUG( " etcone30 " << etcone30 ) ;
216 ATH_MSG_DEBUG( " etcone40 " << etcone40 ) ;
217 ATH_MSG_DEBUG( " topoetcone20 " << topoetcone20 ) ;
218 ATH_MSG_DEBUG( " topoetcone30 " << topoetcone30 ) ;
219 ATH_MSG_DEBUG( " topoetcone40 " << topoetcone40 ) ;
220 // Monitor showershapes
221 reletcone20 = etcone20/ph->caloCluster()->et();
222 ATH_MSG_DEBUG("reletcone20 = " <<reletcone20 );
223 ATH_MSG_DEBUG("m_RelEtConeCut = " << m_RelTopoEtConeCut );
224
225
226 // Decode isEM bits of result to see which bits passed and which bits fialed
227 if ( !pass ){
228 ATH_MSG_DEBUG("REJECT isEM failed");
229 return false;
230 } else {
231 ATH_MSG_DEBUG("ACCEPT isEM passed");
232 }
233
234
235 // Check if need to apply isolation
236 // First check logic. if cut is very negative, then no isolation cut is defined
237 // if m_RelEtConeCut <-100 then hypo is configured not to apply isolation
238 if (m_RelTopoEtConeCut < -100){
239 ATH_MSG_DEBUG(" not applying isolation. Returning NOW");
240 ATH_MSG_DEBUG("TAccept = " << pass);
241 return true;
242 }
243 // Then, It will pass if reletcone20 is less than cut:
244 pass = (reletcone20 < m_RelTopoEtConeCut);
245 //
246 // Reach this point successfully
247 ATH_MSG_DEBUG( "pass = " << pass );
248
249 return pass;
250
251}
252
254
256 const float absEta = std::abs(eta);
257 auto binIterator = std::adjacent_find( m_etabin.begin(), m_etabin.end(), [=](float left, float right){ return left < absEta and absEta < right; } );
258 if ( binIterator == m_etabin.end() ) {
259 return -1;
260 }
261 return binIterator - m_etabin.begin();
262}
#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.
int findCutIndex(float eta) const
==========================================================================
virtual StatusCode initialize() override
==========================================================================
bool decide(const TrigData &input, const xAOD::Photon *ph) const
==========================================================================
virtual bool emulate(const TrigData &input, bool &pass) const override
==========================================================================
bool showerShapeValue(float &value, const EgammaParameters::ShowerShapeType information) const
Accessor for ShowerShape values.
bool isolationValue(float &value, const Iso::IsolationType information) const
old Accessor for Isolation values.
Definition Egamma_v1.h:251
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
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.
Photon_v1 Photon
Definition of the current "egamma version".