ATLAS Offline Software
Loading...
Searching...
No Matches
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*/
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
82StatusCode 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
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
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
478inline 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// ------------------------------------------------------------------------------------------------
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
Header file to be included by clients of the Monitored infrastructure.
bool allFailed(const Decision *d)
return true if there is no positive decision stored
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DataModel_detail::iterator< DataVector > iterator
Definition DataVector.h:842
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:18
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:22
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:35
HypoBase(const std::string &name, ISvcLocator *pSvcLocator)
constructor, to be called by sub-class constructors
Definition HypoBase.cxx:12
Group of local monitoring quantities and retain correlation when filling histograms
static std::string find_calib_file(const std::string &logical_file_name)
void makePrivateStore()
Create a new (empty) private store for this object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &context) const override
StatusCode createCandidates(const xAOD::TrigCompositeContainer *, xAOD::TrigCompositeContainer *) const
SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey
float bdt_eval_pix4l_sct0(float, float, float, float, float, float, float, float, int, float, float, int) const
float bdt_eval_pix3l_sct1p(float, float, float, float, float, float, int, int, float, int, int, float, float, float, float) const
std::unique_ptr< MVAUtils::BDT > m_bdt[4]
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_DisTrkBDTSelKey
float bdt_eval_pix3l_sct0(float, float, float, float, float, float, float, float, float, float, int, int) const
float bdt_eval_pix4l_sct1p(float, float, float, float, int, float, float, float, float, int, float, int) const
TrigDisappearingTrackHypoAlg(const std::string &name, ISvcLocator *pSvcLocator)
ToolHandleArray< TrigDisappearingTrackHypoTool > m_hypoTools
ToolHandle< GenericMonitoringTool > m_monTool
bool setObjectLink(const std::string &name, const ElementLink< CONTAINER > &link)
Set the link to an object.
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
double chi2(TH1 *h0, TH1 *h1)
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
const std::string & viewString()
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.
const std::string & featureString()
xAOD::TrigCompositeAuxContainer DecisionAuxContainer
std::set< DecisionID > DecisionIDContainer
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
const std::string & hypoAlgNodeName()
void linkToPrevious(Decision *d, const std::string &previousCollectionKey, size_t previousIndex)
Links to the previous object, location of previous 'seed' decision supplied by hand.
bool allFailed(const Decision *d)
return true if there is no positive decision stored
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...
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition LinkInfo.h:22
TChain * tree