Project
Loading...
Searching...
No Matches
CalibdEdxTrackTopologyPol.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
12#ifndef GPUCA_NO_VC
13#include "Rtypes.h"
14#endif
16
17#include <cstddef>
18#include <string_view>
19#if !defined(GPUCA_STANDALONE)
20#include "TFile.h"
21#endif
22
23using namespace o2::tpc;
24
25#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
26#include "NDPiecewisePolynomials.inc"
27void CalibdEdxTrackTopologyPol::dumpToTree(const uint32_t nSamplingPoints[/* Dim */], const char* outName) const
28{
29 for (uint32_t i = 0; i < FFits; i++) {
30 const auto treename = getPolyName(i, ChargeType::Max);
31 mCalibPolsqMax[i].dumpToTree(nSamplingPoints, outName, treename.data(), false);
32 }
33
34 for (uint32_t i = 0; i < FFits; i++) {
35 const auto treename = getPolyName(i, ChargeType::Tot);
36 mCalibPolsqTot[i].dumpToTree(nSamplingPoints, outName, treename.data(), false);
37 }
38}
39#endif
40
42{
43 const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
44 FlatObject::cloneFromObject(obj, newFlatBufferPtr);
45
46 for (uint32_t i = 0; i < FFits; i++) {
47 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibPolsqTot[i].getFlatBufferPtr());
48 mCalibPolsqTot[i].cloneFromObject(obj.mCalibPolsqTot[i], buffer);
49 }
50
51 for (uint32_t i = 0; i < FFits; i++) {
52 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibPolsqMax[i].getFlatBufferPtr());
53 mCalibPolsqMax[i].cloneFromObject(obj.mCalibPolsqMax[i], buffer);
54 }
55
56 for (int32_t i = 0; i < FFits; ++i) {
57 mScalingFactorsqTot[i] = obj.mScalingFactorsqTot[i];
58 mScalingFactorsqMax[i] = obj.mScalingFactorsqMax[i];
59 }
60}
61
62void CalibdEdxTrackTopologyPol::moveBufferTo(char* newFlatBufferPtr)
63{
64 char* oldFlatBufferPtr = mFlatBufferPtr;
65 FlatObject::moveBufferTo(newFlatBufferPtr);
66 char* currFlatBufferPtr = mFlatBufferPtr;
67 mFlatBufferPtr = oldFlatBufferPtr;
68 setActualBufferAddress(currFlatBufferPtr);
69}
70
72{
73 for (uint32_t i = 0; i < FFits; i++) {
74 mCalibPolsqTot[i].destroy();
75 mCalibPolsqMax[i].destroy();
76 }
78}
79
81{
82 FlatObject::setActualBufferAddress(actualFlatBufferPtr);
83 size_t offset = 0;
84 for (uint32_t i = 0; i < FFits; i++) {
85 offset = alignSize(offset, mCalibPolsqTot[i].getBufferAlignmentBytes());
87 offset += mCalibPolsqTot[i].getFlatBufferSize();
88 }
89 for (uint32_t i = 0; i < FFits; i++) {
90 offset = alignSize(offset, mCalibPolsqMax[i].getBufferAlignmentBytes());
92 offset += mCalibPolsqMax[i].getFlatBufferSize();
93 }
94}
95
97{
98 for (uint32_t i = 0; i < FFits; i++) {
99 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibPolsqTot[i].getFlatBufferPtr());
100 mCalibPolsqTot[i].setFutureBufferAddress(buffer);
101 }
102 for (uint32_t i = 0; i < FFits; i++) {
103 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibPolsqMax[i].getFlatBufferPtr());
104 mCalibPolsqMax[i].setFutureBufferAddress(buffer);
105 }
106 FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
107}
108
109#if !defined(GPUCA_STANDALONE)
110
111void CalibdEdxTrackTopologyPol::construct()
112{
114
115 size_t buffSize = 0;
116 size_t offsets1[FFits];
117 size_t offsets2[FFits];
118
119 for (int32_t index = 0; index < FFits; ++index) {
120 buffSize = alignSize(buffSize, mCalibPolsqTot[index].getBufferAlignmentBytes());
121 offsets1[index] = buffSize;
122 buffSize += mCalibPolsqTot[index].getFlatBufferSize();
123 }
124 for (int32_t index = 0; index < FFits; ++index) {
125 buffSize = alignSize(buffSize, mCalibPolsqMax[index].getBufferAlignmentBytes());
126 offsets2[index] = buffSize;
127 buffSize += mCalibPolsqMax[index].getFlatBufferSize();
128 }
129
131
132 for (uint32_t i = 0; i < FFits; i++) {
133 mCalibPolsqTot[i].moveBufferTo(mFlatBufferPtr + offsets1[i]);
134 }
135 for (uint32_t i = 0; i < FFits; i++) {
136 mCalibPolsqMax[i].moveBufferTo(mFlatBufferPtr + offsets2[i]);
137 }
138}
139
141{
142 for (int32_t i = 0; i < FFits; ++i) {
143 const uint32_t n[FDim]{6, 5, 5, 5, 5};
144
145 // z tan(theta) sin(phi) |relPad| relTime
146 const float minqMax[FDim]{0, 0, 0, 0, -0.5f};
147 const float maxqMax[FDim]{250, 1.5f, 0.9f, 0.5f, 0.5f};
148 mCalibPolsqMax[i].init(minqMax, maxqMax, n);
149 mCalibPolsqMax[i].setDefault();
150
151 // z tan(theta) sin(phi) threshold <qTot>
152 const float minqTot[FDim]{0, 0, 0, 2, 30};
153 const float maxqTot[FDim]{250, 1.5f, 0.9f, 5, 200};
154 mCalibPolsqTot[i].init(minqTot, maxqTot, n);
155 mCalibPolsqTot[i].setDefault();
156 }
157 construct();
158}
159
160void CalibdEdxTrackTopologyPol::writeToFile(TFile& outf, const char* name) const
161{
163 cont.mCalibPols.reserve(FFits);
164
165 for (const auto& par : mCalibPolsqTot) {
166 cont.mCalibPols.emplace_back(par.getContainer());
167 }
168
169 for (const auto& par : mCalibPolsqMax) {
170 cont.mCalibPols.emplace_back(par.getContainer());
171 }
172
173 for (const auto par : mScalingFactorsqTot) {
174 cont.mScalingFactorsqTot.emplace_back(par);
175 }
176
177 for (const auto par : mScalingFactorsqMax) {
178 cont.mScalingFactorsqMax.emplace_back(par);
179 }
180
181 outf.WriteObject(&cont, name);
182}
183
185{
186 if (2 * FFits != container.mCalibPols.size()) {
187 LOGP(warning, "wrong number of polynomials stored! this {} container {}", 2 * FFits, container.mCalibPols.size());
188 return;
189 }
190
191 const auto nFacCont = container.mScalingFactorsqMax.size() + container.mScalingFactorsqTot.size();
192 if (2 * FFits != nFacCont) {
193 LOGP(warning, "wrong number of scaling factors stored! this {} container {}", 2 * FFits, nFacCont);
194 return;
195 }
196
197 for (int32_t i = 0; i < FFits; ++i) {
198 mCalibPolsqTot[i].setFromContainer(container.mCalibPols[i]);
199 }
200
201 for (int32_t i = 0; i < FFits; ++i) {
202 mCalibPolsqMax[i].setFromContainer(container.mCalibPols[FFits + i]);
203 }
204
205 for (int32_t i = 0; i < FFits; ++i) {
206 mScalingFactorsqTot[i] = container.mScalingFactorsqTot[i];
207 mScalingFactorsqMax[i] = container.mScalingFactorsqMax[i];
208 }
209 construct();
210}
211
212void CalibdEdxTrackTopologyPol::loadFromFile(const char* fileName, const char* name)
213{
214 TFile inpf(fileName, "READ");
215 CalibdEdxTrackTopologyPolContainer* polTmp = nullptr;
216 inpf.GetObject(name, polTmp);
217 if (polTmp) {
218 setFromContainer(*polTmp);
219 delete polTmp;
220 } else {
221 LOGP(info, "couldnt load object {} from input file", name);
222 }
223}
224
226{
227 for (int32_t ireg = 0; ireg < FFits; ++ireg) {
228 const auto polnameqTot = getPolyName(ireg, ChargeType::Tot);
229 mCalibPolsqTot[ireg].loadFromFile(inpf, polnameqTot.data());
230 const auto polnameqMax = getPolyName(ireg, ChargeType::Max);
231 mCalibPolsqMax[ireg].loadFromFile(inpf, polnameqMax.data());
232 }
233 construct();
234}
235
236std::string CalibdEdxTrackTopologyPol::getPolyName(const int32_t region, const ChargeType charge)
237{
238 const std::string typeName[2] = {"qMax", "qTot"};
239 const std::string polname = fmt::format("polynomial_{}_region{}", typeName[charge], region).data();
240 return polname;
241}
242
243#endif
int16_t charge
Definition RawEventData.h:5
int32_t i
void setFutureBufferAddress(char *futureFlatBufferPtr)
Definition FlatObject.h:557
void destroy()
_______________ Utilities _______________________________________________
Definition FlatObject.h:349
static size_t alignSize(size_t sizeBytes, size_t alignmentBytes)
_______________ Generic utilities _______________________________________________
Definition FlatObject.h:277
static constexpr size_t getBufferAlignmentBytes()
Gives minimal alignment in bytes required for the flat buffer.
Definition FlatObject.h:197
static T * relocatePointer(const char *oldBase, char *newBase, const T *ptr)
Relocates a pointer inside a buffer to the new buffer address.
Definition FlatObject.h:285
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
Definition FlatObject.h:547
void startConstruction()
_____________ Construction _________
Definition FlatObject.h:342
void moveBufferTo(char *newBufferPtr)
Definition FlatObject.h:396
void finishConstruction(int32_t flatBufferSize)
Definition FlatObject.h:358
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
Definition FlatObject.h:373
size_t getFlatBufferSize() const
Gives size of the flat buffer.
Definition FlatObject.h:256
const char * getFlatBufferPtr() const
Gives pointer to the flat buffer.
Definition FlatObject.h:259
void setActualBufferAddress(char *actualFlatBufferPtr)
set location of external flat buffer
void cloneFromObject(const NDPiecewisePolynomials &obj, char *newFlatBufferPtr)
========== FlatObject functionality, see FlatObject class for description =================
void setDefault()
setting default polynomials which just returns 1
void dumpToTree(const uint32_t nSamplingPoints[], const char *outName="debug.root", const char *treeName="tree", const bool recreateFile=true) const
void init(const float min[], const float max[], const uint32_t n[])
void destroy()
destroy the object (release internal flat buffer)
void loadFromFile(TFile &inpf, const char *name)
void setFromContainer(const NDPiecewisePolynomialContainer &container)
void setFutureBufferAddress(char *futureFlatBufferPtr)
set future location of the flat buffer
calibration class for the track topology correction of the dE/dx using multvariate polynomials
void loadFromFile(const char *fileName, const char *name)
static std::string getPolyName(const int32_t region, const ChargeType charge)
void dumpToTree(const uint32_t nSamplingPoints[], const char *outName="track_topology_corr_debug.root") const
void setDefaultPolynomials()
setting a default topology correction which just returns 1
void setFutureBufferAddress(char *futureFlatBufferPtr)
set future location of the flat buffer
void writeToFile(TFile &outf, const char *name="CalibdEdxTrackTopologyPol") const
void setFromContainer(const CalibdEdxTrackTopologyPolContainer &container)
void setActualBufferAddress(char *actualFlatBufferPtr)
set location of external flat buffer
void cloneFromObject(const CalibdEdxTrackTopologyPol &obj, char *newFlatBufferPtr)
========== FlatObject functionality, see FlatObject class for description =================
void destroy()
destroy the object (release internal flat buffer)
GLdouble n
Definition glcorearb.h:1982
GLuint buffer
Definition glcorearb.h:655
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLintptr offset
Definition glcorearb.h:660
Global TPC definitions and constants.
Definition SimTraits.h:167
ChargeType
Definition Defs.h:70
@ Tot
Definition Defs.h:72
@ Max
Definition Defs.h:71
simple struct to enable writing the MultivariatePolynomialCT to file
std::vector< float > mScalingFactorsqMax
value which is used to scale the result of the polynomial for qMax (can be used for normalization)
std::vector< float > mScalingFactorsqTot
value which is used to scale the result of the polynomial for qTot (can be used for normalization)
std::vector< gpu::NDPiecewisePolynomialContainer > mCalibPols
parameters of the polynomial