17 #define MATCH_RADIUS 2.0
18 #define ADJACENT_MATCH_DISTANCE 0.3
24 #define ONE_THIRD 0.33333333333333333
25 #define SQRT3 1.73205080756887719
39 double tsum_1=a->
t_u+a->
t_v;
40 double tsum_2=b->
t_u+b->
t_v;
41 return (tsum_1<tsum_2);
50 _log =
new JStreamLog(std::cout,
"FDCSEGMENT >>");
51 *_log <<
"File initialized." << endMsg;
69 double Bz=bfield->
GetBz(0.,0.,65.);
70 RotationSenseToCharge=(Bz>0.)?-1.:1.;
83 gPARMS->SetDefaultParameter(
"FDC:DEBUG_LEVEL", DEBUG_LEVEL);
86 gPARMS->SetDefaultParameter(
"FDC:BEAM_VARIANCE",BEAM_VARIANCE);
99 vector<const DFDCPseudo*>pseudopoints;
100 eventLoop->Get(pseudopoints);
104 if (pseudopoints.size()>=3){
106 vector<const DFDCPseudo*>package[4];
107 for (vector<const DFDCPseudo*>::const_iterator i=pseudopoints.begin();
108 i!=pseudopoints.end();i++){
109 package[((*i)->wire->layer-1)/6].push_back(*i);
113 for (
int j=0;j<4;j++){
117 if (package[j].
size()>2) FindSegments(package[j]);
129 DMatrix &CR,vector<xyz_t>&XYZ){
130 unsigned int n=points.size()+1;
132 bool got_bad_intersection=
false;
134 for (
unsigned int m=0;m<n-1;m++){
135 double r2=points[m]->xy.Mod2();
136 double denom= N[0]*N[0]+N[1]*N[1];
137 double numer=dist_to_origin+r2*N[2];
138 double ratio=numer/denom;
140 DVector2 xy_int0(-N[0]*ratio,-N[1]*ratio);
141 double temp=denom*r2-numer*numer;
143 got_bad_intersection=
true;
145 XYZ[m].xy=points[m]->xy;
148 temp=
sqrt(temp)/denom;
151 DVector2 delta(N[1]*temp,-N[0]*temp);
154 double diff1=(xy1-points[m]->xy).Mod2();
155 double diff2=(xy2-points[m]->xy).Mod2();
164 XYZ[n-1].xy.Set(0.,0.);
167 double sumv=0.,sumx=0.;
168 double sumy=0.,sumxx=0.,sumxy=0.;
169 double sperp=0.,sperp_old=0.,ratio,Delta;
173 unsigned int num_z=0;
174 for (
unsigned int k=0;k<n;k++){
177 if (fabs(z-zlast)<0.01)
continue;
182 if (bad[k]) var=XYZ[k].covr;
185 ratio=diffxy.Mod()/(two_rc);
187 sperp=sperp_old+(ratio>1?two_rc*(M_PI_2):two_rc*asin(ratio));
191 double inv_var=1./var;
196 sumxy+=sperp*z*inv_var;
204 Delta=sumv*sumxx-sumx*sumx;
205 double denom=sumv*sumxy-sumy*sumx;
206 if (fabs(Delta)>
EPS && fabs(denom)>
EPS){
211 var_tanl=sumv/Delta*(tanl*tanl*tanl*tanl);
215 zvertex=zlast-tanl*sperp;
226 else tanl=(zlast-zvertex)/sperp;
231 return VALUE_OUT_OF_RANGE;
233 if (got_bad_intersection)
return VALUE_OUT_OF_RANGE;
242 double delta_x=XYZ[ref_plane].xy.X()-xc;
243 double delta_y=XYZ[ref_plane].xy.Y()-yc;
244 double r1=
sqrt(r1sq);
245 double denom=delta_x*delta_x+delta_y*delta_y;
255 Phi1=atan2(delta_y,delta_x);
256 double z1=XYZ[ref_plane].z;
257 double y1=XYZ[ref_plane].xy.X();
258 double x1=XYZ[ref_plane].xy.Y();
259 double var_R1=CR(ref_plane,ref_plane);
260 for (
unsigned int k=0;k<n;k++){
261 double sperp=rotation_sense*(XYZ[k].z-z1)/tanl;
262 double phi_s=Phi1+sperp/rc;
263 double sinp=
sin(phi_s);
264 double cosp=cos(phi_s);
265 XYZ[k].xy.Set(xc+rc*cosp,yc+rc*sinp);
271 double Phi=XYZ[k].xy.Phi();
272 double sinPhi=
sin(Phi);
273 double cosPhi=cos(Phi);
274 double dRPhi_dx=Phi*cosPhi-sinPhi;
275 double dRPhi_dy=Phi*sinPhi+cosPhi;
277 double rc_sinphi_over_denom=rc*sinp/denom;
280 double dx_dx1=rc_sinphi_over_denom*delta_y;
281 double dx_dy1=-rc_sinphi_over_denom*delta_x;
282 double dx_dtanl=sinp*sperp/tanl;
284 double rc_cosphi_over_denom=rc*cosp/denom;
287 double dy_dx1=-rc_cosphi_over_denom*delta_y;
288 double dy_dy1=rc_cosphi_over_denom*delta_x;
289 double dy_dtanl=-cosp*sperp/tanl;
291 double dRPhi_dx1=dRPhi_dx*dx_dx1+dRPhi_dy*dy_dx1;
292 double dRPhi_dy1=dRPhi_dx*dx_dy1+dRPhi_dy*dy_dy1;
293 double dRPhi_dtanl=dRPhi_dx*dx_dtanl+dRPhi_dy*dy_dtanl;
295 double dR_dx1=cosPhi*dx_dx1+sinPhi*dy_dx1;
296 double dR_dy1=cosPhi*dx_dy1+sinPhi*dy_dy1;
297 double dR_dtanl=cosPhi*dx_dtanl+sinPhi*dy_dtanl;
299 double cdist=dist_to_origin+r1sq*N[2];
300 double n2=N[0]*N[0]+N[1]*N[1];
302 double ydenom=y1*n2+N[1]*cdist;
303 double dy1_dr1=-r1*(2.*N[1]*N[2]*y1+2.*N[2]*cdist-N[0]*N[0])/ydenom;
304 double var_y1=dy1_dr1*dy1_dr1*var_R1;
306 double xdenom=x1*n2+N[0]*cdist;
307 double dx1_dr1=-r1*(2.*N[0]*N[2]*x1+2.*N[2]*cdist-N[1]*N[1])/xdenom;
308 double var_x1=dx1_dr1*dx1_dr1*var_R1;
310 CRPhi(k,k)=dRPhi_dx1*dRPhi_dx1*var_x1+dRPhi_dy1*dRPhi_dy1*var_y1
311 +dRPhi_dtanl*dRPhi_dtanl*var_tanl;
312 CR(k,k)=dR_dx1*dR_dx1*var_x1+dR_dy1*dR_dy1*var_y1
313 +dR_dtanl*dR_dtanl*var_tanl;
316 double stemp=XYZ[k].xy.Mod()/(4.*rc);
317 double ctemp=1.-stemp*stemp;
329 CRPhi=C*CRPhi*C+S*CR*
S;
341 unsigned int n=points.size()+1;
359 unsigned int last_index=n-1;
360 for (
unsigned int i=0;i<last_index;i++){
361 X(i,0)=points[i]->xy.X();
362 X(i,1)=points[i]->xy.Y();
363 X(i,2)=points[i]->xy.Mod2();
365 W(i,i)=1./CRPhi(i,i);
368 OnesT(0,last_index)=1.;
369 W(last_index,last_index)=1./CRPhi(last_index,last_index);
370 W_sum+=W(last_index,last_index);
372 Xavg=var_avg*(OnesT*(W*
X));
378 A=
DMatrix(DMatrix::kTransposed,X)*(W*
X)
379 -W_sum*(
DMatrix(DMatrix::kTransposed,Xavg)*Xavg);
380 if(!A.IsValid())
return UNRECOVERABLE_ERROR;
385 double B2=-(A(0,0)+A(1,1)+A(2,2));
386 double B1=A(0,0)*A(1,1)-A(1,0)*A(0,1)+A(0,0)*A(2,2)-A(2,0)*A(0,2)
387 +A(1,1)*A(2,2)-A(2,1)*A(1,2);
388 double B0=-A.Determinant();
389 if(B0==0 || !isfinite(B0))
return UNRECOVERABLE_ERROR;
405 double Q=(3.*B1-B2*B2)/9.e4;
406 double R=(9.*B2*B1-27.*B0-2.*B2*B2*B2)/54.e6;
408 if (Q1<0) Q1=
sqrt(-Q1);
410 return VALUE_OUT_OF_RANGE;
418 double temp=100.*
sqrt(cbrt(R*R+Q1*Q1));
420 double sum_over_2=temp*cos(theta1);
421 double diff_over_2=-temp*
sin(theta1);
427 double A11_minus_lambda_min=A(1,1)-lambda_min;
428 N[1]=(A(1,0)*A(0,2)-(A(0,0)-lambda_min)*A(1,2))
429 /(A(0,1)*A(2,1)-(A11_minus_lambda_min)*A(0,2));
430 N[2]=(A(2,0)*A11_minus_lambda_min-A(1,0)*A(2,1))
431 /(A(1,2)*A(2,1)-(A(2,2)-lambda_min)*A11_minus_lambda_min);
434 double denom=
sqrt(N[0]*N[0]+N[1]*N[1]+N[2]*N[2]);
435 for (
int i=0;i<3;i++){
440 dist_to_origin=-(N[0]*Xavg(0,0)+N[1]*Xavg(0,1)+N[2]*Xavg(0,2));
443 double two_N2=2.*N[2];
446 rc=
sqrt(1.-N[2]*N[2]-4.*dist_to_origin*N[2])/fabs(two_N2);
458 unsigned int num_measured=points.size();
459 unsigned int last_index=num_measured;
460 unsigned int num_points=num_measured+1;
463 vector<xyz_t>XYZ(num_points);
464 DMatrix CR(num_points,num_points);
465 DMatrix CRPhi(num_points,num_points);
469 for (
unsigned int m=0;m<num_measured;m++){
470 XYZ[m].z=points[m]->wire->origin.z();
473 Phi=points[m]->xy.Phi();
475 double u=points[m]->w;
476 double v=points[m]->s;
477 double temp1=u*Phi-v;
478 double temp2=v*Phi+
u;
479 double var_u=0.08333;
481 double one_over_R2=1./points[m]->xy.Mod2();
482 CRPhi(m,m)=one_over_R2*(var_v*temp1*temp1+var_u*temp2*temp2);
483 CR(m,m)=one_over_R2*(var_u*u*u+var_v*v*v);
486 XYZ[m].covrphi=CRPhi(m,m);
488 XYZ[last_index].z=TARGET_Z;
489 CR(last_index,last_index)=BEAM_VARIANCE;
490 CRPhi(last_index,last_index)=BEAM_VARIANCE;
493 jerror_t error=NOERROR;
495 error=RiemannCircleFit(points,CRPhi);
497 if (DEBUG_LEVEL>0)
_DBG_ <<
"Circle fit failed..." << endl;
503 error=RiemannLineFit(points,CR,XYZ);
508 for (
unsigned int i=0;i<last_index;i++){
510 CRPhi(i,i)=XYZ[i].covrphi;
512 CRPhi(last_index,last_index)=1e6;
513 CR(last_index,last_index)=1e6;
516 error=RiemannCircleFit(points,CRPhi);
518 if (DEBUG_LEVEL>0)
_DBG_ <<
"Circle fit failed..." << endl;
524 error=RiemannLineFit(points,CR,XYZ);
526 if (DEBUG_LEVEL>0)
_DBG_ <<
"Line fit failed..." << endl;
532 rotation_sense=GetRotationSense(points.size(),XYZ,CR,CRPhi,points);
534 double r1sq=XYZ[ref_plane].xy.Mod2();
535 UpdatePositionsAndCovariance(num_points,r1sq,XYZ,CRPhi,CR);
539 double rc0=rc,xc0=xc,yc0=yc,tanl0=tanl,zvertex0=zvertex,Phi1_0=Phi1;
540 double rotation_sense0=rotation_sense;
541 for (
unsigned int m=0;m<points.size();m++){
542 double sperp=rotation_sense*(XYZ[m].z-XYZ[ref_plane].z)/tanl;
543 double phi_s=Phi1+sperp/rc;
545 chisq0+=(XY-points[m]->xy).Mod2()/CR(m,m);
549 error=RiemannCircleFit(points,CRPhi);
551 if (DEBUG_LEVEL>0)
_DBG_ <<
"Circle fit failed..." << endl;
556 error=RiemannLineFit(points,CR,XYZ);
558 if (DEBUG_LEVEL>0)
_DBG_ <<
"Line fit failed..." << endl;
563 rotation_sense=GetRotationSense(points.size(),XYZ,CR,CRPhi,points);
565 r1sq=XYZ[ref_plane].xy.Mod2();
566 UpdatePositionsAndCovariance(num_points,r1sq,XYZ,CRPhi,CR);
570 double rotation_sense_=rotation_sense;
571 double rc_=rc,xc_=xc,yc_=yc,tanl_=tanl,zvertex_=zvertex,Phi1_=Phi1;
572 for (
unsigned int m=0;m<points.size();m++){
573 double sperp=rotation_sense*(XYZ[m].z-XYZ[ref_plane].z)/tanl;
574 double phi_s=Phi1+sperp/rc;
576 chisq_+=(XY-points[m]->xy).Mod2()/CR(m,m);
581 rotation_sense=rotation_sense0;
582 rc=rc0,xc=xc0,yc=yc0,tanl=tanl0,zvertex=zvertex0,Phi1=Phi1_0;
588 error=RiemannCircleFit(points,CRPhi);
590 if (DEBUG_LEVEL>0)
_DBG_ <<
"Circle fit failed..." << endl;
595 error=RiemannLineFit(points,CR,XYZ);
597 if (DEBUG_LEVEL>0)
_DBG_ <<
"Line fit failed..." << endl;
602 rotation_sense=GetRotationSense(num_measured,XYZ,CR,CRPhi,points);
605 r1sq=XYZ[ref_plane].xy.Mod2();
606 UpdatePositionsAndCovariance(num_points,r1sq,XYZ,CRPhi,CR);
610 for (
unsigned int m=0;m<num_points;m++){
611 double sperp=rotation_sense*(XYZ[m].z-XYZ[ref_plane].z)/tanl;
612 double phi_s=Phi1+sperp/rc;
616 chisq+=(XY-points[m]->xy).Mod2()/CR(m,m);
619 chisq+=XY.Mod2()/CR(m,m);
627 rotation_sense=rotation_sense_;
628 rc=rc_,xc=xc_,yc=yc_,tanl=tanl_,zvertex=zvertex_,Phi1=Phi1_;
641 vector<bool>used(points.size());
642 unsigned int total_num_used=0;
646 double old_z=points[0]->wire->origin.z();
647 vector<unsigned int>x_list;
649 for (
unsigned int i=0;i<points.size();i++){
650 if (points[i]->wire->origin.z()!=old_z){
653 old_z=points[i]->wire->origin.z();
655 x_list.push_back(points.size());
657 unsigned int start=0;
659 while (start<x_list.size()-1){
662 for (
unsigned int i=0;i<points.size();i++){
663 if(used[i]==
true) num_used++;
666 if (points.size()-num_used<3)
break;
669 for (
unsigned int i=x_list[start];i<x_list[start+1];i++){
676 tanl=D=z0=phi0=Phi1=xc=yc=rc=0.;
683 vector<const DFDCPseudo*>neighbors;
684 neighbors.push_back(points[i]);
685 unsigned int match=0;
686 double delta,delta_min=1000.;
687 for (
unsigned int k=0;k<x_list.size()-1;k++){
691 for (
unsigned int m=x_list[k];m<x_list[k+1];m++){
692 delta=(XY-points[m]->xy).Mod();
700 && used[match]==
false
702 XY=points[match]->xy;
705 neighbors.push_back(points[match]);
708 unsigned int num_neighbors=neighbors.size();
712 if (num_neighbors<3)
continue;
716 for (
unsigned int k=0;k<points.size();k++){
718 for (
unsigned int j=0;j<num_neighbors;j++){
719 delta=fabs(points[k]->xy.Y()-neighbors[j]->xy.Y());
722 abs(neighbors[j]->wire->wire-points[k]->wire->wire)<=1
723 && neighbors[j]->wire->origin.z()==points[k]->wire->origin.z()){
726 neighbors.push_back(points[k]);
742 jerror_t error=RiemannHelicalFit(neighbors);
750 if (CircleFit(neighbors)==NOERROR){
751 if (LineFit(neighbors)==NOERROR){
752 chisq=ComputeCircleChiSq(neighbors);
759 segment->
hits=neighbors;
760 segment->
package=(neighbors[0]->wire->layer-1)/6;
761 FillSegmentData(segment);
763 _data.push_back(segment);
767 if (CircleFit(neighbors)==NOERROR){
768 if (LineFit(neighbors)==NOERROR){
769 chisq=ComputeCircleChiSq(neighbors);
775 segment->
hits=neighbors;
776 segment->
package=(neighbors[0]->wire->layer-1)/6;
777 FillSegmentData(segment);
779 _data.push_back(segment);
791 if (total_num_used<used.size()){
792 for (
unsigned int k=0;k<_data.size();k++){
793 if (total_num_used==used.size())
break;
795 bool added_hits=
false;
796 for (
unsigned int i=0;i<used.size();i++){
797 if (total_num_used==used.size())
break;
799 unsigned int packNo=(points[i]->wire->layer-1)/6;
801 double z=points[i]->wire->origin.z();
802 double z0=segment->
hits[0]->wire->origin.z();
803 double phi_s=segment->
Phi1
804 +rotation_sense*(z-z0)/(segment->
rc*segment->
tanl);
806 double dx=segment->
xc+segment->
rc*cos(phi_s)-points[i]->xy.X();
807 double dy=segment->
yc+segment->
rc*
sin(phi_s)-points[i]->xy.Y();
808 double dr=
sqrt(dx*dx+dy*dy);
813 segment->
hits.push_back(points[i]);
821 if (RiemannHelicalFit(segment->
hits)==NOERROR){
827 if (CircleFit(segment->
hits)==NOERROR){
828 if (LineFit(segment->
hits)==NOERROR){
829 chisq=ComputeCircleChiSq(segment->
hits);
834 FillSegmentData(segment);
847 vector<const DFDCPseudo *>&points){
848 double Phi1=atan2(points[0]->xy.Y()-yc,points[0]->xy.X()-xc);
849 double z0=points[0]->wire->origin.z();
850 double plus_sum=0.,minus_sum=0.;
851 for (
unsigned int j=1;j<points.size();j++){
852 double dphi=(points[j]->wire->origin.z()-z0)/(rc*tanl);
853 double my_x=points[j]->xy.X();
854 double my_y=points[j]->xy.Y();
856 double phiplus=Phi1+dphi;
857 double dxplus=xc+rc*cos(phiplus)-my_x;
858 double dyplus=yc+rc*
sin(phiplus)-my_y;
859 double dxplus2=dxplus*dxplus;
860 double dyplus2=dyplus*dyplus;
861 double d2plus=dxplus2+dyplus2;
862 double varplus=(dxplus2*points[j]->covxx+dyplus2*points[j]->covyy
863 +2.*dxplus*dyplus*points[j]->covxy)/d2plus;
865 plus_sum+=d2plus/varplus;
867 double phiminus=Phi1-dphi;
868 double dxminus=xc+rc*cos(phiminus)-my_x;
869 double dyminus=yc+rc*
sin(phiminus)-my_y;
870 double dxminus2=dxminus*dxminus;
871 double dyminus2=dyminus*dyminus;
872 double d2minus=dxminus2+dyminus2;
873 double varminus=(dxminus2*points[j]->covxx+dyminus2*points[j]->covyy
874 +2.*dxminus*dyminus*points[j]->covxy)/d2minus;
876 minus_sum+=d2minus/varminus;
880 if (minus_sum<plus_sum)
return -1.;
886 double sumv=0.,sumx=0.;
887 double sumy=0.,sumxx=0.,sumxy=0.;
888 double sperp=0.,sperp_old=0.,ratio,Delta;
892 for (
unsigned int k=1;k<points.size();k++){
894 z=points[k]->wire->origin.z();
895 if (fabs(z-zlast)<0.01)
continue;
897 DVector2 diffxy=points[k]->xy-oldxy;
898 double Phi=points[k]->xy.Phi();
899 double cosPhi=cos(Phi);
900 double sinPhi=
sin(Phi);
901 double var=cosPhi*cosPhi*points[k]->covxx
902 +sinPhi*sinPhi*points[k]->covyy
903 +2.*sinPhi*cosPhi*points[k]->covxy;
906 ratio=diffxy.Mod()/(two_rc);
908 sperp=sperp_old+(ratio>1?two_rc*(M_PI_2):two_rc*asin(ratio));
911 double inv_var=1./var;
916 sumxy+=sperp*z*inv_var;
922 sperp+=oldxy.Mod()/two_rc;
926 sumx+=TARGET_Z*inv_var;
927 sumxx+=TARGET_Z*TARGET_Z*inv_var;
928 sumxy+=sperp*TARGET_Z*inv_var;
930 Delta=sumv*sumxx-sumx*sumx;
931 double denom=sumv*sumxy-sumy*sumx;
932 if (fabs(Delta)>
EPS && fabs(denom)>
EPS){
937 zvertex=zlast-tanl*sperp;
942 return VALUE_OUT_OF_RANGE;
947 double alpha=0.0, beta=0.0, gamma=0.0, deltax=0.0, deltay=0.0;
949 for(
unsigned int i=0;i<points.size();i++){
951 double x=hit->
xy.X();
952 double y=hit->
xy.Y();
955 double x_sq_plus_y_sq=x_sq+y_sq;
959 deltax += 0.5*x*x_sq_plus_y_sq;
960 deltay += 0.5*y*x_sq_plus_y_sq;
964 double denom = alpha*beta-gamma*gamma;
965 if(fabs(denom)<1.0E-20)
return UNRECOVERABLE_ERROR;
966 xc = (deltax*beta-deltay*gamma)/denom;
967 yc = (deltay*alpha-deltax*gamma)/denom;
968 rc =
sqrt(xc*xc + yc*yc);
969 Ndof=points.size()-2;
977 Phi1=atan2(neighbors[0]->xy.Y()-yc,neighbors[0]->xy.X()-xc);
978 double z0=neighbors[0]->wire->origin.z();
979 for (
unsigned int m=0;m<neighbors.size();m++){
980 double sperp=rotation_sense*(neighbors[m]->wire->origin.z()-z0)/tanl;
981 double phi_s=Phi1+sperp/rc;
983 chisq+=(XY-neighbors[m]->xy).Mod2();
994 double charge=RotationSenseToCharge*rotation_sense;
998 if (rotation_sense<0) phi0+=M_PI;
1001 D=-rotation_sense*rc-xc/
sin(phi0);
1012 segment->
chisq=chisq;
DVector2 xy
rough x,y coordinates in lab coordinate system
jerror_t CircleFit(vector< const DFDCPseudo * > &points)
double ComputeCircleChiSq(vector< const DFDCPseudo * > &neighbors)
double GetRotationSense(unsigned int n, vector< xyz_t > &XYZ, DMatrix &CR, DMatrix &CRPhi, vector< const DFDCPseudo * > &points)
jerror_t LineFit(vector< const DFDCPseudo * > &points)
jerror_t brun(JEventLoop *eventLoop, int32_t runnumber)
DFDCSegment_factory::brun():
DFDCSegment_factory()
DFDCSegment_factory::DFDCSegment_factory(): default constructor – initializes log file...
double t_v
time of the two cathode clusters
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
const DFDCWire * wire
DFDCWire for this wire.
bool DFDCSegment_package_cmp(const DFDCPseudo *a, const DFDCPseudo *b)
jerror_t RiemannLineFit(vector< const DFDCPseudo * > &points, DMatrix &CR, vector< xyz_t > &XYZ)
class DFDCPseudo: definition for a reconstructed point in the FDC
jerror_t evnt(JEventLoop *eventLoop, uint64_t eventNo)
DFDCSegment_factory::evnt(): this is the place that finds track segments and converts pseudopoints in...
vector< const DFDCPseudo * > hits
~DFDCSegment_factory()
DFDCSegment_factory::~DFDCSegment_factory(): default destructor – closes log file.
jerror_t RiemannCircleFit(vector< const DFDCPseudo * > &points, DMatrix &CRPhi)
DGeometry * GetDGeometry(unsigned int run_number)
jerror_t RiemannHelicalFit(vector< const DFDCPseudo * > &points)
jerror_t UpdatePositionsAndCovariance(unsigned int n, double r1sq, vector< xyz_t > &XYZ, DMatrix &CRPhi, DMatrix &CR)
#define ADJACENT_MATCH_DISTANCE
double time
time corresponding to this pseudopoint.
virtual double GetBz(double x, double y, double z) const =0
jerror_t FindSegments(vector< const DFDCPseudo * > &points)
class DFDCSegment: definition for a track segment in the FDC
bool GetTargetZ(double &z_target) const
z-location of center of target
void FillSegmentData(DFDCSegment *segment)