15 #define qBr2p 0.003 // conversion for converting q*B*r to GeV/c
41 normal.SetXYZ(0.,0.,0.);
72 const vector<DQFHit_t*> myhits = fit.
GetHits();
73 for(
unsigned int i=0; i<myhits.size(); i++){
85 if(
this == &fit)
return *
this;
106 return AddHitXYZ(r*cos(phi), r*
sin(phi), z);
133 if(idx<0 || idx>=(
int)hits.size())
return VALUE_OUT_OF_RANGE;
136 hits.erase(hits.begin() + idx);
147 for(
unsigned int i=0; i<hits.size(); i++)
delete hits[i];
163 cout<<
"Chisq vector from DQuickFit: (source=";
164 switch(chisq_source){
165 case NOFIT: cout<<
"NOFIT";
break;
166 case CIRCLE: cout<<
"CIRCLE";
break;
167 case TRACK: cout<<
"TRACK";
break;
170 cout<<
"----------------------------"<<endl;
172 for(
unsigned int i=0;i<hits.size();i++){
173 cout<<i<<
" "<<hits[i]->chisq<<endl;
175 cout<<
"Total: "<<chisq<<endl<<endl;
208 float alpha=0.0, beta=0.0, gamma=0.0, deltax=0.0, deltay=0.0;
209 chisq_source = NOFIT;
214 for(
unsigned int i=0;i<hits.size();i++){
221 deltax += x*(x*x+y*
y)/2.0;
222 deltay += y*(x*x+y*
y)/2.0;
226 double denom = alpha*beta-gamma*gamma;
227 if(fabs(denom)<1.0E-20)
return UNRECOVERABLE_ERROR;
228 x0 = (deltax*beta-deltay*gamma)/denom;
230 y0 = (deltay*alpha-deltax*gamma)/denom;
239 r0 =
sqrt(x0*x0 + y0*y0);
241 phi = atan2(y0,x0) - M_PI_2;
245 if(phi<0)phi+=2.0*M_PI;
246 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
250 chisq_source = CIRCLE;
265 for(
unsigned int i=0;i<hits.size();i++){
269 float c =
sqrt(x*x + y*y) - r0;
291 chisq_source = NOFIT;
294 for(
unsigned int i=0; i<hits.size(); i++){
300 double beam_var=BeamRMS*
BeamRMS;
304 if(err!=NOERROR)
return err;
322 float r0 =
sqrt(x0*x0 + y0*y0);
324 phi = atan2(y0,x0) - M_PI_2;
328 if(phi<0)phi+=2.0*M_PI;
329 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
333 chisq_source = CIRCLE;
362 for(
unsigned int i=0;i<hits.size();i++){
364 double r =
sqrt(pow((
double)a->
x,2.0) + pow((
double)a->
y, 2.0));
372 if(phi<0)phi+=2.0*M_PI;
373 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
376 SearchPtrans(9.0, 0.5);
382 float Sxx=0.0, Syy=0.0, Sxy=0.0;
383 chisq_source = NOFIT;
387 for(
unsigned int i=0;i<hits.size();i++){
396 double B = Sxx - Syy;
397 phi = B>A ? atan2(A,B)/2.0 : 1.0/atan2(B,A)/2.0;
398 if(phi<0)phi+=2.0*M_PI;
399 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
423 double min_chisq=1.0E6;
424 double min_x0=0.0, min_y0=0.0, min_r0=0.0;
425 for(
double my_p_trans=ptrans_step; my_p_trans<=ptrans_max; my_p_trans+=ptrans_step){
427 r0 = my_p_trans/(0.003*2.0);
428 double alpha, my_chisq;
431 alpha = phi + M_PI_2;
434 my_chisq = ChisqCircle();
435 if(my_chisq<min_chisq){
441 p_trans = my_p_trans;
445 alpha = phi - M_PI_2;
448 my_chisq = ChisqCircle();
449 if(my_chisq<min_chisq){
455 p_trans = my_p_trans;
479 for(
unsigned int i=0; i<hits.size(); i++){
481 double x = hits[i]->x;
482 double y = hits[i]->y;
483 double R2 = x*x + y*
y;
497 for(
unsigned int i=0; i<hits.size(); i++){
499 double x = hits[i]->x;
500 double y = hits[i]->y;
501 double R =
sqrt(x*x + y*y);
502 if(fabs(R-Rmax/2.0) < fabs(Rmid-Rmax/2.0)){
512 double x1 = hit_mid->
x;
513 double y1 = hit_mid->
y;
514 double x2 = hit_max->
x;
515 double y2 = hit_max->
y;
516 double r2 =
sqrt(x2*x2 + y2*y2);
517 double cos_phi = x2/r2;
518 double sin_phi = y2/r2;
519 double u1 = x1*cos_phi + y1*sin_phi;
520 double v1 = -x1*sin_phi + y1*cos_phi;
521 double u2 = x2*cos_phi + y2*sin_phi;
523 double v0 = (u1*u1 + v1*v1 - u1*u2)/(2.0*v1);
525 x0 = u0*cos_phi - v0*sin_phi;
526 y0 = u0*sin_phi + v0*cos_phi;
527 r0 =
sqrt(x0*x0 + y0*y0);
530 p_trans = fabs(0.003*B*r0);
531 q = v1>0.0 ? -1.0:+1.0;
554 for(
unsigned int i=0; i<hits.size(); i++){
556 double x = hits[i]->x;
557 double y = hits[i]->y;
558 if((x*y0 - y*x0) < 0.0)N++;
562 if(N>hits.size()/2.0){
565 if(phi>2.0*M_PI)phi-=2.0*M_PI;
599 Fill_phi_circle(hits, x0, y0);
602 float Sxx=0.0, Syy=0.0, Sxy=0.0;
603 for(
unsigned int i=0;i<hits.size();i++){
605 float deltaZ = a->
z - z_mean;
607 Syy += deltaZ*deltaZ;
608 Sxx += deltaPhi*deltaPhi;
609 Sxy += deltaZ*deltaPhi;
612 float dzdphi = Syy/Sxy;
613 z_vertex = z_mean - phi_mean*dzdphi;
617 return FillTrackParams();
634 return FitLine_FixedZvertex(z_vertex);
668 this->z_vertex = z_vertex;
671 Fill_phi_circle(hits, x0, y0);
675 float Sxx=0, Syy=0, Sxy = 0;
676 float r0 =
sqrt(x0*x0 + y0*y0);
677 for(
unsigned int i=0; i<hits.size(); i++){
680 float dz = a->
z - z_vertex;
684 Syy += r0*dphi*r0*dphi;
689 float k = (Syy-Sxx)/(2.0*Sxy);
690 float s =
sqrt(k*k + 1.0);
691 float cot_theta1 = -k+s;
692 float cot_theta2 = -k-s;
693 float cot_theta_lin = Sx/Sy;
695 if(fabs(cot_theta_lin-cot_theta1) < fabs(cot_theta_lin-cot_theta2)){
696 cot_theta = cot_theta1;
698 cot_theta = cot_theta2;
701 dzdphi = r0*cot_theta;
704 return FillTrackParams();
714 float phi_last = 0.0;
715 z_mean = phi_mean = 0.0;
716 for(
unsigned int i=0; i<hits.size(); i++){
719 float dx = a->
x - x0;
720 float dy = a->
y - y0;
721 float dphi =
atan2f(dx*y_last - dy*x_last, dx*x_last + dy*y_last);
722 float my_phi = phi_last +dphi;
732 z_mean /= (float)hits.size();
733 phi_mean /= (float)hits.size();
747 float r0 =
sqrt(x0*x0 + y0*y0);
748 theta = atan(r0/fabs(dzdphi));
754 if(phi<0)phi+=2.0*M_PI;
755 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
761 chisq_source = TRACK;
770 theta = M_PI - theta;
772 if(phi<0)phi+=2.0*M_PI;
773 if(phi>=2.0*M_PI)phi-=2.0*M_PI;
782 p = fabs(p_trans/
sin(theta));
792 cout<<
"-- DQuickFit Params ---------------"<<endl;
793 cout<<
" x0 = "<<x0<<endl;
794 cout<<
" y0 = "<<y0<<endl;
795 cout<<
" q = "<<q<<endl;
796 cout<<
" p = "<<p<<endl;
797 cout<<
" p_trans = "<<p_trans<<endl;
798 cout<<
" phi = "<<phi<<endl;
799 cout<<
" theta = "<<theta<<endl;
800 cout<<
" z_vertex = "<<z_vertex<<endl;
801 cout<<
" chisq = "<<chisq<<endl;
802 cout<<
"chisq_source = ";
803 switch(chisq_source){
804 case NOFIT: cout<<
"NOFIT";
break;
805 case CIRCLE: cout<<
"CIRCLE";
break;
806 case TRACK: cout<<
"TRACK";
break;
809 cout<<
" Bz(avg) = "<<
Bz_avg<<endl;
822 for(
unsigned int i=0;i<hits.size();i++){
824 cout<<
" x="<<v->
x<<
" y="<<v->
y<<
" z="<<v->
z;
843 jerror_t DQuickFit::AddHits(
int N,
DVector3 *v)
850 for(
int i=0; i<N; i++, v++){
855 cerr<<__FILE__<<
":"<<__LINE__<<
" NULL vector in DQuickFit::AddHits. Hit dropped."<<endl;
864 jerror_t DQuickFit::PruneHits(
float chisq_limit)
874 if(hits.size() != chisqv.size()){
875 cerr<<__FILE__<<
":"<<__LINE__<<
" hits and chisqv do not have the same number of rows!"<<endl;
876 cerr<<
"Call FitCircle() or FitTrack() method first!"<<endl;
883 for(
int i=chisqv.size()-1; i>=0; i--){
884 if(chisqv[i] > chisq_limit)PruneHit(i);
893 jerror_t DQuickFit::PruneOutlier(
void)
904 for(
unsigned int i=0;i<hits.size();i++){
909 X /= (float)hits.size();
910 Y /= (float)hits.size();
914 for(
unsigned int i=0;i<hits.size();i++){
918 float dist_sq = x*x + y*
y;
924 if(idx>=0)PruneHit(idx);
932 jerror_t DQuickFit::PruneOutliers(
int n)
941 for(
int i=0;i<n;i++)PruneOutlier();
949 jerror_t DCDC::firstguess_curtis(s_Cdc_trackhit_t *hits,
int Npoints
950 ,
float &theta ,
float &phi,
float &p,
float &q)
952 if(Npoints<3)
return NOERROR;
954 s_Cdc_trackhit_t *hit1, *hit2, *hit3;
956 hit2 = &hits[Npoints/2];
957 hit3 = &hits[Npoints-1];
959 float x1 = hit1->x, y1=hit1->y;
960 float x2 = hit2->x, y2=hit2->y;
961 float x3 = hit3->x, y3=hit3->y;
963 float b = (x2*x2+y2*y2-x1*x1-y1*y1)/(2.0*(x2-x1));
964 b -= (x3*x3+y3*y3-x1*x1-y1*y1)/(2.0*(x3-x1));
965 b /= ((y1-y2)/(x1-x2)) - ((y1-y3)/(x1-x3));
966 float a = (x2*x2-y2*y2-x1*x1-y1*y1)/(2.0*(x2-x1));
967 a -= b*(y2-y1)/(x2-x1);
979 float r0 =
sqrt(x0*x0 + y0*y0);
980 float hbarc = 197.326;
981 float p_trans = q*B*r0/hbarc;
989 float xprod_sum = 0.0;
991 s_Cdc_trackhit_t *v = hits;
992 s_Cdc_trackhit_t *v2=&hits[n_2];
993 for(
int i=0;i<n_2;i++, v++, v2++){
994 xprod_sum += v->x*v2->y - v2->x*v->y;
996 if(xprod_sum>0.0)q = -q;
1001 phi += q>0.0 ? -M_PI_2:M_PI_2;
1009 int Ndzdphipoints = 0;
1010 for(
int i=0;i<Npoints-1;i++, v++, v2++){
1011 float myphi1 = atan2(v->y-y0, v->x-x0);
1012 float myphi2 = atan2(v2->y-y0, v2->x-x0);
1013 float mydzdphi = (v2->z-v->z)/(myphi2-myphi1);
1014 if(finite(mydzdphi)){
1020 dzdphi/=(float)Ndzdphipoints;
1023 theta = atan(r0/fabs(dzdphi));
1024 p = -p_trans/
sin(theta);
jerror_t FitCircleStraightTrack()
bool operator()(DQFHit_t *const &a, DQFHit_t *const &b) const
jerror_t FitCircleRiemann(double BeamRMS=0.100)
jerror_t AddHit(double r, double phi, double z)
Add a hit to the list of hits using cylindrical coordinates.
const vector< DQFHit_t * > GetHits() const
jerror_t FitLine_FixedZvertex(float z_vertex)
jerror_t FillTrackParams(void)
ChiSqSourceType_t chisq_source
jerror_t Fill_phi_circle(vector< DQFHit_t * > hits, float x0, float y0)
jerror_t AddHitXYZ(float x, float y, float z)
jerror_t FitTrack_FixedZvertex(float z_vertex)
jerror_t PruneHit(int idx)
DQuickFit & operator=(const DQuickFit &fit)
float chisq
chi-sq contribution of this hit
void GetPlaneParameters(double &c, DVector3 &n)
const DMagneticFieldMap * GetMagneticFieldMap() const
jerror_t AddHitXYZ(double x, double y, double z)
Add a hit to the list of hits using Cartesian coordinates.
bool DQFHitLessThanZ_C(DQFHit_t *const &a, DQFHit_t *const &b)
void SearchPtrans(double ptrans_max=9.0, double ptrans_step=0.5)
jerror_t Dump(void) const
float phi_circle
phi angle relative to axis of helix
jerror_t FitCircle(double rc)
jerror_t AddHit(float r, float phi, float z)
jerror_t Print(void) const
jerror_t GuessChargeFromCircleFit(void)
void Copy(const DQuickFit &fit)
jerror_t PrintChiSqVector(void) const
float z
point in lab coordinates