26 fNParamsSol(0),fNZSegSol(0),fNPSegSol(0),fNRSegSol(0),
27 fSegZSol(0),fSegPSol(0),fSegRSol(0),
28 fBegSegPSol(0),fNSegPSol(0),fBegSegRSol(0),fNSegRSol(0),fSegIDSol(0),fMinZSol(1.e6),fMaxZSol(-1.e6),fParamsSol(0),fMaxRSol(0),
30 fNParamsTPC(0),fNZSegTPC(0),fNPSegTPC(0),fNRSegTPC(0),
31 fSegZTPC(0),fSegPTPC(0),fSegRTPC(0),
32 fBegSegPTPC(0),fNSegPTPC(0),fBegSegRTPC(0),fNSegRTPC(0),fSegIDTPC(0),fMinZTPC(1.e6),fMaxZTPC(-1.e6),fParamsTPC(0),fMaxRTPC(0),
34 fNParamsTPCRat(0),fNZSegTPCRat(0),fNPSegTPCRat(0),fNRSegTPCRat(0),
35 fSegZTPCRat(0),fSegPTPCRat(0),fSegRTPCRat(0),
36 fBegSegPTPCRat(0),fNSegPTPCRat(0),fBegSegRTPCRat(0),fNSegRTPCRat(0),fSegIDTPCRat(0),fMinZTPCRat(1.e6),fMaxZTPCRat(-1.e6),fParamsTPCRat(0),fMaxRTPCRat(0),
38 fNParamsDip(0),fNZSegDip(0),fNYSegDip(0),fNXSegDip(0),
39 fSegZDip(0),fSegYDip(0),fSegXDip(0),
40 fBegSegYDip(0),fNSegYDip(0),fBegSegXDip(0),fNSegXDip(0),fSegIDDip(0),fMinZDip(1.e6),fMaxZDip(-1.e6),fParamsDip(0)
42 #ifdef _MAGCHEB_CACHE_ 43 ,fCacheSol(0),fCacheDip(0),fCacheTPCInt(0),fCacheTPCRat(0)
53 fNParamsSol(0),fNZSegSol(0),fNPSegSol(0),fNRSegSol(0),
54 fSegZSol(0),fSegPSol(0),fSegRSol(0),
55 fBegSegPSol(0),fNSegPSol(0),fBegSegRSol(0),fNSegRSol(0),fSegIDSol(0),fMinZSol(1.e6),fMaxZSol(-1.e6),fParamsSol(0),fMaxRSol(0),
57 fNParamsTPC(0),fNZSegTPC(0),fNPSegTPC(0),fNRSegTPC(0),
58 fSegZTPC(0),fSegPTPC(0),fSegRTPC(0),
59 fBegSegPTPC(0),fNSegPTPC(0),fBegSegRTPC(0),fNSegRTPC(0),fSegIDTPC(0),fMinZTPC(1.e6),fMaxZTPC(-1.e6),fParamsTPC(0),fMaxRTPC(0),
61 fNParamsTPCRat(0),fNZSegTPCRat(0),fNPSegTPCRat(0),fNRSegTPCRat(0),
62 fSegZTPCRat(0),fSegPTPCRat(0),fSegRTPCRat(0),
63 fBegSegPTPCRat(0),fNSegPTPCRat(0),fBegSegRTPCRat(0),fNSegRTPCRat(0),fSegIDTPCRat(0),fMinZTPCRat(1.e6),fMaxZTPCRat(-1.e6),fParamsTPCRat(0),fMaxRTPCRat(0),
65 fNParamsDip(0),fNZSegDip(0),fNYSegDip(0),fNXSegDip(0),
66 fSegZDip(0),fSegYDip(0),fSegXDip(0),
67 fBegSegYDip(0),fNSegYDip(0),fBegSegXDip(0),fNSegXDip(0),fSegIDDip(0),fMinZDip(1.e6),fMaxZDip(-1.e6),fParamsDip(0)
70 ,fCacheSol(0),fCacheDip(0),fCacheTPCInt(0),fCacheTPCRat(0)
83 SetName(src.GetName());
84 SetTitle(src.GetTitle());
94 memcpy(fSegZSol =
new Float_t[fNZSegSol], src.
fSegZSol,
sizeof(Float_t)*fNZSegSol);
95 memcpy(fSegPSol =
new Float_t[fNPSegSol], src.
fSegPSol,
sizeof(Float_t)*fNPSegSol);
96 memcpy(fSegRSol =
new Float_t[fNRSegSol], src.
fSegRSol,
sizeof(Float_t)*fNRSegSol);
97 memcpy(fBegSegPSol=
new Int_t[fNZSegSol], src.
fBegSegPSol,
sizeof(Int_t)*fNZSegSol);
98 memcpy(fNSegPSol =
new Int_t[fNZSegSol], src.
fNSegPSol,
sizeof(Int_t)*fNZSegSol);
99 memcpy(fBegSegRSol=
new Int_t[fNPSegSol], src.
fBegSegRSol,
sizeof(Int_t)*fNPSegSol);
100 memcpy(fNSegRSol =
new Int_t[fNPSegSol], src.
fNSegRSol,
sizeof(Int_t)*fNPSegSol);
101 memcpy(fSegIDSol =
new Int_t[fNRSegSol], src.
fSegIDSol,
sizeof(Int_t)*fNRSegSol);
114 memcpy(fSegZTPC =
new Float_t[fNZSegTPC], src.
fSegZTPC,
sizeof(Float_t)*fNZSegTPC);
115 memcpy(fSegPTPC =
new Float_t[fNPSegTPC], src.
fSegPTPC,
sizeof(Float_t)*fNPSegTPC);
116 memcpy(fSegRTPC =
new Float_t[fNRSegTPC], src.
fSegRTPC,
sizeof(Float_t)*fNRSegTPC);
117 memcpy(fBegSegPTPC=
new Int_t[fNZSegTPC], src.
fBegSegPTPC,
sizeof(Int_t)*fNZSegTPC);
118 memcpy(fNSegPTPC =
new Int_t[fNZSegTPC], src.
fNSegPTPC,
sizeof(Int_t)*fNZSegTPC);
119 memcpy(fBegSegRTPC=
new Int_t[fNPSegTPC], src.
fBegSegRTPC,
sizeof(Int_t)*fNPSegTPC);
120 memcpy(fNSegRTPC =
new Int_t[fNPSegTPC], src.
fNSegRTPC,
sizeof(Int_t)*fNPSegTPC);
121 memcpy(fSegIDTPC =
new Int_t[fNRSegTPC], src.
fSegIDTPC,
sizeof(Int_t)*fNRSegTPC);
134 memcpy(fSegZTPCRat =
new Float_t[fNZSegTPCRat], src.
fSegZTPCRat,
sizeof(Float_t)*fNZSegTPCRat);
135 memcpy(fSegPTPCRat =
new Float_t[fNPSegTPCRat], src.
fSegPTPCRat,
sizeof(Float_t)*fNPSegTPCRat);
136 memcpy(fSegRTPCRat =
new Float_t[fNRSegTPCRat], src.
fSegRTPCRat,
sizeof(Float_t)*fNRSegTPCRat);
137 memcpy(fBegSegPTPCRat=
new Int_t[fNZSegTPCRat], src.
fBegSegPTPCRat,
sizeof(Int_t)*fNZSegTPCRat);
138 memcpy(fNSegPTPCRat =
new Int_t[fNZSegTPCRat], src.
fNSegPTPCRat,
sizeof(Int_t)*fNZSegTPCRat);
139 memcpy(fBegSegRTPCRat=
new Int_t[fNPSegTPCRat], src.
fBegSegRTPCRat,
sizeof(Int_t)*fNPSegTPCRat);
140 memcpy(fNSegRTPCRat =
new Int_t[fNPSegTPCRat], src.
fNSegRTPCRat,
sizeof(Int_t)*fNPSegTPCRat);
141 memcpy(fSegIDTPCRat =
new Int_t[fNRSegTPCRat], src.
fSegIDTPCRat,
sizeof(Int_t)*fNRSegTPCRat);
142 fParamsTPCRat =
new TObjArray(fNParamsTPCRat);
153 memcpy(fSegZDip =
new Float_t[fNZSegDip], src.
fSegZDip,
sizeof(Float_t)*fNZSegDip);
154 memcpy(fSegYDip =
new Float_t[fNYSegDip], src.
fSegYDip,
sizeof(Float_t)*fNYSegDip);
155 memcpy(fSegXDip =
new Float_t[fNXSegDip], src.
fSegXDip,
sizeof(Float_t)*fNXSegDip);
156 memcpy(fBegSegYDip=
new Int_t[fNZSegDip], src.
fBegSegYDip,
sizeof(Int_t)*fNZSegDip);
157 memcpy(fNSegYDip =
new Int_t[fNZSegDip], src.
fNSegYDip,
sizeof(Int_t)*fNZSegDip);
158 memcpy(fBegSegXDip=
new Int_t[fNYSegDip], src.
fBegSegXDip,
sizeof(Int_t)*fNYSegDip);
159 memcpy(fNSegXDip =
new Int_t[fNYSegDip], src.
fNSegXDip,
sizeof(Int_t)*fNYSegDip);
160 memcpy(fSegIDDip =
new Int_t[fNXSegDip], src.
fSegIDDip,
sizeof(Int_t)*fNXSegDip);
184 fParamsSol->SetOwner(kTRUE);
195 fNParamsSol = fNZSegSol = fNPSegSol = fNRSegSol = 0;
201 fParamsTPC->SetOwner(kTRUE);
212 fNParamsTPC = fNZSegTPC = fNPSegTPC = fNRSegTPC = 0;
217 if (fNParamsTPCRat) {
218 fParamsTPCRat->SetOwner(kTRUE);
229 fNParamsTPCRat = fNZSegTPCRat = fNPSegTPCRat = fNRSegTPCRat = 0;
246 fNParamsDip = fNZSegDip = fNYSegDip = fNXSegDip = 0;
250 #ifdef _MAGCHEB_CACHE_ 266 #ifndef _BRING_TO_BOUNDARY_ // exact matching to fitted volume is requested 267 b[0] = b[1] = b[2] = 0;
273 #ifdef _MAGCHEB_CACHE_ 277 #endif //_MAGCHEB_CACHE_ 284 #ifdef _MAGCHEB_CACHE_ 289 #else //_MAGCHEB_CACHE_ 291 #endif //_MAGCHEB_CACHE_ 296 #ifndef _BRING_TO_BOUNDARY_ 297 if (!fCacheDip->
IsInside(xyz))
return;
298 #endif //_BRING_TO_BOUNDARY_ 300 fCacheDip->
Eval(xyz,b);
316 #ifdef _MAGCHEB_CACHE_ 318 #endif //_MAGCHEB_CACHE_ 322 #ifdef _MAGCHEB_CACHE_ 325 #else //_MAGCHEB_CACHE_ 327 #endif //_MAGCHEB_CACHE_ 333 #ifndef _BRING_TO_BOUNDARY_ 334 if (!fCacheDip->
IsInside(xyz))
return 0.;
335 #endif // _BRING_TO_BOUNDARY_ 337 return fCacheDip->
Eval(xyz,2);
350 printf(
"Alice magnetic field parameterized by Chebyshev polynomials\n");
360 printf(
"Segmentation for TPC field integral (%+.2f<Z<%+.2f cm | R<%.2f cm)\n",
fMinZTPC,
fMaxZTPC,fMaxRTPC);
392 if (!fNParamsDip)
return -1;
393 int xid,yid,zid = TMath::BinarySearch(fNZSegDip,fSegZDip,(Float_t)xyz[2]);
395 Bool_t reCheck = kFALSE;
397 int ysegBeg = fBegSegYDip[zid];
399 for (yid=0;yid<fNSegYDip[zid];yid++)
if (xyz[1]<fSegYDip[ysegBeg+yid])
break;
400 if ( --yid < 0 ) yid = 0;
403 int xsegBeg = fBegSegXDip[yid];
404 for (xid=0;xid<fNSegXDip[yid];xid++)
if (xyz[0]<fSegXDip[xsegBeg+xid])
break;
406 if ( --xid < 0) xid = 0;
410 if (!reCheck && (xyz[2] - fSegZDip[zid] < 3.e-5) && zid &&
419 return fSegIDDip[xid];
425 if (zid<0 || zid>=fNZSegDip)
return -1;
427 arr.SetOwner(kFALSE);
428 int ysegBeg = fBegSegYDip[zid];
429 for (
int yid=0;yid<fNSegYDip[zid];yid++) {
430 int yid1 = yid + ysegBeg;
431 int xsegBeg = fBegSegXDip[yid1];
432 for (
int xid=0;xid<fNSegXDip[yid1];xid++) {
433 int xid1 = xid + xsegBeg;
439 return arr.GetEntriesFast();
448 if (!fNParamsSol)
return -1;
449 int rid,
pid,zid = TMath::BinarySearch(fNZSegSol,fSegZSol,(Float_t)rpz[2]);
451 Bool_t reCheck = kFALSE;
453 int psegBeg = fBegSegPSol[zid];
454 for (pid=0;pid<fNSegPSol[zid];pid++)
if (rpz[1]<fSegPSol[psegBeg+pid])
break;
455 if ( --pid < 0 ) pid = 0;
458 int rsegBeg = fBegSegRSol[
pid];
459 for (rid=0;rid<fNSegRSol[
pid];rid++)
if (rpz[0]<fSegRSol[rsegBeg+rid])
break;
460 if ( --rid < 0) rid = 0;
464 if (!reCheck && (rpz[2] - fSegZSol[zid] < 3.e-5) && zid &&
473 return fSegIDSol[rid];
480 if (!fNParamsTPC)
return -1;
481 int rid,
pid,zid = TMath::BinarySearch(fNZSegTPC,fSegZTPC,(Float_t)rpz[2]);
483 Bool_t reCheck = kFALSE;
485 int psegBeg = fBegSegPTPC[zid];
487 for (pid=0;pid<fNSegPTPC[zid];pid++)
if (rpz[1]<fSegPTPC[psegBeg+pid])
break;
488 if ( --pid < 0 ) pid = 0;
491 int rsegBeg = fBegSegRTPC[
pid];
492 for (rid=0;rid<fNSegRTPC[
pid];rid++)
if (rpz[0]<fSegRTPC[rsegBeg+rid])
break;
493 if ( --rid < 0) rid = 0;
497 if (!reCheck && (rpz[2] - fSegZTPC[zid] < 3.e-5) && zid &&
506 return fSegIDTPC[rid];
513 if (!fNParamsTPCRat)
return -1;
514 int rid,
pid,zid = TMath::BinarySearch(fNZSegTPCRat,fSegZTPCRat,(Float_t)rpz[2]);
516 Bool_t reCheck = kFALSE;
518 int psegBeg = fBegSegPTPCRat[zid];
520 for (pid=0;pid<fNSegPTPCRat[zid];pid++)
if (rpz[1]<fSegPTPCRat[psegBeg+pid])
break;
521 if ( --pid < 0 ) pid = 0;
524 int rsegBeg = fBegSegRTPCRat[
pid];
525 for (rid=0;rid<fNSegRTPCRat[
pid];rid++)
if (rpz[0]<fSegRTPCRat[rsegBeg+rid])
break;
526 if ( --rid < 0) rid = 0;
530 if (!reCheck && (rpz[2] - fSegZTPCRat[zid] < 3.e-5) && zid &&
539 return fSegIDTPCRat[rid];
548 static Double_t rphiz[3];
553 #ifndef _BRING_TO_BOUNDARY_ 555 rphiz[0]>
GetMaxRTPCInt()) {
for (
int i=3;i--;) b[i]=0;
return;}
570 static Double_t rphiz[3];
575 #ifndef _BRING_TO_BOUNDARY_ 594 #ifndef _MAGCHEB_CACHE_ 599 #ifndef _BRING_TO_BOUNDARY_ // exact matching to fitted volume is requested 600 if (!fCacheSol->
IsInside(rphiz))
return;
602 fCacheSol->
Eval(rphiz,b);
615 #ifndef _MAGCHEB_CACHE_ 620 #ifndef _BRING_TO_BOUNDARY_ 621 return fCacheSol->
IsInside(rphiz) ? fCacheSol->
Eval(rphiz,2) : 0;
623 return fCacheSol->
Eval(rphiz,2);
634 #ifdef _MAGCHEB_CACHE_ 640 #else //_MAGCHEB_CACHE_ 642 #endif //_MAGCHEB_CACHE_ 653 if (fCacheTPCInt->
IsInside(rphiz)) {
654 fCacheTPCInt->
Eval(rphiz,b);
659 b[0] = b[1] = b[2] = 0;
669 #ifdef _MAGCHEB_CACHE_ 676 #endif //_MAGCHEB_CACHE_ 686 if (fCacheTPCRat->
IsInside(rphiz)) {
687 fCacheTPCRat->
Eval(rphiz,b);
692 b[0] = b[1] = b[2] = 0;
697 #ifdef _INC_CREATION_ALICHEB3D_ 703 TString strf = inpfile;
704 gSystem->ExpandPathName(strf);
705 FILE* stream = fopen(strf,
"r");
707 printf(
"Did not find input file %s\n",strf.Data());
713 if (!buffs.BeginsWith(
"START"))
AliFatalF(
"Expected: \"START <name>\", found \"%s\"",buffs.Data());
714 if (buffs.First(
' ')>0) SetName(buffs.Data()+buffs.First(
' ')+1);
718 if (!buffs.BeginsWith(
"START SOLENOID"))
AliFatalF(
"Expected: \"START SOLENOID\", found \"%s\"",buffs.Data());
720 int nparSol = buffs.Atoi();
722 for (
int ip=0;ip<nparSol;ip++) {
729 if (!buffs.BeginsWith(
"END SOLENOID"))
AliFatalF(
"Expected \"END SOLENOID\", found \"%s\"",buffs.Data());
733 if (!buffs.BeginsWith(
"START TPCINT"))
AliFatalF(
"Expected: \"START TPCINT\", found \"%s\"",buffs.Data());
736 int nparTPCInt = buffs.Atoi();
738 for (
int ip=0;ip<nparTPCInt;ip++) {
745 if (!buffs.BeginsWith(
"END TPCINT"))
AliFatalF(
"Expected \"END TPCINT\", found \"%s\"",buffs.Data());
749 if (!buffs.BeginsWith(
"START TPCRatINT"))
AliFatalF(
"Expected: \"START TPCRatINT\", found \"%s\"",buffs.Data());
751 int nparTPCRatInt = buffs.Atoi();
753 for (
int ip=0;ip<nparTPCRatInt;ip++) {
760 if (!buffs.BeginsWith(
"END TPCRatINT"))
AliFatalF(
"Expected \"END TPCRatINT\", found \"%s\"",buffs.Data());
764 if (!buffs.BeginsWith(
"START DIPOLE"))
AliFatalF(
"Expected: \"START DIPOLE\", found \"%s\"",buffs.Data());
767 int nparDip = buffs.Atoi();
769 for (
int ip=0;ip<nparDip;ip++) {
776 if (!buffs.BeginsWith(
"END DIPOLE"))
AliFatalF(
"Expected \"END DIPOLE\", found \"%s\"",buffs.Data());
779 if (!buffs.BeginsWith(
"END ") && !buffs.Contains(GetName()))
AliFatalF(
"Expected: \"END %s\", found \"%s\"",GetName(),buffs.Data());
788 printf(
"Loaded magnetic field \"%s\" from %s\n",GetName(),strf.Data());
797 fNZSegSol,fNPSegSol,fNRSegSol,
799 &fSegZSol,&fSegPSol,&fSegRSol,
800 &fBegSegPSol,&fNSegPSol,
801 &fBegSegRSol,&fNSegRSol,
810 fNZSegDip,fNYSegDip,fNXSegDip,
812 &fSegZDip,&fSegYDip,&fSegXDip,
813 &fBegSegYDip,&fNSegYDip,
814 &fBegSegXDip,&fNSegXDip,
823 fNZSegTPC,fNPSegTPC,fNRSegTPC,
825 &fSegZTPC,&fSegPTPC,&fSegRTPC,
826 &fBegSegPTPC,&fNSegPTPC,
827 &fBegSegRTPC,&fNSegRTPC,
836 fNZSegTPCRat,fNPSegTPCRat,fNRSegTPCRat,
838 &fSegZTPCRat,&fSegPTPCRat,&fSegRTPCRat,
839 &fBegSegPTPCRat,&fNSegPTPCRat,
840 &fBegSegRTPCRat,&fNSegRTPCRat,
847 #ifdef _INC_CREATION_ALICHEB3D_ 851 fNParamsSol(0),fNZSegSol(0),fNPSegSol(0),fNRSegSol(0),
852 fSegZSol(0),fSegPSol(0),fSegRSol(0),
853 fBegSegPSol(0),fNSegPSol(0),fBegSegRSol(0),fNSegRSol(0),fSegIDSol(0),
fMinZSol(1.e6),
fMaxZSol(-1.e6),fParamsSol(0),fMaxRSol(0),
855 fNParamsTPC(0),fNZSegTPC(0),fNPSegTPC(0),fNRSegTPC(0),
856 fSegZTPC(0),fSegPTPC(0),fSegRTPC(0),
857 fBegSegPTPC(0),fNSegPTPC(0),fBegSegRTPC(0),fNSegRTPC(0),fSegIDTPC(0),
fMinZTPC(1.e6),
fMaxZTPC(-1.e6),fParamsTPC(0),fMaxRTPC(0),
859 fNParamsTPCRat(0),fNZSegTPCRat(0),fNPSegTPCRat(0),fNRSegTPCRat(0),
860 fSegZTPCRat(0),fSegPTPCRat(0),fSegRTPCRat(0),
861 fBegSegPTPCRat(0),fNSegPTPCRat(0),fBegSegRTPCRat(0),fNSegRTPCRat(0),fSegIDTPCRat(0),
fMinZTPCRat(1.e6),
fMaxZTPCRat(-1.e6),fParamsTPCRat(0),fMaxRTPCRat(0),
863 fNParamsDip(0),fNZSegDip(0),fNYSegDip(0),fNXSegDip(0),
864 fSegZDip(0),fSegYDip(0),fSegXDip(0),
881 if (!fParamsSol) fParamsSol =
new TObjArray();
884 if (fMaxRSol<param->GetBoundMax(0)) fMaxRSol = param->
GetBoundMax(0);
894 if (!fParamsTPC) fParamsTPC =
new TObjArray();
897 if (fMaxRTPC<param->GetBoundMax(0)) fMaxRTPC = param->
GetBoundMax(0);
907 if (!fParamsTPCRat) fParamsTPCRat =
new TObjArray();
910 if (fMaxRTPCRat<param->GetBoundMax(0)) fMaxRTPCRat = param->
GetBoundMax(0);
940 fNParamsDip = fNZSegDip = fNXSegDip = fNYSegDip = 0;
961 fNParamsSol = fNZSegSol = fNPSegSol = fNRSegSol = 0;
983 fNParamsTPC = fNZSegTPC = fNPSegTPC = fNRSegTPC = 0;
994 if (fNParamsTPCRat) {
1005 fNParamsTPCRat = fNZSegTPCRat = fNPSegTPCRat = fNRSegTPCRat = 0;
1015 Float_t &minZ,Float_t &maxZ,
1016 Float_t **segZ,Float_t **segY,Float_t **segX,
1017 Int_t **begSegY,Int_t **nSegY,
1018 Int_t **begSegX,Int_t **nSegX,
1024 TArrayF segYArr,segXArr;
1025 TArrayI begSegYDipArr,begSegXDipArr;
1026 TArrayI nSegYDipArr,nSegXDipArr;
1028 float *tmpSegZ,*tmpSegY,*tmpSegX;
1036 begSegYDipArr.Set(nZSeg);
1037 nSegYDipArr.Set(nZSeg);
1039 for (
int iz=0;iz<nZSeg;iz++) {
1040 printf(
"\nZSegment#%d %+e : %+e\n",iz,tmpSegZ[iz],tmpSegZ[iz+1]);
1042 1,-1, 1,-1, tmpSegZ[iz],tmpSegZ[iz+1]) - 1;
1043 segYArr.Set(ny + nYSeg);
1044 for (
int iy=0;iy<ny;iy++) segYArr[nYSeg+iy] = tmpSegY[iy];
1045 begSegYDipArr[iz] = nYSeg;
1046 nSegYDipArr[iz] = ny;
1047 printf(
" Found %d YSegments, to start from %d\n",ny, begSegYDipArr[iz]);
1050 begSegXDipArr.Set(nYSeg+ny);
1051 nSegXDipArr.Set(nYSeg+ny);
1052 xyz[2] = (tmpSegZ[iz]+tmpSegZ[iz+1])/2.;
1054 for (
int iy=0;iy<ny;iy++) {
1056 printf(
"\n YSegment#%d %+e : %+e\n",iy, tmpSegY[iy],tmpSegY[iy+1]);
1058 1,-1, tmpSegY[iy],tmpSegY[iy+1], tmpSegZ[iz],tmpSegZ[iz+1]) - 1;
1060 segXArr.Set(nx + nXSeg);
1061 for (
int ix=0;ix<nx;ix++) segXArr[nXSeg+ix] = tmpSegX[ix];
1062 begSegXDipArr[isg] = nXSeg;
1063 nSegXDipArr[isg] = nx;
1064 printf(
" Found %d XSegments, to start from %d\n",nx, begSegXDipArr[isg]);
1066 segIDArr.Set(nXSeg+nx);
1069 xyz[1] = (tmpSegY[iy]+tmpSegY[iy+1])/2.;
1071 for (
int ix=0;ix<nx;ix++) {
1072 xyz[0] = (tmpSegX[ix]+tmpSegX[ix+1])/2.;
1073 for (
int ipar=0;ipar<npar;ipar++) {
1075 if (!cheb->
IsInside(xyz))
continue;
1076 segIDArr[nXSeg+ix] = ipar;
1089 maxZ = tmpSegZ[nZSeg];
1090 (*segZ) =
new Float_t[nZSeg];
1091 for (
int i=nZSeg;i--;) (*segZ)[i] = tmpSegZ[i];
1094 (*segY) =
new Float_t[nYSeg];
1095 (*segX) =
new Float_t[nXSeg];
1096 (*begSegY) =
new Int_t[nZSeg];
1097 (*nSegY) =
new Int_t[nZSeg];
1098 (*begSegX) =
new Int_t[nYSeg];
1099 (*nSegX) =
new Int_t[nYSeg];
1100 (*segID) =
new Int_t[nXSeg];
1102 for (
int i=nYSeg;i--;) (*segY)[i] = segYArr[i];
1103 for (
int i=nXSeg;i--;) (*segX)[i] = segXArr[i];
1104 for (
int i=nZSeg;i--;) {(*begSegY)[i] = begSegYDipArr[i]; (*nSegY)[i] = nSegYDipArr[i];}
1105 for (
int i=nYSeg;i--;) {(*begSegX)[i] = begSegXDipArr[i]; (*nSegX)[i] = nSegXDipArr[i];}
1106 for (
int i=nXSeg;i--;) {(*segID)[i] = segIDArr[i];}
1208 TString strf = outfile;
1209 gSystem->ExpandPathName(strf);
1210 FILE* stream = fopen(strf.Data(),
"w+");
1212 AliErrorF(
"Failed to open output file %s",strf.Data());
1217 fprintf(stream,
"# Set of Chebyshev parameterizations for ALICE magnetic field\nSTART %s\n",GetName());
1218 fprintf(stream,
"START SOLENOID\n#Number of pieces\n%d\n",fNParamsSol);
1220 fprintf(stream,
"#\nEND SOLENOID\n");
1224 fprintf(stream,
"START TPCINT\n#Number of pieces\n%d\n",fNParamsTPC);
1226 fprintf(stream,
"#\nEND TPCINT\n");
1230 fprintf(stream,
"START TPCRatINT\n#Number of pieces\n%d\n",fNParamsTPCRat);
1232 fprintf(stream,
"#\nEND TPCRatINT\n");
1235 fprintf(stream,
"START DIPOLE\n#Number of pieces\n%d\n",fNParamsDip);
1237 fprintf(stream,
"#\nEND DIPOLE\n");
1239 fprintf(stream,
"#\nEND %s\n",GetName());
1246 float xmn,
float xmx,
float ymn,
float ymx,
float zmn,
float zmx)
1250 float *tmpC =
new float[2*npar];
1251 int *tmpInd =
new int[2*npar];
1253 for (
int ip=0;ip<npar;ip++) {
1263 TMath::Sort(nseg0,tmpC,tmpInd,kFALSE);
1267 for (
int ip=0;ip<nseg0;ip++) {
1268 if (TMath::Abs(cprev-tmpC[ tmpInd[ip] ])>1e-4) {
1269 cprev = tmpC[ tmpInd[ip] ];
1272 else tmpInd[ip] = -1;
1275 *seg =
new float[nseg];
1277 for (
int ip=0;ip<nseg0;ip++) if (tmpInd[ip]>=0) (*seg)[nseg++] = tmpC[ tmpInd[ip] ];
static void CylToCartCylB(const Double_t *rphiz, const Double_t *brphiz, Double_t *bxyz)
Float_t GetMaxZTPCRatInt() const
Float_t GetBoundMin(int i) const
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void AddParamTPCInt(const AliCheb3D *param)
Float_t GetMaxRTPCRatInt() const
AliCheb3D * GetParamTPCInt(Int_t ipar) const
void BuildTableTPCRatInt()
Float_t GetMinZTPCRatInt() const
#define AliFatalF(message,...)
void 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)
Float_t GetMaxRTPCInt() const
Double_t GetBz(const Double_t *xyz) const
void GetTPCInt(const Double_t *xyz, Double_t *b) const
Int_t FindDipSegment(const Double_t *xyz) const
Int_t GetDipSegmentsForZSlice(int zid, TObjArray &arr) const
Int_t SegmentDimension(Float_t **seg, const TObjArray *par, int npar, int dim, Float_t xmn, Float_t xmx, Float_t ymn, Float_t ymx, Float_t zmn, Float_t zmx)
void GetTPCRatInt(const Double_t *xyz, Double_t *b) const
void Eval(const Float_t *par, Float_t *res)
TObjArray * fParamsTPCRat
void LoadData(const char *inpfile)
AliCheb3D * GetParamDip(Int_t ipar) const
void Print(const Option_t *opt="") const
Float_t GetMinZTPCInt() const
Int_t FindSolSegment(const Double_t *xyz) const
static void ReadLine(TString &str, FILE *stream)
AliCheb3D * GetParamSol(Int_t ipar) const
AliCheb3D * fCacheTPCInt
last used dipole patch
virtual void Print(Option_t *="") const
virtual void Clear(const Option_t *="")
AliCheb3D * GetParamTPCRatInt(Int_t ipar) const
void GetTPCIntCyl(const Double_t *rphiz, Double_t *b) const
Int_t FindTPCRatSegment(const Double_t *xyz) const
Int_t FindTPCSegment(const Double_t *xyz) const
AliCheb3D * fCacheDip
last used solenoid patch
Bool_t IsInside(const Float_t *par) const
Float_t GetMaxZTPCInt() const
void SaveData(const char *outfile) const
virtual void Field(const Double_t *xyz, Double_t *b) const
AliMagWrapCheb & operator=(const AliMagWrapCheb &rhs)
void AddParamTPCRatInt(const AliCheb3D *param)
Double_t FieldCylSolBz(const Double_t *rphiz) const
static void CartToCyl(const Double_t *xyz, Double_t *rphiz)
void SaveData(const char *outfile, Bool_t append=kFALSE) const
void AddParamDip(const AliCheb3D *param)
AliCheb3D * fCacheTPCRat
last used patch for TPC integral
void CopyFrom(const AliMagWrapCheb &src)
void LoadData(const char *inpFile)
void AddParamSol(const AliCheb3D *param)
#define AliErrorF(message,...)
void GetTPCRatIntCyl(const Double_t *rphiz, Double_t *b) const
Float_t GetBoundMax(int i) const
void FieldCylSol(const Double_t *rphiz, Double_t *b) const