ATLAS Offline Software
CSCSegmValMonAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
5 
6 #include "CSCSegmValMonAlg.h"
7 
12 
13 // Track
18 
21 
22 // STL
23 #include <sstream>
24 #include <utility>
25 #include "GaudiKernel/SystemOfUnits.h"
26 
27 //________________________________________________________________________________________________________
28 CSCSegmValMonAlg::CSCSegmValMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
29  AthMonitorAlgorithm(name,pSvcLocator)
30  { }
31 
32 
33 //________________________________________________________________________________________________________
35 
36  ATH_MSG_INFO( "in CSCSegmValMonAlg::init()" );
37  if( m_doEvtSel ) ATH_CHECK(m_trigDecTool.retrieve());
38 
39  if(m_sampSelTriggers.empty() && m_doEvtSel) {
40  ATH_MSG_WARNING("Event selection triggers not specified. Switching off trigger-aware monitoring");
41  m_doEvtSel = false;
42  }
43 
44  StoreGateSvc* detStore = nullptr;
45  ATH_CHECK(service("DetectorStore", detStore));
46  ATH_CHECK(m_edmHelperSvc.retrieve());
47  ATH_CHECK(m_idHelperSvc.retrieve());
48  ATH_CHECK(m_segmKey.initialize());
49 
51 }
52 
53 //
54 // fillHistograms-----------------------------------------------------------------------------------------
55 //
56 
57 StatusCode CSCSegmValMonAlg::fillHistograms(const EventContext& ctx) const{
58 
59  ATH_MSG_DEBUG( "in CSCSegmValMonAlg::fillHistograms() " );
60 
62 
63  // if required, check if event passed sample-selection triggers
64  if(m_doEvtSel && !evtSelTriggersPassed()) return StatusCode::SUCCESS;
65 
66  // Segment Cluster counter
67  int segmClustCount[33];
68 
69  // arrays to hold cluster-count
70  // 32 chambers and 8 layers (each has one extra - index '0' is not counted)
71  int clusCount[33][9];
72  for(unsigned int kl = 0; kl < 33; kl++ ) {
73  for(unsigned int cm3 = 0; cm3 < 9; cm3++ ){
74  clusCount[kl][cm3] = 0;
75  }
76  }
77 
78  for (const auto& key : m_segmKey){
80  if (!segments.isValid()) {
81  ATH_MSG_ERROR("Could not retrieve Trk::SegmentCollection "<<key.key());
82  return StatusCode::FAILURE;
83  }
84 
85  if ( segments->empty() ){
86  ATH_MSG_DEBUG( " Segm Collection is Empty, done... ");
87  return StatusCode::SUCCESS;
88  }
89 
90  ATH_MSG_DEBUG( " Segm Collection size " );
91  ATH_MSG_DEBUG( "Number of segms found: " << segments->size() );
92 
93  if(segments->size() > 0){
94  ATH_MSG_DEBUG( "Number of segms in event is: " << segments->size() );
95  ATH_MSG_DEBUG( "This algorithm is designed to operate for single segm / event only" );
96  ATH_MSG_DEBUG( "Processing only the first segm in the segm collection" );
97  }
98 
99  int layerindex = 0;
100 
101  //Loop over segms
102  for (Trk::SegmentCollection::const_iterator s = segments->begin(); s != segments->end(); ++s) {
103 
104  //Get segm
105  const Muon::MuonSegment *segm=dynamic_cast<const Muon::MuonSegment*>(*s);
106 
107  if (!segm){
108  ATH_MSG_WARNING( "no pointer to segm!!!" );
109  continue;
110  }
111 
112  ATH_MSG_DEBUG( "Looking at segment id" );
113  // Skip segment if there are no csc hits
114  if ( cscHits(segm)<1 ) continue;
115 
116  // Get contained measurements
117  const std::vector<const Trk::MeasurementBase*> meas = segm->containedMeasurements();
118 
119  // Skip segment if no measurements
120  // Number of clusters on segment
121  auto n_clust = Monitored::Scalar<int>("n_clust", meas.size());
122 
123  if ( n_clust < 2 ) continue;
124 
125  // Analyze segment if it is a csc segment
126  if ( !isCscSegment(segm) ) continue;
127 
128  // Initialize cluster counter
129  for(int sect = 0; sect < 33; sect++) {
130  segmClustCount[sect] = 0;
131  for(unsigned int ilay = 0; ilay < 9; ilay++ ){
132  clusCount[sect][ilay] = 0;
133  }
134  }
135 
136  // Print out segment information
137  const Trk::FitQuality* fq = segm->fitQuality();
138  double chi2 = 999.;
139  int ndof = -1;
140  if( fq ) {
141  chi2 = fq->chiSquared();
142  ndof = fq->numberDoF();
143  ATH_MSG_DEBUG( "Chi2 " << chi2 );
144  ATH_MSG_DEBUG( "Ndof " << ndof );
145  }
146 
147  // cut on segment angle
148  float segm_ly = segm->localParameters()[Trk::locY];
149  float segm_ayz = segm->localDirection().angleYZ();
150  segm_ayz -= M_PI/2.;
151  float segm_cut = m_segmSlope;
152  bool segmAngle_cut = segmSlopeCut(segm_ly, segm_ayz, segm_cut);
153  ATH_MSG_DEBUG(" local_pos: " << segm_ly << "\tangle_yz: " << segm_ayz << "\tcut: " << segm_cut << "\t pass = " << segmAngle_cut );
154 
155  ATH_MSG_DEBUG( "R " << segm->globalPosition().perp() );
156  ATH_MSG_DEBUG( "Z " << segm->globalPosition().z() );
157  ATH_MSG_DEBUG( "Phi " << segm->globalPosition().phi() );
158  ATH_MSG_DEBUG( "Eta " << segm->globalPosition().eta() );
159  ATH_MSG_DEBUG( "Dir Phi " << segm->globalDirection().phi() );
160  ATH_MSG_DEBUG( "Dir Eta " << segm->globalDirection().eta() );
161 
162  // ==============================================================================
163  // Field Range Notes
164  // ==============================================================================
165  // StationName unsigned integer maps to "CSS", "CSL", etc.
166  // StationEta [-1,1] -1 for backward, 1 for forward endcap
167  // StationPhi [1,8] increases with Phi
168  // Technology [1] maps to "CSC"
169  // ChamberLayer [1,2] increases with |Z|
170  // WireLayer [1,4] increases with |Z|
171  // MeasuresPhi [0,1] 0 if measures R, 1 if measures Phi
172  // Strip [1,n] increases with R for MeasuresPhi=0
173  // increases with Phi for MeasuresPhi=1
174  // ==============================================================================
175 
176  // identify the segment location
177  const Trk::MeasurementBase* rio = meas.at(0);
178  Identifier segmId = m_edmHelperSvc->getIdentifier(*rio);
179 
180  int segm_stationPhi = m_idHelperSvc->cscIdHelper().stationPhi(segmId);
181  int segm_stationEta = m_idHelperSvc->cscIdHelper().stationEta(segmId);
182  int segm_stationName = m_idHelperSvc->cscIdHelper().stationName(segmId);
183  int segm_chamberType = m_idHelperSvc->cscIdHelper().stationNameIndex("CSS") == segm_stationName ? 0 : 1;
184  auto segm_sectorNo = Monitored::Scalar<int>("segm_sectorNo", (segm_stationEta * (2 * segm_stationPhi - segm_chamberType)) ); // [-16 -> -1] and [+1 -> +16]
185  int segm_isec = segm_sectorNo < 0 ? segm_sectorNo*(-1) : segm_sectorNo+16; // [-16 -> -1] shifted to [1 -> 16] and [+1 -> +16] shifted to [+17 -> +32]
186  ATH_MSG_DEBUG(" sgsec = " << segm_isec << "\tsec = " << segm_sectorNo);
187  auto sideA = Monitored::Scalar<int>("sideA", (int) (segm_stationEta==1));
188  auto sideC = Monitored::Scalar<int>("sideC",(int)(segm_stationEta==-1));
189  fill("CscSegmMonitor",n_clust,segm_sectorNo,sideA,sideC);
190 
191  float clus_kiloele = 1.0e-3; // multiply # of electrons by this number to get kiloElectrons (1 ke = 1 ADC)
192  int eta_clus_count[2][2] = {{0, 0},{0, 0}}, phi_clus_count[2][2] = {{0, 0},{0, 0}}; // no. of prec/trans hits per segment
193  float eta_clus_qsum[2][5] = {{-1., 0., 0., 0., 0.}, {-1., 0., 0., 0., 0.}}, phi_clus_qsum[2][5] = {{-1., 0., 0., 0., 0.}, {-1., 0., 0., 0., 0.}}; // qsum over each prec/trans. layer on segment
194  float eta_clus_time[2][5] = {{-1., 0., 0., 0., 0.}, {-1., 0., 0., 0., 0.}}, phi_clus_time[2][5] = {{-1., 0., 0., 0., 0.}, {-1., 0., 0., 0., 0.}}; // time over each prec/trans. layer on segment
195  int eta_clus_use[2][5] = {{0, 0, 0, 0, 0 },{0, 0, 0, 0, 0}}, phi_clus_use[2][5] = {{0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}};
196 
197  layerindex = 0;
198 
199  for( auto& hit : segm->containedMeasurements()) {
200  const Muon::CscClusterOnTrack* clust_rot = dynamic_cast<const Muon::CscClusterOnTrack*>(hit);
201  if ( clust_rot ) {
202  Identifier clusId = m_edmHelperSvc->getIdentifier(*clust_rot);
203 
204  // get the cluster coordinates
205  int clus_stationName = m_idHelperSvc->cscIdHelper().stationName(clusId);
206  int clus_chamberType = m_idHelperSvc->cscIdHelper().stationNameIndex("CSS") == clus_stationName ? 0 : 1;
207  int clus_stationEta = m_idHelperSvc->cscIdHelper().stationEta(clusId);
208  int clus_stationPhi = m_idHelperSvc->cscIdHelper().stationPhi(clusId);
209  int clus_wireLayer = m_idHelperSvc->cscIdHelper().wireLayer(clusId);
210  int clus_measuresPhi = m_idHelperSvc->cscIdHelper().measuresPhi(clusId);
211 
212  // convert to my coordinates
213  int clus_sectorNo = clus_stationEta * (2 * clus_stationPhi - clus_chamberType); // [-16 -> -1] and [+1 -> +16]
214  auto clus_secLayer = Monitored::Scalar<float>("clus_secLayer", clus_sectorNo + 0.2 * (clus_wireLayer - 1) + 0.1);
215  int clus_isec = clus_sectorNo < 0 ? clus_sectorNo*(-1) : clus_sectorNo+16; // [-16 -> -1] shifted to [1 -> 16] and [+1 -> +16] shifted to [+17 -> +32]
216  int clus_ilay = (clus_measuresPhi ? clus_wireLayer : clus_wireLayer+4);
217 
218  // check the cluster status; probably need to read status info from jobOptions - not done for the moment
219  Muon::CscClusterStatus status = clust_rot->status();
220  auto status_mon = Monitored::Scalar<int>("status_mon",(int)clust_rot->status());
221  auto sideA_phi0 = Monitored::Scalar<int>("sideA_phi0",(int) (segm_stationEta==1)&& (int)(clus_measuresPhi==0));
222  auto sideC_phi0 = Monitored::Scalar<int>("sideC_phi0",(int) (segm_stationEta==-1) && (int)(clus_measuresPhi == 0));
223  auto sideA_phi = Monitored::Scalar<int>("sideA_phi", (int) (segm_stationEta==1) && (int)(clus_measuresPhi!=0));
224  auto sideC_phi = Monitored::Scalar<int>("sideC_phi", (int) (segm_stationEta==-1) && (int)(clus_measuresPhi!=0));
225 
226  fill("CscSegmMonitor",status_mon, sideA_phi0, sideC_phi0, sideA_phi, sideC_phi);
227 
228  std::string clus_stat = Muon::toString(status);
229  bool clus_status = ( (int(status)==Muon::CscStatusUnspoiled) || (int(status)==Muon::CscStatusSplitUnspoiled) || (int(status)==Muon::CscStatusSimple)) ? true : false;
230  bool clus_stat_eff = ( (int(status) >= 0 && int(status) < 8 ) || (int(status) > 8 && int(status) < 18) ) ? true : false;
231 
232  // get cluster
233  const Muon::CscPrepData* theClus = clust_rot->prepRawData();
234  float clus_qsum = 0, clus_time = -1.;
235  unsigned int clus_noStrips=0;
236  if(theClus){
237  clus_qsum = theClus->charge() * clus_kiloele;
238  clus_time = theClus->time();
239 
240  if(clus_measuresPhi == 0){
241  if(clus_stationEta == 1) eta_clus_count[0][0]++;
242  else eta_clus_count[1][0]++;
243  } else{
244  if(clus_stationEta == 1) phi_clus_count[0][0]++;
245  else phi_clus_count[1][0]++;
246  }
247  // get no. of strips per cluster
248  clus_noStrips = theClus->rdoList().size();
249  }
250 
251 
252  //need at least three strips in an eta-cluster
253  bool clus_eta_status = clus_status && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0);
254  bool clus_eta_eff = clus_stat_eff && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0);
255  if(clus_eta_eff){
256  if(clus_stationEta == 1) eta_clus_count[0][1]++;
257  else eta_clus_count[1][1]++;
258  }
259  if(clus_eta_status){
260  if(clus_stationEta == 1){
261  eta_clus_qsum[0][clus_wireLayer] = clus_qsum;
262  eta_clus_time[0][clus_wireLayer] = clus_time;
263  eta_clus_use[0][clus_wireLayer] = 1;
264  }
265  else{
266  eta_clus_qsum[1][clus_wireLayer] = clus_qsum;
267  eta_clus_time[1][clus_wireLayer] = clus_time;
268  eta_clus_use[1][clus_wireLayer] = 1;
269  }
270  }
271 
272  // need at least one strip in a phi-cluster
273  bool clus_phi_status = clus_status && ( clus_noStrips > 0 ) && (clus_measuresPhi == 1);
274  if(clus_phi_status) {
275  if(clus_stationEta==1){
276  phi_clus_qsum[0][clus_wireLayer] = clus_qsum;
277  phi_clus_time[0][clus_wireLayer] = clus_time;
278  phi_clus_use[0][clus_wireLayer] = 1;
279  phi_clus_count[0][1]++;
280  } else {
281  phi_clus_qsum[1][clus_wireLayer] = clus_qsum;
282  phi_clus_time[1][clus_wireLayer] = clus_time;
283  phi_clus_use[1][clus_wireLayer] = 1;
284  phi_clus_count[1][1]++;
285  }
286  }
287 
288  // increment the cluster-count for this layer
289  if(clus_eta_status || clus_phi_status) clusCount[clus_isec][clus_ilay]++;
290 
291  // increment segment cluster count
292  if(clus_eta_status) segmClustCount[clus_isec]++;
293 
294  if(clus_eta_status) layerindex+=clus_wireLayer;
295 
296  ATH_MSG_DEBUG("status = " << clus_stat << "\tcharge = " << clus_qsum << "\ttime= " << clus_time << "\tnstrips = " << clus_noStrips);
297 
298  auto clus_qsum_mon = Monitored::Scalar<float>("clus_qsum_mon",clus_qsum);
299  auto clus_time_mon = Monitored::Scalar<float>("clus_time_mon",clus_time);
300  auto checkStatusEtaA = Monitored::Scalar<int>("checkStatusEtaA", (int) (clus_eta_status && (clus_stationEta==1)));
301  auto checkStatusEtaC = Monitored::Scalar<int>("checkStatusEtaC", (int) (clus_eta_status && (clus_stationEta==-1)));
302  auto checkTimeEtaA = Monitored::Scalar<int>("checkTimeEtaA", (int) (clus_eta_status && (clus_stationEta==1) && (std::abs(clus_time) <= 200)));
303  auto checkTimeEtaC = Monitored::Scalar<int>("checkTimeEtaC", (int) (clus_eta_status && (clus_stationEta==-1) && (std::abs(clus_time) <= 200)));
304 
305  auto checkStatusPhiA = Monitored::Scalar<int>("checkStatusPhiA", (int) (clus_phi_status && (clus_stationEta==1)));
306  auto checkStatusPhiC = Monitored::Scalar<int>("checkStatusPhiC", (int) (clus_phi_status && (clus_stationEta==-1)));
307  auto checkTimePhiA = Monitored::Scalar<int>("checkTimePhiA", (int) (clus_phi_status && (clus_stationEta==1) && (std::abs(clus_time) <= 200)));
308  auto checkTimePhiC = Monitored::Scalar<int>("checkTimePhiC", (int) (clus_phi_status && (clus_stationEta==-1) && (std::abs(clus_time) <= 200)));
309  fill("CscSegmMonitor", clus_qsum_mon, clus_secLayer, clus_time_mon, checkStatusEtaA, checkStatusEtaC, checkTimeEtaA, checkTimeEtaC, checkStatusPhiA, checkStatusPhiC, checkTimePhiA, checkTimePhiC );
310 
311 
312  } // if clust_rot
313 
314  } // for loop over clusters
315 
316  auto tmp_etaClusA = Monitored::Scalar<float>("tmp_etaClusA", eta_clus_count[0][0]);
317  auto tmp_etaClusGoodA = Monitored::Scalar<float>("tmp_etaClusGoodA", eta_clus_count[0][1]);
318 
319  auto tmp_phiClusA = Monitored::Scalar<float>("tmp_phiClusA", phi_clus_count[0][0]);
320  auto tmp_phiClusGoodA = Monitored::Scalar<float>("tmp_phiClusGoodA", phi_clus_count[0][1]);
321 
322  auto checkClusEtaA = Monitored::Scalar<int>("checkClusEtaA", (int) (eta_clus_count[0][0] > 0));
323  auto checkClusEtaGoodA = Monitored::Scalar<int>("checkClusEtaGoodA", (int) (eta_clus_count[0][1] > 0));
324 
325  auto checkClusPhiA = Monitored::Scalar<int>("checkClusPhiA", (int) (phi_clus_count[0][0] > 0));
326  auto checkClusPhiGoodA = Monitored::Scalar<int>("checkClusPhiGoodA", (int) (phi_clus_count[0][1] > 0));
327 
328  auto tmp_etaClusC = Monitored::Scalar<float>("tmp_etaClusC", eta_clus_count[1][0]);
329  auto tmp_etaClusGoodC = Monitored::Scalar<float>("tmp_etaClusGoodC", eta_clus_count[1][1]);
330 
331  auto tmp_phiClusC = Monitored::Scalar<float>("tmp_phiClusC", phi_clus_count[1][0]);
332  auto tmp_phiClusGoodC = Monitored::Scalar<float>("tmp_phiClusGoodC", phi_clus_count[1][1]);
333 
334  auto checkClusEtaC = Monitored::Scalar<int>("checkClusEtaC", (int) (eta_clus_count[1][0] > 0));
335  auto checkClusEtaGoodC = Monitored::Scalar<int>("checkClusEtaGoodC", (int) (eta_clus_count[1][1] > 0));
336 
337  auto checkClusPhiC = Monitored::Scalar<int>("checkClusPhiC", (int) (phi_clus_count[1][0] > 0));
338  auto checkClusPhiGoodC = Monitored::Scalar<int>("checkClusPhiGoodC", (int) (phi_clus_count[1][1] > 0));
339 
340  fill("CscSegmMonitor", tmp_etaClusA, checkClusEtaA, tmp_etaClusGoodA, checkClusEtaGoodA, tmp_phiClusA, tmp_phiClusGoodA, checkClusPhiA, checkClusPhiGoodA, tmp_etaClusC, checkClusEtaC, tmp_etaClusGoodC, checkClusEtaGoodC, tmp_phiClusC, tmp_phiClusGoodC, checkClusPhiC, checkClusPhiGoodC);
341 
342  // Fill number of 3 and 4 cluster segment histogram
343  std::vector<int> tmp_layerIndexA;
344  std::vector<int> tmp_isectA;
345  std::vector<int> tmp_layerIndexC;
346  std::vector<int> tmp_isectC;
347 
348  for( int isect = 1; isect < 17; isect++) {
349 
350  if(segmClustCount[isect+16] > 2 ) {
351  tmp_layerIndexA.push_back(layerindex-5);
352  tmp_isectA.push_back(isect);
353  }
354 
355  if(segmClustCount[isect+16] > 3){
356  for(int i=1; i<=4; i++) {
357  tmp_layerIndexA.push_back(i);
358  tmp_isectA.push_back(isect);
359  }
360  }
361 
362  if(segmClustCount[isect] > 2) {
363  tmp_layerIndexC.push_back(layerindex-5);
364  tmp_isectC.push_back(-1.*isect);
365  }
366 
367 
368  if(segmClustCount[isect] > 3) {
369  for(int i=1; i<=4; i++) {
370  tmp_layerIndexC.push_back(i);
371  tmp_isectC.push_back(-1.*isect);
372  }
373  }
374  }
375 
376  auto tmp_layerIndexA_mon = Monitored::Collection("tmp_layerIndexA_mon", tmp_layerIndexA);
377  auto tmp_isectA_mon = Monitored::Collection("tmp_isectA_mon", tmp_isectA);
378  auto tmp_layerIndexC_mon = Monitored::Collection("tmp_layerIndexC_mon", tmp_layerIndexC);
379  auto tmp_isectC_mon = Monitored::Collection("tmp_isectC_mon", tmp_isectC);
380  fill("CscSegmMonitor", tmp_layerIndexA_mon, tmp_isectA_mon, tmp_layerIndexC_mon, tmp_isectC_mon);
381 
382  float eta_clus_qsum_tot = 0., phi_clus_qsum_tot = 0.; // total qsum over all prec. trans. layers on segment
383 
384  for(unsigned int i=0; i < 2; i++){
385  eta_clus_qsum_tot = 0; phi_clus_qsum_tot = 0.;
386 
387  for(unsigned int j = 1; j <5; j++) {
388  if(i==0){
389  auto etaClusQSumA = Monitored::Scalar<float>("etaClusQSumA", eta_clus_qsum[i][j]);
390  auto phiClusQSumA = Monitored::Scalar<float>("phiClusQSumA", phi_clus_qsum[i][j]);
391  fill("CscSegmMonitor", etaClusQSumA, phiClusQSumA);
392 
393  if(std::abs(eta_clus_time[i][j]) <= 200) {
394  auto etaTimeClusA = Monitored::Scalar<float>("etaTimeClusA",eta_clus_time[i][j]);
395  fill("CscSegmMonitor", etaTimeClusA);
396  }
397 
398  if(std::abs(phi_clus_time[i][j]) <= 200) {
399  auto phiTimeClusA = Monitored::Scalar<float>("phiTimeClusA",phi_clus_time[i][j]);
400  fill("CscSegmMonitor", phiTimeClusA);
401  }
402  }
403 
404  if(i==1){
405  auto etaClusQSumC = Monitored::Scalar<float>("etaClusQSumC", eta_clus_qsum[i][j]);
406  auto phiClusQSumC = Monitored::Scalar<float>("phiClusQSumC", phi_clus_qsum[i][j]);
407  fill("CscSegmMonitor", etaClusQSumC, phiClusQSumC);
408 
409  if(std::abs(eta_clus_time[i][j]) <= 200) {
410  auto etaTimeClusC = Monitored::Scalar<float>("etaTimeClusC",eta_clus_time[i][j]);
411  fill("CscSegmMonitor", etaTimeClusC);
412  }
413 
414  if(std::abs(phi_clus_time[i][j]) <= 200) {
415  auto phiTimeClusC = Monitored::Scalar<float>("phiTimeClusC",phi_clus_time[i][j]);
416  fill("CscSegmMonitor", phiTimeClusC);
417  }
418  }
419 
420  if(phi_clus_use[i][j] && eta_clus_use[i][j]){
421  eta_clus_qsum_tot += eta_clus_qsum[i][j];
422  phi_clus_qsum_tot += phi_clus_qsum[i][j];
423 
424  if(i==0){
425  auto etaQSumGoodClusA = Monitored::Scalar<float>("etaQSumGoodClusA",eta_clus_qsum[i][j]);
426  auto phiQSumGoodClusA = Monitored::Scalar<float>("phiQSumGoodClusA",phi_clus_qsum[i][j]);
427  fill("CscSegmMonitor", etaQSumGoodClusA, phiQSumGoodClusA);
428  if(std::abs(eta_clus_time[i][j]) <= 200){
429  auto etaTimeGoodClusA = Monitored::Scalar<float>("etaTimeGoodClusA",eta_clus_time[i][j]);
430  fill("CscSegmMonitor", etaTimeGoodClusA);
431  }
432 
433  if(std::abs(phi_clus_time[i][j]) <= 200) {
434  auto phiTimeGoodClusA = Monitored::Scalar<float>("phiTimeGoodClusA",phi_clus_time[i][j]);
435  fill("CscSegmMonitor", phiTimeGoodClusA);
436  }
437  }
438 
439  if(i==1){
440  auto etaQSumGoodClusC = Monitored::Scalar<float>("etaQSumGoodClusC",eta_clus_qsum[i][j]);
441  auto phiQSumGoodClusC = Monitored::Scalar<float>("phiQSumGoodClusC",phi_clus_qsum[i][j]);
442  fill("CscSegmMonitor", etaQSumGoodClusC, phiQSumGoodClusC);
443  if(std::abs(eta_clus_time[i][j]) <= 200){
444  auto etaTimeGoodClusC = Monitored::Scalar<float>("etaTimeGoodClusC",eta_clus_time[i][j]);
445  fill("CscSegmMonitor", etaTimeGoodClusC);
446  }
447 
448  if(std::abs(phi_clus_time[i][j]) <= 200) {
449  auto phiTimeGoodClusC = Monitored::Scalar<float>("phiTimeGoodClusC",phi_clus_time[i][j]);
450  fill("CscSegmMonitor", phiTimeGoodClusC);
451  }
452  }
453  }
454  }
455 
456  if(i==0) {
457  auto etaQSumTotA = Monitored::Scalar<float>("etaQSumTotA", eta_clus_qsum_tot);
458  auto phiQSumTotA = Monitored::Scalar<float>("phiQSumTotA", phi_clus_qsum_tot);
459  fill("CscSegmMonitor", etaQSumTotA, phiQSumTotA);
460  }
461 
462  if(i==1) {
463  auto etaQSumTotC = Monitored::Scalar<float>("etaQSumTotC", eta_clus_qsum_tot);
464  auto phiQSumTotC = Monitored::Scalar<float>("phiQSumTotC", phi_clus_qsum_tot);
465  fill("CscSegmMonitor", etaQSumTotC, phiQSumTotC);
466  }
467  }
468  } // loop over segms
469  }
470  } // environment if
471 
472  return StatusCode::SUCCESS;
473 }
474 
475 //________________________________________________________________________________________________________
477 
478  if(!m_doEvtSel) return true;
479 
480  for (const auto& trig : m_sampSelTriggers) {
481  if(m_trigDecTool->isPassed(trig, TrigDefs::eventAccepted)) {
482  return true;
483  }
484  }
485  return false;
486 
487 } // end evtSelTriggersPassed
488 
489 //________________________________________________________________________________________________________
491  bool isCsc(false);
492 
493  std::vector<const Trk::MeasurementBase*> mbs = seg->containedMeasurements();
494  for( unsigned int i = 0; i< mbs.size(); ++i){
495 
496  const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*> (mbs[i]);
497  if (!rot){
498  const Trk::CompetingRIOsOnTrack* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*> (mbs[i]);
499  if (crot) rot = &(crot->rioOnTrack(0));
500  }
501  if( !rot ) {
502  continue;
503  }
504  if( m_idHelperSvc->isCsc( rot->identify() ) ) isCsc=true;
505  }
506 
507  return isCsc;
508 }
509 
510 
511 //________________________________________________________________________________________________________
512 unsigned int CSCSegmValMonAlg::cscHits( const Muon::MuonSegment* seg ) const {
513  unsigned int nrHits(0);
514 
515  std::vector<const Trk::MeasurementBase*> mbs = seg->containedMeasurements();
516  for( unsigned int i = 0; i< mbs.size(); ++i){
517 
518  const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*> (mbs[i]);
519  if (!rot){
520  const Trk::CompetingRIOsOnTrack* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*> (mbs[i]);
521  if (crot) rot = &(crot->rioOnTrack(0));
522  }
523  if( !rot ) {
524  continue;
525  }
526  if( m_idHelperSvc->isCsc( rot->identify() ) ) ++nrHits;
527  }
528 
529  return nrHits ;
530 }
531 
532 //________________________________________________________________________________________________________
533 bool CSCSegmValMonAlg::segmSlopeCut(const float csc_x, const float csc_ax, const float cut ) const {
534  float s0 = csc_x;
535  float s1 = -std::tan(csc_ax);
536  float s1corr = s1 - 0.000119 * s0;
537  bool good_segm = std::abs(s1corr)<cut ? true : false;
538  return good_segm;
539 }
540 
IDTPM::ndof
float ndof(const U &p)
Definition: TrackParametersHelper.h:142
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
CscStripPrepDataContainer.h
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthMonitorAlgorithm::m_trigDecTool
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
Definition: AthMonitorAlgorithm.h:340
CompetingRIOsOnTrack.h
Trk::locY
@ locY
local cartesian
Definition: ParamDefs.h:44
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
ZDC::sideC
BySideTypeMod sideC(-1)
AthMonitorAlgorithm::Environment_t::tier0
@ tier0
Muon::CscPrepData::charge
int charge() const
Returns the charge.
Definition: CscPrepData.h:153
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
cm3
#define cm3
M_PI
#define M_PI
Definition: ActiveFraction.h:11
CscStripPrepDataCollection.h
CSCSegmValMonAlg::isCscSegment
bool isCscSegment(const Muon::MuonSegment *seg) const
Definition: CSCSegmValMonAlg.cxx:490
Trk::PrepRawData::rdoList
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
AthMonitorAlgorithm::m_environment
AthMonitorAlgorithm::Environment_t m_environment
Instance of the Environment_t enum.
Definition: AthMonitorAlgorithm.h:350
PropDirection.h
CSCSegmValMonAlg::CSCSegmValMonAlg
CSCSegmValMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Definition: CSCSegmValMonAlg.cxx:28
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
CSCSegmValMonAlg::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: CSCSegmValMonAlg.cxx:57
AthMonitorAlgorithm::Environment_t::user
@ user
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
Trk::LocalDirection::angleYZ
double angleYZ() const
access method for angle of local YZ projection
Definition: LocalDirection.h:106
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
CSCSegmValMonAlg::m_edmHelperSvc
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
Definition: CSCSegmValMonAlg.h:57
Trk::CompetingRIOsOnTrack::rioOnTrack
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
CSCSegmValMonAlg::cscHits
unsigned int cscHits(const Muon::MuonSegment *seg) const
Definition: CSCSegmValMonAlg.cxx:512
keylayer_zslicemap.kl
kl
Definition: keylayer_zslicemap.py:109
Muon::toString
std::string toString(CscStripStatus cstat)
Return a string description of a CSC cluster status flag.
Definition: CscStripStatus.h:48
CSCSegmValMonAlg::m_doEvtSel
Gaudi::Property< bool > m_doEvtSel
Definition: CSCSegmValMonAlg.h:64
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CSCSegmValMonAlg::initialize
virtual StatusCode initialize() override
initialize
Definition: CSCSegmValMonAlg.cxx:34
CscPrepData.h
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
Muon::CscPrepData
Class representing clusters from the CSC.
Definition: CscPrepData.h:39
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
Muon::CscStatusSimple
@ CscStatusSimple
Cluster with non-precision fit.
Definition: CscClusterStatus.h:29
Muon::MuonSegment::localDirection
const Trk::LocalDirection & localDirection() const
local direction
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:169
Trk::Segment::containedMeasurements
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
Definition: TrkEvent/TrkSegment/TrkSegment/Segment.h:166
TrackCollection.h
CscClusterOnTrack.h
Trk::CompetingRIOsOnTrack
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
Definition: CompetingRIOsOnTrack.h:64
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
AthenaMonManager.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Muon::CscPrepData::time
double time() const
Returns the time.
Definition: CscPrepData.h:158
CSCSegmValMonAlg::m_segmKey
SG::ReadHandleKeyArray< Trk::SegmentCollection > m_segmKey
Definition: CSCSegmValMonAlg.h:61
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk::FitQuality
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition: FitQuality.h:97
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::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
CscClusterStatus.h
CSCSegmValMonAlg::m_sampSelTriggers
Gaudi::Property< std::vector< std::string > > m_sampSelTriggers
Definition: CSCSegmValMonAlg.h:63
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Muon::CscStatusUnspoiled
@ CscStatusUnspoiled
Clean cluster with precision fit.
Definition: CscClusterStatus.h:26
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
AthMonitorAlgorithm::Environment_t::tier0ESD
@ tier0ESD
CSCSegmValMonAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: CSCSegmValMonAlg.h:60
CSCSegmValMonAlg::evtSelTriggersPassed
bool evtSelTriggersPassed() const
Definition: CSCSegmValMonAlg.cxx:476
CSCSegmValMonAlg::segmSlopeCut
bool segmSlopeCut(const float csc_x, const float csc_ax, const float cut) const
Definition: CSCSegmValMonAlg.cxx:533
Muon::CscClusterOnTrack::prepRawData
virtual const CscPrepData * prepRawData() const override final
Returns the CscPrepData - is a CscPrepData in this scope.
Definition: CscClusterOnTrack.h:154
Trk::MeasurementBase::localParameters
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
Definition: MeasurementBase.h:132
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
ZDC::sideA
BySideTypeMod sideA(1)
Muon::CscClusterOnTrack
Class to represent the calibrated clusters created from CSC strips.
Definition: CscClusterOnTrack.h:47
Muon::CscStatusSplitUnspoiled
@ CscStatusSplitUnspoiled
Clean cluster with precision fit after split cluster.
Definition: CscClusterStatus.h:59
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PlaneSurface.h
Muon::CscClusterOnTrack::status
CscClusterStatus status() const
Returns Csc position measurement status flag.
Definition: CscClusterOnTrack.h:178
Trk::RIO_OnTrack::identify
virtual Identifier identify() const final
return the identifier -extends MeasurementBase
Definition: RIO_OnTrack.h:155
Trk::FitQuality::chiSquared
double chiSquared() const
returns the of the overall track fit
Definition: FitQuality.h:56
CSCSegmValMonAlg::m_segmSlope
Gaudi::Property< double > m_segmSlope
Definition: CSCSegmValMonAlg.h:65
Trk::FitQuality::numberDoF
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition: FitQuality.h:60
merge.status
status
Definition: merge.py:17
Muon::MuonSegment::globalPosition
virtual const Amg::Vector3D & globalPosition() const override final
global position
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:157
LocalDirection.h
Muon::MuonSegment
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:45
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
Muon::CscClusterStatus
CscClusterStatus
Enum to represent the cluster status - see the specific enum values for more details.
Definition: CscClusterStatus.h:23
Trk::Segment::fitQuality
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
Definition: TrkEvent/TrkSegment/TrkSegment/Segment.h:160
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
Muon::MuonSegment::globalDirection
const Amg::Vector3D & globalDirection() const
global direction
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:163
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
CSCSegmValMonAlg.h