ATLAS Offline Software
Loading...
Searching...
No Matches
T_AnalysisConfig.h
Go to the documentation of this file.
1/* emacs: this is -*- c++ -*- */
10
11
12#ifndef TrigInDetAnalysisUtils_T_AnalysisConfig_H
13#define TrigInDetAnalysisUtils_T_AnalysisConfig_H
14
15#include <iostream>
16#include <sstream>
17#include <string>
18#include <map>
19
20#include "GaudiKernel/IToolSvc.h"
21#include "GaudiKernel/ITHistSvc.h"
22// #include "GaudiKernel/AlgFactory.h"
23
25
30
31
32// #include "TrigInDetAnalysisUtils/RoI.h"
33// #include "TrigInDetAnalysisUtils/Converter.h"
38
39#ifdef XAODTRACKING_TRACKPARTICLE_H
44#else
48#endif
49
50class MsgSvc;
51
52// class TrackAssociator;
53// class Converter;
54
55// class RoI;
56// class TrackFilter;
57
58template<class Provider>
60
61public:
62
63 // Full constructor: test/reference/selection
64 // - analysisInstanceName: the name of the analysis chain being created
65 // - xxxChainName: the name of the chain to be used as test/reference/selection; must be "StoreGate" in case of direct access to SG containers
66 // - xxxType: the type of tracks to be retrieved from the test/reference/selection chain or container
67 // - xxxKey: the key for tracks to be retrieved from the test/reference/selection chain or container
68 // - all standard operations are performed in loops over 0=test 1=reference 2=selection
69 T_AnalysisConfig(const std::string& analysisInstanceName,
70 const std::string& testChainName, const std::string& testType, const std::string& testKey,
71 const std::string& referenceChainName, const std::string& referenceType, const std::string& referenceKey,
72 const std::string& selectionChainName, const std::string& selectionType, const std::string& selectionKey,
73 TrackFilter* testFilter, TrackFilter* referenceFilter, TrackFilter* selectionFilter,
74 TrackAssociator* associator,
76 m_provider(0),
77 m_tdt(0),
78 m_analysisInstanceName(analysisInstanceName),
79 m_refChainName(referenceChainName),
80 m_refChainKey(referenceKey),
81 m_testChainName(testChainName),
82 m_testChainKey(testKey),
86 m_associator(associator),
88 m_mcTruth(false),
89 m_beamX(0),
90 m_beamY(0),
91 m_beamZ(0),
92 m_genericFlag(true),
93 m_releaseData(""),
94 m_keepAllEvents(false),
95 m_useHighestPT(false),
96 m_vtxIndex(-1),
97 m_filterOnRoi(true),
99 {
100 // Rearrange objects in vectors: chain names
101 std::vector<std::string> testChainNames; testChainNames.push_back(testChainName);
102 std::vector<std::string> referenceChainNames; referenceChainNames.push_back(referenceChainName);
103 std::vector<std::string> selectionChainNames; selectionChainNames.push_back(selectionChainName);
104 m_chainNames.push_back(testChainNames); m_chainNames.push_back(referenceChainNames); m_chainNames.push_back(selectionChainNames);
105 // Types
106 std::vector<std::string> testTypes; testTypes.push_back(testType);
107 std::vector<std::string> referenceTypes; referenceTypes.push_back(referenceType);
108 std::vector<std::string> selectionTypes; selectionTypes.push_back(selectionType);
109 m_types.push_back(testTypes); m_types.push_back(referenceTypes); m_types.push_back(selectionTypes);
110 // Keys
111 std::vector<std::string> testKeys; testKeys.push_back(testKey);
112 std::vector<std::string> referenceKeys; referenceKeys.push_back(referenceKey);
113 std::vector<std::string> selectionKeys; selectionKeys.push_back(selectionKey);
114 m_keys.push_back(testKeys); m_keys.push_back(referenceKeys); m_keys.push_back(selectionKeys);
115 // Filters
116 std::vector<TrackFilter*> testFilters; testFilters.push_back(testFilter);
117 std::vector<TrackFilter*> referenceFilters; referenceFilters.push_back(referenceFilter);
118 std::vector<TrackFilter*> selectionFilters; selectionFilters.push_back(selectionFilter);
119 m_filters.push_back(testFilters); m_filters.push_back(referenceFilters); m_filters.push_back(selectionFilters);
120 }
121
122
123 // Partial constructor: test/reference
124 // - analysisInstanceName: the name of the analysis chain being created
125 // - xxxChainName: the name of the chain to be used as test/reference; must be "StoreGate" in case of direct access to SG containers
126 // - xxxType: the type of tracks to be retrieved from the test/reference chain or container
127 // - xxxKey: the key for tracks to be retrieved from the test/reference chain or container
128 // - all standard operations are performed in loops over 0=test 1=reference 2=selection
129 T_AnalysisConfig(const std::string& analysisInstanceName,
130 const std::string& testChainName, const std::string& testType, const std::string& testKey,
131 const std::string& referenceChainName, const std::string& referenceType, const std::string& referenceKey,
132 TrackFilter* testFilter, TrackFilter* referenceFilter,
133 TrackAssociator* associator,
135 m_provider(0),
136 m_tdt(0),
137 m_analysisInstanceName(analysisInstanceName),
138 m_refChainName(referenceChainName),
139 m_refChainKey(referenceKey),
140 m_testChainName(testChainName),
141 m_testChainKey(testKey),
142 m_selectorRef(0),
144 m_selectorSel(0),
145 m_associator(associator),
147 m_mcTruth(false),
148 m_beamX(0),
149 m_beamY(0),
150 m_beamZ(0),
151 m_genericFlag(true),
152 m_releaseData(""),
153 m_keepAllEvents(false),
154 m_useHighestPT(false),
155 m_vtxIndex(-1),
156 m_filterOnRoi(true),
157 m_requireDecision(false)
158 {
159 // Rearrange objects in vectors: chain names
160 std::vector<std::string> testChainNames; testChainNames.push_back(testChainName);
161 std::vector<std::string> referenceChainNames; referenceChainNames.push_back(referenceChainName);
162 std::vector<std::string> selectionChainNames; selectionChainNames.push_back("NONE");
163 m_chainNames.push_back(testChainNames); m_chainNames.push_back(referenceChainNames); m_chainNames.push_back(selectionChainNames);
164 // Types
165 std::vector<std::string> testTypes; testTypes.push_back(testType);
166 std::vector<std::string> referenceTypes; referenceTypes.push_back(referenceType);
167 std::vector<std::string> selectionTypes; selectionTypes.push_back("");
168 m_types.push_back(testTypes); m_types.push_back(referenceTypes); m_types.push_back(selectionTypes);
169 // Keys
170 std::vector<std::string> testKeys; testKeys.push_back(testKey);
171 std::vector<std::string> referenceKeys; referenceKeys.push_back(referenceKey);
172 std::vector<std::string> selectionKeys; selectionKeys.push_back("");
173 m_keys.push_back(testKeys); m_keys.push_back(referenceKeys); m_keys.push_back(selectionKeys);
174 // Filters
175 std::vector<TrackFilter*> testFilters; testFilters.push_back(testFilter);
176 std::vector<TrackFilter*> referenceFilters; referenceFilters.push_back(referenceFilter);
177 std::vector<TrackFilter*> selectionFilters;
178 m_filters.push_back(testFilters); m_filters.push_back(referenceFilters); m_filters.push_back(selectionFilters);
179
180 // m_selectorRef = new TrigTrackSelector( referenceFilter );
181 // m_selectorTest = new TrigTrackSelector( testFilter );
182 }
183
184
185
186
187
188 // Destructor
190 // if ( m_selectorRef ) delete m_selectorRef;
191 // if ( m_selectorTest ) delete m_selectorTest;
192 // if ( m_selectorSel ) delete m_selectorSel;
193 // if ( m_analysis ) delete m_analysis;
194 }
195
196
197
198 // Configuration methods
199 void addTestChain(const std::string& chainName, const std::string& type, const std::string& key) {
200 m_chainNames[0].push_back(chainName); m_types[0].push_back(type); m_keys[0].push_back(key);
201 }
202
203 void addReferenceChain(const std::string& chainName, const std::string& type, const std::string& key) {
204 m_chainNames[1].push_back(chainName); m_types[1].push_back(type); m_keys[1].push_back(key);
205 }
206
207 void addSelectionChain(const std::string& chainName, const std::string& type, const std::string& key) {
208 m_chainNames[2].push_back(chainName); m_types[2].push_back(type); m_keys[2].push_back(key);
209 }
210
211 void addTestFilter(TrackFilter* filter) { m_filters[0].push_back(filter); }
212 void addReferenceFilter(TrackFilter* filter) { m_filters[1].push_back(filter); }
213 void addSelectionFilter(TrackFilter* filter) { m_filters[2].push_back(filter); }
214
215 // Initialize, execute and finalize generic methods
216 virtual void initialize(Provider* p, ToolHandle<Trig::TrigDecisionTool>* tdt ) {
217 m_provider = p;
218 m_tdt = tdt;
219 if ( m_tdt==0 ) m_analysis->initialise();
220
221 }
222
223
224
225 virtual void execute() {
226 if ( !m_provider ) std::cerr << "ERROR T_AnalysisConfig::execute() called without initialising" << std::endl;
227 loop();
228 }
229
230 virtual void finalize() { m_analysis->finalise(); }
231
232 virtual void book() { }
233
234 // Accessor methods
235 const std::string& name() const {return m_analysisInstanceName;}
236
237 const std::string testChains() const {
238 std::string name;
239 for(unsigned int i=0; i<m_chainNames[0].size(); i++)
240 name += (m_chainNames[0][i]+"::"+m_types[0][i]+"::"+m_keys[0][i]+" ");
241 return name;
242 }
243
244 const std::string referenceChains() const {
245 std::string name;
246 for(unsigned int i=0; i<m_chainNames[1].size(); i++)
247 name += (m_chainNames[1][i]+"::"+m_types[1][i]+"::"+m_keys[1][i]+" ");
248 return name;
249 }
250
251 const std::string selectionChains() const {
252 std::string name;
253 for(unsigned int i=0; i<m_chainNames[2].size(); i++)
254 name += (m_chainNames[2][i]+"::"+m_types[2][i]+"::"+m_keys[2][i]+" ");
255 return name;
256 }
257
258 const TrackAnalysis* analysis() const {return m_analysis;}
259
260 void setMCTruth(bool b=true) { m_mcTruth=b; }
261 bool mcTruth() const { return m_mcTruth; }
262
263 void setBeamX(double d) { m_beamX=d; }
264 void setBeamY(double d) { m_beamY=d; }
265 void setBeamZ(double d) { m_beamZ=d; }
266 double beamX() const { return m_beamX; }
267 double beamY() const { return m_beamY; }
268 double beamZ() const { return m_beamZ; }
269
270 bool genericFlag() const { return m_genericFlag; }
271 void setGenericFlag(bool b) { m_genericFlag=b; }
272
273 const std::string& releaseData() const { return m_releaseData; }
274 void releaseData(const std::string& s) { m_releaseData = s; }
275
276 void keepAllEvents( bool b ) { m_keepAllEvents = b; }
277
278 void setUseHighestPT( bool b ) { m_useHighestPT=b; }
279 bool getUseHighestPT() const { return m_useHighestPT; }
280
281 void setVtxIndex( int i ) { m_vtxIndex=i; }
282 int getVtxIndex() const { return m_vtxIndex; }
283
284 bool filterOnRoi() const { return m_filterOnRoi; }
285 bool setFilterOnRoi(bool b) { return m_filterOnRoi=b; }
286
288 bool requireDecision() const { return m_requireDecision; }
289
290protected:
291
292 virtual void loop() = 0;
293
294
296
297 template<class Collection>
298 std::pair< typename Collection::const_iterator, typename Collection::const_iterator >
300 const std::string& key="" ) {
301
304 // std::cout << "try " << key << "\t" << m_provider->evtStore()->template transientContains<Collection>(key) << std::endl;
305
308 std::string key_collection = key;
309 std::string key_tename = "";
310 size_t pos = key_collection.find("/");
311 if ( pos!=std::string::npos ) {
312 key_collection = key.substr( pos+1, key.size()-pos );
313 key_tename = key.substr( 0, pos );
314 }
315
316 std::pair< typename Collection::const_iterator,
317 typename Collection::const_iterator > itrpair;
318
319 SG::ReadHandle<Collection> handle(key);
320
321 CLID checkCLID;
322 const std::string* keyStr = m_provider->evtStore()->keyToString(roi_link.key(), checkCLID);
323 m_provider->msg(MSG::DEBUG) << "Requesting range over (" << key << ") associated to ROI from " << (keyStr == nullptr ? "UNKNOWN" : *keyStr) << endmsg;
324
325 itrpair = (*m_tdt)->associateToEventView( handle, roi_link );
326
327 return itrpair;
328 }
329
330
331
332
333
334
335
336
337
338
339
340
341
342 bool select( std::vector<TIDA::Vertex>& vertices,
345
346 xAOD::VertexContainer::const_iterator vtxitr = vtx_start;
347
348 for ( ; vtxitr!=vtx_end ; ++vtxitr ) {
349 if ( (*vtxitr)->vertexType()!=0 ) {
350 m_provider->msg(MSG::VERBOSE) << "\tvertex " << (*vtxitr)->z() << endmsg;
351
352 vertices.push_back( TIDA::Vertex( (*vtxitr)->x(),
353 (*vtxitr)->y(),
354 (*vtxitr)->z(),
356 (*vtxitr)->covariancePosition()(Trk::x,Trk::x),
357 (*vtxitr)->covariancePosition()(Trk::y,Trk::y),
358 (*vtxitr)->covariancePosition()(Trk::z,Trk::z),
359 (*vtxitr)->nTrackParticles(),
361 (*vtxitr)->chiSquared(),
362 (*vtxitr)->numberDoF() ) );
363
364 }
365 }
366
367 return true;
368 }
369
370
371 bool select( std::vector<TIDA::Vertex>& vertices,
373 const std::string& key="" ) {
374
375 m_provider->msg(MSG::VERBOSE) << "\tFetch xAOD::VertexContainer for key: " << key << endmsg;
376
378 xAOD::VertexContainer::const_iterator > vtx_itrpair = this->template getCollection<xAOD::VertexContainer>( roi_link, key );
379
380 if ( vtx_itrpair.first == vtx_itrpair.second ) {
381 m_provider->msg(MSG::WARNING) << "\tNo xAOD::Vertex collection for key " << key << endmsg;
382 return false;
383 }
384
385 m_provider->msg(MSG::DEBUG) << "\txAOD::VertexContainer found with size " << (vtx_itrpair.second - vtx_itrpair.first)
386 << "\t:" << key << endmsg;
387
388 return select( vertices, vtx_itrpair.first, vtx_itrpair.second );
389 }
390
391
392
393
394 bool select( std::vector<TIDA::Vertex>& vertices, const std::string& key="" ) {
395
396 m_provider->msg(MSG::VERBOSE) << "fetching AOD vertex container" << endmsg;
397
398 const xAOD::VertexContainer* xaodVtxCollection = 0;
399
400 if ( retrieve( xaodVtxCollection, key ).isFailure()) {
401 m_provider->msg(MSG::WARNING) << "xAOD vertex container not found with key " << key << endmsg;
402 return false;
403 }
404
405 if ( xaodVtxCollection!=0 ) {
406
407 m_provider->msg(MSG::VERBOSE) << "xAOD vertex container " << xaodVtxCollection->size() << " entries" << endmsg;
408
409 return select( vertices, xaodVtxCollection->begin(), xaodVtxCollection->end() );
410
411#if 0
412
413 xAOD::VertexContainer::const_iterator vtxitr = xaodVtxCollection->begin();
414
415 for ( ; vtxitr != xaodVtxCollection->end(); vtxitr++ ) {
416 if ( (*vtxitr)->nTrackParticles()>0 && (*vtxitr)->vertexType()!=0 ) {
417 vertices.push_back( TIDA::Vertex( (*vtxitr)->x(),
418 (*vtxitr)->y(),
419 (*vtxitr)->z(),
421 (*vtxitr)->covariancePosition()(Trk::x,Trk::x),
422 (*vtxitr)->covariancePosition()(Trk::y,Trk::y),
423 (*vtxitr)->covariancePosition()(Trk::z,Trk::z),
424 (*vtxitr)->nTrackParticles(),
426 (*vtxitr)->chiSquared(),
427 (*vtxitr)->numberDoF() ) );
428 }
429 }
430
431#endif
432
433 }
434
435 return true;
436 }
437
438
439
440 template<class Collection>
442 // const TrigCompositeUtils::LinkInfo<TrigRoiDescriptorCollection> roi_link,
444 const std::string& key="" ) {
445
446
449 // std::cout << "try " << key << "\t" << m_provider->evtStore()->template transientContains<Collection>(key) << std::endl;
450
453 std::string key_collection = key;
454 std::string key_tename = "";
455 size_t pos = key_collection.find("/");
456 if ( pos!=std::string::npos ) {
457 key_collection = key.substr( pos+1, key.size()-pos );
458 key_tename = key.substr( 0, pos );
459 }
460
461 std::pair< typename Collection::const_iterator,
462 typename Collection::const_iterator > itrpair;
463
464 SG::ReadHandle<Collection> handle(key);
465
466 CLID checkCLID;
467 const std::string* keyStr = m_provider->evtStore()->keyToString(roi_link.key(), checkCLID);
468 m_provider->msg(MSG::DEBUG) << "Requesting range over (" << key << ") associated to ROI from " << (keyStr == nullptr ? "UNKNOWN" : *keyStr) << endmsg;
469
470 itrpair = (*m_tdt)->associateToEventView( handle, roi_link );
471
472 if ( itrpair.first != itrpair.second ) {
473 selector->selectTracks( itrpair.first, itrpair.second );
474 return true;
475 }
476 else {
477 m_provider->msg(MSG::DEBUG) << "TDT TrackFeature collection (" << key << ") is empty " << endmsg;
478 return false;
479 }
480 }
481
482
483
485
486 template<class Collection>
487 bool selectTracks( TrigTrackSelector* selector, Trig::FeatureContainer::combination_const_iterator citr, const std::string& key="" ) {
488
489 // std::cout << "try " << key << "\t" << m_provider->evtStore()->template transientContains<Collection>(key) << std::endl;
490
491 std::string key_collection = key;
492 std::string key_tename = "";
493 size_t pos = key_collection.find("/");
494 if ( pos!=std::string::npos ) {
495 key_collection = key.substr( pos+1, key.size()-pos );
496 key_tename = key.substr( 0, pos );
497 }
498
499 std::vector< Trig::Feature<Collection> > trackcollections = citr->get<Collection>( key_collection, TrigDefs::alsoDeactivateTEs, key_tename );
500 if ( !trackcollections.empty() ) {
501 // NB!! a combination should never have more than one entry for a track collection from a single algorithm, for single object triggers
502 for ( unsigned ifeat=0 ; ifeat<trackcollections.size() ; ifeat++ ) {
503 Trig::Feature<Collection> trackfeature = trackcollections.at(ifeat);
504 if ( !trackfeature.empty() ) {
505 // actually select the tracks from this roi at last!!
506 const Collection* trigtracks = trackfeature.cptr();
507 selector->selectTracks( trigtracks );
508 }
509 }
510 return true;
511 }
512 else {
513 m_provider->msg(MSG::DEBUG) << "TDT TrackFeature collection (" << key << ") is empty " << endmsg;
514 return false;
515 }
516 }
517
518
522 template<class Collection>
523 bool selectTracks( TrigTrackSelector* selector, Trig::FeatureContainer::combination_const_iterator citr, const TrigInDetTrackTruthMap* truthmap, const std::string& key="", unsigned index=0 ) {
524
525 // std::cout << "try " << key << "\t" << m_provider->evtStore()->template transientContains<Collection>(key) << std::endl;
526
527 std::vector< Trig::Feature<Collection> > trackcollections = citr->get<Collection>( key, TrigDefs::alsoDeactivateTEs );
528 if ( !trackcollections.empty() ) {
529
530 const HLT::NavigationCore* nc = (*m_tdt)->ExperimentalAndExpertMethods().getNavigation();
531
532 // NB!! a combination should never have more than one entry for a track collection from a single algorithm,
533 // if ( trackcollections.size()>1 ) std::cerr << "SUTT OH NO!!!!!!!!" << endmsg;
534 // maybe a bit dodgy, if we really do have multiple objects returned, but that should only be for
535 // multiple object triggers - then probably none of this would work anyhow
536 for ( unsigned ifeat=0 ; ifeat<trackcollections.size() ; ifeat++ ) {
537 // std::cout << "selectTracks() ifeat=" << ifeat << "\tkey " << key << "\t(truthmap)" << std::endl;
538 Trig::Feature<Collection> trackfeature = trackcollections.at(ifeat);
539
541 const HLT::TriggerElement* te = trackfeature.te();
542
544 std::vector< const Collection* > collectionVector;
545 if ( !const_cast<HLT::NavigationCore *>(nc)->getFeatures( te, collectionVector, key ) ) return false;
546
547 // std::cout << "foundok " << foundok << "\tsize " << collectionVector.size() << std::endl;
548
550
551 for ( unsigned iv=collectionVector.size() ; iv-- ; ) {
555 if ( index!=iv ) continue;
557 // m_provider->msg(MSG::DEBUG) << "TDT TrackFeature->size() " << collectionVector[iv]->size() << " (" << key << ")" << endmsg;
558 selector->selectTracks( collectionVector[iv], truthmap );
559 break;
560 }
561 }
562 return true;
563 }
564 else {
565 m_provider->msg(MSG::DEBUG) << "TDT TrackFeature collection (" << key << ") is empty" << endmsg;
566 return false;
567 }
568 }
569
570
571
572 template<class Collection>
573 StatusCode retrieve( Collection const*& collection, const std::string& key="" ) {
576 if ( m_provider->evtStore()->template contains<Collection>( key ) ) {
577 SG::ReadHandle<Collection> handle(key);
578 if ( handle.isValid() ) {
581 collection = handle.cptr();
582 return StatusCode::SUCCESS;
583 }
584 }
585 return StatusCode::FAILURE;
586 }
587
588
589
590 template<class Collection>
591 bool selectTracks( TrigTrackSelector* selector, const std::string& key ) {
592 if ( key!="" ) {
593 SG::ReadHandle<Collection> handle(key);
594 if ( handle.isValid() ) {
596 // std::cout << "\t\t\t T_AnalysisConfig::selectTracks() - > TrackSelector" << std::endl;
597 selector->selectTracks( handle.cptr() );
598 return true;
599 }
600 }
601 return false;
602 }
603
604
605
606
607 template<class Collection>
608 bool selectTracksNotEmpty( TrigTrackSelector* selector, const std::string& key ) {
609 const Collection* collection = nullptr;
610 if ( key.empty() ) return false;
611 if ( !m_provider->evtStore()->template contains<Collection>( key ) ) return false;
612
613 StatusCode sc = retrieve( collection, key );
614
615 if ( !( sc.isSuccess() && collection ) ) return false;
616
617 m_provider->msg(MSG::DEBUG) << "SG Collection->size() " << collection->size() << " (" << key << ")" << endmsg;
618
619 // added to fix muon samples bug
620 if ( collection->size() == 0 ) {
621 m_provider->msg(MSG::WARNING) << "no particles in collection" << endmsg;
622 return false;
623 }
624
625 selector->selectTracks( collection );
626 return true;
627 }
628
629
630
631
632
633 template<class Collection>
634 std::vector<double> getBeamspot( const std::string& key ) {
635 const Collection* collection = 0;
636 std::vector<double> v;
637
638 if ( key!="" ) {
639 if ( m_provider->evtStore()->template contains<Collection>( key ) ) {
640 StatusCode sc = retrieve( collection, key );
641 if( sc.isSuccess() && collection ) {
642 m_provider->msg(MSG::DEBUG) << "SG Collection->size() " << collection->size() << " (" << key << ")" << endmsg;
643
644 typename Collection::const_iterator trackitr = collection->begin();
645 typename Collection::const_iterator trackend = collection->end();
646 if ( trackitr!=trackend ) {
647 v.resize(3);
648 v[0] = (*trackitr)->vx();
649 v[1] = (*trackitr)->vy();
650 v[2] = (*trackitr)->vz();
651 return v;
652 } // only need to look at the first track
653 }
654 }
655 }
656 return v;
657 }
658
659
660
661
662 template<class Collection>
663 std::vector<double> getBeamspot( Trig::FeatureContainer::combination_const_iterator citr, const std::string& key="" ) {
664 std::vector< Trig::Feature<Collection> > trackcollections = citr->get<Collection>( key, TrigDefs::alsoDeactivateTEs );
665 std::vector<double> v;
666 if ( !trackcollections.empty() ) {
667 // NB!! a combination should never have more than one entry for a track collection from a single algorithm,
668 // if ( trackcollections.size()>1 ) std::cerr << "SUTT OH NO!!!!!!!!" << endmsg;
669 for ( unsigned ifeat=0 ; ifeat<trackcollections.size() ; ifeat++ ) {
670 // std::cout << "selectTracks() ifeat=" << ifeat << "\tkey " << key << std::endl;
671 Trig::Feature<Collection> trackfeature = trackcollections.at(ifeat);
672 if ( !trackfeature.empty() ) {
673 // m_provider->msg(MSG::DEBUG) << "TDT TrackFeature->size() " << trackfeature.cptr()->size() << " (" << key << ")" << endmsg;
674 // actually select the tracks from this roi at last!!
675 const Collection* trigtracks = trackfeature.cptr();
676
677 typename Collection::const_iterator trackitr = trigtracks->begin();
678 typename Collection::const_iterator trackend = trigtracks->end();
679 if ( trackitr!=trackend ) {
680 v.resize(3);
681 v[0] = (*trackitr)->vx();
682 v[1] = (*trackitr)->vy();
683 v[2] = (*trackitr)->vz();
684 return v;
685 } // only need to look at the first track
686 }
687 }
688 return v;
689 }
690 else {
691 m_provider->msg(MSG::DEBUG) << "TDT TrackFeature collection (" << key << ") is empty " << endmsg;
692 return v;
693 }
694 }
695
696
697
698
699
703 unsigned processElectrons( TrigTrackSelector& selectorRef,
704 std::vector<TrackTrigObject>* elevec=0,
705 const unsigned int selection=0,
706 bool raw_track=false,
707 double ETOffline=0,
708# ifdef XAODTRACKING_TRACKPARTICLE_H
709 const std::string& containerName = "Electrons"
710# else
711 const std::string& containerName = "ElectronAODCollection"
712# endif
713 ) {
714
715 m_provider->msg(MSG::DEBUG) << "Fetching offline electrons: " << containerName << endmsg;
716
717 selectorRef.clear();
718
719# ifdef XAODTRACKING_TRACKPARTICLE_H
721# else
723# endif
724
725
726 const Container* container = 0;
727
728 if( ! m_provider->evtStore()->template contains<Container>(containerName) ) {
729 m_provider->msg(MSG::WARNING) << "Error No Electron Container " << containerName << " !" << endmsg;
730 return 0;
731 }
732
733 StatusCode sc = retrieve( container, containerName);
734 if( sc.isFailure() || !container ) {
735 m_provider->msg(MSG::WARNING) << "Error retrieving container: " << containerName << " !" << endmsg;
736 return 0;
737 }
738
739 m_provider->msg(MSG::DEBUG) << "Event with " << container->size() << " Electron object(s) " << endmsg;
740
741 Container::const_iterator elec = container->begin();
742 Container::const_iterator elec_end = container->end();
743
744 for( ; elec!=elec_end ; ++elec ){
745 //m_provider->msg(MSG::DEBUG) << " Electron " << (*elec)
746 // << ", eta " << (*elec)->eta()
747 // << ", phi " << (*elec)->phi()
748 // << ", ET " << (*elec)->pt()
749 // << ", author " << (*elec)->author()
750 // << ", trackParticle " << (*elec)->trackParticle()
751 // << ", conversion " << (*elec)->conversion()
752 // << ", mediumPP " << ((*elec)->isem(egammaPID::ElectronMediumPP)==0)
753 // << endmsg;
754
755 bool good_electron = false;
756# ifdef XAODTRACKING_TRACKPARTICLE_H
757 good_electron = TIDA::isGoodOffline( *(*elec), selection, ETOffline );
758# else
759 good_electron = TIDA::isGoodOffline( *(*elec));
760# endif
761
762 if (good_electron) {
763 const xAOD::Electron_v1& eleduff = *(*elec);
764 long unsigned eleid = (unsigned long)(&eleduff) ;
765 TrackTrigObject eleobj = TrackTrigObject( (*elec)->eta(),
766 (*elec)->phi(),
767 (*elec)->pt(),
768 0,
769 (*elec)->type(),
770 eleid );
771
772 bool trk_added ;
773 if ( raw_track ) trk_added = selectorRef.selectTrack( xAOD::EgammaHelpers::getOriginalTrackParticle( *elec ) );
774 else trk_added = selectorRef.selectTrack( (*elec)->trackParticle() );
775
776 if (trk_added) eleobj.addChild( selectorRef.tracks().back()->id() );
777 if (elevec) elevec->push_back( eleobj );
778 }
779 }
780
781 return selectorRef.tracks().size();
782 }
783
784
785
789 unsigned processMuons( TrigTrackSelector& selectorRef, const unsigned int selection=0,
790 double ETOffline=0,
791# ifdef XAODTRACKING_TRACKPARTICLE_H
792 const std::string& containerName = "Muons"
793# else
794 const std::string& containerName = "StacoMuonCollection"
795# endif
796 ) {
797
798# ifdef XAODTRACKING_TRACKPARTICLE_H
800# else
802# endif
803
804 m_provider->msg(MSG::DEBUG) << " Offline muons (" << containerName << ")" << endmsg;
805
806 selectorRef.clear();
807
808 const Container* container = 0;
809
810 if( ! m_provider->evtStore()->template contains<Container>(containerName) ) {
811 m_provider->msg(MSG::WARNING) << "Error No MuonCollection" << containerName << " !" << endmsg;
812 return 0;
813 }
814
815 StatusCode sc = retrieve( container, containerName );
816 if( sc.isFailure() || !container ) {
817 m_provider->msg(MSG::WARNING) << "Error retrieving " << containerName << " !" << endmsg;
818 return 0;
819 }
820
821 auto muon = container->begin();
822 auto muon_end = container->end();
823
824 // std::cout << "SUTT Offline muons " << container->size() << "\t threshold " << ETOffline << std::endl;
825
826 for( ; muon!=muon_end ; ++muon ){
827# ifdef XAODTRACKING_TRACKPARTICLE_H
828 if ( TIDA::isGoodOffline(*(*muon), selection, ETOffline ) ) selectorRef.selectTrack(*((*muon)->inDetTrackParticleLink()));
829# else
830 if ( TIDA::isGoodOffline(*(*muon)) ) selectorRef.selectTrack((*muon)->inDetTrackParticle());
831# endif
832 }
833
834
835 // std::cout << "SUTT found " << selectorRef.tracks().size() << " muons for " << containerName << std::endl;
836 m_provider->msg(MSG::DEBUG) << "found " << selectorRef.tracks().size() << " muons for " << containerName << endmsg;
837
838 return selectorRef.tracks().size();
839}
840
841
842
846unsigned processTaus( TrigTrackSelector& selectorRef,
847 std::vector<TrackTrigObject>* tauvec=0,
848 const unsigned selection=0,
849 int requireNtracks=0,
850 double EtCutOffline=0,
851# ifdef XAODTRACKING_TRACKPARTICLE_H
852 const std::string& containerName = "TauJets"
853# else
854 const std::string& containerName = "TauRecContainer"
855# endif
856 ) {
857
858# ifdef XAODTRACKING_TRACKPARTICLE_H
860# else
862# endif
863
864 selectorRef.clear();
865
866 const Container* container = 0;
867
868 selectorRef.clear();
869
870 m_provider->msg(MSG::DEBUG) << " Offline taus " << containerName << endmsg;
871
872 if ( !m_provider->evtStore()->template contains<Container>(containerName)) {
873 m_provider->msg(MSG::WARNING) << " Offline taus not found" << endmsg;
874 return 0;
875 }
876
877 StatusCode sc = retrieve( container, containerName);
878 if (sc != StatusCode::SUCCESS) {
879 m_provider->msg(MSG::WARNING) << " Offline tau retrieval not successful" << endmsg;
880 return 0;
881 }
882
883 Container::const_iterator tau = container->begin();
884 Container::const_iterator tau_end = container->end();
885
886
887 for ( ; tau!=tau_end ; ++tau ) {
888
889# ifdef XAODTRACKING_TRACKPARTICLE_H
890 // unsigned N = (*tau)->nTracks();
891
892# ifndef XAODTAU_VERSIONS_TAUJET_V3_H
893 int N = (*tau)->nTracks();
894 // std::cout << "SUTT no tau detail " << N << "\t3prong: " << doThreeProng << std::endl;
895# else
896 int N=0;
897 (*tau)->detail( xAOD::TauJetParameters::nChargedTracks, N );
898 // std::cout << "SUTT tau detail: N " << N << "\t3prong: " << doThreeProng << std::endl;
899# endif
900
901# else
902 unsigned N = (*tau)->numTrack();
903# endif
904
905
906 bool good_tau = false;
907# ifdef XAODTRACKING_TRACKPARTICLE_H
908 good_tau = TIDA::isGoodOffline( *(*tau), selection, requireNtracks, EtCutOffline );
909# else
910 good_tau = TIDA::isGoodOffline( *(*tau), requireNtracks, EtCutOffline );
911# endif
912
913 // std::cout << "SUTT tau ntracks: " << N << "\tgoodtau: " << good_tau << "\tpt: " << (*tau)->p4().Et() << "\t3prong: " << doThreeProng << std::endl;
914
915 if (good_tau){
916 const xAOD::TauJet_v3& duff = *(*tau);
917 long unsigned tauid = (unsigned long)(&duff) ;
918 TrackTrigObject tauobj = TrackTrigObject( (*tau)->eta(),
919 (*tau)->phi(),
920 (*tau)->pt(),
921 0,
922 (*tau)->type(),
923 tauid );
924
925 bool trk_added = false;
926
927 for ( unsigned i=N ; i-- ; ) {
928# ifdef XAODTAU_TAUTRACK_H
929
930 std::vector< ElementLink<xAOD::TrackParticleContainer> > alink = (*tau)->track(i)->trackLinks();
931
932 trk_added = false;
933
934 for ( size_t ilink=0 ; ilink<alink.size() ; ilink++ ) {
935 if ( alink[ilink].isValid() ) trk_added = selectorRef.selectTrack((*alink[ilink]));
936 }
938 // trk_added = selectorRef.selectTrack((*tau)->track(i)->track());
940# else
941 trk_added = selectorRef.selectTrack((*tau)->track(i));
942# endif
943 if ( trk_added ) tauobj.addChild( selectorRef.tracks().back()->id() );
944 }
945 if ( tauvec ) tauvec->push_back( tauobj );
946 }
947 }
948
949 return selectorRef.tracks().size();
950
951}
952
953protected:
954
955 // Athena tools
956
957 Provider* m_provider;
958
959 ToolHandle<Trig::TrigDecisionTool>* m_tdt;
960
961 // TrigInDetAnalysis tools
962 // Converter* m_converter;
963
964 // Analysis instance name
966
967 // Chain info
968 std::vector< std::vector<std::string> > m_chainNames;
969 std::vector< std::vector<std::string> > m_types;
970 std::vector< std::vector<std::string> > m_keys;
971
972 std::string m_refChainName;
973 std::string m_refChainKey;
974
975 std::string m_testChainName;
976 std::string m_testChainKey;
977
978 // Analysis tools
979 std::vector< std::vector<TrackFilter*> > m_filters;
980
984
987
989
991
993 std::string m_releaseData;
994
996
998
1000
1002
1004
1005};
1006
1007//}
1008
1009
1010#endif // TrigInDetAnalysisUtils_T_AnalysisConfig_H
#define endmsg
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
uint32_t CLID
The Class ID type.
static Double_t sc
TIDA::Associator< TIDA::Track > TrackAssociator
base class for a single track selection filter allowing parameter setting for complex track selection
definition of StoreGate container holding a vector of Analysis::Muon
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
The NavigationCore class, adds on top of the TrigNavStructure the EDM read-only handling.
TriggerElement is the basic ingreedient of the interface between HLT algorithms and the navigation It...
storage of the time histories of all the cells
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
double beamX() const
std::pair< typename Collection::const_iterator, typename Collection::const_iterator > getCollection(const ElementLink< TrigRoiDescriptorCollection > &roi_link, const std::string &key="")
new MT feature access
const TrackAnalysis * analysis() const
bool setFilterOnRoi(bool b)
unsigned processElectrons(TrigTrackSelector &selectorRef, std::vector< TrackTrigObject > *elevec=0, const unsigned int selection=0, bool raw_track=false, double ETOffline=0, const std::string &containerName="ElectronAODCollection")
select offline electrons
const std::string referenceChains() const
void setRequireDecision(bool b)
std::vector< std::vector< std::string > > m_chainNames
int getVtxIndex() const
TrackAnalysis * m_analysis
bool select(std::vector< TIDA::Vertex > &vertices, const std::string &key="")
bool requireDecision() const
const std::string & name() const
void addSelectionChain(const std::string &chainName, const std::string &type, const std::string &key)
bool select(std::vector< TIDA::Vertex > &vertices, const ElementLink< TrigRoiDescriptorCollection > &roi_link, const std::string &key="")
void addTestChain(const std::string &chainName, const std::string &type, const std::string &key)
void setBeamY(double d)
void setVtxIndex(int i)
std::vector< std::vector< std::string > > m_types
virtual void finalize()
bool filterOnRoi() const
bool getUseHighestPT() const
bool selectTracks(TrigTrackSelector *selector, Trig::FeatureContainer::combination_const_iterator citr, const TrigInDetTrackTruthMap *truthmap, const std::string &key="", unsigned index=0)
NB: because we want to use this for the L2Star chains, we have to use this method,...
std::string m_releaseData
TrigTrackSelector * m_selectorTest
TrigTrackSelector * m_selectorSel
std::string m_analysisInstanceName
bool selectTracks(TrigTrackSelector *selector, const ElementLink< TrigRoiDescriptorCollection > &roi_link, const std::string &key="")
std::string m_testChainKey
bool selectTracks(TrigTrackSelector *selector, const std::string &key)
std::vector< std::vector< TrackFilter * > > m_filters
void setGenericFlag(bool b)
void keepAllEvents(bool b)
void setBeamZ(double d)
void addReferenceFilter(TrackFilter *filter)
bool selectTracks(TrigTrackSelector *selector, Trig::FeatureContainer::combination_const_iterator citr, const std::string &key="")
lagacy run 2 access
void addReferenceChain(const std::string &chainName, const std::string &type, const std::string &key)
void setUseHighestPT(bool b)
void addTestFilter(TrackFilter *filter)
std::string m_testChainName
void releaseData(const std::string &s)
TrigTrackSelector * m_selectorRef
unsigned processTaus(TrigTrackSelector &selectorRef, std::vector< TrackTrigObject > *tauvec=0, const unsigned selection=0, int requireNtracks=0, double EtCutOffline=0, const std::string &containerName="TauRecContainer")
select offline taus
unsigned processMuons(TrigTrackSelector &selectorRef, const unsigned int selection=0, double ETOffline=0, const std::string &containerName="StacoMuonCollection")
select offlinqe muons
double beamZ() const
void setBeamX(double d)
virtual void initialize(Provider *p, ToolHandle< Trig::TrigDecisionTool > *tdt)
T_AnalysisConfig(const std::string &analysisInstanceName, const std::string &testChainName, const std::string &testType, const std::string &testKey, const std::string &referenceChainName, const std::string &referenceType, const std::string &referenceKey, TrackFilter *testFilter, TrackFilter *referenceFilter, TrackAssociator *associator, TrackAnalysis *analysis)
const std::string selectionChains() const
virtual void loop()=0
StatusCode retrieve(Collection const *&collection, const std::string &key="")
std::string m_refChainName
std::vector< double > getBeamspot(Trig::FeatureContainer::combination_const_iterator citr, const std::string &key="")
std::vector< double > getBeamspot(const std::string &key)
void setMCTruth(bool b=true)
ToolHandle< Trig::TrigDecisionTool > * m_tdt
std::string m_refChainKey
T_AnalysisConfig(const std::string &analysisInstanceName, const std::string &testChainName, const std::string &testType, const std::string &testKey, const std::string &referenceChainName, const std::string &referenceType, const std::string &referenceKey, const std::string &selectionChainName, const std::string &selectionType, const std::string &selectionKey, TrackFilter *testFilter, TrackFilter *referenceFilter, TrackFilter *selectionFilter, TrackAssociator *associator, TrackAnalysis *analysis)
double beamY() const
bool genericFlag() const
const std::string testChains() const
void addSelectionFilter(TrackFilter *filter)
bool selectTracksNotEmpty(TrigTrackSelector *selector, const std::string &key)
virtual ~T_AnalysisConfig()
TrackAssociator * m_associator
bool select(std::vector< TIDA::Vertex > &vertices, xAOD::VertexContainer::const_iterator vtx_start, xAOD::VertexContainer::const_iterator vtx_end)
virtual void book()
virtual void execute()
const std::string & releaseData() const
std::vector< std::vector< std::string > > m_keys
void addChild(unsigned long id)
bool selectTrack(const TrigInDetTrack *track, const TrigInDetTrackTruthMap *truthMap=0)
neater code to make use of vector function also for a single ancestor pdgid, instead of the full code...
virtual void clear() override
std::vector< Combination >::const_iterator combination_const_iterator
is basic vehicle of object access in TDT
Definition Feature.h:112
const T * cptr() const
explicit conversion to object
Definition Feature.h:171
const HLT::TriggerElement * te() const
explicit conversion to TriggerElement
Definition Feature.h:181
bool empty() const
test method to check if the object is truly there
Definition Feature.h:197
Class describing a tau jet.
Definition TauJet_v3.h:41
const std::string selection
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
bool isGoodOffline(const Analysis::Electron &elec)
@ x
Definition ParamDefs.h:55
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ y
Definition ParamDefs.h:56
Definition index.py:1
const xAOD::TrackParticle * getOriginalTrackParticle(const xAOD::Electron *el)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the electron.
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".