Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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