ATLAS Offline Software
Loading...
Searching...
No Matches
TrigEgammaMonitorAnalysisAlgorithm.cxx
Go to the documentation of this file.
1
2
5
6
7
8TrigEgammaMonitorAnalysisAlgorithm::TrigEgammaMonitorAnalysisAlgorithm( const std::string& name, ISvcLocator* pSvcLocator ):
9 TrigEgammaMonitorBaseAlgorithm( name, pSvcLocator )
10
11{}
12
15
16
18{
19
21
22 return StatusCode::SUCCESS;
23}
24
25
26// *********************************************************************************
27
28
29
30void TrigEgammaMonitorAnalysisAlgorithm::fillLabel( const ToolHandle<GenericMonitoringTool>& groupHandle,
31 const std::string &histname,
32 const std::string &label ) const
33{
34 auto mon = Monitored::Scalar<std::string>( histname, label );
35 fill( groupHandle, mon );
36}
37
38
39
40// *********************************************************************************
41
43 const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs,
44 const TrigInfo& info, const bool onlyHLT ) const
45{
46
47 std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >> pair_vec;
48 std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >> pair_iso_vec;
49
50 std::vector<asg::AcceptData> accept_vec;
51 std::vector<asg::AcceptData> accept_iso_vec;
52
53 std::vector<asg::AcceptData> emu_accept_vec;
54 std::vector<asg::AcceptData> emu_accept_iso_vec;
55
56
57 for( auto pairObj : pairObjs ){
58
59 if(pairObj.first->type()==xAOD::Type::Electron){
60
61 auto passBits=tdt()->isPassedBits(info.trigger);
62 if(!((passBits & TrigDefs::L1_isPassedAfterVeto) && ((passBits & TrigDefs::EF_prescaled)==0))){
63 ATH_MSG_DEBUG("Prescaled trigger: " << info.trigger << " Skipping to normalize efficiencies");
64 continue;
65 }
66 const xAOD::Electron* el = static_cast<const xAOD::Electron *> (pairObj.first);
67 float et = getEt(el)/Gaudi::Units::GeV;
68 if(et < info.etthr-5.0) continue;
69
70 }else if(pairObj.first->type()==xAOD::Type::Photon){
71 float et = getCluster_et(pairObj.first)/Gaudi::Units::GeV;
72 if(et < info.etthr-5.0) continue;
73
74 // Applying FixedCutLoose isolation on the offline photon as recommended in the twiki:
75 // https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/IsolationSelectionTool#Photons
76 bool pass_CaloIso = getIsolation_topoetcone20(pairObj.first)/getCluster_et(pairObj.first) < 0.065;
77 bool pass_trkIso = getIsolation_ptcone20(pairObj.first)/getCluster_et(pairObj.first) < 0.05;
78
79 if (!pass_CaloIso || !pass_trkIso){
80 continue; // pass FixedCutLoose offline isolation
81 }
82 } // Offline photon
83
84
85 // Good pair to be measure
86 if(m_doEmulation){ // Emulation
87 bool valid=false;
88 auto acceptData = m_emulatorTool->emulate( pairObj.second, info.trigger , valid);
89 // skip this probe since the emulation is not possible. Avoid diff denominators between emulation and efficiecy
90 if(!valid) {
91 ATH_MSG_DEBUG("Emulation fail. Skip this probe...");
92 continue;
93 }
94 emu_accept_vec.push_back( acceptData );
95 static const SG::Decorator<bool> IsolatedDec("Isolated");
96 if( IsolatedDec(*pairObj.first) ){
97 emu_accept_iso_vec.push_back(acceptData);
98 }
99 }
100
101 // Good pair to be measure
102 { // Efficiency
103 pair_vec.push_back(pairObj);
104 auto acceptData = setAccept( pairObj.second, info, onlyHLT );
105 accept_vec.push_back(acceptData);
106 static const SG::Decorator<bool> IsolatedDec("Isolated");
107 if( IsolatedDec(*pairObj.first) ){
108 pair_iso_vec.push_back(pairObj);
109 accept_iso_vec.push_back(acceptData);
110 }
111 }
112
113
114 }
115
116 std::string dirname= "Efficiency";
117 std::string l2step = "FastElectron";
118 if( info.signature == "Electron" ){
119 l2step = "FastElectron";
120 }else if( info.signature == "Photon" ){
121 l2step = "FastPhoton";
122 }
123 fillEfficiency(ctx, "L1Calo" , "L1Calo" , info.pidname, info, pair_vec , accept_vec, dirname);
124 fillEfficiency(ctx, "FastCalo" , "L2Calo" , info.pidname, info, pair_vec , accept_vec, dirname);
125 fillEfficiency(ctx, l2step , "L2" , info.pidname, info, pair_vec , accept_vec, dirname);
126 fillEfficiency(ctx, "PrecisionCalo" , "EFCalo" , info.pidname, info, pair_vec , accept_vec, dirname);
127 fillEfficiency(ctx, "HLT" , "HLT" , info.pidname, info, pair_vec , accept_vec, dirname);
128
129
130 if( m_detailedHists ){
131 for( const auto& pid : m_isemname ){
132 fillEfficiency(ctx, "HLT_" + pid, "HLT", pid, info, pair_vec , accept_vec, dirname);
133 fillEfficiency(ctx, "HLT_" + pid + "Iso", "HLT", pid, info, pair_iso_vec, accept_iso_vec, dirname );
134 }
135 for( const auto& pid : m_lhname ){
136 fillEfficiency(ctx, "HLT_" + pid, "HLT", pid, info, pair_vec, accept_vec, dirname );
137 fillEfficiency(ctx, "HLT_" + pid + "Iso", "HLT", pid, info, pair_iso_vec, accept_iso_vec, dirname );
138 }
139 }
140
141 // Fill emulator efficiency plots
142 if ( m_doEmulation ){
143 dirname= "Emulation";
144 fillEfficiency(ctx, "L1Calo" , "L1Calo" , info.pidname, info, pair_vec , emu_accept_vec, dirname);
145 fillEfficiency(ctx, "FastCalo" , "L2Calo" , info.pidname, info, pair_vec , emu_accept_vec, dirname);
146 fillEfficiency(ctx, l2step , "L2" , info.pidname, info, pair_vec , emu_accept_vec, dirname);
147 fillEfficiency(ctx, "PrecisionCalo" , "EFCalo" , info.pidname, info, pair_vec , emu_accept_vec, dirname);
148 fillEfficiency(ctx, "HLT" , "HLT" , info.pidname, info, pair_vec , emu_accept_vec, dirname);
149 }
150
151 // Fill Inefficiencies
152 fillInefficiency( info.pidname, info, pair_vec , accept_vec);
153
154}
155
156
158 const std::string &subgroup,
159 const std::string &level,
160 const std::string &pidword,
161 const TrigInfo& info,
162 const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision* >>& pairObjs,
163 const std::vector< asg::AcceptData >& acceptObjs ,
164 const std::string& dirname ) const
165{
166 const float etthr = info.etthr;
167 const std::string trigger = info.trigger;
168 auto monGroup = getGroup( trigger + "_"+dirname+"_" + subgroup );
169
170 std::vector<float> et_vec, highet_vec, pt_vec, eta_vec, phi_vec, avgmu_vec, npvtx_vec,et_slice0_vec,et_slice1_vec,et_slice2_vec,et_slice3_vec, ptvarcone20rel_vec, ptvarcone30rel_vec, z0_vec, d0_vec;
171 std::vector<float> match_et_vec, match_highet_vec, match_pt_vec, match_eta_vec, match_phi_vec, match_avgmu_vec, match_npvtx_vec, match_ptvarcone20rel_vec, match_ptvarcone30rel_vec, match_z0_vec, match_d0_vec;
172 std::vector<bool> et_passed_vec, et_failed_vec, highet_passed_vec, highet_failed_vec, pt_passed_vec, eta_passed_vec, eta_failed_vec, phi_passed_vec, avgmu_passed_vec, npvtx_passed_vec;
173 std::vector<bool> ptvarcone20rel_passed_vec, ptvarcone30rel_passed_vec, z0_passed_vec, d0_passed_vec;
174 std::vector<bool> et_slice0_passed_vec,et_slice1_passed_vec,et_slice2_passed_vec,et_slice3_passed_vec;
175
176 auto et_col = Monitored::Collection( "et" , et_vec );
177 auto highet_col = Monitored::Collection( "highet" , highet_vec );
178 auto pt_col = Monitored::Collection( "pt" , pt_vec );
179 auto eta_col = Monitored::Collection( "eta" , eta_vec );
180 auto phi_col = Monitored::Collection( "phi" , phi_vec );
181 auto avgmu_col = Monitored::Collection( "avgmu" , avgmu_vec );
182 auto npvtx_col = Monitored::Collection( "npvtx" , npvtx_vec );
183 auto ptvarcone20rel_col = Monitored::Collection( "ptvarcone20rel" , ptvarcone20rel_vec );
184 auto ptvarcone30rel_col = Monitored::Collection( "ptvarcone30rel" , ptvarcone30rel_vec );
185
186 auto z0_col = Monitored::Collection( "z0" , z0_vec );
187 auto d0_col = Monitored::Collection( "d0" , d0_vec );
188
189 auto match_et_col = Monitored::Collection( "match_et" , match_et_vec );
190 auto match_highet_col = Monitored::Collection( "match_ethigh" , match_highet_vec );
191 auto match_pt_col = Monitored::Collection( "match_pt" , match_pt_vec );
192 auto match_eta_col = Monitored::Collection( "match_eta" , match_eta_vec );
193 auto match_phi_col = Monitored::Collection( "match_phi" , match_phi_vec );
194 auto match_avgmu_col = Monitored::Collection( "match_avgmu" , match_avgmu_vec );
195 auto match_npvtx_col = Monitored::Collection( "match_npvtx" , match_npvtx_vec );
196 auto match_ptvarcone20rel_col = Monitored::Collection( "match_ptvarcone20rel" , match_ptvarcone20rel_vec );
197 auto match_ptvarcone30rel_col = Monitored::Collection( "match_ptvarcone30rel" , match_ptvarcone30rel_vec );
198
199 auto match_z0_col = Monitored::Collection( "match_z0" , match_z0_vec );
200 auto match_d0_col = Monitored::Collection( "match_d0" , match_d0_vec );
201
202 auto et_passed_col = Monitored::Collection( "et_passed" , et_passed_vec );
203 auto et_failed_col = Monitored::Collection( "et_failed" , et_failed_vec );
204 auto highet_passed_col = Monitored::Collection( "highet_passed" , highet_passed_vec );
205 auto highet_failed_col = Monitored::Collection( "highet_failed" , highet_failed_vec );
206 auto pt_passed_col = Monitored::Collection( "pt_passed" , pt_passed_vec );
207 auto eta_passed_col = Monitored::Collection( "eta_passed" , eta_passed_vec );
208 auto eta_failed_col = Monitored::Collection( "eta_failed" , eta_failed_vec );
209 auto phi_passed_col = Monitored::Collection( "phi_passed" , phi_passed_vec );
210 auto avgmu_passed_col = Monitored::Collection( "avgmu_passed" , avgmu_passed_vec );
211 auto npvtx_passed_col = Monitored::Collection( "npvtx_passed" , npvtx_passed_vec );
212 auto ptvarcone20rel_passed_col = Monitored::Collection( "ptvarcone20rel_passed" , ptvarcone20rel_passed_vec );
213 auto ptvarcone30rel_passed_col = Monitored::Collection( "ptvarcone30rel_passed" , ptvarcone30rel_passed_vec );
214
215 auto z0_passed_col = Monitored::Collection( "z0_passed" , z0_passed_vec );
216 auto d0_passed_col = Monitored::Collection( "d0_passed" , d0_passed_vec );
217
218 // For ET efficiency analysis in eta slices
219 auto et_slice0_col = Monitored::Collection( "et_slice0" , et_slice0_vec );
220 auto et_slice1_col = Monitored::Collection( "et_slice1" , et_slice1_vec );
221 auto et_slice2_col = Monitored::Collection( "et_slice2" , et_slice2_vec );
222 auto et_slice3_col = Monitored::Collection( "et_slice3" , et_slice3_vec );
223
224 auto et_slice0_passed_col = Monitored::Collection( "et_slice0_passed" , et_slice0_passed_vec );
225 auto et_slice1_passed_col = Monitored::Collection( "et_slice1_passed" , et_slice1_passed_vec );
226 auto et_slice2_passed_col = Monitored::Collection( "et_slice2_passed" , et_slice2_passed_vec );
227 auto et_slice3_passed_col = Monitored::Collection( "et_slice3_passed" , et_slice3_passed_vec );
228
229 unsigned iObj=0;
230
231 SG::Decorator<bool> pidwordDec("is"+pidword);
232 for( auto pairObj : pairObjs ){
233
234 bool pid=true;
235 bool isPassed = acceptObjs[iObj].getCutResult( level );
236 float et=0.;
237 float ptvarcone20rel = -99.0;
238 float ptvarcone30rel = -99.0;
239 float z0 = -99.0;
240 float d0 = -99.0;
241 const auto *eg = pairObj.first;
242 ATH_MSG_DEBUG("Default pid " << pid << " te " << isPassed);
244 ATH_MSG_DEBUG("Offline Electron with pidword " << pidword);
245 const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg);
246 pid=pidwordDec(*el);
247 ATH_MSG_DEBUG("Electron pid " << pid);
248 et = getEt(el)/Gaudi::Units::GeV;
249 if (el->pt() > 0) {
250 ptvarcone20rel = getIsolation_ptvarcone20(el)/el->pt();
251 ptvarcone30rel = getIsolation_ptvarcone30(el)/el->pt();
252 }
253 z0 = getTrack_z0(el);
254 d0 = getTrack_d0(el);
255 }
256 else et=eg->caloCluster()->et()/Gaudi::Units::GeV;
257
258 float eta = eg->caloCluster()->etaBE(2);
259 float phi = eg->phi();
260 float pt = eg->pt()/Gaudi::Units::GeV;
261 float avgmu=lbAverageInteractionsPerCrossing( ctx );
262 float npvtx=0.0;
263
264 ATH_MSG_DEBUG("PID decision efficiency " << pidwordDec(*eg));
265
266 if(pid){
267 et_vec.push_back( et );
268 pt_vec.push_back( pt );
269 highet_vec.push_back( et );
270
271 if(et > etthr+1.0){
272 eta_vec.push_back(eta);
273 phi_vec.push_back(phi);
274 avgmu_vec.push_back(avgmu);
275 npvtx_vec.push_back(npvtx);
276 ptvarcone20rel_vec.push_back(ptvarcone20rel);
277 ptvarcone30rel_vec.push_back(ptvarcone30rel);
278 z0_vec.push_back(z0);
279 d0_vec.push_back(d0);
280 }
281
282 if(abs(eta)<=0.8){
283 et_slice0_vec.push_back(et);
284 }else if( abs(eta) > 0.80 && abs(eta) <= 1.37 ){
285 et_slice1_vec.push_back(et);
286 }else if( abs(eta) > 1.37 && abs(eta) <= 1.54 ){
287 et_slice2_vec.push_back(et);
288 }else if( abs(eta) > 1.54 && abs(eta) <= 2.50 ){
289 et_slice3_vec.push_back(et);
290 }
291
292 if(isPassed) {
293 match_et_vec.push_back( et );
294 match_pt_vec.push_back( pt );
295 match_highet_vec.push_back( et );
296
297 if(et > etthr+1.0){
298 match_eta_vec.push_back(eta);
299 match_phi_vec.push_back(phi);
300 match_avgmu_vec.push_back(avgmu);
301 match_npvtx_vec.push_back(npvtx);
302 match_ptvarcone20rel_vec.push_back(ptvarcone20rel);
303 match_ptvarcone30rel_vec.push_back(ptvarcone30rel);
304 match_z0_vec.push_back(z0);
305 match_d0_vec.push_back(d0);
306 }
307
308 et_passed_vec.push_back( true );
309 et_failed_vec.push_back( false );
310 pt_passed_vec.push_back( true );
311 highet_passed_vec.push_back( true );
312 highet_failed_vec.push_back( false );
313
314 if(abs(eta)<=0.8){
315 et_slice0_passed_vec.push_back(true);
316 }else if( abs(eta) > 0.80 && abs(eta) <= 1.37 ){
317 et_slice1_passed_vec.push_back(true);
318 }else if( abs(eta) > 1.37 && abs(eta) <= 1.54 ){
319 et_slice2_passed_vec.push_back(true);
320 }else if( abs(eta) > 1.54 && abs(eta) <= 2.50 ){
321 et_slice3_passed_vec.push_back(true);
322 }
323
324 if(et > etthr+1.0){
325 eta_passed_vec.push_back( true );
326 eta_failed_vec.push_back( false );
327 phi_passed_vec.push_back( true );
328 avgmu_passed_vec.push_back( true );
329 npvtx_passed_vec.push_back( true );
330 ptvarcone20rel_passed_vec.push_back( true );
331 ptvarcone30rel_passed_vec.push_back( true );
332 z0_passed_vec.push_back( true );
333 d0_passed_vec.push_back( true );
334 }
335 } // Passes Trigger selection
336 else {
337
338 et_passed_vec.push_back( false );
339 et_failed_vec.push_back( true );
340 pt_passed_vec.push_back( false );
341 highet_passed_vec.push_back( false );
342 highet_failed_vec.push_back( true );
343
344 if(abs(eta)<=0.8){
345 et_slice0_passed_vec.push_back(false);
346 }else if( abs(eta) > 0.80 && abs(eta) <= 1.37 ){
347 et_slice1_passed_vec.push_back(false);
348 }else if( abs(eta) > 1.37 && abs(eta) <= 1.54 ){
349 et_slice2_passed_vec.push_back(false);
350 }else if( abs(eta) > 1.54 && abs(eta) <= 2.50 ){
351 et_slice3_passed_vec.push_back(false);
352 }
353
354 if(et > etthr+1.0){
355 eta_passed_vec.push_back( false );
356 eta_failed_vec.push_back( true );
357 phi_passed_vec.push_back( false );
358 avgmu_passed_vec.push_back( false );
359 npvtx_passed_vec.push_back( false );
360 ptvarcone20rel_passed_vec.push_back( false );
361 ptvarcone30rel_passed_vec.push_back( false );
362 z0_passed_vec.push_back( false );
363 d0_passed_vec.push_back( false );
364 }
365 } // Fails Trigger selection
366
367 } // Passes offline pid, fill histograms
368 iObj++;
369 }
370
371 fill( monGroup, et_col, highet_col, pt_col, eta_col, phi_col, avgmu_col, npvtx_col, ptvarcone20rel_col, ptvarcone30rel_col, z0_col, d0_col,
372 match_et_col, match_highet_col, match_pt_col, match_eta_col, match_phi_col, match_avgmu_col, match_npvtx_col, match_ptvarcone20rel_col, match_ptvarcone30rel_col,match_z0_col,match_d0_col,
373 et_passed_col, et_failed_col, highet_passed_col, highet_failed_col, pt_passed_col, eta_passed_col, eta_failed_col, phi_passed_col, avgmu_passed_col, npvtx_passed_col, ptvarcone20rel_passed_col, ptvarcone30rel_passed_col, z0_passed_col, d0_passed_col,
374 et_slice0_col,et_slice1_col,et_slice2_col,et_slice3_col,et_slice0_passed_col,et_slice1_passed_col,et_slice2_passed_col,et_slice3_passed_col);
375
376}
377// *********************************************************************************
378
380 const TrigInfo& info,
381 const std::vector< std::pair< const xAOD::Egamma *,
382 const TrigCompositeUtils::Decision* >>& pairObjs,
383 const std::vector< asg::AcceptData >& acceptObjs ) const
384{
385 auto monGroup = getGroup(info.trigger+"_Inefficiency");
386 unsigned iObj=0;
387 SG::Decorator<bool> pidwordDec("is"+pidword);
388 for( auto pairObj : pairObjs ){
389
390 bool pid=true;
391 bool isPassedL1Calo = acceptObjs[iObj].getCutResult( "L1Calo");
392 bool isPassedL2Calo = acceptObjs[iObj].getCutResult( "L2Calo");
393 bool isPassedL2 = acceptObjs[iObj].getCutResult( "L2" );
394 bool isPassedEFCalo = acceptObjs[iObj].getCutResult( "EFCalo");
395 bool isPassedHLT = acceptObjs[iObj].getCutResult( "HLT" );
396
397 const auto *eg = pairObj.first;
399 ATH_MSG_DEBUG("Offline Electron with pidword " << pidword);
400 const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg);
401 pid=pidwordDec(*el);
402 ATH_MSG_DEBUG("Electron pid " << pid);
403 }
404 if(pid){
405 if(!isPassedL1Calo){
406 fillLabel(monGroup, "InefficiencyCounts", "L1Calo" );
407 }if(!isPassedL2Calo){
408 fillLabel(monGroup, "InefficiencyCounts", "L2Calo" );
409 }if(!isPassedL2){
410 fillLabel(monGroup, "InefficiencyCounts", "L2" );
411 }if(!isPassedEFCalo){
412 fillLabel(monGroup, "InefficiencyCounts", "EFCalo" );
413 }if(!isPassedHLT){
414 fillLabel(monGroup, "InefficiencyCounts", "HLT" );
415 }
416 }
417 iObj++;
418 }
419}
420
421
422void TrigEgammaMonitorAnalysisAlgorithm::fillDistributions( const EventContext& ctx, const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs,
423 const TrigInfo& info ) const
424{
425
426 const std::string trigger = info.trigger;
427
428 unsigned int condition=TrigDefs::Physics;
429
430 // Offline
431 std::vector<const xAOD::Egamma*> eg_vec;
432 std::vector<const xAOD::Electron*> el_vec;
433 for( auto pairObj: pairObjs )
434 {
435 eg_vec.push_back(pairObj.first);
436 if( xAOD::EgammaHelpers::isElectron(pairObj.first)){
437 const xAOD::Electron* elOff = static_cast<const xAOD::Electron*> (pairObj.first);
438 el_vec.push_back(elOff);
439 }
440 }
441
442 // Offline
443 fillShowerShapes( trigger, eg_vec, false );
444 fillTracking( ctx, trigger, el_vec, false );
445
446 // L1Calo
447 {
448 // Fill L1 features
449 auto initRois = tdt()->features<TrigRoiDescriptorCollection>(trigger,condition,"",TrigDefs::allFeaturesOfType,"initialRoI");
450
451 if (info.L1Legacy){
452 std::vector<const xAOD::EmTauRoI*> l1_vec;
453 for( auto &initRoi: initRois ){
454 if( !initRoi.link.isValid() ) continue;
455 const auto *feat = match()->getL1Feature( initRoi.source );
456 if(feat) l1_vec.push_back(feat);
457 }
458 fillL1Calo( trigger, l1_vec );
459 }else{
460 std::vector<const xAOD::eFexEMRoI*> l1_vec;
461 for( auto &initRoi: initRois ){
462 if( !initRoi.link.isValid() ) continue;
463 const auto *feat = match()->getL1eEMFeature( initRoi.source );
464 if(feat) l1_vec.push_back(feat);
465 }
466 fillL1eEM( trigger, l1_vec );
467 }
468
469 }
470
471
472 // L2Calo
473 {
474 std::vector<const xAOD::TrigEMCluster*> emCluster_vec;
475 auto vec = tdt()->features<xAOD::TrigEMClusterContainer>(trigger,condition ,match()->key("FastCalo") );
476 for(auto &featLinkInfo : vec ){
477 if(! featLinkInfo.isValid() ) continue;
478 const auto *feat = *(featLinkInfo.link);
479 if(!feat) continue;
480 emCluster_vec.push_back(feat);
481 }
482 fillL2Calo( trigger, emCluster_vec );
483 }
484 // EFCalo
485 {
486 std::string key = match()->key("PrecisionCalo_Electron");
487 if(info.signature == "Photon") key = match()->key("PrecisionCalo_Photon");
488 if(info.lrt) key = match()->key("PrecisionCalo_LRT");
489 if(info.ion) key = match()->key("PrecisionCalo_HI");
490
491 std::vector<const xAOD::CaloCluster* > clus_vec;
492 auto vec = tdt()->features<xAOD::CaloClusterContainer>(trigger,condition,key);
493 for(auto &featLinkInfo : vec ){
494 if(! featLinkInfo.isValid() ) continue;
495 const auto *feat = *(featLinkInfo.link);
496 if(!feat) continue;
497 clus_vec.push_back(feat);
498 }
499 fillEFCalo( trigger, clus_vec );
500 }
501
502 if ( info.signature == "Electron" ){
503
504 // L2 Electron
505 {
506 std::string key = match()->key("FastElectrons");
507 if(info.lrt) key = match()->key("FastElectrons_LRT");
508
509 std::vector<const xAOD::TrigElectron*> el_vec;
510 // Get only passed objects
511 auto vec = tdt()->features<xAOD::TrigElectronContainer>(trigger,condition,key );
512 for( auto &featLinkInfo : vec ){
513 if(! featLinkInfo.isValid() ) continue;
514 const auto *feat = *(featLinkInfo.link);
515 if(!feat) continue;
516 el_vec.push_back(feat);
517 }
518 fillL2Electron( trigger, el_vec );
519 }
520 // HLT Electron
521 {
522 std::string key = match()->key("Electrons_GSF");
523 if(info.nogsf) key = match()->key("Electrons");
524 if(info.lrt) key = match()->key("Electrons_LRT");
525
526 std::vector<const xAOD::Electron*> el_vec;
527 std::vector<const xAOD::Egamma*> eg_vec;
528 auto vec = tdt()->features<xAOD::ElectronContainer>(trigger, condition ,key );
529 for( auto &featLinkInfo : vec ){
530 if(! featLinkInfo.isValid() ) continue;
531 const auto *feat = *(featLinkInfo.link);
532 if(!feat) continue;
533 el_vec.push_back(feat);
534 eg_vec.push_back(feat);
535 }
536 fillShowerShapes( trigger, eg_vec, true );
537 fillTracking( ctx, trigger, el_vec, true );
538 }
539 }else if ( info.signature == "Photon"){
540 // Fast Photon
541 {
542 std::string key = match()->key("FastPhotons");
543 std::vector<const xAOD::TrigPhoton*> ph_vec;
544 // Get only passed objects
545 auto vec = tdt()->features<xAOD::TrigPhotonContainer>(trigger,condition,key );
546 for( auto &featLinkInfo : vec ){
547 if(! featLinkInfo.isValid() ) continue;
548 const auto *feat = *(featLinkInfo.link);
549 if(!feat) continue;
550 ph_vec.push_back(feat);
551 }
552 fillL2Photon( trigger, ph_vec );
553 }
554
555 // HLT Photon
556 {
557 std::vector<const xAOD::Egamma*> ph_vec;
558 auto vec = tdt()->features<xAOD::PhotonContainer>(trigger,condition ,match()->key("Photons") );
559 for( auto &featLinkInfo : vec ){
560 if(! featLinkInfo.isValid() ) continue;
561 const auto *feat = *(featLinkInfo.link);
562 if(!feat) continue;
563 ph_vec.push_back(feat);
564 }
565 fillShowerShapes( trigger, ph_vec, true );
566 }
567 }else{
568 ATH_MSG_INFO( "Chain type not specified" );
569 }
570
571}
572
573
574
575
576
577void TrigEgammaMonitorAnalysisAlgorithm::fillL1Calo( const std::string &trigger, const std::vector< const xAOD::EmTauRoI* >& l1_vec ) const
578{
579 auto monGroup = getGroup(trigger+"_Distributions_L1Calo");
580
581 std::vector<float> eta_vec, phi_vec, energy_vec, roi_et_vec, emIso_vec, hadCore_vec;
582
583 auto eta_col = Monitored::Collection( "eta" , eta_vec );
584 auto phi_col = Monitored::Collection( "phi" , phi_vec );
585 auto energy_col = Monitored::Collection( "energy" , energy_vec );
586 auto roi_et_col = Monitored::Collection( "roi_et" , roi_et_vec );
587 auto emIso_col = Monitored::Collection( "emIso" , emIso_vec );
588 auto hadCore_col = Monitored::Collection( "hadCore" , hadCore_vec );
589
590 for( const auto *l1 : l1_vec )
591 {
592 if(!l1) continue;
593 eta_vec.push_back( l1->eta() );
594 phi_vec.push_back( l1->phi() );
595 energy_vec.push_back( l1->emClus()/Gaudi::Units::GeV );
596 roi_et_vec.push_back( l1->eT()/Gaudi::Units::GeV );
597 emIso_vec.push_back( l1->emIsol()/Gaudi::Units::GeV );
598 hadCore_vec.push_back( l1->hadCore()/Gaudi::Units::GeV );
599 }
600
601 fill( monGroup, eta_col, phi_col, energy_col, roi_et_col, emIso_col, hadCore_col );
602
603}
604
605
606void TrigEgammaMonitorAnalysisAlgorithm::fillL1eEM( const std::string &trigger, const std::vector< const xAOD::eFexEMRoI* >& l1_vec ) const
607{
608 auto monGroup = getGroup(trigger+"_Distributions_L1Calo");
609
610 std::vector<float> eta_vec, phi_vec, et_vec, wstot_vec, reta_vec, rhad_vec;
611
612 auto et_col = Monitored::Collection( "et" , et_vec );
613 auto eta_col = Monitored::Collection( "eta" , eta_vec );
614 auto phi_col = Monitored::Collection( "phi" , phi_vec );
615 auto wstot_col = Monitored::Collection( "Wstot" , wstot_vec );
616 auto reta_col = Monitored::Collection( "Reta" , reta_vec );
617 auto rhad_col = Monitored::Collection( "Rhad" , rhad_vec );
618
619
620 for( const auto *l1 : l1_vec )
621 {
622 if(!l1) continue;
623 et_vec.push_back( l1->et()/Gaudi::Units::GeV );
624 eta_vec.push_back( l1->eta() );
625 phi_vec.push_back( l1->phi() );
626 wstot_vec.push_back( l1->Wstot() );
627 reta_vec.push_back( l1->Reta() );
628 rhad_vec.push_back( l1->Rhad() );
629 }
630
631 fill( monGroup, eta_col, phi_col, et_col, wstot_col, reta_col, rhad_col );
632
633}
634
635
636
637void TrigEgammaMonitorAnalysisAlgorithm::fillL2Calo(const std::string &trigger, const std::vector< const xAOD::TrigEMCluster *>& emCluster_vec) const
638{
639 auto monGroup = getGroup(trigger+"_Distributions_L2Calo");
640
641 std::vector<float> et_vec,highet_vec, eta_vec, phi_vec;
642
643 auto et_col = Monitored::Collection("et" , et_vec );
644 auto highet_col = Monitored::Collection("highet" , highet_vec );
645 auto eta_col = Monitored::Collection("eta", eta_vec );
646 auto phi_col = Monitored::Collection("phi", phi_vec );
647
648 for ( const auto *emCluster : emCluster_vec )
649 {
650 if(!emCluster) continue;
651 et_vec.push_back( emCluster->et()/Gaudi::Units::GeV );
652 highet_vec.push_back( emCluster->et()/Gaudi::Units::GeV );
653 eta_vec.push_back( emCluster->eta() );
654 phi_vec.push_back( emCluster->phi() );
655 }
656
657 fill( monGroup, et_col, eta_col, phi_col, highet_col );
658
659
660}
661
662
663
664void TrigEgammaMonitorAnalysisAlgorithm::fillL2Electron(const std::string &trigger, const std::vector< const xAOD::TrigElectron* >& el_vec) const
665{
666
667 auto monGroup = getGroup(trigger+"_Distributions_L2Electron");
668
669 std::vector<float> et_vec, eta_vec, phi_vec, highet_vec;
670
671 auto et_col = Monitored::Collection("et" , et_vec );
672 auto highet_col = Monitored::Collection("highet" , highet_vec );
673 auto eta_col = Monitored::Collection("eta", eta_vec );
674 auto phi_col = Monitored::Collection("phi", phi_vec );
675
676 for ( const auto *el : el_vec )
677 {
678 if(!el) continue;
679 et_vec.push_back( el->pt()/Gaudi::Units::GeV );
680 highet_vec.push_back( el->pt()/Gaudi::Units::GeV );
681 eta_vec.push_back( el->eta() );
682 phi_vec.push_back( el->phi() );
683 }
684
685 fill( monGroup, et_col, eta_col, phi_col, highet_col );
686}
687
688void TrigEgammaMonitorAnalysisAlgorithm::fillL2Photon(const std::string &trigger, const std::vector< const xAOD::TrigPhoton* >& ph_vec) const
689{
690
691 auto monGroup = getGroup(trigger+"_Distributions_L2Photon");
692
693 std::vector<float> et_vec, eta_vec, phi_vec, highet_vec;
694
695 auto et_col = Monitored::Collection("et" , et_vec );
696 auto highet_col = Monitored::Collection("highet" , highet_vec );
697 auto eta_col = Monitored::Collection("eta", eta_vec );
698 auto phi_col = Monitored::Collection("phi", phi_vec );
699
700 for ( const auto *ph : ph_vec )
701 {
702 if(!ph) continue;
703 et_vec.push_back( ph->pt()/Gaudi::Units::GeV );
704 highet_vec.push_back( ph->pt()/Gaudi::Units::GeV );
705 eta_vec.push_back( ph->eta() );
706 phi_vec.push_back( ph->phi() );
707 }
708
709 fill( monGroup, et_col, eta_col, phi_col, highet_col );
710}
711
712
713void TrigEgammaMonitorAnalysisAlgorithm::fillEFCalo(const std::string &trigger, const std::vector< const xAOD::CaloCluster*>& clus_vec) const
714{
715
716 auto monGroup = getGroup( trigger + "_Distributions_EFCalo" );
717
718
719 std::vector<float> energyBE0_vec, energyBE1_vec, energyBE2_vec, energyBE3_vec,
720 energy_vec, et_vec, eta_vec, phi_vec, eta_calo_vec, phi_calo_vec, highet_vec;
721
722
723
724 auto energyBE0_col = Monitored::Collection("energyBE0", energyBE0_vec);
725 auto energyBE1_col = Monitored::Collection("energyBE1", energyBE1_vec);
726 auto energyBE2_col = Monitored::Collection("energyBE2", energyBE2_vec);
727 auto energyBE3_col = Monitored::Collection("energyBE3", energyBE3_vec);
728 auto energy_col = Monitored::Collection("energy" , energy_vec );
729 auto et_col = Monitored::Collection("et" , et_vec );
730 auto highet_col = Monitored::Collection("highet" , highet_vec );
731 auto eta_col = Monitored::Collection("eta" , eta_vec );
732 auto phi_col = Monitored::Collection("phi" , phi_vec );
733 auto eta_calo_col = Monitored::Collection("eta_calo" , eta_calo_vec );
734 auto phi_calo_col = Monitored::Collection("phi_calo" , phi_calo_vec );
735
736 for ( const auto *clus : clus_vec )
737 {
738 double tmpeta = -999.;
739 if(!clus->retrieveMoment(xAOD::CaloCluster::ETACALOFRAME,tmpeta))
740 tmpeta=-999.;
741 double tmpphi = -999.;
742 if(!clus->retrieveMoment(xAOD::CaloCluster::PHICALOFRAME,tmpphi))
743 tmpphi=-999.;
744
745 energyBE0_vec.push_back( clus->energyBE(0)/Gaudi::Units::GeV );
746 energyBE1_vec.push_back( clus->energyBE(1)/Gaudi::Units::GeV );
747 energyBE2_vec.push_back( clus->energyBE(2)/Gaudi::Units::GeV );
748 energyBE3_vec.push_back( clus->energyBE(3)/Gaudi::Units::GeV );
749 energy_vec.push_back( clus->e()/Gaudi::Units::GeV );
750 et_vec.push_back( clus->et()/Gaudi::Units::GeV );
751 highet_vec.push_back( clus->et()/Gaudi::Units::GeV );
752 eta_vec.push_back( clus->eta() );
753 phi_vec.push_back( clus->phi() );
754 eta_calo_vec.push_back( tmpeta );
755 phi_calo_vec.push_back( tmpphi );
756
757 }
758
759
760 fill( monGroup, energyBE0_col, energyBE1_col, energyBE2_col, energyBE3_col,
761 energy_col, et_col, eta_col, phi_col, eta_calo_col, phi_calo_col, highet_col);
762}
763
764
765
766
767
768void TrigEgammaMonitorAnalysisAlgorithm::fillShowerShapes(const std::string &trigger, const std::vector<const xAOD::Egamma*>& eg_vec , bool online) const
769{
770
771 ATH_MSG_DEBUG("Fill SS distributions: " << trigger);
772 auto monGroup = getGroup( trigger + ( online ? "_Distributions_HLT" : "_Distributions_Offline") );
773
774 std::vector<float> Rhad_vec, Rhad1_vec, Reta_vec, Rphi_vec, weta1_vec, weta2_vec,
775 f1_vec, f3_vec, eratio_vec, et_vec, highet_vec , eta_vec, phi_vec, topoetcone20_vec, topoetcone40_shift_vec,
776 topoetcone20_rel_vec, topoetcone40_shift_rel_vec;
777
778
779 auto Rhad_col = Monitored::Collection("Rhad" , Rhad_vec );
780 auto Rhad1_col = Monitored::Collection("Rhad1" , Rhad1_vec );
781 auto Reta_col = Monitored::Collection("Reta" , Reta_vec );
782 auto Rphi_col = Monitored::Collection("Rphi" , Rphi_vec );
783 auto weta1_col = Monitored::Collection("weta1" , weta1_vec );
784 auto weta2_col = Monitored::Collection("weta2" , weta2_vec );
785 auto f1_col = Monitored::Collection("f1" , f1_vec );
786 auto f3_col = Monitored::Collection("f3" , f3_vec );
787 auto eratio_col = Monitored::Collection("eratio" , eratio_vec );
788 auto et_col = Monitored::Collection("et" , et_vec );
789 auto highet_col = Monitored::Collection("highet" , highet_vec );
790 auto eta_col = Monitored::Collection("eta" , eta_vec );
791 auto phi_col = Monitored::Collection("phi" , phi_vec );
792 auto topoetcone20_col = Monitored::Collection("topoetcone20", topoetcone20_vec);
793 auto topoetcone40_shift_col = Monitored::Collection("topoetcone40_shift", topoetcone40_shift_vec );
794 auto topoetcone20_rel_col = Monitored::Collection("topoetcone20_rel", topoetcone20_rel_vec);
795 auto topoetcone40_shift_rel_col = Monitored::Collection("topoetcone40_shift_rel", topoetcone40_shift_rel_vec );
796
797 for ( const auto *eg : eg_vec ){
798
799 if(!eg) continue;
800
801 Rhad_vec.push_back( getShowerShape_Rhad(eg));
802 Rhad1_vec.push_back( getShowerShape_Rhad(eg));
803 Reta_vec.push_back( getShowerShape_Reta(eg));
804 Rphi_vec.push_back( getShowerShape_Rphi(eg));
805 weta1_vec.push_back( getShowerShape_weta1(eg));
806 weta2_vec.push_back( getShowerShape_weta2(eg));
807 f1_vec.push_back( getShowerShape_f1(eg));
808 f3_vec.push_back( getShowerShape_f3(eg));
809 eratio_vec.push_back( getShowerShape_Eratio(eg));
810 et_vec.push_back( eg->pt()/Gaudi::Units::GeV);
811 highet_vec.push_back( eg->pt()/Gaudi::Units::GeV);
812 eta_vec.push_back( eg->eta());
813 phi_vec.push_back( eg->phi());
814 topoetcone20_vec.push_back( getIsolation_topoetcone20(eg)/Gaudi::Units::GeV);
815 topoetcone40_shift_vec.push_back( (getIsolation_topoetcone40(eg)-2450)/Gaudi::Units::GeV );
816
817 if (eg->pt() > 0) {
818 topoetcone20_rel_vec.push_back( getIsolation_topoetcone20(eg)/eg->pt());
819 topoetcone40_shift_rel_vec.push_back( (getIsolation_topoetcone40(eg)-2450)/eg->pt() );
820 }
821
822 }// Loop over egamma objects
823
824 fill( monGroup, Rhad_col, Rhad1_col, Reta_col, Rphi_col, weta1_col, weta2_col,
825 f1_col, f3_col, eratio_col, et_col, highet_col , eta_col, phi_col, topoetcone20_col, topoetcone40_shift_col,
826 topoetcone20_rel_col, topoetcone40_shift_rel_col );
827
828}
829
830
831void TrigEgammaMonitorAnalysisAlgorithm::fillTracking(const EventContext& ctx, const std::string &trigger, const std::vector< const xAOD::Electron *>& eg_vec, bool online ) const
832{
833
834 ATH_MSG_DEBUG("Fill tracking");
835
836 auto monGroup = getGroup( trigger + ( online ? "_Distributions_HLT" : "_Distributions_Offline") );
837
838 std::vector<float> deta1_vec, deta1_EMECA_vec, deta1_EMECC_vec, deta1_EMEBA_vec, deta1_EMEBC_vec, deta2_vec, dphi2_vec,
839 dphiresc_vec, eprobht_vec, npixhits_vec, nscthits_vec, charge_vec, ptcone20_vec, ptvarcone20_vec, ptcone30_vec, ptvarcone30_vec, z0_vec, d0_vec, d0sig_vec,
840 pt_vec,pt_trk_vec, ptcone20_rel_vec, ptvarcone20_rel_vec, ptcone30_rel_vec, ptvarcone30_rel_vec, eta_vec, mu_vec;
841
842 auto deta1_col = Monitored::Collection( "deta1" , deta1_vec );
843 auto deta1_EMECA_col = Monitored::Collection( "deta1_EMECA" , deta1_EMECA_vec );
844 auto deta1_EMECC_col = Monitored::Collection( "deta1_EMECC" , deta1_EMECC_vec );
845 auto deta1_EMEBA_col = Monitored::Collection( "deta1_EMEBA" , deta1_EMEBA_vec );
846 auto deta1_EMEBC_col = Monitored::Collection( "deta1_EMEBC" , deta1_EMEBC_vec );
847 auto deta2_col = Monitored::Collection( "deta2" , deta2_vec );
848 auto dphi2_col = Monitored::Collection( "dphi2" , dphi2_vec );
849 auto dphiresc_col = Monitored::Collection( "dphiresc" , dphiresc_vec );
850 auto eprobht_col = Monitored::Collection( "eprobht" , eprobht_vec );
851 auto npixhits_col = Monitored::Collection( "npixhits" , npixhits_vec );
852 auto nscthits_col = Monitored::Collection( "nscthits" , nscthits_vec );
853 auto charge_col = Monitored::Collection( "charge" , charge_vec );
854 auto ptcone20_col = Monitored::Collection( "ptcone20" , ptcone20_vec );
855 auto ptvarcone20_col = Monitored::Collection( "ptvarcone20" , ptvarcone20_vec );
856 auto ptcone30_col = Monitored::Collection( "ptcone30" , ptcone30_vec );
857 auto ptvarcone30_col = Monitored::Collection( "ptvarcone30" , ptvarcone30_vec );
858 auto z0_col = Monitored::Collection( "z0" , z0_vec );
859 auto d0_col = Monitored::Collection( "d0" , d0_vec );
860 auto d0sig_col = Monitored::Collection( "d0sig" , d0sig_vec );
861 auto pt_col = Monitored::Collection( "pt" , pt_vec );
862 auto pt_trk_col = Monitored::Collection( "pt_track" , pt_trk_vec );
863 auto ptcone20_rel_col = Monitored::Collection( "ptcone20_rel", ptcone20_rel_vec );
864 auto ptvarcone20_rel_col = Monitored::Collection( "ptvarcone20_rel" , ptvarcone20_rel_vec );
865 auto ptcone30_rel_col = Monitored::Collection( "ptcone30_rel", ptcone30_rel_vec );
866 auto ptvarcone30_rel_col = Monitored::Collection( "ptvarcone30_rel" , ptvarcone30_rel_vec );
867
868 auto eta_col = Monitored::Collection( "eta" , eta_vec );
869 auto mu_col = Monitored::Collection( "mu" , mu_vec );
870
871
872 for ( const auto *eg : eg_vec ){
873
874 if(!eg) continue;
875
876 float cleta = 0.;
877 if(eg->caloCluster()) cleta=eg->caloCluster()->eta();
878 else cleta=eg->eta();
879
880 deta1_vec.push_back( getCaloTrackMatch_deltaEta1(eg));
881
882 if(cleta > 1.375 && cleta < 3.2)
883 deta1_EMECA_vec.push_back( getCaloTrackMatch_deltaEta1(eg));
884 if(cleta < -1.375 && cleta > -3.2)
885 deta1_EMECC_vec.push_back( getCaloTrackMatch_deltaEta1(eg));
886 if(cleta > 0 && cleta < 1.375)
887 deta1_EMEBA_vec.push_back( getCaloTrackMatch_deltaEta1(eg));
888 if(cleta < 0 && cleta > -1.375)
889 deta1_EMEBC_vec.push_back( getCaloTrackMatch_deltaEta1(eg));
890
891 deta2_vec.push_back( getCaloTrackMatch_deltaEta2(eg));
892 dphi2_vec.push_back( getCaloTrackMatch_deltaPhi2(eg));
893 dphiresc_vec.push_back( getCaloTrackMatch_deltaPhiRescaled2(eg));
894 eprobht_vec.push_back( getTrackSummaryFloat_eProbabilityHT(eg));
895 npixhits_vec.push_back( getTrackSummary_numberOfPixelHits(eg));
896 nscthits_vec.push_back( getTrackSummary_numberOfSCTHits(eg));
897 charge_vec.push_back( eg->charge());
898 ptcone20_vec.push_back( getIsolation_ptcone20(eg)/Gaudi::Units::GeV);
899 ptvarcone20_vec.push_back( getIsolation_ptvarcone20(eg)/Gaudi::Units::GeV);
900 ptcone30_vec.push_back( getIsolation_ptcone30(eg)/Gaudi::Units::GeV);
901 ptvarcone30_vec.push_back( getIsolation_ptvarcone30(eg)/Gaudi::Units::GeV);
902
903 // Quantities directly from tracks
904 ATH_MSG_DEBUG("Get track Quantities");
905 z0_vec.push_back( getTrack_z0(eg));
906 d0_vec.push_back( getTrack_d0(eg));
907 d0sig_vec.push_back(getD0sig(eg));
908 pt_vec.push_back( eg->pt()/Gaudi::Units::GeV);
909 pt_trk_vec.push_back( getTrack_pt(eg)/Gaudi::Units::GeV);
910 eta_vec.push_back(eg->eta());
911
912 const float avgmu=lbAverageInteractionsPerCrossing( ctx );
913 mu_vec.push_back( avgmu );
914
915 if (eg->pt() > 0) {
916 ptcone20_rel_vec.push_back( getIsolation_ptcone20(eg)/eg->pt());
917 ptvarcone20_rel_vec.push_back( getIsolation_ptvarcone20(eg)/eg->pt());
918 ptcone30_rel_vec.push_back( getIsolation_ptcone30(eg)/eg->pt());
919 ptvarcone30_rel_vec.push_back( getIsolation_ptvarcone30(eg)/eg->pt());
920 }
921
922 }
923
924
925 fill( monGroup, deta1_col, deta1_EMECA_col, deta1_EMECC_col, deta1_EMEBA_col, deta1_EMEBC_col, deta2_col, dphi2_col,
926 dphiresc_col, eprobht_col, npixhits_col, nscthits_col, charge_col, ptcone20_col, ptvarcone20_col, ptcone30_col, ptvarcone30_col, z0_col, d0_col, d0sig_col,
927 pt_col, ptcone20_rel_col, ptvarcone20_rel_col, ptcone30_rel_col, ptvarcone30_rel_col, eta_col, mu_col,pt_trk_col);
928}
929
930
931
933//
934//
935
936
938 const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs,
939 const TrigInfo& info ) const
940{
941
942 std::vector< std::pair< const xAOD::Egamma*, const xAOD::EmTauRoI * >> pair_l1_vec;
943 std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >> pair_eg_vec;
944 const std::string trigger = info.trigger;
945
946 SG::Decorator<bool> pidnameDec("is"+info.pidname);
947 for( auto pairObj : pairObjs ){
948
949 const xAOD::Egamma* eg = pairObj.first;
950 const auto *feat = pairObj.second;
951
952 if (feat){
953
954 //
955 // Get only off and l1 where the offline object passed by the offline pid selector
956 //
957 const auto *l1 = match()->getL1Feature( feat );
958 if(eg->type()==xAOD::Type::Electron){
959 const xAOD::Electron* el = static_cast<const xAOD::Electron*>(eg);
960 float et = getEt(el)/Gaudi::Units::GeV;
961 if( et < info.etthr-5.0) continue;
962 if(!pidnameDec(*eg)) continue;
963 pair_eg_vec.emplace_back(el,feat);
964 if(l1) pair_l1_vec.emplace_back(eg,l1 );
965 }
966 else if(eg->type()==xAOD::Type::Photon){
967 float et = getCluster_et(eg)/Gaudi::Units::GeV;
968 if( et < info.etthr-5.0) continue;
969 pair_eg_vec.emplace_back(eg,feat);
970 if(l1) pair_l1_vec.emplace_back(eg,l1 );
971 }
972 }
973
974 }
975
976 // Fill L1Calo for all level 1 objects found
977 fillL1CaloResolution( trigger, pair_l1_vec );
978 fillL1CaloAbsResolution( trigger, pair_l1_vec );
979 fillL2CaloResolution( trigger, pair_eg_vec );
980
981 // Fill HLT electron for all onl objects found
982 if ( info.signature=="Electron"){
983 fillHLTElectronResolution( ctx, trigger, pair_eg_vec, info );
984 }
985 else if ( info.signature=="Photon"){
986 fillHLTPhotonResolution( ctx, trigger, pair_eg_vec, info );
987 }
988
989}
990
991
992
993
995 const std::vector< std::pair< const xAOD::Egamma*, const xAOD::EmTauRoI * >>& pairObjs ) const
996{
997 auto monGroup = getGroup( trigger + "_Resolutions_L1Calo" );
998
999 std::vector<float> eta_vec, res_et_vec;
1000
1001 auto eta_col = Monitored::Collection( "eta" , eta_vec );
1002 auto res_et_col = Monitored::Collection( "res_et" , res_et_vec );
1003
1004
1005 for (const auto & pairObj : pairObjs){
1006 const auto *off = pairObj.first;
1007 const auto *l1 = pairObj.second;
1008 ATH_MSG_DEBUG("Fill L1CaloResolution");
1009 if(off->type()==xAOD::Type::Electron){
1010 const xAOD::Electron* eloff =static_cast<const xAOD::Electron*> (off);
1011 eta_vec.push_back( l1->eta() );
1012 res_et_vec.push_back( (l1->emClus()-getEt(eloff))/getEt(eloff) ) ;
1013
1014 }
1015 }
1016
1017 fill( monGroup, eta_col, res_et_col );
1018}
1019
1020
1021
1022
1023
1025 const std::vector< std::pair< const xAOD::Egamma*, const xAOD::EmTauRoI * >>& pairObjs ) const
1026{
1027 auto monGroup = getGroup( trigger + "_AbsResolutions_L1Calo" );
1028
1029 std::vector<float> eta_vec, res_et_vec;
1030
1031 auto eta_col = Monitored::Collection( "eta" , eta_vec );
1032 auto res_et_col = Monitored::Collection( "res_et" , res_et_vec );
1033
1034
1035 for (const auto & pairObj : pairObjs){
1036 const auto *off = pairObj.first;
1037 const auto *l1 = pairObj.second;
1038 ATH_MSG_DEBUG("Fill L1CaloAbsResolution");
1039 if(off->type()==xAOD::Type::Electron){
1040 const xAOD::Electron* eloff =static_cast<const xAOD::Electron*> (off);
1041 eta_vec.push_back( l1->eta() );
1042 res_et_vec.push_back( (l1->emClus()-getEt(eloff))/Gaudi::Units::GeV ) ;
1043 }
1044 }
1045
1046 fill( monGroup, eta_col, res_et_col );
1047}
1048
1049
1050
1051
1052void TrigEgammaMonitorAnalysisAlgorithm::fillHLTElectronResolution(const EventContext& ctx, const std::string &trigger,
1053 const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs,
1054 const TrigInfo& info) const
1055{
1056
1057 auto monGroup = getGroup( trigger + "_Resolutions_HLT" );
1058
1059 std::vector<float> res_pt_vec, res_et_vec, res_phi_vec, res_eta_vec, res_deta1_vec, res_deta2_vec, res_dphi2_vec, res_dphiresc_vec,
1060 res_z0_vec, res_d0_vec, res_d0sig_vec, res_eprobht_vec, res_npixhits_vec, res_nscthits_vec, res_Rhad_vec, res_Rhad1_vec, res_Reta_vec,
1061 res_Rphi_vec, res_weta1_vec, res_weta2_vec, res_wtots1_vec, res_f1_vec, res_f3_vec, res_eratio_vec, res_ethad_vec, res_ethad1_vec,
1062 et_vec, eta_vec, mu_vec;
1063 std::vector<float> res_ptcone20_vec, res_ptcone20_rel_vec, res_ptvarcone20_vec, res_ptvarcone20_rel_vec;
1064 std::vector<float> res_etInEta0_vec, res_etInEta1_vec, res_etInEta2_vec, res_etInEta3_vec;
1065
1066
1067 auto et_col = Monitored::Collection( "et" , et_vec );
1068 auto eta_col = Monitored::Collection( "eta" , eta_vec );
1069 auto mu_col = Monitored::Collection( "mu" , mu_vec );
1070
1071 // For calo
1072 auto res_et_col = Monitored::Collection( "res_et" , res_et_vec );
1073 auto res_eta_col = Monitored::Collection( "res_eta" , res_eta_vec );
1074 auto res_phi_col = Monitored::Collection( "res_phi" , res_phi_vec );
1075 auto res_ethad_col = Monitored::Collection( "res_ethad" , res_ethad_vec );
1076 auto res_ethad1_col = Monitored::Collection( "res_ethad1" , res_ethad1_vec );
1077 auto res_Rhad_col = Monitored::Collection( "res_Rhad" , res_Rhad_vec );
1078 auto res_Rhad1_col = Monitored::Collection( "res_Rhad1" , res_Rhad1_vec );
1079 auto res_Reta_col = Monitored::Collection( "res_Reta" , res_Reta_vec );
1080 auto res_Rphi_col = Monitored::Collection( "res_Rphi" , res_Rphi_vec );
1081 auto res_weta1_col = Monitored::Collection( "res_weta1" , res_weta1_vec );
1082 auto res_weta2_col = Monitored::Collection( "res_weta2" , res_weta2_vec );
1083 auto res_wtots1_col = Monitored::Collection( "res_wtots1" , res_wtots1_vec );
1084 auto res_f1_col = Monitored::Collection( "res_f1" , res_f1_vec );
1085 auto res_f3_col = Monitored::Collection( "res_f3" , res_f3_vec );
1086 auto res_eratio_col = Monitored::Collection( "res_eratio" , res_eratio_vec );
1087
1088 auto res_etInEta0_col = Monitored::Collection( "res_etInEta0" , res_etInEta0_vec );
1089 auto res_etInEta1_col = Monitored::Collection( "res_etInEta1" , res_etInEta1_vec );
1090 auto res_etInEta2_col = Monitored::Collection( "res_etInEta2" , res_etInEta2_vec );
1091 auto res_etInEta3_col = Monitored::Collection( "res_etInEta3" , res_etInEta3_vec );
1092
1093 // For electron
1094 auto res_pt_col = Monitored::Collection( "res_pt" , res_pt_vec );
1095 auto res_deta1_col = Monitored::Collection( "res_deta1" , res_deta1_vec );
1096 auto res_deta2_col = Monitored::Collection( "res_deta2" , res_deta2_vec );
1097 auto res_dphi2_col = Monitored::Collection( "res_dphi2" , res_dphi2_vec );
1098 auto res_dphiresc_col = Monitored::Collection( "res_dphiresc" , res_dphiresc_vec );
1099 auto res_z0_col = Monitored::Collection( "res_z0" , res_z0_vec );
1100 auto res_d0_col = Monitored::Collection( "res_d0" , res_d0_vec );
1101 auto res_d0sig_col = Monitored::Collection( "res_d0sig" , res_d0sig_vec );
1102 auto res_eprobht_col = Monitored::Collection( "res_eprobht" , res_eprobht_vec );
1103 auto res_npixhits_col = Monitored::Collection( "res_npixhits" , res_npixhits_vec );
1104 auto res_nscthits_col = Monitored::Collection( "res_nscthits" , res_nscthits_vec );
1105 auto res_ptcone20_col = Monitored::Collection( "res_ptcone20" , res_ptcone20_vec );
1106 auto res_ptcone20_rel_col = Monitored::Collection( "res_ptcone20_rel" , res_ptcone20_rel_vec );
1107 auto res_ptvarcone20_col = Monitored::Collection( "res_ptvarcone20" , res_ptvarcone20_vec );
1108 auto res_ptvarcone20_rel_col = Monitored::Collection( "res_ptvarcone20_rel" , res_ptvarcone20_rel_vec );
1109
1110
1111
1112
1113 // Check for zero before filling
1114 ATH_MSG_DEBUG("Fill Resolution");
1115
1116 std::string key = match()->key("Electrons_GSF");
1117 if(info.nogsf) key = match()->key("Electrons");
1118 if(info.lrt) key = match()->key("Electrons_LRT");
1119
1120 for ( const auto & pairObj : pairObjs ){
1121
1122 const xAOD::Electron *off = static_cast<const xAOD::Electron*>(pairObj.first);
1123 const xAOD::Electron *onl=nullptr;
1124
1125
1126 { // Get the closest electron object from the trigger starting with deltaR = 0.15
1127 float maxDeltaR=0.05;
1128 auto vec = tdt()->features<xAOD::ElectronContainer>(trigger,TrigDefs::Physics ,key );
1129 for(auto &featLinkInfo : vec ){
1130 if(! featLinkInfo.isValid() ) continue;
1131 const auto *feat = *(featLinkInfo.link);
1132 if(!feat) continue;
1133 float deltaR = dR( off->eta(), off->phi(), feat->eta(), feat->phi() );
1134 if( deltaR < maxDeltaR){
1135 maxDeltaR=deltaR;
1136 onl=feat;
1137 }
1138 }
1139 }
1140
1141 if(!onl) continue;
1142
1143 float val_off=0.;
1144 const float onl_eta=onl->eta();
1145 const float feta = abs(onl_eta);
1146 const float onl_et = getEt(onl)/Gaudi::Units::GeV;
1147 const float avgmu=lbAverageInteractionsPerCrossing( ctx );
1148 const float dummy=-999;
1149
1150 eta_vec.push_back( onl_eta );
1151 et_vec.push_back( onl_et );
1152 mu_vec.push_back( avgmu );
1153
1154 val_off=getTrack_pt(off);
1155 if(val_off!=0.){
1156 res_pt_vec.push_back( (getTrack_pt(off)-val_off)/val_off );
1157 }else{
1158 }
1159
1160
1161 val_off=getEt(off);
1162 if(val_off!=0.){
1163 res_et_vec.push_back( (getEt(onl)-val_off)/val_off );
1164 if( feta < 1.37 )
1165 res_etInEta0_vec.push_back((getEt(onl)-val_off)/val_off);
1166 else if( feta >=1.37 && feta <= 1.52 )
1167 res_etInEta1_vec.push_back((getEt(onl)-val_off)/val_off);
1168 else if( feta >= 1.55 && feta < 1.8 )
1169 res_etInEta2_vec.push_back((getEt(onl)-val_off)/val_off);
1170 else if( feta >= 1.8 && feta < 2.45 )
1171 res_etInEta3_vec.push_back((getEt(onl)-val_off)/val_off);
1172 }
1173
1174 val_off=off->eta();
1175 if(val_off!=0.){
1176 res_eta_vec.push_back( (onl_eta-val_off)/val_off );
1177 }else{
1178 res_eta_vec.push_back( dummy );
1179 }
1180
1181 val_off=off->phi();
1182 if(val_off!=0.){
1183 res_phi_vec.push_back( (onl->phi()-val_off)/val_off );
1184 }else{
1185 res_phi_vec.push_back(dummy );
1186 }
1187
1188 val_off=getShowerShape_ethad(off);
1189 if(val_off!=0.) {
1190 res_ethad_vec.push_back((getShowerShape_ethad(onl)-val_off)/val_off);
1191 }else{
1192 res_ethad_vec.push_back( dummy );
1193 }
1194
1195 val_off=getShowerShape_ethad1(off);
1196 if(val_off!=0){
1197 res_ethad1_vec.push_back((getShowerShape_ethad1(onl)-val_off)/val_off);
1198 }else{
1199 res_ethad1_vec.push_back( dummy);
1200 }
1201
1202 val_off=getShowerShape_Rhad(off);
1203 if(val_off!=0.){
1204 res_Rhad_vec.push_back( (getShowerShape_Rhad(onl)-val_off)/val_off );
1205 }else{
1206 res_Rhad_vec.push_back( dummy );
1207 }
1208
1209 val_off=getShowerShape_Rhad1(off);
1210 if(val_off!=0.){
1211 res_Rhad1_vec.push_back( (getShowerShape_Rhad1(onl)-val_off)/val_off );
1212 }else{
1213 res_Rhad1_vec.push_back( dummy );
1214 }
1215
1216 val_off=getShowerShape_Reta(off);
1217 if(val_off!=0.){
1218 res_Reta_vec.push_back( (getShowerShape_Reta(onl)-val_off)/val_off );
1219 }else{
1220 res_Reta_vec.push_back( dummy );
1221 }
1222
1223 val_off=getShowerShape_Rphi(off);
1224 if(val_off!=0.){
1225 res_Rphi_vec.push_back( (getShowerShape_Rphi(onl)-val_off)/val_off );
1226 }else{
1227 res_Rphi_vec.push_back( (getShowerShape_Rphi(onl)-val_off)/val_off );
1228 }
1229
1230 val_off=getShowerShape_weta1(off);
1231 if(val_off!=0.){
1232 res_weta1_vec.push_back( (getShowerShape_weta1(onl)-val_off)/val_off );
1233 }else{
1234 res_weta1_vec.push_back( dummy );
1235 }
1236
1237 val_off=getShowerShape_weta2(off);
1238 if(val_off!=0.){
1239 res_weta2_vec.push_back( (getShowerShape_weta2(onl)-val_off)/val_off );
1240 }else{
1241 res_weta2_vec.push_back( dummy );
1242 }
1243
1244 val_off=getShowerShape_wtots1(off);
1245 if(val_off!=0.){
1246 res_wtots1_vec.push_back( (getShowerShape_wtots1(onl)-val_off)/val_off );
1247 }else{
1248 res_wtots1_vec.push_back( dummy );
1249 }
1250
1251 val_off=getShowerShape_f1(off);
1252 if(val_off!=0.){
1253 res_f1_vec.push_back( (getShowerShape_f1(onl)-val_off)/val_off );
1254 }else{
1255 res_f1_vec.push_back(dummy );
1256 }
1257
1258 val_off=getShowerShape_f3(off);
1259 if(val_off!=0.){
1260 res_f3_vec.push_back( (getShowerShape_f3(onl)-val_off)/val_off );
1261 }else{
1262 res_f3_vec.push_back( dummy );
1263 }
1264
1265 val_off=getShowerShape_Eratio(off);
1266 if(val_off!=0.){
1267 res_eratio_vec.push_back( (getShowerShape_Eratio(onl)-val_off)/val_off );
1268 }else{
1269 res_eratio_vec.push_back( dummy );
1270 }
1271
1272
1273 //
1274 // Track variables
1275 //
1276
1277 val_off=getTrack_pt(off);
1278 if(val_off!=0.){
1279 res_pt_vec.push_back( (getTrack_pt(onl)-val_off)/val_off );
1280 }else{
1281 res_pt_vec.push_back( dummy );
1282 }
1283
1284 val_off=getEt(off);
1285 if(val_off!=0.) {
1286 res_et_vec.push_back( (getEt(onl)-val_off)/val_off );
1287 }else{
1288 res_et_vec.push_back( dummy );
1289 }
1290
1291 val_off=getCaloTrackMatch_deltaEta1(off);
1292 if(val_off!=0.) {
1293 res_deta1_vec.push_back( (getCaloTrackMatch_deltaEta1(onl)-val_off)/val_off );
1294 }else{
1295 res_deta1_vec.push_back( dummy );
1296 }
1297
1298 val_off=getCaloTrackMatch_deltaEta2(off);
1299 res_deta2_vec.push_back( (getCaloTrackMatch_deltaEta2(onl)-val_off)/val_off );
1300 val_off=getCaloTrackMatch_deltaPhi2(off);
1301 if(val_off!=0.) {
1302 res_dphi2_vec.push_back( (getCaloTrackMatch_deltaPhi2(onl)-val_off)/val_off );
1303 }else{
1304 res_dphi2_vec.push_back(dummy );
1305 }
1306
1307 val_off=getCaloTrackMatch_deltaPhiRescaled2(off);
1308 res_dphiresc_vec.push_back( (getCaloTrackMatch_deltaPhiRescaled2(onl)-val_off)/val_off );
1309 // Resolution of Z0 of the track
1310 val_off=getTrack_z0(off);
1311 if(val_off!=0.) {
1312 res_z0_vec.push_back( getTrack_z0(onl)-val_off );
1313 }else{
1314 res_z0_vec.push_back( dummy );
1315 }
1316
1317 // Absolute resolution for impact parameter
1318 val_off=getTrack_d0(off);
1319 if(val_off!=0.) {
1320 res_d0_vec.push_back( getTrack_d0(onl)-val_off );
1321 }else{
1322 res_d0_vec.push_back( dummy );
1323 }
1324
1325 val_off=getD0sig(off);
1326 if(val_off!=0.) {
1327 res_d0sig_vec.push_back( getD0sig(onl)-val_off );
1328 }else{
1329 res_d0sig_vec.push_back( dummy );
1330 }
1331
1332 // Absolute resolution on track summary ints/floats
1333 val_off=getTrackSummaryFloat_eProbabilityHT(off);
1334 res_eprobht_vec.push_back( (getTrackSummaryFloat_eProbabilityHT(onl)-val_off) );
1335 res_npixhits_vec.push_back( getTrackSummary_numberOfPixelHits(onl)-getTrackSummary_numberOfPixelHits(onl) );
1336 res_nscthits_vec.push_back( getTrackSummary_numberOfSCTHits(onl)-getTrackSummary_numberOfSCTHits(onl) );
1337
1338
1339
1340
1341 if(info.isolated){
1342
1343 float val_off=getIsolation_ptcone20(off);
1344 if (val_off > 0.) {
1345 res_ptcone20_vec.push_back((getIsolation_ptcone20(onl)-val_off)/val_off);
1346 if (getEt(onl) > 0. && getEt(off) > 0.) {
1347 const float reliso_onl=getIsolation_ptcone20(onl)/getEt(onl);
1348 const float reliso_off=getIsolation_ptcone20(off)/getEt(off);
1349 res_ptcone20_rel_vec.push_back((reliso_onl-reliso_off)/reliso_off);
1350 }else{
1351 res_ptcone20_rel_vec.push_back(dummy);
1352 }
1353 }else{
1354 res_ptcone20_vec.push_back(dummy);
1355 res_ptcone20_rel_vec.push_back(dummy);
1356 }
1357
1358 // ptvarcone20 isolation
1359 val_off=getIsolation_ptvarcone20(off);
1360 if (val_off > 0.) {
1361 if (getEt(onl) > 0. && getEt(off) > 0.) {
1362 res_ptvarcone20_vec.push_back((getIsolation_ptvarcone20(onl)-val_off)/val_off);
1363 const float reliso_onl=getIsolation_ptvarcone20(onl)/getEt(onl);
1364 const float reliso_off=getIsolation_ptvarcone20(off)/getEt(off);
1365 res_ptvarcone20_rel_vec.push_back((reliso_onl-reliso_off)/reliso_off);
1366 }else{
1367 res_ptvarcone20_rel_vec.push_back(dummy);
1368 }
1369 }else{
1370 res_ptvarcone20_vec.push_back(dummy);
1371 res_ptvarcone20_rel_vec.push_back(dummy);
1372 }
1373
1374 }
1375
1376
1377
1378
1379
1380 } // Loop over all offline objects
1381
1382 // Fill everything
1383 fill( monGroup ,
1384 et_col ,
1385 eta_col ,
1386 mu_col ,
1387 res_pt_col ,
1388 res_et_col ,
1389 res_eta_col ,
1390 res_phi_col ,
1391 res_deta1_col ,
1392 res_deta2_col ,
1393 res_dphi2_col ,
1394 res_dphiresc_col,
1395 res_z0_col ,
1396 res_d0_col ,
1397 res_d0sig_col ,
1398 res_eprobht_col ,
1399 res_npixhits_col,
1400 res_nscthits_col,
1401 res_ethad_col ,
1402 res_ethad1_col ,
1403 res_Rhad_col ,
1404 res_Rhad1_col ,
1405 res_Reta_col ,
1406 res_Rphi_col ,
1407 res_weta1_col ,
1408 res_weta2_col ,
1409 res_wtots1_col ,
1410 res_f1_col ,
1411 res_f3_col ,
1412 res_eratio_col ,
1413 res_ptcone20_col ,
1414 res_ptcone20_rel_col ,
1415 res_ptvarcone20_col ,
1416 res_ptvarcone20_rel_col ,
1417 res_etInEta0_col,
1418 res_etInEta1_col,
1419 res_etInEta2_col,
1420 res_etInEta3_col );
1421
1422
1423
1424}
1425
1426
1427
1428
1429
1430void TrigEgammaMonitorAnalysisAlgorithm::fillHLTPhotonResolution(const EventContext& ctx, const std::string &trigger,
1431 const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs,
1432 const TrigInfo& info) const
1433{
1434
1435 auto monGroup = getGroup( trigger + "_Resolutions_HLT" );
1436
1437 std::vector<float> res_phi_vec, res_eta_vec, res_Rhad_vec, res_Rhad1_vec, res_Reta_vec, res_ethad_vec, res_ethad1_vec,
1438 res_Rphi_vec, res_weta1_vec, res_weta2_vec, res_wtots1_vec, res_f1_vec, res_f3_vec, res_eratio_vec, et_vec, eta_vec, mu_vec;
1439
1440 std::vector<float> res_et_vec, res_et_cnv_vec, res_et_uncnv_vec;
1441 std::vector<float> res_etInEta0_vec, res_etInEta1_vec, res_etInEta2_vec, res_etInEta3_vec;
1442 std::vector<float> res_cnv_etInEta0_vec, res_cnv_etInEta1_vec, res_cnv_etInEta2_vec, res_cnv_etInEta3_vec;
1443 std::vector<float> res_uncnv_etInEta0_vec, res_uncnv_etInEta1_vec, res_uncnv_etInEta2_vec, res_uncnv_etInEta3_vec;
1444
1445
1446
1447 std::vector<float> res_topoetcone20_vec, res_topoetcone20_rel_vec;
1448
1449 auto et_col = Monitored::Collection( "et" , et_vec );
1450 auto eta_col = Monitored::Collection( "eta" , eta_vec );
1451 auto mu_col = Monitored::Collection( "mu" , mu_vec );
1452
1453 // For calo
1454 auto res_eta_col = Monitored::Collection( "res_eta" , res_eta_vec );
1455 auto res_phi_col = Monitored::Collection( "res_phi" , res_phi_vec );
1456 auto res_ethad_col = Monitored::Collection( "res_ethad" , res_ethad_vec );
1457 auto res_ethad1_col = Monitored::Collection( "res_ethad1" , res_ethad1_vec );
1458 auto res_Rhad_col = Monitored::Collection( "res_Rhad" , res_Rhad_vec );
1459 auto res_Rhad1_col = Monitored::Collection( "res_Rhad1" , res_Rhad1_vec );
1460 auto res_Reta_col = Monitored::Collection( "res_Reta" , res_Reta_vec );
1461 auto res_Rphi_col = Monitored::Collection( "res_Rphi" , res_Rphi_vec );
1462 auto res_weta1_col = Monitored::Collection( "res_weta1" , res_weta1_vec );
1463 auto res_weta2_col = Monitored::Collection( "res_weta2" , res_weta2_vec );
1464 auto res_wtots1_col = Monitored::Collection( "res_wtots1" , res_wtots1_vec );
1465 auto res_f1_col = Monitored::Collection( "res_f1" , res_f1_vec );
1466 auto res_f3_col = Monitored::Collection( "res_f3" , res_f3_vec );
1467 auto res_eratio_col = Monitored::Collection( "res_eratio" , res_eratio_vec );
1468
1469
1470 auto res_et_col = Monitored::Collection( "res_et" , res_et_vec );
1471 auto res_et_cnv_col = Monitored::Collection( "res_et_cnv" , res_et_cnv_vec );
1472 auto res_et_uncnv_col = Monitored::Collection( "res_et_uncnv" , res_et_uncnv_vec );
1473 auto res_etInEta0_col = Monitored::Collection( "res_etInEta0" , res_etInEta0_vec );
1474 auto res_etInEta1_col = Monitored::Collection( "res_etInEta1" , res_etInEta1_vec );
1475 auto res_etInEta2_col = Monitored::Collection( "res_etInEta2" , res_etInEta2_vec );
1476 auto res_etInEta3_col = Monitored::Collection( "res_etInEta3" , res_etInEta3_vec );
1477 auto res_cnv_etInEta0_col = Monitored::Collection( "res_cnv_etInEta0" , res_cnv_etInEta0_vec );
1478 auto res_cnv_etInEta1_col = Monitored::Collection( "res_cnv_etInEta1" , res_cnv_etInEta1_vec );
1479 auto res_cnv_etInEta2_col = Monitored::Collection( "res_cnv_etInEta2" , res_cnv_etInEta2_vec );
1480 auto res_cnv_etInEta3_col = Monitored::Collection( "res_cnv_etInEta3" , res_cnv_etInEta3_vec );
1481 auto res_uncnv_etInEta0_col = Monitored::Collection( "res_uncnv_etInEta0" , res_uncnv_etInEta0_vec);
1482 auto res_uncnv_etInEta1_col = Monitored::Collection( "res_uncnv_etInEta1" , res_uncnv_etInEta1_vec);
1483 auto res_uncnv_etInEta2_col = Monitored::Collection( "res_uncnv_etInEta2" , res_uncnv_etInEta2_vec);
1484 auto res_uncnv_etInEta3_col = Monitored::Collection( "res_uncnv_etInEta3" , res_uncnv_etInEta3_vec);
1485
1486 // For photon
1487 auto res_topoetcone20_col = Monitored::Collection( "res_topoetcone20" , res_topoetcone20_vec );
1488 auto res_topoetcone20_rel_col = Monitored::Collection( "res_topoetcone20_rel" , res_topoetcone20_rel_vec );
1489
1490
1491
1492
1493 // Check for zero before filling
1494 ATH_MSG_DEBUG("Fill Resolution");
1495
1496
1497
1498 for ( const auto & pairObj : pairObjs ){
1499
1500 const xAOD::Photon *off = static_cast<const xAOD::Photon*>(pairObj.first);
1501 const xAOD::Photon *onl=nullptr;
1502
1503
1504 { // Get the closest electron object from the trigger starting with deltaR = 0.15
1505 float maxDeltaR=0.05;
1506 auto vec = tdt()->features<xAOD::PhotonContainer>(trigger,TrigDefs::Physics ,match()->key("Photons") );
1507 for(auto &featLinkInfo : vec ){
1508 if(! featLinkInfo.isValid() ) continue;
1509 const auto *feat = *(featLinkInfo.link);
1510 if(!feat) continue;
1511 float deltaR = dR( off->eta(), off->phi(), feat->eta(), feat->phi() );
1512 if( deltaR < maxDeltaR){
1513 maxDeltaR=deltaR;
1514 onl=feat;
1515 }
1516 }
1517 }
1518
1519 // If not found, skip this off object!
1520 if(!onl) continue;
1521
1522 float val_off=0.;
1523 const float onl_eta=onl->eta();
1524 const float feta = abs(onl_eta);
1525 const float onl_et = getCluster_et(onl)/Gaudi::Units::GeV;
1526 const float dummy=-999;
1527
1528 const float avgmu=lbAverageInteractionsPerCrossing( ctx );
1529 et_vec.push_back( onl_et );
1530 eta_vec.push_back( onl_eta );
1531 mu_vec.push_back( avgmu );
1532
1533
1534 val_off=getCluster_et(off);
1535 if(val_off!=0.){
1536 res_et_vec.push_back( (getCluster_et(onl)-val_off)/val_off );
1537 if( feta < 1.37 )
1538 res_etInEta0_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1539 else if( feta >=1.37 && feta <= 1.52 )
1540 res_etInEta1_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1541 else if( feta >= 1.55 && feta < 1.8 )
1542 res_etInEta2_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1543 else if( feta >= 1.8 && feta < 2.45 )
1544 res_etInEta3_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1545
1547 res_et_cnv_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1548 if( feta < 1.37 )
1549 res_cnv_etInEta0_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1550 else if( feta >=1.37 && feta <= 1.52 )
1551 res_cnv_etInEta1_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1552 else if( feta >= 1.55 && feta < 1.8 )
1553 res_cnv_etInEta2_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1554 else if( feta >= 1.8 && feta < 2.45 )
1555 res_cnv_etInEta3_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1556 }else{
1557 res_et_uncnv_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1558 if( feta < 1.37 )
1559 res_uncnv_etInEta0_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1560 else if( feta >=1.37 && feta <= 1.52 )
1561 res_uncnv_etInEta1_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1562 else if( feta >= 1.55 && feta < 1.8 )
1563 res_uncnv_etInEta2_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1564 else if( feta >= 1.8 && feta < 2.45 )
1565 res_uncnv_etInEta3_vec.push_back((getCluster_et(onl)-val_off)/val_off);
1566 }
1567 }
1568
1569 val_off=off->eta();
1570 if(val_off!=0.){
1571 res_eta_vec.push_back( (onl_eta-val_off)/val_off ) ;
1572 }else{
1573 res_eta_vec.push_back( dummy ) ;
1574 }
1575
1576 val_off=off->phi();
1577 if(val_off!=0.){
1578 res_phi_vec.push_back( (onl->phi()-val_off)/val_off );
1579 }else{
1580 res_phi_vec.push_back(dummy );
1581 }
1582
1583 val_off=getShowerShape_ethad(off);
1584 if(val_off!=0.) {
1585 res_ethad_vec.push_back((getShowerShape_ethad(onl)-val_off)/val_off);
1586 }else{
1587 res_ethad_vec.push_back(dummy);
1588 }
1589
1590 val_off=getShowerShape_ethad1(off);
1591 if(val_off!=0){
1592 res_ethad1_vec.push_back((getShowerShape_ethad1(onl)-val_off)/val_off);
1593 }else{
1594 res_ethad1_vec.push_back(dummy);
1595 }
1596
1597 val_off=getShowerShape_Rhad(off);
1598 if(val_off!=0.){
1599 res_Rhad_vec.push_back( (getShowerShape_Rhad(onl)-val_off)/val_off );
1600 }else{
1601 res_Rhad_vec.push_back(dummy );
1602 }
1603
1604 val_off=getShowerShape_Rhad1(off);
1605 if(val_off!=0.){
1606 res_Rhad1_vec.push_back( (getShowerShape_Rhad1(onl)-val_off)/val_off );
1607 }else{
1608 res_Rhad1_vec.push_back(dummy );
1609 }
1610
1611 val_off=getShowerShape_Reta(off);
1612 if(val_off!=0.){
1613 res_Reta_vec.push_back( (getShowerShape_Reta(onl)-val_off)/val_off );
1614 }else{
1615 res_Reta_vec.push_back( dummy );
1616 }
1617
1618 val_off=getShowerShape_Rphi(off);
1619 if(val_off!=0.){
1620 res_Rphi_vec.push_back( (getShowerShape_Rphi(onl)-val_off)/val_off );
1621 }else{
1622 res_Rphi_vec.push_back(dummy );
1623 }
1624
1625 val_off=getShowerShape_weta1(off);
1626 if(val_off!=0.){
1627 res_weta1_vec.push_back( (getShowerShape_weta1(onl)-val_off)/val_off );
1628 }else{
1629 res_weta1_vec.push_back( dummy );
1630 }
1631
1632 val_off=getShowerShape_weta2(off);
1633 if(val_off!=0.){
1634 res_weta2_vec.push_back( (getShowerShape_weta2(onl)-val_off)/val_off );
1635 }else{
1636 res_weta2_vec.push_back(dummy);
1637 }
1638
1639 val_off=getShowerShape_wtots1(off);
1640 if(val_off!=0.){
1641 res_wtots1_vec.push_back( (getShowerShape_wtots1(onl)-val_off)/val_off );
1642 }else{
1643 res_wtots1_vec.push_back( dummy );
1644 }
1645
1646 val_off=getShowerShape_f1(off);
1647 if(val_off!=0.){
1648 res_f1_vec.push_back( (getShowerShape_f1(onl)-val_off)/val_off );
1649 }else{
1650 res_f1_vec.push_back( dummy );
1651 }
1652
1653 val_off=getShowerShape_f3(off);
1654 if(val_off!=0.){
1655 res_f3_vec.push_back( (getShowerShape_f3(onl)-val_off)/val_off );
1656 }else{
1657 res_f3_vec.push_back( dummy );
1658 }
1659
1660 val_off=getShowerShape_Eratio(off);
1661 if(val_off!=0.){
1662 res_eratio_vec.push_back( (getShowerShape_Eratio(onl)-val_off)/val_off);
1663 }else{
1664 res_eratio_vec.push_back( dummy);
1665 }
1666
1667
1668 if( info.isolated ){
1669 // topoetcone20 isolation
1670 float val_off=getIsolation_topoetcone20(off);
1671 float etonl=onl->pt();
1672 float etoff=off->pt();
1673 if (val_off > 0.) {
1674 res_topoetcone20_vec.push_back((getIsolation_topoetcone20(onl)-val_off)/val_off);
1675 if (etonl > 0. && etoff > 0.) {
1676 const float reliso_onl=getIsolation_topoetcone20(onl)/etonl;
1677 const float reliso_off=getIsolation_topoetcone20(off)/etoff;
1678 res_topoetcone20_rel_vec.push_back((reliso_onl-reliso_off)/reliso_off);
1679 }else{
1680 res_topoetcone20_rel_vec.push_back(dummy);
1681 }
1682 }else{
1683 res_topoetcone20_vec.push_back(dummy);
1684 res_topoetcone20_rel_vec.push_back(dummy);
1685 }
1686 }
1687
1688
1689
1690 } // Loop over all offline objects
1691
1692 // Fill everything
1693 fill( monGroup ,
1694 et_col ,
1695 eta_col ,
1696 mu_col ,
1697 res_et_col ,
1698 res_eta_col ,
1699 res_phi_col ,
1700 res_ethad_col ,
1701 res_ethad1_col ,
1702 res_Rhad_col ,
1703 res_Rhad1_col ,
1704 res_Reta_col ,
1705 res_Rphi_col ,
1706 res_weta1_col ,
1707 res_weta2_col ,
1708 res_wtots1_col ,
1709 res_f1_col ,
1710 res_f3_col ,
1711 res_eratio_col ,
1712 res_topoetcone20_col ,
1713 res_topoetcone20_rel_col ,
1714 res_etInEta0_col,
1715 res_etInEta1_col,
1716 res_etInEta2_col,
1717 res_etInEta3_col,
1718 res_et_uncnv_col,
1719 res_cnv_etInEta0_col,
1720 res_cnv_etInEta1_col,
1721 res_cnv_etInEta2_col,
1722 res_cnv_etInEta3_col,
1723 res_et_cnv_col,
1724 res_uncnv_etInEta0_col,
1725 res_uncnv_etInEta1_col,
1726 res_uncnv_etInEta2_col,
1727 res_uncnv_etInEta3_col
1728 );
1729
1730
1731
1732}
1733
1734
1736 const std::vector< std::pair< const xAOD::Egamma*, const TrigCompositeUtils::Decision * >>& pairObjs ) const
1737
1738{
1739 ATH_MSG_DEBUG("Fill L2Calo Resolution");
1740
1741 auto monGroup = getGroup( trigger + "_Resolutions_L2Calo" );
1742
1743 std::vector<float> res_et_vec, res_phi_vec, res_eta_vec, res_Rhad_vec, res_Rhad1_vec, res_Reta_vec, res_ethad_vec, res_ethad1_vec,
1744 res_Rphi_vec, res_weta2_vec, res_f1_vec, res_f3_vec, res_eratio_vec, et_vec, eta_vec;
1745
1746
1747 auto et_col = Monitored::Collection( "et" , et_vec );
1748 auto eta_col = Monitored::Collection( "eta" , eta_vec );
1749 auto res_et_col = Monitored::Collection( "res_et" , res_et_vec );
1750 auto res_eta_col = Monitored::Collection( "res_eta" , res_eta_vec );
1751 auto res_phi_col = Monitored::Collection( "res_phi" , res_phi_vec );
1752 auto res_ethad_col = Monitored::Collection( "res_ethad" , res_ethad_vec );
1753 auto res_ethad1_col = Monitored::Collection( "res_ethad1" , res_ethad1_vec );
1754 auto res_Rhad_col = Monitored::Collection( "res_Rhad" , res_Rhad_vec );
1755 auto res_Rhad1_col = Monitored::Collection( "res_Rhad1" , res_Rhad1_vec );
1756 auto res_Reta_col = Monitored::Collection( "res_Reta" , res_Reta_vec );
1757 auto res_Rphi_col = Monitored::Collection( "res_Rphi" , res_Rphi_vec );
1758 auto res_weta2_col = Monitored::Collection( "res_weta2" , res_weta2_vec );
1759 auto res_f1_col = Monitored::Collection( "res_f1" , res_f1_vec );
1760 auto res_f3_col = Monitored::Collection( "res_f3" , res_f3_vec );
1761 auto res_eratio_col = Monitored::Collection( "res_eratio" , res_eratio_vec );
1762
1763
1764 for ( const auto & pairObj : pairObjs ){
1765
1766
1767 const xAOD::Egamma *off = pairObj.first;
1768 const xAOD::TrigEMCluster *onl=nullptr;
1769
1770 { // Get the closest electron object from the trigger starting with deltaR = 0.15
1771 float maxDeltaR=0.05;
1772 auto vec = tdt()->features<xAOD::TrigEMClusterContainer>(trigger,TrigDefs::Physics ,match()->key("FastCalo") );
1773 for(auto &featLinkInfo : vec ){
1774 if(! featLinkInfo.isValid() ) continue;
1775 const auto *feat = *(featLinkInfo.link);
1776 if(!feat) continue;
1777 float deltaR = dR( off->eta(), off->phi(), feat->eta(), feat->phi() );
1778 if( deltaR < maxDeltaR){
1779 maxDeltaR=deltaR;
1780 onl=feat;
1781 }
1782 }
1783 }
1784
1785 if(!onl) continue;
1786
1787 et_vec.push_back(onl->et()*1e-3);
1788 eta_vec.push_back(onl->eta());
1789 const float dummy=-999;
1790
1791 float val_off=0.;
1792
1793 val_off=off->caloCluster()->et();
1794 if(val_off!=0.){
1795 res_et_vec.push_back(((onl->et())-val_off)/val_off);
1796 }else{
1797 res_et_vec.push_back(dummy);
1798 }
1799
1800 val_off=off->caloCluster()->eta();
1801 if(val_off!=0.){
1802 res_eta_vec.push_back((onl->eta()-val_off)/val_off);
1803 }else{
1804 res_eta_vec.push_back(dummy);
1805 }
1806
1807 val_off=off->caloCluster()->phi();
1808 if(val_off!=0.){
1809 res_phi_vec.push_back((onl->phi()-val_off)/val_off);
1810 }else{
1811 res_phi_vec.push_back((onl->phi()-val_off)/val_off);
1812 }
1813
1814 float elonl_ethad = onl->energy( CaloSampling::HEC0 ); elonl_ethad += onl->energy( CaloSampling::HEC1 );
1815 elonl_ethad += onl->energy( CaloSampling::HEC2 ); elonl_ethad += onl->energy( CaloSampling::HEC3 );
1816 elonl_ethad += onl->energy( CaloSampling::TileBar0 ); elonl_ethad += onl->energy( CaloSampling::TileExt0 );
1817 elonl_ethad += onl->energy( CaloSampling::TileBar1 ); elonl_ethad += onl->energy( CaloSampling::TileExt1 );
1818 elonl_ethad += onl->energy( CaloSampling::TileBar2 ); elonl_ethad += onl->energy( CaloSampling::TileExt2 );
1819 elonl_ethad /= TMath::CosH(onl->eta() );
1820 val_off=getShowerShape_ethad(off);
1821 if(val_off!=0.){
1822 res_ethad_vec.push_back((elonl_ethad-val_off)/val_off);
1823 }else{
1824 res_ethad_vec.push_back(dummy);
1825 }
1826
1827 val_off=getShowerShape_ethad1(off);
1828 if(val_off!=0.){
1829 res_ethad1_vec.push_back(( (onl->ehad1()/TMath::Abs(onl->eta()) )-val_off)/val_off);
1830 }else{
1831 res_ethad1_vec.push_back(dummy);
1832 }
1833
1834 float elonl_Rhad = elonl_ethad / onl->energy() ;
1835 val_off=getShowerShape_Rhad(off);
1836 if(val_off!=0.){
1837 res_Rhad_vec.push_back(( elonl_Rhad-val_off)/val_off);
1838 }else{
1839 res_Rhad_vec.push_back(dummy);
1840 }
1841
1842 float elonl_Rhad1 = onl->ehad1() / onl->energy() ;
1843 val_off=getShowerShape_Rhad1(off);
1844 if(val_off!=0.){
1845 res_Rhad1_vec.push_back(( elonl_Rhad1-val_off)/val_off);
1846 }else{
1847 res_Rhad1_vec.push_back(dummy);
1848 }
1849
1850 float onl_reta= 999.0;
1851 if ( fabsf ( onl->e277() ) > 0.01 ) onl_reta = onl->e237() / onl->e277();
1852 val_off=getShowerShape_Reta(off);
1853 if(val_off!=0.){
1854 res_Reta_vec.push_back( (onl_reta -val_off)/val_off);
1855 }else{
1856 res_Reta_vec.push_back(dummy);
1857 }
1858
1859 val_off=getShowerShape_weta2(off);
1860 if(val_off!=0.){
1861 res_weta2_vec.push_back(( (onl->weta2())-val_off)/val_off);
1862 }else{
1863 res_weta2_vec.push_back(dummy);
1864 }
1865
1866 float onl_f1 = onl->energy(CaloSampling::EMB1)+onl->energy(CaloSampling::EME1);
1867 onl_f1 /= onl->energy();
1868 val_off=getShowerShape_f1(off);
1869 if(val_off!=0.){
1870 res_f1_vec.push_back(( (onl_f1)-val_off)/val_off);
1871 }else{
1872 res_f1_vec.push_back(dummy);
1873 }
1874
1875 float onl_f3 = onl->energy(CaloSampling::EMB3)+onl->energy(CaloSampling::EME3);
1876 onl_f3 /= onl->energy();
1877 val_off=getShowerShape_f3(off);
1878 if(val_off!=0.){
1879 res_f3_vec.push_back(( (onl_f3)-val_off)/val_off);
1880 }else{
1881 res_f3_vec.push_back(dummy);
1882 }
1883
1884 float onl_eratio = 999.0;
1885 if ( fabsf(onl->emaxs1() + onl->e2tsts1()) > 0.01 )
1886 onl_eratio = (onl->emaxs1() - onl->e2tsts1()) / (onl->emaxs1() + onl->e2tsts1());
1887 val_off=getShowerShape_Eratio(off);
1888 if(val_off!=0.){
1889 res_eratio_vec.push_back(( (onl_eratio)-val_off)/val_off);
1890 }else{
1891 res_eratio_vec.push_back(dummy);
1892 }
1893
1894 }// Loop over all pair objects
1895
1896
1897 // Fill everything
1898 fill( monGroup ,
1899 et_col ,
1900 eta_col ,
1901 res_et_col ,
1902 res_eta_col ,
1903 res_phi_col ,
1904 res_ethad_col ,
1905 res_ethad1_col ,
1906 res_Rhad_col ,
1907 res_Rhad1_col ,
1908 res_Reta_col ,
1909 res_Rphi_col ,
1910 res_weta2_col ,
1911 res_f1_col ,
1912 res_f3_col ,
1913 res_eratio_col
1914 );
1915
1916}
1917
Scalar eta() const
pseudorapidity method
Scalar deltaR(const MatrixBase< Derived > &vec) const
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
Helper class to provide type-safe access to aux data.
struct _triginfo TrigInfo
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Declare a monitored scalar variable.
void fillEfficiencies(const EventContext &ctx, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &, const TrigInfo &, const bool) const
void fillTracking(const EventContext &ctx, const std::string &trigger, const std::vector< const xAOD::Electron * > &eg_vec, bool online) const
void fillEFCalo(const std::string &trigger, const std::vector< const xAOD::CaloCluster * > &clus_vec) const
void fillShowerShapes(const std::string &trigger, const std::vector< const xAOD::Egamma * > &eg_vec, bool online) const
void fillL2Calo(const std::string &trigger, const std::vector< const xAOD::TrigEMCluster * > &emCluster_vec) const
virtual StatusCode initialize() override
initialize
void fillL1eEM(const std::string &trigger, const std::vector< const xAOD::eFexEMRoI * > &l1_vec) const
void fillHLTPhotonResolution(const EventContext &ctx, const std::string &trigger, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs, const TrigInfo &info) const
void fillHLTElectronResolution(const EventContext &ctx, const std::string &trigger, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs, const TrigInfo &info) const
void fillL1CaloAbsResolution(const std::string &trigger, const std::vector< std::pair< const xAOD::Egamma *, const xAOD::EmTauRoI * > > &pairObjs) const
void fillL2CaloResolution(const std::string &trigger, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs) const
TrigEgammaMonitorAnalysisAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
void fillEfficiency(const EventContext &ctx, const std::string &subgroup, const std::string &level, const std::string &pidword, const TrigInfo &info, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs, const std::vector< asg::AcceptData > &acceptObjs, const std::string &dirname) const
void fillL1CaloResolution(const std::string &trigger, const std::vector< std::pair< const xAOD::Egamma *, const xAOD::EmTauRoI * > > &pairObjs) const
void fillL2Photon(const std::string &trigger, const std::vector< const xAOD::TrigPhoton * > &eg_vec) const
void fillInefficiency(const std::string &pidword, const TrigInfo &info, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs, const std::vector< asg::AcceptData > &acceptObjs) const
void fillL2Electron(const std::string &trigger, const std::vector< const xAOD::TrigElectron * > &el_vec) const
void fillDistributions(const EventContext &ctx, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &, const TrigInfo &) const
void fillResolutions(const EventContext &ctx, const std::vector< std::pair< const xAOD::Egamma *, const TrigCompositeUtils::Decision * > > &pairObjs, const TrigInfo &info) const
*****************************************************************************************************...
void fillLabel(const ToolHandle< GenericMonitoringTool > &groupHandle, const std::string &histname, const std::string &label) const
void fillL1Calo(const std::string &trigger, const std::vector< const xAOD::EmTauRoI * > &l1_vec) const
Gaudi::Property< std::vector< std::string > > m_isemname
isem names
TrigEgammaMonitorBaseAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
const ToolHandle< TrigEgammaMatchingToolMT > & match() const
Get the e/g match tool.
float dR(const float, const float, const float, const float) const
Get delta R.
Gaudi::Property< bool > m_detailedHists
Include more detailed histograms.
const ToolHandle< Trig::TrigDecisionTool > & tdt() const
Get the TDT.
Gaudi::Property< bool > m_doEmulation
Do emulation.
float getEt(const xAOD::Electron *eg) const
Gaudi::Property< std::vector< std::string > > m_lhname
lh names
asg::AcceptData setAccept(const TrigCompositeUtils::Decision *, const TrigInfo &, const bool) const
Set the accept object for all trigger levels.
virtual StatusCode initialize() override
initialize
float getD0sig(const xAOD::Electron *eg) const
ToolHandle< Trig::TrigEgammaEmulationToolMT > m_emulatorTool
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
@ ETACALOFRAME
Eta in the calo frame (for egamma).
@ PHICALOFRAME
Phi in the calo frame (for egamma).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition Egamma_v1.cxx:66
virtual Type::ObjectType type() const override=0
The type of the object as a simple enumeration, remains pure virtual in e/gamma.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition Egamma_v1.cxx:71
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
Definition Egamma_v1.cxx:76
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx) const
Calculate the average mu, i.e.
std::string label(const std::string &format, int i)
Definition label.h:19
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
static const unsigned int allFeaturesOfType
Run 3 "enum". Return all features along legs (still with type and container checks).
@ Photon
The object is a photon.
Definition ObjectType.h:47
@ Electron
The object is an electron.
Definition ObjectType.h:46
bool isConvertedPhoton(const xAOD::Egamma *eg, bool excludeTRT=false)
is the object a converted photon
bool isElectron(const xAOD::Egamma *eg)
is the object an electron (not Fwd)
PhotonContainer_v1 PhotonContainer
Definition of the current "photon container version".
TrigElectronContainer_v1 TrigElectronContainer
Declare the latest version of the container.
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
TrigEMClusterContainer_v1 TrigEMClusterContainer
Define the latest version of the trigger EM cluster container.
TrigPhotonContainer_v1 TrigPhotonContainer
Declare the latest version of the container.
Egamma_v1 Egamma
Definition of the current "egamma version".
Definition Egamma.h:17
TrigEMCluster_v1 TrigEMCluster
Define the latest version of the trigger EM cluster class.
Photon_v1 Photon
Definition of the current "egamma version".
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
Electron_v1 Electron
Definition of the current "egamma version".
Extra patterns decribing particle interation process.
std::string dirname(std::string name)
Definition utils.cxx:200