14 obj = (
RhoVtxPoca*) buf.ReadObject(RhoVtxPoca::Class());
33 return GetPocaVtx(vertex, cands);
38 vertex.SetXYZ(0.,0.,0.);
39 if ( cands.
GetLength() < 2 ) {
return -99999.; }
40 if ( cands.
GetLength() == 2 ) {
return GetPoca(vertex, cands[0], cands[1]); }
42 std::vector<Double_t> distances;
43 std::vector<TVector3> results;
46 TVector3 theVertex(0.,0.,0.);
49 for(Int_t daug1 =0; daug1<cands.
GetLength(); daug1++)
53 for(Int_t daug2=daug1+1; daug2<cands.
GetLength(); daug2++)
57 actualDoca = GetPoca(theVertex,a,b);
60 printf(
"RhoVtxPoca - Error with getting a POCA. \"Distance\" is %g. SKIPPING Candidate pair now!",actualDoca);
63 distances.push_back(actualDoca);
64 results.push_back(theVertex);
69 std::vector<Double_t>::iterator iterDoca;
70 std::vector<TVector3>::iterator iterVtx;
71 Double_t docaweight=0,sumdocaweigts=0;
73 for(iterVtx=results.begin(), iterDoca=distances.begin(); iterVtx!=results.end()&&iterDoca!=distances.end(); ++iterVtx,++iterDoca)
75 docaweight=1/(*iterDoca);
78 if (docaweight == 0) { docaweight = 1; }
79 vertexK *= docaweight;
81 sumdocaweigts+=docaweight;
83 if (sumdocaweigts == 0) { sumdocaweigts=1; }
84 vertex*=1./sumdocaweigts;
95 else if (
fabs(a->
Charge())<1e-6 &&
fabs(b->
Charge())<1e-6)
return GetPocaTwoNeutral(vertex, a, b);
96 else if (
fabs(a->
Charge())<1e-6 ||
fabs(b->
Charge())<1e-6)
return GetPocaChargedToNeutral(vertex, a, b);
105 vertex.SetXYZ(0.,0.,0.);
108 TVector3 dB(0,0,1.0);
111 TVector3 ap3 = a->
P3();
119 TVector3
r1=d1.Cross(dB);
121 TVector3 center1 = position1 -
r1;
127 TVector3 bp3 = b->
P3();
135 TVector3
r2=d2.Cross(dB);
137 TVector3 center2 = position2 -
r2;
141 TVector3 ab = center2 - center1;
158 x = 0.5*dab + ( rho1*rho1 - rho2*rho2 )/(2*dab);
161 if (y2 > 0) { y =
sqrt(y2); }
164 x = 0.5*(dab + rho1 - rho2);
171 for (Int_t ns=0; ns<nSolMax; ns++) {
174 TVector3 rs1( cosTheAB*x - sinTheAB*y * sign, sinTheAB*x + cosTheAB*y * sign, 0);
175 TVector3 rs2( rs1-ab );
178 Double_t adir=(rs1-
r1).Dot(ap3)>0 ? 1.0 : -1.0;
179 Double_t aangle=adir * r1.Angle(rs1);
181 Double_t newaz=position1.Z() + rho1*aangle/pPerp1 * ap3.Z();
182 newapos[ns].SetX( center1.X() + rs1.X() );
183 newapos[ns].SetY( center1.Y() + rs1.Y() );
184 newapos[ns].SetZ( newaz );
187 Double_t bdir=(rs2-
r2).Dot(bp3)>0 ? 1.0 : -1.0;
188 Double_t bangle=bdir * r2.Angle(rs2);
189 Double_t newbz=position2.Z() + rho2*bangle/pPerp2 * bp3.Z();
190 newbpos[ns].SetX( center2.X() + rs2.X());
191 newbpos[ns].SetY( center2.Y() + rs2.Y());
192 newbpos[ns].SetZ( newbz );
194 Double_t delta = (newapos[ns]-newbpos[ns]).Mag();
197 if ( delta < actualDoca ) {
202 vertex=0.5*(newapos[
best]+newbpos[
best]);
220 }
else return -99999.;
222 vertex.SetXYZ(0.,0.,0.);
225 TVector3 dB(0,0,1.0);
228 TVector3 ap3 = charged->
P3();
236 TVector3
r1=d1.Cross(dB);
237 r1 *= -charged->
Charge()*rho1;
238 TVector3 center1 = position1 -
r1;
244 TVector3 bp3 = neutral->
P3();
249 TVector3 g_p = position2;
251 TVector3 c_to_g = (center1.Dot(d2) - g_p.Dot(d2))*d2 + g_p - center1;
256 if(c_to_g.Mag()<rho1)
262 newapos[0] = center1 +
TMath::Sqrt(rho1*rho1 - (c_to_g.Dot(c_to_g)))*d2 + c_to_g;
263 newapos[1] = center1 -
TMath::Sqrt(rho1*rho1 - (c_to_g.Dot(c_to_g)))*d2 + c_to_g;
264 newbpos[0] = center1 +
TMath::Sqrt(rho1*rho1 - (c_to_g.Dot(c_to_g)))*d2 + c_to_g;
265 newbpos[1] = center1 -
TMath::Sqrt(rho1*rho1 - (c_to_g.Dot(c_to_g)))*d2 + c_to_g;
267 TVector3 rs1 = newapos[0] - center1;
269 Double_t adir=(rs1-
r1).Dot(ap3)>0 ? 1.0 : -1.0;
270 Double_t aangle=adir * r1.Angle(rs1);
271 newapos[0].SetZ(position1.Z() + rho1*aangle/pPerp1 * ap3.Z());
273 rs1 = newapos[1] - center1;
275 adir=(rs1-
r1).Dot(ap3)>0 ? 1.0 : -1.0;
276 aangle=adir * r1.Angle(rs1);
277 newapos[1].SetZ(position1.Z() + rho1*aangle/pPerp1 * ap3.Z());
280 adir = bp3.Dot(newbpos[0] - position2)>0 ? 1.0 : -1.0;
281 TVector3 length = newbpos[0] - g_p;
282 newbpos[0].SetZ(position2.Z() + length.Mag() * adir * bp3.Z()/pPerp2);
283 adir = bp3.Dot(newbpos[1] - position2)>0 ? 1.0 : -1.0;
284 length = newbpos[1] - g_p;
285 newbpos[1].SetZ(position2.Z() + length.Mag() * adir * bp3.Z()/pPerp2);
290 newapos[0] = 0.5*(c_to_g*(rho1/c_to_g.Mag()) + center1 + g_p);
291 newbpos[0] = 0.5*(c_to_g*(rho1/c_to_g.Mag()) + center1 + g_p);
293 TVector3 rs1 = newapos[0] - center1;
295 Double_t adir=(rs1-
r1).Dot(ap3)>0 ? 1.0 : -1.0;
296 Double_t aangle=adir * r1.Angle(rs1);
297 newapos[0].SetZ(position1.Z() + rho1*aangle/pPerp1 * ap3.Z());
300 adir = bp3.Dot(newbpos[0] - position2)>0 ? 1.0 : -1.0;
301 TVector3 length = newbpos[0] - g_p;
302 newbpos[0].SetZ(position2.Z() + length.Mag() * adir * bp3.Z()/pPerp2);
308 for(
int ns=0; ns<nSolMax; ns++){
309 Double_t delta = (newapos[ns]-newbpos[ns]).Mag();
311 if ( delta < actualDoca ) {
317 vertex=0.5*(newapos[
best]+newbpos[
best]);
326 vertex.SetXYZ(0.,0.,0.);
329 TVector3 ap = canda->
P3();
332 TVector3
bp = candb->
P3();
334 TVector3 u = ap.Unit();
335 TVector3
v = bp.Unit();
336 TVector3 w = av - bv;
342 double D = a*c - b*
b;
348 tc = (b>c ? d/b : e/
c);
351 sc = (b*e - c*
d) / D;
352 tc = (a*e - b*
d) / D;
358 TVector3 pocaa = av + sc*u;
359 TVector3 pocab = bv + tc*
v;
360 vertex = 0.5*(pocaa+pocab);
361 TVector3 diff = pocaa-pocab;
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
Double_t GetPoca(TVector3 &vertex, RhoCandidate *a, RhoCandidate *b)
Double_t GetPocaChargedToNeutral(TVector3 &vertex, RhoCandidate *a, RhoCandidate *b)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
Double_t GetPocaTwoCharged(TVector3 &vertex, RhoCandidate *a, RhoCandidate *b)
RhoCandidate * Daughter(Int_t n)
ClassImp(RhoVtxPoca) TBuffer &operator>>(TBuffer &buf
TVector3 GetPosition() const
Double_t GetPocaVtx(TVector3 &vertex, RhoCandidate *composite)
friend F32vec4 fabs(const F32vec4 &a)
Double_t GetPocaTwoNeutral(TVector3 &vertex, RhoCandidate *a, RhoCandidate *b)
void Put(const RhoCandidate *, Int_t i=-1)