ATLAS Offline Software
Loading...
Searching...
No Matches
T_AnalysisConfigMT_Tier0.h
Go to the documentation of this file.
1/* emacs: this is -*- c++ -*- */
22
23#ifndef TrigInDetAnalysisExample_T_AnalysisConfigMT_Tier0_H
24#define TrigInDetAnalysisExample_T_AnalysisConfigMT_Tier0_H
25
31
37
38#include "TTree.h"
39#include "TFile.h"
40
41#include "GaudiKernel/ToolHandle.h"
43
44
45// McParticleEvent includes
47
49#include "AtlasHepMC/GenEvent.h"
52
54
55
56
58
60
66
67
68
70
72
74
76
77
80
81// #include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
82
85
87
88
89
90
91
92template<typename T, typename A=Analysis_Tier0>
94
95public:
96
97 // Full constructor: test/reference/selection
98 // - analysisInstanceName: the name of the analysis chain being created
99 // - xxxChainName: the name of the chain to be used as test/reference/selection; must be "StoreGate" in case of direct access to SG containers
100 // - xxxType: the type of tracks to be retrieved from the test/reference/selection chain or container
101 // - xxxKey: the key for tracks to be retrieved from the test/reference/selection chain or container
102 // - all standard operations are performed in loops over 0=test 1=reference 2=selection
103 T_AnalysisConfigMT_Tier0(const std::string& analysisInstanceName,
104 const std::string& testChainName, const std::string& testType, const std::string& testKey,
105 const std::string& referenceChainName, const std::string& referenceType, const std::string& referenceKey,
106 TrackFilter* testFilter, TrackFilter* referenceFilter,
107 TrackAssociator* associator,
109 TagNProbe* TnP_tool = 0) :
110 T_AnalysisConfig<T>( analysisInstanceName,
111 testChainName, testType, testKey,
112 referenceChainName, referenceType, referenceKey,
113 testFilter, referenceFilter,
114 associator,
115 analysis),
116 _analysis(0),
117 m_useBeamCondSvc(false),
118 m_doOffline(true),
119 m_doMuons(false),
120 m_doElectrons(false),
121 m_doTaus(false),
122 m_doBjets(false),
123 m_hasTruthMap(false),
124 m_doTauThreeProng(false),
125 m_tauEtCutOffline(false),
126 m_NRois(0),
127 m_NRefTracks(0),
128 m_NTestTracks(0),
129 m_runPurity(false),
130 m_shifter(false),
131 m_pTthreshold(0),
132 m_first(true),
133 m_containTracks(false),
134 m_TnP_tool(TnP_tool),
135 m_invmass(0),
136 m_invmass_obj(0),
137 m_monTool(0)
138 {
140 m_event = new TIDA::Event();
141 m_chainNames.push_back(testChainName);
142
143#if 0
144 ChainString& chain = m_chainNames.back();
145
146 std::cout << "\nT_AnalysisConfigMT_Tier0::name: " << name() << "\t" << this << std::endl;
147 std::cout << "T_AnalysisConfigMT_Tier0::chain specification: " << testChainName << " -> " << chain << "\t" << chain.raw() << std::endl;
148 std::cout << "\tchain: " << chain.head() << std::endl;
149 std::cout << "\tkey: " << chain.tail() << std::endl;
150 std::cout << "\troi: " << chain.roi() << std::endl;
151 std::cout << "\tvtx: " << chain.vtx() << std::endl;
152 std::cout << "\tte: " << chain.element() << std::endl;
153
154 std::cout << "\tpost: " << chain.post() << std::endl;
155 std::cout << "\tpt: " << chain.postvalue("pt") << std::endl;
156
157 std::cout << "\tcontainTracks: " << m_containTracks << std::endl;
158#endif
159
160 m_testType = testType;
161 }
162
164 delete m_event;
165 if ( m_TnP_tool != 0 ) delete m_TnP_tool ;
166 }
167
168 void setRunPurity( bool b ) { m_runPurity=b; }
169
170 void setShifter( bool b ) { m_shifter=b; }
171
172 void useBeamCondSvc( bool b ) { m_useBeamCondSvc = b; }
173
174 void containTracks( bool b ) { m_containTracks = b; }
175
176public:
177
179
180protected:
181
185
186 using T_AnalysisConfig<T>::name;
188
193
194
195 virtual void loop() {
196
197 bool TnP_flag = (m_TnP_tool != 0) ; // flag for tag and probe analysis
198
199 if( m_provider->msg().level() <= MSG::VERBOSE) {
200 m_provider->msg(MSG::VERBOSE) << "AnalysisConfigMT_Tier0::loop() for " << T_AnalysisConfig<T>::m_analysisInstanceName << endmsg;
201 }
202
203 // get (offline) beam position
204 double xbeam = 0;
205 double ybeam = 0;
206
207 if ( m_first ) {
208
209 m_first = false;
210
211 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
212 m_provider->msg(MSG::VERBOSE) << " using beam position\tx=" << xbeam << "\ty=" << ybeam << endmsg;
213
214 std::vector<std::string> configuredChains = (*(m_tdt))->getListOfTriggers("L2_.*, EF_.*, HLT_.*");
215
216 for ( unsigned i=0 ; i<configuredChains.size() ; i++ ) {
217 // std::cout << "Configured chain " << configuredChains[i] << std::endl;
218 m_provider->msg(MSG::VERBOSE) << "Chain " << configuredChains[i] << endmsg;
219 }
220 }
221
222 // std::cout << "\tloop() analyse chains " << m_chainNames.size() << std::endl;
223
224 std::vector<ChainString>::iterator chainitr = m_chainNames.begin();
225
226 std::vector<ChainString> chains;
227
231 while ( chainitr!=m_chainNames.end() ) {
232
234 ChainString& chainName = (*chainitr);
235
236 if (m_provider->msg().level() <= MSG::VERBOSE) {
237 m_provider->msg(MSG::VERBOSE) << "process chain " << chainName << endmsg;
238 }
239
240 if ( chainName.head() == "" ) {
241
242 std::string selectChain = chainName.raw();
243
244 chains.push_back( ChainString(selectChain) );
245
246 }
247 else {
248
250 std::vector<std::string> selectChains = (*(m_tdt))->getListOfTriggers( chainName.head() );
251
252 for ( unsigned iselected=0 ; iselected<selectChains.size() ; iselected++ ) {
253
254 selectChains[iselected] = chainName.subs( selectChains[iselected] );
255
256#if 0
257 std::cout << "sorting:: chain specification: " << chainName << "\traw:" << chainName.raw() << std::endl;
258 std::cout << "\tchain: " << chainName.head() << std::endl;
259 std::cout << "\tkey: " << chainName.tail() << std::endl;
260 std::cout << "\tind: " << chainName.extra() << std::endl;
261 std::cout << "\troi: " << chainName.roi() << std::endl;
262 std::cout << "\tvtx: " << chainName.vtx() << std::endl;
263 std::cout << "\tte: " << chainName.element() << std::endl;
264#endif
265
267 chains.push_back( ChainString(selectChains[iselected]) );
268
269 if(m_provider->msg().level() <= MSG::VERBOSE) {
270 m_provider->msg(MSG::VERBOSE) << "Matching chain " << selectChains[iselected] << " (" << chainName.head() << ")" << endmsg;
271 }
272
273 // std::cout<< "\tMatching chain " << sc << " (" << chainName.head() << ")" << std::endl;
274
275 }
276 }
277
278 ++chainitr;
279 }
280
281 // m_chainNames.insert( m_chainNames.end(), chains.begin(), chains.end() );
282 m_chainNames = chains;
283
284 if(m_provider->msg().level() <= MSG::VERBOSE) {
285 for ( size_t ic=m_chainNames.size() ; ic-- ; ) m_provider->msg(MSG::VERBOSE) << "Analyse chain " << m_chainNames[ic] << endmsg;
286 }
287
288 }
289
290 // std::cout << "\tloop() event analysis ..." << std::endl;
291
293 Filter_True filter;
294
295 Filter_etaPT filter_etaPT(5,200);
296 Filter_Combined filter_truth( &filter_etaPT, &filter_etaPT);
297
299 // Filter_Combined filterRef (&filter_offline, &filter_vertex);
300
301 int iRefFilter = 1;
302 int iTestFilter = 0;
303
304 if ( m_runPurity ) {
305 iRefFilter = 0;
306 iTestFilter = 1;
307 }
308
309 Filter_Combined filterRef( m_filters[iRefFilter][0], &filter );
310 Filter_Combined filterTest( m_filters[iTestFilter][0], &filter );
311
312
313 TrigTrackSelector selectorTruth( &filter_truth );
314 TrigTrackSelector selectorRef( &filterRef );
315 m_selectorRef = &selectorRef;
316 TrigTrackSelector selectorTest( &filterTest );
317 m_selectorTest = &selectorTest;
318
319 if ( xbeam!=0 || ybeam!=0 ) {
320 m_selectorRef->setBeamline( xbeam, ybeam );
321 }
322
324
325 // clear the ntuple TIDA::Event class
326 m_event->clear();
327
329
330 const xAOD::EventInfo* pEventInfo;
331
332 unsigned run_number = 0;
333 unsigned long long event_number = 0;
334 unsigned lumi_block = 0;
335 unsigned bunch_crossing_id = 0;
336 unsigned time_stamp = 0;
337 double mu_val = 0;
338
339 // std::cout << "\tloop() get EventInfo" << std::endl;
340
341 if ( this->template retrieve(pEventInfo, "EventInfo").isFailure() ) {
342 m_provider->msg(MSG::WARNING) << "Failed to get EventInfo " << endmsg;
343 } else {
344
345 run_number = pEventInfo->runNumber();
346 event_number = pEventInfo->eventNumber();
347 lumi_block = pEventInfo->lumiBlock();
348 time_stamp = pEventInfo->timeStamp();
349 bunch_crossing_id = pEventInfo->bcid();
350 mu_val = pEventInfo->averageInteractionsPerCrossing();
351 }
352
353 if(m_provider->msg().level() <= MSG::VERBOSE){
354 m_provider->msg(MSG::VERBOSE) << "run " << run_number
355 << "\tevent " << event_number
356 << "\tlb " << lumi_block << endmsg;
357 }
358
359 // m_provider->msg(MSG::INFO) << "run " << run_number
360 // << "\tevent " << event_number
361 // << "\tlb " << lumi_block << endmsg;
362
363 // std::cout << "\trun " << run_number << "\tevent " << event_number << "\tlb " << lumi_block << std::endl;
364
365
366 // clear the ntuple TIDA::Event class
367 m_event->clear();
368
369 m_event->run_number(run_number);
370 m_event->event_number(event_number);
371 m_event->lumi_block(lumi_block);
372 m_event->time_stamp(time_stamp);
373 m_event->bunch_crossing_id(bunch_crossing_id);
374 m_event->mu(mu_val);
375
378
379 bool analyse = false;
380
381 // Check HLTResult
382
383 // std::cout << "\tloop() loop over trigger chains to determine whether to process this event ..." << std::endl;
384
385 for ( unsigned ichain=0 ; ichain<m_chainNames.size() ; ichain++ ) {
386
387 const std::string& chainname = m_chainNames[ichain].head();
388
389 if ( chainname == "" ) analyse = true;
390 else {
391
392 //Only for trigger chains
393 if ( chainname.find("L2") == std::string::npos &&
394 chainname.find("EF") == std::string::npos &&
395 chainname.find("HLT") == std::string::npos ) continue;
396
397 if ( m_provider->msg().level() <= MSG::DEBUG ) {
398 m_provider->msg(MSG::DEBUG) << "Chain " << chainname
399 << "\tpass " << (*m_tdt)->isPassed(chainname)
400 << "\tpres " << (*m_tdt)->getPrescale(chainname) << endmsg;
401 }
402
403 // std::cout << "\tChain " << chainname << "\tpass " << (*m_tdt)->isPassed(chainname)
404 // << "\tpres " << (*m_tdt)->getPrescale(chainname) << std::endl;
405
406 if ( (*(m_tdt))->isPassed(chainname) || (*(m_tdt))->getPrescale(chainname) ) analyse = true;
407
408 }
409 }
410
411
412 // if ( (*m_tdt)->ExperimentalAndExpertMethods().isHLTTruncated() ) {
413 // m_provider->msg(MSG::WARNING) << "HLTResult truncated, skipping event" << endmsg;
414 // return;
415 // }
416
417 if ( !this->m_keepAllEvents && !analyse ) {
418 // m_provider->msg(MSG::VERBOSE) << "No chains passed unprescaled - not processing this event" << endmsg;
419 if(m_provider->msg().level() <= MSG::VERBOSE) {
420 m_provider->msg(MSG::VERBOSE) << "No chains passed unprescaled - not processing this event" << endmsg;
421 }
422 // std::cout << "\tNo chains passed unprescaled - not processing this event" << std::endl;
423 return;
424 }
425
426
427
429
430 selectorTruth.clear();
431
432
433
434 if(m_provider->msg().level() <= MSG::VERBOSE)
435 m_provider->msg(MSG::VERBOSE) << "MC Truth flag " << m_mcTruth << endmsg;
436
437 const TrigInDetTrackTruthMap* truthMap = 0;
438
439 if ( m_mcTruth ) {
440 if(m_provider->msg().level() <= MSG::VERBOSE ) m_provider->msg(MSG::VERBOSE) << "getting Truth" << endmsg;
441
442 if ( this->template retrieve(truthMap, "TrigInDetTrackTruthMap").isFailure()) {
443 if(m_provider->msg().level() <= MSG::VERBOSE)
444 m_provider->msg(MSG::VERBOSE) << "TrigInDetTrackTruthMap not found" << endmsg;
445 m_hasTruthMap = false;
446 }
447 else {
448 if(m_provider->msg().level() <= MSG::VERBOSE)
449 m_provider->msg(MSG::VERBOSE) << "TrigInDetTrackTruthMap found" << endmsg;
450 m_hasTruthMap = true;
451 }
452 }
453
454
456
457 std::vector<TIDA::Vertex> vertices;
458 std::vector<TIDA::Vertex> vertices_rec;
459
460 std::vector<double> refbeamspot;
461 std::vector<double> testbeamspot;
462
464
465 m_provider->msg(MSG::VERBOSE) << "fetching AOD Primary vertex container" << endmsg;
466
467 if ( !this->select( vertices, "PrimaryVertices" ) ) {
468 m_provider->msg(MSG::VERBOSE) << "could not retrieve vertex collection " "PrimaryVertices" << std::endl;
469 }
470
472
473 if ( m_mcTruth ) {
474 m_event->addChain( "Truth" );
475 m_event->back().addRoi(TIDARoiDescriptor());
476 m_event->back().back().addTracks(selectorTruth.tracks());
477 }
478
480
481 if ( m_doOffline ) {
482 for ( unsigned i=0 ; i<vertices.size() ; i++ ) {
483 if(m_provider->msg().level() <= MSG::VERBOSE)
484 m_provider->msg(MSG::VERBOSE) << "vertex " << i << " " << vertices[i] << endmsg;
485 m_event->addVertex(vertices[i]);
486 }
487 }
488
490
491 // int Noff = 0;
492 std::vector<TIDA::Track*> offline_tracks;
493 std::vector<TIDA::Track*> electron_tracks;
494 std::vector<TIDA::Track*> muon_tracks;
495
496 std::vector<TIDA::Track*> ref_tracks;
497 std::vector<TIDA::Track*> test_tracks;
498
499 offline_tracks.clear();
500 electron_tracks.clear();
501 muon_tracks.clear();
502
503 ref_tracks.clear();
504 test_tracks.clear();
505
506 // offline track retrieval now done once for each chain rather than each roi
507 if ( m_provider->msg().level() <= MSG::VERBOSE )
508 m_provider->msg(MSG::VERBOSE) << "MC Truth flag " << m_mcTruth << endmsg;
509
510 bool foundTruth = false;
511
512 if ( !m_doOffline && m_mcTruth ) {
513
514 filter_truth.setRoi( 0 ); // don't filter on RoI yet (or until needed)
515
516 selectorTruth.clear();
517
518 if ( m_provider->msg().level() <= MSG::VERBOSE )
519 m_provider->msg(MSG::VERBOSE) << "getting Truth" << endmsg;
520
521 if ( m_provider->evtStore()->template contains<TruthParticleContainer>("INav4MomTruthEvent") ) {
522 //ESD
523 this->template selectTracks<TruthParticleContainer>( &selectorTruth, "INav4MomTruthEvent" );
524 foundTruth = true;
525 }
526 else if ( m_provider->evtStore()->template contains<TruthParticleContainer>("SpclMC") ) {
528 this->template selectTracks<TruthParticleContainer>( &selectorTruth, "SpclMC");
529 foundTruth = true;
530 }
531 else if ( m_provider->evtStore()->template contains<xAOD::TruthParticleContainer>("TruthParticles") ) {
533 this->template selectTracks<xAOD::TruthParticleContainer>( &selectorTruth, "TruthParticles");
534 foundTruth = true;
535 }
536 else if ( m_provider->evtStore()->template contains<TruthParticleContainer>("") ) {
538 this->template selectTracks<TruthParticleContainer>( &selectorTruth, "");
539 foundTruth = true;
540 }
541 else
542 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
543 m_provider->msg(MSG::VERBOSE) << "Truth not found - none whatsoever!" << endmsg;
544 }
545 }
546
547 if ( !m_doOffline && m_mcTruth && !foundTruth ) {
548
549 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
550 m_provider->msg(MSG::VERBOSE) << "getting Truth" << endmsg;
551 }
552
554
555 const DataHandle<McEventCollection> mcevent;
556
558
559 std::string keys[4] = { "GEN_AOD", "TruthEvent", "", "G4Truth" };
560
561 std::string key = "";
562
563 bool foundcollection = false;
564
565 for ( int ik=0 ; ik<4 ; ik++ ) {
566
567 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
568 m_provider->msg(MSG::VERBOSE) << "Try McEventCollection: " << keys[ik] << endmsg;
569 }
570
571 if ( !m_provider->evtStore()->template contains<McEventCollection>(keys[ik]) ) {
572 if( m_provider->msg().level() <= MSG::VERBOSE )
573 m_provider->msg(MSG::VERBOSE) << "No McEventCollection: " << keys[ik] << endmsg;
574 continue;
575 }
576
577 if ( m_provider->msg().level() <= MSG::VERBOSE )
578 m_provider->msg(MSG::VERBOSE) << "evtStore()->retrieve( mcevent, " << keys[ik] << " )" << endmsg;
579
580 if ( this->template retrieve( mcevent, keys[ik] ).isFailure() ) {
581 if ( m_provider->msg().level() <= MSG::VERBOSE )
582 m_provider->msg(MSG::VERBOSE) << "Failed to get McEventCollection: " << keys[ik] << endmsg;
583 }
584 else {
586 key = keys[ik];
587 if(m_provider->msg().level() <= MSG::VERBOSE)
588 m_provider->msg(MSG::VERBOSE) << "Found McEventCollection: " << key << endmsg;
589 foundcollection = true;
590 break;
591 }
592 }
593
595 if ( !foundcollection ) {
596 if(m_provider->msg().level() <= MSG::VERBOSE)
597 m_provider->msg(MSG::WARNING) << "No MC Truth Collections of any sort, whatsoever!!!" << endmsg;
598
599 // m_tree->Fill();
600 // return StatusCode::FAILURE;
601
602 return;
603 }
604
605 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
606 m_provider->msg(MSG::VERBOSE) << "Found McEventCollection: " << key << "\tNevents " << mcevent->size() << endmsg;
607 }
608
609 McEventCollection::const_iterator evitr = mcevent->begin();
610 McEventCollection::const_iterator evend = mcevent->end();
611
612 unsigned ie = 0;
613 unsigned ip = 0;
614
615 unsigned ie_ip = 0;
616
617 while ( evitr!=evend ) {
618
619 int _ip = 0;
620
621 int pid = HepMC::signal_process_id((*evitr));
622
623 //The logic should be clarified here
624 if ( pid!=0 ) {
625
626 for (auto pitr: *(*evitr) ) {
627
628 selectorTruth.selectTrack( pitr );
629
630 ++_ip;
631
632 }
633
634 }
635 ++ie;
636 ++evitr;
637
638 if ( _ip>0 ) {
640 // m_provider->msg(MSG::VERBOSE) << "Found " << ie << "\tpid " << pid << "\t with " << ip << " TruthParticles (GenParticles)" << endmsg;
641 ++ie_ip;
642 ip += _ip;
643 }
644 }
645
646 if(m_provider->msg().level() <= MSG::VERBOSE){
647 m_provider->msg(MSG::VERBOSE) << "Found " << ip << " TruthParticles (GenParticles) in " << ie_ip << " GenEvents out of " << ie << endmsg;
648 m_provider->msg(MSG::VERBOSE) << "selected " << selectorTruth.size() << " TruthParticles (GenParticles)" << endmsg;
649 }
650
651 if(selectorTruth.size() > 0) foundTruth = true;
652
653 if ( !(ip>0) ) {
654 if (m_provider->msg().level() <= MSG::VERBOSE) m_provider->msg(MSG::WARNING) << "NO TRUTH PARTICLES - returning" << endmsg;
655 return;
656 }
657
658 }
659
660 // m_provider->msg(MSG::VERBOSE) << " Offline tracks " << endmsg;
661
662 if ( m_doOffline ) {
663
664 if ( m_provider->evtStore()->template contains<xAOD::TrackParticleContainer>("InDetTrackParticles") ) {
665 this->template selectTracks<xAOD::TrackParticleContainer>( m_selectorRef, "InDetTrackParticles" );
666 refbeamspot = this->template getBeamspot<xAOD::TrackParticleContainer>( "InDetTrackParticles" );
667 }
668 else if (m_provider->evtStore()->template contains<Rec::TrackParticleContainer>("TrackParticleCandidate") ) {
669 this->template selectTracks<Rec::TrackParticleContainer>( m_selectorRef, "TrackParticleCandidate" );
670 }
671 else if ( m_provider->msg().level() <= MSG::WARNING ) {
672 m_provider->msg(MSG::WARNING) << " Offline tracks not found " << endmsg;
673 }
674
675 }
676
677
678 // std::cout << "\tloop() loop over chains proper ..." << std::endl;
679
681 for ( unsigned ichain=0 ; ichain<m_chainNames.size() ; ichain++ ) {
682
684
685 // std::string& chainname = chains[ichain];
686 const std::string& chainname = m_chainNames[ichain].head();
687 const std::string& key = m_chainNames[ichain].tail();
688 const std::string& vtx_name = m_chainNames[ichain].vtx();
689 //Not used left just in case
690 //const std::string& roi_name = m_chainNames[ichain].roi();
691 //const std::string& te_name = m_chainNames[ichain].element();
692 m_pTthreshold = 0;
693
694 if ( m_chainNames[ichain].postcount() ) {
695 std::string ptvalue = m_chainNames[ichain].postvalue("pt");
696 if ( ptvalue!="" ) m_pTthreshold = std::stod(ptvalue);
697 }
698
699
700 unsigned _decisiontype = TrigDefs::Physics;
701 unsigned decisiontype;
702
703 if ( this->requireDecision() ) _decisiontype = TrigDefs::requireDecision;
704
705
706 if ( m_chainNames[ichain].passed() ) decisiontype = _decisiontype;
707 else decisiontype = TrigDefs::alsoDeactivateTEs;
708
710 // if ( decisiontype==TrigDefs::requireDecision ) std::cout << "\tSUTT TrigDefs::requireDecision " << decisiontype << std::endl;
711 // if ( decisiontype==TrigDefs::Physics ) std::cout << "\tSUTT TrigDefs::Physics " << decisiontype << std::endl;
712
713 if ( chainname!="" && m_provider->msg().level() <= MSG::VERBOSE ) {
714
715 m_provider->msg(MSG::VERBOSE) << "status for chain " << chainname
716 << "\tpass " << (*m_tdt)->isPassed(chainname)
717 << "\tprescale " << (*m_tdt)->getPrescale(chainname) << endmsg;
718
719 m_provider->msg(MSG::VERBOSE) << "fetching features for chain " << chainname << endmsg;
720
721 m_provider->msg(MSG::VERBOSE) << chainname << "\tpassed: " << (*m_tdt)->isPassed( chainname ) << endmsg;
722 }
723
725 // std::cout << "\tstatus for chain " << chainname
726 // << "\tpass " << (*m_tdt)->isPassed( chainname )
727 // << "\tpassdt " << (*m_tdt)->isPassed( chainname, decisiontype )
728 // << "\tprescale " << (*m_tdt)->getPrescale( chainname ) << std::endl;
729
730
731 // m_provider->msg(MSG::INFO) << chainname << "\tpassed: " << (*m_tdt)->isPassed( chainname ) << "\t" << m_chainNames[ichain] << "\trun " << run_number << "\tevent " << event_number << endmsg;
732
733
734 if ( chainname!="" && !this->m_keepAllEvents && !(*m_tdt)->isPassed( chainname, decisiontype ) ) continue;
735
736
739 // Trig::FeatureContainer f = (*m_tdt)->features( chainname, TrigDefs::alsoDeactivateTEs);
740
743
744 // tag and probe analysis processes multiple chains passed in the tag and probe tool at once so loop over vector of chains
745 std::vector<std::string> chainNames ;
746
747 if ( !TnP_flag ) {
748 chainNames.push_back(m_chainNames[ichain].raw()) ;
749 }
750 else {
751 chainNames.push_back(m_TnP_tool->tag()) ;
752 chainNames.push_back(m_TnP_tool->probe()) ;
753 }
754
755 // loop over new chainNames vector but doing the same stuff
756 for ( unsigned i = 0 ; i < chainNames.size() ; ++i ) {
757
758 ChainString chainConfig = chainNames[i] ;
759 std::string chainName = chainConfig.head();
760
761 m_event->addChain( chainNames[i] );
762
763 TIDA::Chain& chain = m_event->back();
764
765 if ( chainName == "" ) {
766
768
769 m_selectorTest->clear();
770
772
773 TIDARoiDescriptor* roiInfo = new TIDARoiDescriptor(true);
774
775 chain.addRoi( *roiInfo );
776
777 if ( m_provider->evtStore()->template contains<xAOD::TrackParticleContainer>(key) ) {
779 refbeamspot = this->template getBeamspot<xAOD::TrackParticleContainer>( key );
780 }
781
782 const std::vector<TIDA::Track*>& testtracks = m_selectorTest->tracks();
783
784 chain.back().addTracks(testtracks);
785
786 if ( vtx_name!="" ) {
787
789
790 m_provider->msg(MSG::VERBOSE) << "\tFetch xAOD::VertexContainer with key " << vtx_name << endmsg;
791
792 std::vector<TIDA::Vertex> tidavertices;
793
794 if ( this->select( tidavertices, vtx_name ) ) chain.back().addVertices( tidavertices );
795 }
796
797
798 delete roiInfo;
799
800 }
801 else {
802
804
805 //std::string roi_key = m_chainNames[ichain].roi();
806
807 std::string roi_key = chainConfig.roi();
808
809 unsigned feature_type =TrigDefs::lastFeatureOfType;
810
811 if ( roi_key!="" ) feature_type= TrigDefs::allFeaturesOfType;
812
814
815 int leg = -1;
816
817 if ( chainConfig.element()!="" ) {
818 leg = std::atoi(chainConfig.element().c_str());
819 }
820
821 std::vector< TrigCompositeUtils::LinkInfo<TrigRoiDescriptorCollection> > rois =
822 (*m_tdt)->template features<TrigRoiDescriptorCollection>( Trig::FeatureRequestDescriptor( chainName,
823 decisiontype,
824 roi_key,
825 feature_type,
826 "roi",
827 leg ) );
828
829 // const unsigned int featureCollectionMode = const std::string& navElementLinkKey = "roi") const;
830
831 int iroi = 0;
832
833 for ( const TrigCompositeUtils::LinkInfo<TrigRoiDescriptorCollection>& roi_info : rois ) {
834
835 iroi++;
836
840
841 if ( roi_key=="SuperRoi" && iroi>1 ) continue;
842
843 // std::cout << "\troi: get link " << roi_key << " ..." << std::endl;
844
845 const ElementLink<TrigRoiDescriptorCollection> roi_link = roi_info.link;
846
848 if ( roi_key!="" && roi_link.dataID()!=roi_key ) continue;
849
850 const TrigRoiDescriptor* const* roiptr = roi_link.cptr();
851
852 if ( roiptr == 0 ) {
853 continue;
854 }
855
856 // std::cout << "\troi: link deref ..." << *roiptr << std::endl;
857
858 if (m_provider->msg().level() <= MSG::VERBOSE) {
859 m_provider->msg(MSG::VERBOSE) << " RoI descriptor for seeded chain " << chainname << " " << **roiptr << endmsg;
860 }
861
863
864 // if ( dbg ) std::cout << "\troi " << iroi << " " << *roiInfo << std::endl;
865
867
868 m_selectorTest->clear();
869
870 if ( this->template selectTracks<xAOD::TrackParticleContainer>( m_selectorTest, roi_link, key ) ) { }
871
872 // beamspot stuff not needed for xAOD::TrackParticles
873
875
876 chain.addRoi( *roiInfo );
877
879
880 const std::vector<TIDA::Track*>& testtracks = m_selectorTest->tracks();
881
882 chain.back().addTracks(testtracks);
883
884
886
887 if ( vtx_name!="" ) {
888
889 std::vector<TIDA::Vertex> tidavertices;
890
891 this->select( tidavertices, roi_link, vtx_name );
892
893 chain.back().addVertices( tidavertices );
894
895 }
896
897
898#if 0
899 if ( dbg ) {
900 std::cout << "\tTIDA analysis for chain: " << chainname << "\t key: " << key << "\t" << **roiptr << std::endl;
901 std::cout << "\tcollections: " << chain.back() << std::endl;
902 }
903#endif
904
905 delete roiInfo;
906
907 }
908
909
910 }
911
912 } // end of loop chainNames vector loop
913
914
915 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
916 m_provider->msg(MSG::VERBOSE) << "event: " << *m_event << endmsg;
917 }
918
919 }
920
921 // close previous loop over chains and open new one
922
923 for ( unsigned ichain=0 ; ichain<m_event->size() ; ichain++ ) {
924
925 TIDA::Chain& chain = (*m_event)[ichain];
926 ChainString chainConfig(chain.name());
927 const std::string& vtx_name = chainConfig.vtx();
928
929 // skip tag chains to avoid performing standard analysis on them (done for tnp at the same time as probes)
930 if ( TnP_flag && chainConfig.extra().find("_tag")!=std::string::npos ) continue ;
931
932 std::vector<TIDA::Roi*> rois ;
933
934 if (TnP_flag) {
935 rois = m_TnP_tool->GetRois( m_event->chains(), m_selectorRef, &filterRef, m_invmass, m_invmass_obj );
936 // needs to be done AFTER retrieving offline tracks as m_selectorRef passed as arguement, hence restructuring
937 }
938 else {
939 rois.reserve( chain.size() );
940 for ( size_t ir=0 ; ir<chain.size() ; ir++ ) {
941 rois.push_back( &(chain.rois()[ir]) );
942 }
943 }
944
945 // now loop over the rois (again)
946
947 for ( unsigned iroi=0 ; iroi<rois.size() ; iroi++ ) {
948
949 if ( this->filterOnRoi() ) {
950 filterRef.setRoi( &(rois.at(iroi)->roi() ) );
951 filterRef.containtracks( m_containTracks );
952 }
953 else filterRef.setRoi( 0 );
954
955 test_tracks.clear();
956
957 // this block is before the track retrieval in the original, is it working the same here?
958
972
973 if ( m_provider->msg().level() <= MSG::VERBOSE )
974 m_provider->msg(MSG::VERBOSE) << "MC Truth flag " << m_mcTruth << endmsg;
975
976 if ( !m_doOffline && m_mcTruth ) {
977 if ( this->filterOnRoi() ) filter_truth.setRoi( &(rois.at(iroi)->roi() ) );
978 ref_tracks = m_selectorRef->tracks(&filter_truth);
979 }
980 else { // ie. if ( m_doOffline )
981 ref_tracks = m_selectorRef->tracks(&filterRef) ;
982 }
983
984 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
985 m_provider->msg(MSG::VERBOSE) << "ref tracks.size() " << m_selectorRef->tracks().size() << endmsg;
986 for ( int ii=m_selectorRef->tracks().size() ; ii-- ; ) {
987 m_provider->msg(MSG::VERBOSE) << " ref track " << ii << " " << *m_selectorRef->tracks()[ii] << endmsg;
988 }
989 }
990
991 test_tracks.clear();
992
993
994 for ( unsigned itrk=0 ; itrk<rois.at(iroi)->tracks().size() ; itrk++ ) {
995 test_tracks.push_back(&(rois.at(iroi)->tracks().at(itrk)));
996 }
997
998 // std::cout << "sutt track multiplicities: offline " << offline_tracks.size() << "\ttest " << test_tracks.size() << std::endl;
999
1000 _analysis->setvertices( vertices.size() );
1001
1002 if ( refbeamspot.size()>0 ) _analysis->setBeamRef( refbeamspot );
1003 if ( testbeamspot.size()>0 ) _analysis->setBeamTest( testbeamspot );
1004
1007
1008 if ( m_runPurity ) {
1009
1010 if ( this->getUseHighestPT() ) HighestPTOnly( test_tracks );
1011
1012 if ( m_pTthreshold>0 ) FilterPT( test_tracks, m_pTthreshold );
1013
1015 m_NRois++;
1016 m_NRefTracks += test_tracks.size();
1017 m_NTestTracks += ref_tracks.size();
1018
1019
1021 m_associator->match( test_tracks, ref_tracks );
1022
1023 _analysis->execute( test_tracks, ref_tracks, m_associator );
1024
1025 }
1026 else {
1027
1029 if ( this->getUseHighestPT() ) HighestPTOnly( ref_tracks );
1030
1032
1033 if ( m_pTthreshold>0 ) FilterPT( ref_tracks, m_pTthreshold );
1034
1036 m_NRois++;
1037 m_NRefTracks += ref_tracks.size();
1038 m_NTestTracks += test_tracks.size();
1039
1041 m_associator->match( ref_tracks, test_tracks );
1042
1043 _analysis->setroi( &rois.at(iroi)->roi() );
1044 _analysis->execute( ref_tracks, test_tracks, m_associator );
1045
1046 if ( vtx_name!="" ) {
1048 std::vector<TIDA::Vertex> vr = rois.at(iroi)->vertices();
1049 std::vector<TIDA::Vertex*> vtx_rec;
1050 for ( unsigned iv=0 ; iv<vr.size() ; iv++ ) vtx_rec.push_back( &vr[iv] );
1051
1052 std::vector<TIDA::Vertex*> vtx;
1053 if ( this->getVtxIndex()<0 ) {
1054 for ( unsigned iv=0 ; iv<vertices.size() ; iv++ ) vtx.push_back( &vertices[iv] );
1055 }
1056 else {
1057 if ( vertices.size()>unsigned(this->getVtxIndex()) ) vtx.push_back( &vertices[this->getVtxIndex()] );
1058 }
1059
1060 _analysis->execute_vtx( vtx, vtx_rec, m_event );
1061 }
1062
1063 }
1064
1065 if ( _analysis->debug() ) {
1066 m_provider->msg(MSG::INFO) << "Missing track for " << m_chainNames[ichain]
1067 << "\trun " << run_number
1068 << "\tevent " << event_number
1069 << "\tlb " << lumi_block << endmsg;
1070 }
1071
1072 }
1073
1074 }
1075
1076 if ( m_provider->msg().level() <= MSG::VERBOSE ) {
1077 m_provider->msg(MSG::VERBOSE) << "\n\nEvent " << *m_event << endmsg;
1078 }
1079 }
1080
1081
1082
1083 virtual void book() {
1084
1085 if(m_provider->msg().level() <= MSG::VERBOSE)
1086 m_provider->msg(MSG::VERBOSE) << "AnalysisConfigMT_Tier0::book() " << name() << endmsg;
1087
1088 m_provider->msg(MSG::ERROR) << "AnalysisConfigMT_Tier0::book() should no longer be called: " << name() << endmsg;
1089
1090
1091 }
1092
1093
1094
1095 virtual void finalize() {
1096
1097 if(m_provider->msg().level() <= MSG::VERBOSE){
1098 m_provider->msg(MSG::VERBOSE) << "AnalysisConfigMT_Tier0::finalise() " << m_provider->name() << endmsg;
1099 }
1100
1101 m_analysis->finalise();
1102
1103 // deleting instance of TnP_tool and setting pointer to null
1104 if ( m_TnP_tool != 0 ) {
1105 delete m_TnP_tool ;
1106 m_TnP_tool = 0 ;
1107 }
1108
1109 m_provider->msg(MSG::INFO) << m_provider->name() << " " << m_chainNames[0] << " \tNRois processed: " << m_NRois << "\tRef tracks: " << m_NRefTracks << "\tTestTracks: " << m_NTestTracks << endmsg;
1110
1111 if(m_provider->msg().level() <= MSG::VERBOSE) {
1112 m_provider->msg(MSG::VERBOSE) << m_provider->name() << " finalised" << endmsg;
1113 }
1114 }
1115
1116 void set_monTool( ToolHandle<GenericMonitoringTool>* m ) { m_monTool=m; }
1117
1118 ToolHandle<GenericMonitoringTool>* monTool() { return m_monTool; }
1119
1120protected:
1121
1123
1125
1126 std::vector<ChainString> m_chainNames;
1127 std::vector<A*> m_analyses;
1128 std::string m_testType;
1129
1138
1139 std::string m_outputFileName;
1140
1145
1147
1149
1151
1153
1155
1157
1160
1161 ToolHandle<GenericMonitoringTool>* m_monTool;
1162
1163};
1164
1165
1166
1167#endif // TrigInDetAnalysisExample_T_AnalysisConfigMT_Tier0_H
1168
#define endmsg
Erkcan's track matchers.
generic track filter to filter on eta and PT only
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container
Basic event class to contain a vector of chains for trigger analysis.
useful tool for the TrigInDetAnalysis class code
void HighestPTOnly(std::vector< T * > &tracks)
Definition TIDATools.h:20
void FilterPT(std::vector< T * > &tracks, double pt)
Definition TIDATools.h:41
emacs: this is -*- c++ -*-
TIDA::Associator< TIDA::Track > TrackAssociator
const std::string & extra() const
Definition ChainString.h:38
const std::string & roi() const
Definition ChainString.h:35
std::string subs(std::string s) const
const std::string & raw() const
Definition ChainString.h:42
const std::string & head() const
Definition ChainString.h:33
const std::string & tail() const
Definition ChainString.h:34
const std::string & vtx() const
Definition ChainString.h:36
const std::string & element() const
Definition ChainString.h:37
an iterator over instances of a given type in StoreGateSvc.
Definition DataHandle.h:43
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
void setRoi(TIDARoiDescriptor *r)
Definition Filters.h:236
void containtracks(bool b=true)
set / unset the flag to determine whether tracks should be fully contained in the RoI or not
Definition Filters.h:242
default simple filter which accepts all tracks
Definition Filters.h:26
Describes the Region of Ineterest geometry It has basically 8 parameters.
std::vector< ChainString > m_chainNames
ToolHandle< GenericMonitoringTool > * m_monTool
void set_monTool(ToolHandle< GenericMonitoringTool > *m)
T_AnalysisConfigMT_Tier0(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, TagNProbe *TnP_tool=0)
ToolHandle< GenericMonitoringTool > * monTool()
const TrackAnalysis * analysis() const
TrackAnalysis * m_analysis
const std::string & name() const
TrigTrackSelector * m_selectorTest
std::string m_analysisInstanceName
bool selectTracks(TrigTrackSelector *selector, const ElementLink< TrigRoiDescriptorCollection > &roi_link, const std::string &key="")
std::vector< std::vector< TrackFilter * > > m_filters
TrigTrackSelector * m_selectorRef
StatusCode retrieve(Collection const *&collection, const std::string &key="")
std::vector< double > getBeamspot(const std::string &key)
ToolHandle< Trig::TrigDecisionTool > * m_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, const std::string &selectionChainName, const std::string &selectionType, const std::string &selectionKey, TrackFilter *testFilter, TrackFilter *referenceFilter, TrackFilter *selectionFilter, TrackAssociator *associator, TrackAnalysis *analysis)
TrackAssociator * m_associator
bool select(std::vector< TIDA::Vertex > &vertices, xAOD::VertexContainer::const_iterator vtx_start, xAOD::VertexContainer::const_iterator vtx_end)
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
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
uint32_t lumiBlock() const
The current event's luminosity block number.
uint32_t bcid() const
The bunch crossing ID of the event.
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
uint32_t timeStamp() const
POSIX time in seconds from 1970. January 1st.
uint32_t runNumber() const
The current event's run number.
uint64_t eventNumber() const
The current event's event number.
int ir
counter of the current depth
Definition fastadd.cxx:49
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
int signal_process_id(const GenEvent &e)
Definition GenEvent.h:636
static const unsigned int lastFeatureOfType
Run 3 "enum". Only return the final feature along each route through the navigation.
static const unsigned int allFeaturesOfType
Run 3 "enum". Return all features along legs (still with type and container checks)
EventInfo_v1 EventInfo
Definition of the latest event info version.
hold the test vectors and ease the comparison
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition LinkInfo.h:22