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