User will overwrite this function. Histogram booking is no longer done in C++. This function is called in execute once the filters are all passed.
53 {
54
56
58
59
61
62
63 int segmClustCount[33];
64
65
66
67 int clusCount[33][9];
68 for(
unsigned int kl = 0;
kl < 33;
kl++ ) {
69 for(
unsigned int cm3 = 0;
cm3 < 9;
cm3++ ){
70 clusCount[
kl][
cm3] = 0;
71 }
72 }
73
75 SG::ReadHandle<Trk::SegmentCollection> segments(key, ctx);
76 if (!segments.isValid()) {
78 return StatusCode::FAILURE;
79 }
80
81 if ( segments->empty() ){
83 return StatusCode::SUCCESS;
84 }
85
87 ATH_MSG_DEBUG(
"Number of segms found: " << segments->size() );
88
89 if(segments->size() > 0){
90 ATH_MSG_DEBUG(
"Number of segms in event is: " << segments->size() );
91 ATH_MSG_DEBUG(
"This algorithm is designed to operate for single segm / event only" );
92 ATH_MSG_DEBUG(
"Processing only the first segm in the segm collection" );
93 }
94
95 int layerindex = 0;
96
97
99
100
101 const Muon::MuonSegment *segm=dynamic_cast<const Muon::MuonSegment*>(*s);
102
103 if (!segm){
105 continue;
106 }
107
109
110 if (
cscHits(segm)<1 )
continue;
111
112
114
115
116
117 auto n_clust = Monitored::Scalar<int>("n_clust", meas.size());
118
119 if ( n_clust < 2 ) continue;
120
121
123
124
125 for(int sect = 0; sect < 33; sect++) {
126 segmClustCount[sect] = 0;
127 for(unsigned int ilay = 0; ilay < 9; ilay++ ){
128 clusCount[sect][ilay] = 0;
129 }
130 }
131
132
133 const Trk::FitQuality* fq = segm->
fitQuality();
136 if( fq ) {
141 }
142
143
148 bool segmAngle_cut =
segmSlopeCut(segm_ly, segm_ayz, segm_cut);
149 ATH_MSG_DEBUG(
" local_pos: " << segm_ly <<
"\tangle_yz: " << segm_ayz <<
"\tcut: " << segm_cut <<
"\t pass = " << segmAngle_cut );
150
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 const Trk::MeasurementBase* rio = meas.at(0);
175
176 int segm_stationPhi =
m_idHelperSvc->cscIdHelper().stationPhi(segmId);
177 int segm_stationEta =
m_idHelperSvc->cscIdHelper().stationEta(segmId);
178 int segm_stationName =
m_idHelperSvc->cscIdHelper().stationName(segmId);
179 int segm_chamberType =
m_idHelperSvc->cscIdHelper().stationNameIndex(
"CSS") == segm_stationName ? 0 : 1;
180 auto segm_sectorNo = Monitored::Scalar<int>("segm_sectorNo", (segm_stationEta * (2 * segm_stationPhi - segm_chamberType)) );
181 int segm_isec = segm_sectorNo < 0 ? segm_sectorNo*(-1) : segm_sectorNo+16;
182 ATH_MSG_DEBUG(
" sgsec = " << segm_isec <<
"\tsec = " << segm_sectorNo);
183 auto sideA = Monitored::Scalar<int>(
"sideA", (
int) (segm_stationEta==1));
184 auto sideC = Monitored::Scalar<int>(
"sideC",(
int)(segm_stationEta==-1));
185 fill(
"CscSegmMonitor",n_clust,segm_sectorNo,sideA,sideC);
186
187 float clus_kiloele = 1.0e-3;
188 int eta_clus_count[2][2] = {{0, 0},{0, 0}}, phi_clus_count[2][2] = {{0, 0},{0, 0}};
189 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.}};
190 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.}};
191 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}};
192
193 layerindex = 0;
194
196 const Muon::CscClusterOnTrack* clust_rot = dynamic_cast<const Muon::CscClusterOnTrack*>(hit);
197 if ( clust_rot ) {
199
200
201 int clus_stationName =
m_idHelperSvc->cscIdHelper().stationName(clusId);
202 int clus_chamberType =
m_idHelperSvc->cscIdHelper().stationNameIndex(
"CSS") == clus_stationName ? 0 : 1;
203 int clus_stationEta =
m_idHelperSvc->cscIdHelper().stationEta(clusId);
204 int clus_stationPhi =
m_idHelperSvc->cscIdHelper().stationPhi(clusId);
205 int clus_wireLayer =
m_idHelperSvc->cscIdHelper().wireLayer(clusId);
206 int clus_measuresPhi =
m_idHelperSvc->cscIdHelper().measuresPhi(clusId);
207
208
209 int clus_sectorNo = clus_stationEta * (2 * clus_stationPhi - clus_chamberType);
210 auto clus_secLayer = Monitored::Scalar<float>("clus_secLayer", clus_sectorNo + 0.2 * (clus_wireLayer - 1) + 0.1);
211 int clus_isec = clus_sectorNo < 0 ? clus_sectorNo*(-1) : clus_sectorNo+16;
212 int clus_ilay = (clus_measuresPhi ? clus_wireLayer : clus_wireLayer+4);
213
214
216 auto status_mon = Monitored::Scalar<int>(
"status_mon",(
int)clust_rot->
status());
217 auto sideA_phi0 = Monitored::Scalar<int>("sideA_phi0",(int) (segm_stationEta==1)&& (int)(clus_measuresPhi==0));
218 auto sideC_phi0 = Monitored::Scalar<int>("sideC_phi0",(int) (segm_stationEta==-1) && (int)(clus_measuresPhi == 0));
219 auto sideA_phi = Monitored::Scalar<int>("sideA_phi", (int) (segm_stationEta==1) && (int)(clus_measuresPhi!=0));
220 auto sideC_phi = Monitored::Scalar<int>("sideC_phi", (int) (segm_stationEta==-1) && (int)(clus_measuresPhi!=0));
221
222 fill(
"CscSegmMonitor",status_mon, sideA_phi0, sideC_phi0, sideA_phi, sideC_phi);
223
226 bool clus_stat_eff = ( (
int(status) >= 0 &&
int(status) < 8 ) || (
int(status) > 8 &&
int(status) < 18) ) ?
true : false;
227
228
229 const Muon::CscPrepData* theClus = clust_rot->
prepRawData();
230 float clus_qsum = 0, clus_time = -1.;
231 unsigned int clus_noStrips=0;
232 if(theClus){
233 clus_qsum = theClus->
charge() * clus_kiloele;
234 clus_time = theClus->
time();
235
236 if(clus_measuresPhi == 0){
237 if(clus_stationEta == 1) eta_clus_count[0][0]++;
238 else eta_clus_count[1][0]++;
239 } else{
240 if(clus_stationEta == 1) phi_clus_count[0][0]++;
241 else phi_clus_count[1][0]++;
242 }
243
244 clus_noStrips = theClus->
rdoList().size();
245 }
246
247
248
249 bool clus_eta_status = clus_status && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0);
250 bool clus_eta_eff = clus_stat_eff && ( clus_noStrips > 2 ) && (clus_measuresPhi == 0);
251 if(clus_eta_eff){
252 if(clus_stationEta == 1) eta_clus_count[0][1]++;
253 else eta_clus_count[1][1]++;
254 }
255 if(clus_eta_status){
256 if(clus_stationEta == 1){
257 eta_clus_qsum[0][clus_wireLayer] = clus_qsum;
258 eta_clus_time[0][clus_wireLayer] = clus_time;
259 eta_clus_use[0][clus_wireLayer] = 1;
260 }
261 else{
262 eta_clus_qsum[1][clus_wireLayer] = clus_qsum;
263 eta_clus_time[1][clus_wireLayer] = clus_time;
264 eta_clus_use[1][clus_wireLayer] = 1;
265 }
266 }
267
268
269 bool clus_phi_status = clus_status && ( clus_noStrips > 0 ) && (clus_measuresPhi == 1);
270 if(clus_phi_status) {
271 if(clus_stationEta==1){
272 phi_clus_qsum[0][clus_wireLayer] = clus_qsum;
273 phi_clus_time[0][clus_wireLayer] = clus_time;
274 phi_clus_use[0][clus_wireLayer] = 1;
275 phi_clus_count[0][1]++;
276 } else {
277 phi_clus_qsum[1][clus_wireLayer] = clus_qsum;
278 phi_clus_time[1][clus_wireLayer] = clus_time;
279 phi_clus_use[1][clus_wireLayer] = 1;
280 phi_clus_count[1][1]++;
281 }
282 }
283
284
285 if(clus_eta_status || clus_phi_status) clusCount[clus_isec][clus_ilay]++;
286
287
288 if(clus_eta_status) segmClustCount[clus_isec]++;
289
290 if(clus_eta_status) layerindex+=clus_wireLayer;
291
292 ATH_MSG_DEBUG(
"status = " << clus_stat <<
"\tcharge = " << clus_qsum <<
"\ttime= " << clus_time <<
"\tnstrips = " << clus_noStrips);
293
294 auto clus_qsum_mon = Monitored::Scalar<float>("clus_qsum_mon",clus_qsum);
295 auto clus_time_mon = Monitored::Scalar<float>("clus_time_mon",clus_time);
296 auto checkStatusEtaA = Monitored::Scalar<int>("checkStatusEtaA", (int) (clus_eta_status && (clus_stationEta==1)));
297 auto checkStatusEtaC = Monitored::Scalar<int>("checkStatusEtaC", (int) (clus_eta_status && (clus_stationEta==-1)));
298 auto checkTimeEtaA = Monitored::Scalar<int>("checkTimeEtaA", (int) (clus_eta_status && (clus_stationEta==1) && (std::abs(clus_time) <= 200)));
299 auto checkTimeEtaC = Monitored::Scalar<int>("checkTimeEtaC", (int) (clus_eta_status && (clus_stationEta==-1) && (std::abs(clus_time) <= 200)));
300
301 auto checkStatusPhiA = Monitored::Scalar<int>("checkStatusPhiA", (int) (clus_phi_status && (clus_stationEta==1)));
302 auto checkStatusPhiC = Monitored::Scalar<int>("checkStatusPhiC", (int) (clus_phi_status && (clus_stationEta==-1)));
303 auto checkTimePhiA = Monitored::Scalar<int>("checkTimePhiA", (int) (clus_phi_status && (clus_stationEta==1) && (std::abs(clus_time) <= 200)));
304 auto checkTimePhiC = Monitored::Scalar<int>("checkTimePhiC", (int) (clus_phi_status && (clus_stationEta==-1) && (std::abs(clus_time) <= 200)));
305 fill(
"CscSegmMonitor", clus_qsum_mon, clus_secLayer, clus_time_mon, checkStatusEtaA, checkStatusEtaC, checkTimeEtaA, checkTimeEtaC, checkStatusPhiA, checkStatusPhiC, checkTimePhiA, checkTimePhiC );
306
307
308 }
309
310 }
311
312 auto tmp_etaClusA = Monitored::Scalar<float>("tmp_etaClusA", eta_clus_count[0][0]);
313 auto tmp_etaClusGoodA = Monitored::Scalar<float>("tmp_etaClusGoodA", eta_clus_count[0][1]);
314
315 auto tmp_phiClusA = Monitored::Scalar<float>("tmp_phiClusA", phi_clus_count[0][0]);
316 auto tmp_phiClusGoodA = Monitored::Scalar<float>("tmp_phiClusGoodA", phi_clus_count[0][1]);
317
318 auto checkClusEtaA = Monitored::Scalar<int>("checkClusEtaA", (int) (eta_clus_count[0][0] > 0));
319 auto checkClusEtaGoodA = Monitored::Scalar<int>("checkClusEtaGoodA", (int) (eta_clus_count[0][1] > 0));
320
321 auto checkClusPhiA = Monitored::Scalar<int>("checkClusPhiA", (int) (phi_clus_count[0][0] > 0));
322 auto checkClusPhiGoodA = Monitored::Scalar<int>("checkClusPhiGoodA", (int) (phi_clus_count[0][1] > 0));
323
324 auto tmp_etaClusC = Monitored::Scalar<float>("tmp_etaClusC", eta_clus_count[1][0]);
325 auto tmp_etaClusGoodC = Monitored::Scalar<float>("tmp_etaClusGoodC", eta_clus_count[1][1]);
326
327 auto tmp_phiClusC = Monitored::Scalar<float>("tmp_phiClusC", phi_clus_count[1][0]);
328 auto tmp_phiClusGoodC = Monitored::Scalar<float>("tmp_phiClusGoodC", phi_clus_count[1][1]);
329
330 auto checkClusEtaC = Monitored::Scalar<int>("checkClusEtaC", (int) (eta_clus_count[1][0] > 0));
331 auto checkClusEtaGoodC = Monitored::Scalar<int>("checkClusEtaGoodC", (int) (eta_clus_count[1][1] > 0));
332
333 auto checkClusPhiC = Monitored::Scalar<int>("checkClusPhiC", (int) (phi_clus_count[1][0] > 0));
334 auto checkClusPhiGoodC = Monitored::Scalar<int>("checkClusPhiGoodC", (int) (phi_clus_count[1][1] > 0));
335
336 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);
337
338
339 std::vector<int> tmp_layerIndexA;
340 std::vector<int> tmp_isectA;
341 std::vector<int> tmp_layerIndexC;
342 std::vector<int> tmp_isectC;
343
344 for( int isect = 1; isect < 17; isect++) {
345
346 if(segmClustCount[isect+16] > 2 ) {
347 tmp_layerIndexA.push_back(layerindex-5);
348 tmp_isectA.push_back(isect);
349 }
350
351 if(segmClustCount[isect+16] > 3){
352 for(
int i=1;
i<=4;
i++) {
353 tmp_layerIndexA.push_back(i);
354 tmp_isectA.push_back(isect);
355 }
356 }
357
358 if(segmClustCount[isect] > 2) {
359 tmp_layerIndexC.push_back(layerindex-5);
360 tmp_isectC.push_back(-1.*isect);
361 }
362
363
364 if(segmClustCount[isect] > 3) {
365 for(
int i=1;
i<=4;
i++) {
366 tmp_layerIndexC.push_back(i);
367 tmp_isectC.push_back(-1.*isect);
368 }
369 }
370 }
371
376 fill(
"CscSegmMonitor", tmp_layerIndexA_mon, tmp_isectA_mon, tmp_layerIndexC_mon, tmp_isectC_mon);
377
378 float eta_clus_qsum_tot = 0., phi_clus_qsum_tot = 0.;
379
380 for(
unsigned int i=0;
i < 2;
i++){
381 eta_clus_qsum_tot = 0; phi_clus_qsum_tot = 0.;
382
383 for(unsigned int j = 1; j <5; j++) {
384 if(i==0){
385 auto etaClusQSumA = Monitored::Scalar<float>("etaClusQSumA", eta_clus_qsum[i][j]);
386 auto phiClusQSumA = Monitored::Scalar<float>("phiClusQSumA", phi_clus_qsum[i][j]);
387 fill(
"CscSegmMonitor", etaClusQSumA, phiClusQSumA);
388
389 if(std::abs(eta_clus_time[i][j]) <= 200) {
390 auto etaTimeClusA = Monitored::Scalar<float>("etaTimeClusA",eta_clus_time[i][j]);
391 fill(
"CscSegmMonitor", etaTimeClusA);
392 }
393
394 if(std::abs(phi_clus_time[i][j]) <= 200) {
395 auto phiTimeClusA = Monitored::Scalar<float>("phiTimeClusA",phi_clus_time[i][j]);
396 fill(
"CscSegmMonitor", phiTimeClusA);
397 }
398 }
399
400 if(i==1){
401 auto etaClusQSumC = Monitored::Scalar<float>("etaClusQSumC", eta_clus_qsum[i][j]);
402 auto phiClusQSumC = Monitored::Scalar<float>("phiClusQSumC", phi_clus_qsum[i][j]);
403 fill(
"CscSegmMonitor", etaClusQSumC, phiClusQSumC);
404
405 if(std::abs(eta_clus_time[i][j]) <= 200) {
406 auto etaTimeClusC = Monitored::Scalar<float>("etaTimeClusC",eta_clus_time[i][j]);
407 fill(
"CscSegmMonitor", etaTimeClusC);
408 }
409
410 if(std::abs(phi_clus_time[i][j]) <= 200) {
411 auto phiTimeClusC = Monitored::Scalar<float>("phiTimeClusC",phi_clus_time[i][j]);
412 fill(
"CscSegmMonitor", phiTimeClusC);
413 }
414 }
415
416 if(phi_clus_use[i][j] && eta_clus_use[i][j]){
417 eta_clus_qsum_tot += eta_clus_qsum[
i][j];
418 phi_clus_qsum_tot += phi_clus_qsum[
i][j];
419
420 if(i==0){
421 auto etaQSumGoodClusA = Monitored::Scalar<float>("etaQSumGoodClusA",eta_clus_qsum[i][j]);
422 auto phiQSumGoodClusA = Monitored::Scalar<float>("phiQSumGoodClusA",phi_clus_qsum[i][j]);
423 fill(
"CscSegmMonitor", etaQSumGoodClusA, phiQSumGoodClusA);
424 if(std::abs(eta_clus_time[i][j]) <= 200){
425 auto etaTimeGoodClusA = Monitored::Scalar<float>("etaTimeGoodClusA",eta_clus_time[i][j]);
426 fill(
"CscSegmMonitor", etaTimeGoodClusA);
427 }
428
429 if(std::abs(phi_clus_time[i][j]) <= 200) {
430 auto phiTimeGoodClusA = Monitored::Scalar<float>("phiTimeGoodClusA",phi_clus_time[i][j]);
431 fill(
"CscSegmMonitor", phiTimeGoodClusA);
432 }
433 }
434
435 if(i==1){
436 auto etaQSumGoodClusC = Monitored::Scalar<float>("etaQSumGoodClusC",eta_clus_qsum[i][j]);
437 auto phiQSumGoodClusC = Monitored::Scalar<float>("phiQSumGoodClusC",phi_clus_qsum[i][j]);
438 fill(
"CscSegmMonitor", etaQSumGoodClusC, phiQSumGoodClusC);
439 if(std::abs(eta_clus_time[i][j]) <= 200){
440 auto etaTimeGoodClusC = Monitored::Scalar<float>("etaTimeGoodClusC",eta_clus_time[i][j]);
441 fill(
"CscSegmMonitor", etaTimeGoodClusC);
442 }
443
444 if(std::abs(phi_clus_time[i][j]) <= 200) {
445 auto phiTimeGoodClusC = Monitored::Scalar<float>("phiTimeGoodClusC",phi_clus_time[i][j]);
446 fill(
"CscSegmMonitor", phiTimeGoodClusC);
447 }
448 }
449 }
450 }
451
452 if(i==0) {
453 auto etaQSumTotA = Monitored::Scalar<float>("etaQSumTotA", eta_clus_qsum_tot);
454 auto phiQSumTotA = Monitored::Scalar<float>("phiQSumTotA", phi_clus_qsum_tot);
455 fill(
"CscSegmMonitor", etaQSumTotA, phiQSumTotA);
456 }
457
458 if(i==1) {
459 auto etaQSumTotC = Monitored::Scalar<float>("etaQSumTotC", eta_clus_qsum_tot);
460 auto phiQSumTotC = Monitored::Scalar<float>("phiQSumTotC", phi_clus_qsum_tot);
461 fill(
"CscSegmMonitor", etaQSumTotC, phiQSumTotC);
462 }
463 }
464 }
465 }
466 }
467
468 return StatusCode::SUCCESS;
469}
bool evtSelTriggersPassed() const
bool isCscSegment(const Muon::MuonSegment *seg) const
unsigned int cscHits(const Muon::MuonSegment *seg) const
Gaudi::Property< double > m_segmSlope
bool segmSlopeCut(const float csc_x, const float csc_ax, const float cut) const
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
SG::ReadHandleKeyArray< Trk::SegmentCollection > m_segmKey
DataModel_detail::const_iterator< DataVector > const_iterator
CscClusterStatus status() const
Returns Csc position measurement status flag.
virtual const CscPrepData * prepRawData() const override final
Returns the CscPrepData - is a CscPrepData in this scope.
double time() const
Returns the time.
int charge() const
Returns the charge.
const Trk::LocalDirection & localDirection() const
local direction
const Amg::Vector3D & globalDirection() const
global direction
virtual const Amg::Vector3D & globalPosition() const override final
global position
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
double angleYZ() const
access method for angle of local YZ projection
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
double chi2(TH1 *h0, TH1 *h1)
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.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
std::string toString(CscStripStatus cstat)
Return a string description of a CSC cluster status flag.
CscClusterStatus
Enum to represent the cluster status - see the specific enum values for more details.
@ CscStatusUnspoiled
Clean cluster with precision fit.
@ CscStatusSimple
Cluster with non-precision fit.
@ CscStatusSplitUnspoiled
Clean cluster with precision fit after split cluster.
unsigned int constexpr sideC
unsigned int constexpr sideA