36 const float bmin[2],
const float bmax[2],
37 const int np[2],
const float* dead,
const float *rowXI,
40 ,fParScale(new Float_t[nSlices*dimOut])
41 ,fParHVar(new Float_t[nSlices*dimOut])
48 int *npd =
new int[2*dimOut];
50 for (
int i=0;i<dimOut;i++) {
55 fNCols =
new UChar_t[maxrows];
56 fCoeffs =
new Short_t[maxcoefs];
66 const float bmin[2],
const float bmax[2],
67 const int np[][2],
const float* dead,
const float *rowXI,
71 ,
fParHVar(new Float_t[nSlices*dimOut])
78 int maxcoefs=0, maxrows=0;
80 maxcoefs += np[id][0]*np[id][1];
111 for (
int id=0;
id<
fDimOut;
id++) {
113 for (
int ir=0;ir<nr;ir++) {
136 for (
int ir=*rows++;ir--;) cfs += *cols++;
142 for (
int ir=0;ir<nr;ir++) {
169 tmx -=
fDead[1]*fRowXI[sliceID];
171 sclMap = 2./(tmx-tmn);
173 for (
int id=0;
id<
fDimOut;
id++) {
175 for (
int ir=0;ir<nr;ir++) {
193 float **grids =
new float*[
fDimOut];
194 int maxSpace = 1, totSpace = 1;
195 Bool_t sameGrid = kTRUE;
196 int ref0=np[0],ref1=np[1];
198 int nsp = np[2*id]*np[2*
id+1];
199 if (maxSpace<nsp) maxSpace = nsp;
201 if (ref0!=np[2*
id] || ref1!=np[2*
id+1]) sameGrid = kFALSE;
209 float *tmpCoef2D =
new float[maxSpace];
210 float *tmpVals =
new float[totSpace];
212 for (
int isl=0;isl<
fNSlices;isl++) {
217 if (sameGrid)
FillFunValues(fun, isl, grids[0], &np[0], tmpVals);
220 for (
int id=0;
id<
fDimOut;
id++) {
221 FillFunValues(fun, isl,
id, grids[
id], &np[2*
id], tmpVals+slot);
222 slot += np[2*id]*np[2*
id+1];
226 for (
int id=0;
id<
fDimOut;
id++) {
228 fParScale[isl*fDimOut+id] =
ChebFit(&np[2*
id], tmpVals+slot, tmpCoef2D, prcs);
229 slot += np[2*id]*np[2*
id+1];
231 for (
int id=fDimOut;
id--;)
delete[] grids[
id];
255 int maxDim = TMath::Max(np[0],np[1]);
256 memset(tmpCoef2D,0,np[0]*np[1]*
sizeof(
float));
258 for (
int id1=np[1];id1--;) {
260 for (
int id0=nc;id0--;) tmpCoef2D[id1 + id0*np[1]] =
fWSpace[id0];
265 for (
int id0=np[0];id0--;) {
267 for (
int id1=np[1];id1--;) {
268 tmpCoef2D[id1+id0*np[1]] =
fWSpace[id1];
269 if (TMath::Abs(
fWSpace[id1])>mxAbs) mxAbs = TMath::Abs(
fWSpace[id1]);
273 float scl = mxAbs>0 ? SHRT_MAX/mxAbs : 1;
275 for (
int id0=np[0];id0--;) {
276 for (
int id1=np[1];id1--;) {
277 int id = id1 + id0*np[1];
278 Short_t cfs = Short_t(tmpCoef2D[id1+id0*np[1]]*scl);
279 tmpCoef2D[id] = float(cfs);
283 float rTiny = 0.5*prec*scl/maxDim;
288 int ncNZero=0, nRows = np[0];
289 for (
int id0=np[0];id0--;) {
292 for (
int id1=np[1];id1--;) {
293 int id = id1 + id0*np[1];
294 float cfa = TMath::Abs(tmpCoef2D[
id]);
295 if (cfa < rTiny) {tmpCoef2D[id] = 0;
continue;}
298 if (resid<rTiny)
continue;
303 if (
fNCols[id0]) ncNZero++;
304 else if (!ncNZero) nRows--;
308 for (
int id0=0;id0<nRows;id0++) {
310 for (
int id1=0;id1<nc;id1++) {
311 *
fCoeffs++ = Short_t(tmpCoef2D[id1+id0*np[1]]);
322 const int np[2],
float* vals)
326 float minv=1e15,maxv=-1e15;
327 for (
int id1=np[1];id1--;) {
329 for (
int id0=np[0];id0--;) {
330 args[0] = grid[np[1]+id0];
332 vals[id1*np[0] + id0] =
fWSpace[dim];
341 for (
int id1=np[1];id1--;)
for (
int id0=np[0];id0--;) vals[id1*np[0] + id0] -= offs;
347 const int np[2],
float* vals)
356 int stepDim = np[0]*np[1];
357 for (
int id1=np[1];id1--;) {
359 for (
int id0=np[0];id0--;) {
360 args[0] = grid[np[1]+id0];
363 vals[stepDim*dim + id1*np[0] + id0] =
fWSpace[dim];
372 float* valsdim = vals+stepDim*dim;
373 for (
int id1=np[1];id1--;)
for (
int id0=np[0];id0--;) valsdim[id1*np[0] + id0] -= offs;
393 TString opts = opt; opts.ToLower();
394 Bool_t showcf = opts.Contains(
"c");
396 const UChar_t* rows = &
fNRows[par0];
401 for (
int id=0;
id<
fDimOut;
id++) {
404 for (
int ir=0;ir<nr;ir++) {
406 if (cols[ir]>ncmax) ncmax = cols[ir];
408 printf(
"D%d: %4d coefs in %3dx%3d (Scl:%.2e Hv:%.2e)| ",
412 for (
int ir=0;ir<nr;ir++) {
413 for (
int ic=0;ic<cols[ir];ic++)
printf(
"%+6d ",*cfs++);
printf(
"\n");
419 if (!showcf)
printf(
"\n");
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
virtual ~AliCheb2DStackS()
void MapToInternal(int slice, const float *xy, float *xyint) const
Int_t CalcChebCoefs(const float *funval, int np, float *outCoefs, float prec)
void FillFunValues(stFun_t fun, int slice, int dim, const float *grid, const int np[2], float *wVals)
UChar_t * fNRows
optional external!!! set 1/X for each row if dead zones to be accounted
void EvalDeriv(int sliceID, int dim, const Float_t *par, float *res) const
static Float_t fWSpace[kMaxPoints]
static float ChebEval1D(float x, const float *array, int ncf)
float ChebFit(const int np[2], const float *wVals, float *wspace, float prec)
void Print(const Option_t *opt="") const
static float ChebEval1Deriv(float x, const float *array, int ncf)
void(* stFun_t)(int, float *, float *)
void CheckDimensions(const int *np) const
float * DefineGrid(int slice, int dim, const int np[2]) const
void CreateParams(stFun_t fun, const int *np, const float *prc)
static Float_t fgkDefPrec
void Print(const Option_t *opt="") const
void Eval(int sliceID, const float *par, float *res) const
void PrintSlice(int isl, const Option_t *opt) const