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_STANDALONE
13#include "Rtypes.h"
14#include "TFile.h"
15#endif
17
18#include <cstddef>
19#include <string_view>
20
21using namespace o2::tpc;
22
23#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
24#include "NDPiecewisePolynomials.inc"
25void CalibdEdxTrackTopologyPol::dumpToTree(const uint32_t nSamplingPoints[/* Dim */], const char* outName) const
26{
27 for (uint32_t i = 0; i < FFits; i++) {
28 const auto treename = getPolyName(i, ChargeType::Max);
29 mCalibPolsqMax[i].dumpToTree(nSamplingPoints, outName, treename.data(), false);
30 }
31
32 for (uint32_t i = 0; i < FFits; i++) {
33 const auto treename = getPolyName(i, ChargeType::Tot);
34 mCalibPolsqTot[i].dumpToTree(nSamplingPoints, outName, treename.data(), false);
35 }
36}
37#endif
38
40{
41 const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
42 FlatObject::cloneFromObject(obj, newFlatBufferPtr);
43
44 for (uint32_t i = 0; i < FFits; i++) {
45 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibPolsqTot[i].getFlatBufferPtr());
46 mCalibPolsqTot[i].cloneFromObject(obj.mCalibPolsqTot[i], buffer);
47 }
48
49 for (uint32_t i = 0; i < FFits; i++) {
50 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibPolsqMax[i].getFlatBufferPtr());
51 mCalibPolsqMax[i].cloneFromObject(obj.mCalibPolsqMax[i], buffer);
52 }
53
54 for (int32_t i = 0; i < FFits; ++i) {
55 mScalingFactorsqTot[i] = obj.mScalingFactorsqTot[i];
56 mScalingFactorsqMax[i] = obj.mScalingFactorsqMax[i];
57 }
58}
59
60void CalibdEdxTrackTopologyPol::moveBufferTo(char* newFlatBufferPtr)
61{
62 char* oldFlatBufferPtr = mFlatBufferPtr;
63 FlatObject::moveBufferTo(newFlatBufferPtr);
64 char* currFlatBufferPtr = mFlatBufferPtr;
65 mFlatBufferPtr = oldFlatBufferPtr;
66 setActualBufferAddress(currFlatBufferPtr);
67}
68
70{
71 for (uint32_t i = 0; i < FFits; i++) {
72 mCalibPolsqTot[i].destroy();
73 mCalibPolsqMax[i].destroy();
74 }
76}
77
79{
80 FlatObject::setActualBufferAddress(actualFlatBufferPtr);
81 size_t offset = 0;
82 for (uint32_t i = 0; i < FFits; i++) {
83 offset = alignSize(offset, mCalibPolsqTot[i].getBufferAlignmentBytes());
85 offset += mCalibPolsqTot[i].getFlatBufferSize();
86 }
87 for (uint32_t i = 0; i < FFits; i++) {
88 offset = alignSize(offset, mCalibPolsqMax[i].getBufferAlignmentBytes());
90 offset += mCalibPolsqMax[i].getFlatBufferSize();
91 }
92}
93
95{
96 for (uint32_t i = 0; i < FFits; i++) {
97 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibPolsqTot[i].getFlatBufferPtr());
98 mCalibPolsqTot[i].setFutureBufferAddress(buffer);
99 }
100 for (uint32_t i = 0; i < FFits; i++) {
101 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibPolsqMax[i].getFlatBufferPtr());
102 mCalibPolsqMax[i].setFutureBufferAddress(buffer);
103 }
104 FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
105}
106
107#if !defined(GPUCA_STANDALONE)
108
109void CalibdEdxTrackTopologyPol::construct()
110{
112
113 size_t buffSize = 0;
114 size_t offsets1[FFits];
115 size_t offsets2[FFits];
116
117 for (int32_t index = 0; index < FFits; ++index) {
118 buffSize = alignSize(buffSize, mCalibPolsqTot[index].getBufferAlignmentBytes());
119 offsets1[index] = buffSize;
120 buffSize += mCalibPolsqTot[index].getFlatBufferSize();
121 }
122 for (int32_t index = 0; index < FFits; ++index) {
123 buffSize = alignSize(buffSize, mCalibPolsqMax[index].getBufferAlignmentBytes());
124 offsets2[index] = buffSize;
125 buffSize += mCalibPolsqMax[index].getFlatBufferSize();
126 }
127
129
130 for (uint32_t i = 0; i < FFits; i++) {
131 mCalibPolsqTot[i].moveBufferTo(mFlatBufferPtr + offsets1[i]);
132 }
133 for (uint32_t i = 0; i < FFits; i++) {
134 mCalibPolsqMax[i].moveBufferTo(mFlatBufferPtr + offsets2[i]);
135 }
136}
137
139{
140 for (int32_t i = 0; i < FFits; ++i) {
141 const uint32_t n[FDim]{6, 5, 5, 5, 5};
142
143 // z tan(theta) sin(phi) |relPad| relTime
144 const float minqMax[FDim]{0, 0, 0, 0, -0.5f};
145 const float maxqMax[FDim]{250, 1.5f, 0.9f, 0.5f, 0.5f};
146 mCalibPolsqMax[i].init(minqMax, maxqMax, n);
147 mCalibPolsqMax[i].setDefault();
148
149 // z tan(theta) sin(phi) threshold <qTot>
150 const float minqTot[FDim]{0, 0, 0, 2, 30};
151 const float maxqTot[FDim]{250, 1.5f, 0.9f, 5, 200};
152 mCalibPolsqTot[i].init(minqTot, maxqTot, n);
153 mCalibPolsqTot[i].setDefault();
154 }
155 construct();
156}
157
158void CalibdEdxTrackTopologyPol::writeToFile(TFile& outf, const char* name) const
159{
161 cont.mCalibPols.reserve(FFits);
162
163 for (const auto& par : mCalibPolsqTot) {
164 cont.mCalibPols.emplace_back(par.getContainer());
165 }
166
167 for (const auto& par : mCalibPolsqMax) {
168 cont.mCalibPols.emplace_back(par.getContainer());
169 }
170
171 for (const auto par : mScalingFactorsqTot) {
172 cont.mScalingFactorsqTot.emplace_back(par);
173 }
174
175 for (const auto par : mScalingFactorsqMax) {
176 cont.mScalingFactorsqMax.emplace_back(par);
177 }
178
179 outf.WriteObject(&cont, name);
180}
181
183{
184 if (2 * FFits != container.mCalibPols.size()) {
185 LOGP(warning, "wrong number of polynomials stored! this {} container {}", 2 * FFits, container.mCalibPols.size());
186 return;
187 }
188
189 const auto nFacCont = container.mScalingFactorsqMax.size() + container.mScalingFactorsqTot.size();
190 if (2 * FFits != nFacCont) {
191 LOGP(warning, "wrong number of scaling factors stored! this {} container {}", 2 * FFits, nFacCont);
192 return;
193 }
194
195 for (int32_t i = 0; i < FFits; ++i) {
196 mCalibPolsqTot[i].setFromContainer(container.mCalibPols[i]);
197 }
198
199 for (int32_t i = 0; i < FFits; ++i) {
200 mCalibPolsqMax[i].setFromContainer(container.mCalibPols[FFits + i]);
201 }
202
203 for (int32_t i = 0; i < FFits; ++i) {
204 mScalingFactorsqTot[i] = container.mScalingFactorsqTot[i];
205 mScalingFactorsqMax[i] = container.mScalingFactorsqMax[i];
206 }
207 construct();
208}
209
210void CalibdEdxTrackTopologyPol::loadFromFile(const char* fileName, const char* name)
211{
212 TFile inpf(fileName, "READ");
213 CalibdEdxTrackTopologyPolContainer* polTmp = nullptr;
214 inpf.GetObject(name, polTmp);
215 if (polTmp) {
216 setFromContainer(*polTmp);
217 delete polTmp;
218 } else {
219 LOGP(info, "couldnt load object {} from input file", name);
220 }
221}
222
224{
225 for (int32_t ireg = 0; ireg < FFits; ++ireg) {
226 const auto polnameqTot = getPolyName(ireg, ChargeType::Tot);
227 mCalibPolsqTot[ireg].loadFromFile(inpf, polnameqTot.data());
228 const auto polnameqMax = getPolyName(ireg, ChargeType::Max);
229 mCalibPolsqMax[ireg].loadFromFile(inpf, polnameqMax.data());
230 }
231 construct();
232}
233
234std::string CalibdEdxTrackTopologyPol::getPolyName(const int32_t region, const ChargeType charge)
235{
236 const std::string typeName[2] = {"qMax", "qTot"};
237 const std::string polname = fmt::format("polynomial_{}_region{}", typeName[charge], region).data();
238 return polname;
239}
240
241#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