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
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
3341using namespace std ;
3442
@@ -37,7 +45,6 @@ namespace o2::quality_control_modules::mft
3745
3846void 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
5262Quality 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
106116std::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+
108161void 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 ());
0 commit comments