ATLAS Offline Software
TrigDisappearingTrackHypoAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 
4  * Trigger Hypo Tool, that is aimed at triggering disappearing tracks
5  * author Kunihiro Nagano <kunihiro.nagano@cern.ch>
6 */
8 #include "AthViews/ViewHelper.h"
10 #include "GaudiKernel/SystemOfUnits.h"
13 
14 #include "TFile.h"
15 #include "TTree.h"
16 
31 
32 // ------------------------------------------------------------------------------------------------
33 // ------------------------------------------------------------------------------------------------
34 
36  ISvcLocator* pSvcLocator ) :
37  ::HypoBase( name, pSvcLocator ) {}
38 
39 // ------------------------------------------------------------------------------------------------
40 // ------------------------------------------------------------------------------------------------
41 
43 {
44  CHECK( m_hypoTools.retrieve() );
45  CHECK( m_DisTrkCandKey.initialize() );
46  CHECK( m_DisTrkBDTSelKey.initialize());
47 
48  if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() );
49 
50  // MVAUtils BDT initialisation
51  // could make this configurable as a property
52  std::string weightfile[4];
53  // pix4l_sct0
54  weightfile[0] = PathResolver::find_calib_file("TrigDisappearingTrackTriggerHypo/pix4l_sct0.BDT.weights.v21a.root");
55  // pix4l_sct1p
56  weightfile[1] = PathResolver::find_calib_file("TrigDisappearingTrackTriggerHypo/pix4l_sct1p.BDT.weights.v21b.root");
57  // pix3l_sct0
58  weightfile[2] = PathResolver::find_calib_file("TrigDisappearingTrackTriggerHypo/pix3l_sct0.BDT.weights.v21a.root");
59  // pix3l_sct1p
60  weightfile[3] = PathResolver::find_calib_file("TrigDisappearingTrackTriggerHypo/pix3l_sct1p.BDT.weights.v21a.root");
61  for (unsigned int i=0; i<4; ++i) {
62  std::unique_ptr<TFile> rootFile(TFile::Open(weightfile[i].c_str(), "READ"));
63  if (!rootFile) {
64  ATH_MSG_ERROR("Can not open BDT root file: " << weightfile[i] );
65  return StatusCode::FAILURE;
66  }
67  std::unique_ptr<TTree> tree((TTree*)rootFile->Get("BDT"));
68  if (!tree) {
69  ATH_MSG_ERROR("Can not find BDT tree in file: " << weightfile[i]);
70  return StatusCode::FAILURE;
71  }
72  ATH_MSG_INFO("Loading BDT tree from file: " << weightfile[i]);
73  m_bdt[i] = std::make_unique<MVAUtils::BDT>(tree.get());
74  }
75 
76  return StatusCode::SUCCESS;
77 }
78 
79 // ------------------------------------------------------------------------------------------------
80 // ------------------------------------------------------------------------------------------------
81 
82 StatusCode TrigDisappearingTrackHypoAlg::execute( const EventContext& context ) const
83 {
84  // previous decisions
85  ATH_MSG_DEBUG( "Retrieving pervious decision: \"" << decisionInput().key() << "\"" );
86  auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
87  ATH_CHECK( previousDecisionsHandle.isValid() );
88 
89  ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" );
90  if( previousDecisionsHandle->size()!=1 ) {
91  ATH_MSG_ERROR( "Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
92  return StatusCode::FAILURE;
93  }
94  const Decision * previousDecision = previousDecisionsHandle->at(0);
95 
96  TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
97  TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs);
98  ATH_MSG_VERBOSE( "IDs of active legs:" );
99  for(auto decisionID: previousDecisionIDs) { ATH_MSG_VERBOSE( " " << decisionID ); }
100 
101  // new output decisions
102  ATH_MSG_DEBUG( "Creating new output decision handle" );
104  auto outputDecisions = outputHandle.ptr();
105 
106  // input disappearing track objects
107  auto DisTrkCandHandle = SG::makeHandle(m_DisTrkCandKey, context );
108  ATH_CHECK( DisTrkCandHandle.isValid() );
109  ATH_MSG_DEBUG( "DisTrkCand handle size: " << DisTrkCandHandle->size() );
110 
111  const xAOD::TrigCompositeContainer * disTrkCandContainer = DisTrkCandHandle.get();
112  if( disTrkCandContainer == nullptr ) {
113  ATH_MSG_ERROR( "ERROR Cannot get DisappearingTrks container" );
114  return StatusCode::FAILURE;
115  }
116 
117  // output EDM object
118  auto DisTrkBDTSelContainer = std::make_unique<xAOD::TrigCompositeContainer>();
119  auto DisTrkBDTSelContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
120  DisTrkBDTSelContainer->setStore(DisTrkBDTSelContainerAux.get());
121 
122  xAOD::TrigCompositeContainer* disTrkContainer = DisTrkBDTSelContainer.get();
123 
124  // Prepare inputs to HypoTool
125  ATH_CHECK( createCandidates(disTrkCandContainer, disTrkContainer) );
126 
127  std::vector<TrigDisappearingTrackHypoTool::DisTrkHypoInfo> disTrkHypoInputs;
128 
129  for ( auto distrk : *disTrkContainer ) {
130  Decision* newDecision = TrigCompositeUtils::newDecisionIn( outputDecisions, previousDecision, TrigCompositeUtils::hypoAlgNodeName(), context);
131 
133  ATH_CHECK( distrkEL.isValid() );
134 
135  ATH_CHECK( newDecision->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), distrkEL) );
136 
137  TrigDisappearingTrackHypoTool::DisTrkHypoInfo hypoInfo{ newDecision, distrk, previousDecisionIDs };
138  disTrkHypoInputs.push_back( hypoInfo );
139  }
140 
141  // Loop over all hypoToolinputs and get their decisions
142  for ( auto & tool: m_hypoTools ) {
143  ATH_MSG_VERBOSE( "+++++ Now computing decision for " << tool->name() );
144  ATH_CHECK( tool->decide( disTrkHypoInputs ) );
145  }
146 
147  DecisionContainer::iterator it = outputDecisions->begin();
148  while(it != outputDecisions->end()) {
149  ATH_MSG_VERBOSE( "+++++ outputDecision: " << *it << " +++++" );
150  if ( allFailed( *it ) ) {
151  ATH_MSG_VERBOSE( "---> all failed, erasing" );
152  it = outputDecisions->erase(it);
153  } else {
154  ATH_MSG_VERBOSE( "---> not all failed" );
155  ++it;
156  }
157  }
158 
159  // record
161  ATH_CHECK( DisTrkBDTSelHandle.record( std::move( DisTrkBDTSelContainer ), std::move( DisTrkBDTSelContainerAux ) ) );
162  ATH_MSG_VERBOSE( "recorded DisTrkBDTSel object to SG" );
163 
164  //
165  ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
166 
167  //
168  return StatusCode::SUCCESS;
169 }
170 
171 // ------------------------------------------------------------------------------------------------
172 // ------------------------------------------------------------------------------------------------
173 
175  xAOD::TrigCompositeContainer* disTrkBDTSelContainer) const
176 {
177  // monitoring
178  std::vector<int> mnt_category;
179  auto mon_category = Monitored::Collection("category", mnt_category);
180  auto monDisTrk = Monitored::Group(m_monTool, mon_category);
181 
182  std::vector<float> mnt_cat1_pt;
183  std::vector<float> mnt_cat1_z0;
184  std::vector<float> mnt_cat1_d0;
185  std::vector<float> mnt_cat1_iso01;
186  std::vector<float> mnt_cat1_iso0201;
187  std::vector<float> mnt_cat1_chi2ndof;
188  std::vector<float> mnt_cat1_chi2ndof_pix;
189  std::vector<float> mnt_cat1_refit_pt;
190  std::vector<int> mnt_cat1_n_pix;
191  std::vector<float> mnt_cat1_refit_ptratio;
192  std::vector<float> mnt_cat1_refit_chi2ndof;
193  std::vector<int> mnt_cat1_n_bl;
194  std::vector<float> mnt_cat1_bdtscore;
195  auto mon_cat1_pt = Monitored::Collection("pix4_sct0_pt", mnt_cat1_pt);
196  auto mon_cat1_z0 = Monitored::Collection("pix4_sct0_z0", mnt_cat1_z0);
197  auto mon_cat1_d0 = Monitored::Collection("pix4_sct0_d0", mnt_cat1_d0);
198  auto mon_cat1_iso01 = Monitored::Collection("pix4_sct0_iso01", mnt_cat1_iso01);
199  auto mon_cat1_iso0201 = Monitored::Collection("pix4_sct0_iso0201", mnt_cat1_iso0201);
200  auto mon_cat1_chi2ndof = Monitored::Collection("pix4_sct0_chi2ndof", mnt_cat1_chi2ndof);
201  auto mon_cat1_chi2ndof_pix = Monitored::Collection("pix4_sct0_chi2ndof_pix", mnt_cat1_chi2ndof_pix);
202  auto mon_cat1_refit_pt = Monitored::Collection("pix4_sct0_refit_pt", mnt_cat1_refit_pt);
203  auto mon_cat1_n_pix = Monitored::Collection("pix4_sct0_n_pix", mnt_cat1_n_pix);
204  auto mon_cat1_refit_ptratio = Monitored::Collection("pix4_sct0_refit_ptratio", mnt_cat1_refit_ptratio);
205  auto mon_cat1_refit_chi2ndof = Monitored::Collection("pix4_sct0_refit_chi2ndof", mnt_cat1_refit_chi2ndof);
206  auto mon_cat1_n_bl = Monitored::Collection("pix4_sct0_n_bl", mnt_cat1_n_bl);
207  auto mon_cat1_bdtscore = Monitored::Collection("pix4_sct0_bdtscore", mnt_cat1_bdtscore);
208  auto monDisTrkCat1 = Monitored::Group(m_monTool, mon_cat1_pt, mon_cat1_z0, mon_cat1_d0, mon_cat1_iso01, mon_cat1_iso0201, mon_cat1_chi2ndof,
209  mon_cat1_chi2ndof_pix, mon_cat1_refit_pt, mon_cat1_n_pix, mon_cat1_refit_ptratio,
210  mon_cat1_refit_chi2ndof, mon_cat1_n_bl, mon_cat1_bdtscore);
211  //
212  std::vector<float> mnt_cat2_pt;
213  std::vector<float> mnt_cat2_refit_pt;
214  std::vector<float> mnt_cat2_refit_z0;
215  std::vector<float> mnt_cat2_refit_d0;
216  std::vector<int> mnt_cat2_n_sct;
217  std::vector<float> mnt_cat2_refit_ptratio;
218  std::vector<float> mnt_cat2_refit_chi2ndof_ratio;
219  std::vector<float> mnt_cat2_iso01;
220  std::vector<float> mnt_cat2_iso0201;
221  std::vector<float> mnt_cat2_chi2ndof_pix;
222  std::vector<int> mnt_cat2_n_pix;
223  std::vector<float> mnt_cat2_bdtscore;
224  auto mon_cat2_pt = Monitored::Collection("pix4_sct1p_pt", mnt_cat2_pt);
225  auto mon_cat2_refit_pt = Monitored::Collection("pix4_sct1p_refit_pt", mnt_cat2_refit_pt);
226  auto mon_cat2_refit_z0 = Monitored::Collection("pix4_sct1p_refit_z0", mnt_cat2_refit_z0);
227  auto mon_cat2_refit_d0 = Monitored::Collection("pix4_sct1p_refit_d0", mnt_cat2_refit_d0);
228  auto mon_cat2_n_sct = Monitored::Collection("pix4_sct1p_n_sct", mnt_cat2_n_sct);
229  auto mon_cat2_refit_ptratio = Monitored::Collection("pix4_sct1p_refit_ptratio", mnt_cat2_refit_ptratio);
230  auto mon_cat2_refit_chi2ndof_ratio = Monitored::Collection("pix4_sct1p_refit_chi2ndof_ratio", mnt_cat2_refit_chi2ndof_ratio);
231  auto mon_cat2_iso01 = Monitored::Collection("pix4_sct1p_iso01", mnt_cat2_iso01);
232  auto mon_cat2_iso0201 = Monitored::Collection("pix4_sct1p_iso0201", mnt_cat2_iso0201);
233  auto mon_cat2_chi2ndof_pix = Monitored::Collection("pix4_sct1p_chi2ndof_pix", mnt_cat2_chi2ndof_pix);
234  auto mon_cat2_n_pix = Monitored::Collection("pix4_sct1p_n_pix", mnt_cat2_n_pix);
235  auto mon_cat2_bdtscore = Monitored::Collection("pix4_sct1p_bdtscore", mnt_cat2_bdtscore);
236  auto monDisTrkCat2 = Monitored::Group(m_monTool, mon_cat2_pt, mon_cat2_refit_pt, mon_cat2_refit_z0, mon_cat2_refit_d0, mon_cat2_n_sct,
237  mon_cat2_refit_ptratio, mon_cat2_refit_chi2ndof_ratio, mon_cat2_iso01, mon_cat2_iso0201,
238  mon_cat2_chi2ndof_pix, mon_cat2_n_pix, mon_cat2_bdtscore);
239  //
240  std::vector<float> mnt_cat3_pt;
241  std::vector<float> mnt_cat3_z0;
242  std::vector<float> mnt_cat3_d0;
243  std::vector<float> mnt_cat3_chi2ndof;
244  std::vector<float> mnt_cat3_chi2ndof_pix;
245  std::vector<float> mnt_cat3_iso01;
246  std::vector<float> mnt_cat3_iso0201;
247  std::vector<float> mnt_cat3_refit_pt;
248  std::vector<float> mnt_cat3_refit_z0;
249  std::vector<float> mnt_cat3_refit_d0;
250  std::vector<int> mnt_cat3_n_pix;
251  std::vector<int> mnt_cat3_n_bl;
252  std::vector<float> mnt_cat3_bdtscore;
253  auto mon_cat3_pt = Monitored::Collection("pix3_sct0_pt", mnt_cat3_pt);
254  auto mon_cat3_z0 = Monitored::Collection("pix3_sct0_z0", mnt_cat3_z0);
255  auto mon_cat3_d0 = Monitored::Collection("pix3_sct0_d0", mnt_cat3_d0);
256  auto mon_cat3_chi2ndof = Monitored::Collection("pix3_sct0_chi2ndof", mnt_cat3_chi2ndof);
257  auto mon_cat3_chi2ndof_pix = Monitored::Collection("pix3_sct0_chi2ndof_pix", mnt_cat3_chi2ndof_pix);
258  auto mon_cat3_iso01 = Monitored::Collection("pix3_sct0_iso01", mnt_cat3_iso01);
259  auto mon_cat3_iso0201 = Monitored::Collection("pix3_sct0_iso0201", mnt_cat3_iso0201);
260  auto mon_cat3_refit_pt = Monitored::Collection("pix3_sct0_refit_pt", mnt_cat3_refit_pt);
261  auto mon_cat3_refit_z0 = Monitored::Collection("pix3_sct0_refit_z0", mnt_cat3_refit_z0);
262  auto mon_cat3_refit_d0 = Monitored::Collection("pix3_sct0_refit_d0", mnt_cat3_refit_d0);
263  auto mon_cat3_n_pix = Monitored::Collection("pix3_sct0_n_pix", mnt_cat3_n_pix);
264  auto mon_cat3_n_bl = Monitored::Collection("pix3_sct0_n_bl", mnt_cat3_n_bl);
265  auto mon_cat3_bdtscore = Monitored::Collection("pix3_sct0_bdtscore", mnt_cat3_bdtscore);
266  auto monDisTrkCat3 = Monitored::Group(m_monTool, mon_cat3_pt, mon_cat3_z0, mon_cat3_d0, mon_cat3_chi2ndof, mon_cat3_chi2ndof_pix,
267  mon_cat3_iso01, mon_cat3_iso0201, mon_cat3_refit_pt, mon_cat3_refit_z0, mon_cat3_refit_d0,
268  mon_cat3_n_pix, mon_cat3_n_bl, mon_cat3_bdtscore);
269  //
270  std::vector<float> mnt_cat4_pt;
271  std::vector<float> mnt_cat4_z0;
272  std::vector<float> mnt_cat4_d0;
273  std::vector<float> mnt_cat4_refit_pt;
274  std::vector<float> mnt_cat4_refit_z0;
275  std::vector<float> mnt_cat4_refit_d0;
276  std::vector<int> mnt_cat4_n_pix;
277  std::vector<int> mnt_cat4_n_sct;
278  std::vector<float> mnt_cat4_refit_ptratio;
279  std::vector<int> mnt_cat4_n_bl;
280  std::vector<float> mnt_cat4_chi2ndof;
281  std::vector<float> mnt_cat4_iso01;
282  std::vector<float> mnt_cat4_iso0201;
283  std::vector<float> mnt_cat4_refit_chi2ndof;
284  std::vector<float> mnt_cat4_bdtscore;
285  auto mon_cat4_pt = Monitored::Collection("pix3_sct1p_pt", mnt_cat4_pt);
286  auto mon_cat4_z0 = Monitored::Collection("pix3_sct1p_z0", mnt_cat4_z0);
287  auto mon_cat4_d0 = Monitored::Collection("pix3_sct1p_d0", mnt_cat4_d0);
288  auto mon_cat4_refit_pt = Monitored::Collection("pix3_sct1p_refit_pt", mnt_cat4_refit_pt);
289  auto mon_cat4_refit_z0 = Monitored::Collection("pix3_sct1p_refit_z0", mnt_cat4_refit_z0);
290  auto mon_cat4_refit_d0 = Monitored::Collection("pix3_sct1p_refit_d0", mnt_cat4_refit_d0);
291  auto mon_cat4_n_pix = Monitored::Collection("pix3_sct1p_n_pix", mnt_cat4_n_pix);
292  auto mon_cat4_n_sct = Monitored::Collection("pix3_sct1p_n_sct", mnt_cat4_n_sct);
293  auto mon_cat4_refit_ptratio = Monitored::Collection("pix3_sct1p_refit_ptratio", mnt_cat4_refit_ptratio);
294  auto mon_cat4_n_bl = Monitored::Collection("pix3_sct1p_n_bl", mnt_cat4_n_bl);
295  auto mon_cat4_chi2ndof = Monitored::Collection("pix3_sct1p_chi2ndof", mnt_cat4_chi2ndof);
296  auto mon_cat4_iso01 = Monitored::Collection("pix3_sct1p_iso01", mnt_cat4_iso01);
297  auto mon_cat4_iso0201 = Monitored::Collection("pix3_sct1p_iso0201", mnt_cat4_iso0201);
298  auto mon_cat4_refit_chi2ndof = Monitored::Collection("pix3_sct1p_refit_chi2ndof", mnt_cat4_refit_chi2ndof);
299  auto mon_cat4_bdtscore = Monitored::Collection("pix3_sct1p_bdtscore", mnt_cat4_bdtscore);
300  auto monDisTrkCat4 = Monitored::Group(m_monTool, mon_cat4_pt, mon_cat4_z0, mon_cat4_d0, mon_cat4_refit_pt, mon_cat4_refit_z0, mon_cat4_refit_d0,
301  mon_cat4_n_pix, mon_cat4_n_sct, mon_cat4_refit_ptratio, mon_cat4_n_bl, mon_cat4_chi2ndof,
302  mon_cat4_iso01, mon_cat4_iso0201, mon_cat4_refit_chi2ndof, mon_cat4_bdtscore);
303 
304  //
305 
306  const std::string prefixIn = "disTrkCand";
307  const std::string prefixOut = "disTrk";
308 
309  unsigned int i_cand=0;
310 
311  for ( const xAOD::TrigComposite* cand : *disTrkCandContainer ) {
312 
313  ATH_MSG_VERBOSE("===== i_cand: " << i_cand++ << " =====" );
314 
315  // category
316  int category = (int)cand->getDetail<int16_t>(prefixIn+"_category");
317  if( category<=0 || category>=5 ) {
318  ATH_MSG_VERBOSE("category is out of range = " << category);
319  continue;
320  }
321  mnt_category.push_back(category);
322 
323  // get values
324  float ptGeV = cand->getDetail<float>(prefixIn+"_pt");
325  float refit_ptGeV = cand->getDetail<float>(prefixIn+"_refit_pt");
326  ptGeV /= Gaudi::Units::GeV;
327  refit_ptGeV /= Gaudi::Units::GeV;
328  int is_fail = (int)cand->getDetail<int16_t>(prefixIn+"_is_fail");
329  float d0_wrtVtx = cand->getDetail<float>(prefixIn+"_d0_wrtVtx");
330  float z0_wrtVtx = cand->getDetail<float>(prefixIn+"_z0_wrtVtx");
331  float chi2 = cand->getDetail<float>(prefixIn+"_chi2");
332  float ndof = cand->getDetail<float>(prefixIn+"_ndof");
333  float chi2ndof = ( std::abs(ndof) > 1e-4 ) ? chi2 / ndof : 20;
334  int n_hits_pix = (int)cand->getDetail<int16_t>(prefixIn+"_n_hits_pix");
335  int n_hits_sct = (int)cand->getDetail<int16_t>(prefixIn+"_n_hits_sct");
336  int n_hits_bl = (int)cand->getDetail<int16_t>(prefixIn+"_n_hits_innermost");
337  float iso3_dr01 = cand->getDetail<float>(prefixIn+"_iso3_dr01");
338  iso3_dr01 /= Gaudi::Units::GeV;
339  float iso3_dr02 = cand->getDetail<float>(prefixIn+"_iso3_dr02");
340  iso3_dr02 /= Gaudi::Units::GeV;
341  float refit_ptratio = ( std::abs(ptGeV) > 1e-4 ) ? refit_ptGeV / ptGeV : 0;
342  float refit_d0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_d0_wrtVtx");
343  float refit_z0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_z0_wrtVtx");
344  float refit_chi2 = cand->getDetail<float>(prefixIn+"_refit_chi2");
345  float refit_ndof = cand->getDetail<float>(prefixIn+"_refit_ndof");
346  float refit_chi2ndof = ( std::abs(refit_ndof) > 1e-4 ) ? refit_chi2 / refit_ndof : 20;
347  float refit_chi2ndof_ratio = (std::abs(chi2ndof) > 1e-4 ) ? refit_chi2ndof / chi2ndof : 0;
348  float chi2_pix=0; float ndof_pix=0;
349  chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_ibl");
350  chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix1");
351  chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix2");
352  chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix3");
353  ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_ibl");
354  ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix1");
355  ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix2");
356  ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix3");
357  float chi2ndof_pix = ( std::abs(ndof_pix) > 1e-4 ) ? chi2_pix / ndof_pix : 0;
358 
359  // BDT score
360  float bdt_score = 0.0;
361  if( category==1 ) {
362  bdt_score = bdt_eval_pix4l_sct0(ptGeV, z0_wrtVtx, d0_wrtVtx, iso3_dr01, iso3_dr02-iso3_dr01, chi2ndof, chi2ndof_pix,
363  refit_ptGeV, n_hits_pix, refit_ptratio, refit_chi2ndof, n_hits_bl);
364  mnt_cat1_pt.push_back(ptGeV);
365  mnt_cat1_z0.push_back(z0_wrtVtx);
366  mnt_cat1_d0.push_back(d0_wrtVtx);
367  mnt_cat1_iso01.push_back(iso3_dr01);
368  mnt_cat1_iso0201.push_back(iso3_dr02-iso3_dr01);
369  mnt_cat1_chi2ndof.push_back(chi2ndof);
370  mnt_cat1_chi2ndof_pix.push_back(chi2ndof_pix);
371  mnt_cat1_refit_pt.push_back(refit_ptGeV);
372  mnt_cat1_n_pix.push_back(n_hits_pix);
373  mnt_cat1_refit_ptratio.push_back(refit_ptratio);
374  mnt_cat1_refit_chi2ndof.push_back(refit_chi2ndof);
375  mnt_cat1_n_bl.push_back(n_hits_bl);
376  mnt_cat1_bdtscore.push_back(bdt_score);
377  }
378  else if( category==2 ) {
379  bdt_score = bdt_eval_pix4l_sct1p(ptGeV, refit_ptGeV, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_sct, refit_ptratio,
380  refit_chi2ndof_ratio, iso3_dr01, iso3_dr02-iso3_dr01, is_fail, chi2ndof_pix, n_hits_pix);
381  mnt_cat2_pt.push_back(ptGeV);
382  mnt_cat2_refit_pt.push_back(refit_ptGeV);
383  mnt_cat2_refit_z0.push_back(refit_z0_wrtVtx);
384  mnt_cat2_refit_d0.push_back(refit_d0_wrtVtx);
385  mnt_cat2_n_sct.push_back(n_hits_sct);
386  mnt_cat2_refit_ptratio.push_back(refit_ptratio);
387  mnt_cat2_refit_chi2ndof_ratio.push_back(refit_chi2ndof_ratio);
388  mnt_cat2_iso01.push_back(iso3_dr01);
389  mnt_cat2_iso0201.push_back(iso3_dr02-iso3_dr01);
390  mnt_cat2_chi2ndof_pix.push_back(chi2ndof_pix);
391  mnt_cat2_n_pix.push_back(n_hits_pix);
392  mnt_cat2_bdtscore.push_back(bdt_score);
393  }
394  else if( category==3 ) {
395  bdt_score = bdt_eval_pix3l_sct0(ptGeV, z0_wrtVtx, d0_wrtVtx, chi2ndof, chi2ndof_pix, iso3_dr01, iso3_dr02-iso3_dr01,
396  refit_ptGeV, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_bl);
397  mnt_cat3_pt.push_back(ptGeV);
398  mnt_cat3_z0.push_back(z0_wrtVtx);
399  mnt_cat3_d0.push_back(d0_wrtVtx);
400  mnt_cat3_chi2ndof.push_back(chi2ndof);
401  mnt_cat3_chi2ndof_pix.push_back(chi2ndof_pix);
402  mnt_cat3_iso01.push_back(iso3_dr01);
403  mnt_cat3_iso0201.push_back(iso3_dr02-iso3_dr01);
404  mnt_cat3_refit_pt.push_back(refit_ptGeV);
405  mnt_cat3_refit_z0.push_back(refit_z0_wrtVtx);
406  mnt_cat3_refit_d0.push_back(refit_d0_wrtVtx);
407  mnt_cat3_n_pix.push_back(n_hits_pix);
408  mnt_cat3_n_bl.push_back(n_hits_bl);
409  mnt_cat3_bdtscore.push_back(bdt_score);
410  }
411  else if( category==4 ) {
412  bdt_score = bdt_eval_pix3l_sct1p(ptGeV, z0_wrtVtx, d0_wrtVtx, refit_ptGeV, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_sct,
413  refit_ptratio, is_fail, n_hits_bl, chi2ndof, iso3_dr01, iso3_dr02-iso3_dr01, refit_chi2ndof);
414  mnt_cat4_pt.push_back(ptGeV);
415  mnt_cat4_z0.push_back(z0_wrtVtx);
416  mnt_cat4_d0.push_back(d0_wrtVtx);
417  mnt_cat4_refit_pt.push_back(refit_ptGeV);
418  mnt_cat4_refit_z0.push_back(refit_z0_wrtVtx);
419  mnt_cat4_refit_d0.push_back(refit_d0_wrtVtx);
420  mnt_cat4_n_pix.push_back(n_hits_pix);
421  mnt_cat4_n_sct.push_back(n_hits_sct);
422  mnt_cat4_refit_ptratio.push_back(refit_ptratio);
423  mnt_cat4_n_bl.push_back(n_hits_bl);
424  mnt_cat4_chi2ndof.push_back(chi2ndof);
425  mnt_cat4_iso01.push_back(iso3_dr01);
426  mnt_cat4_iso0201.push_back(iso3_dr02-iso3_dr01);
427  mnt_cat4_refit_chi2ndof.push_back(refit_chi2ndof);
428  mnt_cat4_bdtscore.push_back(bdt_score);
429  }
430  ATH_MSG_VERBOSE("BDT score = " << bdt_score);
431 
432  // preselection
433  const float PRESEL_PT_GEV = 7.5;
434  const float PRESEL_BDT_SCORE_CAT3 = -0.4;
435  const float PRESEL_BDT_SCORE_CAT4 = -0.2;
436  if( ptGeV < PRESEL_PT_GEV && refit_ptGeV < PRESEL_PT_GEV ) continue;
437  if( category==3 && bdt_score < PRESEL_BDT_SCORE_CAT3 ) continue;
438  if( category==4 && bdt_score < PRESEL_BDT_SCORE_CAT4 ) continue;
439 
440  // create EDM object
442  distrk->makePrivateStore();
443  disTrkBDTSelContainer->push_back(distrk);
444 
445  distrk->setDetail<int16_t>(prefixOut+"_category", (int16_t)category);
446  distrk->setDetail<float>(prefixOut+"_pt", ptGeV*Gaudi::Units::GeV);
447  float eta = cand->getDetail<float>(prefixIn+"_eta");
448  float phi = cand->getDetail<float>(prefixIn+"_phi");
449  distrk->setDetail<float>(prefixOut+"_eta", eta);
450  distrk->setDetail<float>(prefixOut+"_phi", phi);
451  distrk->setDetail<float>(prefixOut+"_refit_pt", refit_ptGeV*Gaudi::Units::GeV);
452  distrk->setDetail<int16_t>(prefixOut+"_is_fail", is_fail);
453  distrk->setDetail<float>(prefixOut+"_d0_wrtVtx", d0_wrtVtx);
454  distrk->setDetail<float>(prefixOut+"_z0_wrtVtx", z0_wrtVtx);
455  distrk->setDetail<float>(prefixOut+"_chi2", chi2);
456  distrk->setDetail<float>(prefixOut+"_ndof", ndof);
457  distrk->setDetail<int16_t>(prefixOut+"_n_hits_pix", (int16_t)n_hits_pix);
458  distrk->setDetail<int16_t>(prefixOut+"_n_hits_sct", (int16_t)n_hits_sct);
459  distrk->setDetail<int16_t>(prefixOut+"_n_hits_innermost", (int16_t)n_hits_bl);
460  distrk->setDetail<float>(prefixOut+"_iso3_dr01", iso3_dr01*Gaudi::Units::GeV);
461  distrk->setDetail<float>(prefixOut+"_iso3_dr02", iso3_dr02*Gaudi::Units::GeV);
462  distrk->setDetail<float>(prefixOut+"_refit_d0_wrtVtx", refit_d0_wrtVtx);
463  distrk->setDetail<float>(prefixOut+"_refit_z0_wrtVtx", refit_z0_wrtVtx);
464  distrk->setDetail<float>(prefixOut+"_refit_chi2", refit_chi2);
465  distrk->setDetail<float>(prefixOut+"_refit_ndof", refit_ndof);
466  distrk->setDetail<float>(prefixOut+"_chi2ndof_pix", chi2ndof_pix);
467  distrk->setDetail<float>(prefixOut+"_bdtscore", bdt_score);
468 
469  ATH_MSG_VERBOSE("Created a new entry EDM" );
470  }
471 
472  return StatusCode::SUCCESS;
473 }
474 
475 // ------------------------------------------------------------------------------------------------
476 // ------------------------------------------------------------------------------------------------
477 
478 inline float TrigDisappearingTrackHypoAlg::BDTinput(float var) const { return ( std::abs(var) < 1e-5 ) ? 1e-5 : var; }
479 
481 (float pt, float z0, float d0, float trkiso3_dr01, float trkiso3_dr0201, float chi2ndof, float chi2ndof_pix,
482  float refit_pt, int n_pix, float refit_ptratio, float refit_chi2ndof, int n_bl) const
483 {
484  const std::vector<float> input_values = {
485  BDTinput(pt),
486  BDTinput(z0),
487  BDTinput(d0),
488  BDTinput(trkiso3_dr01),
489  BDTinput(trkiso3_dr0201),
490  BDTinput(chi2ndof),
491  BDTinput(chi2ndof_pix),
492  BDTinput(refit_pt),
493  BDTinput((float)n_pix),
494  BDTinput(refit_ptratio),
495  BDTinput(refit_chi2ndof),
496  BDTinput((float)n_bl)
497  };
498 
499  return m_bdt[0]->GetClassification(input_values);
500 }
501 
503 (float pt, float refit_pt, float refit_z0, float refit_d0, int n_sct, float refit_ptratio,
504  float refit_chi2ndof_ratio, float trkiso3_dr01, float trkiso3_dr0201, int is_fail, float chi2ndof_pix, int n_pix) const
505 {
506  const std::vector<float> input_values = {
507  BDTinput(pt),
508  BDTinput(refit_pt),
509  BDTinput(refit_z0),
510  BDTinput(refit_d0),
511  BDTinput((float)n_sct),
512  BDTinput(refit_ptratio),
513  BDTinput(refit_chi2ndof_ratio),
514  BDTinput(trkiso3_dr01),
515  BDTinput(trkiso3_dr0201),
516  BDTinput((float)is_fail),
517  BDTinput(chi2ndof_pix),
518  BDTinput((float)n_pix)
519  };
520 
521  return m_bdt[1]->GetClassification(input_values);
522 }
523 
525 (float pt, float z0, float d0, float chi2ndof, float chi2ndof_pix, float trkiso3_dr01, float trkiso3_dr0201,
526  float refit_pt, float refit_z0, float refit_d0, int n_pix, int n_bl) const
527 {
528  const std::vector<float> input_values = {
529  BDTinput(pt),
530  BDTinput(z0),
531  BDTinput(d0),
532  BDTinput(chi2ndof),
533  BDTinput(chi2ndof_pix),
534  BDTinput(trkiso3_dr01),
535  BDTinput(trkiso3_dr0201),
536  BDTinput(refit_pt),
537  BDTinput(refit_z0),
538  BDTinput(refit_d0),
539  BDTinput((float)n_pix),
540  BDTinput((float)n_bl)
541  };
542 
543  return m_bdt[2]->GetClassification(input_values);
544 }
545 
547 (float pt, float z0, float d0, float refit_pt, float refit_z0, float refit_d0,
548  int n_pix, int n_sct, float refit_ptratio, int is_fail, int n_bl,
549  float chi2ndof, float trkiso3_dr01, float trkiso3_dr0201, float refit_chi2ndof) const
550 {
551  const std::vector<float> input_values = {
552  BDTinput(pt),
553  BDTinput(z0),
554  BDTinput(d0),
555  BDTinput(refit_pt),
556  BDTinput(refit_z0),
557  BDTinput(refit_d0),
558  BDTinput((float)n_pix),
559  BDTinput((float)n_sct),
560  BDTinput(refit_ptratio),
561  BDTinput((float)is_fail),
562  BDTinput((float)n_bl),
563  BDTinput(chi2ndof),
564  BDTinput(trkiso3_dr01),
565  BDTinput(trkiso3_dr0201),
566  BDTinput(refit_chi2ndof)
567  };
568 
569  return m_bdt[3]->GetClassification(input_values);
570 }
571 
572 // ------------------------------------------------------------------------------------------------
573 // ------------------------------------------------------------------------------------------------
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
PathResolver::find_calib_file
static std::string find_calib_file(const std::string &logical_file_name)
Definition: PathResolver.cxx:235
IDTPM::ndof
float ndof(const U &p)
Definition: TrackParametersHelper.h:134
beamspotnt.var
var
Definition: bin/beamspotnt.py:1393
xAOD::TrigComposite_v1::setDetail
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:18
TrigDefs::Group
Group
Properties of a chain group.
Definition: GroupProperties.h:13
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
TrigCompositeUtils::DecisionContainer
xAOD::TrigCompositeContainer DecisionContainer
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigCompositeContainer.h:21
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TrigDisappearingTrackHypoAlg::initialize
virtual StatusCode initialize() override
Definition: TrigDisappearingTrackHypoAlg.cxx:42
xAOD::TrigComposite
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h:16
TrigDisappearingTrackHypoAlg::createCandidates
StatusCode createCandidates(const xAOD::TrigCompositeContainer *, xAOD::TrigCompositeContainer *) const
Definition: TrigDisappearingTrackHypoAlg.cxx:174
TrigCompositeUtils::newDecisionIn
Decision * newDecisionIn(DecisionContainer *dc, const std::string &name)
Helper method to create a Decision object, place it in the container and return a pointer to it.
Definition: TrigCompositeUtilsRoot.cxx:43
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
TrigDisappearingTrackHypoAlg::m_DisTrkCandKey
SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey
Definition: TrigDisappearingTrackHypoAlg.h:35
TrigCompositeUtils::hypoAlgNodeName
const std::string & hypoAlgNodeName()
Definition: TrigCompositeUtilsRoot.cxx:919
tree
TChain * tree
Definition: tile_monitor.h:30
TrigDisappearingTrackHypoAlg.h
skel.it
it
Definition: skel.GENtoEVGEN.py:407
test_pyathena.pt
pt
Definition: test_pyathena.py:11
DataVector::get
const T * get(size_type n) const
Access an element, as an rvalue.
HypoBase::decisionInput
const SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > & decisionInput() const
methods for derived classes to access handles of the base class input other read/write handles may be...
Definition: HypoBase.cxx:16
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TrigDisappearingTrackHypoAlg::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
Definition: TrigDisappearingTrackHypoAlg.h:40
ViewHelper.h
TrigCompositeUtils::createAndStore
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
Definition: TrigCompositeUtilsRoot.cxx:27
xAOD::int16_t
setScaleOne setStatusOne setSaturated int16_t
Definition: gFexGlobalRoI_v1.cxx:55
HypoBase::decisionOutput
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutput() const
methods for derived classes to access handles of the base class output other read/write handles may b...
Definition: HypoBase.cxx:20
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
TrigDisappearingTrackHypoTool::DisTrkHypoInfo
Definition: TrigDisappearingTrackHypoTool.h:30
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
TrigDisappearingTrackHypoAlg::execute
virtual StatusCode execute(const EventContext &context) const override
Definition: TrigDisappearingTrackHypoAlg.cxx:82
TrigCompositeUtils.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
HypoBase::hypoBaseOutputProcessing
StatusCode hypoBaseOutputProcessing(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl=MSG::DEBUG) const
Base class function to be called once slice specific code has finished. Handles debug printing and va...
Definition: HypoBase.cxx:33
TrigDisappearingTrackHypoAlg::m_bdt
std::unique_ptr< MVAUtils::BDT > m_bdt[4]
Definition: TrigDisappearingTrackHypoAlg.h:50
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteHandle::ptr
pointer_type ptr()
Dereference the pointer.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ReweightUtils.category
category
Definition: ReweightUtils.py:15
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
TrigDisappearingTrackHypoAlg::BDTinput
float BDTinput(float) const
Definition: TrigDisappearingTrackHypoAlg.cxx:478
TrigDisappearingTrackHypoAlg::TrigDisappearingTrackHypoAlg
TrigDisappearingTrackHypoAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigDisappearingTrackHypoAlg.cxx:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
makeComparison.rootFile
rootFile
Definition: makeComparison.py:27
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct0
float bdt_eval_pix4l_sct0(float, float, float, float, float, float, float, float, int, float, float, int) const
Definition: TrigDisappearingTrackHypoAlg.cxx:481
xAOD::TrigComposite_v1
Class used to describe composite objects in the HLT.
Definition: TrigComposite_v1.h:52
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
Monitored.h
Header file to be included by clients of the Monitored infrastructure.
TrigCompositeUtils::DecisionAuxContainer
xAOD::TrigCompositeAuxContainer DecisionAuxContainer
Definition: TrigCompositeAuxContainer.h:20
TrigCompositeUtils::featureString
const std::string & featureString()
Definition: TrigCompositeUtilsRoot.cxx:899
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
HypoBase
Hypothesis algorithms take the output of reco algorithms and the decision from the preceeding InputMa...
Definition: HypoBase.h:13
TrigCompositeUtils::Decision
xAOD::TrigComposite Decision
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h:20
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::AuxElement::makePrivateStore
void makePrivateStore()
Create a new (empty) private store for this object.
Definition: AuxElement.cxx:192
TrigDisappearingTrackHypoAlg::m_hypoTools
ToolHandleArray< TrigDisappearingTrackHypoTool > m_hypoTools
Definition: TrigDisappearingTrackHypoAlg.h:34
TrigDisappearingTrackHypoAlg::m_DisTrkBDTSelKey
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_DisTrkBDTSelKey
Definition: TrigDisappearingTrackHypoAlg.h:36
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
TrigCompositeUtils::linkToPrevious
void linkToPrevious(Decision *d, const std::string &previousCollectionKey, size_t previousIndex)
Links to the previous object, location of previous 'seed' decision supplied by hand.
Definition: TrigCompositeUtilsRoot.cxx:139
TrigCompositeUtils::LinkInfo
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition: LinkInfo.h:28
TrigCompositeUtils::DecisionIDContainer
std::set< DecisionID > DecisionIDContainer
Definition: TrigComposite_v1.h:28
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
TrigCompositeUtils::findLink
LinkInfo< T > findLink(const Decision *start, const std::string &linkName, const bool suppressMultipleLinksWarning=false)
Perform a recursive search for ElementLinks of type T and name 'linkName', starting from Decision obj...
TrigCompositeUtils::allFailed
bool allFailed(const Decision *d)
return true if there is no positive decision stored
Definition: TrigCompositeUtilsRoot.cxx:103
TrigCompositeUtils::decisionIDs
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
Definition: TrigCompositeUtilsRoot.cxx:64
TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct1p
float bdt_eval_pix4l_sct1p(float, float, float, float, int, float, float, float, float, int, float, int) const
Definition: TrigDisappearingTrackHypoAlg.cxx:503
TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct0
float bdt_eval_pix3l_sct0(float, float, float, float, float, float, float, float, float, float, int, int) const
Definition: TrigDisappearingTrackHypoAlg.cxx:525
TrigCompositeUtils::viewString
const std::string & viewString()
Definition: TrigCompositeUtilsRoot.cxx:895
TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct1p
float bdt_eval_pix3l_sct1p(float, float, float, float, float, float, int, int, float, int, int, float, float, float, float) const
Definition: TrigDisappearingTrackHypoAlg.cxx:547
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37