+ if (fNParamsTPC) {
+ delete fParamsTPC; fParamsTPC = 0;
+ delete[] fSegZTPC; fSegZTPC = 0;
+ delete[] fSegPTPC; fSegPTPC = 0;
+ delete[] fSegRTPC; fSegRTPC = 0;
+ delete[] fBegSegPTPC; fBegSegPTPC = 0;
+ delete[] fNSegPTPC; fNSegPTPC = 0;
+ delete[] fBegSegRTPC; fBegSegRTPC = 0;
+ delete[] fNSegRTPC; fNSegRTPC = 0;
+ delete[] fSegIDTPC; fSegIDTPC = 0;
+ }
+ fNParamsTPC = fNZSegTPC = fNPSegTPC = fNRSegTPC = 0;
+ fMinZTPC = 1e6;
+ fMaxZTPC = -1e6;
+ fMaxRTPC = 0;
+ //
+}
+
+
+//__________________________________________________
+void AliMagWrapCheb::BuildTable(Int_t npar,TObjArray *parArr, Int_t &nZSeg, Int_t &nYSeg, Int_t &nXSeg,
+ Float_t &minZ,Float_t &maxZ,
+ Float_t **segZ,Float_t **segY,Float_t **segX,
+ Int_t **begSegY,Int_t **nSegY,
+ Int_t **begSegX,Int_t **nSegX,
+ Int_t **segID)
+{
+ // build lookup table for dipole
+ //
+ if (npar<1) return;
+ TArrayF segYArr,segXArr;
+ TArrayI begSegYDipArr,begSegXDipArr;
+ TArrayI nSegYDipArr,nSegXDipArr;
+ TArrayI segIDArr;
+ float *tmpSegZ,*tmpSegY,*tmpSegX;
+ //
+ // create segmentation in Z
+ nZSeg = SegmentDimension(&tmpSegZ, parArr, npar, 2, 1,-1, 1,-1, 1,-1) - 1;
+ nYSeg = 0;
+ nXSeg = 0;
+ //
+ // for each Z slice create segmentation in Y
+ begSegYDipArr.Set(nZSeg);
+ nSegYDipArr.Set(nZSeg);
+ float xyz[3];
+ for (int iz=0;iz<nZSeg;iz++) {
+ printf("\nZSegment#%d %+e : %+e\n",iz,tmpSegZ[iz],tmpSegZ[iz+1]);
+ int ny = SegmentDimension(&tmpSegY, parArr, npar, 1,
+ 1,-1, 1,-1, tmpSegZ[iz],tmpSegZ[iz+1]) - 1;
+ segYArr.Set(ny + nYSeg);
+ for (int iy=0;iy<ny;iy++) segYArr[nYSeg+iy] = tmpSegY[iy];
+ begSegYDipArr[iz] = nYSeg;
+ nSegYDipArr[iz] = ny;
+ printf(" Found %d YSegments, to start from %d\n",ny, begSegYDipArr[iz]);
+ //
+ // for each slice in Z and Y create segmentation in X
+ begSegXDipArr.Set(nYSeg+ny);
+ nSegXDipArr.Set(nYSeg+ny);
+ xyz[2] = (tmpSegZ[iz]+tmpSegZ[iz+1])/2.; // mean Z of this segment
+ //
+ for (int iy=0;iy<ny;iy++) {
+ int isg = nYSeg+iy;
+ printf("\n YSegment#%d %+e : %+e\n",iy, tmpSegY[iy],tmpSegY[iy+1]);
+ int nx = SegmentDimension(&tmpSegX, parArr, npar, 0,
+ 1,-1, tmpSegY[iy],tmpSegY[iy+1], tmpSegZ[iz],tmpSegZ[iz+1]) - 1;
+ //
+ segXArr.Set(nx + nXSeg);
+ for (int ix=0;ix<nx;ix++) segXArr[nXSeg+ix] = tmpSegX[ix];
+ begSegXDipArr[isg] = nXSeg;
+ nSegXDipArr[isg] = nx;
+ printf(" Found %d XSegments, to start from %d\n",nx, begSegXDipArr[isg]);
+ //
+ segIDArr.Set(nXSeg+nx);
+ //
+ // find corresponding params
+ xyz[1] = (tmpSegY[iy]+tmpSegY[iy+1])/2.; // mean Y of this segment
+ //
+ for (int ix=0;ix<nx;ix++) {
+ xyz[0] = (tmpSegX[ix]+tmpSegX[ix+1])/2.; // mean X of this segment
+ for (int ipar=0;ipar<npar;ipar++) {
+ AliCheb3D* cheb = (AliCheb3D*) parArr->At(ipar);
+ if (!cheb->IsInside(xyz)) continue;
+ segIDArr[nXSeg+ix] = ipar;
+ break;
+ }
+ }
+ nXSeg += nx;
+ //
+ delete[] tmpSegX;
+ }
+ delete[] tmpSegY;
+ nYSeg += ny;
+ }
+ //
+ minZ = tmpSegZ[0];
+ maxZ = tmpSegZ[nZSeg];
+ (*segZ) = new Float_t[nZSeg];
+ for (int i=nZSeg;i--;) (*segZ)[i] = tmpSegZ[i];
+ delete[] tmpSegZ;
+ //
+ (*segY) = new Float_t[nYSeg];
+ (*segX) = new Float_t[nXSeg];
+ (*begSegY) = new Int_t[nZSeg];
+ (*nSegY) = new Int_t[nZSeg];
+ (*begSegX) = new Int_t[nYSeg];
+ (*nSegX) = new Int_t[nYSeg];
+ (*segID) = new Int_t[nXSeg];
+ //
+ for (int i=nYSeg;i--;) (*segY)[i] = segYArr[i];
+ for (int i=nXSeg;i--;) (*segX)[i] = segXArr[i];
+ for (int i=nZSeg;i--;) {(*begSegY)[i] = begSegYDipArr[i]; (*nSegY)[i] = nSegYDipArr[i];}
+ for (int i=nYSeg;i--;) {(*begSegX)[i] = begSegXDipArr[i]; (*nSegX)[i] = nSegXDipArr[i];}
+ for (int i=nXSeg;i--;) {(*segID)[i] = segIDArr[i];}