77 bool copyFEval(
false);
78 AccumulatorArrays clusPerEventArray = {{{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}};
79 VecAccumulator2DMap Map_Of_Modules_Status(*
this,
"MapOfModulesStatus",
true);
81 VecAccumulator2DMap Map_Of_FEs_Status(*
this,
"MapOfFEsStatus");
90 if (pixlayer == 99)
continue;
112 clusPerEventArray.DA[phiMod][etaMod] = -1;
116 clusPerEventArray.DC[phiMod][etaMod] = -1;
120 clusPerEventArray.B0[phiMod][etaMod] = -1;
124 clusPerEventArray.B1[phiMod][etaMod] = -1;
128 clusPerEventArray.B2[phiMod][etaMod] = -1;
132 clusPerEventArray.IBL[phiMod][etaMod] = -1;
133 if (copyFEval) clusPerEventArray.IBL[phiMod][++etaMod] = -1;
138 Map_Of_Modules_Status.add(pixlayer, waferID,
index);
144 for (
int iFE = 0; iFE < nFE; iFE++) {
146 if (not pixelID.
is_valid())
continue;
153 if (is_good)
index = 0;
157 Map_Of_FEs_Status.add(pixlayer, waferID, iFE,
index);
166 for (
unsigned int ii = 0; ii <
PixLayers::COUNT; ii++) nBadAndDisabledMod[ii] = nBadMod[ii]+nDisabledMod[ii];
183 VecAccumulator2DMap TSOS_Outlier(*
this,
"TSOSOutlier");
184 VecAccumulator2DMap TSOS_Outlier_FE(*
this,
"TSOSOutlierFE");
185 VecAccumulator2DMap TSOS_Hole(*
this,
"TSOSHole");
186 VecAccumulator2DMap TSOS_Hole_FE(*
this,
"TSOSHoleFE");
187 VecAccumulator2DMap TSOS_Measurement(*
this,
"TSOSMeasurement");
188 VecAccumulator2DMap TSOS_Measurement_FE(*
this,
"TSOSMeasurementFE");
189 VecAccumulator2DMap HolesRatio(*
this,
"HolesRatio");
190 VecAccumulator2DMap MissIBLhit(*
this,
"MissIBLhit");
191 VecAccumulator2DMap MissIBLpresentBLhit(*
this,
"MissIBLpresentBLhit");
192 VecAccumulator2DMap MissHitsRatio(*
this,
"MissHitsRatio");
193 auto trackGroup =
getGroup(
"Track");
197 if (!(tracks.isValid())) {
200 fill(trackGroup, dataread_err);
201 return StatusCode::RECOVERABLE;
203 ATH_MSG_DEBUG(
"PixelMonitoring: Track container " << tracks.name() <<
" is found.");
206 int ntracksPerEvent = 0;
207 bool havePixelHits(
false);
208 std::vector<std::pair<Identifier, double> > ClusterIDs;
212 for (
auto track: *tracks) {
213 if (track ==
nullptr || track->perigeeParameters() ==
nullptr || track->trackSummary() ==
nullptr ||
215 ATH_MSG_DEBUG(
"PixelMonitoring: Track either invalid or it does not contain pixel hits, continuing...");
221 bool passJOTrkTightCut =
static_cast<bool>(
m_trackSelTool->accept(*track));
222 bool pass1hole1GeVptTightCut = (passJOTrkTightCut && (measPerigee->
pT() / 1000.0 > 1.0));
223 bool pass1hole5GeVptTightCut = (passJOTrkTightCut && (measPerigee->
pT() / 1000.0 > 5.0));
225 if(measPerigee->
pT()<1000.)
continue;
228 std::unique_ptr<const Trk::Track> trackWithHolesUnique =
nullptr;
231 trackWithHoles = trackWithHolesUnique.get();
234 for (
auto trackStateOnSurface: *trackStates) {
242 if (mesBase && !RIOOnTrack)
continue;
254 ATH_MSG_INFO(
"PixelMonitoring: pointer of TSOS to track parameters or associated surface is null");
258 if (!
m_atlasid->is_pixel(surfaceID))
continue;
260 if (pixlayer == 99)
continue;
274 if ( mesBase && siclus) {
277 ATH_MSG_INFO(
"Pixel Monitoring: got invalid track local position on surface for an outlier.");
280 TSOS_Outlier.add(pixlayer, locPosID, 1.0);
282 TSOS_Outlier_FE.add(pixlayer, locPosID,
m_pixelReadout->getFE(locPosID, locPosID), 1.0);
291 ATH_MSG_INFO(
"Pixel Monitoring: got invalid track local position on surface for a hole.");
294 TSOS_Hole.add(pixlayer, locPosID, 1.0);
296 TSOS_Hole_FE.add(pixlayer, locPosID,
m_pixelReadout->getFE(locPosID, locPosID), 1.0);
301 if (not mesBase)
continue;
305 if (!side || !clus)
continue;
313 ATH_MSG_INFO(
"Pixel Monitoring: got invalid cluster on track ID.");
316 TSOS_Measurement.add(pixlayer, locPosID, 1.0);
318 TSOS_Measurement_FE.add(pixlayer, locPosID,
m_pixelReadout->getFE(locPosID, locPosID), 1.0);
327 const AmgSymMatrix(5) trackErrMat = (*trackAtPlane->covariance());
333 fill(trackGroup, resPhi);
334 if (error_sum != 0) {
336 fill(trackGroup, pullPhi);
341 fill(trackGroup, resEta);
342 if (error_sum != 0) {
344 fill(trackGroup, pullEta);
351 double trknormcomp = mytrack.dot(mynormal);
353 double mytrack_mag = mytrack.mag();
354 double cosalpha = 0.;
355 if (mytrack_mag != 0) cosalpha = std::abs(trknormcomp / mytrack_mag);
356 ClusterIDs.emplace_back(clus->
identify(), cosalpha);
361 if (pass1hole5GeVptTightCut) {
368 if (pass1hole1GeVptTightCut && locPosID.
is_valid()) {
369 HolesRatio.add(pixlayer, locPosID, nHole);
370 MissHitsRatio.add(pixlayer, locPosID, nOutlier + nHole);
378 int nIBLHits=0, nBLHits=0;
384 if(expectIBLHit && nIBLHits==0 && pass1hole1GeVptTightCut){
385 std::vector<InDet::TrackStateOnPixelLayerInfo> trackStateIBLlayer;
386 if(
m_testPixelLayerTool->getTrackStateOnInnermostPixelLayerInfo(measPerigee, trackStateIBLlayer)){
388 for (
auto &tstate : trackStateIBLlayer){
390 if(posid==posid_prev)
continue;
394 fill(trackGroup,etanoibl,phinoibl,missibl);
398 }
else if(expectIBLHit && pass1hole1GeVptTightCut)
fill(trackGroup,etanoibl,phinoibl,missibl);
403 fill(trackGroup, lbval, nph, nphwgt);
405 int trkfitndf = track->fitQuality()->numberDoF();
406 double trkfitchi2 = track->fitQuality()->chiSquared();
407 if (trkfitndf != 0) {
409 fill(trackGroup, trkChiN);
411 havePixelHits = havePixelHits || (nPixelHits > 0);
414 if (!havePixelHits) {
416 fill(trackGroup, dataread_err);
432 sort(ClusterIDs.begin(), ClusterIDs.end(),
433 [](
const std::pair<Identifier, double>& left,
const std::pair<Identifier, double>& right) {
434 return left.first < right.first;
438 fill(trackGroup, lbval, nTrks);
453 VecAccumulator2DMap Cluster_LVL1A_Mod(*
this,
"ClusterLVL1AMod");
454 VecAccumulator2DMap Cluster_LVL1A_SizeCut(*
this,
"ClusterLVL1ASizeCut");
455 VecAccumulator2DMap Cluster_LVL1A_Mod_OnTrack(*
this,
"ClusterLVL1AModOnTrack");
456 VecAccumulator2DMap Cluster_LVL1A_SizeCut_OnTrack(*
this,
"ClusterLVL1ASizeCutOnTrack");
457 VecAccumulator2DMap ClusterMap_Mon(*
this,
"ClusterMapMon");
458 VecAccumulator2DMap ClusterMap_Mon_OnTrack(*
this,
"ClusterMapMonOnTrack");
459 VecAccumulator2DMap Cluster_Size_Map_OnTrack(*
this,
"ClusterSizeMapOnTrack");
460 VecAccumulator2DMap Cluster_Occupancy(*
this,
"ClusterOccupancy");
461 VecAccumulator2DMap Cluster_Occupancy_OnTrack(*
this,
"ClusterOccupancyOnTrack");
462 VecAccumulator2DMap Clus_Occ_SizeCut(*
this,
"ClusOccSizeCut");
463 VecAccumulator2DMap Clus_Occ_SizeCut_OnTrack(*
this,
"ClusOccSizeCutOnTrack");
464 VecAccumulator2DMap Cluster_FE_Occupancy(*
this,
"ClusterFEOccupancy");
465 VecAccumulator2DMap Cluster_FE_Occupancy_OnTrack(*
this,
"ClusterFEOccupancyOnTrack");
467 auto clusterGroup =
getGroup(
"Cluster");
468 auto clusterGroup_OnTrack =
getGroup(
"Cluster_OnTrack");
472 if (!(pixel_clcontainer.isValid())) {
475 fill(clusterGroup, dataread_err);
476 return StatusCode::RECOVERABLE;
478 ATH_MSG_DEBUG(
"Pixel Monitoring: Pixel Cluster container " << pixel_clcontainer.name() <<
" is found.");
482 int nclusters_ontrack = 0;
491 for (
auto colNext: *pixel_clcontainer) {
492 const InDet::PixelClusterCollection* ClusterCollection(colNext);
493 if (!ClusterCollection) {
494 ATH_MSG_DEBUG(
"Pixel Monitoring: Pixel Cluster container is empty.");
496 fill(clusterGroup, dataread_err);
500 for (
auto p_clus: *ClusterCollection) {
501 clusID = p_clus->identify();
503 if (pixlayer == 99)
continue;
512 fill(clusterGroup, clLVL1A);
513 Cluster_LVL1A_Mod.add(pixlayer, clusID, cluster.
LVL1A() + 0.00001);
514 if (cluster.
rdoList().size() > 1) Cluster_LVL1A_SizeCut.add(pixlayer, clusID, cluster.
LVL1A() + 0.00001);
518 nclusters_mod[iblsublayer]++;
521 nclusters_mod[pixlayer]++;
527 if (
m_doOnline) ClusterMap_Mon.add(pixlayer, clusID);
532 Cluster_Occupancy.add(pixlayer, clusID);
534 Cluster_FE_Occupancy.add(pixlayer, clusID,
m_pixelReadout->getFE(clusID, clusID), 1.0);
536 if (cluster.
rdoList().size() > 1) Clus_Occ_SizeCut.add(pixlayer, clusID);
544 clusPerEventArray.DA[phiMod][etaMod]++;
548 clusPerEventArray.DC[phiMod][etaMod]++;
552 clusPerEventArray.B0[phiMod][etaMod]++;
556 clusPerEventArray.B1[phiMod][etaMod]++;
560 clusPerEventArray.B2[phiMod][etaMod]++;
564 clusPerEventArray.IBL[phiMod][etaMod]++;
569 clLVL1A = cluster.
LVL1A();
570 fill(clusterGroup_OnTrack, clLVL1A);
571 Cluster_LVL1A_Mod_OnTrack.add(pixlayer, clusID, cluster.
LVL1A() + 0.00001);
572 if (cluster.
rdoList().size() > 1) Cluster_LVL1A_SizeCut_OnTrack.add(pixlayer, clusID,
573 cluster.
LVL1A() + 0.00001);
580 if (abs(
m_pixelid->barrel_ec(clusID)) != 0) clSizeEtaModule =
m_pixelid->layer_disk(clusID) + 1;
583 Cluster_Size_Map_OnTrack.add(pixlayer, clusID, cluster.
rdoList().size());
588 if (
m_doOnline) ClusterMap_Mon_OnTrack.add(pixlayer, clusID);
593 Cluster_Occupancy_OnTrack.add(pixlayer, clusID);
595 Cluster_FE_Occupancy_OnTrack.add(pixlayer, clusID,
m_pixelReadout->getFE(clusID, clusID), 1.0);
597 if (cluster.
rdoList().size() > 1) Clus_Occ_SizeCut_OnTrack.add(pixlayer, clusID);
615 nclusters_ontrack_mod[pixlayer]++;
641 fill(clusterGroup, lbval, nCls);
643 fill(clusterGroup_OnTrack, lbval, nClsOnTrk);
652 fill(clusterGroup_OnTrack, lbval, clsFracOnTrack);
655 fill(clusterGroup, dataread_err);
663 if (ntracksPerEvent > 0) {
664 for (
unsigned int ii = 0; ii <
PixLayers::COUNT; ii++) nclusters_ontrack_mod[ii] /= ntracksPerEvent;
675 return StatusCode::SUCCESS;