19#include <TMethodCall.h>
29#include <fairlogger/Logger.h>
35const Float_t Chebyshev3D::sMinimumPrecision = 1.e-12f;
38 : mOutputArrayDimension(0),
39 mPrecision(sMinimumPrecision),
40 mChebyshevParameter(1),
42 mTemporaryUserResults(nullptr),
43 mTemporaryChebyshevGrid(nullptr),
44 mUserFunctionName(
""),
48 for (
int i = 3;
i--;) {
49 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] =
50 mTemporaryCoefficient[
i] = 0;
51 mNumberOfPoints[
i] = 0;
52 mTemporaryChebyshevGridOffs[
i] = 0;
58 mOutputArrayDimension(
src.mOutputArrayDimension),
59 mPrecision(
src.mPrecision),
60 mChebyshevParameter(1),
61 mMaxCoefficients(
src.mMaxCoefficients),
62 mTemporaryUserResults(nullptr),
63 mTemporaryChebyshevGrid(nullptr),
64 mUserFunctionName(
src.mUserFunctionName),
68 for (
int i = 3;
i--;) {
69 mMinBoundaries[
i] =
src.mMinBoundaries[
i];
70 mMaxBoundaries[
i] =
src.mMaxBoundaries[
i];
71 mBoundaryMappingScale[
i] =
src.mBoundaryMappingScale[
i];
72 mBoundaryMappingOffset[
i] =
src.mBoundaryMappingOffset[
i];
73 mNumberOfPoints[
i] =
src.mNumberOfPoints[
i];
74 mTemporaryChebyshevGridOffs[
i] =
src.mTemporaryChebyshevGridOffs[
i];
75 mTemporaryCoefficient[
i] = 0;
77 for (
int i = 0;
i < mOutputArrayDimension;
i++) {
86 : mOutputArrayDimension(0),
88 mChebyshevParameter(1),
90 mTemporaryUserResults(nullptr),
91 mTemporaryChebyshevGrid(nullptr),
92 mUserFunctionName(
""),
96 for (
int i = 3;
i--;) {
97 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
98 mNumberOfPoints[
i] = 0;
99 mTemporaryChebyshevGridOffs[
i] = 0;
100 mTemporaryCoefficient[
i] = 0;
106 : mOutputArrayDimension(0),
108 mChebyshevParameter(1),
110 mTemporaryUserResults(nullptr),
111 mTemporaryChebyshevGrid(nullptr),
112 mUserFunctionName(
""),
116 for (
int i = 3;
i--;) {
117 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
118 mNumberOfPoints[
i] = 0;
119 mTemporaryChebyshevGridOffs[
i] = 0;
120 mTemporaryCoefficient[
i] = 0;
125#ifdef _INC_CREATION_Chebyshev3D_
128 : TNamed(funName, funName),
129 mOutputArrayDimension(0),
130 mPrecision(TMath::Max(sMinimumPrecision, prec)),
131 mChebyshevParameter(1),
133 mTemporaryUserResults(nullptr),
134 mTemporaryChebyshevGrid(nullptr),
135 mUserFunctionName(
""),
139 LOG(error) <<
"Chebyshev3D: Requested output dimension is " << mOutputArrayDimension <<
"\nStop\n";
142 for (
int i = 3;
i--;) {
143 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
144 mNumberOfPoints[
i] = 0;
145 mTemporaryChebyshevGridOffs[
i] = 0.;
146 mTemporaryCoefficient[
i] = 0;
151 setuserFunction(funName);
156#ifdef _INC_CREATION_Chebyshev3D_
159 : mOutputArrayDimension(0),
160 mPrecision(TMath::
Max(sMinimumPrecision, prec)),
161 mChebyshevParameter(1),
163 mTemporaryUserResults(nullptr),
164 mTemporaryChebyshevGrid(nullptr),
165 mUserFunctionName(
""),
169 LOG(error) <<
"Chebyshev3D: Requested output dimension is " << mOutputArrayDimension <<
" \nStop\n";
172 for (
int i = 3;
i--;) {
173 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
174 mNumberOfPoints[
i] = 0;
175 mTemporaryChebyshevGridOffs[
i] = 0.;
176 mTemporaryCoefficient[
i] = 0;
181 setuserFunction(
ptr);
186#ifdef _INC_CREATION_Chebyshev3D_
188 const Int_t* npX,
const Int_t* npY,
const Int_t* npZ,
Float_t prec,
const Float_t* precD)
189 : mOutputArrayDimension(0),
190 mPrecision(TMath::
Max(sMinimumPrecision, prec)),
191 mChebyshevParameter(1),
193 mTemporaryUserResults(nullptr),
194 mTemporaryChebyshevGrid(nullptr),
195 mUserFunctionName(
""),
199 LOG(error) <<
"Chebyshev3D: Requested output dimension is " << mOutputArrayDimension <<
"%d\nStop\n";
202 for (
int i = 3;
i--;) {
203 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
204 mNumberOfPoints[
i] = 0;
205 mTemporaryChebyshevGridOffs[
i] = 0.;
206 mTemporaryCoefficient[
i] = 0;
210 setuserFunction(
ptr);
221#ifdef _INC_CREATION_Chebyshev3D_
224 : mOutputArrayDimension(0),
225 mPrecision(TMath::
Max(sMinimumPrecision, prec)),
226 mChebyshevParameter(1),
228 mTemporaryUserResults(nullptr),
229 mTemporaryChebyshevGrid(nullptr),
230 mUserFunctionName(
""),
234 LOG(error) <<
"Chebyshev3D: This constructor works only for 3D fits, " << mOutputArrayDimension <<
"D fit was requested\n";
238 LOG(error) <<
"Chebyshev3D: Requested output dimension is " << mOutputArrayDimension <<
"\nStop\n";
241 for (
int i = 3;
i--;) {
242 mMinBoundaries[
i] = mMaxBoundaries[
i] = mBoundaryMappingScale[
i] = mBoundaryMappingOffset[
i] = 0;
243 mNumberOfPoints[
i] = 0;
244 mTemporaryChebyshevGridOffs[
i] = 0.;
245 mTemporaryCoefficient[
i] = 0;
249 setuserFunction(
ptr);
253 estimateNumberOfPoints(prec, gridNC);
254 defineGrid(gridNC[0]);
256 defineGrid(gridNC[1]);
258 defineGrid(gridNC[2]);
269 mOutputArrayDimension = rhs.mOutputArrayDimension;
270 mPrecision = rhs.mPrecision;
271 mMaxCoefficients = rhs.mMaxCoefficients;
272 mUserFunctionName = rhs.mUserFunctionName;
273 mUserMacro =
nullptr;
274 for (
int i = 3;
i--;) {
275 mMinBoundaries[
i] = rhs.mMinBoundaries[
i];
276 mMaxBoundaries[
i] = rhs.mMaxBoundaries[
i];
277 mBoundaryMappingScale[
i] = rhs.mBoundaryMappingScale[
i];
278 mBoundaryMappingOffset[
i] = rhs.mBoundaryMappingOffset[
i];
279 mNumberOfPoints[
i] = rhs.mNumberOfPoints[
i];
281 for (
int i = 0;
i < mOutputArrayDimension;
i++) {
294 if (mTemporaryUserResults) {
295 delete[] mTemporaryUserResults;
296 mTemporaryUserResults =
nullptr;
298 if (mTemporaryChebyshevGrid) {
299 delete[] mTemporaryChebyshevGrid;
300 mTemporaryChebyshevGrid =
nullptr;
304 mUserMacro =
nullptr;
306 mChebyshevParameter.SetOwner(kTRUE);
307 mChebyshevParameter.Delete();
313 printf(
"%s: Chebyshev parameterization for 3D->%dD function. Precision: %e\n", GetName(), mOutputArrayDimension,
315 printf(
"Region of validity: [%+.5e:%+.5e] [%+.5e:%+.5e] [%+.5e:%+.5e]\n", mMinBoundaries[0], mMaxBoundaries[0],
316 mMinBoundaries[1], mMaxBoundaries[1], mMinBoundaries[2], mMaxBoundaries[2]);
319 if (opts.Contains(
"l")) {
320 for (
int i = 0;
i < mOutputArrayDimension;
i++) {
321 printf(
"Output dimension %d:\n",
i + 1);
330 for (
int i = 3;
i--;) {
331 mMinBoundaries[
i] = bmin[
i];
332 mMaxBoundaries[
i] = bmax[
i];
333 mBoundaryMappingScale[
i] = bmax[
i] - bmin[
i];
334 if (mBoundaryMappingScale[
i] <= 0) {
335 LOG(fatal) <<
"Boundaries for " <<
i <<
"-th dimension are not increasing: "
336 << mMinBoundaries[
i] <<
" " << mMaxBoundaries[
i] <<
"\nStop\n";
338 mBoundaryMappingOffset[
i] = bmin[
i] + mBoundaryMappingScale[
i] / 2.0;
339 mBoundaryMappingScale[
i] = 2. / mBoundaryMappingScale[
i];
343#ifdef _INC_CREATION_Chebyshev3D_
346void (*gUsrFunChebyshev3D)(
float*,
float*);
348void Chebyshev3D::evaluateUserFunction()
351 if (gUsrFunChebyshev3D) {
352 gUsrFunChebyshev3D(mTemporaryCoefficient, mTemporaryUserResults);
354 mUserMacro->Execute();
358void Chebyshev3D::setuserFunction(
const char*
name)
361 gUsrFunChebyshev3D =
nullptr;
362 mUserFunctionName =
name;
363 gSystem->ExpandPathName(mUserFunctionName);
369 TString tmpst = mUserFunctionName;
372 if (gROOT->LoadMacro(tmpst.Data())) {
373 LOG(error) <<
"SetUsrFunction: Failed to load user function from " <<
name <<
" \nStop\n";
377 mUserMacro =
new TMethodCall();
378 tmpst = tmpst.Data() + tmpst.Last(
'/') + 1;
379 int dot = tmpst.Last(
'.');
384 mUserMacro->InitWithPrototype(tmpst.Data(),
"Float_t *,Float_t *");
386 args[0] = (
long)mTemporaryCoefficient;
387 args[1] = (
long)mTemporaryUserResults;
388 mUserMacro->SetParamPtrs(args);
392#ifdef _INC_CREATION_Chebyshev3D_
393void Chebyshev3D::setuserFunction(
void (*
ptr)(
float*,
float*))
399 mUserMacro =
nullptr;
400 mUserFunctionName =
"";
401 gUsrFunChebyshev3D =
ptr;
405#ifdef _INC_CREATION_Chebyshev3D_
409 for (
int i = 3;
i--;) {
410 mTemporaryCoefficient[
i] =
x[
i];
413 if (gUsrFunChebyshev3D) {
414 gUsrFunChebyshev3D(mTemporaryCoefficient, mTemporaryUserResults);
416 mUserMacro->Execute();
419 for (
int i = mOutputArrayDimension;
i--;) {
420 res[
i] = mTemporaryUserResults[
i];
425#ifdef _INC_CREATION_Chebyshev3D_
426Int_t Chebyshev3D::calculateChebyshevCoefficients(
const Float_t* funval,
int np,
Float_t* outCoefs,
Float_t prec)
431 for (
int ic = 0; ic < np; ic++) {
433 for (
int ir = 0;
ir < np;
ir++) {
434 float rt = TMath::Cos(ic * (
ir + 0.5) * TMath::Pi() / np);
435 sm += funval[
ir] * rt;
437 outCoefs[ic] =
Float_t(sm * ((ic == 0) ? 1. / np : 2. / np));
446 for (cfMax = np; cfMax--;) {
447 sm += TMath::Abs(outCoefs[cfMax]);
459#ifdef _INC_CREATION_Chebyshev3D_
460void Chebyshev3D::defineGrid(
const Int_t* npoints)
463 const int kMinPoints = 1;
465 mMaxCoefficients = 1;
466 for (
int id = 3;
id--;) {
467 mNumberOfPoints[
id] = npoints[
id];
468 if (mNumberOfPoints[
id] < kMinPoints) {
469 LOG(error) <<
"DefineGrid: at " <<
id <<
"-th dimension " << mNumberOfPoints[
id] <<
" point is requested, at least " << kMinPoints <<
" is needed\nStop\n";
472 ntot += mNumberOfPoints[
id];
473 mMaxCoefficients *= mNumberOfPoints[
id];
475 printf(
"Computing Chebyshev nodes on [%2d/%2d/%2d] grid\n", npoints[0], npoints[1], npoints[2]);
476 if (mTemporaryChebyshevGrid) {
477 delete[] mTemporaryChebyshevGrid;
479 mTemporaryChebyshevGrid =
new Float_t[ntot];
482 for (
int id = 3;
id--;) {
483 int np = mNumberOfPoints[
id];
484 mTemporaryChebyshevGridOffs[
id] = curp;
485 for (
int ip = 0; ip < np; ip++) {
486 Float_t x = TMath::Cos(TMath::Pi() * (ip + 0.5) / np);
493#ifdef _INC_CREATION_Chebyshev3D_
494Int_t Chebyshev3D::chebyshevFit()
498 for (
int i = mOutputArrayDimension;
i--;) {
499 ir += chebyshevFit(
i);
505#ifdef _INC_CREATION_Chebyshev3D_
506Int_t Chebyshev3D::chebyshevFit(
int dmOut)
510 for (
int i = 0;
i < 3;
i++) {
511 if (maxDim < mNumberOfPoints[
i]) {
512 maxDim = mNumberOfPoints[
i];
515 auto* fvals =
new Float_t[mNumberOfPoints[0]];
516 auto* tmpCoef3D =
new Float_t[mNumberOfPoints[0] * mNumberOfPoints[1] * mNumberOfPoints[2]];
517 auto* tmpCoef2D =
new Float_t[mNumberOfPoints[0] * mNumberOfPoints[1]];
518 auto* tmpCoef1D =
new Float_t[maxDim];
523 printf(
"Dim%d : 00.00%% Done", dmOut);
528 if (prec < sMinimumPrecision) {
533 float ncals2count = mNumberOfPoints[2] * mNumberOfPoints[1] * mNumberOfPoints[0];
536 float fracStep = 0.001;
538 for (
int id2 = mNumberOfPoints[2]; id2--;) {
539 mTemporaryCoefficient[2] = mTemporaryChebyshevGrid[mTemporaryChebyshevGridOffs[2] + id2];
541 for (
int id1 = mNumberOfPoints[1]; id1--;) {
542 mTemporaryCoefficient[1] = mTemporaryChebyshevGrid[mTemporaryChebyshevGridOffs[1] + id1];
544 for (
int id0 = mNumberOfPoints[0]; id0--;) {
545 mTemporaryCoefficient[0] = mTemporaryChebyshevGrid[mTemporaryChebyshevGridOffs[0] + id0];
546 evaluateUserFunction();
547 fvals[id0] = mTemporaryUserResults[dmOut];
548 float fr = (++ncals) / ncals2count;
549 if (fr - frac >= fracStep) {
551 printf(
"\b\b\b\b\b\b\b\b\b\b\b");
552 printf(
"%05.2f%% Done", fr * 100);
556 int nc = calculateChebyshevCoefficients(fvals, mNumberOfPoints[0], tmpCoef1D, prec);
557 for (
int id0 = mNumberOfPoints[0]; id0--;) {
558 tmpCoef2D[id1 + id0 * mNumberOfPoints[1]] = tmpCoef1D[id0];
565 for (
int id0 = mNumberOfPoints[0]; id0--;) {
566 calculateChebyshevCoefficients(tmpCoef2D + id0 * mNumberOfPoints[1], mNumberOfPoints[1], tmpCoef1D, -1);
567 for (
int id1 = mNumberOfPoints[1]; id1--;) {
568 tmpCoef3D[id2 + mNumberOfPoints[2] * (id1 + id0 * mNumberOfPoints[1])] = tmpCoef1D[id1];
573 for (
int id0 = mNumberOfPoints[0]; id0--;) {
574 for (
int id1 = mNumberOfPoints[1]; id1--;) {
575 calculateChebyshevCoefficients(tmpCoef3D + mNumberOfPoints[2] * (id1 + id0 * mNumberOfPoints[1]),
576 mNumberOfPoints[2], tmpCoef1D, -1);
577 for (
int id2 = mNumberOfPoints[2]; id2--;) {
578 tmpCoef3D[id2 + mNumberOfPoints[2] * (id1 + id0 * mNumberOfPoints[1])] = tmpCoef1D[id2];
585 auto* tmpCoefSurf =
new UShort_t[mNumberOfPoints[0] * mNumberOfPoints[1]];
586 for (
int id0 = mNumberOfPoints[0]; id0--;) {
587 for (
int id1 = mNumberOfPoints[1]; id1--;) {
588 tmpCoefSurf[id1 + id0 * mNumberOfPoints[1]] = 0;
592 for (
int id0 = mNumberOfPoints[0]; id0--;) {
593 for (
int id1 = mNumberOfPoints[1]; id1--;) {
594 for (
int id2 = mNumberOfPoints[2]; id2--;) {
595 int id = id2 + mNumberOfPoints[2] * (id1 + id0 * mNumberOfPoints[1]);
596 Float_t cfa = TMath::Abs(tmpCoef3D[
id]);
607 tmpCoefSurf[id1 + id0 * mNumberOfPoints[1]] = id2 + 1;
626 int nRows = mNumberOfPoints[0];
627 auto* tmpCols =
new UShort_t[
nRows];
628 for (
int id0 = mNumberOfPoints[0]; id0--;) {
629 int id1 = mNumberOfPoints[1];
630 while (id1 > 0 && tmpCoefSurf[(id1 - 1) + id0 * mNumberOfPoints[1]] == 0) {
636 for (
int id0 = nRows; id0--;) {
637 if (tmpCols[id0] > 0) {
647 int nElemBound2D = 0;
648 for (
int id0 = 0; id0 <
nRows; id0++) {
649 nColsAtRow[id0] = tmpCols[id0];
650 colAtRowBg[id0] = nElemBound2D;
651 nElemBound2D += tmpCols[id0];
652 if (nCols < nColsAtRow[id0]) {
653 nCols = nColsAtRow[id0];
664 mMaxCoefficients = 0;
665 for (
int id0 = 0; id0 <
nRows; id0++) {
666 int nCLoc = nColsAtRow[id0];
667 int col0 = colAtRowBg[id0];
668 for (
int id1 = 0; id1 < nCLoc; id1++) {
669 coefBound2D0[col0 + id1] =
670 tmpCoefSurf[id1 + id0 * mNumberOfPoints[1]];
671 coefBound2D1[col0 + id1] = mMaxCoefficients;
672 mMaxCoefficients += coefBound2D0[col0 + id1];
680 for (
int id0 = 0; id0 <
nRows; id0++) {
681 int ncLoc = nColsAtRow[id0];
682 int col0 = colAtRowBg[id0];
683 for (
int id1 = 0; id1 < ncLoc; id1++) {
684 int ncf2 = coefBound2D0[col0 + id1];
685 for (
int id2 = 0; id2 < ncf2; id2++) {
686 coefs[
count++] = tmpCoef3D[id2 + mNumberOfPoints[2] * (id1 + id0 * mNumberOfPoints[1])];
699 delete[] tmpCoefSurf;
705 printf(
"\b\b\b\b\b\b\b\b\b\b\b\b");
706 printf(
"100.00%% Done\n");
711#ifdef _INC_CREATION_Chebyshev3D_
712void Chebyshev3D::saveData(
const char* outfile, Bool_t append)
const
715 TString strf = outfile;
716 gSystem->ExpandPathName(strf);
717 FILE*
stream = fopen(strf, append ?
"a" :
"w");
723#ifdef _INC_CREATION_Chebyshev3D_
724void Chebyshev3D::saveData(FILE*
stream)
const
727 fprintf(
stream,
"\n# These are automatically generated data for the Chebyshev interpolation of 3D->%dD function\n",
728 mOutputArrayDimension);
729 fprintf(
stream,
"#\nSTART %s\n", GetName());
730 fprintf(
stream,
"# Dimensionality of the output\n%d\n", mOutputArrayDimension);
731 fprintf(
stream,
"# Interpolation abs. precision\n%+.8e\n", mPrecision);
733 fprintf(
stream,
"# Lower boundaries of interpolation region\n");
734 for (
int i = 0;
i < 3;
i++) {
735 fprintf(
stream,
"%+.8e\n", mMinBoundaries[
i]);
737 fprintf(
stream,
"# Upper boundaries of interpolation region\n");
738 for (
int i = 0;
i < 3;
i++) {
739 fprintf(
stream,
"%+.8e\n", mMaxBoundaries[
i]);
741 fprintf(
stream,
"# Parameterization for each output dimension follows:\n");
743 for (
int i = 0;
i < mOutputArrayDimension;
i++) {
746 fprintf(
stream,
"#\nEND %s\n#\n", GetName());
750#ifdef _INC_CREATION_Chebyshev3D_
751void Chebyshev3D::invertSign()
754 for (
int i = mOutputArrayDimension;
i--;) {
758 for (
int j = ncf;
j--;) {
759 coefs[
j] = -coefs[
j];
768 TString strf = inpFile;
769 gSystem->ExpandPathName(strf);
770 FILE*
stream = fopen(strf.Data(),
"r");
779 LOG(fatal) <<
"No stream provided.\nStop";
784 if (!buffs.BeginsWith(
"START")) {
785 LOG(fatal) << R
"(Expected: "START <fit_name>", found ")" << buffs.Data() << "\"\nStop\n";
787 SetName(buffs.Data() + buffs.First(
' ') + 1);
790 mOutputArrayDimension = buffs.Atoi();
791 if (mOutputArrayDimension < 1) {
792 LOG(fatal) << R
"(Expected: '<number_of_output_dimensions>', found ")" << buffs.Data() << "\"\nStop\n";
798 mPrecision = buffs.Atof();
799 if (mPrecision <= 0) {
800 LOG(fatal) << R
"(Expected: '<abs.precision>', found ")" << buffs.Data() << "\"\nStop\n";
803 for (
int i = 0;
i < 3;
i++) {
805 mMinBoundaries[
i] = buffs.Atof();
808 for (
int i = 0;
i < 3;
i++) {
810 mMaxBoundaries[
i] = buffs.Atof();
815 for (
int i = 0;
i < mOutputArrayDimension;
i++) {
821 if (!buffs.BeginsWith(
"END") || !buffs.Contains(GetName())) {
822 LOG(fatal) << R
"(Expected "END )" << GetName() << R"(", found ")" << buffs.Data() << "\".\nStop\n";
829 mOutputArrayDimension = d;
830 if (mTemporaryUserResults) {
831 delete mTemporaryUserResults;
833 mTemporaryUserResults =
new Float_t[mOutputArrayDimension];
834 mChebyshevParameter.Delete();
835 for (
int i = 0;
i < d;
i++) {
837 clc->setPrecision(prec && prec[
i] > sMinimumPrecision ? prec[
i] : mPrecision);
845 if (id < 0 || id > 2) {
846 printf(
"Maximum 3 dimensions are supported\n");
849 mMinBoundaries[
id] += dif;
850 mMaxBoundaries[
id] += dif;
851 mBoundaryMappingOffset[
id] += dif;
854#ifdef _INC_CREATION_Chebyshev3D_
855TH1* Chebyshev3D::TestRMS(
int idim,
int npoints, TH1* histo)
861 printf(
"No user function is set\n");
865 histo =
new TH1D(GetName(),
"Control: Function - Parametrization", 100, -2 * mPrecision, 2 * mPrecision);
869 if (prc < sMinimumPrecision) {
873 for (
int ip = npoints; ip--;) {
874 gRandom->RndmArray(3, (
Float_t*)mTemporaryCoefficient);
875 for (
int i = 3;
i--;) {
876 mTemporaryCoefficient[
i] = mMinBoundaries[
i] + mTemporaryCoefficient[
i] * (mMaxBoundaries[
i] - mMinBoundaries[
i]);
878 evaluateUserFunction();
879 Float_t valFun = mTemporaryUserResults[idim];
880 Eval(mTemporaryCoefficient, mTemporaryUserResults);
881 Float_t valPar = mTemporaryUserResults[idim];
882 histo->Fill(valFun - valPar);
888#ifdef _INC_CREATION_Chebyshev3D_
890void Chebyshev3D::estimateNumberOfPoints(
float prec,
int gridBC[3][3], Int_t npd1, Int_t npd2, Int_t npd3)
894 const float kScl[9] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
896 const float sclDim[2] = {0.001, 0.999};
897 const int compDim[3][2] = {{1, 2}, {2, 0}, {0, 1}};
899 Int_t npdTst[3] = {npd1, npd2, npd3};
901 for (
int i = 3;
i--;) {
902 for (
int j = 3;
j--;) {
907 for (
int idim = 0; idim < 3; idim++) {
908 float dimMN = mMinBoundaries[idim] + sclDim[0] * (mMaxBoundaries[idim] - mMinBoundaries[idim]);
909 float dimMX = mMinBoundaries[idim] + sclDim[1] * (mMaxBoundaries[idim] - mMinBoundaries[idim]);
911 int id1 = compDim[idim][0];
912 int id2 = compDim[idim][1];
913 for (
int i1 = 0; i1 < kScp; i1++) {
914 xyz[id1] = mMinBoundaries[id1] + kScl[i1] * (mMaxBoundaries[id1] - mMinBoundaries[id1]);
915 for (
int i2 = 0; i2 < kScp; i2++) {
916 xyz[id2] = mMinBoundaries[id2] + kScl[i2] * (mMaxBoundaries[id2] - mMinBoundaries[id2]);
917 int* npt = getNcNeeded(xyz, idim, dimMN, dimMX, prec, npdTst[idim]);
918 for (
int ib = 0; ib < 3; ib++) {
919 if (npt[ib] > gridBC[ib][idim]) {
920 gridBC[ib][idim] = npt[ib];
1004int* Chebyshev3D::getNcNeeded(
float xyz[3],
int DimVar,
float mn,
float mx,
float prec, Int_t npCheck)
1008 static int retNC[3];
1009 static int npChLast = 0;
1010 static float *gridVal =
nullptr, *coefs =
nullptr;
1014 if (npChLast < npCheck) {
1021 gridVal =
new float[3 * npCheck];
1022 coefs =
new float[3 * npCheck];
1025 float scale = mx - mn;
1026 float offs = mn + scale / 2.0;
1029 for (
int i = 0;
i < 3;
i++) {
1030 mTemporaryCoefficient[
i] = xyz[
i];
1032 for (
int i = 0;
i < npCheck;
i++) {
1033 mTemporaryCoefficient[DimVar] =
1034 TMath::Cos(TMath::Pi() * (
i + 0.5) / npCheck) / scale + offs;
1035 evaluateUserFunction();
1036 for (
int ib = 3; ib--;) {
1037 gridVal[ib * npCheck +
i] = mTemporaryUserResults[ib];
1040 for (
int ib = 0; ib < 3; ib++) {
1042 Chebyshev3D::calculateChebyshevCoefficients(&gridVal[ib * npCheck], npCheck, &coefs[ib * npCheck], prec);
Float_t getPrecision() const
void Print(const Option_t *opt="") const override
Prints info.
UShort_t * getNumberOfColumnsAtRow() const
UShort_t * getColAtRowBg() const
void saveData(const char *outfile, Bool_t append=kFALSE) const
Writes coefficients data to output text file, optionally appending on the end of existing file.
void loadData(FILE *stream)
Loads coefficients from the stream.
UShort_t * getCoefficientBound2D0() const
void initializeElementBound2D(int ne)
Sets maximum number of significant coefficients for given row/column of coefficients 3D matrix.
static void readLine(TString &str, FILE *stream)
Reads single line from the stream, skipping empty and commented lines. EOF is not expected.
Float_t * getCoefficients() const
void initializeRows(int nr)
Sets maximum number of significant rows in the coefficients matrix.
UShort_t * getCoefficientBound2D1() const
void initializeCoefficients(int nc)
Sets total number of significant coefficients.
Int_t getNumberOfCoefficients() const
void initializeColumns(int nc)
Sets maximum number of significant columns in the coefficients matrix.
void prepareBoundaries(const Float_t *bmin, const Float_t *bmax)
void loadData(const char *inpFile)
void Clear(const Option_t *option="") override
Float_t mapToExternal(Float_t x, Int_t d) const
void shiftBound(int id, float dif)
Chebyshev3DCalc * getChebyshevCalc(int i) const
void setDimOut(const int d, const float *prec=nullptr)
void Print(const Option_t *opt="") const override
void Eval(const Float_t *par, Float_t *res)
Evaluates Chebyshev parameterization for 3d->DimOut function.
Chebyshev3D & operator=(const Chebyshev3D &rhs)
GLuint const GLchar * name
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
auto dot(const Vertex< T > &a, const Vertex< T > &b) -> decltype(a.x *b.x)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)