Project
Loading...
Searching...
No Matches
DataContainer3D.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
16#include "TPCBase/Mapper.h"
17#include "Framework/Logger.h"
18#include "TFile.h"
19#include "ROOT/RDataFrame.hxx"
20#include "TStopwatch.h"
21#include "TTree.h"
22
23#include <memory>
24#include <iomanip>
25#include <algorithm>
26
27using namespace o2::tpc;
28
29template <typename DataT>
30template <typename DataTOut>
31int DataContainer3D<DataT>::writeToFile(TFile& outf, const char* name) const
32{
33 if (outf.IsZombie()) {
34 LOGP(error, "Failed to write to file: {}", outf.GetName());
35 return -1;
36 }
37
38 DataContainer3D<DataTOut> containerTmp(mZVertices, mRVertices, mPhiVertices);
39 containerTmp.getData() = std::vector<DataTOut>(mData.begin(), mData.end());
40
41 outf.WriteObjectAny(&containerTmp, DataContainer3D<DataTOut>::Class(), name);
42 return 0;
43}
44
45template <typename DataT>
46int DataContainer3D<DataT>::writeToFile(std::string_view file, std::string_view option, std::string_view name, const int nthreads) const
47{
48 // max number of floats per Entry
49 const size_t maxvalues = sizeof(float) * 1024 * 1024;
50
51 // total number of values to be stored
52 const size_t nsize = getNDataPoints();
53
54 // calculate number of entries in the tree and restrict if the number of values per threads exceeds max size
55 size_t entries = ((nsize / nthreads) > maxvalues) ? (nsize / maxvalues) : nthreads;
56
57 if (entries > nsize) {
58 entries = nsize;
59 }
60
61 // calculate numbers to store per entry
62 const size_t values_per_entry = nsize / entries;
63
64 // in case of remainder add additonal entry
65 const size_t values_lastEntry = nsize % entries;
66 if (values_lastEntry) {
67 entries += 1;
68 }
69
70 // in case EnableImplicitMT was already called with different number of threads, perform reset
71 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != nthreads)) {
72 ROOT::DisableImplicitMT();
73 }
74 ROOT::EnableImplicitMT(nthreads);
75
76 // define dataframe which will be stored in the TTree
77 ROOT::RDataFrame dFrame(entries);
78
79 // define function which is used to fill the data frame
80 auto dfStore = dFrame.DefineSlotEntry(name, [&data = std::as_const(mData), entries, values_per_entry](unsigned int, ULong64_t entry) { return DataContainer3D<DataT>::getDataSlice(data, entries, values_per_entry, entry); });
81 dfStore = dfStore.Define("nz", [mZVertices = mZVertices]() { return mZVertices; });
82 dfStore = dfStore.Define("nr", [mRVertices = mRVertices]() { return mRVertices; });
83 dfStore = dfStore.Define("nphi", [mPhiVertices = mPhiVertices]() { return mPhiVertices; });
84
85 // define options of TFile
86 ROOT::RDF::RSnapshotOptions opt;
87 opt.fMode = option;
88 opt.fOverwriteIfExists = true; // overwrite if already exists
89
90 TStopwatch timer;
91 // note: first call has some overhead (~2s)
92 dfStore.Snapshot(name, file, {name.data(), "nz", "nr", "nphi"}, opt);
93 timer.Print("u");
94 return 0;
95}
96
97template <typename DataT>
98bool DataContainer3D<DataT>::initFromFile(std::string_view file, std::string_view name, const int nthreads)
99{
100 // in case EnableImplicitMT was already called with different number of threads, perform reset
101 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != nthreads)) {
102 ROOT::DisableImplicitMT();
103 }
104 ROOT::EnableImplicitMT(nthreads);
105
106 // compare first the meta data (is the number of vertices the same)
107 // define data frame from imput file
108 ROOT::RDataFrame dFrame(name, file);
109
110 // compare vertices
111 auto comp = [mZVertices = mZVertices, mRVertices = mRVertices, mPhiVertices = mPhiVertices](const unsigned short nz, const unsigned short nr, const unsigned short nphi) {
112 if ((nz == mZVertices) && (nr == mRVertices) && (nphi == mPhiVertices)) {
113 return false;
114 }
115 return true;
116 };
117
118 auto count = dFrame.Filter(comp, {"nz", "nr", "nphi"}).Count();
119 if (*count != 0) {
120 LOGP(error, "Data from input file has different number of vertices! Found {} same vertices", *count);
121 return false;
122 }
123
124 // define lambda function which is used to copy the data
125 auto readData = [&mData = mData](const std::pair<long, std::vector<float>>& data) {
126 std::copy(data.second.begin(), data.second.end(), mData.begin() + data.first);
127 };
128
129 LOGP(info, "Reading {} from file {}", name, file);
130
131 // fill data from RDataFrame
132 TStopwatch timer;
133 dFrame.Foreach(readData, {name.data()});
134 timer.Print("u");
135 return true;
136}
137
139template <typename DataT>
140template <typename DataTIn>
141bool DataContainer3D<DataT>::initFromFile(TFile& inpf, const char* name)
142{
143 if (inpf.IsZombie()) {
144 LOGP(error, "Failed to read from file: {}", inpf.GetName());
145 return false;
146 }
147 DataContainer3D<DataTIn>* dataCont{nullptr};
148 dataCont = reinterpret_cast<DataContainer3D<DataTIn>*>(inpf.GetObjectChecked(name, DataContainer3D<DataTIn>::Class()));
150 if (!dataCont) {
151 LOGP(error, "Failed to load {} from {}", name, inpf.GetName());
152 return false;
153 }
154
155 if (mZVertices != dataCont->getNZ() || mRVertices != dataCont->getNR() || mPhiVertices != dataCont->getNPhi()) {
156 LOGP(error, "Data from input file has different definition of vertices!");
157 LOGP(error, "set vertices before creating the sc object to: SpaceCharge<>::setGrid({}, {}, {})", dataCont->getNZ(), dataCont->getNR(), dataCont->getNPhi());
158 delete dataCont;
159 return false;
160 }
161
162 mData = std::vector<DataT>(dataCont->getData().begin(), dataCont->getData().end());
163 delete dataCont;
164 return true;
165}
166
167template <typename DataT>
169{
170 if (inpf.IsZombie()) {
171 LOGP(error, "Failed to read from file {}", inpf.GetName());
172 return nullptr;
173 }
174 DataContainer3D<DataT>* dataCont{nullptr};
176 dataCont = reinterpret_cast<DataContainer3D<DataT>*>(inpf.GetObjectChecked(name, DataContainer3D<DataT>::Class()));
177 if (!dataCont) {
178 LOGP(error, "Failed to load {} from {}", name, inpf.GetName());
179 return nullptr;
180 }
181 return dataCont;
182}
183
184template <typename DataT>
186{
187 std::stringstream stream;
188 stream.precision(3);
189 auto&& w = std::setw(9);
190 stream << std::endl;
191
192 for (unsigned int iz = 0; iz < mPhiVertices; ++iz) {
193 stream << "z layer: " << iz << "\n";
194 // print top x row
195 stream << "⎡" << w << (*this)(0, 0, iz);
196 for (unsigned int ix = 1; ix < mZVertices; ++ix) {
197 stream << ", " << w << (*this)(ix, 0, iz);
198 }
199 stream << " ⎤ \n";
200
201 for (unsigned int iy = 1; iy < mRVertices - 1; ++iy) {
202 stream << "⎢" << w << (*this)(0, iy, iz);
203 for (unsigned int ix = 1; ix < mZVertices; ++ix) {
204 stream << ", " << w << (*this)(ix, iy, iz);
205 }
206 stream << " ⎥ \n";
207 }
208
209 stream << "⎣" << w << (*this)(0, mRVertices - 1, iz);
210 for (unsigned int ix = 1; ix < mZVertices; ++ix) {
211 stream << ", " << w << (*this)(ix, mRVertices - 1, iz);
212 }
213 stream << " ⎦ \n \n";
214 }
215 LOGP(info, "{} \n \n", stream.str());
216}
217
218template <typename DataT>
219auto DataContainer3D<DataT>::getDataSlice(const std::vector<DataT>& data, size_t entries, const size_t values_per_entry, ULong64_t entry)
220{
221 const long indStart = entry * values_per_entry;
222 if (entry < (entries - 1)) {
223 return std::pair(indStart, std::vector<float>(data.begin() + indStart, data.begin() + indStart + values_per_entry));
224 } else if (entry == (entries - 1)) {
225 // last entry might have different number of values. just copy the rest...
226 return std::pair(indStart, std::vector<float>(data.begin() + indStart, data.end()));
227 }
228 return std::pair(indStart, std::vector<float>());
229};
230
231template <typename DataT>
233{
234 std::transform(mData.begin(), mData.end(), mData.begin(), [value = value](auto& val) { return val * value; });
235 return *this;
236}
237
238template <typename DataT>
240{
241 std::transform(mData.begin(), mData.end(), other.mData.begin(), mData.begin(), std::plus<>());
242 return *this;
243}
244
245template <typename DataT>
247{
248 std::transform(mData.begin(), mData.end(), other.mData.begin(), mData.begin(), std::minus<>());
249 return *this;
250}
251
252template <typename DataT>
254{
255 std::transform(mData.begin(), mData.end(), other.mData.begin(), mData.begin(), std::multiplies<>());
256 return *this;
257}
258
259template <typename DataT>
260size_t DataContainer3D<DataT>::getIndexZ(size_t index, const int nz, const int nr, const int nphi)
261{
262 const size_t iphi = index / (nz * nr);
263 index -= (iphi * nz * nr);
264 const size_t iz = index % nz;
265 return iz;
266}
267
268template <typename DataT>
269size_t DataContainer3D<DataT>::getIndexR(size_t index, const int nz, const int nr, const int nphi)
270{
271 const size_t iphi = index / (nz * nr);
272 index -= (iphi * nz * nr);
273 const size_t ir = index / nz;
274 return ir;
275}
276
277template <typename DataT>
278size_t DataContainer3D<DataT>::getIndexPhi(size_t index, const int nz, const int nr, const int nphi)
279{
280 return index / (nz * nr);
281}
282
283template <typename DataT>
285{
286 tree->SetAlias("ir", "o2::tpc::DataContainer3D<float>::getIndexR(first + Iteration$, nz, nr, nphi)");
287 tree->SetAlias("iz", "o2::tpc::DataContainer3D<float>::getIndexZ(first + Iteration$, nz, nr, nphi)");
288 tree->SetAlias("iphi", "o2::tpc::DataContainer3D<float>::getIndexPhi(first + Iteration$, nz, nr, nphi)");
289 tree->SetAlias("r", "o2::tpc::GridProperties<float>::getRMin() + o2::tpc::GridProperties<float>::getGridSpacingR(nr) * ir");
290 tree->SetAlias("z", "o2::tpc::GridProperties<float>::getZMin() + o2::tpc::GridProperties<float>::getGridSpacingZ(nz) * iz");
291 tree->SetAlias("phi", "o2::tpc::GridProperties<float>::getPhiMin() + o2::tpc::GridProperties<float>::getGridSpacingPhi(nphi) * iphi");
292}
293
294template <typename DataT>
296{
297 // actuall stored value
298 tree->SetAlias("val", "_0");
299
300 // some meta data
301 tree->SetAlias("iz", "_1");
302 tree->SetAlias("ir", "_2");
303 tree->SetAlias("iphi", "_3");
304 tree->SetAlias("z", "_4");
305 tree->SetAlias("r", "_5");
306 tree->SetAlias("phi", "_6");
307 tree->SetAlias("lpos", "_7");
308 tree->SetAlias("lx", "lpos.fCoordinates.fX");
309 tree->SetAlias("ly", "lpos.fCoordinates.fY");
310 tree->SetAlias("index", "_8");
311}
312
313template <typename DataT>
314void DataContainer3D<DataT>::setGrid(unsigned short nZ, unsigned short nR, unsigned short nPhi, const bool resize)
315{
316 mZVertices = nZ;
317 mRVertices = nR;
318 mPhiVertices = nPhi;
319 if (resize) {
320 mData.resize(nZ * nR * static_cast<size_t>(nPhi));
321 }
322}
323
324template <typename DataT>
325void DataContainer3D<DataT>::dumpSlice(std::string_view treename, std::string_view fileIn, std::string_view fileOut, std::string_view option, std::pair<unsigned short, unsigned short> rangeiR, std::pair<unsigned short, unsigned short> rangeiZ, std::pair<unsigned short, unsigned short> rangeiPhi, const int nthreads)
326{
327 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != nthreads)) {
328 ROOT::DisableImplicitMT();
329 }
330 ROOT::EnableImplicitMT(nthreads);
331 ROOT::RDataFrame dFrame(treename, fileIn);
332
333 auto df = dFrame.Define("slice", [rangeiZ, rangeiR, rangeiPhi](const std::pair<long, std::vector<float>>& values, unsigned short nz, unsigned short nr, unsigned short nphi) {
334 std::vector<size_t> ir;
335 std::vector<size_t> iphi;
336 std::vector<size_t> iz;
337 std::vector<float> r;
338 std::vector<float> phi;
339 std::vector<float> z;
340 std::vector<float> vals;
341 std::vector<size_t> globalIdx;
342 std::vector<LocalPosition3D> lPos;
343 const auto nvalues = values.second.size();
344 ir.reserve(nvalues);
345 iphi.reserve(nvalues);
346 iz.reserve(nvalues);
347 r.reserve(nvalues);
348 phi.reserve(nvalues);
349 z.reserve(nvalues);
350 vals.reserve(nvalues);
351 lPos.reserve(nvalues);
352 globalIdx.reserve(nvalues);
353 for (size_t i = 0; i < nvalues; ++i) {
354 const size_t idx = values.first + i;
355 const auto iZTmp = o2::tpc::DataContainer3D<float>::getIndexZ(idx, nz, nr, nphi);
356 if ((rangeiZ.first < rangeiZ.second) && ((iZTmp < rangeiZ.first) || (iZTmp > rangeiZ.second))) {
357 continue;
358 }
359
360 const auto iRTmp = o2::tpc::DataContainer3D<float>::getIndexR(idx, nz, nr, nphi);
361 if ((rangeiR.first < rangeiR.second) && ((iRTmp < rangeiR.first) || (iRTmp > rangeiR.second))) {
362 continue;
363 }
364
365 const auto iPhiTmp = o2::tpc::DataContainer3D<float>::getIndexPhi(idx, nz, nr, nphi);
366 if ((rangeiPhi.first < rangeiPhi.second) && ((iPhiTmp < rangeiPhi.first) || (iPhiTmp > rangeiPhi.second))) {
367 continue;
368 }
369
373
374 const float x = rTmp * std::cos(phiTmp);
375 const float y = rTmp * std::sin(phiTmp);
376 const LocalPosition3D pos(x, y, zTmp);
377 unsigned char secNum = std::floor(phiTmp / SECPHIWIDTH);
378 Sector sector(secNum + (pos.Z() < 0) * SECTORSPERSIDE);
379 LocalPosition3D lPosTmp = Mapper::GlobalToLocal(pos, sector);
380
381 lPos.emplace_back(lPosTmp);
382 ir.emplace_back(iRTmp);
383 iphi.emplace_back(iPhiTmp);
384 iz.emplace_back(iZTmp);
385 r.emplace_back(rTmp);
386 phi.emplace_back(phiTmp);
387 z.emplace_back(zTmp);
388 vals.emplace_back(values.second[i]);
389 globalIdx.emplace_back(idx);
390 }
391 return std::make_tuple(vals, iz, ir, iphi, z, r, phi, lPos, globalIdx);
392 },
393 {treename.data(), "nz", "nr", "nphi"});
394
395 // define options of TFile
396 ROOT::RDF::RSnapshotOptions opt;
397 opt.fMode = option;
398 df.Snapshot(treename, fileOut, {"slice"}, opt);
399}
400
401template <typename DataT>
403{
404 TriCubicInterpolator<DataT> interpolator(*this, grid);
405 return interpolator(z, r, phi);
406}
407
408template <typename DataT>
409void DataContainer3D<DataT>::dumpInterpolation(std::string_view treename, std::string_view fileIn, std::string_view fileOut, std::string_view option, std::pair<float, float> rangeR, std::pair<float, float> rangeZ, std::pair<float, float> rangePhi, const int nR, const int nZ, const int nPhi, const int nthreads)
410{
411 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != nthreads)) {
412 ROOT::DisableImplicitMT();
413 }
414 ROOT::EnableImplicitMT(nthreads);
415 ROOT::RDataFrame dFrame(nPhi);
416
417 // get vertices for input TTree which is needed to define the grid for interpolation
418 unsigned short nr, nz, nphi;
419 if (!getVertices(treename, fileIn, nr, nz, nphi)) {
420 return;
421 }
422
423 // load data from input TTree
425 data.setGrid(nz, nr, nphi, true);
426 data.initFromFile(fileIn, treename, nthreads);
427
428 // define grid for interpolation
429 using GridProp = GridProperties<DataT>;
430 const RegularGrid3D<DataT> mGrid3D(GridProp::ZMIN, GridProp::RMIN, GridProp::PHIMIN, GridProp::getGridSpacingZ(nz), GridProp::getGridSpacingR(nr), o2::tpc::GridProperties<float>::getGridSpacingPhi(nphi) * (MGParameters::normalizeGridToNSector / double(SECTORSPERSIDE)), ParamSpaceCharge{nr, nz, nphi});
431
432 auto interpolate = [&mGrid3D = std::as_const(mGrid3D), &data = std::as_const(data), rangeR, rangeZ, rangePhi, nR, nZ, nPhi](unsigned int, ULong64_t iPhi) {
433 std::vector<size_t> ir;
434 std::vector<size_t> iphi;
435 std::vector<size_t> iz;
436 std::vector<float> r;
437 std::vector<float> phi;
438 std::vector<float> z;
439 std::vector<float> vals;
440 std::vector<size_t> globalIdx;
441 std::vector<LocalPosition3D> lPos;
442 const auto nvalues = nR * nZ;
443 ir.reserve(nvalues);
444 iphi.reserve(nvalues);
445 iz.reserve(nvalues);
446 r.reserve(nvalues);
447 phi.reserve(nvalues);
448 z.reserve(nvalues);
449 vals.reserve(nvalues);
450 lPos.reserve(nvalues);
451 globalIdx.reserve(nvalues);
452
453 const float rSpacing = (rangeR.second - rangeR.first) / (nR - 1);
454 const float zSpacing = (rangeZ.second - rangeZ.first) / (nZ - 1);
455 const float phiSpacing = (rangePhi.second - rangePhi.first) / (nPhi - 1);
456 const DataT phiPos = rangePhi.first + iPhi * phiSpacing;
457 // loop over grid and interpolate values
458 for (int iR = 0; iR < nR; ++iR) {
459 const DataT rPos = rangeR.first + iR * rSpacing;
460 for (int iZ = 0; iZ < nZ; ++iZ) {
461 const size_t idx = (iZ + nZ * (iR + iPhi * nR)); // unique index to Build index with other friend TTrees
462 const DataT zPos = rangeZ.first + iZ * zSpacing;
463 ir.emplace_back(iR);
464 iphi.emplace_back(iPhi);
465 iz.emplace_back(iZ);
466 r.emplace_back(rPos);
467 phi.emplace_back(phiPos);
468 z.emplace_back(zPos);
469 vals.emplace_back(data.interpolate(zPos, rPos, phiPos, mGrid3D)); // interpolated values
470 globalIdx.emplace_back(idx);
471 const float x = rPos * std::cos(phiPos);
472 const float y = rPos * std::sin(phiPos);
473 const LocalPosition3D pos(x, y, zPos);
474 unsigned char secNum = std::floor(phiPos / SECPHIWIDTH); // TODO CHECK THIS
475 Sector sector(secNum + (pos.Z() < 0) * SECTORSPERSIDE);
476 LocalPosition3D lPosTmp = Mapper::GlobalToLocal(pos, sector);
477 lPos.emplace_back(lPosTmp);
478 }
479 }
480 return std::make_tuple(vals, iz, ir, iphi, z, r, phi, lPos, globalIdx);
481 };
482
483 // define RDataFrame entry
484 auto dfStore = dFrame.DefineSlotEntry(treename, interpolate);
485
486 // define options of TFile
487 ROOT::RDF::RSnapshotOptions opt;
488 opt.fMode = option;
489
490 TStopwatch timer;
491 // note: first call has some overhead (~2s)
492 dfStore.Snapshot(treename, fileOut, {treename.data()}, opt);
493 timer.Print("u");
494}
495
496template <typename DataT>
497bool DataContainer3D<DataT>::getVertices(std::string_view treename, std::string_view fileIn, unsigned short& nR, unsigned short& nZ, unsigned short& nPhi)
498{
499 TFile fTmp(fileIn.data(), "READ");
500 TTree* tree = (TTree*)fTmp.Get(treename.data());
501 if (!tree) {
502 LOGP(warning, "Tree {} not found in input file {}", treename, fileIn);
503 return false;
504 }
505 tree->SetBranchAddress("nz", &nZ);
506 tree->SetBranchAddress("nr", &nR);
507 tree->SetBranchAddress("nphi", &nPhi);
508 tree->GetEntry(0);
509 delete tree;
510 return true;
511}
512
513template <typename DataT>
515{
516 const int nZNew = gridNew.getNZ();
517 const int nRNew = gridNew.getNR();
518 const int nPhiNew = gridNew.getNPhi();
519 DataContainer3D<DataT> contCont(nZNew, nRNew, nPhiNew);
520#pragma omp parallel for num_threads(threads)
521 for (size_t iPhi = 0; iPhi < nPhiNew; ++iPhi) {
522 const DataT phi = gridNew.getPhiVertex(iPhi);
523 for (size_t iR = 0; iR < nRNew; ++iR) {
524 const DataT radius = gridNew.getRVertex(iR);
525 for (size_t iZ = 0; iZ < nZNew; ++iZ) {
526 const DataT z = gridNew.getZVertex(iZ);
527 contCont(iZ, iR, iPhi) = interpolate(z, radius, phi, gridRef);
528 }
529 }
530 }
531 return contCont;
532}
533
536
537// deprecated functions (to be removed...)
538template int o2::tpc::DataContainer3D<float>::writeToFile<float>(TFile&, const char*) const;
539template int o2::tpc::DataContainer3D<float>::writeToFile<double>(TFile&, const char*) const;
540template int o2::tpc::DataContainer3D<double>::writeToFile<float>(TFile&, const char*) const;
541template int o2::tpc::DataContainer3D<double>::writeToFile<double>(TFile&, const char*) const;
542template bool o2::tpc::DataContainer3D<float>::initFromFile<float>(TFile&, const char*);
543template bool o2::tpc::DataContainer3D<float>::initFromFile<double>(TFile&, const char*);
544template bool o2::tpc::DataContainer3D<double>::initFromFile<float>(TFile&, const char*);
545template bool o2::tpc::DataContainer3D<double>::initFromFile<double>(TFile&, const char*);
This class provides a simple method to store values on a large 3-Dim grid with ROOT io functionality.
int32_t i
uint16_t pos
Definition RawData.h:3
Definition of RegularGrid3D class.
Definition of TriCubic class.
static LocalPosition3D GlobalToLocal(const GlobalPosition3D &pos, const double alpha)
Definition Mapper.h:468
size_t getNPhi() const
DataT getRVertex(const size_t vertexY) const
DataT getPhiVertex(const size_t vertexZ) const
DataT getZVertex(const size_t vertexX) const
GLint GLenum GLint x
Definition glcorearb.h:403
GLint GLsizei count
Definition glcorearb.h:399
GLuint entry
Definition glcorearb.h:5735
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLenum GLsizei GLsizei GLint * values
Definition glcorearb.h:1576
GLboolean * data
Definition glcorearb.h:298
GLuint GLfloat * val
Definition glcorearb.h:1582
GLboolean r
Definition glcorearb.h:1233
GLuint GLuint stream
Definition glcorearb.h:1806
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
Global TPC definitions and constants.
Definition SimTraits.h:168
constexpr double SECPHIWIDTH
Definition Defs.h:45
constexpr unsigned char SECTORSPERSIDE
Definition Defs.h:40
void readData(o2::tpc::GBTFrameContainer &container, std::vector< std::ofstream * > &outfiles, int &run, int &done)
const auto & getData() const
static size_t getIndexR(size_t index, const int nz, const int nr, const int nphi)
static void dumpSlice(std::string_view treename, std::string_view fileIn, std::string_view fileOut, std::string_view option, std::pair< unsigned short, unsigned short > rangeiR, std::pair< unsigned short, unsigned short > rangeiZ, std::pair< unsigned short, unsigned short > rangeiPhi, const int nthreads=1)
void print() const
print the matrix
static void dumpInterpolation(std::string_view treename, std::string_view fileIn, std::string_view fileOut, std::string_view option, std::pair< float, float > rangeR, std::pair< float, float > rangeZ, std::pair< float, float > rangePhi, const int nR, const int nZ, const int nPhi, const int nthreads=1)
bool initFromFile(TFile &inpf, const char *name="data")
set values from file
int writeToFile(TFile &outf, const char *name="data") const
void setGrid(unsigned short nZ, unsigned short nR, unsigned short nPhi, const bool resize)
set the grid points
static void setAliasesForDump(TTree *tree)
static void setAliases(TTree *tree)
DataT interpolate(const DataT z, const DataT r, const DataT phi, const o2::tpc::RegularGrid3D< DataT > &grid) const
DataContainer3D< DataT > & operator*=(const DataT value)
operator overload
static size_t getIndexZ(size_t index, const int nz, const int nr, const int nphi)
static size_t getIndexPhi(size_t index, const int nz, const int nr, const int nphi)
static bool getVertices(std::string_view treename, std::string_view fileIn, unsigned short &nR, unsigned short &nZ, unsigned short &nPhi)
static DataContainer3D< DataT > * loadFromFile(TFile &inpf, const char *name="data")
get pointer to object from file (deprecated!)
DataContainer3D< DataT > & operator-=(const DataContainer3D< DataT > &other)
DataContainer3D< DataT > & operator+=(const DataContainer3D< DataT > &other)
DataContainer3D< DataT > convert(const o2::tpc::RegularGrid3D< DataT > &gridNew, const o2::tpc::RegularGrid3D< DataT > &gridRef, const int threads=1) const
convert a data container to a new datacontainer with different grid definition (e....
static constexpr DataT getRMin()
static constexpr DataT getZMin()
static constexpr DataT getGridSpacingR(const unsigned int nR)
static constexpr DataT getPhiMin()
static constexpr DataT getGridSpacingZ(const unsigned int nZ)
static constexpr DataT getGridSpacingPhi(const unsigned int nPhi)
static int normalizeGridToNSector
the grid in phi direction is squashed from 2 Pi to (2 Pi / SECTORSPERSIDE). This can used to get the ...
VectorOfTObjectPtrs other
o2::InteractionRecord ir(0, 0)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))
pedsdata resize(norbits)