+
+//_______________________________________________
+#ifdef _INC_CREATION_ALICHEB3D_
+
+void AliCheb3D::EstimateNPoints(float Prec, int gridBC[3][3],Int_t npd1,Int_t npd2,Int_t npd3)
+{
+ // Estimate number of points to generate a training data
+ //
+ const int kScp = 9;
+ const float kScl[9] = {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9};
+ //
+ const float sclDim[2] = {0.001,0.999};
+ const int compDim[3][2] = { {1,2}, {2,0}, {0,1} };
+ static float xyz[3];
+ Int_t npdTst[3] = {npd1,npd2,npd3};
+ //
+
+ for (int i=3;i--;)for (int j=3;j--;) gridBC[i][j] = -1;
+ //
+ for (int idim=0;idim<3;idim++) {
+ float dimMN = fBMin[idim] + sclDim[0]*(fBMax[idim]-fBMin[idim]);
+ float dimMX = fBMin[idim] + sclDim[1]*(fBMax[idim]-fBMin[idim]);
+ //
+ int id1 = compDim[idim][0]; // 1st fixed dim
+ int id2 = compDim[idim][1]; // 2nd fixed dim
+ for (int i1=0;i1<kScp;i1++) {
+ xyz[ id1 ] = fBMin[id1] + kScl[i1]*( fBMax[id1]-fBMin[id1] );
+ for (int i2=0;i2<kScp;i2++) {
+ xyz[ id2 ] = fBMin[id2] + kScl[i2]*( fBMax[id2]-fBMin[id2] );
+ int* npt = GetNCNeeded(xyz,idim, dimMN,dimMX, Prec, npdTst[idim]); // npoints for Bx,By,Bz
+ for (int ib=0;ib<3;ib++) if (npt[ib]>gridBC[ib][idim]) gridBC[ib][idim] = npt[ib];
+ }
+ }
+ }
+}
+
+/*
+void AliCheb3D::EstimateNPoints(float Prec, int gridBC[3][3])
+{
+ // Estimate number of points to generate a training data
+ //
+ const float sclA[9] = {0.1, 0.5, 0.9, 0.1, 0.5, 0.9, 0.1, 0.5, 0.9} ;
+ const float sclB[9] = {0.1, 0.1, 0.1, 0.5, 0.5, 0.5, 0.9, 0.9, 0.9} ;
+ const float sclDim[2] = {0.01,0.99};
+ const int compDim[3][2] = { {1,2}, {2,0}, {0,1} };
+ static float xyz[3];
+ //
+ for (int i=3;i--;)for (int j=3;j--;) gridBC[i][j] = -1;
+ //
+ for (int idim=0;idim<3;idim++) {
+ float dimMN = fBMin[idim] + sclDim[0]*(fBMax[idim]-fBMin[idim]);
+ float dimMX = fBMin[idim] + sclDim[1]*(fBMax[idim]-fBMin[idim]);
+ //
+ for (int it=0;it<9;it++) { // test in 9 points
+ int id1 = compDim[idim][0]; // 1st fixed dim
+ int id2 = compDim[idim][1]; // 2nd fixed dim
+ xyz[ id1 ] = fBMin[id1] + sclA[it]*( fBMax[id1]-fBMin[id1] );
+ xyz[ id2 ] = fBMin[id2] + sclB[it]*( fBMax[id2]-fBMin[id2] );
+ //
+ int* npt = GetNCNeeded(xyz,idim, dimMN,dimMX, Prec); // npoints for Bx,By,Bz
+ for (int ib=0;ib<3;ib++) if (npt[ib]>gridBC[ib][idim]) gridBC[ib][idim] = npt[ib];//+2;
+ //
+ }
+ }
+}
+
+
+int* AliCheb3D::GetNCNeeded(float xyz[3],int DimVar, float mn,float mx, float prec)
+{
+ // estimate needed number of chebyshev coefs for given function description in DimVar dimension
+ // The values for two other dimensions must be set beforehand
+ //
+ static int curNC[3];
+ static int retNC[3];
+ const int kMaxPoint = 400;
+ float* gridVal = new float[3*kMaxPoint];
+ float* coefs = new float[3*kMaxPoint];
+ //
+ float scale = mx-mn;
+ float offs = mn + scale/2.0;
+ scale = 2./scale;
+ //
+ int curNP;
+ int maxNC=-1;
+ int maxNCPrev=-1;
+ for (int i=0;i<3;i++) retNC[i] = -1;
+ for (int i=0;i<3;i++) fArgsTmp[i] = xyz[i];
+ //
+ for (curNP=3; curNP<kMaxPoint; curNP+=3) {
+ maxNCPrev = maxNC;
+ //
+ for (int i=0;i<curNP;i++) { // get function values on Cheb. nodes
+ float x = TMath::Cos( TMath::Pi()*(i+0.5)/curNP );
+ fArgsTmp[DimVar] = x/scale+offs; // map to requested interval
+ EvalUsrFunction();
+ for (int ib=3;ib--;) gridVal[ib*kMaxPoint + i] = fResTmp[ib];
+ }
+ //
+ for (int ib=0;ib<3;ib++) {
+ curNC[ib] = AliCheb3D::CalcChebCoefs(&gridVal[ib*kMaxPoint], curNP, &coefs[ib*kMaxPoint],prec);
+ if (maxNC < curNC[ib]) maxNC = curNC[ib];
+ if (retNC[ib] < curNC[ib]) retNC[ib] = curNC[ib];
+ }
+ if ( (curNP-maxNC)>3 && (maxNC-maxNCPrev)<1 ) break;
+ maxNCPrev = maxNC;
+ //
+ }
+ delete[] gridVal;
+ delete[] coefs;
+ return retNC;
+ //
+}
+*/
+
+
+int* AliCheb3D::GetNCNeeded(float xyz[3],int DimVar, float mn,float mx, float prec, Int_t npCheck)
+{
+ // estimate needed number of chebyshev coefs for given function description in DimVar dimension
+ // The values for two other dimensions must be set beforehand
+ //
+ static int retNC[3];
+ static int npChLast = 0;
+ static float *gridVal=0,*coefs=0;
+ if (npCheck<3) npCheck = 3;
+ if (npChLast<npCheck) {
+ if (gridVal) delete[] gridVal;
+ if (coefs) delete[] coefs;
+ gridVal = new float[3*npCheck];
+ coefs = new float[3*npCheck];
+ npChLast = npCheck;
+ }
+ //
+ float scale = mx-mn;
+ float offs = mn + scale/2.0;
+ scale = 2./scale;
+ //
+ for (int i=0;i<3;i++) fArgsTmp[i] = xyz[i];
+ for (int i=0;i<npCheck;i++) {
+ fArgsTmp[DimVar] = TMath::Cos( TMath::Pi()*(i+0.5)/npCheck)/scale+offs; // map to requested interval
+ EvalUsrFunction();
+ for (int ib=3;ib--;) gridVal[ib*npCheck + i] = fResTmp[ib];
+ }
+ //
+ for (int ib=0;ib<3;ib++) retNC[ib] = AliCheb3D::CalcChebCoefs(&gridVal[ib*npCheck], npCheck, &coefs[ib*npCheck],prec);
+ return retNC;
+ //
+}
+
+
+#endif