18 #include "FairRunSim.h"
19 #include "FairRunAna.h"
20 #include "FairField.h"
46 if ( &a==0 || &b==0 ) {
return kFALSE; }
53 pnt[0]=0.5* ( position1.X() +position2.X() );
54 pnt[1]=0.5* ( position1.Y() +position2.Y() );
55 pnt[2]=0.5* ( position1.Z() +position2.Z() );
56 if(FairRun::Instance()->IsAna()){
57 FairRunAna::Instance()->GetField()->GetFieldValue ( pnt, Bf );
59 FairRunSim::Instance()->GetField()->GetFieldValue ( pnt, Bf );
61 Float_t bField = Bf[2];
64 TVector3 ap3 = a.
P3();
70 TVector3 bp3 = b.
P3();
77 TVector3 dB ( 0,0,1.0 );
79 Double_t rho1 = 100. * pPerp1/ ( 0.3*bField );
80 TVector3
r1=d1.Cross ( dB );
82 TVector3 center1 = position1 -
r1;
85 Double_t rho2 = 100. * pPerp2/ ( 0.3*bField );
86 TVector3
r2=d2.Cross ( dB );
88 TVector3 center2 = position2 -
r2;
92 TVector3 ab = center2 - center1;
99 Double_t x = dab/2 + ( rho1*rho1 - rho2*rho2 ) / ( 2*dab );
124 for ( Int_t ns=0; ns<nSolMax; ns++ ) {
128 TVector3 rs1 ( cosTheAB*x - sinTheAB*y * sign, sinTheAB*x + cosTheAB*y * sign, 0 );
129 TVector3 rs2 ( rs1-ab );
132 Double_t adir= ( rs1-
r1 ).Dot ( ap3 ) >0 ? 1.0 : -1.0;
133 Double_t aangle=adir * r1.Angle ( rs1 );
135 Double_t newaz=position1.Z() + rho1*aangle/pPerp1 * ap3.Z();
136 newapos[ns].SetX ( center1.X() + rs1.X() );
137 newapos[ns].SetY ( center1.Y() + rs1.Y() );
138 newapos[ns].SetZ ( newaz );
141 newap3[ns]=rs1.Cross ( dB );
142 newap3[ns]*=a.
Charge() /rho1*pPerp1;
143 newap3[ns].SetZ ( ap3.Z() );
147 Double_t bdir= ( rs2-
r2 ).Dot ( bp3 ) >0 ? 1.0 : -1.0;
148 Double_t bangle=bdir * r2.Angle ( rs2 );
149 Double_t newbz=position2.Z() + rho2*bangle/pPerp2 * bp3.Z();
150 newbpos[ns].SetX ( center2.X() + rs2.X() );
151 newbpos[ns].SetY ( center2.Y() + rs2.Y() );
152 newbpos[ns].SetZ ( newbz );
153 newbp3[ns]=rs2.Cross ( dB );
154 newbp3[ns]*=b.
Charge() /rho2*pPerp2;
155 newbp3[ns].SetZ ( bp3.Z() );
157 Double_t delta = ( newapos[ns]-newbpos[ns] ).Mag();
friend F32vec4 sqrt(const F32vec4 &a)
virtual ~RhoSimpleVertexSelector()
TVector3 GetPosition() const
virtual Bool_t Accept(RhoCandidate &a, RhoCandidate &b)
RhoSimpleVertexSelector(const char *name="SimpleVertexSelector", Double_t d=1.0, Double_t a=3.14159265358979323846, Double_t r1=0.0, Double_t r2=1.E8)