Project
Loading...
Searching...
No Matches
GPUDisplayMagneticField.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
16#include "GPULogging.h"
17
18#include <fstream>
19#include <random>
20#include <cassert>
21
22#ifndef GPUCA_NO_ROOT
23#include <TGeoGlobalMagField.h>
24#endif
25#if !defined(GPUCA_NO_ROOT) && defined(GPUCA_O2_LIB)
29#endif
30
31using namespace o2::gpu;
32
37
38#ifdef GPUCA_O2_LIB
40{
41 initializeUniformsFromField(field);
42}
43#endif
44
46{
47 std::mt19937 rng(0xDEADBEEF);
48
49 // TODO: fetch these values from somewhere?
50 std::uniform_int_distribution<int32_t> generator_x(-512, 512);
51 std::uniform_int_distribution<int32_t> generator_y(-512, 512);
52 std::uniform_int_distribution<int32_t> generator_z(-455 - 1312, -455 + 1312);
53
55
56 for (std::size_t i = 0; i < count; ++i) {
57 mFieldLineSeedPoints.emplace_back(generator_x(rng), generator_y(rng), generator_z(rng));
58 }
59}
60
61template <std::size_t MAX_DIM1_SEGMENTS, std::size_t MAX_DIM2_SEGMENTS, std::size_t MAX_DIM3_SEGMENTS>
63{
64 file.read(reinterpret_cast<char*>(&segments.MinZ), sizeof(segments.MinZ));
65 file.read(reinterpret_cast<char*>(&segments.MaxZ), sizeof(segments.MaxZ));
66 file.read(reinterpret_cast<char*>(&segments.MultiplicativeFactor), sizeof(segments.MultiplicativeFactor));
67
68 std::size_t NSegDim1, NSegDim2, NSegDim3;
69
70 file.read(reinterpret_cast<char*>(&NSegDim1), sizeof(std::int32_t));
71 assert(NSegDim1 <= MAX_DIM1_SEGMENTS);
72
73 segments.ZSegments = NSegDim1;
74
75 file.read(reinterpret_cast<char*>(segments.SegDim1), NSegDim1 * sizeof(segments.SegDim1[0]));
76
77 file.read(reinterpret_cast<char*>(segments.BegSegDim2), NSegDim1 * sizeof(segments.BegSegDim2[0]));
78 file.read(reinterpret_cast<char*>(segments.NSegDim2), NSegDim1 * sizeof(segments.NSegDim2[0]));
79
80 file.read(reinterpret_cast<char*>(&NSegDim2), sizeof(std::int32_t));
81 assert(NSegDim2 <= MAX_DIM2_SEGMENTS);
82
83 file.read(reinterpret_cast<char*>(segments.SegDim2), NSegDim2 * sizeof(segments.SegDim2[0]));
84
85 file.read(reinterpret_cast<char*>(segments.BegSegDim3), NSegDim2 * sizeof(segments.BegSegDim3[0]));
86 file.read(reinterpret_cast<char*>(segments.NSegDim3), NSegDim2 * sizeof(segments.NSegDim3[0]));
87
88 file.read(reinterpret_cast<char*>(&NSegDim3), sizeof(std::int32_t));
89 assert(NSegDim3 <= MAX_DIM3_SEGMENTS);
90
91 file.read(reinterpret_cast<char*>(segments.SegDim3), NSegDim3 * sizeof(segments.SegDim3[0]));
92 file.read(reinterpret_cast<char*>(segments.SegID), NSegDim3 * sizeof(segments.SegID[0]));
93
94 return std::make_tuple(NSegDim1, NSegDim2, NSegDim3);
95}
96
97template <std::size_t DIMENSIONS, std::size_t MAX_PARAMETERIZATIONS, std::size_t MAX_ROWS, std::size_t MAX_COLUMNS, std::size_t MAX_COEFFICIENTS>
98std::tuple<std::size_t, std::size_t, std::size_t, std::size_t> loadParams(std::ifstream& file, GPUDisplayMagneticField::ParametrizationUniform<MAX_PARAMETERIZATIONS, MAX_ROWS, MAX_COLUMNS, MAX_COEFFICIENTS>& parametrizations)
99{
100 std::size_t NParams, NRows, NColumns, NCoefficients;
101 file.read(reinterpret_cast<char*>(&NParams), sizeof(std::int32_t));
102 assert(NParams <= (MAX_PARAMETERIZATIONS / DIMENSIONS));
103
104 file.read(reinterpret_cast<char*>(parametrizations.BOffsets), DIMENSIONS * NParams * sizeof(parametrizations.BOffsets[0]));
105 file.read(reinterpret_cast<char*>(parametrizations.BScales), DIMENSIONS * NParams * sizeof(parametrizations.BScales[0]));
106 file.read(reinterpret_cast<char*>(parametrizations.BMin), DIMENSIONS * NParams * sizeof(parametrizations.BMin[0]));
107 file.read(reinterpret_cast<char*>(parametrizations.BMax), DIMENSIONS * NParams * sizeof(parametrizations.BMax[0]));
108
109 file.read(reinterpret_cast<char*>(parametrizations.NRows), DIMENSIONS * NParams * sizeof(parametrizations.NRows[0]));
110 file.read(reinterpret_cast<char*>(parametrizations.ColsAtRowOffset), DIMENSIONS * NParams * sizeof(parametrizations.ColsAtRowOffset[0]));
111 file.read(reinterpret_cast<char*>(parametrizations.CofsAtRowOffset), DIMENSIONS * NParams * sizeof(parametrizations.CofsAtRowOffset[0]));
112
113 file.read(reinterpret_cast<char*>(&NRows), sizeof(std::int32_t));
114 assert(NRows <= MAX_ROWS);
115
116 file.read(reinterpret_cast<char*>(parametrizations.NColsAtRow), NRows * sizeof(parametrizations.NColsAtRow[0]));
117 file.read(reinterpret_cast<char*>(parametrizations.CofsAtColOffset), NRows * sizeof(parametrizations.CofsAtColOffset[0]));
118
119 file.read(reinterpret_cast<char*>(&NColumns), sizeof(std::int32_t));
120 assert(NColumns <= MAX_COLUMNS);
121
122 file.read(reinterpret_cast<char*>(parametrizations.NCofsAtCol), NColumns * sizeof(parametrizations.NCofsAtCol[0]));
123 file.read(reinterpret_cast<char*>(parametrizations.AtColCoefOffset), NColumns * sizeof(parametrizations.AtColCoefOffset[0]));
124
125 file.read(reinterpret_cast<char*>(&NCoefficients), sizeof(std::int32_t));
126 assert(NCoefficients <= MAX_COEFFICIENTS);
127
128 file.read(reinterpret_cast<char*>(parametrizations.Coeffs), NCoefficients * sizeof(parametrizations.Coeffs[0]));
129
130 return std::make_tuple(NParams, NRows, NColumns, NCoefficients);
131}
132
133#ifndef GPUCA_O2_LIB
135{
136 mSolenoidSegments = std::make_unique<SolenoidSegmentsUniform>();
137 mDipoleSegments = std::make_unique<DipoleSegmentsUniform>();
138 mSolenoidParameterization = std::make_unique<SolenoidParameterizationUniform>();
139 mDipoleParameterization = std::make_unique<DipoleParameterizationUniform>();
140
141 std::ifstream file;
142
143 file.open("field.uniform", std::ifstream::binary);
144
145 if (!file.good()) {
146 GPUError("Cannot load field file \"field.uniform\" from the working directory.");
147 return 1;
148 }
149
150 const auto [SolSegDim1, SolSegDim2, SolSegDim3] = loadSegments(file, *mSolenoidSegments);
151 const auto [DipSegDim1, DipSegDim2, DipSegDim3] = loadSegments(file, *mDipoleSegments);
152 const auto [SParams, SRows, SCols, SCoeffs] = loadParams<DIMENSIONS>(file, *mSolenoidParameterization);
153 const auto [DParams, DRows, DCols, DCoeffs] = loadParams<DIMENSIONS>(file, *mDipoleParameterization);
154
155 mSolSegDim1 = SolSegDim1;
156 mSolSegDim2 = SolSegDim2;
157 mSolSegDim3 = SolSegDim3;
158
159 mSolParametrizations = SParams;
160 mSolRows = SRows;
161 mSolColumns = SCols;
162 mSolCoefficients = SCoeffs;
163
164 mDipSegDim1 = DipSegDim1;
165 mDipSegDim2 = DipSegDim2;
166 mDipSegDim3 = DipSegDim3;
167
168 mDipParametrizations = DParams;
169 mDipRows = DRows;
170 mDipColumns = DCols;
171 mDipCoefficients = DCoeffs;
172
173 mRenderConstantsUniform = std::make_unique<RenderConstantsUniform>();
174
175 return 0;
176}
177#endif
178
179#if !defined(GPUCA_NO_ROOT) && defined(GPUCA_O2_LIB)
181{
182 mRenderConstantsUniform = std::make_unique<RenderConstantsUniform>();
183
184 auto* field = dynamic_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
185
186 if (!field) {
187 const auto grp = o2::parameters::GRPObject::loadFrom();
190 field = dynamic_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
191 }
192
193 if (!field) {
194 GPUError("Error loading magnetic field data");
195 return 1;
196 }
197
198 return initializeUniformsFromField(field);
199}
200
201int32_t GPUDisplayMagneticField::initializeUniformsFromField(o2::field::MagneticField* field)
202{
203 const auto chebMap = field->getMeasuredMap();
204
205 const auto numberOfParameterizationSolenoid = chebMap->getNumberOfParametersSol();
206
207 if (numberOfParameterizationSolenoid > MAX_SOLENOID_PARAMETERIZATIONS) {
208 GPUError("Model has too many Solenoid parametrization regions to fit in the designated uniform");
209 return 1;
210 }
211
212 const auto numberOfParameterizationDipole = chebMap->getNumberOfParametersDip();
213
214 if (numberOfParameterizationDipole > MAX_DIPOLE_PARAMETERIZATIONS) {
215 GPUError("Model has too many Dipole parametrization regions to fit in the designated uniform");
216 return 1;
217 }
218
219 struct TableInfo {
222 Int_t numberOfDistinctDim1Segments;
223 Int_t numberOfDistinctDim2Segments;
224 Int_t numberOfDistinctDim3Segments;
225 Float_t* coordinatesSegmentsDim1;
226 Float_t* coordinatesSegmentsDim2;
227 Float_t* coordinatesSegmentsDim3;
228 Int_t* beginningOfSegmentsDim2;
229 Int_t* beginningOfSegmentsDim3;
230 Int_t* numberOfSegmentsDim2;
231 Int_t* numberOfSegmentsDim3;
232 Int_t* segmentId;
233
234 ~TableInfo()
235 {
236 delete[] coordinatesSegmentsDim1;
237 delete[] coordinatesSegmentsDim2;
238 delete[] coordinatesSegmentsDim3;
239 delete[] beginningOfSegmentsDim2;
240 delete[] beginningOfSegmentsDim3;
241 delete[] numberOfSegmentsDim2;
242 delete[] numberOfSegmentsDim3;
243 delete[] segmentId;
244 }
245 };
246
247 TableInfo solenoidTableInfo, dipoleTableInfo;
248
249 const auto parameterizationSolenoid = std::make_unique<TObjArray>();
250
251 for (auto i = 0; i < numberOfParameterizationSolenoid; ++i) {
252 parameterizationSolenoid->Add(chebMap->getParameterSolenoid(i));
253 }
254
255 chebMap->buildTable(numberOfParameterizationSolenoid, parameterizationSolenoid.get(), solenoidTableInfo.numberOfDistinctDim1Segments,
256 solenoidTableInfo.numberOfDistinctDim2Segments, solenoidTableInfo.numberOfDistinctDim3Segments, solenoidTableInfo.minZ, solenoidTableInfo.maxZ,
257 &solenoidTableInfo.coordinatesSegmentsDim1, &solenoidTableInfo.coordinatesSegmentsDim2, &solenoidTableInfo.coordinatesSegmentsDim3,
258 &solenoidTableInfo.beginningOfSegmentsDim2, &solenoidTableInfo.numberOfSegmentsDim2, &solenoidTableInfo.beginningOfSegmentsDim3,
259 &solenoidTableInfo.numberOfSegmentsDim3, &solenoidTableInfo.segmentId);
260
261 LOGF(info, "Solenoid minZ: %f maxZ: %f", solenoidTableInfo.minZ, solenoidTableInfo.maxZ);
262 LOGF(info, "Solenoid segment count: Z %d P %d R %d", solenoidTableInfo.numberOfDistinctDim1Segments, solenoidTableInfo.numberOfDistinctDim2Segments, solenoidTableInfo.numberOfDistinctDim3Segments);
263
264 const auto parameterizationDipole = std::make_unique<TObjArray>();
265
266 for (auto i = 0; i < numberOfParameterizationDipole; ++i) {
267 parameterizationDipole->Add(chebMap->getParameterDipole(i));
268 }
269
270 chebMap->buildTable(numberOfParameterizationDipole, parameterizationDipole.get(), dipoleTableInfo.numberOfDistinctDim1Segments,
271 dipoleTableInfo.numberOfDistinctDim2Segments, dipoleTableInfo.numberOfDistinctDim3Segments, dipoleTableInfo.minZ, dipoleTableInfo.maxZ,
272 &dipoleTableInfo.coordinatesSegmentsDim1, &dipoleTableInfo.coordinatesSegmentsDim2, &dipoleTableInfo.coordinatesSegmentsDim3,
273 &dipoleTableInfo.beginningOfSegmentsDim2, &dipoleTableInfo.numberOfSegmentsDim2, &dipoleTableInfo.beginningOfSegmentsDim3,
274 &dipoleTableInfo.numberOfSegmentsDim3, &dipoleTableInfo.segmentId);
275
276 LOGF(info, "Dipole minZ: %f maxZ: %f", dipoleTableInfo.minZ, dipoleTableInfo.maxZ);
277 LOGF(info, "Dipole segment count: Z %d Y %d X %d", dipoleTableInfo.numberOfDistinctDim1Segments, dipoleTableInfo.numberOfDistinctDim2Segments, dipoleTableInfo.numberOfDistinctDim3Segments);
278
279 const auto getParameterSolenoid = [chebMap](Int_t i) { return chebMap->getParameterSolenoid(i); };
280 const auto getParameterDipole = [chebMap](Int_t i) { return chebMap->getParameterDipole(i); };
281
282 auto countArraySizes = [](int32_t numberOfParametrization, auto& getParameter) {
283 int32_t TotalRows = 0, TotalColumns = 0, TotalCoefficients = 0;
284 UShort_t MaxChebyshevOrder = 0;
285
286 for (auto i = 0; i < numberOfParametrization; ++i) {
287 const auto param = getParameter(i);
288
289 for (auto j = 0; j < DIMENSIONS; ++j) {
290 const auto calc = param->getChebyshevCalc(j);
291
292 const auto NRows = calc->getNumberOfRows();
293 TotalRows += NRows;
294
295 const auto colsAtRow = calc->getNumberOfColumnsAtRow();
296
297 for (auto row = 0; row < NRows; ++row) {
298 const auto NCols = colsAtRow[row];
299 TotalColumns += NCols;
300
301 const auto col0 = calc->getColAtRowBg()[row];
302
303 for (auto col = 0; col < NCols; ++col) {
304 const auto ncoffs = calc->getCoefficientBound2D0()[col0 + col];
305 MaxChebyshevOrder = std::max(MaxChebyshevOrder, ncoffs);
306 }
307 }
308
309 TotalCoefficients += calc->getNumberOfCoefficients();
310 }
311 }
312
313 return std::make_tuple(TotalRows, TotalColumns, TotalCoefficients, MaxChebyshevOrder);
314 };
315
316 const auto [TotalRowsSolenoid, TotalColumnsSolenoid, TotalCoefficientsSolenoid, MaxChebyshevOrderSolenoid] = countArraySizes(numberOfParameterizationSolenoid, getParameterSolenoid);
317 const auto [TotalRowsDipole, TotalColumnsDipole, TotalCoefficientsDipole, MaxChebyshevOrderDipole] = countArraySizes(numberOfParameterizationDipole, getParameterDipole);
318
319 LOGF(info, "Solenoid Params: %d Rows %d Columns %d Coefficients %d MaxChebOrder: %d", numberOfParameterizationSolenoid, TotalRowsSolenoid, TotalColumnsSolenoid, TotalCoefficientsSolenoid, MaxChebyshevOrderSolenoid);
320 LOGF(info, "Dipole Params: %d Rows %d Columns %d Coefficients %d MaxChebOrder: %d", numberOfParameterizationDipole, TotalRowsDipole, TotalColumnsDipole, TotalCoefficientsDipole, MaxChebyshevOrderDipole);
321
322 bool spaceOk = true;
323 std::string reason;
324
325 if (solenoidTableInfo.numberOfDistinctDim1Segments > MAX_SOLENOID_Z_SEGMENTS) {
326 spaceOk = false;
327 reason = "Solenoid Z segment";
328 } else if (solenoidTableInfo.numberOfDistinctDim2Segments > MAX_SOLENOID_P_SEGMENTS) {
329 spaceOk = false;
330 reason = "Solenoid P segment";
331 } else if (solenoidTableInfo.numberOfDistinctDim3Segments > MAX_SOLENOID_R_SEGMENTS) {
332 spaceOk = false;
333 reason = "Solenoid R segment";
334 } else if (dipoleTableInfo.numberOfDistinctDim1Segments > MAX_DIPOLE_Z_SEGMENTS) {
335 spaceOk = false;
336 reason = "Dipole Z Segment";
337 } else if (dipoleTableInfo.numberOfDistinctDim2Segments > MAX_DIPOLE_Y_SEGMENTS) {
338 spaceOk = false;
339 reason = "Dipole Y Segment";
340 } else if (dipoleTableInfo.numberOfDistinctDim3Segments > MAX_DIPOLE_X_SEGMENTS) {
341 spaceOk = false;
342 reason = "Dipole X Segment";
343 } else if (TotalRowsSolenoid > MAX_SOLENOID_ROWS) {
344 spaceOk = false;
345 reason = "Solenoid Rows";
346 } else if (TotalColumnsSolenoid > MAX_SOLENOID_COLUMNS) {
347 spaceOk = false;
348 reason = "Solenoid Columns";
349 } else if (TotalCoefficientsSolenoid > MAX_SOLENOID_COEFFICIENTS) {
350 spaceOk = false;
351 reason = "Solenoid Coefficients";
352 } else if (TotalRowsDipole > MAX_DIPOLE_ROWS) {
353 spaceOk = false;
354 reason = "Dipole Rows";
355 } else if (TotalColumnsDipole > MAX_DIPOLE_COLUMNS) {
356 spaceOk = false;
357 reason = "Dipole Columns";
358 } else if (TotalCoefficientsDipole > MAX_DIPOLE_COEFFICIENTS) {
359 spaceOk = false;
360 reason = "Dipole Coefficients";
361 } else if (std::max(MaxChebyshevOrderSolenoid, MaxChebyshevOrderDipole) > MAX_CHEBYSHEV_ORDER) {
362 spaceOk = false;
363 reason = "Chebyshev Polynomial order";
364 }
365
366 if (!spaceOk) {
367 GPUError("Model has too large %s to fit in the designated uniform", reason);
368 return 1;
369 }
370
371 auto loadSegments = [](const auto& info, auto& segments) {
372 std::copy(info.coordinatesSegmentsDim1, info.coordinatesSegmentsDim1 + info.numberOfDistinctDim1Segments, segments.SegDim1);
373
374 std::copy(info.beginningOfSegmentsDim2, info.beginningOfSegmentsDim2 + info.numberOfDistinctDim1Segments, segments.BegSegDim2);
375 std::copy(info.numberOfSegmentsDim2, info.numberOfSegmentsDim2 + info.numberOfDistinctDim1Segments, segments.NSegDim2);
376
377 std::copy(info.coordinatesSegmentsDim2, info.coordinatesSegmentsDim2 + info.numberOfDistinctDim2Segments, segments.SegDim2);
378
379 std::copy(info.beginningOfSegmentsDim3, info.beginningOfSegmentsDim3 + info.numberOfDistinctDim2Segments, segments.BegSegDim3);
380 std::copy(info.numberOfSegmentsDim3, info.numberOfSegmentsDim3 + info.numberOfDistinctDim2Segments, segments.NSegDim3);
381 std::copy(info.coordinatesSegmentsDim3, info.coordinatesSegmentsDim3 + info.numberOfDistinctDim3Segments, segments.SegDim3);
382
383 std::copy(info.segmentId, info.segmentId + info.numberOfDistinctDim3Segments, segments.SegID);
384 };
385
386 mSolenoidSegments = std::make_unique<SolenoidSegmentsUniform>();
387 loadSegments(solenoidTableInfo, *mSolenoidSegments);
388
389 mDipoleSegments = std::make_unique<DipoleSegmentsUniform>();
390 loadSegments(dipoleTableInfo, *mDipoleSegments);
391
392 auto initParametrization = [](int32_t numberOfParametrization, auto& getParameter, auto& parametrizationUniform) {
393 int32_t ColsAtRowOffset = 0, CofsAtRowOffset = 0, CofsAtColOffset = 0, Coeffs = 0;
394
395 for (auto i = 0; i < numberOfParametrization; ++i) {
396 const auto param = getParameter(i);
397 std::copy(param->getBoundaryMappingOffset(), param->getBoundaryMappingOffset() + DIMENSIONS, &parametrizationUniform->BOffsets[i * DIMENSIONS]);
398 std::copy(param->getBoundaryMappingScale(), param->getBoundaryMappingScale() + DIMENSIONS, &parametrizationUniform->BScales[i * DIMENSIONS]);
399 std::copy(param->getBoundMin(), param->getBoundMin() + DIMENSIONS, &parametrizationUniform->BMin[i * DIMENSIONS]);
400 std::copy(param->getBoundMax(), param->getBoundMax() + DIMENSIONS, &parametrizationUniform->BMax[i * DIMENSIONS]);
401
402 for (auto j = 0; j < DIMENSIONS; ++j) {
403 const auto calc = param->getChebyshevCalc(j);
404
405 const auto NRows = calc->getNumberOfRows();
406
407 parametrizationUniform->NRows[i * DIMENSIONS + j] = NRows;
408 parametrizationUniform->ColsAtRowOffset[i * DIMENSIONS + j] = ColsAtRowOffset;
409 parametrizationUniform->CofsAtRowOffset[i * DIMENSIONS + j] = CofsAtRowOffset;
410
411 const auto colsAtRow = calc->getNumberOfColumnsAtRow();
412
413 for (auto row = 0; row < NRows; ++row) {
414 const auto NCols = colsAtRow[row];
415 parametrizationUniform->NColsAtRow[ColsAtRowOffset + row] = NCols;
416 parametrizationUniform->CofsAtColOffset[ColsAtRowOffset + row] = CofsAtColOffset;
417
418 const auto col0 = calc->getColAtRowBg()[row];
419
420 for (auto col = 0; col < NCols; ++col) {
421 const auto ncoffs = calc->getCoefficientBound2D0()[col0 + col];
422 const auto offset = calc->getCoefficientBound2D1()[col0 + col];
423
424 parametrizationUniform->NCofsAtCol[CofsAtColOffset + col] = ncoffs;
425 parametrizationUniform->AtColCoefOffset[CofsAtColOffset + col] = offset;
426 }
427 CofsAtColOffset += NCols;
428 }
429
430 ColsAtRowOffset += NRows;
431 CofsAtRowOffset += calc->getNumberOfCoefficients();
432
433 std::copy(calc->getCoefficients(), calc->getCoefficients() + calc->getNumberOfCoefficients(), &parametrizationUniform->Coeffs[Coeffs]);
434
435 Coeffs += calc->getNumberOfCoefficients();
436 }
437 }
438
439 return std::make_tuple(ColsAtRowOffset, CofsAtColOffset, Coeffs);
440 };
441
442 mSolenoidParameterization = std::make_unique<SolenoidParameterizationUniform>();
443 mDipoleParameterization = std::make_unique<DipoleParameterizationUniform>();
444
445 const auto [SRows, SCols, SCoeffs] = initParametrization(numberOfParameterizationSolenoid, getParameterSolenoid, mSolenoidParameterization);
446 const auto [DRows, DCols, DCoeffs] = initParametrization(numberOfParameterizationDipole, getParameterDipole, mDipoleParameterization);
447
448 assert(TotalRowsSolenoid == SRows);
449 assert(TotalColumnsSolenoid == SCols);
450 assert(TotalCoefficientsSolenoid == SCoeffs);
451 assert(TotalRowsDipole == DRows);
452 assert(TotalColumnsDipole == DCols);
453 assert(TotalCoefficientsDipole == DCoeffs);
454
455 mSolenoidSegments->MinZ = solenoidTableInfo.minZ;
456 mSolenoidSegments->MaxZ = solenoidTableInfo.maxZ;
457 mSolenoidSegments->MultiplicativeFactor = field->getFactorSolenoid();
458 mSolenoidSegments->ZSegments = solenoidTableInfo.numberOfDistinctDim1Segments;
459
460 mDipoleSegments->MinZ = dipoleTableInfo.minZ;
461 mDipoleSegments->MaxZ = dipoleTableInfo.maxZ;
462 mDipoleSegments->MultiplicativeFactor = field->getFactorDipole();
463 mDipoleSegments->ZSegments = dipoleTableInfo.numberOfDistinctDim1Segments;
464
465 mSolSegDim1 = solenoidTableInfo.numberOfDistinctDim1Segments;
466 mSolSegDim2 = solenoidTableInfo.numberOfDistinctDim2Segments;
467 mSolSegDim3 = solenoidTableInfo.numberOfDistinctDim3Segments;
468
469 mSolParametrizations = numberOfParameterizationSolenoid;
470 mSolRows = TotalRowsSolenoid;
471 mSolColumns = TotalColumnsSolenoid;
472 mSolCoefficients = TotalCoefficientsSolenoid;
473
474 mDipSegDim1 = dipoleTableInfo.numberOfDistinctDim1Segments;
475 mDipSegDim2 = dipoleTableInfo.numberOfDistinctDim2Segments;
476 mDipSegDim3 = dipoleTableInfo.numberOfDistinctDim3Segments;
477
478 mDipParametrizations = numberOfParameterizationDipole;
479 mDipRows = TotalRowsDipole;
480 mDipColumns = TotalColumnsDipole;
481 mDipCoefficients = TotalCoefficientsDipole;
482
483 return 0;
484}
485#endif
Definition of the GeometryManager class.
int32_t i
std::tuple< std::size_t, std::size_t, std::size_t, std::size_t > loadParams(std::ifstream &file, GPUDisplayMagneticField::ParametrizationUniform< MAX_PARAMETERIZATIONS, MAX_ROWS, MAX_COLUMNS, MAX_COEFFICIENTS > &parametrizations)
std::tuple< std::size_t, std::size_t, std::size_t > loadSegments(std::ifstream &file, GPUDisplayMagneticField::SegmentsUniform< MAX_DIM1_SEGMENTS, MAX_DIM2_SEGMENTS, MAX_DIM3_SEGMENTS > &segments)
Header of the General Run Parameters object.
uint32_t j
Definition RawData.h:0
uint32_t col
Definition RawData.h:4
static void loadGeometry(std::string_view geomFilePath="", bool applyMisalignment=false, bool preferAlignedFile=true)
static int initFieldFromGRP(const o2::parameters::GRPMagField *grp, bool verbose=false)
Double_t getFactorDipole() const
Return the sign*scale of the current in the Dipole according to sPolarityConventionthe.
Double_t getFactorSolenoid() const
Returns the sign*scale of the current in the Dipole according to sPolarityConventionthe.
MagneticWrapperChebyshev * getMeasuredMap() const
std::unique_ptr< RenderConstantsUniform > mRenderConstantsUniform
std::unique_ptr< SolenoidSegmentsUniform > mSolenoidSegments
static constexpr std::size_t MAX_SOLENOID_R_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_ROWS
static constexpr std::size_t MAX_CHEBYSHEV_ORDER
static constexpr std::size_t MAX_SOLENOID_COEFFICIENTS
std::unique_ptr< DipoleParameterizationUniform > mDipoleParameterization
static constexpr std::size_t MAX_DIPOLE_Y_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_PARAMETERIZATIONS
static constexpr std::size_t MAX_DIPOLE_X_SEGMENTS
static constexpr std::size_t DIMENSIONS
static constexpr std::size_t MAX_DIPOLE_Z_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_COLUMNS
static constexpr std::size_t MAX_SOLENOID_COLUMNS
static constexpr std::size_t MAX_SOLENOID_P_SEGMENTS
std::unique_ptr< SolenoidParameterizationUniform > mSolenoidParameterization
static constexpr std::size_t MAX_SOLENOID_Z_SEGMENTS
static constexpr std::size_t MAX_SOLENOID_PARAMETERIZATIONS
static constexpr std::size_t MAX_DIPOLE_COEFFICIENTS
std::unique_ptr< DipoleSegmentsUniform > mDipoleSegments
static constexpr std::size_t MAX_SOLENOID_ROWS
static GRPObject * loadFrom(const std::string &grpFileName="")
GLint GLsizei count
Definition glcorearb.h:399
GLintptr offset
Definition glcorearb.h:660
GLuint segments
Definition glcorearb.h:4946
GLenum GLfloat param
Definition glcorearb.h:271
GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat maxZ
Definition glcorearb.h:2910
GLfloat GLfloat minZ
Definition glcorearb.h:2910
std::vector< int > row