4 #include <TObject.h> //base class
5 #include <TVector3.h> //used extensively
6 #include "AliRICHParam.h" //RichIntersect()
8 class AliRICHHelix: public TObject
11 AliRICHHelix():TObject(),
19 fPosRad(TVector2(0,0)),
20 fPosPc(TVector2(0,0)),
21 fPloc(TVector3(0,0,0)) {}
22 AliRICHHelix(Double_t p,Double_t theta,Double_t phi,Double_t bz=0.2);//p [GeV], theta,phi [deg], Bz [Tesla];
23 AliRICHHelix(const TVector3 &x0,const TVector3 &p0,Int_t q=1,Double_t b=0.2):TObject(),
31 fPosRad(TVector2(0,0)),
32 fPosPc(TVector2(0,0)),
33 fPloc(TVector3(0,0,0)) {}
34 virtual ~AliRICHHelix() {}
36 void Draw (const Option_t *opt="" ); //from TObject, draw helix
37 void Print (const Option_t *opt="" )const; //from TObject, print status
38 //private part++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
39 inline Bool_t Intersection (TVector3 planePnt,TVector3 planeNorm); //intersection with plane given by point and normal vector
40 inline void Propagate (Double_t len ); //propogate helix by given length along it
41 inline Int_t RichIntersect (AliRICHParam *pParam ); //search intersection with any RICH chamber
42 TVector2 PosRad ( )const{return fPosRad;} //intersection with radiator LORS
43 TVector2 PosPc ( )const{return fPosPc;} //returns position of intersection with PC (local system)
44 TVector3 Ploc ( )const{return fPloc;} //returns momentum at the position of intersection with radiator
45 // Double_t Length () const{return fLen;} //returns length of the track from initial point to RICH
46 TVector3 X ( )const{return fX;}
48 TVector3 fX0; //helix position in point of definition, [cm] in MARS
49 TVector3 fP0; //helix momentum in point of definition, [GeV/c] in MARS
50 TVector3 fX; //helix position in point of interest, [cm] in MARS
51 TVector3 fP; //helix momentum in point of interest, [GeV/c] in MARS
52 Double_t fLen; //helix length from point of definition to point of interest, [cm]
53 Int_t fQ; //sign of track charge (value not provided by current ESD)
54 Double_t fBz; //magnetic field along z, [Tesla]
55 TVector2 fPosRad; //helix intersection with radiator entrance, LORS [cm]
56 TVector2 fPosPc; //helix intersection with PC, LORS [cm]
57 TVector3 fPloc; //helix momentum, LORS [GeV/c]
58 ClassDef(AliRICHHelix,0) //General helix
59 };//class AliRICHHelix
60 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
61 void AliRICHHelix::Propagate(Double_t len)
63 // Propogates the helix from inintial point by a given distance along helix. Assumes uniform magnetic field along z direction.
64 // Arguments: len - distance to propagate by, [cm]
66 if(fBz==0){//no magnetic field->straight line
67 fX=fX0+fP0.Unit()*len;
69 const Double_t c = 0.00299792458;//this speed of light value provides that coordinates are in cm momentum in GeV/c
70 Double_t a = -c*fBz*fQ;
71 Double_t rho = a/fP0.Mag();
72 fX.SetX( fX0.X()+fP0.X()*TMath::Sin(rho*len)/a-fP0.Y()*(1-TMath::Cos(rho*len))/a );
73 fX.SetY( fX0.Y()+fP0.Y()*TMath::Sin(rho*len)/a+fP0.X()*(1-TMath::Cos(rho*len))/a );
74 fX.SetZ( fX0.Z()+fP0.Z()*len/fP0.Mag() );
75 fP.SetX( fP0.X()*TMath::Cos(rho*len)-fP0.Y()*TMath::Sin(rho*len) );
76 fP.SetY( fP0.Y()*TMath::Cos(rho*len)+fP0.X()*TMath::Sin(rho*len) );
81 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82 Bool_t AliRICHHelix::Intersection(TVector3 planePoint,TVector3 planeNorm)
84 // Finds point of intersection (if exists) of the helix with the plane. Stores result in fX and fP.
85 // Arguments: planePoint,planeNorm - the plane defined by any plane's point and vector, normal to the plane
86 // Returns: kTrue if helix intersects the plane, kFALSE otherwise.
88 Double_t s=(planePoint-fX0)*planeNorm,dist=99999,distPrev=dist;//estimates initial distance to plane
90 while(TMath::Abs(dist)>0.00001){
91 Propagate(s); //calculates helix at the distance s from x0 ALONG the helix
92 dist=(fX-planePoint)*planeNorm; //distance between current helix position and plane
93 if(TMath::Abs(dist) >= TMath::Abs(distPrev)) { return kFALSE;}
99 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
100 Int_t AliRICHHelix::RichIntersect(AliRICHParam *pParam)
102 // Searchs for intersection of this helix with all RICH chambers, returns chamber number or 0 if no intersection
103 // On exit fPosRad contain position of intersection in radiator LORS (cm)
104 // fPosPc contains the same for photocathode
105 for(Int_t iCh=1;iCh<=AliRICHParam::kNch;iCh++){//chambers loop
106 TVector3 norm =pParam->Lors2MarsVec(iCh,TVector3(0,0,1));
107 if(Intersection(pParam->Lors2Mars(iCh,0,0,AliRICHParam::kRad),norm)){//there is intersection with radiator plane
108 fPosRad=pParam->Mars2Lors(iCh,fX,AliRICHParam::kRad);//position on radiator plane
109 if(pParam->IsAccepted(fPosRad)){//intersection within radiator (even if in dead zone)
111 if(Intersection(pParam->Lors2Mars(iCh,0,0,AliRICHParam::kPc),norm)){//there is intersection with photocathode
112 fPosPc=pParam->Mars2Lors(iCh,fX,AliRICHParam::kPc);//position on radiator plane
113 if(pParam->IsAccepted(fPosPc)){//intersection within pc (even if in dead zone)
115 fPloc=pParam->Mars2LorsVec(iCh,fP);//trasform p to local system
120 }//if inside radiator
125 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++