ATLAS Offline Software
CscRdoValMonAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Athena include(s)
7 #include "CscRdoValMonAlg.h"
8 #include "MuonRDO/CscRawData.h"
10 
11 //
12 // constructor ----------------------------------------------------------------
13 //
14 CscRdoValMonAlg::CscRdoValMonAlg(const std::string& name, ISvcLocator* pSvcLocator ) :
15  AthMonitorAlgorithm(name, pSvcLocator)
16  { }
17 
18 //
19 // initialize ----------------------------------------------------------------
20 //
22 {
23  ATH_MSG_DEBUG ("CscRdoValMonAlg : in initialize()");
24  ATH_CHECK(m_idHelperSvc.retrieve());
25  ATH_CHECK(m_cscRdoDecoderTool.retrieve());
28 }
29 
30 //
31 // fillHistograms ----------------------------------------------------------------
32 //
33 StatusCode CscRdoValMonAlg::fillHistograms(const EventContext& ctx) const
34 {
35  ATH_MSG_DEBUG ( "CscRdoValMonAlg :: in fillHistograms()" );
36 
37  if(m_cscRdoKey.key() == ""){ //it seems that protection is needed for this case
38  ATH_MSG_WARNING("CSC RDO key is blank, returning");
39  return StatusCode::SUCCESS;
40  }
41 
43 
44  // ==============================================================================
45  // Field Range Notes
46  // ==============================================================================
47  // StationName unsigned integer maps to "CSS", "CSL", etc.
48  // StationEta [-1,1] -1 for backward, 1 for forward endcap
49  // StationPhi [1,8] increases with Phi
50  // Technology [1] maps to "CSC"
51  // ChamberLayer [1,2] increases with |Z|
52  // WireLayer [1,4] increases with |Z|
53  // MeasuresPhi [0,1] 0 if measures R, 1 if measures Phi
54  // Strip [1,n] increases with R for MeasuresPhi=0
55  // increases with Phi for MeasuresPhi=1
56  // ==============================================================================
57 
58  ATH_MSG_DEBUG ( " Size of RDO Container : " << CscRDO->size() );
59 
60  // Begin Event ==================================================
61  ATH_MSG_DEBUG ( " BEGIN EVENT ========================================== " );
62 
63  for (CscRawDataContainer::const_iterator it = CscRDO->begin(); it != CscRDO->end(); ++it)
64  {
65  const CscRawDataCollection * rdo = *it;
66  ATH_MSG_DEBUG ( " Number of Samples : " << rdo->numSamples() );
67  ATH_MSG_DEBUG ( " Size of Collection : " << rdo->size() );
68 
69  size_t nEtaClusWidthCnt = 0, nPhiClusWidthCnt = 0; //cluster position in each phi-layer
70  Identifier stationId, channelId;
71 
72  int clusCount[33][9], sigclusCount[33][9];
73  for(size_t kl = 0; kl < 33; kl++ )
74  {
75  for(size_t km = 0; km < 9; km++ )
76  {
77  clusCount[kl][km] = 0;
78  sigclusCount[kl][km] = 0;
79  }
80  }
81 
82  // loop over ROD-clusters
83  for(CscRawDataCollection::const_iterator ic = (*it)->begin(); ic != (*it)->end(); ++ic)
84  {
85  const CscRawData *raw = (*ic);
86  if(raw)
87  {
88  // Identify side(A/C), sector(1-16)/layer(1-4)
89  stationId = m_cscRdoDecoderTool->stationIdentifier(raw,&m_idHelperSvc->cscIdHelper());
90  channelId = m_cscRdoDecoderTool->channelIdentifier(raw,&m_idHelperSvc->cscIdHelper(),0);
91  int stationName = m_idHelperSvc->cscIdHelper().stationName(channelId);
92  int chamberType = m_idHelperSvc->cscIdHelper().stationNameIndex("CSS") == stationName ? 0 : 1;
93  int stationEta = m_idHelperSvc->cscIdHelper().stationEta(channelId);
94  int stationPhi = m_idHelperSvc->cscIdHelper().stationPhi(channelId);
95  int wireLayer = m_idHelperSvc->cscIdHelper().wireLayer(channelId);
96  int measuresPhi = m_idHelperSvc->cscIdHelper().measuresPhi(channelId);
97  auto measuresPhi_mon = Monitored::Scalar<int>("measuresPhi_mon", measuresPhi);
98  auto measuresEta = Monitored::Scalar<int>("measuresEta", !measuresPhi );
99 
100  // determine the sector number
101  int sectorNo = stationEta * (2 * stationPhi - chamberType);
102 
103  // compute the indices to store cluster count
104  int ns = sectorNo < 0 ? sectorNo*(-1) : sectorNo+16; // [-16 -> -1] shifted to [1 -> 16] and [+1 -> +16] shifted to [+17 -> +32]
105  int nl = (measuresPhi ? wireLayer : wireLayer+4); // [ 1 -> 4] (phi-layers) and [5 -> 8] (eta-layers)
106  clusCount[ns][nl]++;
107 
108  // indices for ns = [+1 -> +32]; 32 places (index '0' is not counted); allocated 33 places
109  // indices for nl = [+1 -> +8]; 8 places (index '0' is not counted); allocated 9 places
110  ATH_MSG_DEBUG(" ns = " << ns << "\tm_nl = " << nl << "\tm_sec = " << sectorNo << "\t m_lay= " << wireLayer << "\tmPhi = " << measuresPhi);
111 
112  // y-axis fill value
113  // sector# +2 layer 1 maps to +2 + 0.2*(1-1) + 0.1 = +2.1
114  // sector# +2 layer 2 maps to +2 + 0.2*(2-1) + 0.1 = +2.3
115  // sector# +2 layer 3 maps to +2 + 0.2*(3-1) + 0.1 = +2.5
116  // sector# +2 layer 4 maps to +2 + 0.2*(4-1) + 0.1 = +2.7
117  auto secLayer = Monitored::Scalar<float>("secLayer",sectorNo + 0.2 * (wireLayer - 1) + 0.1);
118  int xfac = measuresPhi ? -1 : 1; // -48 / +192
119 
120  // this way we get 4 time samples per strip
121  ATH_MSG_DEBUG (" Width of ROD cluster : " << raw->width() );
122  uint16_t diff_max = 0., diff = 0.;
123  std::vector<float> xVals;
124 
125  // loop over strips in ROD cluster
126  auto raw_clus_width = Monitored::Scalar<size_t>("raw_clus_width",raw->width());
127 
128  if (measuresPhi) nPhiClusWidthCnt++;
129  else nEtaClusWidthCnt++;
130  fill("CscRdoMonitor", raw_clus_width, secLayer, measuresPhi_mon, measuresEta);
131 
132  // loop over strips
133  for (size_t n = 0; n < raw_clus_width; n++ )
134  {
135  // identify this strip
136  Identifier chID = m_cscRdoDecoderTool->channelIdentifier(raw, &m_idHelperSvc->cscIdHelper(), n);
137  int strip = m_idHelperSvc->cscIdHelper().strip(chID);
138  auto stripId = Monitored::Scalar<float>("stripId",strip * xfac); // x-axis fill value
139  fill("CscRdoMonitor", stripId, secLayer);
140 
141  // for every strip that has a hit, store the X,Y values
142  xVals.push_back(stripId);
143 
144  // extract the (four) time samples for this strip
145  std::vector<uint16_t> samples;
146  bool extractSamples = raw->samples(n, rdo->numSamples(), samples);
147  uint16_t n_max=0, n_min = 9999;
148 
149  // if we have the time samples, identify the max/min sampling values i.e., ADC_max and ADC_min
150  if (extractSamples)
151  {
152  for (size_t np = 0; np < samples.size(); np++)
153  {
154  if(samples[np] < n_min) n_min = samples[np];
155  if(samples[np] > n_max) n_max = samples[np];
156  }
157  // the diff between max and min samplings Delta_ADC = (ADC_max - ADC_min)
158  diff = n_max - n_min;
159 
160  // compute the max difference Max_Delta_ADC
161  if(diff > diff_max) diff_max = diff;
162 
163  ATH_MSG_DEBUG ( n << " Max = " << n_max << " Min = " << n_min << " Diff = " << diff );
164  } // end if extractSamples
165  } // end for loop over strips in cluster
166 
167  ATH_MSG_DEBUG ( " End loop over strips======================" );
168 
169  ATH_MSG_DEBUG ( " Max difference : " << diff_max );
170 
171  auto diff_max_mon = Monitored::Scalar<uint16_t>("diff_max_mon",diff_max);
172  fill("CscRdoMonitor", diff_max_mon);
173 
174  // determine of the cluster is a noise/signal cluster Max_Delta_ADC > NoiseCut
175  bool signal = diff_max > m_cscNoiseCut ? true : false;
176  std::vector<int> tmp_xVals_signal;
177  std::vector<int> tmp_xVals_noise;
178  std::vector<float> tmp_secLayer_signal;
179  std::vector<float> tmp_secLayer_noise;
180 
181  if (signal)
182  {
183  sigclusCount[ns][nl]++;
184  for(size_t nf = 0; nf < xVals.size(); nf++)
185  {
186  tmp_xVals_signal.push_back(xVals[nf]);
187  tmp_secLayer_signal.push_back(secLayer);
188  }
189  }
190  else
191  {
192  for(size_t nf = 0; nf < xVals.size(); nf++)
193  {
194  tmp_xVals_noise.push_back(xVals[nf]);
195  tmp_secLayer_noise.push_back(secLayer);
196  }
197  }
198  auto isSignal = Monitored::Scalar<int>("isSignal", (int) signal);
199  auto isNoise = Monitored::Scalar<int>("isNoise", (int) !signal);
200  auto tmp_xVals_signal_mon = Monitored::Collection("tmp_xVals_signal_mon", tmp_xVals_signal);
201  auto tmp_secLayer_sig_mon = Monitored::Collection("tmp_secLayer_sig_mon", tmp_secLayer_signal);
202  auto tmp_secLayer_noise_mon = Monitored::Collection("tmp_secLayer_noise_mon", tmp_secLayer_noise);
203  auto sideC_signal = Monitored::Scalar<int>("sideC_signal", (int) (signal && stationEta == -1));
204  auto sideA_signal = Monitored::Scalar<int>("sideA_signal", (int) (signal && stationEta == 1));
205  auto signal_measuresEta = Monitored::Scalar<int>("signal_measuresEta", (int)(signal && !measuresPhi));
206  auto signal_measuresEta_sideC = Monitored::Scalar<int>("signal_measuresEta_sideC", (int)(signal && !measuresPhi && stationEta == -1));
207  auto signal_measuresEta_sideA = Monitored::Scalar<int>("signal_measuresEta_sideA", (int)(signal && !measuresPhi && stationEta == 1));
208  auto signal_measuresPhi = Monitored::Scalar<int>("signal_measuresPhi", (int)(signal && measuresPhi));
209  auto signal_measuresPhi_sideC = Monitored::Scalar<int>("signal_measuresPhi_sideC", (int)(signal && measuresPhi && stationEta == -1));
210  auto signal_measuresPhi_sideA = Monitored::Scalar<int>("signal_measuresPhi_sideA", (int)(signal && measuresPhi && stationEta == 1));
211  auto tmp_xVals_noise_mon = Monitored::Collection("tmp_xVals_noise_mon", tmp_xVals_noise);
212  auto noise_measuresEta = Monitored::Scalar<int>("noise_measuresEta", (int)(!signal && !measuresPhi ));
213  auto noise_measuresPhi = Monitored::Scalar<int>("noise_measuresPhi", (int)(!signal && measuresPhi ));
214 
215  fill("CscRdoMonitor", isSignal, isNoise, secLayer, tmp_secLayer_sig_mon, tmp_secLayer_noise_mon, tmp_xVals_signal_mon, tmp_xVals_noise_mon, raw_clus_width, sideC_signal, sideA_signal, signal_measuresEta, signal_measuresEta_sideC, signal_measuresEta_sideA, signal_measuresPhi, signal_measuresPhi_sideC, signal_measuresPhi_sideA, noise_measuresEta, noise_measuresPhi);
216 
217  } // end if raw
218  } // end loop over ROD-clusters
219 
220  ATH_MSG_DEBUG ( " End loop over clusters======================" );
221  auto nPhiClusWidthCnt_mon = Monitored::Scalar<size_t>("nPhiClusWidthCnt_mon", nPhiClusWidthCnt);
222  auto nEtaClusWidthCnt_mon = Monitored::Scalar<size_t>("nEtaClusWidthCnt_mon", nEtaClusWidthCnt);
223  fill("CscRdoMonitor", nPhiClusWidthCnt_mon, nEtaClusWidthCnt_mon);
224 
225  int numeta = 0, numphi = 0, numetasignal = 0, numphisignal = 0;
226  for(int kl = 1; kl < 33; kl++ )
227  {
228  // int m_sec = kl < 17 ? kl*(-1) : kl; // [1->16](-side) [17-32] (+side)
229  for(int km = 1; km < 9; km++ )
230  {
231  int lay = (km > 4 && km < 9) ? km-4 : km; // 1,2,3,4 (phi-layers) 5-4, 6-4, 7-4, 8-4 (eta-layers)
232  bool mphi = (km > 0 && km < 5) ? true : false; // 1,2,3,4 (phi-layers) 5,6,7,8 (eta-layers)
233  std::string wlay = mphi ? "Phi-Layer " : "Eta-Layer: ";
234  int count = clusCount[kl][km];
235  int scount = sigclusCount[kl][km];
236  int tmp_counts_phi = 0, tmp_counts_eta = 0;
237 
238  if(count > 0)
239  {
240  float secLayer = kl-16 + 0.2 * (lay - 1) + 0.1;
241  if(mphi)
242  {
243  numphi += count;
244  if(scount > 0)
245  {
246  numphisignal += scount;
247  tmp_counts_phi = count - scount;
248  }
249  else tmp_counts_phi = count;
250  }
251  else
252  {
253  numeta += count;
254  if(scount > 0)
255  {
256  numetasignal += scount;
257  tmp_counts_eta = count - scount;
258  }
259  else tmp_counts_eta = count;
260  }
261  ATH_MSG_DEBUG ( wlay << "Counts sec: [" << kl-16 << "]\tlayer: [" << km << "] = " << secLayer << "\t = " << count << "\t" << scount);
262 
263  auto secLayer_count = Monitored::Scalar<float>("secLayer_count", secLayer);
264  auto mphi_mon = Monitored::Scalar<int>("mphi_mon",(int) ( (count>0) && mphi));
265  auto count_mon = Monitored::Scalar<int>("count_mon", count);
266  auto scount_mon = Monitored::Scalar<int>("scount_mon", scount);
267  auto mphi_scount = Monitored::Scalar<int>("mphi_scount",(int) ( (count>0) && mphi && (scount>0)));
268  auto mphi_inv = Monitored::Scalar<int>("mphi_inv", (int) ( (count>0) && !mphi));
269  auto mphi_inv_scount = Monitored::Scalar<int>("mphi_inv_scount", (int) ( (count>0) && !mphi && (scount>0)));
270  auto tmp_counts_phi_mon = Monitored::Scalar<int>("tmp_counts_phi_mon",tmp_counts_phi);
271  auto tmp_counts_eta_mon = Monitored::Scalar<int>("tmp_counts_eta_mon",tmp_counts_eta);
272 
273  fill("CscRdoMonitor", count_mon, secLayer_count, mphi_mon, mphi_scount, scount_mon, tmp_counts_phi_mon, mphi_inv, mphi_inv_scount, tmp_counts_eta_mon);
274  } // end if count
275  }
276  }
277 
278  auto numphi_mon = Monitored::Scalar<int>("numphi_mon",numphi);
279  auto numeta_mon = Monitored::Scalar<int>("numeta_mon",numeta);
280  auto numphisignal_mon = Monitored::Scalar<int>("numphisignal_mon",numphisignal);
281  auto numetasignal_mon = Monitored::Scalar<int>("numetasignal_mon",numetasignal);
282  auto diffnumphi = Monitored::Scalar<int>("diffnumphi", numphi-numphisignal);
283  auto diffnumeta = Monitored::Scalar<int>("diffnumeta",numeta-numetasignal);
284 
285  fill("CscRdoMonitor", numphi_mon, numeta_mon, numphisignal_mon, numetasignal_mon, diffnumphi, diffnumeta);
286  }
287 
288  ATH_MSG_DEBUG ( " END EVENT ============================================ " );
289  ATH_MSG_DEBUG ( "done collecting histograms" );
290  ATH_MSG_DEBUG ( "CSCRdoMon::fillHistograms reports success" );
291 
292  return StatusCode::SUCCESS;
293 }
calibdata.scount
int scount
Definition: calibdata.py:355
Muon::nsw::STGTPSegments::moduleIDBits::stationPhi
constexpr uint8_t stationPhi
station Phi 1 to 8
Definition: NSWSTGTPDecodeBitmaps.h:129
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
SiliconTech::strip
@ strip
dumpTgcDigiDeadChambers.stationName
dictionary stationName
Definition: dumpTgcDigiDeadChambers.py:30
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
CscRdoValMonAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: CscRdoValMonAlg.h:29
skel.it
it
Definition: skel.GENtoEVGEN.py:423
IdentifiableContainerMT::size
size_t size() const
Duplicate of fullSize for backwards compatability.
Definition: IdentifiableContainerMT.h:209
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
PlotPulseshapeFromCool.np
np
Definition: PlotPulseshapeFromCool.py:64
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
keylayer_zslicemap.kl
kl
Definition: keylayer_zslicemap.py:109
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
CscRdoValMonAlg::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: CscRdoValMonAlg.cxx:33
CscRawData::width
uint16_t width() const
Definition: CscRawData.h:128
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
CscRdoValMonAlg::m_cscRdoDecoderTool
ToolHandle< Muon::ICSC_RDO_Decoder > m_cscRdoDecoderTool
Definition: CscRdoValMonAlg.h:30
AthenaMonManager.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IdentifiableContainerMT::end
const_iterator end() const
return const_iterator for end of container
Definition: IdentifiableContainerMT.h:242
IdentifiableContainerMT::const_iterator
Definition: IdentifiableContainerMT.h:82
IdentifiableContainerMT::begin
const_iterator begin() const
return const_iterator for first entry
Definition: IdentifiableContainerMT.h:236
AthMonitorAlgorithm::fill
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.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
CscRdoValMonAlg::m_cscRdoKey
SG::ReadHandleKey< CscRawDataContainer > m_cscRdoKey
Definition: CscRdoValMonAlg.h:31
CscRawDataCollection
Collection of CSC Raw Hits, arranged according to CSC Detector Elements Author: Ketevi A.
Definition: CscRawDataCollection.h:24
CscRdoValMonAlg.h
CscRawDataCollection::numSamples
uint16_t numSamples() const
Definition: CscRawDataCollection.cxx:8
grepfile.ic
int ic
Definition: grepfile.py:33
CscRawDataCollection.h
Cut::signal
@ signal
Definition: SUSYToolsAlg.cxx:64
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
CscRawData::samples
const std::vector< uint16_t > & samples() const
Definition: CscRawData.h:130
CscRawData.h
CscRdoValMonAlg::initialize
virtual StatusCode initialize() override
initialize
Definition: CscRdoValMonAlg.cxx:21
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
CscRawData
Class to hold the electronic output for a single CSC readout channel: n sampling ADC data + the addre...
Definition: CscRawData.h:21
compileRPVLLRates.nf
nf
Definition: compileRPVLLRates.py:89
CscRdoValMonAlg::m_cscNoiseCut
Gaudi::Property< size_t > m_cscNoiseCut
Definition: CscRdoValMonAlg.h:28
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
Muon::nsw::STGTPSegments::moduleIDBits::stationEta
constexpr uint8_t stationEta
1 to 3
Definition: NSWSTGTPDecodeBitmaps.h:127
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
python.SystemOfUnits.km
int km
Definition: SystemOfUnits.py:95
CscRdoValMonAlg::CscRdoValMonAlg
CscRdoValMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CscRdoValMonAlg.cxx:14