1212// / \file BasicDigitQcTask.cxx
1313// / \author Tomas Herman
1414// / \author Guillermo Contreras
15+ // / \author Katarina Krizkova Gajdosova
1516// /
1617
1718// ROOT
1819#include < TCanvas.h>
1920#include < TH1.h>
21+ #include < TH2.h>
2022// O2
2123#include < DataFormatsITSMFT/Digit.h>
2224#include < Framework/InputRecord.h>
2325// Quality Control
2426#include " QualityControl/QcInfoLogger.h"
2527#include " MFT/BasicDigitQcTask.h"
28+ // C++
29+ #include < fstream>
2630
2731namespace o2 ::quality_control_modules::mft
2832{
@@ -39,19 +43,78 @@ void BasicDigitQcTask::initialize(o2::framework::InitContext& /*ctx*/)
3943 ILOG (Info, Support) << " initialize BasicDigitQcTask" << ENDM ; // QcInfoLogger is used. FairMQ logs will go to there as well.
4044
4145 // this is how to get access to custom parameters defined in the config file at qc.tasks.<task_name>.taskParameters
42- if (auto param = mCustomParameters .find (" myOwnKey " ); param != mCustomParameters .end ()) {
46+ if (auto param = mCustomParameters .find (" FLP " ); param != mCustomParameters .end ()) {
4347 ILOG (Info, Support) << " Custom parameter - myOwnKey: " << param->second << ENDM ;
48+ FLP = stoi (param->second );
49+ minChipID = (FLP - 1 ) * nchip / 4 ;
50+ maxChipID = FLP * nchip / 4 ;
4451 }
4552
46- mMFT_chip_index_H = std::make_unique<TH1F >(" mMFT_chip_index_H" , " mMFT_chip_index_H" , 936 , -0.5 , 935.5 );
53+ // -------------------
54+ mMFT_chip_index_H = std::make_unique<TH1F >(" ChipHitMaps/mMFT_chip_index_H" , " mMFT_chip_index_H" , 936 , -0.5 , 935.5 );
4755 getObjectsManager ()->startPublishing (mMFT_chip_index_H .get ());
4856 getObjectsManager ()->addMetadata (mMFT_chip_index_H ->GetName (), " custom" , " 34" );
57+
58+ mMFT_chip_std_dev_H = std::make_unique<TH1F >(" ChipHitMaps/mMFT_chip_std_dev_H" , " mMFT_chip_std_dev_H" , 936 , -0.5 , 935.5 );
59+ getObjectsManager ()->startPublishing (mMFT_chip_std_dev_H .get ());
60+ getObjectsManager ()->addMetadata (mMFT_chip_std_dev_H ->GetName (), " custom" , " 34" );
61+
62+ // ==============================================
63+ // chip hit maps
64+ readTable ();
65+ for (int iHitMap = 0 ; iHitMap < nhitmaps; iHitMap++) {
66+ // generate folder and histogram name using the mapping table
67+ TString FolderName = " " ;
68+ TString HistogramName = " " ;
69+ getChipName (FolderName, HistogramName, iHitMap);
70+
71+ auto chiphitmap = std::make_unique<TH2F >(
72+ FolderName, HistogramName,
73+ binsChipHitMaps[iHitMap][0 ], binsChipHitMaps[iHitMap][1 ], binsChipHitMaps[iHitMap][2 ],
74+ binsChipHitMaps[iHitMap][3 ], binsChipHitMaps[iHitMap][4 ], binsChipHitMaps[iHitMap][5 ]);
75+ chiphitmap->SetStats (0 );
76+ mMFTChipHitMap .push_back (std::move (chiphitmap));
77+ getObjectsManager ()->startPublishing (mMFTChipHitMap [iHitMap].get ());
78+ getObjectsManager ()->addMetadata (mMFTChipHitMap [iHitMap]->GetName (), " custom" , " 34" );
79+ }
80+
81+ // ==============================================
82+ // pixel hit maps
83+ for (int iChipID = 0 ; iChipID < nchip; iChipID++) {
84+ // generate folder and histogram name using the mapping table
85+ TString FolderName = " " ;
86+ TString HistogramName = " " ;
87+ getPixelName (FolderName, HistogramName, iChipID);
88+
89+ // create pixel hit map
90+ auto pxlhitmap = std::make_unique<TH2F >(
91+ FolderName, HistogramName,
92+ gPixelHitMapsMaxBinX / gPixelHitMapsBinWidth , gPixelHitMapsMinBin , gPixelHitMapsMaxBinX ,
93+ gPixelHitMapsMaxBinY / gPixelHitMapsBinWidth , gPixelHitMapsMinBin , gPixelHitMapsMaxBinY );
94+ pxlhitmap->SetStats (0 );
95+ mMFTPixelHitMap .push_back (std::move (pxlhitmap));
96+
97+ if ((iChipID >= minChipID) && (iChipID < maxChipID)) {
98+ getObjectsManager ()->startPublishing (mMFTPixelHitMap [iChipID].get ());
99+ getObjectsManager ()->addMetadata (mMFTPixelHitMap [iChipID]->GetName (), " custom" , " 34" );
100+ }
101+ }
49102}
50103
51104void BasicDigitQcTask::startOfActivity (Activity& /* activity*/ )
52105{
53106 ILOG (Info, Support) << " startOfActivity" << ENDM ;
107+
54108 mMFT_chip_index_H ->Reset ();
109+ mMFT_chip_std_dev_H ->Reset ();
110+
111+ for (int iHitMap = 0 ; iHitMap < nhitmaps; iHitMap++) {
112+ mMFTChipHitMap [iHitMap]->Reset ();
113+ }
114+
115+ for (int iChipID = 0 ; iChipID < nchip; iChipID++) {
116+ mMFTPixelHitMap [iChipID]->Reset ();
117+ }
55118}
56119
57120void BasicDigitQcTask::startOfCycle ()
@@ -65,9 +128,22 @@ void BasicDigitQcTask::monitorData(o2::framework::ProcessingContext& ctx)
65128 const auto digits = ctx.inputs ().get <gsl::span<o2::itsmft::Digit>>(" randomdigit" );
66129 if (digits.size () < 1 )
67130 return ;
131+
68132 // fill the histograms
69133 for (auto & one_digit : digits) {
70- mMFT_chip_index_H ->Fill (one_digit.getChipIndex ());
134+ int chipIndex = one_digit.getChipIndex ();
135+
136+ // fill pixel hit maps
137+ mMFTPixelHitMap [chipIndex]->Fill (one_digit.getColumn (), one_digit.getRow ());
138+ // fill number of entries and standard dev for all chips
139+ mMFT_chip_index_H ->SetBinContent (chipIndex, mMFTPixelHitMap [chipIndex]->GetEntries ());
140+ mMFT_chip_std_dev_H ->SetBinContent (chipIndex, mMFTPixelHitMap [chipIndex]->GetStdDev (1 ));
141+ }
142+
143+ // fill the chip hit maps
144+ for (int iChipID = 0 ; iChipID < nchip; iChipID++) {
145+ int nEntries = mMFTPixelHitMap [iChipID]->GetEntries ();
146+ mMFTChipHitMap [layer[iChipID] + half[iChipID] * 10 ]->SetBinContent (binx[iChipID], biny[iChipID], nEntries);
71147 }
72148}
73149
@@ -84,9 +160,78 @@ void BasicDigitQcTask::endOfActivity(Activity& /*activity*/)
84160void BasicDigitQcTask::reset ()
85161{
86162 // clean all the monitor objects here
87-
88163 ILOG (Info, Support) << " Resetting the histogram" << ENDM ;
164+
89165 mMFT_chip_index_H ->Reset ();
166+ mMFT_chip_std_dev_H ->Reset ();
167+
168+ for (int iHitMap = 0 ; iHitMap < nhitmaps; iHitMap++) {
169+ mMFTChipHitMap [iHitMap]->Reset ();
170+ }
171+
172+ for (int iChipID = 0 ; iChipID < nchip; iChipID++) {
173+ mMFTPixelHitMap [iChipID]->Reset ();
174+ }
175+ }
176+
177+ void BasicDigitQcTask::getChipName (TString& FolderName, TString& HistogramName, int iHitMap)
178+ {
179+ FolderName = Form (" ChipHitMaps/Half_%d/Disk_%d/Face_%d/mMFTChipHitMap" ,
180+ int (iHitMap / 10 ), int ((iHitMap % 10 ) / 2 ), (iHitMap % 10 ) % 2 );
181+
182+ HistogramName = Form (" h%d-d%d-f%d;x (cm);y (cm)" ,
183+ int (iHitMap / 10 ), int ((iHitMap % 10 ) / 2 ), (iHitMap % 10 ) % 2 );
184+ }
185+
186+ void BasicDigitQcTask::getPixelName (TString& FolderName, TString& HistogramName, int iChipID)
187+ {
188+ FolderName = Form (" PixelHitMaps/Half_%d/Disk_%d/Face_%d/mMFTPixelHitMap-z%d-l%d-s%d-tr%d" ,
189+ half[iChipID], disk[iChipID], face[iChipID], zone[iChipID], ladder[iChipID], sensor[iChipID], transID[iChipID]);
190+
191+ HistogramName = Form (" h%d-d%d-f%d-z%d-l%d-s%d-tr%d" ,
192+ half[iChipID], disk[iChipID], face[iChipID], zone[iChipID], ladder[iChipID], sensor[iChipID], transID[iChipID]);
193+ }
194+
195+ void BasicDigitQcTask::readTable ()
196+ {
197+ // const int nchip = 936;
198+
199+ // reset arrays
200+ for (int i = 0 ; i < nchip; i++) {
201+ half[i] = 0 ;
202+ disk[i] = 0 ;
203+ face[i] = 0 ;
204+ zone[i] = 0 ;
205+ ladder[i] = 0 ;
206+ sensor[i] = 0 ;
207+ transID[i] = 0 ;
208+ layer[i] = 0 ;
209+ x[i] = 0 ;
210+ y[i] = 0 ;
211+ z[i] = 0 ;
212+ binx[i] = 0 ;
213+ biny[i] = 0 ;
214+ }
215+
216+ // read file
217+ std::ifstream read_table;
218+ read_table.open (" ./table_file_binidx.txt" );
219+ for (int i = 0 ; i < nchip; ++i) {
220+ read_table >> half[i];
221+ read_table >> disk[i];
222+ read_table >> face[i];
223+ read_table >> zone[i];
224+ read_table >> ladder[i];
225+ read_table >> sensor[i];
226+ read_table >> transID[i];
227+ read_table >> layer[i];
228+ read_table >> x[i];
229+ read_table >> y[i];
230+ read_table >> z[i];
231+ read_table >> binx[i];
232+ read_table >> biny[i];
233+ }
234+ read_table.close ();
90235}
91236
92237} // namespace o2::quality_control_modules::mft
0 commit comments