Skip to content

Commit

Permalink
[ITS] Anomalous clusters plots (#2482)
Browse files Browse the repository at this point in the history
* ITS - Anomalous clusters plots

* ITS - Anomalous clusters plots

* fix typo in axis title

* minor

* Fix MacOS build errors

* MacOS build failure: defininig constexpr arrays
  • Loading branch information
nicolovalle authored Nov 28, 2024
1 parent ca0a424 commit 2603c31
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 17 deletions.
23 changes: 15 additions & 8 deletions Modules/ITS/include/ITS/ITSClusterTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,15 @@ class ITSClusterTask : public TaskInterface
std::shared_ptr<TH2DRatio> hAverageClusterOccupancySummaryOB[NLayer];
std::shared_ptr<TH2DRatio> hAverageClusterSizeSummaryOB[NLayer];

// Layer synnary
// Layer summary
TH1D* hClusterSizeLayerSummary[NLayer] = { nullptr };
TH1D* hClusterTopologyLayerSummary[NLayer] = { nullptr };
TH1D* hGroupedClusterSizeLayerSummary[NLayer] = { nullptr };

// Anomalies plots
TH2D* hLongClustersPerChip[3] = { nullptr };
TH2D* hMultPerChipWhenLongClusters[3] = { nullptr };

// General
TH2D* hClusterVsBunchCrossing = nullptr;
std::unique_ptr<TH2DRatio> mGeneralOccupancy = nullptr;
Expand Down Expand Up @@ -133,13 +137,16 @@ class ITSClusterTask : public TaskInterface
std::string mLaneStatusFlag[NFlags] = { "IB", "ML", "OL", "Total" };
int mDoPublishDetailedSummary = 0;

const int mNStaves[NLayer] = { 12, 16, 20, 24, 30, 42, 48 };
const int mNHicPerStave[NLayer] = { 1, 1, 1, 8, 8, 14, 14 };
const int mNChipsPerHic[NLayer] = { 9, 9, 9, 14, 14, 14, 14 };
const int mNLanePerHic[NLayer] = { 3, 3, 3, 2, 2, 2, 2 };
const int ChipBoundary[NLayer + 1] = { 0, 108, 252, 432, 3120, 6480, 14712, 24120 };
const int StaveBoundary[NLayer + 1] = { 0, 12, 28, 48, 72, 102, 144, 192 };
const float mLength[NLayer] = { 14., 14., 14., 43., 43., 74., 74. };
int minColSpanLongCluster = 128; // driven by o2::itsmft::ClusterPattern::MaxColSpan = 128
int maxRowSpanLongCluster = 29;

static constexpr int mNStaves[NLayer] = { 12, 16, 20, 24, 30, 42, 48 };
static constexpr int mNHicPerStave[NLayer] = { 1, 1, 1, 8, 8, 14, 14 };
static constexpr int mNChipsPerHic[NLayer] = { 9, 9, 9, 14, 14, 14, 14 };
static constexpr int mNLanePerHic[NLayer] = { 3, 3, 3, 2, 2, 2, 2 };
static constexpr int ChipBoundary[NLayer + 1] = { 0, 108, 252, 432, 3120, 6480, 14712, 24120 };
static constexpr int StaveBoundary[NLayer + 1] = { 0, 12, 28, 48, 72, 102, 144, 192 };
static constexpr float mLength[NLayer] = { 14., 14., 14., 43., 43., 74., 74. };
const std::string mYlabels[NLayer * 2] = { "L6B(S24#rightarrow47)", "L5B(S21#rightarrow41)", "L4B(S15#rightarrow29)", "L3B(S12#rightarrow23)", "L2B(S10#rightarrow19)", "L1B(S08#rightarrow15)", "L0B(S06#rightarrow11)", "L0T(S00#rightarrow05)", "L1T(S00#rightarrow07)", "L2T(S00#rightarrow09)", "L3T(S00#rightarrow11)", "L4T(S00#rightarrow14)", "L5T(S00#rightarrow20)", "L6T(S00#rightarrow23)" };

int mEnableLayers[NLayer] = { 0 };
Expand Down
71 changes: 62 additions & 9 deletions Modules/ITS/src/ITSClusterTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ ITSClusterTask::~ITSClusterTask()
if (!mEnableLayers[iLayer])
continue;

if (iLayer < NLayerIB) {
delete hLongClustersPerChip[iLayer];
delete hMultPerChipWhenLongClusters[iLayer];
}
delete hClusterSizeLayerSummary[iLayer];
delete hClusterTopologyLayerSummary[iLayer];
delete hGroupedClusterSizeLayerSummary[iLayer];
Expand Down Expand Up @@ -137,8 +141,6 @@ void ITSClusterTask::monitorData(o2::framework::ProcessingContext& ctx)
auto clusPatternArr = ctx.inputs().get<gsl::span<unsigned char>>("patterns");
auto pattIt = clusPatternArr.begin();

int ChipIDprev = -1;

// Reset this histo to have the latest picture
hEmptyLaneFractionGlobal->Reset("ICES");

Expand All @@ -153,34 +155,46 @@ void ITSClusterTask::monitorData(o2::framework::ProcessingContext& ctx)
const auto& ROF = clusRofArr[iROF];
const auto bcdata = ROF.getBCData();
int nClustersForBunchCrossing = 0;
int nLongClusters[ChipBoundary[NLayerIB]] = {};
int nHitsFromClusters[ChipBoundary[NLayerIB]] = {}; // only IB is implemented at the moment

for (int icl = ROF.getFirstEntry(); icl < ROF.getFirstEntry() + ROF.getNEntries(); icl++) {

auto& cluster = clusArr[icl];
auto ChipID = cluster.getSensorID();
int ClusterID = cluster.getPatternID(); // used for normal (frequent) cluster shapes
int lay, sta, ssta, mod, chip, lane;

if (ChipID != ChipIDprev) {
mGeom->getChipId(ChipID, lay, sta, ssta, mod, chip);
mod = mod + (ssta * (mNHicPerStave[lay] / 2));
int chipIdLocal = (ChipID - ChipBoundary[lay]) % (14 * mNHicPerStave[lay]);
lane = (chipIdLocal % (14 * mNHicPerStave[lay])) / (14 / 2);
}
// TODO: avoid call Geom if ChipID is the same as previous cluster
mGeom->getChipId(ChipID, lay, sta, ssta, mod, chip);
mod = mod + (ssta * (mNHicPerStave[lay] / 2));
int chipIdLocal = (ChipID - ChipBoundary[lay]) % (14 * mNHicPerStave[lay]);
lane = (chipIdLocal % (14 * mNHicPerStave[lay])) / (14 / 2);

int npix = -1;
int colspan = -1;
int rowspan = -1;
int isGrouped = -1;

o2::math_utils::Point3D<float> locC; // local coordinates

if (ClusterID != o2::itsmft::CompCluster::InvalidPatternID) { // Normal (frequent) cluster shapes
if (!mDict->isGroup(ClusterID)) {
npix = mDict->getNpixels(ClusterID);

// TODO: is there way other than calling the pattern?
colspan = mDict->getPattern(ClusterID).getColumnSpan();
rowspan = mDict->getPattern(ClusterID).getRowSpan();

if (mDoPublishDetailedSummary == 1) {
locC = mDict->getClusterCoordinates(cluster);
}
isGrouped = 0;
} else {
o2::itsmft::ClusterPattern patt(pattIt);
npix = patt.getNPixels();
colspan = patt.getColumnSpan();
rowspan = patt.getRowSpan();
if (mDoPublishDetailedSummary == 1) {
locC = mDict->getClusterCoordinates(cluster, patt, true);
}
Expand All @@ -190,6 +204,8 @@ void ITSClusterTask::monitorData(o2::framework::ProcessingContext& ctx)
} else { // invalid pattern
o2::itsmft::ClusterPattern patt(pattIt);
npix = patt.getNPixels();
colspan = patt.getColumnSpan();
rowspan = patt.getRowSpan();
isGrouped = 0;
if (mDoPublishDetailedSummary == 1) {
locC = mDict->getClusterCoordinates(cluster, patt, false);
Expand All @@ -200,6 +216,15 @@ void ITSClusterTask::monitorData(o2::framework::ProcessingContext& ctx)
nClustersForBunchCrossing++;
}

if (lay < NLayerIB) {
nHitsFromClusters[ChipID] += npix;
}

if (lay < NLayerIB && colspan >= minColSpanLongCluster && rowspan <= maxRowSpanLongCluster) {
// definition of long cluster
nLongClusters[ChipID]++;
}

if (lay < NLayerIB) {
hAverageClusterOccupancySummaryIB[lay]->getNum()->Fill(chip, sta);
hAverageClusterSizeSummaryIB[lay]->getNum()->Fill(chip, sta, (double)npix);
Expand Down Expand Up @@ -249,6 +274,21 @@ void ITSClusterTask::monitorData(o2::framework::ProcessingContext& ctx)
}
}
hClusterVsBunchCrossing->Fill(bcdata.bc, nClustersForBunchCrossing); // we count only the number of clusters, not their sizes

// filling these anomaly plots once per ROF, ignoring chips w/o long clusters
for (int ichip = 0; ichip < ChipBoundary[NLayerIB]; ichip++) {

int nLong = TMath::Min(nLongClusters[ichip], 21);
if (nLong < 1) {
continue;
}
int ilayer = -1;
while (ichip >= ChipBoundary[ilayer + 1]) {
ilayer++;
}
hLongClustersPerChip[ilayer]->Fill(ichip, nLong);
hMultPerChipWhenLongClusters[ilayer]->Fill(ichip, nHitsFromClusters[ichip]);
}
}

if ((int)clusRofArr.size() > 0) {
Expand Down Expand Up @@ -364,6 +404,8 @@ void ITSClusterTask::reset()
hClusterTopologyLayerSummary[iLayer]->Reset();

if (iLayer < NLayerIB) {
hLongClustersPerChip[iLayer]->Reset();
hMultPerChipWhenLongClusters[iLayer]->Reset();
hAverageClusterOccupancySummaryIB[iLayer]->Reset();
hAverageClusterSizeSummaryIB[iLayer]->Reset();
if (mDoPublish1DSummary == 1) {
Expand Down Expand Up @@ -396,7 +438,7 @@ void ITSClusterTask::reset()

void ITSClusterTask::createAllHistos()
{
hClusterVsBunchCrossing = new TH2D("BunchCrossingIDvsClusters", "BunchCrossingIDvsClusters", nBCbins, 0, 4095, 100, 0, 1000);
hClusterVsBunchCrossing = new TH2D("BunchCrossingIDvsClusters", "BunchCrossingIDvsClusters", nBCbins, 0, 4095, 100, 0, 2000);
hClusterVsBunchCrossing->SetTitle("#clusters vs BC id for clusters with npix > 2");
addObject(hClusterVsBunchCrossing);
formatAxes(hClusterVsBunchCrossing, "Bunch Crossing ID", "Number of clusters with npix > 2 in ROF", 1, 1.10);
Expand All @@ -419,6 +461,17 @@ void ITSClusterTask::createAllHistos()
if (!mEnableLayers[iLayer])
continue;

if (iLayer < NLayerIB) {
hLongClustersPerChip[iLayer] = new TH2D(Form("Anomalies/Layer%d/LongClusters", iLayer), Form("Layer%d/LongClusters", iLayer), ChipBoundary[iLayer + 1] - ChipBoundary[iLayer], ChipBoundary[iLayer], ChipBoundary[iLayer + 1], 21, 0, 21);
hMultPerChipWhenLongClusters[iLayer] = new TH2D(Form("Anomalies/Layer%d/HitsWhenLongClusters", iLayer), Form("Layer%d/HitsWhenLongClusters", iLayer), ChipBoundary[iLayer + 1] - ChipBoundary[iLayer], ChipBoundary[iLayer], ChipBoundary[iLayer + 1], 200, 0, 20000);
addObject(hLongClustersPerChip[iLayer]);
formatAxes(hLongClustersPerChip[iLayer], "Chip ID", "number of long clusters", 1, 1.10);
hLongClustersPerChip[iLayer]->SetStats(0);
addObject(hMultPerChipWhenLongClusters[iLayer]);
formatAxes(hMultPerChipWhenLongClusters[iLayer], "Chip ID", "Sum of clusters size (events w/ long clus)", 1, 1.10);
hMultPerChipWhenLongClusters[iLayer]->SetStats(0);
}

hClusterSizeLayerSummary[iLayer] = new TH1D(Form("Layer%d/AverageClusterSizeSummary", iLayer), Form("Layer%dAverageClusterSizeSummary", iLayer), 100, 0, 100);
hClusterSizeLayerSummary[iLayer]->SetTitle(Form("Cluster size summary for Layer %d", iLayer));
addObject(hClusterSizeLayerSummary[iLayer]);
Expand Down

0 comments on commit 2603c31

Please sign in to comment.