Skip to content

Commit 1edc2a9

Browse files
authored
MFT: digit task edit to display dead chips (#1891)
1 parent cab9961 commit 1edc2a9

5 files changed

Lines changed: 118 additions & 9 deletions

File tree

Modules/MFT/include/MFT/QcMFTDigitCheck.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,27 @@ class QcMFTDigitCheck : public o2::quality_control::checker::CheckInterface
4545
int mZoneThresholdMedium;
4646
int mZoneThresholdBad;
4747

48+
// masked chips part
49+
bool mFirstCall;
50+
std::vector<int> mMaskedChips;
51+
std::vector<string> mChipMapName;
52+
53+
void readMaskedChips();
54+
void createMaskedChipsNames();
55+
56+
// to form the name of the masked chips histograms
57+
int mHalf[936] = { 0 };
58+
int mDisk[936] = { 0 };
59+
int mFace[936] = { 0 };
60+
int mZone[936] = { 0 };
61+
int mSensor[936] = { 0 };
62+
int mTransID[936] = { 0 };
63+
int mLayer[936] = { 0 };
64+
int mLadder[936] = { 0 };
65+
float mX[936] = { 0 };
66+
float mY[936] = { 0 };
67+
void getChipMapData();
68+
4869
ClassDefOverride(QcMFTDigitCheck, 2);
4970
};
5071

Modules/MFT/include/MFT/QcMFTDigitTask.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ class QcMFTDigitTask final : public TaskInterface
9696
std::unique_ptr<TH2F> mDigitDoubleColumnSensorIndices = nullptr;
9797

9898
std::unique_ptr<TH1F> mDigitsROFSize = nullptr;
99-
std::unique_ptr<TH1F> mNOfDigitsTime = nullptr;
10099
std::unique_ptr<TH1F> mDigitsBC = nullptr;
101100

102101
std::vector<std::unique_ptr<TH2F>> mDigitChipOccupancyMap;

Modules/MFT/mft-digits.json

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,27 @@
6060
"dataSource" : [ {
6161
"type" : "Task",
6262
"name" : "Digits",
63-
"MOs" : ["mDigitChipOccupancy","mDigitOccupancySummary","mDigitChipStdDev"]
63+
"MOs" : ["ChipOccupancyMaps/Half_0/Disk_0/Face_1/mDigitChipOccupancyMap",
64+
"ChipOccupancyMaps/Half_0/Disk_0/Face_0/mDigitChipOccupancyMap",
65+
"ChipOccupancyMaps/Half_0/Disk_1/Face_1/mDigitChipOccupancyMap",
66+
"ChipOccupancyMaps/Half_0/Disk_1/Face_0/mDigitChipOccupancyMap",
67+
"ChipOccupancyMaps/Half_0/Disk_2/Face_1/mDigitChipOccupancyMap",
68+
"ChipOccupancyMaps/Half_0/Disk_2/Face_0/mDigitChipOccupancyMap",
69+
"ChipOccupancyMaps/Half_0/Disk_3/Face_1/mDigitChipOccupancyMap",
70+
"ChipOccupancyMaps/Half_0/Disk_3/Face_0/mDigitChipOccupancyMap",
71+
"ChipOccupancyMaps/Half_0/Disk_4/Face_1/mDigitChipOccupancyMap",
72+
"ChipOccupancyMaps/Half_0/Disk_4/Face_0/mDigitChipOccupancyMap",
73+
"ChipOccupancyMaps/Half_1/Disk_0/Face_1/mDigitChipOccupancyMap",
74+
"ChipOccupancyMaps/Half_1/Disk_0/Face_0/mDigitChipOccupancyMap",
75+
"ChipOccupancyMaps/Half_1/Disk_1/Face_1/mDigitChipOccupancyMap",
76+
"ChipOccupancyMaps/Half_1/Disk_1/Face_0/mDigitChipOccupancyMap",
77+
"ChipOccupancyMaps/Half_1/Disk_2/Face_1/mDigitChipOccupancyMap",
78+
"ChipOccupancyMaps/Half_1/Disk_2/Face_0/mDigitChipOccupancyMap",
79+
"ChipOccupancyMaps/Half_1/Disk_3/Face_1/mDigitChipOccupancyMap",
80+
"ChipOccupancyMaps/Half_1/Disk_3/Face_0/mDigitChipOccupancyMap",
81+
"ChipOccupancyMaps/Half_1/Disk_4/Face_1/mDigitChipOccupancyMap",
82+
"ChipOccupancyMaps/Half_1/Disk_4/Face_0/mDigitChipOccupancyMap",
83+
"mDigitChipOccupancy","mDigitOccupancySummary","mDigitChipStdDev"]
6484
} ]
6585
}
6686
}

Modules/MFT/src/QcMFTDigitCheck.cxx

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
/// \author Katarina Krizkova Gajdosova
1717
/// \author Diana Maria Krupova
1818

19+
// C++
20+
#include <string>
1921
// Fair
2022
#include <fairlogger/Logger.h>
2123
// ROOT
@@ -24,11 +26,17 @@
2426
#include <TLatex.h>
2527
#include <TList.h>
2628
#include <TPaveText.h>
29+
// O2
30+
#include <DataFormatsITSMFT/NoiseMap.h>
31+
#include "CCDB/CcdbApi.h"
32+
#include <ITSMFTReconstruction/ChipMappingMFT.h>
33+
2734
// Quality Control
2835
#include "MFT/QcMFTDigitCheck.h"
2936
#include "QualityControl/MonitorObject.h"
3037
#include "QualityControl/Quality.h"
3138
#include "QualityControl/QcInfoLogger.h"
39+
#include "MFT/QcMFTUtilTables.h"
3240

3341
using namespace std;
3442

@@ -37,7 +45,6 @@ namespace o2::quality_control_modules::mft
3745

3846
void QcMFTDigitCheck::configure()
3947
{
40-
4148
// this is how to get access to custom parameters defined in the config file at qc.tasks.<task_name>.taskParameters
4249
if (auto param = mCustomParameters.find("ZoneThresholdMedium"); param != mCustomParameters.end()) {
4350
ILOG(Info, Support) << "Custom parameter - ZoneThresholdMedium: " << param->second << ENDM;
@@ -47,6 +54,9 @@ void QcMFTDigitCheck::configure()
4754
ILOG(Info, Support) << "Custom parameter - ZoneThresholdBad: " << param->second << ENDM;
4855
mZoneThresholdBad = stoi(param->second);
4956
}
57+
58+
// no call to beautifier yet
59+
mFirstCall = true;
5060
}
5161

5262
Quality QcMFTDigitCheck::check(std::map<std::string, std::shared_ptr<MonitorObject>>* moMap)
@@ -105,8 +115,73 @@ Quality QcMFTDigitCheck::check(std::map<std::string, std::shared_ptr<MonitorObje
105115

106116
std::string QcMFTDigitCheck::getAcceptedType() { return "TH1"; }
107117

118+
void QcMFTDigitCheck::readMaskedChips()
119+
{
120+
o2::ccdb::CcdbApi api;
121+
api.init("alice-ccdb.cern.ch");
122+
long timestamp = -1;
123+
map<string, string> headers;
124+
map<std::string, std::string> filter;
125+
auto calib = api.retrieveFromTFileAny<o2::itsmft::NoiseMap>("MFT/Calib/DeadMap/", filter, timestamp, &headers);
126+
for (int i = 0; i < calib->size(); i++) {
127+
if (calib->isFullChipMasked(i)) {
128+
mMaskedChips.push_back(i);
129+
}
130+
}
131+
}
132+
133+
void QcMFTDigitCheck::getChipMapData()
134+
{
135+
const o2::itsmft::ChipMappingMFT mapMFT;
136+
auto chipMapData = mapMFT.getChipMappingData();
137+
QcMFTUtilTables MFTTable;
138+
139+
for (int i = 0; i < 936; i++) {
140+
mHalf[i] = chipMapData[i].half;
141+
mDisk[i] = chipMapData[i].disk;
142+
mLayer[i] = chipMapData[i].layer;
143+
mFace[i] = mLayer[i] % 2;
144+
mZone[i] = chipMapData[i].zone;
145+
mSensor[i] = chipMapData[i].localChipSWID;
146+
mTransID[i] = chipMapData[i].cable;
147+
mLadder[i] = MFTTable.mLadder[i];
148+
mX[i] = MFTTable.mX[i];
149+
mY[i] = MFTTable.mY[i];
150+
}
151+
}
152+
153+
void QcMFTDigitCheck::createMaskedChipsNames()
154+
{
155+
for (int i = 0; i < mMaskedChips.size(); i++) {
156+
mChipMapName.push_back(Form("ChipOccupancyMaps/Half_%d/Disk_%d/Face_%d/mDigitChipOccupancyMap",
157+
mHalf[mMaskedChips[i]], mDisk[mMaskedChips[i]], mFace[mMaskedChips[i]]));
158+
}
159+
}
160+
108161
void QcMFTDigitCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkResult)
109162
{
163+
// set up masking of dead chips once
164+
if (mFirstCall) {
165+
mFirstCall = false;
166+
readMaskedChips();
167+
getChipMapData();
168+
createMaskedChipsNames();
169+
}
170+
// print skull in maps to display dead chips
171+
int nMaskedChips = mMaskedChips.size();
172+
for (int i = 0; i < nMaskedChips; i++) {
173+
if (mo->getName().find(mChipMapName[i]) != std::string::npos) {
174+
auto* hMap = dynamic_cast<TH2F*>(mo->getObject());
175+
int binCx = hMap->GetXaxis()->FindBin(mX[mMaskedChips[i]]);
176+
int binCy = hMap->GetYaxis()->FindBin(mY[mMaskedChips[i]]);
177+
// the -0.5 is a shift to centre better the skulls
178+
TLatex* tl = new TLatex(hMap->GetXaxis()->GetBinCenter(binCx) - 0.5, hMap->GetYaxis()->GetBinCenter(binCy), "N");
179+
tl->SetTextFont(142);
180+
tl->SetTextSize(0.08);
181+
hMap->GetListOfFunctions()->Add(tl);
182+
tl->Draw();
183+
}
184+
}
110185

111186
if (mo->getName().find("mDigitOccupancySummary") != std::string::npos) {
112187
auto* hOccupancySummary = dynamic_cast<TH2F*>(mo->getObject());

Modules/MFT/src/QcMFTDigitTask.cxx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,6 @@ void QcMFTDigitTask::initialize(o2::framework::InitContext& /*ctx*/)
158158
getObjectsManager()->startPublishing(mDigitsROFSize.get());
159159
getObjectsManager()->setDisplayHint(mDigitsROFSize.get(), "logx logy");
160160

161-
mNOfDigitsTime = std::make_unique<TH1F>("mNOfDigitsTime", "Number of Digits per time bin; time (s); # entries", NofTimeBins, 0, maxDuration);
162-
mNOfDigitsTime->SetMinimum(0.1);
163-
getObjectsManager()->startPublishing(mNOfDigitsTime.get());
164-
165161
mDigitsBC = std::make_unique<TH1F>("mDigitsBC", "Digits per BC; BCid; # entries", o2::constants::lhc::LHCMaxBunches, 0, o2::constants::lhc::LHCMaxBunches);
166162
mDigitsBC->SetMinimum(0.1);
167163
getObjectsManager()->startPublishing(mDigitsBC.get());
@@ -264,7 +260,6 @@ void QcMFTDigitTask::monitorData(o2::framework::ProcessingContext& ctx)
264260
for (const auto& rof : rofs) {
265261
mDigitsROFSize->Fill(rof.getNEntries());
266262
float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9;
267-
mNOfDigitsTime->Fill(seconds, rof.getNEntries());
268263
mDigitsBC->Fill(rof.getBCData().bc, rof.getNEntries());
269264
}
270265

@@ -324,7 +319,6 @@ void QcMFTDigitTask::reset()
324319
mDigitChipStdDev->Reset();
325320
mDigitOccupancySummary->Reset();
326321
mDigitsROFSize->Reset();
327-
mNOfDigitsTime->Reset();
328322
mDigitsBC->Reset();
329323

330324
// maps

0 commit comments

Comments
 (0)