1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-------------------------------------------------------------------------
19 // Field with Magnetic Field map
20 // Used by AliRun class
22 //-------------------------------------------------------------------------
28 #include "AliMagFDM.h"
32 //_______________________________________________________________________
33 AliMagFDM::AliMagFDM():
62 // Default constructor for the Dipole field
66 //_______________________________________________________________________
67 AliMagFDM::AliMagFDM(const char *name, const char *title, Int_t integ,
68 Float_t factor, Float_t fmax):
69 AliMagFC(name,title,integ,factor,fmax),
98 // Standard constructor for the Dipole field
105 "Field Map for Muon Arm from IP till muon filter %s created: map= %d, integ= %d, factor= %f, file=%s",
106 fName.Data(), fMap ,integ,factor,fTitle.Data()));
110 //_______________________________________________________________________
111 void AliMagFDM::Field(const float *xfi, float *b) const
114 // Main routine to compute the field in a point
116 const Double_t keps=0.1E-06;
117 const Double_t kPI2=2.*TMath::Pi();
118 const Double_t kone=1;
128 const Double_t kfZbg=502.92; // Start of Map using in z
129 const Double_t kfZL3=600; // Beginning of L3 door in z
138 Double_t zp1, zp2,xp1,xp2,yp1,yp2;
139 Double_t zz1, zz2,yy1,yy2,x2,x1;
141 // --- start the map fiel from z = 502.92 cm ---
143 // This map has been calculated in a coordinate system in which the muon spectrometer sits at z > 0
144 // Transfor correspondingly.
151 // printf("x[0] %f,x[1] %f,x[2] %f\n",x[0],x[1],x[2]);
153 Double_t rr=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
157 if ( (-700<x[2] && x[2]<=kfZbg &&
158 (x[0]*x[0]+(x[1]+30)*(x[1]+30))< 560*560)
159 || (kfZbg<x[2] && x[2]<=kfZL3 && (rr>rPmax*100 && rr< 560)) )
166 xL3[1]=(x[1]+30)/100;
170 if (TMath::Abs(xL3[0])<=0.1E-06) xL3[0]=TMath::Sign(0.1E-05,xL3[0]);
171 if (TMath::Abs(xL3[1])<=0.1E-06) xL3[1]=TMath::Sign(0.1E-05,xL3[1]);
173 Double_t xminn=xL3[2]*fAx1+fCx1;
174 Double_t xmaxx=xL3[2]*fAx2+fCx2;
175 Double_t zCmin,zCmax,yCmin,yCmax;
181 if ((kfZbg/100<xL3[2] && xL3[2]<=zCmin && r0<=rPmax) || ((zCmin<xL3[2] && xL3[2] <= zCmax ) && (yCmin<xL3[1] && xL3[1]<= yCmax) && (xminn<xL3[0] && xL3[0] <= xmaxx)))
185 if (kfZbg/100<xL3[2] && xL3[2]<=zCmin && r0<=rPmax)
187 //--------------------- Polar part ----------------------
192 Double_t alp1,alp2,alp3;
193 Double_t zpz,rp,fip,cphi;
200 kp0=FZ(zpz, fZp ,fZpdl,kpi,fZpl) ;
201 zp2=(zpz-fZp[kp0])/(fZp[kp0+1]-fZp[kp0]);
204 cphi=TMath::Abs(yyp/r0);
207 AliDebug(2,Form("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, cphi %e",xL3[0],xL3[1],xL3[2],yyp,r0,cphi));
211 ph0=TMath::ACos(cphi);
212 if (xL3[0] < 0 && yyp > 0 ) {ph0=kPI2/2 - ph0;}
213 if (xL3[0] < 0 && yyp < 0 ) {ph0=kPI2/2 + ph0;}
214 if (xL3[0] > 0 && yyp < 0 ) {ph0=kPI2 - ph0;}
215 if (ph0 > kPI2) { ph0=ph0 - kPI2;}
217 AliDebug(2,Form("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, ph0 %e",xL3[0],xL3[1],xL3[2],yyp,r0,ph0));
220 mp0=FZ(fip,fPhi,fPhid ,mpi,fPhin);
221 xp2=(fip-fPhi[mp0])/(fPhi[mp0+1]-fPhi[mp0]);
233 bint[0]=(zp1*fBpx[kp0][0][0] + zp2*fBpx[kp0+1][0][0])*10;
234 bint[1]=(zp1*fBpy[kp0][0][0] + zp2*fBpy[kp0+1][0][0])*10;
235 bint[2]=(zp1*fBpz[kp0][0][0] + zp2*fBpz[kp0+1][0][0])*10;
239 alp2= fB[0][0][mp0]*yyp + fB[0][1][mp0]*xL3[0];
240 alp3= fB[1][0][mp0]*yyp + fB[1][1][mp0]*xL3[0];
241 alp1= kone - alp2 - alp3;
243 for (jb=0; jb<3 ; jb++)
246 bint[jb] = Ba(iKvar,zp1,zp2,alp1,alp2,alp3, kp0,mp0)*10 ;
248 } // end of keps <=r0
254 lp0=FZ(rp,fR ,fRdel,lpi,fRn);
255 yp2=(rp-fR[lp0])/(fR[lp0+1]-fR[lp0]);
258 for (jb=0; jb<3 ; jb++)
261 bint[jb] = Bb(zp1,zp2,yp1,yp2,xp1,xp2,iKvar,kp0,lp0,mp0)*10 ;
272 //-------------- Cartensian part ------------------
276 Double_t xx1, xx2,dx, xxx ,xXl;
283 xx1 = fAx1*xL3[2] + fCx1;
284 xx2 = fAx2*xL3[2] + fCx2;
287 k0=FZ(zzc, fZc ,fZdel, kci, fZl);
288 zz2=(zzc-fZc[k0])/(fZc[k0+1]-fZc[k0]);
292 l0=FZ(yyc, fY , fYdel,lci,fYl);
293 yy2=(yyc-fY[l0])/(fY[l0+1]-fY[l0]);;
300 if(xL3[0]<(xx1+m0*dx) || xL3[0] >(xx1+(m0+1)*dx))
303 AliDebug(2,Form(" m0 %d, m0+1 %d\n",m0,m0+1));
306 x2=(xL3[0]-( xx1+m0*dx))/dx;
309 for (jb=3; jb<6; jb++)
312 bint[jb-3] = Bb(zz1,zz2,yy1,yy2,x1,x2,iKvar,k0, l0, m0)*10 ;
323 AliError(Form("Unknown map of Dipole region %d",fMap));
338 //_______________________________________________________________________
339 void AliMagFDM::Field(const double *xfi, double *b) const
342 // Main routine to compute the field in a point
344 const Double_t keps=0.1E-06;
345 const Double_t kPI2=2.*TMath::Pi();
346 const Double_t kone=1;
356 const Double_t kfZbg=502.92; // Start of Map using in z
357 const Double_t kfZL3=600; // Beginning of L3 door in z
366 Double_t zp1, zp2,xp1,xp2,yp1,yp2;
367 Double_t zz1, zz2,yy1,yy2,x2,x1;
369 // --- start the map fiel from z = 502.92 cm ---
371 // This map has been calculated in a coordinate system in which the muon spectrometer sits at z > 0
372 // Transfor correspondingly.
379 // printf("x[0] %f,x[1] %f,x[2] %f\n",x[0],x[1],x[2]);
381 Double_t rr=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
385 if ( (-700<x[2] && x[2]<=kfZbg &&
386 (x[0]*x[0]+(x[1]+30)*(x[1]+30))< 560*560)
387 || (kfZbg<x[2] && x[2]<=kfZL3 && (rr>rPmax*100 && rr< 560)) )
394 xL3[1]=(x[1]+30)/100;
398 if (TMath::Abs(xL3[0])<=0.1E-06) xL3[0]=TMath::Sign(0.1E-05,xL3[0]);
399 if (TMath::Abs(xL3[1])<=0.1E-06) xL3[1]=TMath::Sign(0.1E-05,xL3[1]);
401 Double_t xminn=xL3[2]*fAx1+fCx1;
402 Double_t xmaxx=xL3[2]*fAx2+fCx2;
403 Double_t zCmin,zCmax,yCmin,yCmax;
409 if ((kfZbg/100<xL3[2] && xL3[2]<=zCmin && r0<=rPmax) || ((zCmin<xL3[2] && xL3[2] <= zCmax ) && (yCmin<xL3[1] && xL3[1]<= yCmax) && (xminn<xL3[0] && xL3[0] <= xmaxx)))
413 if (kfZbg/100<xL3[2] && xL3[2]<=zCmin && r0<=rPmax)
415 //--------------------- Polar part ----------------------
420 Double_t alp1,alp2,alp3;
421 Double_t zpz,rp,fip,cphi;
428 kp0=FZ(zpz, fZp ,fZpdl,kpi,fZpl) ;
429 zp2=(zpz-fZp[kp0])/(fZp[kp0+1]-fZp[kp0]);
432 cphi=TMath::Abs(yyp/r0);
435 AliDebug(2,Form("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, cphi %e",xL3[0],xL3[1],xL3[2],yyp,r0,cphi));
439 ph0=TMath::ACos(cphi);
440 if (xL3[0] < 0 && yyp > 0 ) {ph0=kPI2/2 - ph0;}
441 if (xL3[0] < 0 && yyp < 0 ) {ph0=kPI2/2 + ph0;}
442 if (xL3[0] > 0 && yyp < 0 ) {ph0=kPI2 - ph0;}
443 if (ph0 > kPI2) { ph0=ph0 - kPI2;}
445 AliDebug(2,Form("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, ph0 %e",xL3[0],xL3[1],xL3[2],yyp,r0,ph0));
448 mp0=FZ(fip,fPhi,fPhid ,mpi,fPhin);
449 xp2=(fip-fPhi[mp0])/(fPhi[mp0+1]-fPhi[mp0]);
461 bint[0]=(zp1*fBpx[kp0][0][0] + zp2*fBpx[kp0+1][0][0])*10;
462 bint[1]=(zp1*fBpy[kp0][0][0] + zp2*fBpy[kp0+1][0][0])*10;
463 bint[2]=(zp1*fBpz[kp0][0][0] + zp2*fBpz[kp0+1][0][0])*10;
467 alp2= fB[0][0][mp0]*yyp + fB[0][1][mp0]*xL3[0];
468 alp3= fB[1][0][mp0]*yyp + fB[1][1][mp0]*xL3[0];
469 alp1= kone - alp2 - alp3;
471 for (jb=0; jb<3 ; jb++)
474 bint[jb] = Ba(iKvar,zp1,zp2,alp1,alp2,alp3, kp0,mp0)*10 ;
476 } // end of keps <=r0
482 lp0=FZ(rp,fR ,fRdel,lpi,fRn);
483 yp2=(rp-fR[lp0])/(fR[lp0+1]-fR[lp0]);
486 for (jb=0; jb<3 ; jb++)
489 bint[jb] = Bb(zp1,zp2,yp1,yp2,xp1,xp2,iKvar,kp0,lp0,mp0)*10 ;
500 //-------------- Cartensian part ------------------
504 Double_t xx1, xx2,dx, xxx ,xXl;
511 xx1 = fAx1*xL3[2] + fCx1;
512 xx2 = fAx2*xL3[2] + fCx2;
515 k0=FZ(zzc, fZc ,fZdel, kci, fZl);
516 zz2=(zzc-fZc[k0])/(fZc[k0+1]-fZc[k0]);
520 l0=FZ(yyc, fY , fYdel,lci,fYl);
521 yy2=(yyc-fY[l0])/(fY[l0+1]-fY[l0]);;
528 if(xL3[0]<(xx1+m0*dx) || xL3[0] >(xx1+(m0+1)*dx))
531 AliDebug(2,Form(" m0 %d, m0+1 %d\n",m0,m0+1));
534 x2=(xL3[0]-( xx1+m0*dx))/dx;
537 for (jb=3; jb<6; jb++)
540 bint[jb-3] = Bb(zz1,zz2,yy1,yy2,x1,x2,iKvar,k0, l0, m0)*10 ;
551 AliError(Form("Unknown map of Dipole region %d",fMap));
567 //_______________________________________________________________________
568 Int_t AliMagFDM::FZ(Double_t temp, const Float_t *Ar,
569 Float_t delu, Int_t ik, Int_t nk) const
572 // Quest of a point position at x,y,z (Cartensian) and R,Phi,z (Polar) axises
586 for(l=ikj; l<nk; l++)
599 //_______________________________________________________________________
600 Double_t AliMagFDM::Ba(Int_t kaai,Double_t zaa1, Double_t zaa2,
601 Double_t alf1, Double_t alf2, Double_t alf3,
602 Int_t kaa, Int_t maa) const
605 // Calculation of field componet for case (keps <r0<= fRdel) at a given axis
607 Double_t fa11=0,fa12=0,fa13=0;
608 Double_t fa21=0,fa22=0,fa23=0;
609 Double_t faY1=0,faY2=0;
614 fa11 = fBpx[kaa][0][0];
615 fa12 = fBpx[kaa][0][maa];
616 fa13 = fBpx[kaa][0][maa+1];
617 fa21 = fBpx[kaa+1][0][0];
618 fa22 = fBpx[kaa+1][0][maa];
619 fa23 = fBpx[kaa+1][0][maa+1];
622 fa11 = fBpy[kaa][0][0];
623 fa12 = fBpy[kaa][0][maa];
624 fa13 = fBpy[kaa][0][maa+1];
625 fa21 = fBpy[kaa+1][0][0];
626 fa22 = fBpy[kaa+1][0][maa];
627 fa23 = fBpy[kaa+1][0][maa+1];
630 fa11 = fBpz[kaa][0][0];
631 fa12 = fBpz[kaa][0][maa];
632 fa13 = fBpz[kaa][0][maa+1];
633 fa21 = fBpz[kaa+1][0][0];
634 fa22 = fBpz[kaa+1][0][maa];
635 fa23 = fBpz[kaa+1][0][maa+1];
638 AliFatal(Form("Invalid value of kaai %d",kaai));
640 faY1=alf1*fa11+alf2*fa12+alf3*fa13;
641 faY2=alf1*fa21+alf2*fa22+alf3*fa23;
642 bba = zaa1*faY1+zaa2*faY2;
647 //_______________________________________________________________________
648 Double_t AliMagFDM::Bb(Double_t z1,Double_t z2, Double_t y1,Double_t y2,
649 Double_t x1,Double_t x2, Int_t kv, Int_t k, Int_t l, Int_t m) const
652 // Calculation of field componet at a given axis (general case)
654 Double_t fy1=0,fy2=0,ffy=0;
655 Double_t gy1=0,gy2=0,ggy=0;
657 Double_t bf11=0,bf12=0,bf21=0,bf22=0;
658 Double_t bg11=0,bg12=0,bg21=0,bg22=0;
661 /*-----------------Polar part ------------------*/
666 bf12=fBpx[k+1][l][m];
667 bf21=fBpx[k+1][l+1][m];
668 bf22=fBpx[k][l+1][m];
670 bg11=fBpx[k][l][m+1];
671 bg12=fBpx[k+1][l][m+1];
672 bg21=fBpx[k+1][l+1][m+1];
673 bg22=fBpx[k][l+1][m+1];
678 bf12=fBpy[k+1][l][m];
679 bf21=fBpy[k+1][l+1][m];
680 bf22=fBpy[k][l+1][m];
682 bg11=fBpy[k][l][m+1];
683 bg12=fBpy[k+1][l][m+1];
684 bg21=fBpy[k+1][l+1][m+1];
685 bg22=fBpy[k][l+1][m+1];
690 bf12=fBpz[k+1][l][m];
691 bf21=fBpz[k+1][l+1][m];
692 bf22=fBpz[k][l+1][m];
694 bg11=fBpz[k][l][m+1];
695 bg12=fBpz[k+1][l][m+1];
696 bg21=fBpz[k+1][l+1][m+1];
697 bg22=fBpz[k][l+1][m+1];
699 /*-----------------Cartensian part ---------------*/
703 bf12=fBcx[k+1][l][m];
704 bf21=fBcx[k+1][l+1][m];
705 bf22=fBcx[k][l+1][m];
707 bg11=fBcx[k][l][m+1];
708 bg12=fBcx[k+1][l][m+1];
709 bg21=fBcx[k+1][l+1][m+1];
710 bg22=fBcx[k][l+1][m+1];
715 bf12=fBcy[k+1][l][m];
716 bf21=fBcy[k+1][l+1][m];
717 bf22=fBcy[k][l+1][m];
719 bg11=fBcy[k][l][m+1];
720 bg12=fBcy[k+1][l][m+1];
721 bg21=fBcy[k+1][l+1][m+1];
722 bg22=fBcy[k][l+1][m+1];
727 bf12=fBcz[k+1][l][m];
728 bf21=fBcz[k+1][l+1][m];
729 bf22=fBcz[k][l+1][m];
731 bg11=fBcz[k][l][m+1];
732 bg12=fBcz[k+1][l][m+1];
733 bg21=fBcz[k+1][l+1][m+1];
734 bg22=fBcz[k][l+1][m+1];
738 AliFatal(Form("Invalid value of kv %d",kv));
744 fy2=z2*bf21+z1* bf22;
748 gy1 = z1*bg11+z2*bg12;
749 gy2 = z2*bg21+z1*bg22;
750 ggy= y1*gy1 + y2*gy2;
758 //_______________________________________________________________________
759 void AliMagFDM::ReadField()
762 // Method to read the magnetic field from file
767 Float_t zzp, rr,phii;
768 Float_t zz, yy, bx,by,bz,bb;
771 AliDebug(1,Form("Reading Magnetic Field %s from file %s",fName.Data(),fTitle.Data()));
772 fname = gSystem->ExpandPathName(fTitle.Data());
773 magfile=fopen(fname,"r");
776 AliDebug(2,"Cartensian part");
782 fscanf(magfile,"%d %d %d ",&fYl, &fXl, &fZl);
784 AliDebug(3,Form("fYl %d, fXl %d, fZl %d",fYl, fXl, fZl));
786 for (ik=0; ik<fZl; ik++)
789 fscanf(magfile, " %e ", &zz);
794 for (ik=0; ik<fYl; ik++)
796 fscanf(magfile, " %e ", &yy);
800 for (ik=0; ik<81; ik++)
802 AliDebug(4,Form("fZc %e,fY %e", fZc[ik],fY[ik]));
805 fscanf(magfile," %e %e %e %e %e %e %e %e %e %e %e ", &fYdel,&fXdel,&fZdel,&fZmax,&fZmin,&fYmax,&fYmin,&fAx1,&fCx1,&fAx2,&fCx2);
807 AliDebug(3,Form("fYdel %e, fXdel %e, fZdel %e",fYdel,fXdel,fZdel));
808 AliDebug(3,Form("fZmax %e, fZmin %e, fYmax %e,fYmin %e",fZmax,fZmin,fYmax,fYmin));
809 AliDebug(3,Form("fAx1 %e, fCx1 %e, fAx2 %e, fCx %e",fAx1,fCx1,fAx2,fCx2));
811 for (il=0; il<44; il++) {
812 for (im=0; im<81; im++) {
813 for (ik=0; ik<81; ik++) {
815 fscanf(magfile, " %e ", &by);
821 for (il=0; il<44; il++) {
822 for (im=0; im<81; im++) {
823 for (ik=0; ik<81; ik++) {
825 fscanf(magfile, " %e ", &bx);
831 for (il=0; il<44; il++) {
832 for (im=0; im<81; im++) {
833 for (ik=0; ik<81; ik++) {
835 fscanf(magfile, " %e ", &bz);
840 //---------------------- Polar part ---------------------------------
842 AliDebug(2,"Polar part");
843 fscanf(magfile,"%d %d %d ", &fZpl, &fRn, &fPhin);
844 AliDebug(3,Form("fZpl %d, fRn %d, fPhin %d",fZpl,fRn,fPhin));
846 AliDebug(4," fZp array");
848 for (ik=0; ik<51; ik++)
850 fscanf(magfile, " %e ", &zzp);
852 AliDebug(4,Form(" %e",fZp[ik]));
855 AliDebug(4," fR array");
857 for (ik=0; ik<10; ik++)
859 fscanf(magfile, " %e ", &rr);
861 AliDebug(4,Form(" %e",fR[ik]));
864 // AliDebug(4,"fPhi array");
866 for (il=0; il<33; il++)
868 fscanf(magfile, " %e ", &phii);
870 // AliDebug(4,Form(" %e",fPhi[il]));
873 fscanf(magfile," %e %e %e %e %e %e %e ",&fZpdl,&fPhid,&fRdel,&fZpmx,&fZpmn,&fRmax, &fRmin);
875 AliDebug(3,Form("fZpdl %e, fPhid %e, fRdel %e, fZpmx %e, fZpmn %e,fRmax %e,fRmin %e", fZpdl,fPhid, fRdel,fZpmx, fZpmn,fRmax, fRmin));
878 for (il=0; il<33; il++) {
879 for (im=0; im<10; im++) {
880 for (ik=0; ik<51; ik++) {
881 fscanf(magfile, " %e ", &by);
887 for (il=0; il<33; il++) {
888 for (im=0; im<10; im++) {
889 for (ik=0; ik<51; ik++) {
890 fscanf(magfile, " %e ", &bx);
897 for (il=0; il<33; il++) {
898 for (im=0; im<10; im++) {
899 for (ik=0; ik<51; ik++) {
900 fscanf(magfile, " %e ", &bz);
907 for (il=0; il<32; il++) {
908 for (im=0; im<2; im++) {
909 for (ik=0; ik<2; ik++) {
910 fscanf(magfile, " %e ", &bb);
917 AliFatal(Form("File %s not found !",fTitle.Data()));