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 Revision 1.9 2001/01/17 20:02:20 morsch
19 In the AliMagFDM tree call-by-reference functions were changed to
20 call-by-value, what is more adequate for our task. There were added
21 a few comments and put protection to values of cos > 1.000 in
22 AliMagFDM.cxx. (Galina Chabratova)
24 Revision 1.8 2000/12/18 10:44:01 morsch
25 Possibility to set field map by passing pointer to objet of type AliMagF via
28 gAlice->SetField(new AliMagFCM("Map2", "$(ALICE_ROOT)/data/field01.dat",2,1.,10.));
30 Revision 1.7 2000/12/01 11:20:27 alibrary
31 Corrector dipole removed from ZDC
33 Revision 1.6 2000/11/10 18:09:55 fca
34 New field map for the ZDC
36 Revision 1.5 2000/10/27 14:17:04 morsch
37 - Bug causing segmentation violation during muon reconstruction corrected
38 - Coding rule violations corrected.
41 Revision 1.4 2000/10/02 21:28:14 fca
42 Removal of useless dependecies via forward declarations
44 Revision 1.3 2000/07/13 16:19:09 fca
45 Mainly coding conventions + some small bug fixes
47 Revision 1.2 2000/07/12 08:56:25 fca
48 Coding convention correction and warning removal
50 Revision 1.1 2000/07/11 18:24:59 fca
51 Coding convention corrections + few minor bug fixes
57 #include "AliMagFDM.h"
63 //________________________________________
64 AliMagFDM::AliMagFDM(const char *name, const char *title, const Int_t integ,
65 const Float_t factor, const Float_t fmax)
66 : AliMagF(name,title,integ,factor,fmax)
69 // Standard constructor for the Dipole field
74 printf("Field Map for Muon Arm from IP till muon filter %s created: map= %d, integ= %d, factor= %f, file=%s\n",fName.Data(), fMap ,integ,factor,fTitle.Data());
78 //________________________________________
80 void AliMagFDM::Field(Float_t *xfi, Float_t *b)
83 // Main routine to compute the field in a point
85 static const Double_t keps=0.1E-06;
86 static const Double_t PI2=2.*TMath::Pi();
87 static const Double_t kone=1;
89 static const Int_t kiip=33;
90 static const Int_t kmiip=0;
91 static const Int_t kliip=0;
93 static const Int_t kiic=0;
94 static const Int_t kmiic=0;
95 static const Int_t kliic=0;
97 static const Double_t kfZbg=502.92; // Start of Map using in z
98 static const Double_t kfZL3=600; // Beginning of L3 door in z
107 Double_t zp1, zp2,xp1,xp2,yp1,yp2;
108 Double_t zz1, zz2,yy1,yy2,x2,x1;
110 // --- start the map fiel from z = 502.92 cm ---
116 // printf("x[0] %f,x[1] %f,x[2] %f\n",x[0],x[1],x[2]);
118 Double_t rr=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
122 if ( (-700<x[2] && x[2]<=kfZbg &&
123 (x[0]*x[0]+(x[1]+30)*(x[1]+30))< 560*560)
124 || (kfZbg<x[2] && x[2]<=kfZL3 && (rr>rPmax*100 && rr< 560)) )
131 xL3[1]=(x[1]+30)/100;
135 if (TMath::Abs(xL3[0])<=0.1E-06) xL3[0]=TMath::Sign(0.1E-05,xL3[0]);
136 if (TMath::Abs(xL3[1])<=0.1E-06) xL3[1]=TMath::Sign(0.1E-05,xL3[1]);
138 Double_t xminn=xL3[2]*fAx1+fCx1;
139 Double_t xmaxx=xL3[2]*fAx2+fCx2;
140 Double_t zCmin,zCmax,yCmin,yCmax;
146 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)))
150 if (kfZbg/100<xL3[2] && xL3[2]<=zCmin && r0<=rPmax)
152 //--------------------- Polar part ----------------------
157 Double_t alp1,alp2,alp3;
158 Double_t zpz,rp,fip,cphi;
165 kp0=FZ(zpz, fZp ,fZpdl,kpi,fZpl) ;
166 zp2=(zpz-fZp[kp0])/(fZp[kp0+1]-fZp[kp0]);
169 cphi=TMath::Abs(yyp/r0);
172 printf("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, cphi %e\n",xL3[0],xL3[1],xL3[2],yyp,r0,cphi);
176 ph0=TMath::ACos(cphi);
177 if (xL3[0] < 0 && yyp > 0 ) {ph0=PI2/2 - ph0;}
178 if (xL3[0] < 0 && yyp < 0 ) {ph0=PI2/2 + ph0;}
179 if (xL3[0] > 0 && yyp < 0 ) {ph0=PI2 - ph0;}
180 if (ph0 > PI2) { ph0=ph0 - PI2;}
182 printf("xL3[0] %e, xL3[1] %e, xL3[2] %e, yyp %e, r0 %e, ph0 %e\n",xL3[0],xL3[1],xL3[2],yyp,r0,ph0);
185 mp0=FZ(fip,fPhi,fPhid ,mpi,fPhin);
186 xp2=(fip-fPhi[mp0])/(fPhi[mp0+1]-fPhi[mp0]);
198 bint[0]=(zp1*fBpx[kp0][0][0] + zp2*fBpx[kp0+1][0][0])*10;
199 bint[1]=(zp1*fBpy[kp0][0][0] + zp2*fBpy[kp0+1][0][0])*10;
200 bint[2]=(zp1*fBpz[kp0][0][0] + zp2*fBpz[kp0+1][0][0])*10;
204 alp2= fB[0][0][mp0]*yyp + fB[0][1][mp0]*xL3[0];
205 alp3= fB[1][0][mp0]*yyp + fB[1][1][mp0]*xL3[0];
206 alp1= kone - alp2 - alp3;
208 for (jb=0; jb<3 ; jb++)
211 bint[jb] = Ba(iKvar,zp1,zp2,alp1,alp2,alp3, kp0,mp0)*10 ;
213 } // end of keps <=r0
219 lp0=FZ(rp,fR ,fRdel,lpi,fRn);
220 yp2=(rp-fR[lp0])/(fR[lp0+1]-fR[lp0]);
223 for (jb=0; jb<3 ; jb++)
226 bint[jb] = Bb(zp1,zp2,yp1,yp2,xp1,xp2,iKvar,kp0,lp0,mp0)*10 ;
237 //-------------- Cartensian part ------------------
241 Double_t xx1, xx2,dx, xxx ,xXl;
248 xx1 = fAx1*xL3[2] + fCx1;
249 xx2 = fAx2*xL3[2] + fCx2;
252 k0=FZ(zzc, fZc ,fZdel, kci, fZl);
253 zz2=(zzc-fZc[k0])/(fZc[k0+1]-fZc[k0]);
257 l0=FZ(yyc, fY , fYdel,lci,fYl);
258 yy2=(yyc-fY[l0])/(fY[l0+1]-fY[l0]);;
265 if(xL3[0]<(xx1+m0*dx) || xL3[0] >(xx1+(m0+1)*dx))
268 printf(" m0 %d, m0+1 %d\n",m0,m0+1);
271 x2=(xL3[0]-( xx1+m0*dx))/dx;
274 for (jb=3; jb<6; jb++)
277 bint[jb-3] = Bb(zz1,zz2,yy1,yy2,x1,x2,iKvar,k0, l0, m0)*10 ;
285 printf("x %f, y %f, z %f:: bx %f, by %f, bz %f\n",xfi[0],xfi[1],xfi[2],b[0],b[1],b[2]);
289 printf("Unknown map of Dipole region %d\n",fMap);
294 //This is the ZDC part
295 Float_t rad2=x[0]*x[0]+x[1]*x[1];
296 if(x[2]>kCORBEG2 && x[2]<kCOREND2){
301 else if(x[2]>kZ1BEG && x[2]<kZ1END){
307 else if(x[2]>kZ2BEG && x[2]<kZ2END){
313 else if(x[2]>kZ3BEG && x[2]<kZ3END){
319 else if(x[2]>kZ4BEG && x[2]<kZ4END){
325 else if(x[2]>kD1BEG && x[2]<kD1END){
330 else if(x[2]>kD2BEG && x[2]<kD2END){
331 if(((x[0]-kXCEN1D2)*(x[0]-kXCEN1D2)+(x[1]-kYCEN1D2)*(x[1]-kYCEN1D2))<kD2RA2
332 || ((x[0]-kXCEN2D2)*(x[0]-kXCEN2D2)+(x[1]-kYCEN2D2)*(x[1]-kYCEN2D2))<kD2RA2){
346 //_____________________ FZ ____________________
348 Int_t AliMagFDM::FZ(Double_t temp, Float_t *Ar, Float_t delu,Int_t ik,Int_t nk)
351 // Quest of a point position at x,y,z (Cartensian) and R,Phi,z (Polar) axises
365 for(l=ikj; l<nk; l++)
378 /*---------------------Ba------------------*/
380 Double_t AliMagFDM::Ba(Int_t kaai,Double_t zaa1, Double_t zaa2, Double_t alf1, Double_t alf2, Double_t alf3, Int_t kaa, Int_t maa)
383 // Calculation of field componet for case (keps <r0<= fRdel) at a given axis
385 Double_t fa11,fa12,fa13;
386 Double_t fa21,fa22,fa23;
392 fa11 = fBpx[kaa][0][0];
393 fa12 = fBpx[kaa][0][maa];
394 fa13 = fBpx[kaa][0][maa+1];
395 fa21 = fBpx[kaa+1][0][0];
396 fa22 = fBpx[kaa+1][0][maa];
397 fa23 = fBpx[kaa+1][0][maa+1];
400 fa11 = fBpy[kaa][0][0];
401 fa12 = fBpy[kaa][0][maa];
402 fa13 = fBpy[kaa][0][maa+1];
403 fa21 = fBpy[kaa+1][0][0];
404 fa22 = fBpy[kaa+1][0][maa];
405 fa23 = fBpy[kaa+1][0][maa+1];
408 fa11 = fBpz[kaa][0][0];
409 fa12 = fBpz[kaa][0][maa];
410 fa13 = fBpz[kaa][0][maa+1];
411 fa21 = fBpz[kaa+1][0][0];
412 fa22 = fBpz[kaa+1][0][maa];
413 fa23 = fBpz[kaa+1][0][maa+1];
416 Fatal("Ba","Invalid value of kaai %d\n",kaai);
419 faY1=alf1*fa11+alf2*fa12+alf3*fa13;
420 faY2=alf1*fa21+alf2*fa22+alf3*fa23;
421 bba = zaa1*faY1+zaa2*faY2;
426 /*------------------------Bb--------------------------*/
428 Double_t AliMagFDM::Bb(Double_t z1,Double_t z2, Double_t y1,Double_t y2, Double_t x1,Double_t x2, Int_t kv, Int_t k, Int_t l, Int_t m)
431 // Calculation of field componet at a given axis (general case)
433 Double_t fy1, fy2, ffy;
434 Double_t gy1,gy2,ggy;
436 Double_t bf11,bf12,bf21,bf22;
437 Double_t bg11,bg12,bg21,bg22;
440 /*-----------------Polar part ------------------*/
445 bf12=fBpx[k+1][l][m];
446 bf21=fBpx[k+1][l+1][m];
447 bf22=fBpx[k][l+1][m];
449 bg11=fBpx[k][l][m+1];
450 bg12=fBpx[k+1][l][m+1];
451 bg21=fBpx[k+1][l+1][m+1];
452 bg22=fBpx[k][l+1][m+1];
457 bf12=fBpy[k+1][l][m];
458 bf21=fBpy[k+1][l+1][m];
459 bf22=fBpy[k][l+1][m];
461 bg11=fBpy[k][l][m+1];
462 bg12=fBpy[k+1][l][m+1];
463 bg21=fBpy[k+1][l+1][m+1];
464 bg22=fBpy[k][l+1][m+1];
469 bf12=fBpz[k+1][l][m];
470 bf21=fBpz[k+1][l+1][m];
471 bf22=fBpz[k][l+1][m];
473 bg11=fBpz[k][l][m+1];
474 bg12=fBpz[k+1][l][m+1];
475 bg21=fBpz[k+1][l+1][m+1];
476 bg22=fBpz[k][l+1][m+1];
478 /*-----------------Cartensian part ---------------*/
482 bf12=fBcx[k+1][l][m];
483 bf21=fBcx[k+1][l+1][m];
484 bf22=fBcx[k][l+1][m];
486 bg11=fBcx[k][l][m+1];
487 bg12=fBcx[k+1][l][m+1];
488 bg21=fBcx[k+1][l+1][m+1];
489 bg22=fBcx[k][l+1][m+1];
494 bf12=fBcy[k+1][l][m];
495 bf21=fBcy[k+1][l+1][m];
496 bf22=fBcy[k][l+1][m];
498 bg11=fBcy[k][l][m+1];
499 bg12=fBcy[k+1][l][m+1];
500 bg21=fBcy[k+1][l+1][m+1];
501 bg22=fBcy[k][l+1][m+1];
506 bf12=fBcz[k+1][l][m];
507 bf21=fBcz[k+1][l+1][m];
508 bf22=fBcz[k][l+1][m];
510 bg11=fBcz[k][l][m+1];
511 bg12=fBcz[k+1][l][m+1];
512 bg21=fBcz[k+1][l+1][m+1];
513 bg22=fBcz[k][l+1][m+1];
517 Fatal("Bb","Invalid value of kv %d\n",kv);
524 fy2=z2*bf21+z1* bf22;
528 gy1 = z1*bg11+z2*bg12;
529 gy2 = z2*bg21+z1*bg22;
530 ggy= y1*gy1 + y2*gy2;
537 //____________________________________________
539 void AliMagFDM::ReadField()
542 // Method to read the magnetic field from file
547 Float_t zzp, rr,phii;
548 Float_t zz, yy, bx,by,bz,bb;
551 printf("Reading Magnetic Field %s from file %s\n",fName.Data(),fTitle.Data());
552 fname = gSystem->ExpandPathName(fTitle.Data());
553 magfile=fopen(fname,"r");
556 printf("Cartensian part\n");
562 fscanf(magfile,"%d %d %d ",&fYl, &fXl, &fZl);
564 printf("fYl %d, fXl %d, fZl %d\n",fYl, fXl, fZl);
566 for (ik=0; ik<fZl; ik++)
569 fscanf(magfile, " %e ", &zz);
574 for (ik=0; ik<fYl; ik++)
576 fscanf(magfile, " %e ", &yy);
580 for (ik=0; ik<81; ik++)
582 printf("fZc %e,fY %e\n", fZc[ik],fY[ik]);
585 fscanf(magfile," %e %e %e %e %e %e %e %e %e %e %e ", &fYdel,&fXdel,&fZdel,&fZmax,&fZmin,&fYmax,&fYmin,&fAx1,&fCx1,&fAx2,&fCx2);
587 printf("fYdel %e, fXdel %e, fZdel %e\n",fYdel,fXdel,fZdel);
588 printf("fZmax %e, fZmin %e, fYmax %e,fYmin %e\n",fZmax,fZmin,fYmax,fYmin);
589 printf("fAx1 %e, fCx1 %e, fAx2 %e, fCx %e\n",fAx1,fCx1,fAx2,fCx2);
591 for (il=0; il<44; il++) {
592 for (im=0; im<81; im++) {
593 for (ik=0; ik<81; ik++) {
595 fscanf(magfile, " %e ", &by);
601 for (il=0; il<44; il++) {
602 for (im=0; im<81; im++) {
603 for (ik=0; ik<81; ik++) {
605 fscanf(magfile, " %e ", &bx);
611 for (il=0; il<44; il++) {
612 for (im=0; im<81; im++) {
613 for (ik=0; ik<81; ik++) {
615 fscanf(magfile, " %e ", &bz);
620 //---------------------- Polar part ---------------------------------
622 printf("Polar part\n");
623 fscanf(magfile,"%d %d %d ", &fZpl, &fRn, &fPhin);
624 printf("fZpl %d, fRn %d, fPhin %d\n",fZpl,fRn,fPhin);
626 printf(" fZp array\n");
628 for (ik=0; ik<51; ik++)
630 fscanf(magfile, " %e ", &zzp);
632 printf(" %e\n",fZp[ik]);
635 printf(" fR array\n");
637 for (ik=0; ik<10; ik++)
639 fscanf(magfile, " %e ", &rr);
641 printf(" %e\n",fR[ik]);
644 // printf("fPhi array\n");
646 for (il=0; il<33; il++)
648 fscanf(magfile, " %e ", &phii);
650 // printf(" %e\n",fPhi[il]);
653 fscanf(magfile," %e %e %e %e %e %e %e ",&fZpdl,&fPhid,&fRdel,&fZpmx,&fZpmn,&fRmax, &fRmin);
655 printf("fZpdl %e, fPhid %e, fRdel %e, fZpmx %e, fZpmn %e,fRmax %e,fRmin %e \n", fZpdl,fPhid, fRdel,fZpmx, fZpmn,fRmax, fRmin);
658 for (il=0; il<33; il++) {
659 for (im=0; im<10; im++) {
660 for (ik=0; ik<51; ik++) {
661 fscanf(magfile, " %e ", &by);
667 for (il=0; il<33; il++) {
668 for (im=0; im<10; im++) {
669 for (ik=0; ik<51; ik++) {
670 fscanf(magfile, " %e ", &bx);
677 for (il=0; il<33; il++) {
678 for (im=0; im<10; im++) {
679 for (ik=0; ik<51; ik++) {
680 fscanf(magfile, " %e ", &bz);
687 for (il=0; il<32; il++) {
688 for (im=0; im<2; im++) {
689 for (ik=0; ik<2; ik++) {
690 fscanf(magfile, " %e ", &bb);
697 printf("File %s not found !\n",fTitle.Data());
701 //________________________________