ATLAS Offline Software
Loading...
Searching...
No Matches
NSWDataMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
5// Package : NSWRawDataMonAlg
6// Authors: M. Biglietti (Roma Tre)
7//
8// DESCRIPTION:
9// Subject: NSW-->Offline Muon Data Quality
11
12
13#include "NSWDataMonAlg.h"
17
19// *********************************************************************
20// Public Methods
21// *********************************************************************
22
23NSWDataMonAlg::NSWDataMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
24 AthMonitorAlgorithm(name,pSvcLocator)
25{ }
26
27/*---------------------------------------------------------*/
29/*---------------------------------------------------------*/
30{
31 //init message stream
32 ATH_MSG_DEBUG("initialize NSWDataMonAlg");
33
35 ATH_CHECK(m_muonKey.initialize());
36 ATH_CHECK(m_idHelperSvc.retrieve());
37
38
39
40 ATH_MSG_DEBUG(" end of initialize " );
41 ATH_MSG_INFO("NSWDataMonAlg initialization DONE " );
42
43 return StatusCode::SUCCESS;
44}
45
46StatusCode NSWDataMonAlg::fillHistograms(const EventContext& ctx) const
47{
48
49 ATH_MSG_DEBUG("NSWDataMonAlg::MM RawData Monitoring Histograms being filled" );
51 if (!muonContainer.isValid()) {
52 ATH_MSG_FATAL("Could not get muon container: " << m_muonKey.fullKey());
53 return StatusCode::FAILURE;
54 }
55
56 std::string NSWMonGroup = "NSWMonGroup";
57
58 int lumiblock = GetEventInfo(ctx)->lumiBlock();
59
60 auto lb = Monitored::Scalar<float>("lb", lumiblock);
61
62 for (const xAOD::Muon* mu : *muonContainer) {
63 if(mu -> pt() < m_cutPt) continue;
64
65
66 if(!(mu -> author() == xAOD::Muon::Author::MuidCo || (mu -> author() == xAOD::Muon::Author::MuidSA && std::abs(mu->eta()) > 2.5) ) ) continue;
67 const xAOD::TrackParticle* saTP = mu->primaryTrackParticle();
68 if(saTP == nullptr) continue;
69 const Trk::Track* saTrack = saTP->track();
70 if(!saTrack) continue;
71
72 float eta_mu=saTP->eta();
73
74 int ref_sector=-99;
75 float z_nsw=-99;
76 float theta_mu=saTP->theta();
77 float phi_mu=saTP->phi();
78
79 std::string side = "sideA";
80 int iside = 1;
81 if(eta_mu<0) {
82 side = "sideC";
83 iside=-1;
84 }
85
86 auto mu_phi = Monitored::Scalar<float>("phi_mu_"+side, phi_mu);
87
88 std::vector<int> layers_mm; std::vector<int> layers_stg;
89 int layer_max=-99;
90 float min_z_nsw=9999;
91
92 for(const Trk::TrackStateOnSurface* trkState : *saTrack->trackStateOnSurfaces()) {
93 if(!(trkState)) continue;
94
95 if (!trkState->type(Trk::TrackStateOnSurface::Measurement)) continue;
96 const Trk::MeasurementBase* meas = trkState->measurementOnTrack() ;
97 if(!meas) continue;
98
99 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(meas);
100 if(!rot) continue;
101
102
103 Identifier rot_id = rot->identify();
104
105 int channelType = m_idHelperSvc->stgcIdHelper().channelType(rot_id);
106 if(!(m_idHelperSvc->isMM(rot_id) or channelType == sTgcIdHelper::sTgcChannelTypes::Strip)) continue;
107
108
109
110 const Muon::MuonClusterOnTrack* cluster = dynamic_cast<const Muon::MuonClusterOnTrack*>(rot);
111
112 if (!cluster) continue;
113
114 const Muon::MuonCluster* mmPrepData = cluster->prepRawData();
115 Amg::Vector3D pos = mmPrepData->globalPosition();
116 if(fabs(pos.z())<min_z_nsw){
117 z_nsw=pos.z();
118 min_z_nsw=fabs(z_nsw);
119 }
120 int multi_mm=0;
121 int gap_mm=0;
122 int multi_stg=0;
123 int gap_stg=0;
124
125 if(m_idHelperSvc->isMM(rot_id)) {
126 multi_mm = m_idHelperSvc->mmIdHelper().multilayer(rot_id);
127 gap_mm = m_idHelperSvc->mmIdHelper().gasGap(rot_id);
128 auto layer_mm=gap_mm+(multi_mm-1)*4;
129
130 if (std::find(layers_mm.begin(), layers_mm.end(), layer_mm) == layers_mm.end()) layers_mm.push_back(layer_mm);
131 if(layer_mm>layer_max){
132 layer_max=layer_mm;
133 ref_sector= m_idHelperSvc->sector(rot_id) ;
134 }
135 }
136 if(m_idHelperSvc->issTgc(rot_id)) {
137 if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
138 multi_stg = m_idHelperSvc -> stgcIdHelper().multilayer(rot_id);
139 gap_stg = m_idHelperSvc -> stgcIdHelper().gasGap(rot_id);
140 auto layer_stg=gap_stg+(multi_stg-1)*4;
141
142 if (std::find(layers_stg.begin(), layers_stg.end(), layer_stg) == layers_stg.end()) layers_stg.push_back(layer_stg);
143 if(layer_stg>layer_max) {
144 layer_max=layer_stg;
145 ref_sector= m_idHelperSvc->sector(rot_id) ;
146 }
147 }
148 }
149
150 }//loop trackStates
151
152 float x_mu=z_nsw*tan(theta_mu)*cos(phi_mu);
153 float y_mu=z_nsw*tan(theta_mu)*sin(phi_mu);
154 auto x_trk = Monitored::Scalar<float>("x_trk_"+side, x_mu);
155 auto y_trk = Monitored::Scalar<float>("y_trk_"+side, y_mu);
156
157 int isEff= (layers_mm.size()>3 || layers_stg.size()>3);
158 auto hitcut = Monitored::Scalar<int>("hitcut", (int)isEff);
159 auto lb_side = Monitored::Scalar<float>("lb_"+side, lumiblock);
160 auto sector_phi = Monitored::Scalar<int>("sector_phi", ref_sector*iside);
161 if (ref_sector > 0) fill(NSWMonGroup, hitcut, mu_phi, lb, lb_side, sector_phi, x_trk, y_trk);
162 }
163
164
165 return StatusCode::SUCCESS;
166}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
xAOD::MuonContainer * muonContainer
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Declare a monitored scalar variable.
Base class for Muon cluster RIO_OnTracks.
virtual const MuonCluster * prepRawData() const override=0
Returns the Trk::PrepRawData - is a MuonCluster in this scope.
virtual const Amg::Vector3D & globalPosition() const =0
Returns the global position of the measurement (calculated on the fly)
virtual StatusCode initialize() override
initialize
NSWDataMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
DoubleProperty m_cutPt
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SG::ReadHandleKey< xAOD::MuonContainer > m_muonKey
This class is the pure abstract base class for all fittable tracking measurements.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
Identifier identify() const
return the identifier -extends MeasurementBase
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
float theta() const
Returns the parameter, which has range 0 to .
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
int lb
Definition globals.cxx:23
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
Eigen::Matrix< double, 3, 1 > Vector3D
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version: