54 #include "TObjArray.h" 57 #include "TLinearFitter.h" 65 static Double_t
GetBx(Double_t r, Double_t phi, Double_t z,Int_t index=0);
66 static Double_t
GetBy(Double_t r, Double_t phi, Double_t z,Int_t index=0);
67 static Double_t
GetBz(Double_t r, Double_t phi, Double_t z,Int_t index=0);
68 static Double_t
GetBr(Double_t r, Double_t phi, Double_t z,Int_t index=0);
69 static Double_t
GetBrfi(Double_t r, Double_t phi, Double_t z,Int_t index=0);
72 static TObjArray *
Fit(
const char *formula, Int_t index=0);
89 fgArray.AddAt(magf,index);
97 Float_t xyz[3]={r*TMath::Cos(phi),r*TMath::Sin(phi),z};
100 mag->
Field(xyz,bxyz);
109 Float_t xyz[3]={r*TMath::Cos(phi),r*TMath::Sin(phi),z};
112 mag->
Field(xyz,bxyz);
122 Float_t xyz[3]={r*TMath::Cos(phi),r*TMath::Sin(phi),z};
125 mag->
Field(xyz,bxyz);
137 Float_t xyz[3]={r*TMath::Cos(phi),r*TMath::Sin(phi),z};
140 mag->
Field(xyz,bxyz);
142 Float_t br = bxyz[0]*xyz[0]/r+bxyz[1]*xyz[1]/r;
151 Float_t xyz[3]={r*TMath::Cos(phi),r*TMath::Sin(phi),z};
154 mag->
Field(xyz,bxyz);
156 Float_t br = -bxyz[0]*xyz[1]/r+bxyz[1]*xyz[0]/r;
164 TObjArray *fstrings = TString(formula).Tokenize(
"++");
165 Int_t ndim = fstrings->GetEntries();
167 for (Int_t i=0;i<ndim;i++){
168 formulas->AddAt(
new TFormula(Form(
"fff_%d",i),fstrings->At(i)->GetName()),i);
170 TLinearFitter * fitR =
new TLinearFitter(ndim+1,Form(
"hyp%d",ndim));
171 TLinearFitter * fitRFI =
new TLinearFitter(ndim+1,Form(
"hyp%d",ndim));
172 TLinearFitter * fitZ =
new TLinearFitter(ndim+1,Form(
"hyp%d",ndim));
174 for (Float_t r=20; r<250;r+=20){
175 for (Float_t fi=0; fi<TMath::Pi()*2;fi+=0.2){
176 for (Float_t z=-250; z<250;z+=20){
177 for (Int_t ifor=0;ifor<ndim;ifor++){
178 x[ifor]= ((TFormula*)formulas->At(ifor))->Eval(r/250.,fi,z/250.);
191 res->AddAt(fitRFI,1);
193 printf(
"\tchi2\tn\tRMS\n");
194 printf(
"\t%f\t%d\t%f\n",fitR->GetChisquare(),fitR->GetNpoints(),TMath::Sqrt(fitR->GetChisquare()/fitR->GetNpoints()));
195 printf(
"\t%f\t%d\t%f\n",fitRFI->GetChisquare(),fitRFI->GetNpoints(),TMath::Sqrt(fitRFI->GetChisquare()/fitRFI->GetNpoints()));
196 printf(
"\t%f\t%d\t%f\n",fitZ->GetChisquare(),fitZ->GetNpoints(),TMath::Sqrt(fitZ->GetChisquare()/fitZ->GetNpoints()));
198 TFormula * funBZ =
new TFormula(
"funBZ",formula);
199 TFormula * funBR =
new TFormula(
"funBR",formula);
200 TFormula * funBRFI =
new TFormula(
"funBRFI",formula);
202 fitR->GetParameters(vec);
203 funBR->SetParameters(vec.GetMatrixArray());
204 fitRFI->GetParameters(vec);
205 funBRFI->SetParameters(vec.GetMatrixArray());
206 fitZ->GetParameters(vec);
207 funBZ->SetParameters(vec.GetMatrixArray());
217 for (Int_t ix=0;ix<3;ix++)
218 for (Int_t iz=0;iz<3;iz++){
220 str+=Form(
"x^%d*z^%d++",ix,iz);
221 printf(
"x^%d*z^%d++\n",ix,iz);
223 for (Int_t iy=1;iy<4;iy++){
224 if (ix+iz+iy==0)
continue;
225 str+=Form(
"x^%d*z^%d*sin(y*%d)++",ix,iz,iy);
226 str+=Form(
"x^%d*z^%d*cos(y*%d)++",ix,iz,iy);
227 printf(
"x^%d*z^%d*sin(y*%d)++\n",ix,iz,iy);
228 printf(
"x^%d*z^%d*cos(y*%d)++\n",ix,iz,iy);
232 str[str.Length()-2]=0;
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
static Double_t GetBx(Double_t r, Double_t phi, Double_t z, Int_t index=0)
virtual void Field(const Double_t *x, Double_t *b)
static TObjArray * Fit(const char *formula, Int_t index=0)
static void RegisterField(Int_t index, AliMagF *magf)
static Double_t GetBrfi(Double_t r, Double_t phi, Double_t z, Int_t index=0)
static Double_t GetBy(Double_t r, Double_t phi, Double_t z, Int_t index=0)
static AliMagF::BMap_t mag
static Double_t GetBz(Double_t r, Double_t phi, Double_t z, Int_t index=0)
class TVectorT< Double_t > TVectorD
static Double_t GetBr(Double_t r, Double_t phi, Double_t z, Int_t index=0)