33 const int np[2],
const float* dead,
const float *rowXI,
const float* precD)
41 int *npd =
new int[2*dimOut];
43 for (
int i=0;i<dimOut;i++) {
48 fNCols =
new UChar_t[maxrows];
49 fCoeffs =
new Float_t[maxcoefs];
59 const float bmin[2],
const float bmax[2],
60 const int np[][2],
const float* dead,
const float *rowXI,
const float* precD)
68 int maxcoefs=0, maxrows=0;
70 maxcoefs += np[id][0]*np[id][1];
96 for (
int id=0;
id<
fDimOut;
id++) {
98 for (
int ir=0;ir<nr;ir++) {
119 for (
int ir=*rows++;ir--;) cfs += *cols++;
123 for (
int ir=0;ir<nr;ir++) {
147 tmx -=
fDead[1]*fRowXI[sliceID];
149 sclMap = 2./(tmx-tmn);
151 for (
int id=0;
id<
fDimOut;
id++) {
153 for (
int ir=0;ir<nr;ir++) {
171 float **grids =
new float*[
fDimOut];
172 int maxSpace = 1, totSpace = 1;
173 Bool_t sameGrid = kTRUE;
174 int ref0=np[0],ref1=np[1];
176 int nsp = np[2*id]*np[2*
id+1];
177 if (maxSpace<nsp) maxSpace = nsp;
179 if (ref0!=np[2*
id] || ref1!=np[2*
id+1]) sameGrid = kFALSE;
187 float *tmpCoef2D =
new float[maxSpace];
188 float *tmpVals =
new float[totSpace];
190 for (
int isl=0;isl<
fNSlices;isl++) {
195 if (sameGrid)
FillFunValues(fun, isl, grids[0], &np[0], tmpVals);
198 for (
int id=0;
id<
fDimOut;
id++) {
199 FillFunValues(fun, isl,
id, grids[
id], &np[2*
id], tmpVals+slot);
200 slot += np[2*id]*np[2*
id+1];
205 for (
int id=0;
id<
fDimOut;
id++) {
207 slot += np[2*id]*np[2*
id+1];
209 for (
int id=fDimOut;
id--;)
delete[] grids[
id];
232 int ncmax=0, maxDim = TMath::Max(np[0],np[1]);
233 memset(tmpCoef2D,0,np[0]*np[1]*
sizeof(
float));
235 float rTiny = 0.5*prec/maxDim;
237 for (
int id1=np[1];id1--;) {
239 for (
int id0=nc;id0--;) tmpCoef2D[id1 + id0*np[1]] =
fWSpace[id0];
240 if (ncmax<nc) ncmax = nc;
244 for (
int id0=np[0];id0--;) {
246 for (
int id1=np[1];id1--;) tmpCoef2D[id1+id0*np[1]] =
fWSpace[id1];
251 int ncNZero=0, nRows = np[0];
252 for (
int id0=np[0];id0--;) {
255 for (
int id1=np[1];id1--;) {
256 int id = id1 + id0*np[1];
257 float cfa = TMath::Abs(tmpCoef2D[
id]);
258 if (cfa < rTiny) {tmpCoef2D[id] = 0;
continue;}
261 if (resid<rTiny)
continue;
266 if (
fNCols[id0]) ncNZero++;
267 else if (!ncNZero) nRows--;
272 for (
int id0=0;id0<nRows;id0++) {
274 for (
int id1=0;id1<nc;id1++) *
fCoeffs++ = tmpCoef2D[id1+id0*np[1]];
283 const int np[2],
float* vals)
287 for (
int id1=np[1];id1--;) {
289 for (
int id0=np[0];id0--;) {
290 args[0] = grid[np[1]+id0];
292 vals[id1*np[0] + id0] =
fWSpace[dim];
302 int slotStep = np[0]*np[1];
303 for (
int id1=np[1];id1--;) {
305 for (
int id0=np[0];id0--;) {
306 args[0] = grid[np[1]+id0];
309 for (
int dim=0;dim<
fDimOut;dim++) {
310 vals[slotDim + id1*np[0] + id0] =
fWSpace[dim];
329 TString opts = opt; opts.ToLower();
330 Bool_t showcf = opts.Contains(
"c");
332 const UChar_t* rows = &
fNRows[par0];
337 for (
int id=0;
id<
fDimOut;
id++) {
340 for (
int ir=0;ir<nr;ir++) {
342 if (cols[ir]>ncmax) ncmax = cols[ir];
344 printf(
"D%d: %4d coefs in %3dx%3d| ",
id,ncf,nr,ncmax);
347 for (
int ir=0;ir<nr;ir++) {
348 for (
int ic=0;ic<cols[ir];ic++)
printf(
"%+.2e ",*cfs++);
printf(
"\n");
354 if (!showcf)
printf(
"\n");
void FillFunValues(stFun_t fun, int slice, int dim, const float *grid, const int np[2], float *vals)
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void MapToInternal(int slice, const float *xy, float *xyint) const
Int_t CalcChebCoefs(const float *funval, int np, float *outCoefs, float prec)
UChar_t * fNRows
optional external!!! set 1/X for each row if dead zones to be accounted
void PrintSlice(int isl, const Option_t *opt) const
virtual ~AliCheb2DStackF()
void CreateParams(stFun_t fun, const int *np, const float *prc)
static Float_t fWSpace[kMaxPoints]
static float ChebEval1D(float x, const float *array, int ncf)
void Print(const Option_t *opt="") const
static float ChebEval1Deriv(float x, const float *array, int ncf)
void(* stFun_t)(int, float *, float *)
void Eval(int sliceID, const float *par, float *res) const
void CheckDimensions(const int *np) const
float * DefineGrid(int slice, int dim, const int np[2]) const
void Print(const Option_t *opt="") const
static Float_t fgkDefPrec
void ChebFit(const int np[2], const float *tmpVals, float *wspace, float prec)
void EvalDeriv(int sliceID, int dim, const Float_t *par, float *res) const