26 : mNumberOfCoefficients(0),
29 mNumberOfElementsBound2D(0),
31 mNumberOfColumnsAtRow(nullptr),
32 mColumnAtRowBeginning(nullptr),
33 mCoefficientBound2D0(nullptr),
34 mCoefficientBound2D1(nullptr),
35 mCoefficients(nullptr),
36 mTemporaryCoefficients2D(nullptr),
37 mTemporaryCoefficients1D(nullptr)
43 mNumberOfCoefficients(
src.mNumberOfCoefficients),
44 mNumberOfRows(
src.mNumberOfRows),
45 mNumberOfColumns(
src.mNumberOfColumns),
46 mNumberOfElementsBound2D(
src.mNumberOfElementsBound2D),
47 mPrecision(
src.mPrecision),
48 mNumberOfColumnsAtRow(nullptr),
49 mColumnAtRowBeginning(nullptr),
50 mCoefficientBound2D0(nullptr),
51 mCoefficientBound2D1(nullptr),
52 mCoefficients(nullptr),
53 mTemporaryCoefficients2D(nullptr),
54 mTemporaryCoefficients1D(nullptr)
56 if (
src.mNumberOfColumnsAtRow) {
57 mNumberOfColumnsAtRow =
new UShort_t[mNumberOfRows];
58 for (
int i = mNumberOfRows;
i--;) {
59 mNumberOfColumnsAtRow[
i] =
src.mNumberOfColumnsAtRow[
i];
62 if (
src.mColumnAtRowBeginning) {
63 mColumnAtRowBeginning =
new UShort_t[mNumberOfRows];
64 for (
int i = mNumberOfRows;
i--;) {
65 mColumnAtRowBeginning[
i] =
src.mColumnAtRowBeginning[
i];
68 if (
src.mCoefficientBound2D0) {
69 mCoefficientBound2D0 =
new UShort_t[mNumberOfElementsBound2D];
70 for (
int i = mNumberOfElementsBound2D;
i--;) {
71 mCoefficientBound2D0[
i] =
src.mCoefficientBound2D0[
i];
74 if (
src.mCoefficientBound2D1) {
75 mCoefficientBound2D1 =
new UShort_t[mNumberOfElementsBound2D];
76 for (
int i = mNumberOfElementsBound2D;
i--;) {
77 mCoefficientBound2D1[
i] =
src.mCoefficientBound2D1[
i];
80 if (
src.mCoefficients) {
81 mCoefficients =
new Float_t[mNumberOfCoefficients];
82 for (
int i = mNumberOfCoefficients;
i--;) {
83 mCoefficients[
i] =
src.mCoefficients[
i];
86 if (
src.mTemporaryCoefficients2D) {
87 mTemporaryCoefficients2D =
new Float_t[mNumberOfColumns];
89 if (
src.mTemporaryCoefficients1D) {
90 mTemporaryCoefficients1D =
new Float_t[mNumberOfRows];
95 : mNumberOfCoefficients(0),
98 mNumberOfElementsBound2D(0),
100 mNumberOfColumnsAtRow(nullptr),
101 mColumnAtRowBeginning(nullptr),
102 mCoefficientBound2D0(nullptr),
103 mCoefficientBound2D1(nullptr),
104 mCoefficients(nullptr),
105 mTemporaryCoefficients2D(nullptr),
106 mTemporaryCoefficients1D(nullptr)
115 SetName(rhs.GetName());
116 SetTitle(rhs.GetTitle());
117 mNumberOfCoefficients = rhs.mNumberOfCoefficients;
118 mNumberOfRows = rhs.mNumberOfRows;
119 mNumberOfColumns = rhs.mNumberOfColumns;
120 mPrecision = rhs.mPrecision;
121 if (rhs.mNumberOfColumnsAtRow) {
122 mNumberOfColumnsAtRow =
new UShort_t[mNumberOfRows];
123 for (
int i = mNumberOfRows;
i--;) {
124 mNumberOfColumnsAtRow[
i] = rhs.mNumberOfColumnsAtRow[
i];
127 if (rhs.mColumnAtRowBeginning) {
128 mColumnAtRowBeginning =
new UShort_t[mNumberOfRows];
129 for (
int i = mNumberOfRows;
i--;) {
130 mColumnAtRowBeginning[
i] = rhs.mColumnAtRowBeginning[
i];
133 if (rhs.mCoefficientBound2D0) {
134 mCoefficientBound2D0 =
new UShort_t[mNumberOfElementsBound2D];
135 for (
int i = mNumberOfElementsBound2D;
i--;) {
136 mCoefficientBound2D0[
i] = rhs.mCoefficientBound2D0[
i];
139 if (rhs.mCoefficientBound2D1) {
140 mCoefficientBound2D1 =
new UShort_t[mNumberOfElementsBound2D];
141 for (
int i = mNumberOfElementsBound2D;
i--;) {
142 mCoefficientBound2D1[
i] = rhs.mCoefficientBound2D1[
i];
145 if (rhs.mCoefficients) {
146 mCoefficients =
new Float_t[mNumberOfCoefficients];
147 for (
int i = mNumberOfCoefficients;
i--;) {
148 mCoefficients[
i] = rhs.mCoefficients[
i];
151 if (rhs.mTemporaryCoefficients2D) {
152 mTemporaryCoefficients2D =
new Float_t[mNumberOfColumns];
154 if (rhs.mTemporaryCoefficients1D) {
155 mTemporaryCoefficients1D =
new Float_t[mNumberOfRows];
163 if (mTemporaryCoefficients2D) {
164 delete[] mTemporaryCoefficients2D;
165 mTemporaryCoefficients2D =
nullptr;
167 if (mTemporaryCoefficients1D) {
168 delete[] mTemporaryCoefficients1D;
169 mTemporaryCoefficients1D =
nullptr;
172 delete[] mCoefficients;
173 mCoefficients =
nullptr;
175 if (mCoefficientBound2D0) {
176 delete[] mCoefficientBound2D0;
177 mCoefficientBound2D0 =
nullptr;
179 if (mCoefficientBound2D1) {
180 delete[] mCoefficientBound2D1;
181 mCoefficientBound2D1 =
nullptr;
183 if (mNumberOfColumnsAtRow) {
184 delete[] mNumberOfColumnsAtRow;
185 mNumberOfColumnsAtRow =
nullptr;
187 if (mColumnAtRowBeginning) {
188 delete[] mColumnAtRowBeginning;
189 mColumnAtRowBeginning =
nullptr;
195 printf(
"Chebyshev parameterization data %s for 3D->1 function, precision: %e\n",
196 GetName(), mPrecision);
198 for (
int i = mNumberOfElementsBound2D;
i--;) {
199 if (mCoefficientBound2D0[
i] > nmax3d) {
200 nmax3d = mCoefficientBound2D0[
i];
203 printf(
"%d coefficients in %dx%dx%d matrix\n", mNumberOfCoefficients, mNumberOfRows, mNumberOfColumns, nmax3d);
209 for (
int id0 = mNumberOfRows; id0--;) {
210 int nCLoc = mNumberOfColumnsAtRow[id0];
212 mTemporaryCoefficients1D[id0] = 0;
216 int col0 = mColumnAtRowBeginning[id0];
217 for (
int id1 = nCLoc; id1--;) {
219 if (!(ncfRC = mCoefficientBound2D0[
id])) {
220 mTemporaryCoefficients2D[id1] = 0;
224 mTemporaryCoefficients2D[id1] =
227 mTemporaryCoefficients2D[id1] =
chebyshevEvaluation1D(par[2], mCoefficients + mCoefficientBound2D1[
id], ncfRC);
242 Bool_t same = dim1 == dim2;
244 for (
int id0 = mNumberOfRows; id0--;) {
245 int nCLoc = mNumberOfColumnsAtRow[id0];
247 mTemporaryCoefficients1D[id0] = 0;
250 int col0 = mColumnAtRowBeginning[id0];
251 for (
int id1 = nCLoc; id1--;) {
253 if (!(ncfRC = mCoefficientBound2D0[
id])) {
254 mTemporaryCoefficients2D[id1] = 0;
257 if (dim1 == 2 || dim2 == 2) {
258 mTemporaryCoefficients2D[id1] =
262 mTemporaryCoefficients2D[id1] =
chebyshevEvaluation1D(par[2], mCoefficients + mCoefficientBound2D1[
id], ncfRC);
265 if (dim1 == 1 || dim2 == 1) {
272 return (dim1 == 0 || dim2 == 0)
278#ifdef _INC_CREATION_Chebyshev3D_
281 TString strf = outfile;
282 gSystem->ExpandPathName(strf);
283 FILE*
stream = fopen(strf, append ?
"a" :
"w");
289#ifdef _INC_CREATION_Chebyshev3D_
292 fprintf(
stream,
"#\nSTART %s\n", GetName());
293 fprintf(
stream,
"# Number of rows\n%d\n", mNumberOfRows);
295 fprintf(
stream,
"# Number of columns per row\n");
296 for (
int i = 0;
i < mNumberOfRows;
i++) {
297 fprintf(
stream,
"%d\n", mNumberOfColumnsAtRow[
i]);
300 fprintf(
stream,
"# Number of Coefs in each significant block of third dimension\n");
301 for (
int i = 0;
i < mNumberOfElementsBound2D;
i++) {
302 fprintf(
stream,
"%d\n", mCoefficientBound2D0[
i]);
305 fprintf(
stream,
"# Coefficients\n");
306 for (
int i = 0;
i < mNumberOfCoefficients;
i++) {
307 fprintf(
stream,
"%+.8e\n", mCoefficients[
i]);
309 fprintf(
stream,
"# Precision\n");
310 fprintf(
stream,
"%+.8e\n", mPrecision);
312 fprintf(
stream,
"END %s\n", GetName());
319 Error(
"LoadData",
"No stream provided.\nStop");
326 if (!buffs.BeginsWith(
"START")) {
327 Error(
"LoadData",
"Expected: \"START <fit_name>\", found \"%s\"\nStop\n", buffs.Data());
331 if (buffs.First(
' ') > 0) {
332 SetName(buffs.Data() + buffs.First(
' ') + 1);
336 mNumberOfRows = buffs.Atoi();
338 if (mNumberOfRows < 0 || !buffs.IsDigit()) {
339 Error(
"LoadData",
"Expected: '<number_of_rows>', found \"%s\"\nStop\n", buffs.Data());
343 mNumberOfColumns = 0;
344 mNumberOfElementsBound2D = 0;
347 for (
int id0 = 0; id0 < mNumberOfRows; id0++) {
349 mNumberOfColumnsAtRow[id0] = buffs.Atoi();
350 mColumnAtRowBeginning[id0] = mNumberOfElementsBound2D;
351 mNumberOfElementsBound2D += mNumberOfColumnsAtRow[id0];
352 if (mNumberOfColumns < mNumberOfColumnsAtRow[id0]) {
353 mNumberOfColumns = mNumberOfColumnsAtRow[id0];
358 mNumberOfCoefficients = 0;
361 for (
int i = 0;
i < mNumberOfElementsBound2D;
i++) {
363 mCoefficientBound2D0[
i] = buffs.Atoi();
364 mCoefficientBound2D1[
i] = mNumberOfCoefficients;
365 mNumberOfCoefficients += mCoefficientBound2D0[
i];
369 for (
int i = 0;
i < mNumberOfCoefficients;
i++) {
371 mCoefficients[
i] = buffs.Atof();
375 mPrecision = buffs.Atof();
379 if (!buffs.BeginsWith(
"END") || !buffs.Contains(GetName())) {
380 Error(
"LoadData",
"Expected \"END %s\", found \"%s\".\nStop\n", GetName(), buffs.Data());
388 str =
str.Strip(TString::kBoth,
' ');
389 if (
str.IsNull() ||
str.BeginsWith(
"#")) {
394 fprintf(stderr,
"Chebyshev3D::readLine: Failed to read from stream.\nStop");
400 if (mNumberOfColumnsAtRow) {
401 delete[] mNumberOfColumnsAtRow;
402 mNumberOfColumnsAtRow =
nullptr;
404 if (mColumnAtRowBeginning) {
405 delete[] mColumnAtRowBeginning;
406 mColumnAtRowBeginning =
nullptr;
408 if (mTemporaryCoefficients1D) {
409 delete[] mTemporaryCoefficients1D;
410 mTemporaryCoefficients1D =
nullptr;
414 mNumberOfColumnsAtRow =
new UShort_t[mNumberOfRows];
415 mTemporaryCoefficients1D =
new Float_t[mNumberOfRows];
416 mColumnAtRowBeginning =
new UShort_t[mNumberOfRows];
417 for (
int i = mNumberOfRows;
i--;) {
418 mNumberOfColumnsAtRow[
i] = mColumnAtRowBeginning[
i] = 0;
425 mNumberOfColumns = nc;
426 if (mTemporaryCoefficients2D) {
427 delete[] mTemporaryCoefficients2D;
428 mTemporaryCoefficients2D =
nullptr;
430 if (mNumberOfColumns) {
431 mTemporaryCoefficients2D =
new Float_t[mNumberOfColumns];
437 if (mCoefficientBound2D0) {
438 delete[] mCoefficientBound2D0;
439 mCoefficientBound2D0 =
nullptr;
441 if (mCoefficientBound2D1) {
442 delete[] mCoefficientBound2D1;
443 mCoefficientBound2D1 =
nullptr;
445 mNumberOfElementsBound2D = ne;
446 if (mNumberOfElementsBound2D) {
447 mCoefficientBound2D0 =
new UShort_t[mNumberOfElementsBound2D];
448 mCoefficientBound2D1 =
new UShort_t[mNumberOfElementsBound2D];
449 for (
int i = mNumberOfElementsBound2D;
i--;) {
450 mCoefficientBound2D0[
i] = mCoefficientBound2D1[
i] = 0;
458 delete[] mCoefficients;
459 mCoefficients =
nullptr;
461 mNumberOfCoefficients = nc;
462 if (mNumberOfCoefficients) {
463 mCoefficients =
new Float_t[mNumberOfCoefficients];
464 for (
int i = mNumberOfCoefficients;
i--;) {
465 mCoefficients[
i] = 0.0;
478 float dcf0 = 0, dcf1, dcf2 = 0;
479 b0 = dcf1 = 2 * ncf *
array[ncf];
484 for (
int i = ncf;
i--;) {
487 dcf0 = dcf2 + 2 * (
i + 1) *
array[
i + 1];
488 b0 = dcf0 + x2 *
b1 - b2;
493 return b0 -
x *
b1 - dcf0 / 2;
504 float dcf0 = 0, dcf1 = 0, dcf2 = 0;
505 float ddcf0 = 0, ddcf1, ddcf2 = 0;
507 dcf2 = 2 * ncf *
array[ncf];
510 dcf1 = 2 * ncf *
array[ncf];
511 b0 = ddcf1 = 2 * ncf * dcf2;
517 for (
int i = ncf;
i--;) {
520 dcf0 = dcf2 + 2 * (
i + 1) *
array[
i + 1];
521 ddcf0 = ddcf2 + 2 * (
i + 1) * dcf1;
522 b0 = ddcf0 + x2 *
b1 - b2;
530 return b0 -
x *
b1 - ddcf0 / 2;
536 for (
int i = mNumberOfElementsBound2D;
i--;) {
537 if (mCoefficientBound2D0[
i] > nmax3d) {
538 nmax3d = mCoefficientBound2D0[
i];
ClassImp(Chebyshev3DCalc)
const GPUTPCGMMerger::trackCluster & b1
void Print(const Option_t *opt="") const override
Prints info.
static Float_t chebyshevEvaluation1Derivative2(Float_t x, const Float_t *array, int ncf)
Evaluates 1D Chebyshev parameterization's 2nd derivative. x is the argument mapped to [-1:1] interval...
void Clear(const Option_t *option="") override
Deletes all dynamically allocated structures.
Chebyshev3DCalc & operator=(const Chebyshev3DCalc &rhs)
Assignment operator.
Float_t evaluateDerivative(int dim, const Float_t *par) 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.
static Float_t chebyshevEvaluation1D(Float_t x, const Float_t *array, int ncf)
Evaluates 1D Chebyshev parameterization. x is the argument mapped to [-1:1] interval.
void loadData(FILE *stream)
Loads coefficients from the stream.
Float_t evaluateDerivative2(int dim1, int dim2, const Float_t *par) const
static Float_t chebyshevEvaluation1Derivative(Float_t x, const Float_t *array, int ncf)
Evaluates 1D Chebyshev parameterization's derivative. x is the argument mapped to [-1:1] interval.
Int_t getMaxColumnsAtRow() 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.
void initializeRows(int nr)
Sets maximum number of significant rows in the coefficients matrix.
void initializeCoefficients(int nc)
Sets total number of significant coefficients.
Chebyshev3DCalc()
Default constructor.
void initializeColumns(int nc)
Sets maximum number of significant columns in the coefficients matrix.