Project
Loading...
Searching...
No Matches
CalibPadGainTracksBase.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
17#include "TPCBase/ROC.h"
18#include "TPCBase/Painter.h"
20#include "TPCBase/Mapper.h"
21
22// root includes
23#include "TFile.h"
24#include "TCanvas.h"
25
26using namespace o2::tpc;
27
28CalibPadGainTracksBase::CalibPadGainTracksBase(const bool initCalPad) : mPadHistosDet(std::make_unique<DataTHistos>("Histo"))
29{
30 if (initCalPad) {
34 }
35};
36
37void CalibPadGainTracksBase::init(const unsigned int nBins, const float xmin, const float xmax, const bool useUnderflow, const bool useOverflow)
38{
39 DataTHisto hist(nBins, xmin, xmax, useUnderflow, useOverflow);
40 for (auto& calArray : mPadHistosDet->getData()) {
41 for (auto& tHist : calArray.getData()) {
42 tHist = hist;
43 }
44 }
45}
46
47void CalibPadGainTracksBase::dumpGainMap(const char* fileName) const
48{
49 TFile f(fileName, "RECREATE");
50 f.WriteObject(mGainMap.get(), "GainMap");
51}
52
53void CalibPadGainTracksBase::drawExtractedGainMapHelper(const bool type, const int typeMap, const Sector sector, const std::string filename, const float minZ, const float maxZ, const bool norm) const
54{
55 CalPad map;
56 std::string zAxisTitle;
57 if (typeMap == 0) {
58 map = *mGainMap.get();
59 zAxisTitle = "rel. gain";
60 } else if (typeMap == 1) {
61 map = *mSigmaMap.get();
62 zAxisTitle = norm ? "sigma / rel. gain" : "sigma";
63 } else if (typeMap == 2) {
64 map = *mNClMap.get();
65 zAxisTitle = "n cluster";
66 } else {
67 return;
68 }
69
70 if (norm) {
71 map /= *mGainMap;
72 }
73
74 std::function<float(const unsigned int, const unsigned int, const unsigned int, const unsigned int)> idcFunc = [mapTmp = map](const unsigned int sector, const unsigned int region, const unsigned int lrow, const unsigned int pad) {
75 return mapTmp.getValue(sector, Mapper::getGlobalPadNumber(lrow, pad, region));
76 };
77
79 drawFun.mIDCFunc = idcFunc;
80 type ? IDCDrawHelper::drawSide(drawFun, sector.side(), zAxisTitle, filename, minZ, maxZ) : IDCDrawHelper::drawSector(drawFun, 0, Mapper::NREGIONS, sector, zAxisTitle, filename, minZ, maxZ);
81}
82
83void CalibPadGainTracksBase::dumpToTree(const std::string filename) const
84{
85 if (!mGainMap) {
86 LOGP(error, "Map not set. Returning");
87 return;
88 }
90 if (mGainMap) {
91 dump.add(mGainMap.get());
92 }
93 if (mSigmaMap) {
94 dump.add(mSigmaMap.get());
95 }
96 dump.dumpToFile(filename);
97}
98
99void CalibPadGainTracksBase::divideGainMap(const char* inpFile, const char* mapName)
100{
101 TFile f(inpFile, "READ");
102 o2::tpc::CalPad* gainMap = nullptr;
103 f.GetObject(mapName, gainMap);
104
105 if (!gainMap) {
106 LOGP(info, "GainMap {} not found returning", mapName);
107 return;
108 }
109
110 *mGainMap /= *gainMap;
111 delete gainMap;
112}
113
114void CalibPadGainTracksBase::setGainMap(const char* inpFile, const char* mapName)
115{
116 TFile f(inpFile, "READ");
117 o2::tpc::CalPad* gainMap = nullptr;
118 f.GetObject(mapName, gainMap);
119
120 if (!gainMap) {
121 LOGP(info, "GainMap {} not found returning", mapName);
122 return;
123 }
124
125 mGainMap = std::make_unique<CalPad>(*gainMap);
126 delete gainMap;
127}
128
130{
131 return painter::draw(*mGainMap);
132}
133
135{
136 for (auto& calArray : mPadHistosDet->getData()) {
137 for (auto& tHist : calArray.getData()) {
138 tHist.reset();
139 }
140 }
141}
142
143void CalibPadGainTracksBase::dumpToFile(const char* outFileName, const char* outName) const
144{
145 TFile fOut(outFileName, "RECREATE");
146 fOut.WriteObject(this, outName);
147 fOut.Close();
148}
149
150void CalibPadGainTracksBase::fill(const gsl::span<const DataTHistos>& caldets)
151{
152 for (const auto& caldet : caldets) {
153 fill(caldet);
154 }
155}
156
158{
159 unsigned int totEntries = 0;
160 int minEntries = -1;
161 for (auto& calArray : mPadHistosDet->getData()) {
162 for (auto& tHist : calArray.getData()) {
163 const auto entries = tHist.getEntries();
164 totEntries += entries;
165 if (entries < minEntries || minEntries == -1) {
166 minEntries = entries;
167 }
168 }
169 }
170 LOGP(info, "Total number of entries: {}", totEntries);
171 LOGP(info, "Minimum number of entries: {}", minEntries);
172}
173
174bool CalibPadGainTracksBase::hasEnoughData(const int minEntries) const
175{
176 if (minEntries == 0) {
177 return true;
178 }
179
180 unsigned long totalEntries = 0;
181 for (auto& calArray : mPadHistosDet->getData()) {
182 for (auto& tHist : calArray.getData()) {
183 const auto entries = tHist.getEntries();
184 totalEntries += entries;
185 }
186 }
187
188 // check if mean number of entries is larger than min entries
189 if ((totalEntries / (2 * Mapper::getNumberOfPadsPerSide())) > minEntries) {
190 return true;
191 }
192 return false;
193}
194
195void CalibPadGainTracksBase::finalize(const int minEntries, const float minRelgain, const float maxRelgain, const float low, const float high, const float minStDev)
196{
197 if (!mGainMap) {
199 }
200
201 if (!mSigmaMap) {
203 }
204
205 if (!mNClMap) {
207 }
208
209 for (int roc = 0; roc < ROC::MaxROC; ++roc) {
210 const auto padsInRoc = ROC(roc).isIROC() ? Mapper::getPadsInIROC() : Mapper::getPadsInOROC();
211 for (int pad = 0; pad < padsInRoc; ++pad) {
212 const auto& histo = mPadHistosDet->getCalArray(roc).getData()[pad];
213 unsigned int entries = histo.getEntries();
214 const auto stat = histo.getStatisticsData(low, high);
215 const auto cog = static_cast<float>(stat.mCOG);
216
217 // subtract underflow and overflow entries to check if only the valid entries are > 0
218 if (histo.isUnderflowSet()) {
219 entries -= histo.getBinContent(0);
220 }
221
222 if (histo.isOverflowSet()) {
223 const unsigned int binOverflow = histo.getNBins() + histo.isUnderflowSet();
224 entries -= histo.getBinContent(binOverflow);
225 }
226
227 mNClMap->getCalArray(roc).getData()[pad] = entries;
228 if ((entries >= minEntries) && (stat.mStdDev > minStDev)) {
229 mGainMap->getCalArray(roc).getData()[pad] = mLogTransformQ ? (std::exp(cog) - 1) : cog;
230 mSigmaMap->getCalArray(roc).getData()[pad] = mLogTransformQ ? (std::exp(stat.mStdDev) - 1) : stat.mStdDev;
231 } else {
232 mGainMap->getCalArray(roc).getData()[pad] = 1;
233 mSigmaMap->getCalArray(roc).getData()[pad] = 0;
234 }
235 }
236 }
237 normalizeGain(*mGainMap.get());
238
239 // clamp to min/max
240 for (int roc = 0; roc < ROC::MaxROC; ++roc) {
241 const auto padsInRoc = ROC(roc).isIROC() ? Mapper::getPadsInIROC() : Mapper::getPadsInOROC();
242 for (int pad = 0; pad < padsInRoc; ++pad) {
243 mGainMap->getCalArray(roc).getData()[pad] = std::clamp(mGainMap->getCalArray(roc).getData()[pad], minRelgain, maxRelgain);
244 }
245 }
246}
247
248void CalibPadGainTracksBase::normalizeGain(CalPad& calPad)
249{
250 for (auto& data : calPad.getData()) {
251 const bool isIROC = data.getPadSubsetNumber() < 36;
252 normalize(data.getData(), getNPadsForNormalization(isIROC));
253 }
254}
255
256std::vector<int> CalibPadGainTracksBase::getNPadsForNormalization(const bool iroc) const
257{
258 if (mNormType == NormType::stack) {
259 // normalize per stack
260 const std::vector<int> nPads = iroc ? std::vector<int>{Mapper::getPadsInIROC()} : std::vector<int>{Mapper::getPadsInOROC1(), Mapper::getPadsInOROC2(), Mapper::getPadsInOROC3()};
261 return nPads;
262 } else if (mNormType == NormType::region) {
263 // normalize per region
265 return nPads;
266 } else {
267 return std::vector<int>();
268 }
269}
270
271void CalibPadGainTracksBase::normalize(std::vector<float>& data, const std::vector<int>& nPads)
272{
273 int padStart = 0;
274 for (const auto pads : nPads) {
275 auto median = TMath::Median(pads, data.data() + padStart);
276 std::for_each(data.data() + padStart, data.data() + padStart + pads, [median](auto& val) { val /= ((val > 0) && (val != 1)) ? median : 1; });
277 padStart += pads;
278 }
279}
280
281o2::tpc::CalibPadGainTracksBase::DataTHisto CalibPadGainTracksBase::getHistogram(const int sector, const int region, const int lrow, const int pad) const
282{
283 return mPadHistosDet->getValue(sector, Mapper::getGlobalPadNumber(lrow, pad, region));
284}
285
286o2::tpc::CalibPadGainTracksBase::DataTHisto CalibPadGainTracksBase::getHistogram(const int sector, const int grow, const int pad) const
287{
288 return mPadHistosDet->getValue(sector, Mapper::GLOBALPADOFFSET[Mapper::REGION[grow]] + Mapper::OFFSETCRUGLOBAL[grow] + pad);
289}
helper class for drawing IDCs per region/side
uint32_t roc
Definition RawData.h:3
const auto & getData()
void initCalPadMemory()
initializing CalPad object for gainmap
void resetHistos()
resetting the histograms which are used for extraction of the gain map
CalibPadGainTracksBase(const bool initCalPad=true)
void dumpGainMap(const char *fileName="GainMap.root") const
void dumpToFile(const char *outFileName="calPadGainTracksBase.root", const char *outName="calPadGain") const
TCanvas * drawExtractedGainMapPainter() const
draw gain map using painter functionality
void divideGainMap(const char *inpFile, const char *mapName)
void initCalPadStdDevMemory()
initializing CalPad object for std dev map
void fill(const gsl::span< const DataTHistos > &caldets)
void initCalPadStat()
initializing CalPad object for std dev map
@ stack
normalization per GEM stack
void dumpToTree(const std::string filename="map_debug.root") const
void print() const
Print the total number of entries and minimum number of entries (ToDo add some more informations whic...
void finalize(const int minEntries=10, const float minRelgain=0.1f, const float maxRelgain=2.f, const float low=0.05f, const float high=0.6f, const float minStDev=0.01)
bool hasEnoughData(const int minEntries) const
void setGainMap(const char *inpFile, const char *mapName)
void init(const unsigned int nBins, const float xmin, const float xmax, const bool useUnderflow, const bool useOverflow)
DataTHisto getHistogram(const int sector, const int region, const int lrow, const int pad) const
class to dump calibration data to a ttree for simple visualisation
void add(CalDet< T > *calDet)
Add CalDet object.
templated 1D-histogram class.
Definition FastHisto.h:52
static void drawSide(const IDCDraw &idc, const o2::tpc::Side side, const std::string zAxisTitle, const std::string filename, const float minZ=0, const float maxZ=-1)
static constexpr unsigned short getPadsInOROC3()
Definition Mapper.h:412
static GlobalPadNumber getGlobalPadNumber(const unsigned int lrow, const unsigned int pad, const unsigned int region)
Definition Mapper.h:64
static constexpr unsigned int GLOBALPADOFFSET[NREGIONS]
offset of number of pads for region
Definition Mapper.h:531
static constexpr unsigned short getPadsInOROC1()
Definition Mapper.h:410
static constexpr unsigned short getPadsInIROC()
Definition Mapper.h:409
static constexpr unsigned short getPadsInOROC()
Definition Mapper.h:413
static constexpr int getNumberOfPadsPerSide()
Definition Mapper.h:374
static constexpr unsigned short getPadsInOROC2()
Definition Mapper.h:411
static constexpr unsigned int PADSPERREGION[NREGIONS]
number of pads per CRU
Definition Mapper.h:530
static constexpr unsigned int OFFSETCRUGLOBAL[PADROWS]
row offset in cru for given global pad row
Definition Mapper.h:579
static constexpr unsigned REGION[PADROWS]
region for global pad row
Definition Mapper.h:537
bool isIROC() const
If roc is an IROC.
Definition ROC.h:99
@ MaxROC
Definition ROC.h:47
void dump(const std::string what, DPMAP m, int verbose)
Definition dcs-ccdb.cxx:79
GLdouble f
Definition glcorearb.h:310
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLboolean * data
Definition glcorearb.h:298
GLuint GLfloat * val
Definition glcorearb.h:1582
GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat maxZ
Definition glcorearb.h:2910
GLfloat GLfloat minZ
Definition glcorearb.h:2910
R median(std::vector< T > v)
Definition fit.h:519
Global TPC definitions and constants.
Definition SimTraits.h:167
Defining DataPointCompositeObject explicitly as copiable.
std::string filename()
std::function< float(const unsigned int, const unsigned int, const unsigned int, const unsigned int)> mIDCFunc
function returning the value which will be drawn for sector, region, row, pad
static TCanvas * draw(const CalDet< T > &calDet, int nbins1D=300, float xMin1D=0, float xMax1D=0, TCanvas *outputCanvas=nullptr)