ATLAS Offline Software
Loading...
Searching...
No Matches
MuFastSteering.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "MuFastSteering.h"
10#include "xAODTrigger/MuonRoI.h"
11
12#include "CxxUtils/phihelper.h"
16
17#include "GaudiKernel/IIncidentSvc.h"
19
20// --------------------------------------------------------------------------------
21// --------------------------------------------------------------------------------
22
23MuFastSteering::MuFastSteering(const std::string& name, ISvcLocator* svc)
24 : AthReentrantAlgorithm(name, svc),
26{
27}
28// --------------------------------------------------------------------------------
29// --------------------------------------------------------------------------------
30
32{
33 // Locate DataPreparator
34 ATH_CHECK(m_dataPreparator.retrieve());
35
36 // Locate PatternFinder
37 ATH_CHECK(m_patternFinder.retrieve());
38
39 // Locate StationFitter
40 ATH_CHECK(m_stationFitter.retrieve());
41
42 // Locate TrackFitter
43 ATH_CHECK(m_trackFitter.retrieve());
44
45 // Locate TrackExtrapolator
47
48 // BackExtrapolator services
50
51 // CscSegmentMaker
52 ATH_CHECK(m_cscsegmaker.retrieve());
53
54 // FtfRoadDefiner
55 ATH_CHECK(m_ftfRoadDefiner.retrieve());
56
57 // Set service tools
58 m_trackExtrapolator->setExtrapolatorTool(&m_backExtrapolatorTool);
59 m_dataPreparator->setExtrapolatorTool(&m_backExtrapolatorTool);
60
61 // set road width in case TGC/RPC readout failure
63
64 m_dataPreparator->setRpcGeometry(m_use_rpc);
65
66 // set the flag whether to use NSW or not
67 m_dataPreparator->setStgcGeometry(m_use_stgc);
68 m_dataPreparator->setMmGeometry(m_use_mm);
69
76
77 // set data or MC flag
79
83 m_trackFitter -> setUseEIFromBarrel( m_use_endcapInnerFromBarrel );
84
85 // initialize handle keys.
86 ATH_CHECK(m_eventInfoKey.initialize());
87 ATH_CHECK(m_roiCollectionKey.initialize());
90 // for Inside-Out mode ---
93 // ----
94 ATH_CHECK(m_muFastContainerKey.initialize());
95 ATH_CHECK(m_muIdContainerKey.initialize());
97
98
99 ATH_CHECK(m_muMsContainerKey.initialize());
100 if (not m_monTool.name().empty()) {
101 ATH_CHECK(m_monTool.retrieve());
102 }
103 ATH_MSG_DEBUG( "topoRoad = " << m_topoRoad);
104
105 if (m_fill_FSIDRoI) {
106 ATH_MSG_INFO("will fill " << m_muIdContainerKey.key() << " in Full Scan mode. Please check if it's correct.");
107 }
108
109 ATH_MSG_DEBUG("InsideOutMode: " << m_insideOut);
110 ATH_MSG_DEBUG("Multi-TrackMode: " << m_multiTrack << "/ run for endcap RoI -> " << m_doEndcapForl2mt);
111
112 //
113 // Initialize the calibration streamer
114 ATH_CHECK(m_calStreamer.retrieve(EnableTool(m_doCalStream)));
115 if (m_doCalStream) {
116 ATH_CHECK(m_jobOptionsSvc.retrieve());
117
118 if (m_jobOptionsSvc->has("MuonHltCalibrationConfig.MuonCalBufferName")) {
119 if (m_calBufferName.fromString(m_jobOptionsSvc->get("MuonHltCalibrationConfig.MuonCalBufferName","")).isSuccess()) {
120 ATH_MSG_DEBUG("Set property " << m_calBufferName << " from MuonHltCalibrationConfig.MuonCalBufferName");
121 }
122 } else {
123 ATH_MSG_DEBUG("Could not parse MuonHltCalibrationConfig.MuonCalBufferName from JobOptionsSvc");
124 }
125 if (m_jobOptionsSvc->has("MuonHltCalibrationConfig.MuonCalBufferSize")) {
126 if (m_calBufferSize.fromString(m_jobOptionsSvc->get("MuonHltCalibrationConfig.MuonCalBufferSize","")).isSuccess()) {
127 ATH_MSG_DEBUG("Set property " << m_calBufferSize << " from MuonHltCalibrationConfig.MuonCalBufferSize");
128 }
129 }
130 else {
131 ATH_MSG_DEBUG("Could not parse MuonHltCalibrationConfig.MuonCalBufferSize from JobOptionsSvc");
132 }
133
134 // set properties
135 m_calStreamer->setBufferName(m_calBufferName);
136 ATH_MSG_DEBUG("Initialized the Muon Calibration Streamer. Buffer name: " << m_calBufferName
137 << ", buffer size: " << m_calBufferSize
138 << " doDataScouting: " << m_calDataScouting);
139
140
141 ATH_CHECK(m_incidentSvc.retrieve());
143 }
144
145
146 return StatusCode::SUCCESS;
147}
148
150{
151 // close the calibration stream
152 if ( m_doCalStream ) {
153 if (m_calStreamer->isStreamOpen()){
154 StatusCode sc = m_calStreamer->closeStream();
155 if ( sc != StatusCode::SUCCESS ) {
156 ATH_MSG_ERROR("Failed to close the calibration stream");}
157 else {
158 ATH_MSG_INFO("Calibration stream closed");
159 }
160 }
161 }
162 return StatusCode::SUCCESS;
163}
164
165
166
167void MuFastSteering::handle(const Incident& incident) {
168
169
170 if (incident.type() == AthenaInterprocess::UpdateAfterFork::type() && m_doCalStream) {
171 ATH_MSG_DEBUG("+-----------------------------------+");
172 ATH_MSG_DEBUG("| handle for UpdateAfterFork called |");
173 ATH_MSG_DEBUG("+-----------------------------------+");
174 const AthenaInterprocess::UpdateAfterFork& updinc = dynamic_cast<const AthenaInterprocess::UpdateAfterFork&>(incident);
175
176 ATH_MSG_DEBUG(" MuonCalBufferName = " << m_calBufferName);
177 ATH_MSG_DEBUG(" MuonCalBufferSize = " << m_calBufferSize);
178 ATH_MSG_DEBUG(" MuonCalBufferWId = " << updinc.workerID());
179 ATH_MSG_DEBUG("=================================================");
180
181
182 std::string worker_name=std::to_string(updinc.workerID());
183 //
184 // Create the calibration stream
185
186 m_calStreamer->setInstanceName(worker_name);
187
188 //open the stream
189 if ( m_calStreamer->openStream(m_calBufferSize).isSuccess() ) {
190 ATH_MSG_INFO("Opened the connection to the circular buffer " << m_calBufferName.value());
191 } else {
192 ATH_MSG_ERROR("Failed to open the connection to the circular buffer " << m_calBufferName.value());
193 }
194 }
195}
196
197// --------------------------------------------------------------------------------
198// --------------------------------------------------------------------------------
199
200const LVL1::RecMuonRoI* matchingRecRoI( uint32_t roiWord,
201 const DataVector<LVL1::RecMuonRoI>& collection )
202{
203 for ( auto recRoI: collection ) {
204 if ( recRoI->roiWord() == roiWord ){
205 return recRoI;
206 }
207 }
208 return nullptr;
209}
210
211// --------------------------------------------------------------------------------
212// --------------------------------------------------------------------------------
213
214const xAOD::MuonRoI* matchingRecRoI( uint32_t roiWord,
215 const xAOD::MuonRoIContainer& collection )
216{
217 for ( auto recRoI: collection ) {
218 if ( recRoI->roiWord() == roiWord ){
219 return recRoI;
220 }
221 }
222 return nullptr;
223}
224
225// --------------------------------------------------------------------------------
226// --------------------------------------------------------------------------------
227
228StatusCode MuFastSteering::execute(const EventContext& ctx) const
229{
230 if(!m_useRun3Config) {
231 ATH_MSG_ERROR("You are not supposed to run trigger on RUN2 layout anymore.");
232 return StatusCode::FAILURE;
233 }
234
235 auto totalTimer = Monitored::Timer( "TIME_Total" );
236 auto monitorIt = Monitored::Group(m_monTool, totalTimer );
237
238 // retrieve with ReadHandle
239 auto roiCollectionHandle = SG::makeHandle( m_roiCollectionKey, ctx );
240 const TrigRoiDescriptorCollection *roiCollection = roiCollectionHandle.cptr();
241 if (!roiCollectionHandle.isValid()){
242 ATH_MSG_ERROR("ReadHandle for TrigRoiDescriptorCollection key:" << m_roiCollectionKey.key() << " isn't Valid");
243 return StatusCode::FAILURE;
244 }
245
246 auto recRoiCollectionHandle = SG::makeHandle( m_recRoiCollectionKey, ctx );
247 const xAOD::MuonRoIContainer *recRoiCollection = recRoiCollectionHandle.cptr();
248 if (!recRoiCollectionHandle.isValid()){
249 ATH_MSG_ERROR("ReadHandle for xAOD::MuonRoIContainer key:" << m_recRoiCollectionKey.key() << " isn't Valid");
250 return StatusCode::FAILURE;
251 }
252
253 std::vector< const TrigRoiDescriptor* > internalRoI;
254 TrigRoiDescriptorCollection::const_iterator p_roids = roiCollection->begin();
255 TrigRoiDescriptorCollection::const_iterator p_roidsEn = roiCollection->end();
256
257 for(; p_roids != p_roidsEn; ++p_roids ) {
258 internalRoI.push_back(*p_roids);
259 ATH_MSG_DEBUG("REGTEST: " << m_roiCollectionKey.key() << " eta = " << "(" << (*p_roids)->etaMinus() << ")" << (*p_roids)->eta() << "(" << (*p_roids)->etaPlus() << ")");
260 ATH_MSG_DEBUG("REGTEST: " << m_roiCollectionKey.key() << " phi = " << "(" << (*p_roids)->phiMinus() << ")" << (*p_roids)->phi() << "(" << (*p_roids)->phiPlus() << ")");
261 ATH_MSG_DEBUG("REGTEST: " << m_roiCollectionKey.key() << " zed = " << "(" << (*p_roids)->zedMinus() << ")" << (*p_roids)->zed() << "(" << (*p_roids)->zedPlus() << ")");
262 }
263 ATH_MSG_DEBUG("REGTEST: " << m_roiCollectionKey.key() << " size = " << internalRoI.size());
264
265 // make RecMURoIs maching with MURoIs
266 std::vector< const xAOD::MuonRoI* > recRoIVector;
267 std::vector< const xAOD::MuonRoI* > surrRoIs;
268
269 for (size_t size=0; size<roiCollection->size(); size++){
270 const xAOD::MuonRoI* recRoI = matchingRecRoI( roiCollection->at(size)->roiWord(), *recRoiCollection );
271 if( recRoI == nullptr ) continue;
272 recRoIVector.push_back(recRoI);
273 ATH_MSG_DEBUG("REGTEST: " << m_recRoiCollectionKey.key() << " eta/phi = " << (recRoI)->eta() << "/" << (recRoI)->phi());
274 ATH_MSG_DEBUG("REGTEST: " << m_recRoiCollectionKey.key() << " size = " << recRoIVector.size());
275 }
276
277 bool dynamicDeltaRpc = false;
278 int nPassedBarrelSurrRoi = 0;
279 if(m_topoRoad ){
280 for( const auto recRoI: *recRoiCollection ){
281 if(std::find(recRoIVector.begin(), recRoIVector.end(), recRoI) != recRoIVector.end()) continue;
282
283 bool surrounding = false;
284 for( const auto matchedRoI: recRoIVector ){
285 float deta = std::abs(recRoI->eta() - matchedRoI->eta());
286 float dphi = std::abs(recRoI->phi() - matchedRoI->phi());
287 if( dphi > M_PI )dphi = 2.*M_PI - dphi;
288 if( deta < m_dEtasurrRoI && dphi < m_dPhisurrRoI)
289 surrounding = true;
290 }
291
292 if(surrounding)
293 surrRoIs.push_back(recRoI);
294 }
295
296 ATH_MSG_DEBUG("surrRoI: " << " size = " << surrRoIs.size());
297 for( const auto recRoI: surrRoIs ){
298 ATH_MSG_DEBUG("surrRoI: " << " eta/phi = " << (recRoI)->eta() << "/" << (recRoI)->phi() );
299 if( std::abs((recRoI)->eta()) <= 1.05 && (recRoI)->getThrNumber() >= 1 )nPassedBarrelSurrRoi++;
300 }
301 ATH_MSG_DEBUG( "nPassedBarrelSurrRoi = " << nPassedBarrelSurrRoi);
302 //dynamicDeltaRpcMode
303 if( nPassedBarrelSurrRoi >= 1 )
304 dynamicDeltaRpc = true;
305 }
306
307 // record data objects with WriteHandle
308 auto muFastContainer = SG::makeHandle(m_muFastContainerKey, ctx);
309 ATH_CHECK(muFastContainer.record(std::make_unique<xAOD::L2StandAloneMuonContainer>(), std::make_unique<xAOD::L2StandAloneMuonAuxContainer>()));
310
311 auto muCompositeContainer = std::make_unique<xAOD::TrigCompositeContainer>();
312 auto muCompositeAuxContainer = std::make_unique<xAOD::TrigCompositeAuxContainer>();
313 muCompositeContainer->setStore(muCompositeAuxContainer.get());
314
315 auto muIdContainer = SG::makeHandle(m_muIdContainerKey, ctx);
316 ATH_CHECK(muIdContainer.record(std::make_unique<TrigRoiDescriptorCollection>()));
317
318 auto muMsContainer = SG::makeHandle(m_muMsContainerKey, ctx);
319 ATH_CHECK(muMsContainer.record(std::make_unique<TrigRoiDescriptorCollection>()));
320
321
322 // Inside-out L2Muon mode
323 if(m_insideOut) {
324 ATH_MSG_DEBUG("start inside-out mode...");
325
326 auto muonCBColl = SG::makeHandle (m_outputCBmuonCollKey, ctx);
327 ATH_CHECK( muonCBColl.record (std::make_unique<xAOD::L2CombinedMuonContainer>(),
328 std::make_unique<xAOD::L2CombinedMuonAuxContainer>()) );
329
330 auto trackHandle = SG::makeHandle( m_FTFtrackKey, ctx );
331 if (!trackHandle.isValid()){
332 ATH_MSG_ERROR("ReadHandle for TrackParticleContainer key:" << m_FTFtrackKey.key() << " isn't Valid");
333 return StatusCode::FAILURE;
334 }
335 const xAOD::TrackParticleContainer *tracks = trackHandle.cptr();
336
337 ATH_CHECK(findMuonSignatureIO(*tracks, internalRoI, recRoIVector,
338 *muonCBColl, *muFastContainer, dynamicDeltaRpc, ctx ));
339
340 if (msgLvl(MSG::DEBUG)) {
341 ATH_MSG_DEBUG("REGTEST: xAOD::L2CombinedMuonContainer key:" << m_outputCBmuonCollKey.key() << " size = " << muonCBColl->size());
342 for (const auto p_CBmuon : *muonCBColl){
343 ATH_MSG_DEBUG("REGTEST: xAOD::L2CombinedMuonContainer key:" << m_outputCBmuonCollKey.key() << " pt = " << (*p_CBmuon).pt() << " GeV");
344 ATH_MSG_DEBUG("REGTEST: xAOD::L2CombinedMuonContainer key:" << m_outputCBmuonCollKey.key() << " eta/phi = " << (*p_CBmuon).eta() << "/" << (*p_CBmuon).phi());
345 }
346 }
347 }
348 else if(m_multiTrack){ //multi-track SA mode
349 ATH_MSG_DEBUG("start multi-track SA mode...");
350 ATH_CHECK(findMultiTrackSignature(internalRoI, recRoIVector, *muFastContainer, dynamicDeltaRpc, ctx));
351 }
352 else {
353 ATH_CHECK(findMuonSignature(internalRoI, recRoIVector,
354 *muFastContainer, muCompositeContainer.get(), *muIdContainer, *muMsContainer, dynamicDeltaRpc, ctx));
355 }
356
357 if (!m_muCompositeContainerKey.empty()){
359 ATH_CHECK(wh_muCompositeCont.record(std::move(muCompositeContainer), std::move(muCompositeAuxContainer)));
360 }
361
362 if (msgLvl(MSG::DEBUG)) {
363 // DEBUG TEST: Recorded data objects
364 ATH_MSG_DEBUG("Recorded data objects");
365 ATH_MSG_DEBUG("REGTEST: xAOD::L2StandAloneMuonContainer key:" << m_muFastContainerKey.key() << " size = " << muFastContainer->size());
366
367 for (auto p_muon : *muFastContainer) {
368 ATH_MSG_DEBUG("REGTEST: xAOD::L2StandAloneMuonContainer key:" << m_muFastContainerKey.key() << " pt = " << (*p_muon).pt() << " GeV");
369 ATH_MSG_DEBUG("REGTEST: xAOD::L2StandAloneMuonContainer key:" << m_muFastContainerKey.key() << " eta/phi = " << (*p_muon).eta() << "/" << (*p_muon).phi());
370 }
371
372 ATH_MSG_DEBUG("REGTEST: TrigRoiDescriptorCollection key:" << m_muIdContainerKey.key() << " size = " << muIdContainer->size());
373 for (auto p_muonID : *muIdContainer) {
374 ATH_MSG_DEBUG("REGTEST: TrigRoiDescriptorCollection key:" << m_muIdContainerKey.key() << " eta/phi = " << (*p_muonID).eta() << "/" << (*p_muonID).phi());
375 }
376
377 ATH_MSG_DEBUG("REGTEST: TrigRoiDescriptorCollection key:" << m_muMsContainerKey.key() << " size = " << muMsContainer->size());
378 for (auto p_muonMS : *muMsContainer) {
379 ATH_MSG_DEBUG("REGTEST: TrigRoiDescriptorCollection key:" << m_muMsContainerKey.key() << " eta/phi = " << (*p_muonMS).eta() << "/" << (*p_muonMS).phi());
380 }
381 }
382
383 ATH_MSG_DEBUG("StatusCode MuFastSteering::execute() success");
384 return StatusCode::SUCCESS;
385}
386
387// --------------------------------------------------------------------------------
388// --------------------------------------------------------------------------------
389
390StatusCode MuFastSteering::findMuonSignature(const std::vector<const TrigRoiDescriptor*>& roids,
391 const std::vector<const xAOD::MuonRoI*>& muonRoIs,
393 xAOD::TrigCompositeContainer* outputMuonCal,
396 const bool dynamicDeltaRpc,
397 const EventContext& ctx) const
398{
399 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMuonSignature start");
400 StatusCode sc = StatusCode::SUCCESS;
401
402 auto prepTimer = Monitored::Timer( "TIME_Data_Preparator" );
403 auto patternTimer = Monitored::Timer( "TIME_Pattern_Finder" );
404 auto stationFitterTimer = Monitored::Timer( "TIME_Station_Fitter" );
405 auto trackFitterTimer = Monitored::Timer( "TIME_Track_Fitter" );
406 auto trackExtraTimer = Monitored::Timer( "TIME_Track_Extrapolator" );
407 auto calibrationTimer = Monitored::Timer( "TIME_Calibration_Streamer" );
408
409 auto monitorIt = Monitored::Group(m_monTool, prepTimer, patternTimer, stationFitterTimer,
410 trackFitterTimer, trackExtraTimer, calibrationTimer );
411
412 TrigL2MuonSA::RpcHits rpcHits;
413 TrigL2MuonSA::TgcHits tgcHits;
414 TrigL2MuonSA::MdtRegion mdtRegion;
415 TrigL2MuonSA::MuonRoad muonRoad;
416 TrigL2MuonSA::RpcFitResult rpcFitResult;
417 TrigL2MuonSA::TgcFitResult tgcFitResult;
418 TrigL2MuonSA::MdtHits mdtHits;
419 TrigL2MuonSA::CscHits cscHits;
420 TrigL2MuonSA::StgcHits stgcHits;
422
425
426 // muonRoIs = RecMURoIs, roids = MURoIs
427 p_roids = roids.begin();
428 for (p_roi=(muonRoIs).begin(); p_roi!=(muonRoIs).end(); ++p_roi) {
429
430 prepTimer.start();
431 std::vector<TrigL2MuonSA::TrackPattern> trackPatterns;
432 rpcHits.clear();
433 tgcHits.clear();
434 mdtRegion.Clear();
435 muonRoad.Clear();
436 rpcFitResult.Clear();
437 tgcFitResult.Clear();
438 mdtHits.clear();
439 cscHits.clear();
440 stgcHits.clear();
441 mmHits.clear();
442
443 if ( m_recMuonRoIUtils.isBarrel(*p_roi) ) { // Barrel
444 ATH_MSG_DEBUG("Barrel");
445
449
450 // Data preparation
451 sc = m_dataPreparator->prepareData(ctx,
452 *p_roi,
453 *p_roids,
455 rpcHits,
456 muonRoad,
457 mdtRegion,
458 rpcFitResult,
459 mdtHits,
460 dynamicDeltaRpc);
461 if (!sc.isSuccess()) {
462 ATH_MSG_WARNING("Data preparation failed");
463 TrigL2MuonSA::TrackPattern trackPattern;
464 trackPatterns.push_back(std::move(trackPattern));
465 // Update output trigger element
466 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
467 rpcFitResult, tgcFitResult, mdtHits, cscHits,
468 stgcHits, mmHits,
469 trackPatterns, outputTracks, outputID, outputMS, ctx);
470 continue;
471 }
472 prepTimer.stop();
473
474 // Pattern finding
475 patternTimer.start();
476 sc = m_patternFinder->findPatterns(ctx,
477 muonRoad,
478 mdtHits,
479 trackPatterns);
480 if (!sc.isSuccess()) {
481 ATH_MSG_WARNING("Pattern finder failed");
482 // Update output trigger element
483 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
484 rpcFitResult, tgcFitResult, mdtHits, cscHits,
485 stgcHits, mmHits,
486 trackPatterns, outputTracks, outputID, outputMS, ctx);
487 continue;
488 }
489 patternTimer.stop();
490
491 // Superpoint fit
492 stationFitterTimer.start();
493 sc = m_stationFitter->findSuperPoints(muonRoad,
494 rpcFitResult,
495 trackPatterns);
496 if (!sc.isSuccess()) {
497 ATH_MSG_WARNING("Super point fitter failed");
498 // Update output trigger element
499 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
500 rpcFitResult, tgcFitResult, mdtHits, cscHits,
501 stgcHits, mmHits,
502 trackPatterns, outputTracks, outputID, outputMS, ctx);
503 continue;
504 }
505 stationFitterTimer.stop();
506
507 // Track fitting
508 trackFitterTimer.start();
509 sc = m_trackFitter->findTracks(*p_roids,
510 rpcFitResult,
511 trackPatterns);
512
513 if (!sc.isSuccess()) {
514 ATH_MSG_WARNING("Track fitter failed");
515 // Update output trigger element
516 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
517 rpcFitResult, tgcFitResult, mdtHits, cscHits,
518 stgcHits, mmHits,
519 trackPatterns, outputTracks, outputID, outputMS, ctx);
520 continue;
521 }
522 trackFitterTimer.stop();
523
524 }
525 else { // Endcap
526 ATH_MSG_DEBUG("Endcap");
527
528 prepTimer.start();
529 // Data preparation
530 sc = m_dataPreparator->prepareData(ctx,
531 *p_roi,
532 *p_roids,
534 tgcHits,
535 muonRoad,
536 mdtRegion,
537 tgcFitResult,
538 mdtHits,
539 cscHits,
540 stgcHits,
541 mmHits);
542 if (!sc.isSuccess()) {
543 ATH_MSG_WARNING("Data preparation failed");
544 TrigL2MuonSA::TrackPattern trackPattern;
545 trackPatterns.push_back(trackPattern);
546 // Update output trigger element
547 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
548 rpcFitResult, tgcFitResult, mdtHits, cscHits,
549 stgcHits, mmHits,
550 trackPatterns, outputTracks, outputID, outputMS, ctx);
551 continue;
552 }
553 prepTimer.stop();
554
555 // Pattern finding
556 patternTimer.start();
557 sc = m_patternFinder->findPatterns(ctx,
558 muonRoad,
559 mdtHits,
560 stgcHits,
561 mmHits,
562 trackPatterns);
563
564 if (!sc.isSuccess()) {
565 ATH_MSG_WARNING("Pattern finder failed");
566 // Update output trigger element
567 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
568 rpcFitResult, tgcFitResult, mdtHits, cscHits,
569 stgcHits, mmHits,
570 trackPatterns, outputTracks, outputID, outputMS, ctx);
571 continue;
572 }
573 patternTimer.stop();
574
575 // Superpoint fit
576 stationFitterTimer.start();
578 sc = m_stationFitter->findSuperPointsSimple(*p_roids,
579 muonRoad,
580 tgcFitResult,
581 trackPatterns,
582 stgcHits,
583 mmHits);
584 }
585 else{
586 sc = m_stationFitter->findSuperPoints(*p_roids,
587 muonRoad,
588 tgcFitResult,
589 trackPatterns,
590 stgcHits,
591 mmHits);
592 }
594 m_cscsegmaker->FindSuperPointCsc(cscHits,trackPatterns,tgcFitResult,muonRoad);
595
596 if (!sc.isSuccess()) {
597 ATH_MSG_WARNING("Super point fitter failed");
598 // Update output trigger element
599 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
600 rpcFitResult, tgcFitResult, mdtHits, cscHits,
601 stgcHits, mmHits,
602 trackPatterns, outputTracks, outputID, outputMS, ctx);
603 continue;
604 }
605
606 stationFitterTimer.stop();
607
608 // Track fittingh
609 trackFitterTimer.start();
610 sc = m_trackFitter->findTracks(*p_roids,
611 tgcFitResult,
612 trackPatterns,
613 muonRoad);
614
615 if (!sc.isSuccess()) {
616 ATH_MSG_WARNING("Track fitter failed");
617 // Update output trigger element
618 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
619 rpcFitResult, tgcFitResult, mdtHits, cscHits,
620 stgcHits, mmHits,
621 trackPatterns, outputTracks, outputID, outputMS, ctx);
622 continue;
623 }
624 trackFitterTimer.stop();
625 }
626
627 // fix if eta is strange
628 const float ETA_LIMIT = 2.8;
629 const float DELTA_ETA_LIMIT = 1.0;
630 const float ZERO_LIMIT = 1.e-5;
631 for (TrigL2MuonSA::TrackPattern& track : trackPatterns) {
632 float roiEta = (*p_roi)->eta();
633 if ( std::abs(track.pt) > ZERO_LIMIT &&
634 ( std::abs(track.etaMap) > ETA_LIMIT || std::abs(track.etaMap-roiEta) > DELTA_ETA_LIMIT ) ) {
635 track.etaMap = roiEta;
636 }
637 }
638
639 // Track extrapolation for ID combined
640 trackExtraTimer.start();
641
642 sc = m_trackExtrapolator->extrapolateTrack(trackPatterns, m_winPt);
643
644 if (sc != StatusCode::SUCCESS) {
645 ATH_MSG_WARNING("Track extrapolator failed");
646 // Update output trigger element
647 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
648 rpcFitResult, tgcFitResult, mdtHits, cscHits,
649 stgcHits, mmHits,
650 trackPatterns, outputTracks, outputID, outputMS, ctx);
651 continue;
652 }
653 trackExtraTimer.stop();
654
655 // Update monitoring variables
656 sc = updateMonitor(*p_roi, mdtHits, trackPatterns );
657 if (sc != StatusCode::SUCCESS) {
658 ATH_MSG_WARNING("Failed to update monitoring variables");
659 // Update output trigger element
660 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
661 rpcFitResult, tgcFitResult, mdtHits, cscHits,
662 stgcHits, mmHits,
663 trackPatterns, outputTracks, outputID, outputMS, ctx);
664 continue;
665 }
666
667 // Update output trigger element
668 updateOutputObjects(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
669 rpcFitResult, tgcFitResult, mdtHits, cscHits,
670 stgcHits, mmHits,
671 trackPatterns, outputTracks, outputID, outputMS, ctx);
672
673
674 //-----------------------
675 // call the calibration streamer
676 //---------------------------
677 if (m_doCalStream && trackPatterns.size()>0 ) {
678 TrigL2MuonSA::TrackPattern tp = trackPatterns[0];
679 std::vector<uint32_t> localBuffer; // init localBuffer parameter
680 sc = m_calStreamer->createRoiFragment(*p_roi,tp,mdtHits,
681 rpcHits,
682 tgcHits,
683 localBuffer,
685 ctx);
686 if (sc != StatusCode::SUCCESS ) {
687 ATH_MSG_WARNING("Calibration streamer: create Roi Fragment failed");
688 }
689 // if it's a data scouting chain
690 if ( m_calDataScouting ) {
691 ATH_MSG_DEBUG("Retrieved the buffer, with size: " << localBuffer.size());
692
693 // create the TrigCompositeContainer to store the calibration buffer
695 if (outputMuonCal){
696 outputMuonCal->push_back(tc);
697 ATH_MSG_DEBUG("The size of the TrigCompositeContainer is: " << outputMuonCal->size() );
698 }else{
699 ATH_MSG_ERROR("Trying to fill nullptr container.");
700 return StatusCode::FAILURE;
701 }
702
703 tc->setDetail("muCalibDS", localBuffer );
704
705 }
706 }
707
708 ++p_roids;
709 if (p_roids==roids.end()) break;
710 }
711
712 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMuonSignature success");
713 return StatusCode::SUCCESS;
714}
715
716// --------------------------------------------------------------------------------
717// --------------------------------------------------------------------------------
718
719// findMuonSignature of L2 inside-out version
720// try to find MS tracks seeded by FTF tracks
722 const std::vector<const TrigRoiDescriptor*>& roids,
723 const std::vector<const xAOD::MuonRoI*>& muonRoIs,
726 const bool dynamicDeltaRpc,
727 const EventContext& ctx) const
728{
729 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMuonSignatureIO start");
730 StatusCode sc = StatusCode::SUCCESS;
731 const float ZERO_LIMIT = 1.e-5;
732
733 auto prepTimer = Monitored::Timer( "TIME_Data_Preparator" );
734 auto patternTimer = Monitored::Timer( "TIME_Pattern_Finder" );
735 auto stationFitterTimer = Monitored::Timer( "TIME_Station_Fitter" );
736 auto trackFitterTimer = Monitored::Timer( "TIME_Track_Fitter" );
737 auto trackExtraTimer = Monitored::Timer( "TIME_Track_Extrapolator" );
738 auto calibrationTimer = Monitored::Timer( "TIME_Calibration_Streamer" );
739
740 auto monitorIt = Monitored::Group(m_monTool, prepTimer, patternTimer, stationFitterTimer,
741 trackFitterTimer, trackExtraTimer, calibrationTimer );
742
743 TrigL2MuonSA::RpcHits rpcHits;
744 TrigL2MuonSA::TgcHits tgcHits;
745 TrigL2MuonSA::MdtRegion mdtRegion;
746 TrigL2MuonSA::MuonRoad muonRoad;
747 TrigL2MuonSA::RpcFitResult rpcFitResult;
748 TrigL2MuonSA::TgcFitResult tgcFitResult;
749 TrigL2MuonSA::MdtHits mdtHits;
750 TrigL2MuonSA::CscHits cscHits;
751 TrigL2MuonSA::StgcHits stgcHits;
753
755
756 p_roids = roids.begin();
757 for (const auto p_roi : muonRoIs) {
758 ATH_MSG_DEBUG("roi eta/phi: " << (*p_roi).eta() << "/" << (*p_roi).phi());
759
760 // idtracks loop
761 if ( (idtracks).empty() ) ATH_MSG_DEBUG("IO TEST: xAOD::TrackParticleContainer has 0 tracks --> Can not use FTF tracks...");
762 else ATH_MSG_DEBUG("IO TEST: xAOD::TrackParticleContainer has " << (idtracks).size() << " tracks --> Start inside-out mode!");
763
764 std::vector<TrigL2MuonSA::TrackPattern> trackPatterns;
765 int idtrack_idx = -1;
766 for (auto idtrack : idtracks) {
767
768 idtrack_idx++;
769 ATH_MSG_DEBUG("IO TEST: FTF track key:" << m_FTFtrackKey.key() << " pt = " << idtrack->pt()/1000 << " GeV");
770 ATH_MSG_DEBUG("IO TEST: FTF track key:" << m_FTFtrackKey.key() << " eta/phi = " << idtrack->eta() << "/" << idtrack->phi());
771
772 if(idtrack->pt() < m_ftfminPt) {
773 ATH_MSG_DEBUG("IO TEST: skip FTF track due to pT threshold: " << m_ftfminPt << " MeV");
774 continue;
775 }
776
777 prepTimer.start();
778 rpcHits.clear();
779 tgcHits.clear();
780 mdtRegion.Clear();
781 muonRoad.Clear();
782 rpcFitResult.Clear();
783 tgcFitResult.Clear();
784 mdtHits.clear();
785 cscHits.clear();
786 stgcHits.clear();
787 mmHits.clear();
788 trackPatterns.clear();
789
790 sc = m_ftfRoadDefiner->defineRoad(ctx, idtrack, muonRoad);
791 if (!sc.isSuccess()) {
792 ATH_MSG_WARNING("FtfRoadDefiner failed");
793 continue;
794 } else {
795 ATH_MSG_DEBUG("FtfRoadDefiner::defineRoad success");
796 }
797
798 if ( std::abs(idtrack->eta()) < 1.05 ){
799 ATH_MSG_DEBUG("FTF track at IP is in Barrel: " << idtrack->eta());
800 } else {
801 ATH_MSG_DEBUG("FTF track at IP is in Endcap: " << idtrack->eta());
802 }
803
804 if ( m_recMuonRoIUtils.isBarrel(p_roi) ) { // Barrel Inside-out
805 ATH_MSG_DEBUG("muonRoad.extFtfMiddleEta Barrel: " << muonRoad.extFtfMiddleEta);
806
807 ATH_MSG_DEBUG("Barrel algorithm of IOmode starts");
808
812
813 // Data preparation
814 sc = m_dataPreparator->prepareData(ctx,
815 p_roi,
816 *p_roids,
818 rpcHits,
819 muonRoad,
820 mdtRegion,
821 rpcFitResult,
822 mdtHits,
823 dynamicDeltaRpc);
824 if (!sc.isSuccess()) {
825 ATH_MSG_WARNING("Data preparation failed");
826 continue;
827 } else {
828 ATH_MSG_DEBUG("Data preparation success");
829 }
830 prepTimer.stop();
831
832 // Pattern finding
833 patternTimer.start();
834 sc = m_patternFinder->findPatterns(ctx,
835 muonRoad,
836 mdtHits,
837 trackPatterns);
838 if (!sc.isSuccess()) {
839 ATH_MSG_WARNING("Pattern finder failed");
840 continue;
841 }
842 patternTimer.stop();
843
844 // Superpoint fit
845 stationFitterTimer.start();
846 sc = m_stationFitter->findSuperPoints(muonRoad,
847 rpcFitResult,
848 trackPatterns);
849 if (!sc.isSuccess()) {
850 ATH_MSG_WARNING("Super point fitter failed");
851 continue;
852 }
853 stationFitterTimer.stop();
854
855 // Track fitting
856 trackFitterTimer.start();
857 sc = m_trackFitter->findTracks(*p_roids,
858 rpcFitResult,
859 trackPatterns);
860 if (!sc.isSuccess()) {
861 ATH_MSG_WARNING("Track fitter failed");
862 continue;
863 }
864 trackFitterTimer.stop();
865
866 } else { // Endcap Inside-out
867 ATH_MSG_DEBUG("muonRoad.extFtfMiddleEta Endcap: " << muonRoad.extFtfMiddleEta);
868 ATH_MSG_DEBUG("Endcap algorithm of IOmode starts");
869
870 prepTimer.start();
871 // Data preparation
872 sc = m_dataPreparator->prepareData(ctx,
873 p_roi,
874 *p_roids,
876 tgcHits,
877 muonRoad,
878 mdtRegion,
879 tgcFitResult,
880 mdtHits,
881 cscHits,
882 stgcHits,
883 mmHits);
884 if (!sc.isSuccess()) {
885 ATH_MSG_WARNING("Data preparation failed");
886 continue;
887 } else{
888 ATH_MSG_DEBUG("Data preparation success");
889 }
890 prepTimer.stop();
891
892 // Pattern finding
893 patternTimer.start();
894 sc = m_patternFinder->findPatterns(ctx,
895 muonRoad,
896 mdtHits,
897 stgcHits,
898 mmHits,
899 trackPatterns);
900 if (!sc.isSuccess()) {
901 ATH_MSG_WARNING("Pattern finder failed");
902 continue;
903 }
904 patternTimer.stop();
905
906 // Superpoint fit
907 stationFitterTimer.start();
908 sc = m_stationFitter->findSuperPointsSimple(*p_roids,
909 muonRoad,
910 tgcFitResult,
911 trackPatterns,
912 stgcHits,
913 mmHits);
915 m_cscsegmaker->FindSuperPointCsc(cscHits,trackPatterns,tgcFitResult,muonRoad);
916 if (!sc.isSuccess()) {
917 ATH_MSG_WARNING("Super point fitter failed");
918 continue;
919 }
920 stationFitterTimer.stop();
921
922 // Track fittingh
923 trackFitterTimer.start();
924 sc = m_trackFitter->findTracks(*p_roids,
925 tgcFitResult,
926 trackPatterns,
927 muonRoad);
928 if (!sc.isSuccess()) {
929 ATH_MSG_WARNING("Track fitter failed");
930 continue;
931 }
932 trackFitterTimer.stop();
933
934 }
935
936 // fix if eta is strange
937 TrigL2MuonSA::TrackPattern track = trackPatterns.back();
938 const float ETA_LIMIT = 2.8;
939 const float DELTA_ETA_LIMIT = 1.0;
940 float roiEta = (*p_roi).eta();
941 if (std::abs(track.pt) > ZERO_LIMIT
942 && ( std::abs(track.etaMap) > ETA_LIMIT || std::abs(track.etaMap-roiEta) > DELTA_ETA_LIMIT ) ) {
943 trackPatterns.back().etaMap = roiEta;
944 }
945
946 // Update monitoring variables
947 sc = updateMonitor(p_roi, mdtHits, trackPatterns );
948 if (sc != StatusCode::SUCCESS) {
949 ATH_MSG_WARNING("Failed to update monitoring variables");
950 }
951
952 // Update output trigger element
953 if ( std::abs(trackPatterns.back().pt) > ZERO_LIMIT ) {
954 storeMuonSA(p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
955 rpcFitResult, tgcFitResult, mdtHits, cscHits,
956 stgcHits, mmHits,
957 trackPatterns.back(), outputSAs, ctx);
959 muonCB->makePrivateStore();
960 muonCB->setStrategy(0);
961 muonCB->setErrorFlag(-9);
962 muonCB->setPt(idtrack->pt());
963 muonCB->setEta(idtrack->eta());
964 muonCB->setPhi(idtrack->phi());
965 muonCB->setCharge(idtrack->charge());
966 ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
967 muonCB->setMuSATrackLink(muonSAEL);
968 ElementLink<xAOD::TrackParticleContainer> idtrkEL(idtracks, idtrack_idx);
969 muonCB->setIdTrackLink(idtrkEL);
970 outputCBs.push_back(muonCB);
971 }
972
973 }
974
975 if(outputSAs.size()==0) {
976 ATH_MSG_DEBUG("outputSAs size = 0 -> push_back dummy");
977 muonRoad.Clear();
978 mdtRegion.Clear();
979 rpcHits.clear();
980 tgcHits.clear();
981 rpcFitResult.Clear();
982 tgcFitResult.Clear();
983 mdtHits.clear();
984 cscHits.clear();
985 stgcHits.clear();
986 mmHits.clear();
987 trackPatterns.clear();
988 TrigL2MuonSA::TrackPattern trackPattern;
989 storeMuonSA(p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
990 rpcFitResult, tgcFitResult, mdtHits, cscHits,
991 stgcHits, mmHits,
992 trackPattern, outputSAs, ctx);
994 muonCB->makePrivateStore();
995 muonCB->setStrategy(-9);
996 muonCB->setErrorFlag(-9);
997 muonCB->setPt(0);
998 muonCB->setEta(99999.);
999 muonCB->setPhi(99999.);
1000 ElementLink<xAOD::L2StandAloneMuonContainer> muonSAEL(outputSAs, outputSAs.size()-1);
1001 muonCB->setMuSATrackLink(muonSAEL);
1002 outputCBs.push_back(muonCB);
1003 }
1004
1005
1006 ATH_MSG_DEBUG("outputSAs size: " << outputSAs.size());
1007 ATH_MSG_DEBUG("idtracks size: " << idtracks.size());
1008 for (auto outputSA : outputSAs){
1009 ATH_MSG_DEBUG("outputSA pt/eta/phi: " << outputSA->pt() << "/" << outputSA->etaMS() << "/" << outputSA->phiMS());
1010 }
1011
1012 ATH_MSG_DEBUG("outputCBs size: " << outputCBs.size());
1013 for (auto outputCB : outputCBs){
1014 ATH_MSG_DEBUG("outputCB pt/eta/phi: " << outputCB->pt() << "/" << outputCB->eta() << "/" << outputCB->phi());
1015 }
1016
1017 ++p_roids;
1018 if (p_roids==roids.end()) break;
1019 }
1020
1021 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMuonSignatureIO success");
1022 return StatusCode::SUCCESS;
1023}
1024
1025// findMuonSignature of L2 multi-track SA version
1026// --------------------------------------------------------------------------------
1027// --------------------------------------------------------------------------------
1028
1029StatusCode MuFastSteering::findMultiTrackSignature(const std::vector<const TrigRoiDescriptor*>& roids,
1030 const std::vector<const xAOD::MuonRoI*>& muonRoIs,
1032 const bool dynamicDeltaRpc,
1033 const EventContext& ctx) const
1034{
1035 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMultiTrackSignature start");
1036 StatusCode sc = StatusCode::SUCCESS;
1037 const float ZERO_LIMIT = 1.e-5;
1038
1039 // for RPC clustering and clusterRoad
1040 std::vector<TrigL2MuonSA::RpcFitResult> clusterFitResults;
1041 std::vector< TrigL2MuonSA::MuonRoad > clusterRoad;
1042 std::vector<TrigL2MuonSA::MdtHits> mdtHits_cluster_normal;
1043
1044
1045 auto prepTimer = Monitored::Timer( "TIME_Data_Preparator" );
1046 auto patternTimer = Monitored::Timer( "TIME_Pattern_Finder" );
1047 auto stationFitterTimer = Monitored::Timer( "TIME_Station_Fitter" );
1048 auto trackFitterTimer = Monitored::Timer( "TIME_Track_Fitter" );
1049 auto trackExtraTimer = Monitored::Timer( "TIME_Track_Extrapolator" );
1050 auto calibrationTimer = Monitored::Timer( "TIME_Calibration_Streamer" );
1051
1052 auto monitorIt = Monitored::Group(m_monTool, prepTimer, patternTimer, stationFitterTimer,
1053 trackFitterTimer, trackExtraTimer, calibrationTimer );
1054
1055 TrigL2MuonSA::RpcHits rpcHits;
1056 TrigL2MuonSA::TgcHits tgcHits;
1057 TrigL2MuonSA::MdtRegion mdtRegion;
1058 TrigL2MuonSA::MuonRoad muonRoad;
1059 TrigL2MuonSA::RpcFitResult rpcFitResult;
1060 TrigL2MuonSA::TgcFitResult tgcFitResult;
1061 TrigL2MuonSA::MdtHits mdtHits;
1062 TrigL2MuonSA::CscHits cscHits;
1063 TrigL2MuonSA::StgcHits stgcHits;
1064 TrigL2MuonSA::MmHits mmHits;
1065
1068
1069 // muonRoIs = RecMURoIs, roids = MURoIs
1070 p_roids = roids.begin();
1071 for (p_roi=(muonRoIs).begin(); p_roi!=(muonRoIs).end(); ++p_roi) {
1072
1073 prepTimer.start();
1074 std::vector<TrigL2MuonSA::TrackPattern> trackPatterns;
1075 rpcHits.clear();
1076 tgcHits.clear();
1077 mdtRegion.Clear();
1078 muonRoad.Clear();
1079 rpcFitResult.Clear();
1080 tgcFitResult.Clear();
1081 mdtHits.clear();
1082 cscHits.clear();
1083 stgcHits.clear();
1084 mmHits.clear();
1085
1086 clusterFitResults.clear();
1087 clusterRoad.clear();
1088 mdtHits_cluster_normal.clear();
1089
1090 if ( m_recMuonRoIUtils.isBarrel(*p_roi) ) { // Barrel
1091 ATH_MSG_DEBUG("Barrel");
1092
1096
1097 // Data preparation
1098 sc = m_dataPreparator->prepareData(ctx,
1099 *p_roi,
1100 *p_roids,
1101 clusterRoad,
1102 clusterFitResults,
1103 mdtHits,
1104 mdtHits_cluster_normal,
1105 dynamicDeltaRpc);
1106
1107 if (!sc.isSuccess()) {
1108 ATH_MSG_WARNING("Data preparation failed");
1109 continue;
1110 }
1111 ATH_MSG_DEBUG("clusterRoad size = " << clusterRoad.size());
1112
1113 prepTimer.stop();
1114
1115 for(unsigned int i_road = 0; i_road < clusterRoad.size(); i_road++){
1116 // Pattern finding
1117 std::vector<TrigL2MuonSA::TrackPattern> tmp_trkPats; tmp_trkPats.clear();
1118
1119 patternTimer.start();
1120 sc = m_patternFinder->findPatterns(ctx,
1121 clusterRoad.at(i_road),
1122 mdtHits_cluster_normal.at(i_road),
1123 tmp_trkPats);
1124 if (!sc.isSuccess()) {
1125 ATH_MSG_WARNING("Pattern finder failed");
1126 continue;
1127 }
1128 patternTimer.stop();
1129
1130 // Superpoint fit
1131 stationFitterTimer.start();
1132 sc = m_stationFitter->findSuperPoints(clusterRoad.at(i_road),
1133 clusterFitResults.at(i_road),
1134 tmp_trkPats);
1135 if (!sc.isSuccess()) {
1136 ATH_MSG_WARNING("Super point fitter failed");
1137 // Update output trigger element
1138 continue;
1139 }
1140 stationFitterTimer.stop();
1141
1142 // Track fitting
1143 trackFitterTimer.start();
1144 sc = m_trackFitter->findTracks(*p_roids,
1145 clusterFitResults.at(i_road),
1146 tmp_trkPats);
1147
1148 if (!sc.isSuccess()) {
1149 ATH_MSG_WARNING("Track fitter failed");
1150 continue;
1151 }
1152 trackFitterTimer.stop();
1153
1154 // fix if eta is strange
1155 const float ETA_LIMIT = 2.8;
1156 const float DELTA_ETA_LIMIT = 1.0;
1157 for (TrigL2MuonSA::TrackPattern& track : tmp_trkPats) {
1158 float roiEta = (*p_roi)->eta();
1159 if (std::abs(track.pt) > ZERO_LIMIT
1160 && ( std::abs(track.etaMap) > ETA_LIMIT || std::abs(track.etaMap-roiEta) > DELTA_ETA_LIMIT ) ) {
1161 track.etaMap = roiEta;
1162 }
1163 }
1164
1165 // Track extrapolation for ID combined
1166 trackExtraTimer.start();
1167
1168 sc = m_trackExtrapolator->extrapolateTrack(tmp_trkPats, m_winPt);
1169 ATH_MSG_DEBUG("test trackExtrapolator end");
1170
1171 if (sc != StatusCode::SUCCESS) {
1172 ATH_MSG_WARNING("Track extrapolator failed");
1173 // Update output trigger element
1174 continue;
1175 }
1176 trackExtraTimer.stop();
1177
1178 if(tmp_trkPats.size() > 0){
1179 ATH_MSG_DEBUG("temp pT calculated 2mu-in-1RoI alg = " << tmp_trkPats[0].pt << " GeV");
1180 if( (std::abs(tmp_trkPats[0].barrelSagitta) < ZERO_LIMIT &&
1181 std::abs(tmp_trkPats[0].barrelRadius) < ZERO_LIMIT) ||
1182 std::abs(tmp_trkPats[0].pt) < ZERO_LIMIT )
1183 continue;
1184 trackPatterns.push_back(tmp_trkPats[0]);
1185 }
1186
1187 storeMuonSA(*p_roi, *p_roids, clusterRoad.at(i_road), mdtRegion, rpcHits, tgcHits,
1188 clusterFitResults.at(i_road), tgcFitResult, mdtHits_cluster_normal.at(i_road), cscHits,
1189 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1190
1191 } // end the clusterRoad loop
1192 if(trackPatterns.empty()){
1193 ATH_MSG_DEBUG("multi-track SA falied to reconstruct muons");
1194 TrigL2MuonSA::TrackPattern trackPattern;
1195 trackPatterns.push_back(trackPattern);
1196 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1197 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1198 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1199
1200 continue;
1201 }
1202 } else { // Endcap
1203 ATH_MSG_DEBUG("Endcap");
1204 if(!m_doEndcapForl2mt){
1205 ATH_MSG_DEBUG("multi-track SA does nothings and skips for EndcapRoI");
1206 } else {
1207 prepTimer.start();
1208 // Data preparation
1209 sc = m_dataPreparator->prepareData(ctx,
1210 *p_roi,
1211 *p_roids,
1213 tgcHits,
1214 muonRoad,
1215 mdtRegion,
1216 tgcFitResult,
1217 mdtHits,
1218 cscHits,
1219 stgcHits,
1220 mmHits);
1221 if (!sc.isSuccess()) {
1222 ATH_MSG_WARNING("Data preparation failed");
1223 TrigL2MuonSA::TrackPattern trackPattern;
1224 trackPatterns.push_back(trackPattern);
1225 // Update output trigger element
1226 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1227 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1228 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1229 continue;
1230 }
1231 prepTimer.stop();
1232
1233 // Pattern finding
1234 patternTimer.start();
1235 sc = m_patternFinder->findPatterns(ctx,
1236 muonRoad,
1237 mdtHits,
1238 stgcHits,
1239 mmHits,
1240 trackPatterns);
1241
1242
1243
1244 if (!sc.isSuccess()) {
1245 ATH_MSG_WARNING("Pattern finder failed");
1246 // Update output trigger element
1247 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1248 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1249 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1250 continue;
1251 }
1252 patternTimer.stop();
1253
1254 // Superpoint fit
1255 stationFitterTimer.start();
1257 sc = m_stationFitter->findSuperPointsSimple(*p_roids,
1258 muonRoad,
1259 tgcFitResult,
1260 trackPatterns,
1261 stgcHits,
1262 mmHits);
1263 }else{
1264 sc = m_stationFitter->findSuperPoints(*p_roids,
1265 muonRoad,
1266 tgcFitResult,
1267 trackPatterns,
1268 stgcHits,
1269 mmHits);
1270 }
1272 m_cscsegmaker->FindSuperPointCsc(cscHits,trackPatterns,tgcFitResult,muonRoad);
1273
1274 if (!sc.isSuccess()) {
1275 ATH_MSG_WARNING("Super point fitter failed");
1276 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1277 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1278 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1279 continue;
1280 }
1281
1282 stationFitterTimer.stop();
1283
1284 // Track fittingh
1285 trackFitterTimer.start();
1286 sc = m_trackFitter->findTracks(*p_roids,
1287 tgcFitResult,
1288 trackPatterns,
1289 muonRoad);
1290
1291 if (!sc.isSuccess()) {
1292 ATH_MSG_WARNING("Track fitter failed");
1293 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1294 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1295 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1296 continue;
1297 }
1298 trackFitterTimer.stop();
1299
1300 // fix if eta is strange
1301 const float ETA_LIMIT = 2.8;
1302 const float DELTA_ETA_LIMIT = 1.0;
1303 for (TrigL2MuonSA::TrackPattern& track : trackPatterns) {
1304 float roiEta = (*p_roi)->eta();
1305 if (std::abs(track.pt) > ZERO_LIMIT
1306 && ( std::abs(track.etaMap) > ETA_LIMIT || std::abs(track.etaMap-roiEta) > DELTA_ETA_LIMIT ) ) {
1307 track.etaMap = roiEta;
1308 }
1309 }
1310
1311 // Track extrapolation for ID combined
1312 trackExtraTimer.start();
1313
1314 sc = m_trackExtrapolator->extrapolateTrack(trackPatterns, m_winPt);
1315
1316 if (sc != StatusCode::SUCCESS) {
1317 ATH_MSG_WARNING("Track extrapolator failed");
1318 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1319 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1320 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1321 continue;
1322 }
1323 trackExtraTimer.stop();
1324
1325 storeMuonSA(*p_roi, *p_roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1326 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1327 stgcHits, mmHits, trackPatterns.back(), outputTracks, ctx);
1328 }
1329 }
1330 // Update monitoring variables
1331 sc = updateMonitor(*p_roi, mdtHits, trackPatterns );
1332 if (sc != StatusCode::SUCCESS) {
1333 ATH_MSG_WARNING("Failed to update monitoring variables");
1334 }
1335
1336 ++p_roids;
1337 if (p_roids==roids.end()) break;
1338 }
1339
1340 ATH_MSG_DEBUG("StatusCode MuFastSteering::findMultiTrackSignature success");
1341 return StatusCode::SUCCESS;
1342}
1343
1344// --------------------------------------------------------------------------------
1345// --------------------------------------------------------------------------------
1346
1348 const TrigRoiDescriptor* roids,
1349 const TrigL2MuonSA::MuonRoad& muonRoad,
1350 const TrigL2MuonSA::MdtRegion& mdtRegion,
1351 const TrigL2MuonSA::RpcHits& rpcHits,
1352 const TrigL2MuonSA::TgcHits& tgcHits,
1353 const TrigL2MuonSA::RpcFitResult& rpcFitResult,
1354 const TrigL2MuonSA::TgcFitResult& tgcFitResult,
1355 const TrigL2MuonSA::MdtHits& mdtHits,
1356 const TrigL2MuonSA::CscHits& cscHits,
1357 const TrigL2MuonSA::StgcHits& stgcHits,
1358 const TrigL2MuonSA::MmHits& mmHits,
1359 const std::vector<TrigL2MuonSA::TrackPattern>& trackPatterns,
1363 const EventContext& ctx) const
1364{
1365
1366 if( trackPatterns.size() > 0 ) {
1367
1368 const TrigL2MuonSA::TrackPattern& pattern = trackPatterns.back();
1369
1370 // Update output trigger element
1371 storeMuonSA(roi, roids, muonRoad, mdtRegion, rpcHits, tgcHits,
1372 rpcFitResult, tgcFitResult, mdtHits, cscHits,
1373 stgcHits, mmHits,
1374 pattern, outputTracks, ctx);
1375 storeMSRoiDescriptor(roids, pattern, outputTracks, outputMS);
1376 storeIDRoiDescriptor(roids, pattern, outputTracks, outputID);
1377
1378 } else {
1379 ATH_MSG_DEBUG("Not update output objects because trackPatterns has no object");
1380 }
1381
1382 return true;
1383}
1384
1386 const TrigRoiDescriptor* roids,
1387 const TrigL2MuonSA::MuonRoad& muonRoad,
1388 const TrigL2MuonSA::MdtRegion& mdtRegion,
1389 const TrigL2MuonSA::RpcHits& rpcHits,
1390 const TrigL2MuonSA::TgcHits& tgcHits,
1391 const TrigL2MuonSA::RpcFitResult& rpcFitResult,
1392 const TrigL2MuonSA::TgcFitResult& tgcFitResult,
1393 const TrigL2MuonSA::MdtHits& mdtHits,
1394 const TrigL2MuonSA::CscHits& cscHits,
1395 const TrigL2MuonSA::StgcHits& stgcHits,
1396 const TrigL2MuonSA::MmHits& mmHits,
1397 const TrigL2MuonSA::TrackPattern& pattern,
1399 const EventContext& ctx ) const
1400{
1401 const float ZERO_LIMIT = 1.e-5;
1402
1403 const int currentRoIId = roids->roiId();
1404
1405 const EventIDBase& eventID = ctx.eventID();
1406 auto eventInfo = SG::makeHandle(m_eventInfoKey, ctx);
1407 if (!eventInfo.isValid()) {
1408 ATH_MSG_ERROR("Failed to retrieve xAOD::EventInfo object");
1409 return false;
1410 }
1411
1412 int inner = 0;
1413 int middle = 1;
1414 int outer = 2;
1415 int ee = 6;
1416 int csc = 7;
1417 int barrelinner = 0;
1418 int endcapinner = 3;
1419 int bee = 8;
1420 int bme = 9;
1421 // int bmg = 10;
1422
1423 // define inner, middle, outer
1424 if (pattern.s_address==-1) {
1431 } else {
1437 }
1438
1439 ATH_MSG_DEBUG("### Hit patterns at the Muon Spectrometer ###");
1440 ATH_MSG_DEBUG("pattern#0: # of hits at inner =" << pattern.mdtSegments[inner].size());
1441 ATH_MSG_DEBUG("pattern#0: # of hits at middle =" << pattern.mdtSegments[middle].size());
1442 ATH_MSG_DEBUG("pattern#0: # of hits at outer =" << pattern.mdtSegments[outer].size());
1443 if (pattern.s_address==-1){
1444 ATH_MSG_DEBUG("pattern#0: # of hits at ee =" << pattern.mdtSegments[ee].size());
1445 ATH_MSG_DEBUG("pattern#0: # of hits at endcap barrel inner =" << pattern.mdtSegments[barrelinner].size());
1446 ATH_MSG_DEBUG("pattern#0: # of hits at BEE =" << pattern.mdtSegments[bee].size());
1447 } else {
1448 ATH_MSG_DEBUG("pattern#0: # of hits at BME =" << pattern.mdtSegments[bme].size());
1449 ATH_MSG_DEBUG("pattern#0: # of hits at barrel endcap inner =" << pattern.mdtSegments[endcapinner].size());
1450 }
1451 ATH_MSG_DEBUG("### ************************************* ###");
1452 ATH_MSG_DEBUG("Estimated muon pt = " << pattern.pt << " GeV");
1453
1454 // ---------
1455 // store xAOD
1456
1458 muonSA->makePrivateStore();
1459
1460 // add pT
1461 muonSA->setPt(pattern.pt*pattern.charge);
1462 muonSA->setPtEndcapAlpha(pattern.ptEndcapAlpha*pattern.charge);
1463 muonSA->setPtEndcapBeta(pattern.ptEndcapBeta*pattern.charge);
1464 muonSA->setPtEndcapRadius(pattern.ptEndcapRadius*pattern.charge);
1465 muonSA->setPtCSC(pattern.ptCSC*pattern.charge);
1466
1467 muonSA->setEta(pattern.etaVtx);
1468 muonSA->setPhi(pattern.phiVtx);
1469 muonSA->setDeltaPt(pattern.deltaPt);
1470 muonSA->setDeltaEta(pattern.deltaEtaVtx);
1471 muonSA->setDeltaPhi(pattern.deltaPhiVtx);
1472
1473 // add s_address
1474 muonSA->setSAddress(pattern.s_address);
1475
1476 // add positions at MS
1477 muonSA->setEtaMS(pattern.etaMap);
1478 muonSA->setPhiMS(pattern.phiMS);
1479 muonSA->setDirPhiMS(pattern.phiMSDir);
1480 muonSA->setRMS(pattern.superPoints[inner].R);
1481 muonSA->setZMS(pattern.superPoints[inner].Z);
1482 muonSA->setDirZMS(pattern.superPoints[inner].Alin);
1483
1484 // add pt variables
1485 // Endcap
1486 muonSA->setEndcapAlpha(pattern.endcapAlpha);
1487 muonSA->setEndcapBeta(pattern.endcapBeta);
1488 muonSA->setEndcapRadius(pattern.endcapRadius3P);
1489 // Barrel
1490 muonSA->setBarrelRadius(pattern.barrelRadius);
1491 muonSA->setBarrelSagitta(pattern.barrelSagitta);
1492
1493 // store eta and phi used as argument to pT LUT
1494 muonSA->setEtaMap(pattern.etaMap);
1495 muonSA->setPhiMap(pattern.phiMap);
1496 muonSA->setEtaBin(pattern.etaBin);
1497 muonSA->setPhiBin(pattern.phiBin);
1498
1499 // store TGC/RPC readout failure flags
1500 muonSA->setIsTgcFailure((int)pattern.isTgcFailure);
1501 muonSA->setIsRpcFailure((int)pattern.isRpcFailure);
1502
1503 // add superpoints
1504 muonSA->setSuperPoint(inner, pattern.superPoints[inner].R, pattern.superPoints[inner].Z,
1505 pattern.superPoints[inner].Alin, pattern.superPoints[inner].Blin, pattern.superPoints[inner].Chi2);
1506 muonSA->setSuperPoint(middle, pattern.superPoints[middle].R, pattern.superPoints[middle].Z,
1507 pattern.superPoints[middle].Alin, pattern.superPoints[middle].Blin, pattern.superPoints[middle].Chi2);
1508 muonSA->setSuperPoint(outer, pattern.superPoints[outer].R, pattern.superPoints[outer].Z,
1509 pattern.superPoints[outer].Alin, pattern.superPoints[outer].Blin, pattern.superPoints[outer].Chi2);
1510 if (pattern.s_address==-1){
1511 muonSA->setSuperPoint(ee, pattern.superPoints[ee].R, pattern.superPoints[ee].Z,
1512 pattern.superPoints[ee].Alin, pattern.superPoints[ee].Blin, pattern.superPoints[ee].Chi2);
1513 muonSA->setSuperPoint(barrelinner, pattern.superPoints[barrelinner].R, pattern.superPoints[barrelinner].Z,
1514 pattern.superPoints[barrelinner].Alin, pattern.superPoints[barrelinner].Blin, pattern.superPoints[barrelinner].Chi2);
1515 muonSA->setSuperPoint(csc, pattern.superPoints[csc].R, pattern.superPoints[csc].Z,
1516 pattern.superPoints[csc].Alin, pattern.superPoints[csc].Blin, pattern.superPoints[csc].Chi2);
1517 } else {
1518 muonSA->setSuperPoint(endcapinner, pattern.superPoints[endcapinner].R, pattern.superPoints[endcapinner].Z,
1519 pattern.superPoints[endcapinner].Alin, pattern.superPoints[endcapinner].Blin, pattern.superPoints[endcapinner].Chi2);
1520 }
1521
1523 // Below are detailed information
1524
1525 uint32_t muondetmask = 0;
1526
1528 muonSA->setAlgoId( L2MuonAlgoMap(name()) );
1530 //muonSA->setTeId( inputTE->getId() ); // move to hltExecute()
1532 muonSA->setLvl1Id( eventInfo->extendedLevel1ID() );
1534 muonSA->setLumiBlock( eventID.lumi_block() );
1536 muonSA->setMuonDetMask( muondetmask );
1538 muonSA->setRoiId( currentRoIId );
1540 muonSA->setRoiSystem( roi->getSource() );
1542 muonSA->setRoiSubsystem( 1 - roi->getHemisphere() );
1544 muonSA->setRoiSector( roi->getSectorID() );
1546 muonSA->setRoiNumber( roi->getRoI() );
1548 muonSA->setRoiThreshold( roi->getThrNumber() );
1550 muonSA->setRoiEta( roi->eta() );
1552 muonSA->setRoiPhi( roi->phi() );
1554 muonSA->setRoIWord( roi->roiWord() );
1555
1563
1564 // MDT hits
1565 std::vector<std::string> mdtId;
1566 for (const TrigL2MuonSA::MdtHitData& mdtHit : mdtHits) {
1567 if ( mdtHit.isOutlier==0 || mdtHit.isOutlier==1 ) {
1568 muonSA->setMdtHit(mdtHit.OnlineId, mdtHit.isOutlier, mdtHit.Chamber,
1569 mdtHit.R, mdtHit.Z, mdtHit.cPhi0, mdtHit.Residual,
1570 mdtHit.DriftTime, mdtHit.DriftSpace, mdtHit.DriftSigma);
1571 mdtId.push_back(mdtHit.Id.getString());
1572 }
1573 }
1574 static const SG::Accessor< std::vector<std::string> > accessor_mdthitid( "mdtHitId" );
1575 accessor_mdthitid( *muonSA ) = mdtId;
1576
1577 //CSC hits
1578 std::vector<float> cscResol;
1579 for (const TrigL2MuonSA::CscHitData& cscHit : cscHits) {
1580 if ( 1/*cscHit.MeasuresPhi==0*/ ){
1581 if ( cscHit.isOutlier==0 || cscHit.isOutlier==1 ) {
1582 muonSA->setCscHit(cscHit.isOutlier, cscHit.Chamber, cscHit.StationName,
1583 cscHit.StationEta, cscHit.StationPhi,
1584 cscHit.ChamberLayer, cscHit.WireLayer, cscHit.MeasuresPhi, cscHit.Strip,
1585 cscHit.eta, cscHit.phi, cscHit.r, cscHit.z,
1586 cscHit.charge, cscHit.time, cscHit.Residual);
1587 cscResol.push_back(cscHit.resolution);
1588 ATH_MSG_VERBOSE("CSC Hits stored in xAOD: "
1589 << "OL=" << cscHit.isOutlier << ","
1590 << "Ch=" << cscHit.Chamber << ","
1591 << "StationName=" << cscHit.StationName << ","
1592 << "StationEta=" << cscHit.StationEta << ","
1593 << "StationPhi=" << cscHit.StationPhi << ","
1594 << "ChamberLayer=" << cscHit.ChamberLayer << ","
1595 << "WireLayer=" << cscHit.WireLayer << ","
1596 << "MeasuresPhi=" << cscHit.MeasuresPhi << ","
1597 << "Strip=" << cscHit.Strip << ","
1598 << "eta=" << cscHit.eta << ","
1599 << "phi=" << cscHit.phi << ","
1600 << "r=" << cscHit.r << ","
1601 << "z=" << cscHit.z << ","
1602 << "charge=" << cscHit.charge << ","
1603 << "Rs=" << cscHit.Residual << ","
1604 << "t=" << cscHit.time);
1605 }
1606 }
1607 }
1608 static const SG::Accessor< std::vector<float> > accessor_cschitresol( "cscHitResolution" );
1609 accessor_cschitresol( *muonSA ) = cscResol;
1610
1611 // RPC hits
1612 float sumbeta[8]={0};
1613 float nhit_layer[8]={0};
1614 for (const TrigL2MuonSA::RpcHitData& rpcHit : rpcHits) {
1615 muonSA->setRpcHit(rpcHit.layer, rpcHit.measuresPhi,
1616 rpcHit.x, rpcHit.y, rpcHit.z,
1617 rpcHit.time, rpcHit.distToEtaReadout, rpcHit.distToPhiReadout,
1618 rpcHit.stationName);
1619 ATH_MSG_VERBOSE("RPC hits stored in xAOD: "
1620 << "stationName=" << rpcHit.stationName << ","
1621 << "layer=" << rpcHit.layer << ","
1622 << "measuresPhi=" << rpcHit.measuresPhi << ","
1623 << "x=" << rpcHit.x << ","
1624 << "y=" << rpcHit.y << ","
1625 << "y=" << rpcHit.z);
1626
1627 float dRMS = std::sqrt( std::abs(pattern.etaMap-rpcHit.eta)*std::abs(pattern.etaMap-rpcHit.eta) + std::acos(std::cos(pattern.phiMS-rpcHit.phi))*std::acos(std::cos(pattern.phiMS-rpcHit.phi)) );
1628 if(dRMS>0.05) continue;
1629 float muToF = rpcHit.l/1000/(CLHEP::c_light/1000);
1630 float Tprop = rpcHit.distToPhiReadout/1000*4.8;
1631 float beta = rpcHit.l/1000/(muToF+rpcHit.time-Tprop+3.125/2)/(CLHEP::c_light/1000);
1632 sumbeta[rpcHit.layer]=sumbeta[rpcHit.layer]+beta;
1633 nhit_layer[rpcHit.layer]=nhit_layer[rpcHit.layer]+1;
1634 }
1635
1636 std::vector<float> Avebeta_layer;
1637 for(int i_layer=0;i_layer<8;i_layer++){
1638 if(nhit_layer[i_layer]!=0)Avebeta_layer.push_back( sumbeta[i_layer]/nhit_layer[i_layer] );
1639 }
1640 if(Avebeta_layer.size()>0) muonSA->setBeta( std::accumulate(Avebeta_layer.begin(),Avebeta_layer.end(),0.0)/Avebeta_layer.size() );
1641 else muonSA->setBeta( 9999 );
1642 Avebeta_layer.clear();
1643
1644 // TGC hits
1645 for (const TrigL2MuonSA::TgcHitData& tgcHit : tgcHits) {
1646 muonSA->setTgcHit(tgcHit.eta, tgcHit.phi, tgcHit.r, tgcHit.z,
1647 tgcHit.width, tgcHit.sta, tgcHit.isStrip,
1648 tgcHit.bcTag, tgcHit.inRoad);
1649 ATH_MSG_VERBOSE("TGC hits stored in xAOD: "
1650 << "eta=" << tgcHit.eta << ","
1651 << "phi=" << tgcHit.phi << ","
1652 << "r=" << tgcHit.r << ","
1653 << "z=" << tgcHit.z << ","
1654 << "width=" << tgcHit.width << ","
1655 << "stationNum=" << tgcHit.sta << ","
1656 << "isStrip=" << tgcHit.isStrip << ","
1657 << "bcTag=" << tgcHit.bcTag << ","
1658 << "inRoad=" << tgcHit.inRoad);
1659 }
1660
1661
1662 // sTGC clusters
1663 for(unsigned int i_hit=0; i_hit<stgcHits.size(); i_hit++) {
1664 if ( stgcHits[i_hit].isOutlier==0 || stgcHits[i_hit].isOutlier==1 ) {
1665
1666
1667 muonSA->setStgcCluster(stgcHits[i_hit].layerNumber, stgcHits[i_hit].isOutlier, stgcHits[i_hit].channelType,
1668 stgcHits[i_hit].eta, stgcHits[i_hit].phi, stgcHits[i_hit].r, stgcHits[i_hit].z,
1669 stgcHits[i_hit].ResidualR, stgcHits[i_hit].ResidualPhi,
1670 stgcHits[i_hit].stationEta, stgcHits[i_hit].stationPhi, stgcHits[i_hit].stationName);
1671
1672 ATH_MSG_VERBOSE("sTGC hits stored in xAOD: "
1673 << "eta=" << stgcHits[i_hit].eta << ","
1674 << "phi=" << stgcHits[i_hit].phi << ","
1675 << "r=" << stgcHits[i_hit].r << ","
1676 << "z=" << stgcHits[i_hit].z << ","
1677 << "z=" << stgcHits[i_hit].ResidualR << ","
1678 << "z=" << stgcHits[i_hit].ResidualPhi);
1679 }
1680 }
1681
1682 // MM clusters
1683 for(unsigned int i_hit=0; i_hit<mmHits.size(); i_hit++) {
1684 if ( mmHits[i_hit].isOutlier==0 || mmHits[i_hit].isOutlier==1 ) {
1685
1686
1687 muonSA->setMmCluster(mmHits[i_hit].layerNumber, mmHits[i_hit].isOutlier,
1688 mmHits[i_hit].eta, mmHits[i_hit].phi, mmHits[i_hit].r, mmHits[i_hit].z,
1689 mmHits[i_hit].ResidualR, mmHits[i_hit].ResidualPhi,
1690 mmHits[i_hit].stationEta, mmHits[i_hit].stationPhi, mmHits[i_hit].stationName);
1691
1692 ATH_MSG_VERBOSE("mm hits stored in xAOD: "
1693 << "eta=" << tgcHits[i_hit].eta << ","
1694 << "phi=" << tgcHits[i_hit].phi << ","
1695 << "r=" << tgcHits[i_hit].r << ","
1696 << "z=" << tgcHits[i_hit].z << ","
1697 << "width=" << tgcHits[i_hit].width << ","
1698 << "stationNum=" << tgcHits[i_hit].sta << ","
1699 << "isStrip=" << tgcHits[i_hit].isStrip << ","
1700 << "bcTag=" << tgcHits[i_hit].bcTag << ","
1701 << "inRoad=" << tgcHits[i_hit].inRoad);
1702 }
1703 }
1704
1705 // Muon road
1706 for (int i_station=0; i_station<8; i_station++) {
1707 for (int i_sector=0; i_sector<2; i_sector++) {
1708 muonSA->setRoad(i_station, i_sector, muonRoad.aw[i_station][i_sector], muonRoad.bw[i_station][i_sector]);
1709 muonSA->setRegionZ(i_station, i_sector, mdtRegion.zMin[i_station][i_sector], mdtRegion.zMax[i_station][i_sector]);
1710 muonSA->setRegionR(i_station, i_sector, mdtRegion.rMin[i_station][i_sector], mdtRegion.rMax[i_station][i_sector]);
1711 muonSA->setRegionEta(i_station, i_sector, mdtRegion.etaMin[i_station][i_sector], mdtRegion.etaMax[i_station][i_sector]);
1712 muonSA->setChamberType1(i_station, i_sector, mdtRegion.chamberType[i_station][i_sector][0]);
1713 muonSA->setChamberType2(i_station, i_sector, mdtRegion.chamberType[i_station][i_sector][1]);
1714 }
1715 }
1716
1717 if ( muonRoad.isEndcap ) {
1718 // TGC fit results
1719 if (tgcFitResult.isSuccess ) {
1720 muonSA->setTgcPt(tgcFitResult.tgcPT);
1721
1722 muonSA->setTgcInn(tgcFitResult.tgcInn[0], tgcFitResult.tgcInn[1],
1723 tgcFitResult.tgcInn[2], tgcFitResult.tgcInn[3]);
1724 muonSA->setTgcInnF(tgcFitResult.tgcInnRhoStd, tgcFitResult.tgcInnRhoNin,
1725 tgcFitResult.tgcInnPhiStd, tgcFitResult.tgcInnPhiNin);
1726
1727 muonSA->setTgcMid1(tgcFitResult.tgcMid1[0], tgcFitResult.tgcMid1[1],
1728 tgcFitResult.tgcMid1[2], tgcFitResult.tgcMid1[3]);
1729 muonSA->setTgcMid2(tgcFitResult.tgcMid2[0], tgcFitResult.tgcMid2[1],
1730 tgcFitResult.tgcMid2[2], tgcFitResult.tgcMid2[3]);
1731 muonSA->setTgcMidF(tgcFitResult.tgcMidRhoChi2, tgcFitResult.tgcMidRhoNin,
1732 tgcFitResult.tgcMidPhiChi2, tgcFitResult.tgcMidPhiNin);
1733 }
1734 } else {
1735 // RPC fit results
1736 if (rpcFitResult.isSuccess ) {
1737 // Fill middle fit results for the moment
1738
1739 muonSA->setRpcFitInn(rpcFitResult.phi_inner, rpcFitResult.slope_inner, rpcFitResult.offset_inner);
1740 muonSA->setRpcFitMid(rpcFitResult.phi_middle, rpcFitResult.slope_middle, rpcFitResult.offset_middle);
1741 muonSA->setRpcFitOut(rpcFitResult.phi_outer, rpcFitResult.slope_outer, rpcFitResult.offset_outer);
1742 }
1743 }
1744
1745 // Store track positions if set of (R, Z, eta, phi) are all available
1746 if (pattern.s_address==-1) { // endcap
1747
1748 // Inner
1749 if ( std::abs(pattern.superPoints[inner].R) > ZERO_LIMIT && std::abs(pattern.superPoints[inner].Z) > ZERO_LIMIT ) { // if R and Z exist
1750 if ( tgcFitResult.isSuccess && std::abs(tgcFitResult.tgcInn[3]) > ZERO_LIMIT ) { // if phi exist
1751 float theta = std::atan(pattern.superPoints[inner].R/std::abs(pattern.superPoints[inner].Z));
1752 float eta = (std::tan(theta/2.)!=0.)? -std::log(std::tan(theta/2.))*pattern.superPoints[inner].Z/std::abs(pattern.superPoints[inner].Z): 0.;
1753 muonSA->setTrackPosition( pattern.superPoints[inner].R, pattern.superPoints[inner].Z, eta, tgcFitResult.tgcInn[1] );
1754 }
1755 }
1756
1757 // Middle
1758 if ( std::abs(pattern.superPoints[middle].R) > ZERO_LIMIT && std::abs(pattern.superPoints[middle].Z) > ZERO_LIMIT ) { // if R and Z exist
1759 float phi = 0;
1760 if (tgcFitResult.isSuccess && ( std::abs(tgcFitResult.tgcMid1[3]) > ZERO_LIMIT || std::abs(tgcFitResult.tgcMid2[3]) > ZERO_LIMIT )) { // if phi exist
1761 double phi1 = tgcFitResult.tgcMid1[1];
1762 double phi2 = tgcFitResult.tgcMid2[1];
1763 if ( tgcFitResult.tgcMid1[3]==0. || tgcFitResult.tgcMid2[3]==0. ) {
1764 if ( std::abs(tgcFitResult.tgcMid1[3]) > ZERO_LIMIT ) phi = phi1;
1765 if ( std::abs(tgcFitResult.tgcMid2[3]) > ZERO_LIMIT ) phi = phi2;
1766 } else if( phi1*phi2 < 0 && std::abs(phi1)>(M_PI/2.) ) {
1767 double tmp1 = (phi1>0)? phi1 - M_PI : phi1 + M_PI;
1768 double tmp2 = (phi2>0)? phi2 - M_PI : phi2 + M_PI;
1769 double tmp = (tmp1+tmp2)/2.;
1770 phi = (tmp>0.)? tmp - M_PI : tmp + M_PI;
1771 } else {
1772 phi = (phi2+phi1)/2.;
1773 }
1774 } else {
1775 phi = roi->phi();
1776 }
1777 float theta = std::atan(pattern.superPoints[middle].R/std::abs(pattern.superPoints[middle].Z));
1778 float eta = (std::tan(theta/2.)!=0.)? -std::log(std::tan(theta/2.))*pattern.superPoints[middle].Z/std::abs(pattern.superPoints[middle].Z): 0.;
1779 muonSA->setTrackPosition( pattern.superPoints[middle].R, pattern.superPoints[middle].Z, eta, phi );
1780 }
1781
1782 } else { // barrel
1783
1784 // Middle
1785 if ( std::abs(pattern.superPoints[middle].R) > ZERO_LIMIT && std::abs(pattern.superPoints[middle].Z) > ZERO_LIMIT ) { // if R and Z exist
1786 float phi = 0;
1787 if (rpcFitResult.isSuccess) {
1788 phi = rpcFitResult.phi;
1789 } else {
1790 phi = roi->phi();
1791 }
1792 float theta = std::atan(pattern.superPoints[middle].R/std::abs(pattern.superPoints[middle].Z));
1793 float eta = (std::tan(theta/2.)!=0.)? -std::log(std::tan(theta/2.))*pattern.superPoints[middle].Z/std::abs(pattern.superPoints[middle].Z): 0.;
1794 muonSA->setTrackPosition( pattern.superPoints[middle].R, pattern.superPoints[middle].Z, eta, phi );
1795 }
1796
1797 // Not stored outer position for the moment as the phi is not available
1798
1799 }
1800 outputTracks.push_back(muonSA);
1801
1802 return true;
1803}
1804
1805
1807 const TrigL2MuonSA::TrackPattern& pattern,
1808 const DataVector<xAOD::L2StandAloneMuon>& outputTracks,
1809 TrigRoiDescriptorCollection& outputMS) const
1810{
1811 const float ZERO_LIMIT = 1.e-5;
1812
1813 const xAOD::L2StandAloneMuon* muonSA = outputTracks[0];
1814
1815 float mseta = pattern.etaMap;
1816 float msphi = pattern.phiMS;
1817
1818 // store TrigRoiDescriptor
1819 if (std::abs(muonSA->pt()) < ZERO_LIMIT ) {
1820 mseta = roids->eta();
1821 msphi = roids->phi();
1822 }
1823
1824 // set width of 0.1 so that ID tracking monitoring works
1825 const float phiHalfWidth = 0.1;
1826 const float etaHalfWidth = 0.1;
1827
1828 TrigRoiDescriptor* MSroiDescriptor = new TrigRoiDescriptor(roids->roiWord(),
1829 roids->l1Id(),
1830 roids->roiId(),
1831 mseta,
1832 mseta - etaHalfWidth,
1833 mseta + etaHalfWidth,
1834 msphi,
1835 msphi - phiHalfWidth,
1836 msphi + phiHalfWidth);
1837
1838 ATH_MSG_VERBOSE("...TrigRoiDescriptor for MS "
1839 << "mseta/msphi="
1840 << mseta << "/" << msphi);
1841
1842 ATH_MSG_VERBOSE("will Record an RoiDescriptor for TrigMoore:"
1843 << " phi=" << MSroiDescriptor->phi()
1844 << ", eta=" << MSroiDescriptor->eta());
1845
1846 outputMS.push_back(MSroiDescriptor);
1847
1848 return true;
1849}
1850
1851
1853 const TrigL2MuonSA::TrackPattern& pattern,
1854 const DataVector<xAOD::L2StandAloneMuon>& outputTracks,
1855 TrigRoiDescriptorCollection& outputID) const
1856{
1857
1858 if (m_fill_FSIDRoI) { // this mode will be used in cosmic run, if ID expert want to run full scan FTF.
1859 TrigRoiDescriptor* IDroiDescriptor = new TrigRoiDescriptor(true);
1860 outputID.push_back(IDroiDescriptor);
1861 return true;
1862 }
1863
1864 const float ZERO_LIMIT = 1.e-5;
1865
1866 const double scalePhiWidthForFailure = 2;
1867 const double scaleRoIforZeroPt = 2;
1868
1869 const xAOD::L2StandAloneMuon* muonSA = outputTracks[0];
1870
1871 // store TrigRoiDescriptor
1872 if (std::abs(muonSA->pt()) > ZERO_LIMIT ) {
1873
1874 // patch for the ID RoI descriptor
1875 float phiHalfWidth = 0.1;
1876 float etaHalfWidth = 0.1;
1877
1878 // 2010 runs
1879 // if ( std::abs(pattern.etaVtx)>1 && std::abs(pattern.etaVtx)<1.5 ) {
1880 // phiHalfWidth = 0.25;
1881 // etaHalfWidth = 0.4;
1882 // } else {
1883 // phiHalfWidth = 0.1;
1884 // etaHalfWidth = 0.15;
1885 // }
1886
1887 // 2011a tuning
1888 phiHalfWidth = getRoiSizeForID(false,muonSA);
1889 etaHalfWidth = getRoiSizeForID(true, muonSA);
1890
1891 if (pattern.isTgcFailure || pattern.isRpcFailure)
1892 phiHalfWidth *= scalePhiWidthForFailure;
1893
1894 TrigRoiDescriptor* IDroiDescriptor = new TrigRoiDescriptor(roids->roiWord(),
1895 roids->l1Id(),
1896 roids->roiId(),
1897 pattern.etaVtx,
1898 pattern.etaVtx - etaHalfWidth,
1899 pattern.etaVtx + etaHalfWidth,
1900 pattern.phiVtx,
1901 pattern.phiVtx - phiHalfWidth,
1902 pattern.phiVtx + phiHalfWidth);
1903
1904 ATH_MSG_VERBOSE("...TrigRoiDescriptor for ID "
1905 << "pattern.etaVtx/pattern.phiVtx="
1906 << pattern.etaVtx << "/" << pattern.phiVtx);
1907
1908 ATH_MSG_VERBOSE("will Record an RoiDescriptor for Inner Detector:"
1909 << " phi=" << IDroiDescriptor->phi()
1910 << ", eta=" << IDroiDescriptor->eta());
1911
1912 outputID.push_back(IDroiDescriptor);
1913
1914 } else { // pt = 0.
1915
1916 TrigRoiDescriptor* IDroiDescriptor = new TrigRoiDescriptor(roids->roiWord(),
1917 roids->l1Id(),
1918 roids->roiId(),
1919 roids->eta(),
1920 roids->eta() - (roids->eta() - roids->etaMinus()) * scaleRoIforZeroPt,
1921 roids->eta() + (roids->etaPlus() - roids->eta()) * scaleRoIforZeroPt,
1922 roids->phi(),
1923 CxxUtils::wrapToPi(roids->phi() - CxxUtils::wrapToPi(roids->phiPlus() - roids->phiMinus())/2. * scaleRoIforZeroPt),
1924 CxxUtils::wrapToPi(roids->phi() + CxxUtils::wrapToPi(roids->phiPlus() - roids->phiMinus())/2. * scaleRoIforZeroPt));
1925
1926 ATH_MSG_VERBOSE("will Record an RoiDescriptor for Inner Detector in case with zero pT:"
1927 << " phi=" << IDroiDescriptor->phi()
1928 << ", phi min=" << IDroiDescriptor->phiMinus()
1929 << ", phi max=" << IDroiDescriptor->phiPlus()
1930 << ", eta=" << IDroiDescriptor->eta()
1931 << ", eta min=" << IDroiDescriptor->etaMinus()
1932 << ", eta max=" << IDroiDescriptor->etaPlus());
1933
1934 outputID.push_back(IDroiDescriptor);
1935 }
1936
1937 return true;
1938}
1939
1940
1941// --------------------------------------------------------------------------------
1942// --------------------------------------------------------------------------------
1943
1944int MuFastSteering::L2MuonAlgoMap(const std::string& name) const
1945{
1946 int algoId = 0;
1947 if (name == "MuFastSteering_Muon") {
1949 } else if (name == "MuFastSteering_900GeV") {
1951 } else {
1953 }
1954
1955 return algoId;
1956}
1957
1958// --------------------------------------------------------------------------------
1959// --------------------------------------------------------------------------------
1960
1961float MuFastSteering::getRoiSizeForID(bool isEta, const xAOD::L2StandAloneMuon* muonSA) const
1962{
1963 bool isBarrel = (muonSA->sAddress()==-1) ? true : false;
1964 float eta = muonSA->etaMS();
1965 float phi = muonSA->phiMS();
1966 float pt = muonSA->pt();
1967
1968 //
1969 const int N_PARAMS = 2;
1970
1971 //
1972 const float etaMinWin_brl = 0.10;
1973 const float etaMinWin_ec1 = 0.10;
1974 const float etaMinWin_ec2 = 0.10;
1975 const float etaMinWin_ec3 = 0.10;
1976 const float etaMinWin_ecA = 0.10;
1977 const float etaMinWin_ecB = 0.10;
1978
1979 const float etaMaxWin_brl = 0.20;
1980 const float etaMaxWin_ec1 = 0.20;
1981 const float etaMaxWin_ec2 = 0.20;
1982 const float etaMaxWin_ec3 = 0.20;
1983 const float etaMaxWin_ecA = 0.20;
1984 const float etaMaxWin_ecB = 0.20;
1985
1986 const float etaParams_brl[N_PARAMS] = { 0.038, 0.284};
1987 const float etaParams_ec1[N_PARAMS] = { 0.011, 0.519};
1988 const float etaParams_ec2[N_PARAMS] = { 0.023, 0.253};
1989 const float etaParams_ec3[N_PARAMS] = { 0.018, 0.519};
1990 const float etaParams_ecA[N_PARAMS] = { 0.010, 0.431};
1991 const float etaParams_ecB[N_PARAMS] = { 0.023, 0.236};
1992
1993 //
1994 const float phiMinWin_brl = 0.125;
1995 const float phiMinWin_ec1 = 0.125;
1996 const float phiMinWin_ec2 = 0.125;
1997 const float phiMinWin_ec3 = 0.10;
1998 const float phiMinWin_ecA = 0.15;
1999 const float phiMinWin_ecB = 0.15;
2000
2001 const float phiMaxWin_brl = 0.20;
2002 const float phiMaxWin_ec1 = 0.20;
2003 const float phiMaxWin_ec2 = 0.20;
2004 const float phiMaxWin_ec3 = 0.20;
2005 const float phiMaxWin_ecA = 0.25;
2006 const float phiMaxWin_ecB = 0.20;
2007
2008 const float phiParams_brl[N_PARAMS] = { 0.000, 0.831};
2009 const float phiParams_ec1[N_PARAMS] = { 0.000, 0.885};
2010 const float phiParams_ec2[N_PARAMS] = { 0.015, 0.552};
2011 const float phiParams_ec3[N_PARAMS] = { 0.008, 0.576};
2012 const float phiParams_ecA[N_PARAMS] = { 0.000, 0.830};
2013 const float phiParams_ecB[N_PARAMS] = { 0.006, 1.331};
2014
2015 //
2016 float minWin;
2017 float maxWin;
2018 float params[N_PARAMS];
2019 if( isBarrel ) {
2020 if( isEta ) {
2021 memcpy(params,etaParams_brl,sizeof(params));
2022 minWin = etaMinWin_brl;
2023 maxWin = etaMaxWin_brl;
2024 }
2025 else {
2026 memcpy(params,phiParams_brl,sizeof(params));
2027 minWin = phiMinWin_brl;
2028 maxWin = phiMaxWin_brl;
2029 }
2030 }
2031 else { // endcap
2034
2035 if( isEta ) {
2036 memcpy(params,etaParams_ecA,sizeof(params));
2037 minWin = etaMinWin_ecA;
2038 maxWin = etaMaxWin_ecA;
2039 }
2040 else {
2041 memcpy(params,phiParams_ecA,sizeof(params));
2042 minWin = phiMinWin_ecA;
2043 maxWin = phiMaxWin_ecA;
2044 }
2045 }
2047 if( isEta ) {
2048 memcpy(params,etaParams_ecB,sizeof(params));
2049 minWin = etaMinWin_ecB;
2050 maxWin = etaMaxWin_ecB;
2051 }
2052 else {
2053 memcpy(params,phiParams_ecB,sizeof(params));
2054 minWin = phiMinWin_ecB;
2055 maxWin = phiMaxWin_ecB;
2056 }
2057 }
2058 else {
2059 if( std::abs(eta) < 1.5 ) {
2060 if( isEta ) {
2061 memcpy(params,etaParams_ec1,sizeof(params));
2062 minWin = etaMinWin_ec1;
2063 maxWin = etaMaxWin_ec1;
2064 }
2065 else {
2066 memcpy(params,phiParams_ec1,sizeof(params));
2067 minWin = phiMinWin_ec1;
2068 maxWin = phiMaxWin_ec1;
2069 }
2070 }
2071 else if( std::abs(eta) < 2.0 ) {
2072 if( isEta ) {
2073 memcpy(params,etaParams_ec2,sizeof(params));
2074 minWin = etaMinWin_ec2;
2075 maxWin = etaMaxWin_ec2;
2076 }
2077 else {
2078 memcpy(params,phiParams_ec2,sizeof(params));
2079 minWin = phiMinWin_ec2;
2080 maxWin = phiMaxWin_ec2;
2081 }
2082 }
2083 else {
2084 if( isEta ) {
2085 memcpy(params,etaParams_ec3,sizeof(params));
2086 minWin = etaMinWin_ec3;
2087 maxWin = etaMaxWin_ec3;
2088 }
2089 else {
2090 memcpy(params,phiParams_ec3,sizeof(params));
2091 minWin = phiMinWin_ec3;
2092 maxWin = phiMaxWin_ec3;
2093 }
2094 }
2095 }
2096 }
2097
2098 //
2099 float x = params[0] + params[1] / pt;
2100 float retval = x;
2101 if( x < minWin ) retval = minWin;
2102 if( x > maxWin ) retval = maxWin;
2103
2104 return retval;
2105}
2106
2107// --------------------------------------------------------------------------------
2108// --------------------------------------------------------------------------------
2109
2111 const TrigL2MuonSA::MdtHits& mdtHits,
2112 std::vector<TrigL2MuonSA::TrackPattern>& trackPatterns ) const
2113{
2114 // initialize monitored variable
2115 auto inner_mdt_hits = Monitored::Scalar("InnMdtHits", -1);
2116 auto middle_mdt_hits = Monitored::Scalar("MidMdtHits", -1);
2117 auto outer_mdt_hits = Monitored::Scalar("OutMdtHits", -1);
2118 auto invalid_rpc_roi_number = Monitored::Scalar("InvalidRpcRoINumber", -1);
2119
2120 auto efficiency = Monitored::Scalar("Efficiency", 0);
2121 auto sag_inverse = Monitored::Scalar("SagInv", 9999.);
2122 auto address = Monitored::Scalar("Address", 9999.);
2123 auto absolute_pt = Monitored::Scalar("AbsPt", 9999.);
2124 auto sagitta = Monitored::Scalar("Sagitta", 9999.);
2125 auto track_pt = Monitored::Scalar("TrackPt", 9999.);
2126
2127 std::vector<float> t_eta, t_phi;
2128 std::vector<float> f_eta, f_phi;
2129 std::vector<float> r_inner, r_middle, r_outer;
2130 std::vector<float> f_residuals;
2131
2132 auto track_eta = Monitored::Collection("TrackEta", t_eta);
2133 auto track_phi = Monitored::Collection("TrackPhi", t_phi);
2134 auto failed_eta = Monitored::Collection("FailedRoIEta", f_eta);
2135 auto failed_phi = Monitored::Collection("FailedRoIPhi", f_phi);
2136 auto res_inner = Monitored::Collection("ResInner", r_inner);
2137 auto res_middle = Monitored::Collection("ResMiddle", r_middle);
2138 auto res_outer = Monitored::Collection("ResOuter", r_outer);
2139 auto fit_residuals = Monitored::Collection("FitResiduals", f_residuals);
2140
2141 auto monitorIt = Monitored::Group(m_monTool, inner_mdt_hits, middle_mdt_hits, outer_mdt_hits,
2142 invalid_rpc_roi_number,
2143 efficiency, sag_inverse, address, absolute_pt, sagitta, track_pt,
2144 track_eta, track_phi, failed_eta, failed_phi,
2145 res_inner, res_middle, res_outer, fit_residuals );
2146
2147 const float ZERO_LIMIT = 1e-5;
2148
2149 if( !trackPatterns.empty() ) {
2150
2151 efficiency = 1;
2152
2153 const TrigL2MuonSA::TrackPattern& pattern = trackPatterns[0];
2154 float norm = 10.;
2155
2156 float count_inner = 0;
2157 float count_middle = 0;
2158 float count_outer = 0;
2159
2160 for (const TrigL2MuonSA::MdtHitData& mdtHit : mdtHits) {
2161
2162 if (std::abs(mdtHit.DriftSpace) < ZERO_LIMIT) continue;
2163
2164 char st = mdtHit.cType[1];
2165
2166 if (st=='I') {
2167 count_inner++;
2168 r_inner.push_back(mdtHit.Residual/norm);
2169 if (mdtHit.isOutlier==0) f_residuals.push_back(mdtHit.Residual/norm);
2170 }
2171
2172 if (st=='M') {
2173 count_middle++;
2174 r_middle.push_back(mdtHit.Residual/norm);
2175 if (mdtHit.isOutlier==0) f_residuals.push_back(mdtHit.Residual/norm);
2176 }
2177
2178 if (st=='O') {
2179 count_outer++;
2180 r_outer.push_back(mdtHit.Residual/norm);
2181 if (mdtHit.isOutlier==0) f_residuals.push_back(mdtHit.Residual/norm);
2182 }
2183 }
2184
2185 inner_mdt_hits = count_inner;
2186 middle_mdt_hits = count_middle;
2187 outer_mdt_hits = count_outer;
2188
2189 track_pt = (std::abs(pattern.pt ) > ZERO_LIMIT)? pattern.charge*pattern.pt: 9999.;
2190 absolute_pt = std::abs(track_pt);
2191
2192 if ( std::abs(pattern.etaMap) > ZERO_LIMIT || std::abs(pattern.phiMS) > ZERO_LIMIT ) {
2193 t_eta.push_back(pattern.etaMap);
2194 t_phi.push_back(pattern.phiMS);
2195 }
2196 if ( std::abs(pattern.pt ) < ZERO_LIMIT){
2197 f_eta.push_back(roi->eta());
2198 f_phi.push_back(roi->phi());
2199 }
2200
2201 sagitta = (std::abs(pattern.barrelSagitta) > ZERO_LIMIT)? pattern.barrelSagitta: 9999.;
2202 sag_inverse = (std::abs(pattern.barrelSagitta) > ZERO_LIMIT)? 1./pattern.barrelSagitta: 9999.;
2203 address = pattern.s_address;
2204 }
2205
2206 return StatusCode::SUCCESS;
2207}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Scalar theta() const
theta 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_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t tc
static Double_t sc
Header file to be included by clients of the Monitored infrastructure.
const LVL1::RecMuonRoI * matchingRecRoI(uint32_t roiWord, const DataVector< LVL1::RecMuonRoI > &collection)
const double width
unsigned bcTag(unsigned bcBitMap)
Athena::TPCnvVers::Current TrigRoiDescriptor
#define x
#define z
const float ZERO_LIMIT
static const Attributes_t empty
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
static const std::string & type()
Incident type.
Definition Incidents.h:49
int workerID() const
assigned worker ID from processing unit
Definition Incidents.h:40
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const T * at(size_type n) const
Access an element, as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
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.
This class defines the reconstructed Muon ROI.
Definition RecMuonRoI.h:60
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
A monitored timer.
int L2MuonAlgoMap(const std::string &name) const
ToolHandle< GenericMonitoringTool > m_monTool
SG::WriteHandleKey< TrigRoiDescriptorCollection > m_muIdContainerKey
Gaudi::Property< float > m_scaleRoadBarrelMiddle
Gaudi::Property< int > m_calBufferSize
SG::ReadHandleKey< xAOD::MuonRoIContainer > m_recRoiCollectionKey
Gaudi::Property< bool > m_use_new_segmentfit
Gaudi::Property< bool > m_use_RoIBasedDataAccess_RPC
Gaudi::Property< int > m_esd_mm_size
Gaudi::Property< float > m_dPhisurrRoI
ToolHandle< TrigL2MuonSA::MuCalStreamerTool > m_calStreamer
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiCollectionKey
virtual StatusCode initialize() override
ServiceHandle< Gaudi::Interfaces::IOptionsSvc > m_jobOptionsSvc
Gaudi::Property< int > m_esd_rpc_size
Gaudi::Property< std::string > m_calBufferName
Gaudi::Property< bool > m_use_RoIBasedDataAccess_TGC
Gaudi::Property< bool > m_use_mm
virtual void handle(const Incident &incident) override
Gaudi::Property< bool > m_fill_FSIDRoI
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_muCompositeContainerKey
virtual StatusCode stop() override
SG::WriteHandleKey< xAOD::L2StandAloneMuonContainer > m_muFastContainerKey
StatusCode findMultiTrackSignature(const std::vector< const TrigRoiDescriptor * > &roi, const std::vector< const xAOD::MuonRoI * > &muonRoIs, DataVector< xAOD::L2StandAloneMuon > &outputTracks, const bool dynamicDeltaRpc, const EventContext &ctx) const
findMultiTrackSignature(), includes reconstract algorithms for multi-track mode
Gaudi::Property< bool > m_insideOut
Gaudi::Property< int > m_esd_csc_size
StatusCode findMuonSignatureIO(const xAOD::TrackParticleContainer &idtracks, const std::vector< const TrigRoiDescriptor * > &roids, const std::vector< const xAOD::MuonRoI * > &muonRoIs, DataVector< xAOD::L2CombinedMuon > &outputCBs, DataVector< xAOD::L2StandAloneMuon > &outputSAs, const bool dynamicDeltaRpc, const EventContext &ctx) const
findMuonSignatureIO(), includes reconstract algorithms for inside-out mode
Gaudi::Property< bool > m_use_RoIBasedDataAccess_MM
Gaudi::Property< bool > m_multiTrack
Gaudi::Property< double > m_rWidth_RPC_Failed
Gaudi::Property< bool > m_use_RoIBasedDataAccess_STGC
Gaudi::Property< float > m_ftfminPt
ServiceHandle< IIncidentSvc > m_incidentSvc
Gaudi::Property< bool > m_doCalStream
ToolHandle< TrigL2MuonSA::MuFastTrackFitter > m_trackFitter
Gaudi::Property< float > m_scaleRoadBarrelInner
ToolHandle< TrigL2MuonSA::FtfRoadDefiner > m_ftfRoadDefiner
Gaudi::Property< bool > m_use_endcapInnerFromBarrel
Gaudi::Property< int > m_esd_tgc_size
bool storeIDRoiDescriptor(const TrigRoiDescriptor *roids, const TrigL2MuonSA::TrackPattern &pattern, const DataVector< xAOD::L2StandAloneMuon > &outputTracks, TrigRoiDescriptorCollection &outputID) const
Gaudi::Property< float > m_dEtasurrRoI
Gaudi::Property< int > m_esd_mdt_size
ToolHandle< TrigL2MuonSA::MuFastPatternFinder > m_patternFinder
SG::WriteHandleKey< TrigRoiDescriptorCollection > m_muMsContainerKey
Gaudi::Property< bool > m_calDataScouting
Gaudi::Property< bool > m_use_RoIBasedDataAccess_CSC
ToolHandle< ITrigMuonBackExtrapolator > m_backExtrapolatorTool
Handle to MuonBackExtrapolator tool.
ToolHandle< TrigL2MuonSA::MuFastDataPreparator > m_dataPreparator
Gaudi::Property< bool > m_use_mcLUT
TrigL2MuonSA::RecMuonRoIUtils m_recMuonRoIUtils
ToolHandle< TrigL2MuonSA::CscSegmentMaker > m_cscsegmaker
Gaudi::Property< bool > m_use_rpc
Gaudi::Property< bool > m_topoRoad
SG::ReadHandleKey< DataVector< LVL1::RecMuonRoI > > m_run2recRoiCollectionKey
Gaudi::Property< int > m_esd_stgc_size
SG::WriteHandleKey< xAOD::L2CombinedMuonContainer > m_outputCBmuonCollKey
float getRoiSizeForID(bool isEta, const xAOD::L2StandAloneMuon *muonSA) const
bool updateOutputObjects(const xAOD::MuonRoI *roi, const TrigRoiDescriptor *roids, const TrigL2MuonSA::MuonRoad &muonRoad, const TrigL2MuonSA::MdtRegion &mdtRegion, const TrigL2MuonSA::RpcHits &rpcHits, const TrigL2MuonSA::TgcHits &tgcHits, const TrigL2MuonSA::RpcFitResult &rpcFitResult, const TrigL2MuonSA::TgcFitResult &tgcFitResult, const TrigL2MuonSA::MdtHits &mdtHits, const TrigL2MuonSA::CscHits &cscHits, const TrigL2MuonSA::StgcHits &stgcHits, const TrigL2MuonSA::MmHits &mmHits, const std::vector< TrigL2MuonSA::TrackPattern > &trackPatterns, DataVector< xAOD::L2StandAloneMuon > &outputTracks, TrigRoiDescriptorCollection &outputID, TrigRoiDescriptorCollection &outputMS, const EventContext &ctx) const
Called at the end of the algorithm processing to set the steering navigation properly.
Gaudi::Property< bool > m_use_stgc
Gaudi::Property< float > m_scaleRoadBarrelOuter
Gaudi::Property< bool > m_useRun3Config
Gaudi::Property< double > m_rWidth_TGC_Failed
ToolHandle< TrigL2MuonSA::MuFastTrackExtrapolator > m_trackExtrapolator
ToolHandle< TrigL2MuonSA::MuFastStationFitter > m_stationFitter
StatusCode updateMonitor(const xAOD::MuonRoI *roi, const TrigL2MuonSA::MdtHits &mdtHits, std::vector< TrigL2MuonSA::TrackPattern > &trackPatterns) const
Update monitoring variables.
MuFastSteering(const std::string &name, ISvcLocator *svc)
Constructor.
bool storeMuonSA(const xAOD::MuonRoI *roi, const TrigRoiDescriptor *roids, const TrigL2MuonSA::MuonRoad &muonRoad, const TrigL2MuonSA::MdtRegion &mdtRegion, const TrigL2MuonSA::RpcHits &rpcHits, const TrigL2MuonSA::TgcHits &tgcHits, const TrigL2MuonSA::RpcFitResult &rpcFitResult, const TrigL2MuonSA::TgcFitResult &tgcFitResult, const TrigL2MuonSA::MdtHits &mdtHits, const TrigL2MuonSA::CscHits &cscHits, const TrigL2MuonSA::StgcHits &stgcHits, const TrigL2MuonSA::MmHits &mmHits, const TrigL2MuonSA::TrackPattern &pattern, DataVector< xAOD::L2StandAloneMuon > &outputTracks, const EventContext &ctx) const
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
Gaudi::Property< bool > m_use_RoIBasedDataAccess_MDT
Gaudi::Property< double > m_winPt
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_FTFtrackKey
StatusCode findMuonSignature(const std::vector< const TrigRoiDescriptor * > &roi, const std::vector< const xAOD::MuonRoI * > &muonRoIs, DataVector< xAOD::L2StandAloneMuon > &outputTracks, xAOD::TrigCompositeContainer *outputMuonCal, TrigRoiDescriptorCollection &outputID, TrigRoiDescriptorCollection &outputMS, const bool dynamicDeltaRpc, const EventContext &ctx) const
findMuonSignature(), includes reconstract algorithms
bool storeMSRoiDescriptor(const TrigRoiDescriptor *roids, const TrigL2MuonSA::TrackPattern &pattern, const DataVector< xAOD::L2StandAloneMuon > &outputTracks, TrigRoiDescriptorCollection &outputMS) const
virtual StatusCode execute(const EventContext &ctx) const override
execute(), main code of the algorithm for AthenaMT
Gaudi::Property< bool > m_doEndcapForl2mt
virtual double etaMinus() const override final
gets eta at zMinus
virtual double etaPlus() const override final
gets eta at zedPlus
virtual double phi() const override final
Methods to retrieve data members.
virtual double phiMinus() const override final
gets phiMinus
virtual double eta() const override final
virtual double phiPlus() const override final
gets phiPlus
Helper class to provide type-safe access to aux data.
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.
double zMin[N_STATION][N_SECTOR]
Definition MdtRegion.h:37
double rMin[N_STATION][N_SECTOR]
Definition MdtRegion.h:39
double zMax[N_STATION][N_SECTOR]
Definition MdtRegion.h:38
double etaMax[N_STATION][N_SECTOR]
Definition MdtRegion.h:42
double etaMin[N_STATION][N_SECTOR]
Definition MdtRegion.h:41
int chamberType[N_STATION][N_SECTOR][2]
Definition MdtRegion.h:45
double rMax[N_STATION][N_SECTOR]
Definition MdtRegion.h:40
double aw[N_STATION][N_SECTOR]
Definition MuonRoad.h:83
void setScales(double inner, double middle, double outer)
Definition MuonRoad.h:69
double bw[N_STATION][N_SECTOR]
Definition MuonRoad.h:84
nope - should be used for standalone also, perhaps need to protect the class def bits ifndef XAOD_ANA...
virtual unsigned int roiWord() const override final
virtual unsigned int roiId() const override final
these quantities probably don't need to be used any more
virtual unsigned int l1Id() const override final
void setPt(float pt)
Set the transverse momentum ( ) of the muon.
void setStrategy(int value)
set algorithm strategy flag
void setErrorFlag(int value)
set algorithm error flag
void setIdTrackLink(const ElementLink< xAOD::TrackParticleContainer > &link)
set ID track used to make the CB muon
void setMuSATrackLink(const ElementLink< xAOD::L2StandAloneMuonContainer > &link)
set SA muon used to make the CB muon
void setPhi(float phi)
Set the azimuthal angle ( ) of the muon.
void setEta(float eta)
Set the pseudorapidity ( ) of the muon.
void setCharge(float value)
set seeding muon charge
void setRegionR(int station, int sector, float min, float max)
R range.
void setEta(float eta)
Set the pseudorapidity ( ) of the muon.
void setStgcCluster(const unsigned int layer, const int isOutlier, const int type, const float eta, const float phi, const float r, const float z, const float residualR, const float residualPhi, const int stationEta, const int stationPhi, const int stationName)
Set sTGC hits.
void setBeta(float value)
Set beta.
void setRpcFitInn(float phi, float slope, float offset)
Set the results of RPC fit.
void setPhi(float phi)
Set the azimuthal angle ( ) of the muon.
void setRpcHit(uint32_t layer, uint32_t measuresPhi, float x, float y, float z, float time, float distEta, float distPhi, const std::string &stationName)
Set RPC hits.
void setCscHit(int isOutlier, int chamber, uint32_t stationName, int stationEta, int stationPhi, int chamberLayer, int wireLayer, int measuresPhi, int strip, float eta, float phi, float r, float z, int charge, float time, float residual)
Set the properties of each CSC tube.
void setBarrelSagitta(float value)
Set the fitted sagitta of the muon in the barrel.
int sAddress() const
Get the station address of the muon.
void setDeltaPt(float value)
Set error of pT.
void setEtaMS(float value)
Set the eta at muon spectrometer.
void setMdtHit(uint32_t onlineId, int isOutier, int chamber, float r, float z, float phi, float residual, float time, float space, float sigma)
Set the properties of each MDT tube.
void setTgcInn(float eta, float phi, float r, float z)
Set the results of TGC fit.
void setMmClustersCapacity(const int value)
Set size of storage for MM clusters.
void setDeltaEta(float value)
Set error of eta.
void setRoiSystem(uint32_t value)
void setRoad(int station, int sector, float aw, float bw)
Road.
void setTgcHit(float eta, float phi, float r, float z, float width, int stationNum, bool isStrip, int bcTag, bool inRoad)
Set TGC hits.
void setRoiNumber(uint32_t value)
void setDeltaPhi(float value)
Set error of phi.
void setPtEndcapRadius(float value)
void setTgcMid2(float eta, float phi, float r, float z)
float etaMS() const
Get the eta at muon spectrometer.
float phiMS() const
Get the phi at muon spectrometer.
void setStgcClustersCapacity(const int value)
Set size of storage for sTGC clusters.
void setTrackPosition(float r, float z, float eta, float phi)
Set position of muon track.
void setRMS(float value)
Set the R at muon spectrometer.
void setPtCSC(float value)
void setLumiBlock(uint32_t value)
void setRoiThreshold(uint32_t value)
void setTgcMidF(float rhoChi2, long rhoN, float phiChi2, long phiN)
void setPhiMap(float value)
Set phi used to refer pT LUT.
void setIsTgcFailure(int value)
Set flag to record if TGC is properly read.
void setRoiSubsystem(uint32_t value)
void setRpcHitsCapacity(int value)
Size of storage to be reserved.
virtual double pt() const
The transverse momentum ( ) of the particle.
void setRoiSector(uint32_t value)
void setRpcFitOut(float phi, float slope, float offset)
void setLvl1Id(uint32_t value)
void setChamberType2(int station, int sector, int chamberType)
void setMmCluster(const unsigned int layer, const int isOutlier, const float eta, const float phi, const float r, const float z, const float residualR, const float residualPhi, const int stationEta, const int stationPhi, const int stationName)
Set MM hits.
void setEtaBin(int value)
Set eta bin of pT LUT.
void setEtaMap(float value)
Set eta used to refer pT LUT.
void setMuonDetMask(uint32_t value)
void setDirPhiMS(float value)
Set tan phi at muon spectrometer.
void setPtEndcapBeta(float value)
void setCscHitsCapacity(int value)
Set size of storage for CSC hits.
void setRegionZ(int station, int sector, float min, float max)
Z range.
void setEndcapRadius(float value)
Set the fitted radius of the muon in the endcap.
void setEndcapBeta(float value)
Set the fitted value in the endcap.
void setChamberType1(int station, int sector, int chamberType)
Set the muon road information.
void setSAddress(int value)
Set the station address of the muon.
void setRpcFitMid(float phi, float slope, float offset)
void setPhiMS(float value)
Set the phi at muon spectrometer.
void setEndcapAlpha(float value)
Set the fitted value in the endcap.
void setRoIWord(uint32_t value)
Set the RoI ID of the seeding LVL1 muon.
void setRoiId(uint32_t value)
void setTgcHitsCapacity(int value)
Set size of storage for TGC hits.
void setRoiEta(float value)
void setTgcMid1(float eta, float phi, float r, float z)
void setRegionEta(int station, int sector, float min, float max)
Eta range.
void setIsRpcFailure(int value)
Set flag to record if RPC is properly read.
void setPt(float pt)
Set the transverse momentum ( ) of the muon.
void setRoiPhi(float value)
void setSuperPoint(int chamber, float r, float z, float slope, float intercept=0., float chi2=0.)
Set the properties of one particular super point measurement.
void setMdtHitsCapacity(int value)
Set size of storage for MDT hits.
void setDirZMS(float value)
Set dRdZ at muon spectrometer.
void setAlgoId(int value)
void setPhiBin(int value)
Set phi bin of pT LUT.
void setZMS(float value)
Set the Z at muon spectrometer.
void setBarrelRadius(float value)
Set the fitted radius of the muon in the barrel.
void setPtEndcapAlpha(float value)
void setTgcPt(float value)
void setTgcInnF(float rhoStd, long rhoN, float phiStd, long phiN)
float eta() const
The pseudorapidity ( ) of the muon candidate.
Hemisphere getHemisphere() const
Returns the hemisphere that detected the muon candidate.
RoISource getSource() const
Returns the system that detected the muon candidate.
uint32_t roiWord() const
The "raw" RoI word describing the muon candidate.
int getThrNumber() const
Get the logic number of the highest threshold this RoI passed.
float phi() const
The azimuthal angle ( ) of the muon candidate.
int getSectorID() const
Get the sector ID number.
int getRoI() const
Get the "RoI number" (position inside the sector)
void efficiency(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
int r
Definition globals.cxx:22
T wrapToPi(T phi)
Wrap angle in radians to [-pi, pi].
Definition phihelper.h:24
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())
std::vector< StgcHitData > StgcHits
Definition StgcData.h:49
std::vector< MdtHitData > MdtHits
Definition MdtData.h:56
std::vector< MmHitData > MmHits
Definition MmData.h:47
std::vector< CscHitData > CscHits
Definition CscData.h:40
std::vector< RpcHitData > RpcHits
Definition RpcData.h:57
std::vector< TgcHitData > TgcHits
Definition TgcData.h:43
@ BarrelInner
Inner station in the barrel spectrometer.
@ EndcapOuter
Outer station in the endcap spectrometer.
@ BarrelMiddle
Middle station in the barrel spectrometer.
@ EndcapMiddle
Middle station in the endcap spectrometer.
@ BEE
BEE measurement point.
@ EndcapExtra
Extra station in the endcap spectrometer.
@ BarrelOuter
Outer station in the barrel spectrometer.
@ BME
BME measurement point.
@ EndcapInner
Inner station in the endcap spectrometer.
ECRegions whichECRegion(const float eta, const float phi)
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
MuonRoIContainer_v1 MuonRoIContainer
L2CombinedMuon_v1 L2CombinedMuon
Define the latest version of the muon CB class.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
L2StandAloneMuon_v2 L2StandAloneMuon
Define the latest version of the muon SA class.
MuonRoI_v1 MuonRoI
Definition MuonRoI.h:15
Helper for azimuthal angle calculations.