12 #define M_TWO_PI 6.28318530717958647692
47 _DBG_<<
"Cannot get DApplication from JEventLoop! (are you using a JApplication based program?)"<<endl;
53 double rho_Z_over_A_LnI=0,radlen=0;
73 uint MAX_SC_SECTORS = 0;
82 for (
int i=0;i<30;i++)
84 vector<DVector3>
temp;
85 for (
unsigned int j = 0; j <
sc_pos[i].size() - 1; ++j)
90 temp.push_back(
DVector3(dx/dz,dy/dz,1.));
95 MAX_SC_SECTORS =
sc_pos.size();
115 gPARMS->SetDefaultParameter(
"TOF:CUT_PAR1",
TOF_CUT_PAR1);
118 gPARMS->SetDefaultParameter(
"TOF:CUT_PAR2",
TOF_CUT_PAR2);
121 gPARMS->SetDefaultParameter(
"TOF:CUT_PAR3",
TOF_CUT_PAR3);
124 gPARMS->SetDefaultParameter(
"TOF:CUT_PAR4",
TOF_CUT_PAR4);
127 gPARMS->SetDefaultParameter(
"BCAL:Z_CUT",
BCAL_Z_CUT);
138 double locSCCutPar = 8.0;
139 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR1",locSCCutPar);
143 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR2",locSCCutPar);
147 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR3",locSCCutPar);
151 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR4",locSCCutPar);
155 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR1_WB",locSCCutPar);
159 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR2_WB",locSCCutPar);
163 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR3_WB",locSCCutPar);
167 gPARMS->SetDefaultParameter(
"SC:SC_CUT_PAR4_WB",locSCCutPar);
175 vector<const DTrackFinder *> finders;
178 if(finders.size()<1){
179 _DBG_<<
"Unable to get a DTrackFinder object!"<<endl;
186 vector<const DTrackFitter *> fitters;
189 if(fitters.size()<1){
190 _DBG_<<
"Unable to get a DTrackFinder object!"<<endl;
198 jout <<
"Error loading CDC/gain_doca_correction !" << endl;
206 jout <<
"Error loading /TOF/propagation_speed !" << endl;
208 map<string, double> tofparms;
209 loop->GetCalib(
"TOF/tof_parms", tofparms);
221 vector< vector<double> > pt_vals;
222 vector<map<string,double> > attn_vals;
236 if(loop->GetCalib(
"/START_COUNTER/propagation_time_corr", pt_vals))
237 jout <<
"Error loading /START_COUNTER/propagation_time_corr !" << endl;
240 for(
unsigned int i = 0; i < pt_vals.size(); i++)
255 if(loop->GetCalib(
"START_COUNTER/attenuation_factor", attn_vals))
256 jout <<
"Error in loading START_COUNTER/attenuation_factor !" << endl;
259 for(
unsigned int i = 0; i < attn_vals.size(); i++)
262 map<string, double> &row = attn_vals[i];
275 vector< vector<double> > sc_paddle_resolution_params;
276 if(loop->GetCalib(
"START_COUNTER/TRvsPL", sc_paddle_resolution_params))
277 jout <<
"Error in loading START_COUNTER/TRvsPL !" << endl;
279 if(sc_paddle_resolution_params.size() != MAX_SC_SECTORS)
280 jerr <<
"Start counter paddle resolutions table has wrong number of entries:" << endl
281 <<
" loaded = " << sc_paddle_resolution_params.size()
282 <<
" expected = " << MAX_SC_SECTORS << endl;
284 for(
int i=0; i<(int)MAX_SC_SECTORS; i++) {
287 SC_BOUNDARY1.push_back( sc_paddle_resolution_params[i][2] );
290 SC_BOUNDARY2.push_back( sc_paddle_resolution_params[i][5] );
293 SC_BOUNDARY3.push_back( sc_paddle_resolution_params[i][8] );
300 vector<const DTOFPoint*> locTOFPoints;
301 loop->Get(locTOFPoints);
311 vector<vector<const DTrackTimeBased*> >&grouped_tracks)
const{
312 if (tracks.size()==0)
return RESOURCE_UNAVAILABLE;
314 JObject::oid_t old_id=tracks[0]->candidateid;
315 vector<const DTrackTimeBased *>hypotheses;
316 for (
unsigned int i=0;i<tracks.size();i++){
324 grouped_tracks.push_back(hypotheses);
329 hypotheses.push_back(track);
334 grouped_tracks.push_back(hypotheses);
353 dedx_t de_and_dx(0.,0.,0.,0.);
356 vector<const DCDCTrackHit*>cdchits;
357 track->GetT(cdchits);
361 if (cdc_extrapolations.size()>0){
362 for (
unsigned int i=0;i<cdchits.size();i++){
363 if (cdchits[i]->dE <= 0.0)
continue;
365 double doca2_old=1e6;
366 for (
unsigned int j=0;j<cdc_extrapolations.size();j++){
367 double z=cdc_extrapolations[j].position.z();
368 DVector3 wirepos=cdchits[i]->wire->origin
369 +((z-cdchits[i]->wire->origin.z())/cdchits[i]->wire->udir.z())
370 *cdchits[i]->wire->udir;
371 double doca2=(wirepos-cdc_extrapolations[j].position).Mag2();
372 if (doca2>doca2_old){
373 unsigned int index=j-1;
374 mom=cdc_extrapolations[
index].momentum;
375 pos=cdc_extrapolations[
index].position;
383 double dt=cdchits[i]->tdrift;
388 if (
CalcdEdxHit(mom,pos,cdchits[i],de_and_dx)==NOERROR){
389 dEdxHits_CDC.push_back(de_and_dx);
395 vector<const DFDCPseudo*>fdchits;
396 track->GetT(fdchits);
400 if (fdc_extrapolations.size()>0){
401 for (
unsigned int i=0;i<fdchits.size();i++){
402 if (fdchits[i]->dE <= 0.0)
continue;
404 for (
unsigned int j=0;j<fdc_extrapolations.size();j++){
405 double z=fdc_extrapolations[j].position.z();
406 if (fabs(z-fdchits[i]->wire->origin.z())<0.5){
407 mom=fdc_extrapolations[j].momentum;
408 double gas_thickness = 1.0;
409 dEdxHits_FDC.push_back(
dedx_t(fdchits[i]->dE,fdchits[i]->dE_amp,
410 gas_thickness/cos(mom.Theta()),
425 jerror_t
DParticleID::CalcDCdEdx(
const DTrackTimeBased *locTrackTimeBased,
double& locdEdx_FDC,
double& locdx_FDC,
double& locdEdx_CDC,
double& locdEdx_CDC_amp,
double& locdx_CDC,
double& locdx_CDC_amp,
unsigned int& locNumHitsUsedFordEdx_FDC,
unsigned int& locNumHitsUsedFordEdx_CDC)
const
427 vector<dedx_t> locdEdxHits_CDC, locdEdxHits_CDC_amp,locdEdxHits_FDC;
428 jerror_t locReturnStatus =
GetDCdEdxHits(locTrackTimeBased, locdEdxHits_CDC, locdEdxHits_FDC);
429 if(locReturnStatus != NOERROR)
431 locdEdx_FDC = numeric_limits<double>::quiet_NaN();
432 locdx_FDC = numeric_limits<double>::quiet_NaN();
433 locNumHitsUsedFordEdx_FDC = 0;
434 locdEdx_CDC = numeric_limits<double>::quiet_NaN();
435 locdEdx_CDC_amp = numeric_limits<double>::quiet_NaN();
436 locdx_CDC = numeric_limits<double>::quiet_NaN();
437 locdx_CDC_amp = numeric_limits<double>::quiet_NaN();
438 locNumHitsUsedFordEdx_CDC = 0;
439 return locReturnStatus;
441 return CalcDCdEdx(locTrackTimeBased, locdEdxHits_CDC,locdEdxHits_FDC,
442 locdEdx_FDC, locdx_FDC, locdEdx_CDC, locdEdx_CDC_amp,
443 locdx_CDC, locdx_CDC_amp,locNumHitsUsedFordEdx_FDC,
444 locNumHitsUsedFordEdx_CDC);
447 jerror_t
DParticleID::CalcDCdEdx(
const DTrackTimeBased *locTrackTimeBased,
const vector<dedx_t>& locdEdxHits_CDC,
const vector<dedx_t>& locdEdxHits_FDC,
double& locdEdx_FDC,
double& locdx_FDC,
double& locdEdx_CDC,
double &locdEdx_CDC_amp,
double& locdx_CDC,
double& locdx_CDC_amp,
unsigned int& locNumHitsUsedFordEdx_FDC,
unsigned int& locNumHitsUsedFordEdx_CDC)
const
452 locdEdx_CDC_amp = 0.0;
453 locNumHitsUsedFordEdx_CDC = locdEdxHits_CDC.size()*4/5;
454 if(locNumHitsUsedFordEdx_CDC > 0)
456 for(
unsigned int loc_i = 0; loc_i < locNumHitsUsedFordEdx_CDC; ++loc_i)
458 locdEdx_CDC += locdEdxHits_CDC[loc_i].dE;
459 locdx_CDC += locdEdxHits_CDC[loc_i].dx;
461 locdEdx_CDC /= locdx_CDC;
465 vector<dedx_t>locdEdxHitsTemp(locdEdxHits_CDC);
466 sort(locdEdxHitsTemp.begin(),locdEdxHitsTemp.end(),
468 for(
unsigned int loc_i = 0; loc_i < locNumHitsUsedFordEdx_CDC; ++loc_i)
470 locdEdx_CDC_amp+=locdEdxHitsTemp[loc_i].dE_amp;
471 locdx_CDC_amp += locdEdxHitsTemp[loc_i].dx;
473 locdEdx_CDC_amp/=locdx_CDC_amp;
478 locNumHitsUsedFordEdx_FDC = locdEdxHits_FDC.size()*4/5;
479 if(locNumHitsUsedFordEdx_FDC > 0)
481 for(
unsigned int loc_i = 0; loc_i < locNumHitsUsedFordEdx_FDC; ++loc_i)
483 locdEdx_FDC += locdEdxHits_FDC[loc_i].dE;
484 locdx_FDC += locdEdxHits_FDC[loc_i].dx;
486 locdEdx_FDC /= locdx_FDC;
499 if (hit==NULL || hit->
wire==NULL)
return RESOURCE_UNAVAILABLE;
503 if ((dx>0.) && (hit->
dist >0.)){
539 if (hit->
dist < dmin) {
554 dedx.
dE = dedx.
dE * reference/this_run;
563 return VALUE_OUT_OF_RANGE;
571 if (wire==NULL)
return -1.;
574 double phi=mom.Phi();
575 double lambda=M_PI_2-mom.Theta();
576 double cosphi=cos(phi);
577 double sinphi=
sin(phi);
578 double tanl=tan(lambda);
581 double dz=pos.z()-wire->
origin.z();
582 double dx=pos.x()-wire->
origin.x();
583 double dy=pos.y()-wire->
origin.y();
586 double rs2=0.776*0.776;
589 double ux=wire->
udir.x();
590 double uy=wire->
udir.y();
591 double uz=wire->
udir.z();
601 double a=A*cosphi*cosphi+B*cosphi*sinphi+C*cosphi*tanl+D*sinphi*tanl
602 +E*sinphi*sinphi+F*tanl*tanl;
603 double b=2.*A*dx*cosphi+B*dx*sinphi+B*dy*cosphi+C*dx*tanl+C*cosphi*dz
604 +D*dy*tanl+D*sinphi*dz+2.*E*dy*sinphi+2.*F*dz*tanl;
605 double c=A*dx*dx+B*dx*dy+C*dx*dz+D*dy*dz+E*dy*dy+F*dz*dz-rs2;
608 double temp=b*b-4.*a*
c;
610 double cosl=fabs(cos(lambda));
615 return sqrt(temp)/a/cosl;
623 double &most_probable_dE,
624 double &sigma_dE)
const{
625 double one_over_beta_sq=1.+M*M/(p*p);
626 double betagamma=p/M;
631 double X=log10(betagamma);
635 if (Cbar<=3.681) X0=0.2;
636 else X0=0.326*Cbar-1.;
640 if (Cbar<=5.215) X0=0.2;
641 else X0=0.326*Cbar-1.5;
646 delta=4.606*X-Cbar+(Cbar-4.606*
X0)*pow((X1-X)/(X1-
X0),3.);
650 most_probable_dE=Xi*(log(Xi)-2.*
dLnI_Scint-1./one_over_beta_sq
651 -log((one_over_beta_sq-1)/(2.*Me))+0.2-delta);
652 sigma_dE=4.*Xi/2.354;
658 double betagamma=p/mass;
659 double beta2=1./(1.+1./betagamma/betagamma);
660 if (beta2<1
e-6) beta2=1
e-6;
669 double mean_dedx=locKRhoZoverAGas/beta2;
672 return mean_dedx*(log(mean_dedx*dx)
673 -log((1.-beta2)/2./Me/beta2)-2.*locLnIGas-beta2+0.200);
680 double mean_path_length,
bool locIsCDCFlag)
const{
682 double betagamma=p/mass;
683 double betagamma2=betagamma*betagamma;
684 double beta2=1./(1.+1./betagamma2);
685 if (beta2<1
e-6) beta2=1
e-6;
688 double m_ratio=Me/mass;
689 double two_Me_betagamma_sq=2.*Me*betagamma2;
691 =two_Me_betagamma_sq/(1.+2.*
sqrt(1.+betagamma2)*m_ratio+m_ratio*m_ratio);
693 double T0=(Tmax>100.e-6)?100.
e-6:Tmax;
698 double mean_dedx=locKRhoZoverAGas/beta2
699 *(log(two_Me_betagamma_sq*T0)-2.*locLnIGas-beta2*(1.+T0/Tmax));
701 return 0.41*mean_dedx*pow(num_hits,-0.43)*pow(mean_path_length,-0.32);
713 double d2min=(fcal_pos - locProjPos).Mag();
714 double xproj=locProjPos.x();
715 double yproj=locProjPos.y();
716 vector<const DFCALCluster*>clusters;
717 locFCALShower->Get(clusters);
719 for (
unsigned int k=0;k<clusters.size();k++)
721 vector<DFCALCluster::DFCALClusterHit_t>hits=clusters[k]->GetHits();
722 for (
unsigned int m=0;m<hits.size();m++)
724 double dx=hits[m].x-xproj;
725 double dy=hits[m].y-yproj;
726 double d2=dx*dx+dy*dy;
746 double locPathLength = 9.9E9, locFlightTime = 9.9E9;
747 double locFlightTimeVariance=9.9E9;
753 double locDeltaT = locFCALShower->
getTime() - locFlightTime - locInputStartTime;
759 double d2min=(fcal_pos - locProjPos).Mag();
760 double xproj=locProjPos.x();
761 double yproj=locProjPos.y();
762 vector<const DFCALCluster*>clusters;
763 locFCALShower->Get(clusters);
765 for (
unsigned int k=0;k<clusters.size();k++)
767 vector<DFCALCluster::DFCALClusterHit_t>hits=clusters[k]->GetHits();
768 for (
unsigned int m=0;m<hits.size();m++)
770 double dx=hits[m].x-xproj;
771 double dy=hits[m].y-yproj;
772 double d2=dx*dx+dy*dy;
778 if(locOutputProjMom !=
nullptr)
780 *locOutputProjPos = locProjPos;
781 *locOutputProjMom = locProjMom;
784 double d =
sqrt(d2min);
785 double p=locProjMom.Mag();
788 if(locShowerMatchParams ==
nullptr)
789 locShowerMatchParams = std::make_shared<DFCALShowerMatchParams>();
790 locShowerMatchParams->dFCALShower = locFCALShower;
791 locShowerMatchParams->dx = 45.0*p/(locProjMom.Dot(norm));
792 locShowerMatchParams->dFlightTime = locFlightTime;
793 locShowerMatchParams->dFlightTimeVariance = locFlightTimeVariance;
794 locShowerMatchParams->dPathLength = locPathLength;
795 locShowerMatchParams->dDOCAToShower = d;
806 DVector3 bcal_pos(locBCALShower->
x, locBCALShower->
y, locBCALShower->
z);
808 double locFlightTime = 9.9E9, locPathLength = 9.9E9, locFlightTimeVariance = 9.9E9;
809 double locDistance = rt->
DistToRTwithTime(bcal_pos, &locPathLength, &locFlightTime,&locFlightTimeVariance,
SYS_BCAL);
810 if(!isfinite(locDistance))
814 double locDeltaT = locBCALShower->
t - locFlightTime - locInputStartTime;
820 if(locOutputProjMom !=
nullptr)
822 *locOutputProjPos = locProjPos;
823 *locOutputProjMom = locProjMom;
826 double locDeltaZ = bcal_pos.z() - locProjPos.z();
827 double locDeltaPhiMin = bcal_pos.Phi() - locProjPos.Phi();
828 while(locDeltaPhiMin > M_PI)
830 while(locDeltaPhiMin < -M_PI)
837 locDx = (locProjPos - proj_pos_surface).Mag();
843 vector<const DBCALCluster*>clusters;
844 locBCALShower->Get(clusters);
847 vector<const DBCALPoint*> points;
848 if(!clusters.empty())
852 for (
unsigned int k=0;k<clusters.size();k++)
854 vector<const DBCALPoint*> cluster_points=clusters[k]->points();
855 points.insert(points.end(), cluster_points.begin(), cluster_points.end());
862 locBCALShower->Get(points);
867 for (
unsigned int m=0;m<points.size();m++)
869 double rpoint=points[m]->r();
871 DVector3 locPointProjPos, locPointProjMom;
875 double mydphi=points[m]->phi()-locPointProjPos.Phi();
878 while(mydphi < -M_PI)
880 if(fabs(mydphi) >= fabs(locDeltaPhiMin))
883 locDeltaPhiMin=mydphi;
884 if(locOutputProjMom !=
nullptr)
886 *locOutputProjPos = locPointProjPos;
887 *locOutputProjMom = locPointProjMom;
892 if(locShowerMatchParams ==
nullptr)
893 locShowerMatchParams = std::make_shared<DBCALShowerMatchParams>();
894 locShowerMatchParams->dBCALShower = locBCALShower;
895 locShowerMatchParams->dx = locDx;
896 locShowerMatchParams->dFlightTime = locFlightTime;
897 locShowerMatchParams->dFlightTimeVariance = locFlightTimeVariance;
898 locShowerMatchParams->dPathLength = locPathLength;
899 locShowerMatchParams->dDeltaPhiToShower = locDeltaPhiMin;
900 locShowerMatchParams->dDeltaZToShower = locDeltaZ;
915 double locPathLength = 9.9E9, locFlightTime = 9.9E9;
916 double locFlightTimeVariance=9.9E9;
922 float locHitEnergy = locTOFPoint->
dE;
923 double locHitTime = locTOFPoint->
t;
924 double locHitTimeVariance = locTOFPoint->
tErr*locTOFPoint->
tErr;
933 double locPaddleMidPoint = 0.0;
934 if(!locIsDoubleEndedBar)
940 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.X() : locProjPos.X() - locPaddleMidPoint;
946 int id = 44 + locBar - 1;
958 double locPaddleMidPoint = 0.0;
959 if(!locIsDoubleEndedBar)
965 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.Y() : locProjPos.Y() - locPaddleMidPoint;
977 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
981 if(locOutputProjMom !=
nullptr)
983 *locOutputProjPos = locProjPos;
984 *locOutputProjMom = locProjMom;
991 if(locTOFHitMatchParams ==
nullptr)
992 locTOFHitMatchParams = std::make_shared<DTOFHitMatchParams>();
993 double dx = 2.54*locProjMom.Mag()/locProjMom.Dot(norm);
994 locTOFHitMatchParams->dTOFPoint = locTOFPoint;
996 locTOFHitMatchParams->dHitTime = locHitTime;
997 locTOFHitMatchParams->dHitTimeVariance = locHitTimeVariance;
998 locTOFHitMatchParams->dHitEnergy = locHitEnergy;
1000 locTOFHitMatchParams->dEdx = locHitEnergy/dx;
1001 locTOFHitMatchParams->dFlightTime = locFlightTime;
1002 locTOFHitMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1003 locTOFHitMatchParams->dPathLength = locPathLength;
1004 locTOFHitMatchParams->dDeltaXToHit = locDeltaX;
1005 locTOFHitMatchParams->dDeltaYToHit = locDeltaY;
1020 DVector3 locProjPos, locProjMom, locPaddleNorm;
1021 double locDeltaPhi, locPathLength, locFlightTime, locFlightTimeVariance;
1023 unsigned int locBestSCSector =
PredictSCSector(rt, locDeltaPhi, locProjPos, locProjMom, locPaddleNorm, locPathLength, locFlightTime, locFlightTimeVariance, locSCPlane);
1024 if(locBestSCSector == 0)
1032 if(fabs(locSCHit->
t - locFlightTime - locInputStartTime) >
OUT_OF_TIME_CUT)
1036 unsigned int sc_index = locSCHit->
sector - 1;
1037 double sc_pos_soss =
sc_pos[sc_index][0].z();
1038 double sc_pos_eoss =
sc_pos[sc_index][1].z();
1039 double sc_pos_eobs =
sc_pos[sc_index][
sc_pos[sc_index].size() - 2].z();
1042 double locCorrectedHitTime = locSCHit->
t;
1043 double locCorrectedHitEnergy = locSCHit->
dE;
1047 if (locProjPos.Z() <= sc_pos_eoss)
1050 L = locProjPos.Z() - sc_pos_soss;
1056 else if(locProjPos.Z() > sc_pos_eoss && locProjPos.Z() <= sc_pos_eobs)
1059 L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
1069 L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
1077 if(locOutputProjMom !=
nullptr)
1079 *locOutputProjPos = locProjPos;
1080 *locOutputProjMom = locProjMom;
1084 DVector3 sc_pos_at_projz =
sc_pos[sc_index][locSCPlane] + (locProjPos.Z() -
sc_pos[sc_index][locSCPlane].z())*
sc_dir[sc_index][locSCPlane];
1085 locDeltaPhi = sc_pos_at_projz.Phi() - locProjPos.Phi();
1086 while(locDeltaPhi > TMath::Pi())
1088 while(locDeltaPhi < -1.0*TMath::Pi())
1093 double ds = 0.3*locProjMom.Mag()/fabs(locProjMom.Dot(locPaddleNorm));
1098 double time_resolution = 0.;
1113 if(locSCHitMatchParams ==
nullptr)
1114 locSCHitMatchParams = std::make_shared<DSCHitMatchParams>();
1115 locSCHitMatchParams->dSCHit = locSCHit;
1116 locSCHitMatchParams->dHitEnergy = locCorrectedHitEnergy;
1117 locSCHitMatchParams->dEdx = locSCHitMatchParams->dHitEnergy/ds;
1118 locSCHitMatchParams->dHitTime = locCorrectedHitTime;
1119 locSCHitMatchParams->dHitTimeVariance = time_resolution*time_resolution;
1120 locSCHitMatchParams->dFlightTime = locFlightTime;
1121 locSCHitMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1122 locSCHitMatchParams->dPathLength = locPathLength;
1123 locSCHitMatchParams->dDeltaPhiToHit = locDeltaPhi;
1137 unsigned int sc_index = locSCSector - 1;
1143 double sc_pos_soss =
sc_pos[sc_index][0].z();
1144 double sc_pos_eoss =
sc_pos[sc_index][1].z();
1145 double sc_pos_eons =
sc_pos[sc_index][
sc_pos[sc_index].size() - 1].z();
1148 double locProjectionZTolerance = 5.0;
1149 if (locProjPos.Z() < sc_pos_soss + locProjectionZTolerance)
1151 if (locProjPos.Z() < sc_pos_soss)
1152 locProjPos.SetZ(sc_pos_soss);
1155 if (locProjPos.Z() <= sc_pos_eoss)
1164 for (
unsigned int loc_i = 1; loc_i <
sc_norm[sc_index].size(); ++loc_i)
1172 if (locProjPos.Z() > (sc_pos_eons + locProjectionZTolerance))
1175 else if(locProjPos.Z() >
sc_pos[sc_index][loc_i + 1].z())
1183 if(locProjPos.Z() < sc_pos_eoss)
1185 locProjPos.SetZ(sc_pos_eoss - 0.0001);
1189 if(locSCPlane == -1)
1193 locPaddleNorm =
sc_norm[sc_index][locSCPlane];
1196 DVector3 sc_pos_at_projz =
sc_pos[sc_index][locSCPlane] + (locProjPos.Z() -
sc_pos[sc_index][locSCPlane].z())*
sc_dir[sc_index][locSCPlane];
1197 locDeltaPhi = sc_pos_at_projz.Phi() - locProjPos.Phi();
1198 while(locDeltaPhi > TMath::Pi())
1200 while(locDeltaPhi < -1.0*TMath::Pi())
1210 if(extrapolations.size()==0)
1214 double locFlightTime=extrapolations[0].t;
1215 double locPathLength=extrapolations[0].s;
1216 double locFlightTimeVariance=0.;
1217 double locDeltaT = locFCALShower->
getTime() - locFlightTime - locInputStartTime;
1222 DVector3 locProjPos=extrapolations[0].position;
1223 DVector3 locProjMom=extrapolations[0].momentum;
1224 double dz=locFCALShower->
getPosition().z()-locProjPos.z();
1225 locProjPos+=dz*
DVector3(locProjMom.x()/locProjMom.z(),
1226 locProjMom.y()/locProjMom.z(),1.);
1228 double v=(extrapolations[1].s-extrapolations[0].s)/(extrapolations[1].t-extrapolations[0].t);
1229 double ds=dz/cos(locProjMom.Theta());
1234 if(locOutputProjMom !=
nullptr)
1236 *locOutputProjPos = locProjPos;
1237 *locOutputProjMom = locProjMom;
1241 double p=locProjMom.Mag();
1243 if(locShowerMatchParams ==
nullptr)
1244 locShowerMatchParams = std::make_shared<DFCALShowerMatchParams>();
1245 locShowerMatchParams->dFCALShower = locFCALShower;
1246 locShowerMatchParams->dx = 45.0*p/(locProjMom.Dot(
DVector3(0.,0.,1.)));
1247 locShowerMatchParams->dFlightTime = locFlightTime;
1248 locShowerMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1249 locShowerMatchParams->dPathLength = locPathLength;
1250 locShowerMatchParams->dDOCAToShower = d;
1256 if(extrapolations.size()==0)
1260 DVector3 locProjPos=extrapolations[0].position;
1261 DVector3 locProjMom=extrapolations[0].momentum;
1262 double locFlightTime=extrapolations[0].t;
1263 double locPathLength=extrapolations[0].s;
1264 double locFlightTimeVariance=0.;
1270 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
1277 double locHitTimeVariance = locTOFPoint->
tErr*locTOFPoint->
tErr;
1279 if(locOutputProjMom !=
nullptr)
1281 *locOutputProjPos = locProjPos;
1282 *locOutputProjMom = locProjMom;
1289 if(locTOFHitMatchParams ==
nullptr)
1290 locTOFHitMatchParams = std::make_shared<DTOFHitMatchParams>();
1292 double dx = 2.54*locProjMom.Mag()/locProjMom.Dot(
DVector3(0.0,0.,1.));
1293 locTOFHitMatchParams->dTOFPoint = locTOFPoint;
1295 locTOFHitMatchParams->dHitTime = locHitTime;
1296 locTOFHitMatchParams->dHitTimeVariance = locHitTimeVariance;
1297 locTOFHitMatchParams->dHitEnergy = locHitEnergy;
1299 locTOFHitMatchParams->dEdx = locHitEnergy/dx;
1300 locTOFHitMatchParams->dFlightTime = locFlightTime;
1301 locTOFHitMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1302 locTOFHitMatchParams->dPathLength = locPathLength;
1303 locTOFHitMatchParams->dDeltaXToHit = locDeltaX;
1304 locTOFHitMatchParams->dDeltaYToHit = locDeltaY;
1311 if(extrapolations.size()==0)
1315 DVector3 locProjPos=extrapolations[0].position;
1316 DVector3 locProjMom=extrapolations[0].momentum;
1317 double locFlightTime=extrapolations[0].t;
1318 double locPathLength=extrapolations[0].s;
1319 double locFlightTimeVariance=0.;
1326 if(fabs(locSCHit->
t - locFlightTime - locInputStartTime) >
OUT_OF_TIME_CUT)
1333 if(locOutputProjMom !=
nullptr)
1335 *locOutputProjPos = locProjPos;
1336 *locOutputProjMom = locProjMom;
1340 unsigned int sc_index=locSCHit->
sector-1;
1341 double z=locProjPos.z();
1342 unsigned int locSCPlane=0;
1343 if (z>
sc_pos[sc_index][0].z()){
1344 for (
unsigned int j=0;j<
sc_pos[sc_index].size();j++){
1345 if (z>
sc_pos[sc_index][j].z())
continue;
1352 DVector3 sc_pos_at_projz =
sc_pos[sc_index][locSCPlane] + (locProjPos.Z() -
sc_pos[sc_index][locSCPlane].z())*
sc_dir[sc_index][locSCPlane];
1353 double locDeltaPhi = sc_pos_at_projz.Phi() - locProjPos.Phi();
1354 while(locDeltaPhi > TMath::Pi())
1356 while(locDeltaPhi < -1.0*TMath::Pi())
1361 double ds = 0.3*locProjMom.Mag()/fabs(locProjMom.Dot(locPaddleNorm));
1364 double sc_pos_soss =
sc_pos[sc_index][0].z();
1365 double sc_pos_eoss =
sc_pos[sc_index][1].z();
1366 double sc_pos_eobs =
sc_pos[sc_index][
sc_pos[sc_index].size() - 2].z();
1370 if (locProjPos.Z() <= sc_pos_eoss)
1371 L = locProjPos.Z() - sc_pos_soss;
1372 else if(locProjPos.Z() > sc_pos_eoss && locProjPos.Z() <= sc_pos_eobs)
1373 L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
1375 L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
1380 double time_resolution = 0.;
1395 if(locSCHitMatchParams ==
nullptr)
1396 locSCHitMatchParams = std::make_shared<DSCHitMatchParams>();
1397 locSCHitMatchParams->dSCHit = locSCHit;
1398 locSCHitMatchParams->dHitEnergy = locCorrectedHitEnergy;
1399 locSCHitMatchParams->dEdx = locSCHitMatchParams->dHitEnergy/ds;
1400 locSCHitMatchParams->dHitTime = locCorrectedHitTime;
1401 locSCHitMatchParams->dHitTimeVariance = time_resolution*time_resolution;
1402 locSCHitMatchParams->dFlightTime = locFlightTime;
1403 locSCHitMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1404 locSCHitMatchParams->dPathLength = locPathLength;
1405 locSCHitMatchParams->dDeltaPhiToHit = locDeltaPhi;
1414 if(extrapolations.size()<2)
1419 double locDeltaT = locBCALShower->
t - extrapolations[0].t - locInputStartTime;
1424 DVector3 bcal_pos(locBCALShower->
x, locBCALShower->
y, locBCALShower->
z);
1428 double locFlightTime = extrapolations[0].t;
1429 double locPathLength = extrapolations[0].s, locFlightTimeVariance = 9.9E9;
1430 DVector3 locProjPos=extrapolations[0].position;
1431 DVector3 locProjMom=extrapolations[0].momentum;
1434 double doca_old=1e6;
1435 for (
unsigned int i=1;i<extrapolations.size();i++){
1436 double doca=(extrapolations[i].position-bcal_pos).Mag();
1438 unsigned int index=i-1;
1439 locProjPos=extrapolations[
index].position;
1440 locProjMom=extrapolations[
index].momentum;
1441 locPathLength=extrapolations[
index].s;
1442 locFlightTime=extrapolations[
index].t;
1449 if(locOutputProjMom !=
nullptr)
1451 *locOutputProjPos = locProjPos;
1452 *locOutputProjMom = locProjMom;
1456 double locDeltaZ = bcal_pos.z() - locProjPos.z();
1458 double locDeltaPhiMin=bcal_pos.Phi()-locProjPos.Phi();
1459 while(locDeltaPhiMin > M_PI)
1461 while(locDeltaPhiMin < -M_PI)
1465 double locDx = (locProjPos - extrapolations[0].position).Mag();
1471 vector<const DBCALCluster*>clusters;
1472 locBCALShower->Get(clusters);
1475 vector<const DBCALPoint*> points;
1476 if(!clusters.empty())
1480 for (
unsigned int k=0;k<clusters.size();k++)
1482 vector<const DBCALPoint*> cluster_points=clusters[k]->points();
1483 points.insert(points.end(), cluster_points.begin(), cluster_points.end());
1490 locBCALShower->Get(points);
1495 for (
unsigned int m=0;m<points.size();m++){
1496 DVector3 locPointProjPos=extrapolations[0].position;
1497 double R=points[m]->r();
1501 double mydphi=points[m]->phi()-locPointProjPos.Phi();
1502 while(mydphi > M_PI)
1504 while(mydphi < -M_PI)
1506 if(fabs(mydphi) >= fabs(locDeltaPhiMin))
1509 locDeltaPhiMin=mydphi;
1513 if(locShowerMatchParams ==
nullptr)
1514 locShowerMatchParams = std::make_shared<DBCALShowerMatchParams>();
1515 locShowerMatchParams->dBCALShower = locBCALShower;
1516 locShowerMatchParams->dx = locDx;
1517 locShowerMatchParams->dFlightTime = locFlightTime;
1518 locShowerMatchParams->dFlightTimeVariance = locFlightTimeVariance;
1519 locShowerMatchParams->dPathLength = locPathLength;
1520 locShowerMatchParams->dDeltaPhiToShower = locDeltaPhiMin;
1523 locShowerMatchParams->dDeltaZToShower = locDeltaZ;
1536 if(!
Distance_ToTrack(rt, locBCALShower, locInputStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1539 if(locOutputProjMom !=
nullptr)
1541 *locOutputProjPos = locProjPos;
1542 *locOutputProjMom = locProjMom;
1546 if(fabs(locShowerMatchParams->dDeltaZToShower) >
BCAL_Z_CUT)
1550 double locP = locProjMom.Mag();
1551 double locDeltaPhi = 180.0*locShowerMatchParams->dDeltaPhiToShower/TMath::Pi();
1553 if(fabs(locDeltaPhi) > locPhiCut)
1569 if(!
Distance_ToTrack(rt, locTOFPoint, locInputStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
1572 if(locOutputProjMom !=
nullptr)
1574 *locOutputProjPos = locProjPos;
1575 *locOutputProjMom = locProjMom;
1581 double locTheta=locProjMom.Theta()*180./M_PI;
1583 double locMatchCut_1D = locMatchCut_2D;
1585 double locDeltaX = locTOFHitMatchParams->dDeltaXToHit;
1586 double locDeltaY = locTOFHitMatchParams->dDeltaYToHit;
1590 if(fabs(locDeltaY) > locMatchCut_1D)
1596 if(fabs(locDeltaX) > locMatchCut_1D)
1602 double locDistance =
sqrt(locDeltaX*locDeltaX + locDeltaY*locDeltaY);
1603 if(locDistance > locMatchCut_2D)
1619 if(!
Distance_ToTrack(rt, locSCHit, locInputStartTime, locSCHitMatchParams, &locProjPos, &locProjMom))
1622 if(locOutputProjMom !=
nullptr)
1624 *locOutputProjPos = locProjPos;
1625 *locOutputProjMom = locProjMom;
1630 double sc_dphi_cut = locSCCutPars[0] + locSCCutPars[1]*exp(locSCCutPars[2]*(locProjPos.Z() - locSCCutPars[3]));
1631 double locDeltaPhi = 180.0*locSCHitMatchParams->dDeltaPhiToHit/TMath::Pi();
1632 return (fabs(locDeltaPhi) <= sc_dphi_cut);
1641 if(!
Distance_ToTrack(rt, locFCALShower, locInputStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1644 if(locOutputProjMom !=
nullptr)
1646 *locOutputProjPos = locProjPos;
1647 *locOutputProjMom = locProjMom;
1650 double p=locProjMom.Mag();
1652 return (locShowerMatchParams->dDOCAToShower < cut);
1661 if(!
Distance_ToTrack(extrapolations, locBCALShower, locInputStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1664 if(locOutputProjMom !=
nullptr)
1666 *locOutputProjPos = locProjPos;
1667 *locOutputProjMom = locProjMom;
1671 if(fabs(locShowerMatchParams->dDeltaZToShower) >
BCAL_Z_CUT)
1675 double locP = locProjMom.Mag();
1676 double locDeltaPhi = 180.0*locShowerMatchParams->dDeltaPhiToShower/TMath::Pi();
1679 if(fabs(locDeltaPhi) > locPhiCut)
1690 if(!
Distance_ToTrack(extrapolations, locFCALShower, locInputStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1693 if(locOutputProjMom !=
nullptr)
1695 *locOutputProjPos = locProjPos;
1696 *locOutputProjMom = locProjMom;
1699 double p=locProjMom.Mag();
1700 double theta=locProjMom.Theta()*180./M_PI;
1702 return (locShowerMatchParams->dDOCAToShower < cut);
1708 if(!
Distance_ToTrack(extrapolations, locTOFPoint, locInputStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
1711 if(locOutputProjMom !=
nullptr)
1713 *locOutputProjPos = locProjPos;
1714 *locOutputProjMom = locProjMom;
1720 double locMatchCut_1D = locMatchCut_2D;
1722 double locDeltaX = locTOFHitMatchParams->dDeltaXToHit;
1723 double locDeltaY = locTOFHitMatchParams->dDeltaYToHit;
1727 if(fabs(locDeltaY) > locMatchCut_1D)
1733 if(fabs(locDeltaX) > locMatchCut_1D)
1739 double locDistance =
sqrt(locDeltaX*locDeltaX + locDeltaY*locDeltaY);
1740 if(locDistance > locMatchCut_2D)
1747 bool DParticleID::Cut_MatchDistance(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const DSCHit* locSCHit,
double locInputStartTime,shared_ptr<DSCHitMatchParams>& locSCHitMatchParams,
bool locIsTimeBased,
DVector3 *locOutputProjPos,
DVector3 *locOutputProjMom)
const
1750 if(!
Distance_ToTrack(extrapolations, locSCHit, locInputStartTime, locSCHitMatchParams, &locProjPos, &locProjMom))
1753 if(locOutputProjMom !=
nullptr)
1755 *locOutputProjPos = locProjPos;
1756 *locOutputProjMom = locProjMom;
1761 double sc_dphi_cut = locSCCutPars[0] + locSCCutPars[1]*exp(locSCCutPars[2]*(locProjPos.Z() - locSCCutPars[3]));
1762 double locDeltaPhi = 180.0*locSCHitMatchParams->dDeltaPhiToHit/TMath::Pi();
1763 return (fabs(locDeltaPhi) <= sc_dphi_cut);
1767 bool DParticleID::Cut_MatchDIRC(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const vector<const DDIRCPmtHit*> locDIRCHits,
double locInputStartTime,
Particle_t locPID, shared_ptr<DDIRCMatchParams>& locDIRCMatchParams,
const vector<const DDIRCTruthBarHit*> locDIRCBarHits, map<shared_ptr<const DDIRCMatchParams>, vector<const DDIRCPmtHit*> >& locDIRCTrackMatchParams,
DVector3 *locOutputProjPos,
DVector3 *locOutputProjMom)
const
1769 if (extrapolations.size()==0)
1772 DVector3 locProjPos = extrapolations[0].position;
1773 DVector3 locProjMom = extrapolations[0].momentum;
1774 double locFlightTime = locInputStartTime + extrapolations[0].t;
1776 if(locOutputProjMom !=
nullptr) {
1777 *locOutputProjPos = locProjPos;
1778 *locOutputProjMom = locProjMom;
1782 return dDIRCLut->
CalcLUT(locProjPos, locProjMom, locDIRCHits, locFlightTime, locPID, locDIRCMatchParams, locDIRCBarHits, locDIRCTrackMatchParams);
1792 vector<shared_ptr<const DBCALShowerMatchParams> > locShowerMatchParams;
1802 double locMinChiSq = 9.9E9;
1803 double locP = locMomentum.Mag();
1804 shared_ptr<const DBCALShowerMatchParams> locBestMatchParams;
1805 for(
size_t loc_i = 0; loc_i < locShowerMatchParams.size(); ++loc_i)
1808 double locDeltaPhiError = locDeltaPhiCut/3.0;
1809 double locDeltaPhi = 180.0*locShowerMatchParams[loc_i]->dDeltaPhiToShower/TMath::Pi();
1810 double locMatchChiSq = locDeltaPhi*locDeltaPhi/(locDeltaPhiError*locDeltaPhiError);
1813 locMatchChiSq += locShowerMatchParams[loc_i]->dDeltaZToShower*locShowerMatchParams[loc_i]->dDeltaZToShower/(locDeltaZError*locDeltaZError);
1815 if(locMatchChiSq >= locMinChiSq)
1818 locMinChiSq = locMatchChiSq;
1819 locBestMatchParams = locShowerMatchParams[loc_i];
1822 return locBestMatchParams;
1828 vector<shared_ptr<const DSCHitMatchParams> > locSCHitMatchParams;
1838 double locMinDeltaPhi = 9.9E9;
1839 shared_ptr<const DSCHitMatchParams> locBestMatchParams;
1840 for(
size_t loc_i = 0; loc_i < locSCHitMatchParams.size(); ++loc_i)
1842 if(fabs(locSCHitMatchParams[loc_i]->dDeltaPhiToHit) >= locMinDeltaPhi)
1844 locMinDeltaPhi = fabs(locSCHitMatchParams[loc_i]->dDeltaPhiToHit);
1845 locBestMatchParams = locSCHitMatchParams[loc_i];
1847 return locBestMatchParams;
1853 vector<shared_ptr<const DTOFHitMatchParams> > locTOFHitMatchParams;
1863 double locMinDistance = 9.9E9;
1864 shared_ptr<const DTOFHitMatchParams> locBestMatchParams;
1865 for(
size_t loc_i = 0; loc_i < locTOFHitMatchParams.size(); ++loc_i)
1867 double locDeltaR =
sqrt(locTOFHitMatchParams[loc_i]->dDeltaXToHit*locTOFHitMatchParams[loc_i]->dDeltaXToHit + locTOFHitMatchParams[loc_i]->dDeltaYToHit*locTOFHitMatchParams[loc_i]->dDeltaYToHit);
1868 if(locDeltaR >= locMinDistance)
1870 locMinDistance = locDeltaR;
1871 locBestMatchParams = locTOFHitMatchParams[loc_i];
1873 return locBestMatchParams;
1879 vector<shared_ptr<const DFCALShowerMatchParams> > locShowerMatchParams;
1889 double locMinDistance = 9.9E9;
1890 shared_ptr<const DFCALShowerMatchParams> locBestMatchParams;
1891 for(
size_t loc_i = 0; loc_i < locShowerMatchParams.size(); ++loc_i)
1893 if(locShowerMatchParams[loc_i]->dDOCAToShower >= locMinDistance)
1895 locMinDistance = locShowerMatchParams[loc_i]->dDOCAToShower;
1896 locBestMatchParams = locShowerMatchParams[loc_i];
1898 return locBestMatchParams;
1904 shared_ptr<const DDIRCMatchParams> locDIRCMatchParams;
1908 locBestMatchParams = locDIRCMatchParams;
1921 vector<shared_ptr<const DBCALShowerMatchParams> > locShowerMatchParamsVector;
1922 vector<pair<shared_ptr<DBCALShowerMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
1923 for(
size_t loc_i = 0; loc_i < locBCALShowers.size(); ++loc_i)
1925 shared_ptr<DBCALShowerMatchParams> locShowerMatchParams;
1929 if(!
Cut_MatchDistance(rt, locBCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1934 if(!
Distance_ToTrack(rt, locBCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
1937 locShowerMatchParamsVector.push_back(locShowerMatchParams);
1938 auto locMatchProjectionPair = make_pair(locShowerMatchParams, make_pair(locProjPos, locProjMom));
1939 locMatchProjectionPairs.push_back(locMatchProjectionPair);
1941 if(locShowerMatchParamsVector.empty())
1946 if(locStartTimeVariance !=
nullptr)
1948 locStartTime = locBestMatchParams->dBCALShower->t - locBestMatchParams->dFlightTime;
1950 *locStartTimeVariance = 0.3*0.3+locBestMatchParams->dFlightTimeVariance;
1953 if(locBestProjMom !=
nullptr)
1955 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
1957 auto locParams = locMatchProjectionPair.first;
1958 if(locParams != locBestMatchParams)
1960 *locBestProjPos = locMatchProjectionPair.second.first;
1961 *locBestProjMom = locMatchProjectionPair.second.second;
1975 vector<shared_ptr<const DTOFHitMatchParams> > locTOFHitMatchParamsVector;
1976 vector<pair<shared_ptr<DTOFHitMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
1977 for(
size_t loc_i = 0; loc_i < locTOFPoints.size(); ++loc_i)
1979 shared_ptr<DTOFHitMatchParams> locTOFHitMatchParams;
1983 if(!
Cut_MatchDistance(rt, locTOFPoints[loc_i], locStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
1988 if(!
Distance_ToTrack(rt, locTOFPoints[loc_i], locStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
1991 locTOFHitMatchParamsVector.push_back(locTOFHitMatchParams);
1992 auto locMatchProjectionPair = make_pair(locTOFHitMatchParams, make_pair(locProjPos, locProjMom));
1993 locMatchProjectionPairs.push_back(locMatchProjectionPair);
1995 if(locTOFHitMatchParamsVector.empty())
2000 if(locStartTimeVariance !=
nullptr)
2002 locStartTime = locBestMatchParams->dHitTime - locBestMatchParams->dFlightTime;
2004 *locStartTimeVariance = 0.1*0.1+locBestMatchParams->dFlightTimeVariance;
2007 if(locBestProjMom !=
nullptr)
2009 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2011 auto locParams = locMatchProjectionPair.first;
2012 if(locParams != locBestMatchParams)
2014 *locBestProjPos = locMatchProjectionPair.second.first;
2015 *locBestProjMom = locMatchProjectionPair.second.second;
2029 vector<shared_ptr<const DFCALShowerMatchParams> > locShowerMatchParamsVector;
2030 vector<pair<shared_ptr<DFCALShowerMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2031 for(
size_t loc_i = 0; loc_i < locFCALShowers.size(); ++loc_i)
2033 shared_ptr<DFCALShowerMatchParams> locShowerMatchParams;
2037 if(!
Cut_MatchDistance(rt, locFCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2042 if(!
Distance_ToTrack(rt, locFCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2045 locShowerMatchParamsVector.push_back(locShowerMatchParams);
2046 auto locMatchProjectionPair = make_pair(locShowerMatchParams, make_pair(locProjPos, locProjMom));
2047 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2049 if(locShowerMatchParamsVector.empty())
2054 if(locStartTimeVariance !=
nullptr)
2056 locStartTime = locBestMatchParams->dFCALShower->getTime() - locBestMatchParams->dFlightTime;
2058 *locStartTimeVariance = 0.5*0.5+locBestMatchParams->dFlightTimeVariance;
2061 if(locBestProjMom !=
nullptr)
2063 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2065 auto locParams = locMatchProjectionPair.first;
2066 if(locParams != locBestMatchParams)
2068 *locBestProjPos = locMatchProjectionPair.second.first;
2069 *locBestProjMom = locMatchProjectionPair.second.second;
2086 vector<shared_ptr<const DSCHitMatchParams> > locSCHitMatchParamsVector;
2087 vector<pair<shared_ptr<DSCHitMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2088 for(
size_t loc_i = 0; loc_i < locSCHits.size(); ++loc_i)
2090 shared_ptr<DSCHitMatchParams> locSCHitMatchParams;
2094 if(!
Cut_MatchDistance(rt, locSCHits[loc_i], locStartTime, locSCHitMatchParams, locIsTimeBased, &locProjPos, &locProjMom))
2099 if(!
Distance_ToTrack(rt, locSCHits[loc_i], locStartTime, locSCHitMatchParams, &locProjPos, &locProjMom))
2102 locSCHitMatchParamsVector.push_back(std::const_pointer_cast<const DSCHitMatchParams>(locSCHitMatchParams));
2103 auto locMatchProjectionPair = make_pair(locSCHitMatchParams, make_pair(locProjPos, locProjMom));
2104 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2106 if(locSCHitMatchParamsVector.empty())
2111 if(locStartTimeVariance !=
nullptr)
2113 locStartTime = locBestMatchParams->dHitTime - locBestMatchParams->dFlightTime;
2114 *locStartTimeVariance = locBestMatchParams->dFlightTimeVariance + locBestMatchParams->dHitTimeVariance;
2118 if(locBestProjMom !=
nullptr)
2120 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2122 auto locParams = locMatchProjectionPair.first;
2123 if(locParams != locBestMatchParams)
2125 *locBestProjPos = locMatchProjectionPair.second.first;
2126 *locBestProjMom = locMatchProjectionPair.second.second;
2136 if(locReferenceTrajectory ==
nullptr)
2142 double locPathLength = 9.9E9, locFlightTime = 9.9E9;
2147 locBestDistance = 999.0;
2148 locBestDeltaY = 999.0;
2149 for(
auto& locTOFPaddleHit : locTOFPaddleHits)
2151 if(locTOFPaddleHit->orientation != 1)
2154 bool locNorthIsGoodHitFlag = (locTOFPaddleHit->E_north >
TOF_E_THRESHOLD);
2155 bool locSouthIsGoodHitFlag = (locTOFPaddleHit->E_south >
TOF_E_THRESHOLD);
2156 if(!locNorthIsGoodHitFlag && !locSouthIsGoodHitFlag)
2163 double locHitTime = locSpacetimeHit->
t;
2166 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2169 double locPaddleMidPoint = 0.0;
2174 double locDistanceToMidPoint = locNorthIsGoodHitFlag ? locPaddleMidPoint - proj_pos.X() : proj_pos.X() - locPaddleMidPoint;
2175 int id = 44 + locTOFPaddleHit->bar - 1;
2180 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
2186 double locDeltaX = locTOFPaddleHit->pos - proj_pos.X();
2187 double locDistance =
sqrt(locDeltaY*locDeltaY + locDeltaX*locDeltaX);
2188 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2191 if(fabs(locDeltaY) > fabs(locBestDistance))
2193 if(fabs(locDeltaY) > fabs(locBestDeltaY))
2195 locBestDistance = fabs(locDeltaY);
2199 if(locDistance > locBestDistance)
2201 locBestDistance = locDistance;
2204 locBestDeltaY = locDeltaY;
2205 locClosestPaddleHit = locTOFPaddleHit;
2208 return locClosestPaddleHit;
2213 if(locReferenceTrajectory ==
nullptr)
2220 double locPathLength = 9.9E9, locFlightTime = 9.9E9;
2225 locBestDistance = 999.0;
2226 locBestDeltaX = 999.0;
2227 for(
auto& locTOFPaddleHit : locTOFPaddleHits)
2229 if(locTOFPaddleHit->orientation != 0)
2232 bool locNorthIsGoodHitFlag = (locTOFPaddleHit->E_north >
TOF_E_THRESHOLD);
2233 bool locSouthIsGoodHitFlag = (locTOFPaddleHit->E_south >
TOF_E_THRESHOLD);
2234 if(!locNorthIsGoodHitFlag && !locSouthIsGoodHitFlag)
2241 double locHitTime = locSpacetimeHit->
t;
2244 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2247 double locPaddleMidPoint = 0.0;
2252 double locDistanceToMidPoint = locNorthIsGoodHitFlag ? locPaddleMidPoint - proj_pos.Y() : proj_pos.Y() - locPaddleMidPoint;
2253 int id = locTOFPaddleHit->bar - 1;
2258 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
2264 double locDeltaY = locTOFPaddleHit->pos - proj_pos.Y();
2265 double locDistance =
sqrt(locDeltaY*locDeltaY + locDeltaX*locDeltaX);
2266 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2269 if(fabs(locDeltaX) > fabs(locBestDistance))
2271 if(fabs(locDeltaX) > fabs(locBestDeltaX))
2273 locBestDistance = fabs(locDeltaX);
2277 if(locDistance > locBestDistance)
2279 locBestDistance = locDistance;
2282 locBestDeltaX = locDeltaX;
2283 locClosestPaddleHit = locTOFPaddleHit;
2286 return locClosestPaddleHit;
2290 bool DParticleID::Get_ClosestToTrack(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const vector<const DBCALShower*>& locBCALShowers,
bool locCutFlag,
double& locStartTime,shared_ptr<const DBCALShowerMatchParams>& locBestMatchParams,
double* locStartTimeVariance,
DVector3* locBestProjPos,
DVector3* locBestProjMom)
const
2292 if(extrapolations.size()==0)
2296 vector<shared_ptr<const DBCALShowerMatchParams>> locShowerMatchParamsVector;
2297 vector<pair<shared_ptr<DBCALShowerMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2298 for(
size_t loc_i = 0; loc_i < locBCALShowers.size(); ++loc_i)
2300 shared_ptr<DBCALShowerMatchParams> locShowerMatchParams;
2304 if(!
Cut_MatchDistance(extrapolations, locBCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2309 if(!
Distance_ToTrack(extrapolations, locBCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2312 locShowerMatchParamsVector.push_back(locShowerMatchParams);
2313 auto locMatchProjectionPair = make_pair(locShowerMatchParams, make_pair(locProjPos, locProjMom));
2314 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2316 if(locShowerMatchParamsVector.empty())
2320 locShowerMatchParamsVector);
2322 if(locStartTimeVariance !=
nullptr)
2324 locStartTime = locBestMatchParams->dBCALShower->t - locBestMatchParams->dFlightTime;
2326 *locStartTimeVariance = 0.3*0.3+locBestMatchParams->dFlightTimeVariance;
2329 if(locBestProjMom !=
nullptr)
2331 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2333 auto locParams = locMatchProjectionPair.first;
2334 if(locParams != locBestMatchParams)
2336 *locBestProjPos = locMatchProjectionPair.second.first;
2337 *locBestProjMom = locMatchProjectionPair.second.second;
2345 bool DParticleID::Get_ClosestToTrack(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const vector<const DTOFPoint*>& locTOFPoints,
bool locCutFlag,
double& locStartTime, shared_ptr<const DTOFHitMatchParams>& locBestMatchParams,
double* locStartTimeVariance,
DVector3* locBestProjPos,
DVector3* locBestProjMom)
const
2347 if(extrapolations.size()==0)
2351 vector<shared_ptr<const DTOFHitMatchParams> > locTOFHitMatchParamsVector;
2352 vector<pair<shared_ptr<DTOFHitMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2353 for(
size_t loc_i = 0; loc_i < locTOFPoints.size(); ++loc_i)
2355 shared_ptr<DTOFHitMatchParams> locTOFHitMatchParams;
2359 if(!
Cut_MatchDistance(extrapolations, locTOFPoints[loc_i], locStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
2364 if(!
Distance_ToTrack(extrapolations, locTOFPoints[loc_i], locStartTime, locTOFHitMatchParams, &locProjPos, &locProjMom))
2367 locTOFHitMatchParamsVector.push_back(locTOFHitMatchParams);
2368 auto locMatchProjectionPair = make_pair(locTOFHitMatchParams, make_pair(locProjPos, locProjMom));
2369 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2371 if(locTOFHitMatchParamsVector.empty())
2376 if(locStartTimeVariance !=
nullptr)
2378 locStartTime = locBestMatchParams->dHitTime - locBestMatchParams->dFlightTime;
2380 *locStartTimeVariance = 0.1*0.1+locBestMatchParams->dFlightTimeVariance;
2383 if(locBestProjMom !=
nullptr)
2385 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2387 auto locParams = locMatchProjectionPair.first;
2388 if(locParams != locBestMatchParams)
2390 *locBestProjPos = locMatchProjectionPair.second.first;
2391 *locBestProjMom = locMatchProjectionPair.second.second;
2399 bool DParticleID::Get_ClosestToTrack(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const vector<const DFCALShower*>& locFCALShowers,
bool locCutFlag,
double& locStartTime,shared_ptr<const DFCALShowerMatchParams>& locBestMatchParams,
double* locStartTimeVariance,
DVector3* locBestProjPos,
DVector3* locBestProjMom)
const
2401 if(extrapolations.size()==0)
2405 vector<shared_ptr<const DFCALShowerMatchParams> > locShowerMatchParamsVector;
2406 vector<pair<shared_ptr<DFCALShowerMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2407 for(
size_t loc_i = 0; loc_i < locFCALShowers.size(); ++loc_i)
2409 shared_ptr<DFCALShowerMatchParams> locShowerMatchParams;
2413 if(!
Cut_MatchDistance(extrapolations, locFCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2418 if(!
Distance_ToTrack(extrapolations, locFCALShowers[loc_i], locStartTime, locShowerMatchParams, &locProjPos, &locProjMom))
2421 locShowerMatchParamsVector.push_back(locShowerMatchParams);
2422 auto locMatchProjectionPair = make_pair(locShowerMatchParams, make_pair(locProjPos, locProjMom));
2423 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2425 if(locShowerMatchParamsVector.empty())
2430 if(locStartTimeVariance !=
nullptr)
2432 locStartTime = locBestMatchParams->dFCALShower->getTime() - locBestMatchParams->dFlightTime;
2434 *locStartTimeVariance = 0.5*0.5+locBestMatchParams->dFlightTimeVariance;
2437 if(locBestProjMom !=
nullptr)
2439 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2441 auto locParams = locMatchProjectionPair.first;
2442 if(locParams != locBestMatchParams)
2444 *locBestProjPos = locMatchProjectionPair.second.first;
2445 *locBestProjMom = locMatchProjectionPair.second.second;
2453 bool DParticleID::Get_ClosestToTrack(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
const vector<const DSCHit*>& locSCHits,
bool locIsTimeBased,
bool locCutFlag,
double& locStartTime,shared_ptr<const DSCHitMatchParams>& locBestMatchParams,
double* locStartTimeVariance,
DVector3* locBestProjPos,
DVector3* locBestProjMom)
const
2455 if(extrapolations.size()==0)
2459 vector<shared_ptr<const DSCHitMatchParams> > locSCHitMatchParamsVector;
2460 vector<pair<shared_ptr<DSCHitMatchParams>, pair<DVector3, DVector3> > > locMatchProjectionPairs;
2461 for(
size_t loc_i = 0; loc_i < locSCHits.size(); ++loc_i)
2463 shared_ptr<DSCHitMatchParams> locSCHitMatchParams;
2467 if(!
Cut_MatchDistance(extrapolations, locSCHits[loc_i], locStartTime, locSCHitMatchParams, locIsTimeBased, &locProjPos, &locProjMom))
2472 if(!
Distance_ToTrack(extrapolations, locSCHits[loc_i], locStartTime, locSCHitMatchParams, &locProjPos, &locProjMom))
2475 locSCHitMatchParamsVector.push_back(locSCHitMatchParams);
2476 auto locMatchProjectionPair = make_pair(locSCHitMatchParams, make_pair(locProjPos, locProjMom));
2477 locMatchProjectionPairs.push_back(locMatchProjectionPair);
2479 if(locSCHitMatchParamsVector.empty())
2484 if(locStartTimeVariance !=
nullptr)
2486 locStartTime = locBestMatchParams->dHitTime - locBestMatchParams->dFlightTime;
2487 *locStartTimeVariance = locBestMatchParams->dFlightTimeVariance + locBestMatchParams->dHitTimeVariance;
2491 if(locBestProjMom !=
nullptr)
2493 for(
auto& locMatchProjectionPair : locMatchProjectionPairs)
2495 auto locParams = locMatchProjectionPair.first;
2496 if(locParams != locBestMatchParams)
2498 *locBestProjPos = locMatchProjectionPair.second.first;
2499 *locBestProjMom = locMatchProjectionPair.second.second;
2509 if(extrapolations.size()==0)
2513 DVector3 proj_pos=extrapolations[0].position;
2514 DVector3 proj_mom=extrapolations[0].momentum;
2516 double px=proj_mom.Px();
2517 double py=proj_mom.Py();
2518 double pz=proj_mom.Pz();
2523 double locFlightTime=extrapolations[0].t;
2526 locBestDistance = 999.0;
2527 locBestDeltaY = 999.0;
2528 for(
auto& locTOFPaddleHit : locTOFPaddleHits){
2529 if(locTOFPaddleHit->orientation != 1)
2532 bool locNorthIsGoodHitFlag = (locTOFPaddleHit->E_north >
TOF_E_THRESHOLD);
2533 bool locSouthIsGoodHitFlag = (locTOFPaddleHit->E_south >
TOF_E_THRESHOLD);
2534 if(!locNorthIsGoodHitFlag && !locSouthIsGoodHitFlag)
2541 double locHitTime = locSpacetimeHit->
t;
2544 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2547 double locPaddleMidPoint = 0.0;
2552 double locDistanceToMidPoint = locNorthIsGoodHitFlag ? locPaddleMidPoint - proj_pos.X() : proj_pos.X() - locPaddleMidPoint;
2553 int id = 44 + locTOFPaddleHit->bar - 1;
2558 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
2564 double locDeltaX = locTOFPaddleHit->pos - proj_pos.X();
2565 double locDistance =
sqrt(locDeltaY*locDeltaY + locDeltaX*locDeltaX);
2566 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2569 if(fabs(locDeltaY) > fabs(locBestDistance))
2571 if(fabs(locDeltaY) > fabs(locBestDeltaY))
2573 locBestDistance = fabs(locDeltaY);
2577 if(locDistance > locBestDistance)
2579 locBestDistance = locDistance;
2582 locBestDeltaY = locDeltaY;
2583 locClosestPaddleHit = locTOFPaddleHit;
2586 return locClosestPaddleHit;
2591 if(extrapolations.size()==0)
2595 DVector3 proj_pos=extrapolations[0].position;
2596 DVector3 proj_mom=extrapolations[0].momentum;
2598 double px=proj_mom.Px();
2599 double py=proj_mom.Py();
2600 double pz=proj_mom.Pz();
2605 double locFlightTime=extrapolations[0].t;
2609 locBestDistance = 999.0;
2610 locBestDeltaX = 999.0;
2611 for(
auto& locTOFPaddleHit : locTOFPaddleHits)
2613 if(locTOFPaddleHit->orientation != 0)
2616 bool locNorthIsGoodHitFlag = (locTOFPaddleHit->E_north >
TOF_E_THRESHOLD);
2617 bool locSouthIsGoodHitFlag = (locTOFPaddleHit->E_south >
TOF_E_THRESHOLD);
2618 if(!locNorthIsGoodHitFlag && !locSouthIsGoodHitFlag)
2625 double locHitTime = locSpacetimeHit->
t;
2628 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2631 double locPaddleMidPoint = 0.0;
2636 double locDistanceToMidPoint = locNorthIsGoodHitFlag ? locPaddleMidPoint - proj_pos.Y() : proj_pos.Y() - locPaddleMidPoint;
2637 int id = locTOFPaddleHit->bar - 1;
2642 double locDeltaT = locHitTime - locFlightTime - locInputStartTime;
2648 double locDeltaY = locTOFPaddleHit->pos - proj_pos.Y();
2649 double locDistance =
sqrt(locDeltaY*locDeltaY + locDeltaX*locDeltaX);
2650 if(locNorthIsGoodHitFlag != locSouthIsGoodHitFlag)
2653 if(fabs(locDeltaX) > fabs(locBestDistance))
2655 if(fabs(locDeltaX) > fabs(locBestDeltaX))
2657 locBestDistance = fabs(locDeltaX);
2661 if(locDistance > locBestDistance)
2663 locBestDistance = locDistance;
2666 locBestDeltaX = locDeltaX;
2667 locClosestPaddleHit = locTOFPaddleHit;
2670 return locClosestPaddleHit;
2691 if (intersection) *intersection=proj_pos;
2693 double x=proj_pos.x();
2694 double y=proj_pos.y();
2715 double phi=180./M_PI*proj_pos.Phi();
2716 if (phi<0) phi+=360.;
2717 double slice=phi/7.5;
2718 double mid_slice=round(slice);
2719 module=int(mid_slice)+1;
2722 sector=int(floor((phi-7.5*mid_slice+3.75)/1.875))+1;
2724 if (intersection) *intersection=proj_pos;
2746 double x=proj_pos.x();
2747 double y=proj_pos.y();
2752 if (intersection) *intersection=proj_pos;
2767 DVector3 locProjPos, locProjMom, locPaddleNorm;
2768 double locDeltaPhi, locPathLength, locFlightTime, locFlightTimeVariance;
2770 unsigned int locBestSCSector =
PredictSCSector(rt, locDeltaPhi, locProjPos, locProjMom, locPaddleNorm, locPathLength, locFlightTime, locFlightTimeVariance, locSCPlane);
2771 if(locBestSCSector == 0)
2774 if(locProjBarrelRegion != NULL)
2775 *locProjBarrelRegion = (locProjPos.Z() <
sc_pos[locBestSCSector - 1][1].Z());
2777 if(locMinDPhi != NULL)
2778 *locMinDPhi = locDeltaPhi;
2780 if(locOutputProjPos != NULL)
2781 *locOutputProjPos = locProjPos;
2782 return locBestSCSector;
2795 int index=0,istep=0;
2796 double d_old=1000.,d=1000.,dphi=0.;
2797 for (
unsigned int m=0;m<12;m++){
2800 if (!isfinite(locProjPos.Phi())){
2803 dphi=locProjPos.Phi()-
sc_pos[0][0].Phi();
2804 if (dphi<0) dphi+=2.*M_PI;
2805 index=int(floor(dphi/(2.*M_PI/30.)));
2806 if (index>29) index=0;
2816 double z=locProjPos.z();
2817 if (z>
sc_pos[index][m+1].z()&&m<11){
2825 double ds=-d*locProjMom.Mag()/
sc_norm[
index][m].Dot(locProjMom);
2829 double x=locProjPos.x(),
y=locProjPos.y();
2830 double px=locProjMom.x(),
py=locProjMom.y(),pz=locProjMom.z();
2831 double p=locProjMom.Mag();
2834 double k_q=0.003*rt->
q;
2835 double ds_over_p=ds/p;
2836 double factor=k_q*(0.25*ds_over_p);
2837 double Bx=B.x(),By=B.y(),Bz=B.z();
2838 double Ax=factor*Bx,Ay=factor*By,Az=factor*Bz;
2839 double Ax2=Ax*Ax,Ay2=Ay*Ay,Az2=Az*Az;
2840 double AxAy=Ax*Ay,AxAz=Ax*Az,AyAz=Ay*Az;
2841 double one_plus_Ax2=1.+Ax2;
2842 double scale=ds_over_p/(one_plus_Ax2+Ay2+Az2);
2845 double dx=scale*(px*one_plus_Ax2+
py*(AxAy+Az)+pz*(AxAz-Ay));
2846 double dy=scale*(px*(AxAy-Az)+
py*(1.+Ay2)+pz*(AyAz+Ax));
2847 double dz=scale*(px*(AxAz+Ay)+
py*(AyAz-Ax)+pz*(1.+Az2));
2849 locProjPos.SetXYZ(x+dx,
y+dy,z+dz);
2850 locProjMom.SetXYZ(px+k_q*(Bz*dy-By*dz),
py+k_q*(Bx*dz-Bz*dx),
2851 pz+k_q*(By*dx-Bx*dy));
2853 if (dphi<0) dphi+=2.*M_PI;
2858 double one_over_betasq=1.+mass*mass/locProjMom.Mag2();
2876 unsigned int DParticleID::PredictSCSector(
const vector<DTrackFitter::Extrapolation_t> &extrapolations,
double& locDeltaPhi,
DVector3& locProjPos,
DVector3& locProjMom,
DVector3& locPaddleNorm,
double& locPathLength,
double& locFlightTime,
double& locFlightTimeVariance,
int& locSCPlane)
const{
2877 if(extrapolations.size()==0)
2880 double z=extrapolations[0].position.z();
2886 locProjPos=extrapolations[0].position;
2887 locProjMom=extrapolations[0].momentum;
2888 locFlightTime=extrapolations[0].t;
2889 locPathLength=extrapolations[0].s;
2890 locFlightTimeVariance=0.;
2892 double dphi_min=1e6;
2893 unsigned int best_index=0;
2895 for (
unsigned int i=1;i<
sc_pos[
index].size();i++){
2898 unsigned int prev_i=i-1;
2901 double myDeltaPhi=sc_pos_at_projz.Phi()-locProjPos.Phi();
2902 if (myDeltaPhi<M_PI) myDeltaPhi+=2.*M_PI;
2903 if (myDeltaPhi>M_PI) myDeltaPhi-=2.*M_PI;
2904 if (fabs(myDeltaPhi)<dphi_min){
2905 locDeltaPhi=myDeltaPhi;
2906 dphi_min=fabs(locDeltaPhi);
2915 locPaddleNorm=
sc_norm[best_index][locSCPlane];
2916 return best_index+1;
2922 if(extrapolations.size()==0)
2925 DVector3 locProjPos, locProjMom, locPaddleNorm;
2926 double locDeltaPhi, locPathLength, locFlightTime, locFlightTimeVariance;
2928 unsigned int locBestSCSector =
PredictSCSector(extrapolations, locDeltaPhi, locProjPos, locProjMom, locPaddleNorm, locPathLength, locFlightTime, locFlightTimeVariance, locSCPlane);
2929 if(locBestSCSector == 0)
2932 if(locProjBarrelRegion != NULL)
2933 *locProjBarrelRegion = (locProjPos.Z() <
sc_pos[locBestSCSector - 1][1].Z());
2935 if(locMinDPhi != NULL)
2936 *locMinDPhi = locDeltaPhi;
2938 if(locOutputProjPos != NULL)
2939 *locOutputProjPos = locProjPos;
2940 return locBestSCSector;
2948 if(extrapolations.size()==0)
2954 DVector3 proj_mom=extrapolations[0].momentum;
2955 DVector3 proj_pos=extrapolations[0].position;
2957 if (intersection) *intersection=proj_pos;
2959 double x=proj_pos.x();
2960 double y=proj_pos.y();
2972 if(extrapolations.size()==0)
2976 DVector3 proj_pos=extrapolations[0].position;
2978 double phi=180./M_PI*proj_pos.Phi();
2979 if (phi<0) phi+=360.;
2980 double slice=phi/7.5;
2981 double mid_slice=round(slice);
2982 module=int(mid_slice)+1;
2983 sector=int(floor((phi-7.5*mid_slice+3.75)/1.875))+1;
2985 if (intersection) *intersection=proj_pos;
2998 if(extrapolations.size()==0)
3004 DVector3 proj_mom=extrapolations[0].momentum;
3005 DVector3 proj_pos=extrapolations[0].position;
3007 double x=proj_pos.x();
3008 double y=proj_pos.y();
3013 if (intersection) *intersection=proj_pos;
3021 const vector<const DFCALShower*>& FCALShowers,
3022 double& StartTime)
const{
3023 if (FCALShowers.size()==0)
return false;
3024 if (extrapolations.size()==0)
return false;
3025 double StartTimeGuess=StartTime;
3026 DVector3 trackpos=extrapolations[0].position;
3028 unsigned int best_fcal_match=0;
3029 for (
unsigned int i=0;i<FCALShowers.size();i++){
3037 StartTime=FCALShowers[best_fcal_match]->getTime()-extrapolations[0].t;
3040 double p=extrapolations[0].momentum.Mag();
3042 if (d_min<cut)
return true;
3048 const vector<const DSCHit*>& SCHits,
3049 double& StartTime)
const{
3050 if (SCHits.size()==0)
return false;
3051 if (extrapolations.size()==0)
return false;
3053 double StartTimeGuess=StartTime;
3054 DVector3 trackpos=extrapolations[0].position;
3055 double z=trackpos.z();
3056 double dphi_min=1000.;
3057 unsigned int best_sc_match=0;
3058 for (
unsigned int i=0;i<SCHits.size();i++){
3059 unsigned int sc_index=SCHits[i]->sector - 1;
3060 for (
unsigned int j=0;j<
sc_pos[sc_index].size();j++){
3061 if (z>
sc_pos[sc_index][j].z())
continue;
3062 double dphi=trackpos.Phi()-
sc_pos[sc_index][j].Phi();
3063 if (dphi<-M_PI) dphi+=2.*M_PI;
3064 if (dphi>M_PI) dphi-=2*M_PI;
3066 if (fabs(dphi)<dphi_min){
3073 StartTime=sc_corrected_time-extrapolations[0].t;
3077 if (fabs(180.*dphi_min/M_PI) <= sc_dphi_cut)
return true;
3083 const vector<const DTOFPoint*>& TOFPoints,
3084 double& StartTime)
const{
3085 if (TOFPoints.size()==0)
return false;
3086 if (extrapolations.size()==0)
return false;
3088 double StartTimeGuess=StartTime;
3089 DVector3 trackpos=extrapolations[0].position;
3092 double locMatchCut_1D = locMatchCut_2D;
3095 double d2_min=1.0e6,dy_at_min=0.,dx_at_min=0.;
3096 unsigned int best_tof_match=0;
3097 for (
unsigned int i=0;i<TOFPoints.size();i++){
3098 const DTOFPoint *locTOFPoint = TOFPoints[i];
3100 double d2=diff.Perp2();
3111 -extrapolations[0].t;
3115 if (TOFPoints[best_tof_match]->Is_XPositionWellDefined()==
false){
3116 if (dy_at_min<locMatchCut_1D){
3120 else if (TOFPoints[best_tof_match]->Is_YPositionWellDefined()==
false){
3121 if (dx_at_min<locMatchCut_1D){
3126 if (
sqrt(d2_min)<locMatchCut_2D){
3135 const vector<const DBCALShower*>& locBCALShowers,
3136 double& StartTime)
const{
3137 if (locBCALShowers.size()==0)
return false;
3138 if (extrapolations.size()==0)
return false;
3140 double StartTimeGuess=StartTime;
3141 double dphi_min=1e6;
3142 double locP=0.,dz=0.;
3143 for (
unsigned int i=0;i<locBCALShowers.size();i++){
3144 DVector3 bcalpos(locBCALShowers[i]->
x,locBCALShowers[i]->
y,
3145 locBCALShowers[i]->z);
3146 double R=bcalpos.Perp();
3150 double dphi=pos.Phi()-bcalpos.Phi();
3151 if (dphi<-M_PI) dphi+=2.*M_PI;
3152 if (dphi>M_PI) dphi-=2.*M_PI;
3153 if (fabs(dphi)<dphi_min){
3155 dz=pos.z()-bcalpos.z();
3157 StartTime=locBCALShowers[i]->t-t;
3169 double locDeltaPhi = 180.0*dphi_min/M_PI;
3171 if (fabs(locDeltaPhi)<locPhiCut){
3184 shared_ptr<const DBCALShowerMatchParams> locBCALShowerMatchParams;
3186 return numeric_limits<double>::quiet_NaN();
3187 double locFlightTimePCorrelation = 0.0;
3188 return locFlightTimePCorrelation;
3193 shared_ptr<const DFCALShowerMatchParams> locFCALShowerMatchParams;
3195 return numeric_limits<double>::quiet_NaN();
3196 double locFlightTimePCorrelation = 0.0;
3197 return locFlightTimePCorrelation;
3202 shared_ptr<const DTOFHitMatchParams> locTOFHitMatchParams;
3204 return numeric_limits<double>::quiet_NaN();
3205 double locFlightTimePCorrelation = 0.0;
3206 return locFlightTimePCorrelation;
3211 shared_ptr<const DSCHitMatchParams> locSCHitMatchParams;
3213 return numeric_limits<double>::quiet_NaN();
3214 double locFlightTimePCorrelation = 0.0;
3215 return locFlightTimePCorrelation;
3226 double locT0=locChargedHypo->
t0();
3228 double locP=locTrack->
momentum().Mag();
3231 double locChiSq_sum=0.;
3236 if (locTofParms!=NULL){
3237 double dt_tof=locTofParms->dHitTime-locTofParms->dFlightTime-locT0;
3239 locChiSq_sum+=(dt_tof*dt_tof)/vart_tof;
3244 if (locBcalParms!=NULL){
3245 double dt_bcal=locBcalParms->dBCALShower->t-locBcalParms->dFlightTime-locT0;
3247 locChiSq_sum+=(dt_bcal*dt_bcal)/vart_bcal;
3252 if (locFcalParms!=NULL){
3253 double dt_fcal=locFcalParms->dFCALShower->getTime()-locFcalParms->dFlightTime-locT0;
3255 locChiSq_sum+=(dt_fcal*dt_fcal)/vart_fcal;
3259 locPull=
sqrt(locChiSq_sum);
3260 return locChiSq_sum;
3269 locTimingPull = 0.0;
3273 double locDeltaT = locNeutralHypo->
t0() - locNeutralHypo->
time();
3274 double locStartTimeError = locNeutralHypo->
t0_err();
3275 double locTimeDifferenceVariance = 0.0;
3285 locTimeDifferenceVariance = (*locNeutralHypo->
errorMatrix())(6, 6) + locStartTimeError*locStartTimeError;
3287 locTimingPull = locDeltaT/
sqrt(locTimeDifferenceVariance);
3289 return locTimingPull*locTimingPull;
3295 unsigned int locNDF_Total=locChargedTrackHypothesis->
Get_NDF_DCdEdx();
3303 if (locChargedTrackHypothesis->
PID()==
Proton
3307 double beta=p/track->
energy();
3310 double chisq=diff*diff/(sigma*
sigma);
3311 locChiSq_Total+=chisq;
3320 if (bcalparms!=NULL){
3322 double diff=bcalparms->dBCALShower->E/p-E_over_p_mean;
3324 double chisq=diff*diff/(sigma*
sigma);
3325 locChiSq_Total+=chisq;
3328 if (fcalparms!=NULL){
3330 double diff=fcalparms->dFCALShower->getEnergy()/p-E_over_p_mean;
3332 double chisq=diff*diff/(sigma*
sigma);
3333 locChiSq_Total+=chisq;
3338 unsigned int locTimingNDF = 0;
3339 double locTimingPull = 0.0;
3340 double locTimingChiSq =
Calc_TimingChiSq(locChargedTrackHypothesis, locTimingNDF, locTimingPull);
3343 locNDF_Total += locTimingNDF;
3344 locChiSq_Total += locTimingChiSq;
3346 double locFOM = (locNDF_Total > 0) ? TMath::Prob(locChiSq_Total, locNDF_Total) : numeric_limits<double>::quiet_NaN();
3347 locChargedTrackHypothesis->
Set_ChiSq_Overall(locChiSq_Total, locNDF_Total, locFOM);
3352 unsigned int locBitPattern = 0;
3353 for(
size_t loc_i = 0; loc_i < locCDCTrackHits.size(); ++loc_i)
3356 unsigned int locBitShift = locCDCTrackHits[loc_i]->wire->ring - 1;
3357 unsigned int locBit = (1 << locBitShift);
3358 locBitPattern |= locBit;
3360 return locBitPattern;
3365 unsigned int locBitPattern = 0;
3366 for(
size_t loc_i = 0; loc_i < locFDCPseudos.size(); ++loc_i)
3369 unsigned int locBitShift = locFDCPseudos[loc_i]->wire->layer - 1;
3370 unsigned int locBit = (1 << locBitShift);
3371 locBitPattern |= locBit;
3373 return locBitPattern;
3378 locCDCRings.clear();
3379 for(
unsigned int locRing = 1; locRing <= 28; ++locRing)
3381 unsigned int locBitShift = locRing - 1;
3382 unsigned int locBit = (1 << locBitShift);
3383 if((locBitPattern & locBit) != 0)
3384 locCDCRings.insert(locRing);
3390 locFDCPlanes.clear();
3391 for(
unsigned int locPlane = 1; locPlane <= 24; ++locPlane)
3393 unsigned int locBitShift = locPlane - 1;
3394 unsigned int locBit = (1 << locBitShift);
3395 if((locBitPattern & locBit) != 0)
3396 locFDCPlanes.insert(locPlane);
3402 set<int> locCDCRings;
3409 locNumHitRingsPerSuperlayer.clear();
3410 for(
int locCDCSuperlayer = 1; locCDCSuperlayer <= 7; ++locCDCSuperlayer)
3411 locNumHitRingsPerSuperlayer[locCDCSuperlayer] = 0;
3413 set<int>::const_iterator locIterator = locCDCRings.begin();
3414 for(; locIterator != locCDCRings.end(); ++locIterator)
3416 int locCDCSuperlayer = ((*locIterator) - 1)/4 + 1;
3417 ++locNumHitRingsPerSuperlayer[locCDCSuperlayer];
3423 set<int> locFDCPlanes;
3430 locNumHitPlanesPerPackage.clear();
3431 for(
int locFDCPackage = 1; locFDCPackage <= 4; ++locFDCPackage)
3432 locNumHitPlanesPerPackage[locFDCPackage] = 0;
3434 set<int>::const_iterator locIterator = locFDCPlanes.begin();
3435 for(; locIterator != locFDCPlanes.end(); ++locIterator)
3437 int locFDCPackage = ((*locIterator) - 1)/6 + 1;
3439 ++locNumHitPlanesPerPackage[locFDCPackage];
3447 const DVector3 &locProjPos)
const {
3450 double locHitTime = locTOFPoint->
t;
3459 double locPaddleMidPoint = 0.0;
3460 if(!locIsDoubleEndedBar)
3466 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.X() : locProjPos.X() - locPaddleMidPoint;
3469 int id = 44 + locBar - 1;
3481 double locPaddleMidPoint = 0.0;
3482 if(!locIsDoubleEndedBar)
3488 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.Y() : locProjPos.Y() - locPaddleMidPoint;
3491 int id = locBar - 1;
3500 double locHitEnergy = locTOFPoint->
dE;
3512 double locPaddleMidPoint = 0.0;
3513 if(!locIsDoubleEndedBar)
3519 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.X() : locProjPos.X() - locPaddleMidPoint;
3532 double locPaddleMidPoint = 0.0;
3533 if(!locIsDoubleEndedBar)
3539 double locDistanceToMidPoint = locNorthIsGoodHit ? locPaddleMidPoint - locProjPos.Y() : locProjPos.Y() - locPaddleMidPoint;
3545 return locHitEnergy;
3551 const DVector3 &locProjPos)
const {
3553 unsigned int sc_index = locSCHit->
sector - 1;
3554 double sc_pos_soss =
sc_pos[sc_index][0].z();
3555 double sc_pos_eoss =
sc_pos[sc_index][1].z();
3556 double sc_pos_eobs =
sc_pos[sc_index][
sc_pos[sc_index].size() - 2].z();
3559 double locCorrectedHitEnergy = locSCHit->
dE;
3562 if (locProjPos.Z() <= sc_pos_eoss)
3565 double L = locProjPos.Z() - sc_pos_soss;
3570 else if(locProjPos.Z() > sc_pos_eoss && locProjPos.Z() <= sc_pos_eobs)
3573 double L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
3584 double L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
3592 return locCorrectedHitEnergy;
3598 const DVector3 &locProjPos)
const {
3600 unsigned int sc_index = locSCHit->
sector - 1;
3601 double sc_pos_soss =
sc_pos[sc_index][0].z();
3602 double sc_pos_eoss =
sc_pos[sc_index][1].z();
3603 double sc_pos_eobs =
sc_pos[sc_index][
sc_pos[sc_index].size() - 2].z();
3606 double locCorrectedHitTime = locSCHit->
t;
3609 if (locProjPos.Z() <= sc_pos_eoss)
3612 double L = locProjPos.Z() - sc_pos_soss;
3616 else if(locProjPos.Z() > sc_pos_eoss && locProjPos.Z() <= sc_pos_eobs)
3619 double L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
3626 double L = (locProjPos.Z() - sc_pos_eoss)*
sc_angle_cor + (sc_pos_eoss - sc_pos_soss);
3630 return locCorrectedHitTime;
virtual jerror_t CalcDCdEdxChiSq(DChargedTrackHypothesis *locChargedTrackHypothesis) const =0
DetectorSystem_t t1_detector(void) const
static bool DParticleID_dedx_amp_cmp(DParticleID::dedx_t a, DParticleID::dedx_t b)
unsigned int PredictSCSector(const DReferenceTrajectory *rt, DVector3 *locOutputProjPos=nullptr, bool *locProjBarrelRegion=nullptr, double *locMinDPhi=nullptr) const
vector< double > sc_pt_slope[3]
struct VolMat FindMat(double *x)
void Set_ChiSq_Overall(double locChiSq, unsigned int locNDF, double locFOM)
unsigned int Get_FDCPlaneBitPattern(vector< const DFDCPseudo * > &locFDCPseudos) const
void Get_FDCPlanes(unsigned int locBitPattern, set< int > &locFDCPlanes) const
bool ExtrapolateToRadius(double R, const vector< Extrapolation_t > &extraps, DVector3 &pos, DVector3 &mom, double &t, double &s) const
float Get_CenterVertPlane() const
void Get_CDCRings(unsigned int locBitPattern, set< int > &locCDCRings) const
vector< double > sc_attn_A[2]
const DTOFPaddleHit * Get_ClosestTOFPaddleHit_Horizontal(const DReferenceTrajectory *locReferenceTrajectory, const vector< const DTOFPaddleHit * > &locTOFPaddleHits, double locInputStartTime, double &locBestDeltaY, double &locBestDistance) const
bool Get_TOFMatchParams(const DTrackingData *locTrack, vector< shared_ptr< const DTOFHitMatchParams > > &locMatchParams) const
vector< double > SC_BOUNDARY2
vector< double > SC_SECTION2_P0
bool Get_SCMatchParams(const DTrackingData *locTrack, vector< shared_ptr< const DSCHitMatchParams > > &locMatchParams) const
double energy(void) const
vector< double > dSCCutPars_TimeBased
virtual double GetProtondEdxSigma_SC(double locBeta) const =0
vector< double > SC_BOUNDARY1
bool Get_FCALMatchParams(const DTrackingData *locTrack, vector< shared_ptr< const DFCALShowerMatchParams > > &locMatchParams) const
DVector3 GetLastDOCAPoint(void) const
static bool DParticleID_hypothesis_cmp(const DTrackTimeBased *a, const DTrackTimeBased *b)
double t0_err(void) const
vector< double > CDC_GAIN_DOCA_PARS
bool ProjectTo_SC(const DReferenceTrajectory *rt, unsigned int locSCSector, double &locDeltaPhi, DVector3 &locProjPos, DVector3 &locProjMom, DVector3 &locPaddleNorm, double &locPathLength, double &locFlightTime, double &locFlightTimeVariance, int &locSCPlane) const
const DTrackTimeBased * Get_TrackTimeBased(void) const
bool Cut_MatchDIRC(const vector< DTrackFitter::Extrapolation_t > &extrapolations, const vector< const DDIRCPmtHit * > locDIRCHits, double locInputStartTime, Particle_t locPID, shared_ptr< DDIRCMatchParams > &locDIRCMatchParams, const vector< const DDIRCTruthBarHit * > locDIRCBarHits, map< shared_ptr< const DDIRCMatchParams >, vector< const DDIRCPmtHit * > > &locDIRCTrackMatchParams, DVector3 *locOutputProjPos=nullptr, DVector3 *locOutputProjMom=nullptr) const
bool Is_XPositionWellDefined(void) const
double Calc_SCFlightTimePCorrelation(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches) const
bool Get_DIRCMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DDIRCMatchParams > &locBestMatchParams) const
double CalcdXHit(const DVector3 &mom, const DVector3 &pos, const DCoordinateSystem *wire) const
vector< double > SC_SECTION4_P0
double Calc_PropagatedRFTime(const DKinematicData *locKinematicData, const DEventRFBunch *locEventRFBunch) const
bool GetFCALZ(double &z_fcal) const
z-location of front face of CCAL in cm
static char index(char c)
oid_t candidateid
id of DTrackCandidate corresponding to this track
float Get_ShortBarLength() const
vector< double > SC_SECTION3_P0
const DNeutralShower * Get_NeutralShower(void) const
shared_ptr< const DTOFHitMatchParams > Get_TOFHitMatchParams(void) const
bool Get_StartTime(const vector< DTrackFitter::Extrapolation_t > &extrapolations, const vector< const DFCALShower * > &FCALShowers, double &StartTime) const
double CDC_TIME_CUT_FOR_DEDX
bool PredictFCALHit(const DReferenceTrajectory *rt, unsigned int &row, unsigned int &col, DVector3 *intersection=nullptr) const
int Get_FirstShortBar() const
tof_spacetimehit_t * Build_TOFSpacetimeHit_Horizontal(const DTOFPaddleHit *locTOFHit)
unsigned int Get_NDF_DCdEdx(void) const
void Get_FDCNumHitPlanesPerPackage(int locBitPattern, map< int, int > &locNumHitPlanesPerPackage) const
double Get_CorrectedHitEnergy(const DTOFPoint *locTOFPoint, const DVector3 &locProjPos) const
bool Get_BestTOFMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DTOFHitMatchParams > &locBestMatchParams) const
void Calc_ChargedPIDFOM(DChargedTrackHypothesis *locChargedTrackHypothesis) const
DTOFPoint_factory * dTOFPointFactory
bool Get_BestSCMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DSCHitMatchParams > &locBestMatchParams) const
bool PredictTOFPaddles(const DReferenceTrajectory *rt, unsigned int &hbar, unsigned int &vbar, DVector3 *intersection=nullptr) const
double Calc_TOFFlightTimePCorrelation(const DTrackingData *locTrack, DDetectorMatches *locDetectorMatches) const
void Get_CDCNumHitRingsPerSuperlayer(int locBitPattern, map< int, int > &locNumHitRingsPerSuperlayer) const
DRootGeom * GetRootGeom(unsigned int run_number)
int Get_LastShortBar() const
unsigned int Get_CDCRingBitPattern(vector< const DCDCTrackHit * > &locCDCTrackHits) const
double Calc_FCALFlightTimePCorrelation(const DTrackingData *locTrack, DDetectorMatches *locDetectorMatches) const
vector< double > SC_SECTION2_P1
double Calc_BCALFlightTimePCorrelation(const DTrackingData *locTrack, DDetectorMatches *locDetectorMatches) const
const DDIRCLut * dDIRCLut
vector< double > SC_SECTION1_P0
vector< double > sc_attn_C[2]
vector< double > sc_pt_yint[3]
bool Get_BestFCALMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DFCALShowerMatchParams > &locBestMatchParams) const
double DistToRTwithTime(DVector3 hit, double *s=NULL, double *t=NULL, double *var_t=NULL, DetectorSystem_t detector=SYS_NULL) const
bool Get_BestBCALMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DBCALShowerMatchParams > &locBestMatchParams) const
double GetMostProbabledEdx_DC(double p, double mass, double dx, bool locIsCDCFlag) const
float bar2y(int bar, int end=0) const
convert bar number to the position of the center of the bar in local coordinations ...
DGeometry * GetDGeometry(unsigned int run_number)
float Get_CenterMidPlane() const
vector< double > dSCCutPars_WireBased
shared_ptr< TMatrixFSym > dCovarianceMatrix
const DTOFPaddleHit * Get_ClosestTOFPaddleHit_Vertical(const DReferenceTrajectory *locReferenceTrajectory, const vector< const DTOFPaddleHit * > &locTOFPaddleHits, double locInputStartTime, double &locBestDeltaX, double &locBestDistance) const
float Get_LongBarLength() const
float Get_CenterHorizPlane() const
Double_t sigma[NCHANNELS]
double GetMass(void) const
virtual double GetProtondEdxMean_SC(double locBeta) const =0
vector< double > SC_BOUNDARY3
jerror_t GroupTracks(vector< const DTrackTimeBased * > &tracks, vector< vector< const DTrackTimeBased * > > &grouped_tracks) const
bool Get_ClosestToTrack(const DReferenceTrajectory *rt, const vector< const DBCALShower * > &locBCALShowers, bool locCutFlag, double &locStartTime, shared_ptr< const DBCALShowerMatchParams > &locBestMatchParams, double *locStartTimeVariance=nullptr, DVector3 *locBestProjPos=nullptr, DVector3 *locBestProjMom=nullptr) const
vector< double > SC_SECTION1_P1
bool Get_DIRCMatchParams(const DTrackingData *locTrack, shared_ptr< const DDIRCMatchParams > &locMatchParams) const
double GetdEdxSigma_DC(double num_hits, double p, double mass, double mean_path_length, bool locIsCDCFlag) const
shared_ptr< const DSCHitMatchParams > Get_SCHitMatchParams(void) const
jerror_t CalcdEdxHit(const DVector3 &mom, const DVector3 &pos, const DCDCTrackHit *hit, dedx_t &dedx) const
tof_spacetimehit_t * Build_TOFSpacetimeHit_Vertical(const DTOFPaddleHit *locTOFHit)
bool Cut_MatchDistance(const DReferenceTrajectory *rt, const DBCALShower *locBCALShower, double locInputStartTime, shared_ptr< DBCALShowerMatchParams > &locShowerMatchParams, DVector3 *locOutputProjPos=nullptr, DVector3 *locOutputProjMom=nullptr) const
const DTOFGeometry * dTOFGeometry
int column(int channel) const
jerror_t GetIntersectionWithRadius(double R, DVector3 &mypos, double *s=NULL, double *t=NULL, DVector3 *dir=NULL) const
double Calc_TimingChiSq(const DChargedTrackHypothesis *locChargedHypo, unsigned int &locNDF, double &locTimingPull) const
shared_ptr< const DFCALShowerMatchParams > Get_FCALShowerMatchParams(void) const
const DDIRCLut * Get_DIRCLut() const
double Get_ChiSq_DCdEdx(void) const
jerror_t CalcDCdEdx(const DTrackTimeBased *locTrackTimeBased, double &locdEdx_FDC, double &locdx_FDC, double &locdEdx_CDC, double &locdEdx_CDC_amp, double &locdx_CDC, double &locdx_CDC_amp, unsigned int &locNumHitsUsedFordEdx_FDC, unsigned int &locNumHitsUsedFordEdx_CDC) const
bool Get_BCALMatchParams(const DTrackingData *locTrack, vector< shared_ptr< const DBCALShowerMatchParams > > &locMatchParams) const
jerror_t GetDCdEdxHits(const DTrackTimeBased *track, vector< dedx_t > &dEdxHits_CDC, vector< dedx_t > &dEdxHits_FDC) const
virtual double GetTimeVariance(DetectorSystem_t detector, Particle_t particle, double p) const =0
const DVector3 & momentum(void) const
bool CalcLUT(TVector3 locProjPos, TVector3 locProjMom, const vector< const DDIRCPmtHit * > locDIRCHits, double locFlightTime, Particle_t locPID, shared_ptr< DDIRCMatchParams > &locDIRCMatchParams, const vector< const DDIRCTruthBarHit * > locDIRCBarHits, map< shared_ptr< const DDIRCMatchParams >, vector< const DDIRCPmtHit * > > &locDIRCTrackMatchParams) const
const DTrackFitter * fitter
vector< vector< DVector3 > > sc_pos
vector< double > sc_attn_B[2]
vector< vector< DVector3 > > sc_norm
vector< double > SC_SECTION3_P1
virtual double GetEOverPSigma(DetectorSystem_t detector, double p) const =0
double Get_CorrectedHitTime(const DTOFPoint *locTOFPoint, const DVector3 &locProjPos) const
shared_ptr< const DBCALShowerMatchParams > Get_BCALShowerMatchParams(void) const
DetectorSystem_t t0_detector(void) const
double dHalfPaddle_OneSided
int row(int channel) const
shared_ptr< const TMatrixFSym > errorMatrix(void) const
map< DetectorSystem_t, vector< DTrackFitter::Extrapolation_t > > extrapolations
void GetScintMPdEandSigma(double p, double M, double x, double &most_prob_dE, double &sigma_dE) const
const DFCALGeometry * dFCALGeometry
int y2bar(double y) const
> convert local position y to bar number (where y is the position pe...
const DTrackFinder * finder
bool Distance_ToTrack(const DReferenceTrajectory *rt, const DFCALShower *locFCALShower, double locInputStartTime, shared_ptr< DFCALShowerMatchParams > &locShowerMatchParams, DVector3 *locOutputProjPos=nullptr, DVector3 *locOutputProjMom=nullptr) const
bool isBlockActive(int row, int column) const
vector< double > SC_SECTION4_P1
bool PredictBCALWedge(const DReferenceTrajectory *rt, unsigned int &module, unsigned int §or, DVector3 *intersection=nullptr) const
DVector3 getPosition() const
static bool DParticleID_dedx_cmp(DParticleID::dedx_t a, DParticleID::dedx_t b)
bool GetTargetZ(double &z_target) const
z-location of center of target
double ONESIDED_PADDLE_MIDPOINT_MAG
vector< double > propagation_speed
virtual double GetEOverPMean(DetectorSystem_t detector, double p) const =0
jerror_t GetIntersectionWithPlane(const DVector3 &origin, const DVector3 &norm, DVector3 &pos, double *s=NULL, double *t=NULL, double *var_t=NULL, DetectorSystem_t detector=SYS_NULL) const
vector< vector< DVector3 > > sc_dir
bool Is_YPositionWellDefined(void) const
Particle_t PID(void) const
bool GetStartCounterGeom(vector< vector< DVector3 > > &pos, vector< vector< DVector3 > > &norm) const
void Set_ChiSq_Timing(double locChiSq, unsigned int locNDF)