18 #include <JANA/JEventLoop.h>
47 public:
bool operator()(
const T &a,
const T &b)
const {
return a>b;}
92 gPARMS->SetDefaultParameter(
"TRKFIT:DEBUG_HISTS",
DEBUG_HISTS);
93 gPARMS->SetDefaultParameter(
"TRKFIT:DEBUG_LEVEL",
DEBUG_LEVEL);
94 gPARMS->SetDefaultParameter(
"TRKFIT:MAX_CHISQ_DIFF",
MAX_CHISQ_DIFF);
96 gPARMS->SetDefaultParameter(
"TRKFIT:SIGMA_CDC",
SIGMA_CDC);
105 gPARMS->SetDefaultParameter(
"TRKFIT:DEFAULT_MASS",
DEFAULT_MASS);
107 gPARMS->SetDefaultParameter(
"TRKFIT:LR_FORCE_TRUTH",
LR_FORCE_TRUTH);
109 gPARMS->SetDefaultParameter(
"TRKFIT:USE_FDC",
USE_FDC);
110 gPARMS->SetDefaultParameter(
"TRKFIT:USE_CDC",
USE_CDC);
111 gPARMS->SetDefaultParameter(
"TRKFIT:USE_FDC_CATHODE",
USE_FDC_CATHODE);
136 cout<<__FILE__<<
":"<<__LINE__<<
"-------------- Least Squares TRACKING --------------"<<endl;
140 _DBG_<<
"Cannot get DApplication from JEventLoop! (are you using a JApplication based program?)"<<endl;
152 fdcu_vs_s = (TH2F*)gROOT->FindObject(
"fdcu_vs_s");
153 dist_axial = (TH1F*)gROOT->FindObject(
"dist_axial");
154 doca_axial = (TH1F*)gROOT->FindObject(
"doca_axial");
155 dist_stereo = (TH1F*)gROOT->FindObject(
"dist_stereo");
156 doca_stereo = (TH1F*)gROOT->FindObject(
"doca_stereo");
159 Npasses = (TH1F*)gROOT->FindObject(
"Npasses");
160 ptotal = (TH1F*)gROOT->FindObject(
"ptotal");
174 cdc_can_resi = (TH1F*)gROOT->FindObject(
"cdc_can_resi");
175 fdc_can_resi = (TH1F*)gROOT->FindObject(
"fdc_can_resi");
178 lambda = (TH1F*)gROOT->FindObject(
"lambda");
181 if(!
cdcdoca_vs_dist_vs_ring)
cdcdoca_vs_dist_vs_ring =
new TH3F(
"cdcdoca_vs_dist_vs_ring",
"DOCA vs. DIST vs. ring",300, 0.0, 1.2, 300, 0.0, 1.2,23,0.5,23.5);
183 if(!
fdcu_vs_s)
fdcu_vs_s =
new TH2F(
"fdcu_vs_s",
"DOCA vs. DIST along wire",500, -60.0, 60.0, 500, -60.0, 60.0);
184 if(!
dist_axial)
dist_axial =
new TH1F(
"dist_axial",
"Distance from drift time for axial CDC wires",300,0.0,3.0);
185 if(!
doca_axial)
doca_axial =
new TH1F(
"doca_axial",
"DOCA of track for axial CDC wires",300,0.0,3.0);
186 if(!
dist_stereo)
dist_stereo =
new TH1F(
"dist_stereo",
"Distance from drift time for stereo CDC wires",300,0.0,3.0);
190 if(!
Npasses)
Npasses =
new TH1F(
"Npasses",
"Npasses", 101, -0.5, 100.5);
191 if(!
ptotal)
ptotal =
new TH1F(
"ptotal",
"ptotal",1000, 0.1, 8.0);
195 if(!
residuals_cdc_vs_s)
residuals_cdc_vs_s =
new TH3F(
"residuals_cdc_vs_s",
"Residuals in CDC vs. pathlength",1000,-2.0,2.0,24,0.5,24.5,100, 0.0, 800);
196 if(!
residuals_fdc_anode_vs_s)
residuals_fdc_anode_vs_s =
new TH3F(
"residuals_fdc_anode_vs_s",
"Residuals in FDC anode vs. pathlength",1000,-2.0,2.0,24,0.5,24.5,100, 0.0, 800);
197 if(!
residuals_fdc_cathode_vs_s)
residuals_fdc_cathode_vs_s =
new TH3F(
"residuals_fdc_cathode_vs_s",
"Residuals in FDC cathode vs. pathlength",1000,-2.0,2.0,24,0.5,24.5,100, 0.0, 800);
205 if(!
cdc_can_resi)
cdc_can_resi =
new TH1F(
"cdc_can_resi",
"Residual of CDC hits with candidate tracks", 200, -1.0, 1.0);
206 if(!
fdc_can_resi)
fdc_can_resi =
new TH1F(
"fdc_can_resi",
"Residual of FDC hits with candidate tracks", 200, -1.0, 1.0);
208 if(!
lambda)
lambda =
new TH1F(
"lambda",
"Scaling factor #lambda for Newton-Raphson calculated step", 2048, -2.0, 2.0);
252 if(mom.Mag()>12.0)mom.SetMag(8.0);
259 _DBG_<<
"starting parameters for fit: chisq="<<chisq<<
" Ndof="<<Ndof<<
" (chisq/Ndof="<<chisq/(double)Ndof<<
") p="<<
rt->
swim_steps[0].
mom.Mag()<<endl;
264 double last_chisq = 1.0E6;
287 if(
DEBUG_LEVEL>2)
_DBG_<<
"Number of iterations >4. Trying to keep fit from last iteration... "<<endl;
307 if(
DEBUG_LEVEL>3)
_DBG_<<
"Fit chisq too large on iteration "<<Niterations<<endl;
328 bool fit_succeeded =
false;
329 if(Niterations>0)fit_succeeded =
true;
335 _DBG_<<
"-------- Final Chisq for track = "<<this->
chisq<<
" Ndof="<<this->
Ndof<<endl;
339 _DBG_<<
"-------- Check chisq = "<<chisq<<
" Ndof="<<Ndof<<endl;
366 vertex_mom = -vertex_mom;
380 if((locReturnValue >= -1.0) || (locReturnValue <= 1.0)){
386 rt->
Swim(vertex_pos, vertex_mom);
408 for(
int i=0; i<
rt->
Nswim_steps-1; i++, step++){
if(step->
s>10.0)
break;}
416 vertex_mom = -vertex_mom;
435 if(
DEBUG_LEVEL>1)
_DBG_<<
" -- Fit succeeded: Final params after vertex adjustment: q="<<
rt->
q<<
" p="<<vertex_mom.Mag()<<
" theta="<<vertex_mom.Theta()*57.3<<
" phi="<<vertex_mom.Phi()*57.3<<
" chisq="<<
chisq<<
" Ndof="<<
Ndof<<
" (chisq/Ndof="<<
chisq/(double)
Ndof<<
")"<<endl;
456 vector<resiInfo> residuals;
459 double my_chisq =
ChiSq(residuals, chisq_ptr, dof_ptr);
460 if(pulls_ptr)*pulls_ptr =
pulls;
473 int Nmeasurements = (int)residuals.size();
474 resiv.ResizeTo(Nmeasurements, 1);
475 cov_meas.ResizeTo(Nmeasurements, Nmeasurements);
476 cov_muls.ResizeTo(Nmeasurements, Nmeasurements);
481 if(chisq_ptr)*chisq_ptr=1.0E6;
482 if(dof_ptr)*dof_ptr=1;
487 for(
unsigned int i=0; i<residuals.size(); i++){
500 for(
unsigned int i=0; i<residuals.size(); i++){
502 if(ri.
layer<1)
continue;
503 if(!ri.
step)
continue;
504 if( (step0==NULL) || (ri.
step->
s < step0->
s) ){
511 for(
unsigned int i=0; i<residuals.size(); i++){
517 for(
unsigned int j=i; j<residuals.size(); j++){
532 double sA = stepA->
s;
533 double sB = stepB->
s;
536 if(step0->
s>step_end->
s)
continue;
542 double sigmaAB = sA*sB*itheta02 - (sA+sB)*itheta02s + itheta02s2;
586 double chisq = chisqM[0][0];
587 int Ndof = (int)residuals.size() - 5;
592 for(
unsigned int i=0; i<residuals.size(); i++){
594 pulls.push_back(
pull_t(resiv[i][0], err, residuals[i].step->s));
600 if(chisq_ptr)*chisq_ptr =
chisq;
601 if(dof_ptr)*dof_ptr =
Ndof;
605 return Ndof<2 ? 1.0E6:chisq/(double)Ndof;
628 for(
unsigned int i=0; i<
cdchits.size(); i++){
668 double beta = 1.0/
sqrt(1.0 + pow(mass/mom_doca.Mag(), 2.0))*2.998E10;
669 double tof = s/beta/1.0E-9;
682 double sigma_d = 108.55 + 7.62391*x + 556.176*exp(-(1.12566)*pow(x,1.29645));
683 hi.
err = sigma_d/10000.0;
692 for(
unsigned int i=0; i<
fdchits.size(); i++){
731 double beta = 1.0/
sqrt(1.0 + pow(mass/mom_doca.Mag(), 2.0))*2.998E10;
732 double tof = s/beta/1.0E-9;
780 for(
unsigned int i=0; i<hinfo.size(); i++){Nhits++;
if(hinfo[i].u_err!=0.0)Nhits++;}
781 vector<bool> good_none(Nhits,
false);
786 if(vdir.Mag()!=0.0)vdir.SetMag(1.0);
796 _DBG_<<
"NULL pointer passed for DReferenceTrajectory object!"<<endl;
800 if(pos.Mag()>200.0 || fabs(state[
state_x ][0])>100.0 || fabs(state[
state_v ][0])>100.0){
805 _DBG_<<
"state[state_x ][0]="<<state[
state_x ][0]<<
" state[state_v ][0]="<<state[
state_x ][0]<<endl;
834 for(
unsigned int i=0; i<hinfo.size(); i++){
855 double resi = hi.
dist - d;
865 residuals.push_back(ri);
866 good.push_back(
true);
868 good.push_back(
false);
880 double LRsign = hi.
dist<0.0 ? -1.0:1.0;
884 double resic = u - u_corrected;
894 residuals.push_back(ri);
895 good.push_back(
true);
897 good.push_back(
false);
941 double initial_chisq;
943 vector<resiInfo> tmpresiduals;
944 vector<bool> good_initial =
GetResiInfo(rt, hinfo, tmpresiduals);
945 double initial_chisq_per_dof =
ChiSq(tmpresiduals, &initial_chisq, &initial_Ndof);
964 const int Nparameters = 5;
965 double deltas[Nparameters];
968 case 5: state[
state_v ][0] = 0.0;
969 case 4: state[
state_x ][0] = 0.0;
985 vector<bool> good_px =
GetResiInfo(state_dpx, &start_step,
tmprt, hinfo, tmpresiduals);
986 double chisq_dpx =
ChiSq(tmpresiduals);
988 DMatrix &resiv_dpx_lo = resiv_initial;
994 vector<bool> good_py =
GetResiInfo(state_dpy, &start_step,
tmprt, hinfo, tmpresiduals);
995 double chisq_dpy =
ChiSq(tmpresiduals);
997 DMatrix &resiv_dpy_lo = resiv_initial;
1003 vector<bool> good_pz =
GetResiInfo(state_dpz, &start_step,
tmprt, hinfo, tmpresiduals);
1004 double chisq_dpz =
ChiSq(tmpresiduals);
1006 DMatrix &resiv_dpz_lo = resiv_initial;
1012 vector<bool> good_v =
GetResiInfo(state_dv, &start_step,
tmprt, hinfo, tmpresiduals);
1013 double chisq_dv =
ChiSq(tmpresiduals);
1015 DMatrix &resiv_dv_lo = resiv_initial;
1021 vector<bool> good_x =
GetResiInfo(state_dx, &start_step,
tmprt, hinfo, tmpresiduals);
1022 double chisq_dx =
ChiSq(tmpresiduals);
1024 DMatrix &resiv_dx_lo = resiv_initial;
1027 unsigned int size_good = good_initial.size();
1028 if( (good_px.size() != size_good)
1029 || (good_py.size() != size_good)
1030 || (good_pz.size() != size_good)
1031 || (good_v.size() != size_good)
1032 || (good_x.size() != size_good)){
1033 _DBG_<<
"Size of \"good\" vectors don't match! size_good="<<size_good<<endl;
1034 _DBG_<<
"good_px.size()="<<good_px.size()<<endl;
1035 _DBG_<<
"good_py.size()="<<good_py.size()<<endl;
1036 _DBG_<<
"good_pz.size()="<<good_pz.size()<<endl;
1037 _DBG_<<
" good_v.size()="<<good_v.size()<<endl;
1038 _DBG_<<
" good_x.size()="<<good_x.size()<<endl;
1044 unsigned int Ngood = 0;
1045 vector<bool> good_all;
1046 for(
unsigned int i=0; i<size_good; i++){
1048 isgood &= good_initial[i];
1049 isgood &= good_px[i];
1050 isgood &= good_py[i];
1051 isgood &= good_pz[i];
1052 isgood &= good_v[i];
1053 isgood &= good_x[i];
1054 good_all.push_back(isgood);
1060 if(
DEBUG_LEVEL>0)
_DBG_<<
"Not enough good hits to do fit. Aborting..."<<endl;
1066 FilterGood(resiv_initial, good_initial, good_all);
1067 FilterGood(resiv_dpx_hi , good_px, good_all);
1068 FilterGood(resiv_dpy_hi , good_py, good_all);
1069 FilterGood(resiv_dpz_hi , good_pz, good_all);
1072 FilterGood(weights_initial , good_x , good_all);
1077 int Nhits = resiv_initial.GetNrows();
1078 if( (resiv_dpx_hi.GetNrows() != Nhits)
1079 || (resiv_dpy_hi.GetNrows() != Nhits)
1080 || (resiv_dpz_hi.GetNrows() != Nhits)
1081 || (resiv_dx_hi.GetNrows() != Nhits)
1082 || (resiv_dv_hi.GetNrows() != Nhits)){
1083 _DBG_<<
"Size of residual vectors don't match! Nhits="<<Nhits<<endl;
1084 _DBG_<<
"resiv_dpx_hi.GetNrows()="<<resiv_dpx_hi.GetNrows()<<endl;
1085 _DBG_<<
"resiv_dpy_hi.GetNrows()="<<resiv_dpy_hi.GetNrows()<<endl;
1086 _DBG_<<
"resiv_dpz_hi.GetNrows()="<<resiv_dpz_hi.GetNrows()<<endl;
1087 _DBG_<<
" resiv_dx_hi.GetNrows()="<<resiv_dx_hi.GetNrows()<<endl;
1088 _DBG_<<
" resiv_dv_hi.GetNrows()="<<resiv_dv_hi.GetNrows()<<endl;
1094 _DBG_<<
"initial_chisq_per_dof="<<initial_chisq_per_dof<<endl;
1095 _DBG_<<
"chisq_dpx="<<chisq_dpx<<endl;
1096 _DBG_<<
"chisq_dpy="<<chisq_dpy<<endl;
1097 _DBG_<<
"chisq_dpz="<<chisq_dpz<<endl;
1098 _DBG_<<
"chisq_dv="<<chisq_dv<<endl;
1099 _DBG_<<
"chisq_dx="<<chisq_dx<<endl;
1101 _DBG_<<
"hit\tinitial\tpx \tpy \tpz \tx \tv"<<endl;
1102 for(
int j=0; j<resiv_initial.GetNrows(); j++){
1116 for(
int i=0; i<Nhits; i++){
1117 switch(Nparameters){
1119 case 5: F[i][
state_v ] = (resiv_dv_hi[i][0]-resiv_dv_lo[i][0])/deltas[
state_v];
1120 case 4: F[i][
state_x ] = (resiv_dx_hi[i][0]-resiv_dx_lo[i][0])/deltas[
state_x];
1121 case 3: F[i][
state_pz] = (resiv_dpz_hi[i][0]-resiv_dpz_lo[i][0])/deltas[
state_pz];
1122 case 2: F[i][
state_py] = (resiv_dpy_hi[i][0]-resiv_dpy_lo[i][0])/deltas[
state_py];
1123 case 1: F[i][
state_px] = (resiv_dpx_hi[i][0]-resiv_dpx_lo[i][0])/deltas[
state_px];
1131 if(F.E2Norm()>1.0E18){
1133 _DBG_<<
" -- F matrix E2Norm out of range(E2Norm="<<F.E2Norm()<<
" max="<<1.0E18<<
")"<<endl;
1139 DMatrix Ft(DMatrix::kTransposed, F);
1142 DMatrix &Vinv = weights_initial;
1143 DMatrix B(DMatrix::kInverted, Ft*Vinv*F);
1165 cout<<
"--- B ---"<<endl;
1176 DMatrix delta_state = B*Ft*Vinv*resiv_initial;
1189 double min_chisq_per_dof = initial_chisq_per_dof;
1190 double min_lambda = 0.0;
1195 for(; Ntrys<max_trys; Ntrys++){
1198 for(
int i=0; i<Nparameters; i++)new_state[i][0] = state[i][0] + delta_state[i][0]*lambda;
1201 double chisq_per_dof =
ChiSq(tmpresiduals);
1203 if(chisq_per_dof<min_chisq_per_dof){
1204 min_chisq_per_dof = chisq_per_dof;
1209 if(
DEBUG_LEVEL>4)
_DBG_<<
" -- initial_chisq_per_dof="<<initial_chisq_per_dof<<
" new chisq_per_dof="<<chisq_per_dof<<
" nhits="<<
resiv.GetNrows()<<
" p="<<
tmprt->
swim_steps[0].
mom.Mag()<<
" lambda="<<lambda<<endl;
1210 if(chisq_per_dof-initial_chisq_per_dof < 0.1 && chisq_per_dof<2.0)
break;
1212 if(chisq_per_dof<initial_chisq_per_dof)
break;
1221 if(Ntrys>=max_trys){
1223 for(
int j=0; j<3; j++, Ntrys++){
1226 for(
int i=0; i<Nparameters; i++)new_state[i][0] = state[i][0] + delta_state[i][0]*lambda;
1229 double chisq_per_dof =
ChiSq(tmpresiduals);
1231 if(chisq_per_dof<min_chisq_per_dof){
1232 min_chisq_per_dof = chisq_per_dof;
1237 if(
DEBUG_LEVEL>4)
_DBG_<<
" -- initial_chisq_per_dof="<<initial_chisq_per_dof<<
" new chisq_per_dof="<<chisq_per_dof<<
" nhits="<<
resiv.GetNrows()<<
" p="<<
tmprt->
swim_steps[0].
mom.Mag()<<
" lambda="<<lambda<<endl;
1238 if(chisq_per_dof-initial_chisq_per_dof < 0.1 && chisq_per_dof<2.0)
break;
1240 if(chisq_per_dof<initial_chisq_per_dof)
break;
1249 if(min_lambda==0.0){
1250 if(
DEBUG_LEVEL>1)
_DBG_<<
"Chisq only increased (both directions searched!)"<<endl;
1257 for(
int i=0; i<Nparameters; i++)new_state[i][0] = state[i][0] + delta_state[i][0]*min_lambda;
1262 GetResiInfo(new_state, &start_step, rt, hinfo, tmpresiduals);
1268 double phi = mom.Phi();
1269 if(phi<0.0)phi+=2.0*M_PI;
1270 _DBG_<<
"LeastSquaresB succeeded: p="<<mom.Mag()<<
" theta="<<mom.Theta()<<
" phi="<<phi<<
" z="<<pos.Z()<<endl;
1290 vector<int> rows_to_keep;
1291 for(
unsigned int i=0, n=0; i<my_good.size(); i++){
1292 if(my_good[i] && good_all[i])rows_to_keep.push_back(n);
1297 int Nrows = (int)rows_to_keep.size();
1298 int Ncols = my_resiv.GetNcols()>1 ? Nrows:1;
1300 my_resiv.ResizeTo(Nrows, Ncols);
1303 for(
int i=0; i<Nrows; i++){
1304 int irow = rows_to_keep[i];
1305 for(
int j=0; j<
Ncols; j++){
1306 int icol = Ncols>1 ? rows_to_keep[j]:0;
1307 my_resiv[i][j] = tmp[irow][icol];
1320 int Nhits = resiv.GetNrows();
1321 double chisq_diagonal = 0.0;
1322 for(
int i=0; i<Nhits; i++){
1323 _DBG_<<
" r/sigma "<<i<<
": "<<resiv[i][0]*
sqrt(weights[i][i])
1324 <<
" resi="<<resiv[i][0]
1325 <<
" sigma="<<1.0/
sqrt(weights[i][i])
1326 <<
" cov_meas="<<cov_meas[i][i]
1327 <<
" cov_muls="<<cov_muls[i][i]
1329 chisq_diagonal += pow(resiv[i][0], 2.0)*weights[i][i];
1331 DMatrix resiv_t(DMatrix::kTransposed, resiv);
1332 DMatrix chisqM(resiv_t*weights*resiv);
1333 int Ndof = Nhits - 5;
1335 _DBG_<<
" chisq/Ndof: "<<chisqM[0][0]/(double)Ndof<<
" chisq/Ndof diagonal elements only:"<<chisq_diagonal/(
double)Ndof<<endl;
1354 vector<const DMCTrackHit*> mctrackhits;
1355 loop->Get(mctrackhits);
1358 for(
unsigned int i=0; i<hinfo.size(); i++){
1361 if(wire==
target)
continue;
1364 if(!isfinite(hi.
dist)){
1377 if(
DEBUG_LEVEL>1)
_DBG_<<
"No DMCTrackHit found corresponding to hit "<<i<<
" in hinfo! (noise hit?)"<<endl;
1407 DVector3 pos_truth(mctrackhit->
r*cos(mctrackhit->
phi), mctrackhit->
r*
sin(mctrackhit->
phi), mctrackhit->
z);
1410 if(
DEBUG_LEVEL>8)
_DBG_<<
" "<<i+1<<
": (pos_doca-pos_wire).Angle(pos_truth-pos_wire_truth)="<<(pos_doca-pos_wire).Angle(pos_truth-pos_wire_truth)*57.3<<endl;
1413 double angle_fit_truth = (pos_doca-pos_wire).Angle(pos_truth-pos_wire_truth);
1414 if(fabs( fabs(angle_fit_truth)-M_PI/2.0) < M_PI/3.0){
1417 if(
DEBUG_LEVEL>5)
_DBG_<<
"Downgrading "<<i+1<<
"th hit to wire-based (hi.u_err was:"<<hi.
u_err<<
")"<<endl;
1423 if(fabs(angle_fit_truth) > M_PI/2.0){
1439 ptotal->Fill(vertex_mom.Mag());
1442 double beta = 1.0/
sqrt(1.0+pow(rt->
GetMass(), 2.0)/vertex_mom.Mag2());
1444 for(
unsigned int j=0; j<
cdchits.size(); j++){
1450 double doca = rt->
DistToRT(wire, &s);
1453 double tof = s/(beta*3E10*1E-9);
1454 double dist = (hit->
tdrift-tof)*55E-4;
1457 double resi = dist - doca;
1458 if(!isfinite(resi))
continue;
1476 for(
unsigned int j=0; j<
fdchits.size(); j++){
1482 double doca = rt->
DistToRT(wire,&s);
1484 double tof = s/(beta*3E10*1E-9);
1485 double dist = (hit->
time-tof)*55E-4;
1488 double resi = dist - doca;
void setMomentum(const DVector3 &aMomentum)
string MATERIAL_MAP_MODEL
TH2F * chisq_vs_p_vs_theta
double dist
Effective wire shifts due to drift time.
TH1F * cdc_single_hit_prob
The DTrackFitter class is a base class for different charged track fitting algorithms. It does not actually fit the track itself, but provides the interface and some common support features most algorthims will need to implement.
double u_lorentz
Lorentz correction to u_dist ( u = u_dist + u_lorentz )
const swim_step_t * GetLastSwimStep(void) const
DReferenceTrajectory * tmprt
TH2F * initial_chisq_vs_Npasses
void PrintChisqElements(DMatrix &resiv, DMatrix &cov_meas, DMatrix &cov_muls, DMatrix &weights)
DVector3 GetLastDOCAPoint(void) const
double u_err
Errors on distance along the wire (for FDC cathodes)
void SetMass(double mass)
const DVector3 & position(void) const
const DRootGeom * RootGeom
void Swim(const DVector3 &pos, const DVector3 &mom, double q=-1000.0, const TMatrixFSym *cov=NULL, double smax=2000.0, const DCoordinateSystem *wire=NULL)
TH2F * nhits_final_vs_initial
const DFDCWire * wire
DFDCWire for this wire.
x-coordinate in RT coordinate system in cm
vector< bool > GetResiInfo(DMatrix &state, const swim_step_t *start_step, DReferenceTrajectory *rt, hitsInfo &hinfo, vector< resiInfo > &residuals)
void FilterGood(DMatrix &my_resiv, vector< bool > &my_good, vector< bool > &good_all)
TH2F * residuals_fdc_anode
class DFDCPseudo: definition for a reconstructed point in the FDC
double GetLastDistAlongWire(void) const
vector< const DFDCPseudo * > fdchits_used_in_fit
static const DMCTrackHit * GetMCTrackHit(const DCoordinateSystem *wire, double rdrift, vector< const DMCTrackHit * > &mctrackhits, int trackno_filter=-1)
DReferenceTrajectory * rt
void SetDGeometry(const DGeometry *geom)
swim_step_t * FindClosestSwimStep(const DCoordinateSystem *wire, int *istep_ptr=NULL) const
DCoordinateSystem * target
TH3F * residuals_fdc_cathode_vs_s
unsigned int LEAST_SQUARES_MIN_HITS
DTrackFitterALT1(JEventLoop *loop)
void ForceLRTruth(JEventLoop *loop, DReferenceTrajectory *rt, hitsInfo &hinfo)
const DMagneticFieldMap * bfield
double DistToRT(double x, double y, double z) const
const DCoordinateSystem * wire
Wire definitions.
vector< const DCDCTrackHit * > cdchits
float z
coordinates of hit in cm and rad
void SetCheckMaterialBoundaries(bool check_material_boundaries)
z-momentum in RT coordinate system in GeV/c
bool good
Set by GetResiInfo if dist is used.
void GetHits(fit_type_t fit_type, DReferenceTrajectory *rt, hitsInfo &hinfo)
TH3F * cdcdoca_vs_dist_vs_ring
bool CDC_USE_PARAMETERIZED_SIGMA
double s
< wire position computed from cathode data, assuming the avalanche occurs at the wire ...
double GetMass(void) const
vector< const DCDCTrackHit * > cdchits_used_in_fit
TH2F * chisq_final_vs_initial
void SetDRootGeom(const DRootGeom *RootGeom)
TH1F * fdc_double_hit_prob
double charge(void) const
fit_status_t FitTrack(void)
position-coordinate in RT coordinate system in cm perpendicular to x both and momentum direction ...
bool good_u
Set by GetResiInfo if u_dist is used.
TH1F * fdc_single_hit_prob
x-momentum in RT coordinate system in GeV/c
bool operator()(const T &a, const T &b) const
y-momentum in RT coordinate system in GeV/c
double err
Errors on drift time (or wire position) measurement.
double time
time corresponding to this pseudopoint.
void setPID(Particle_t locPID)
DMatrix cov_meas
Measurement errors of hits (diagonal Nmeasurements x Nmeasurements)
double ChiSq(fit_type_t fit_type, DReferenceTrajectory *rt, double *chisq_ptr=NULL, int *dof_ptr=NULL, vector< pull_t > *pulls_ptr=NULL)
TH1F * cdc_double_hit_prob
vector< const DFDCPseudo * > fdchits
DMatrix weights
Inverse of cov_meas + cov_muls.
TH2F * residuals_fdc_cathode
const DVector3 & momentum(void) const
DTrackingData input_params
TH3F * residuals_fdc_anode_vs_s
double LEAST_SQUARES_MAX_E2NORM
TH3F * residuals_cdc_vs_s
void SetPLossDirection(direction_t direction)
void setPosition(const DVector3 &aPosition)
vector< hitInfo > hitsInfo
static Particle_t IDTrack(float locCharge, float locMass)
fit_status_t LeastSquaresB(hitsInfo &hinfo, DReferenceTrajectory *rt)
double GetFDCCovariance(int layer1, int layer2)
void FillDebugHists(DReferenceTrajectory *rt, DVector3 &vertex_pos, DVector3 &vertex_mom)
double GetCDCCovariance(int layer1, int layer2)
DMatrix cov_muls
Covariance of hits due to multiple scattering (Nmeasurements x Nmeasurements)
double u_dist
Distances along the wire (for FDC cathodes)
DMatrix cov_parm
Covariance of fit parameters (Nparms x Nparms (where Nparms=5))
double GetFDCCathodeCovariance(int layer1, int layer2)
DMatrix resiv
residuals vector (Nmeasurements x 1)