16 #include <JANA/JGeometry.h>
41 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_SEED_DIST", MAX_SEED_DIST);
50 TARGET_Z_MIN = 65.0 - 15.0;
51 TARGET_Z_MAX = 65.0 + 15.0;
54 MAX_HIT_DIST2 = MAX_HIT_DIST*MAX_HIT_DIST;
85 vector<DFDCSeed> seeds;
89 for(
unsigned int i=0; i<seeds.size(); i++){
91 if(debug_level>3)
_DBG_<<
"----- Seed "<<i<<
" ------"<<endl;
92 if(!seed.
valid)
continue;
100 double phi = seed.
phi;
102 double theta = seed.
theta;
105 if(debug_level>3)
_DBG_<<
"p_trans="<<p_trans<<
" phi="<<phi<<
" theta="<<theta<<
" p="<<p_trans/
sin(theta)<<endl;
110 pos.SetXYZ(0.0, 0.0, z_vertex);
111 mom.SetMagThetaPhi(p_trans/
sin(theta), theta, phi);
116 _data.push_back(can);
128 for(
unsigned int i=0; i<fdctrkhits.size(); i++){
129 delete fdctrkhits[i];
134 vector<const DFDCPseudo*> fdcpseudos;
135 loop->Get(fdcpseudos);
138 for(
unsigned int i=0; i<fdcpseudos.size(); i++){
141 trkhit->
hit = fdcpseudos[i];
142 trkhit->
flags = NOISE;
144 fdctrkhits.push_back(trkhit);
149 for(
unsigned int i=0; i<fdctrkhits.size(); i++){
151 for(
unsigned int j=0; j<fdctrkhits.size(); j++){
153 if(!(trkhit2->
flags & NOISE))
continue;
154 double d2 = trkhit1->
Dist2(trkhit2);
156 if(debug_level>4)
_DBG_<<
" -- Dist hits "<<i<<
" and "<<j<<
" : deltaR="<<
sqrt(d2)<<
" deltaZ="<<deltaz<<endl;
157 if(d2<MAX_HIT_DIST2 && deltaz<12.0){
158 trkhit1->
flags &= ~NOISE;
159 trkhit2->
flags &= ~NOISE;
178 unsigned int last_available_hits = 0;
179 for(
int i=0; i<12; i++){
182 unsigned int Navailable_hits = NumAvailableHits();
183 if(debug_level>3)
_DBG_<<
"Navailable_hits="<<Navailable_hits<<
" last_available_hits="<<last_available_hits<<endl;
184 if(Navailable_hits<3)
break;
185 if(Navailable_hits==last_available_hits)
break;
186 last_available_hits = Navailable_hits;
189 hough.SetLimits(-400.0, +400.0, -400.0, +400.0, 100, 100);
193 for(
unsigned int i=0; i<fdctrkhits.size(); i++){
195 if(fdctrkhit->
flags&USED)
continue;
196 if(fdctrkhit->
flags&NOISE)
continue;
197 if(fdctrkhit->
flags&OUT_OF_TIME)
continue;
200 hough.AddPoint(hit->
xy.X(), hit->
xy.Y());
204 if(debug_level>3)
_DBG_<<
"Rough: GetMaxBinContent="<<hough.GetMaxBinContent()<<
" x0="<<Ro.X()<<
" y0="<<Ro.Y()<<endl;
205 if(debug_level>6)hough.PrintHist();
206 if(hough.GetMaxBinContent()<10.0)
continue;
210 hough.SetLimits(Ro.X()-width, Ro.X()+width, Ro.Y()-width, Ro.Y()+width, 100, 100);
212 if(debug_level>3)
_DBG_<<
"Medium: GetMaxBinContent="<<hough.GetMaxBinContent()<<
" x0="<<Ro.X()<<
" y0="<<Ro.Y()<<endl;
213 if(debug_level>5)hough.PrintHist();
217 hough.SetLimits(Ro.X()-width, Ro.X()+width, Ro.Y()-width, Ro.Y()+width, 100, 100);
219 if(debug_level>3)
_DBG_<<
"Fine: GetMaxBinContent="<<hough.GetMaxBinContent()<<
" x0="<<Ro.X()<<
" y0="<<Ro.Y()<<endl;
220 if(debug_level>5)hough.PrintHist();
227 seed.
theta = M_PI/2.0;
238 if(seed.
hits.size()<3)
continue;
241 seed.
phi = Ro.Phi() - seed.
q*M_PI/2.0;
247 seeds.push_back(seed);
260 for(
unsigned int i=0; i<fdctrkhits.size(); i++){
262 fdctrkhit->
flags &= ~ON_CIRCLE;
263 if(fdctrkhit->
flags&USED)
continue;
264 if(fdctrkhit->
flags&NOISE)
continue;
265 if(fdctrkhit->
flags&OUT_OF_TIME)
continue;
276 double dist = fabs(g.X()*Ro_minus_h.Y() - g.Y()*Ro_minus_h.X());
280 if(debug_level>3)
_DBG_<<
"dist="<<dist<<endl;
282 fdctrkhit->
flags &= ~VALID_HIT;
286 fdctrkhit->
flags |= ON_CIRCLE | VALID_HIT;
287 seed.
hits.push_back(fdctrkhit);
297 DVector2 last_dir = -1.0*Ro/Ro.Mod();
298 double last_phi = 0.0;
302 for(
unsigned int i=0; i<seed.
hits.size(); i++){
310 p_minus_Ro/=p_minus_Ro.Mod();
311 double delta_phi = p_minus_Ro.Phi() - last_dir.Phi();
312 while(delta_phi>+M_PI)delta_phi-=2.0*M_PI;
313 while(delta_phi<-M_PI)delta_phi+=2.0*M_PI;
314 fdctrkhit->
phi_hit = last_phi + delta_phi;
316 last_dir = p_minus_Ro;
319 Nq += fdctrkhit->
phi_hit>0.0 ? +1:-1;
325 for(
unsigned int i=0; i<seed.
hits.size(); i++){
328 Nq += fdctrkhit->
phi_hit>0.0 ? +1:-1;
333 if(Nq<0)seed.
q = -seed.
q;
344 for(
unsigned int i=0; i<fdctrkhits.size(); i++){
346 if(fdctrkhit->
flags&USED)
continue;
347 if(fdctrkhit->
flags&NOISE)
continue;
348 if(fdctrkhit->
flags&OUT_OF_TIME)
continue;
349 if(fdctrkhit->
flags&CANT_BE_IN_SEED)
continue;
361 FindTheta(seed, TARGET_Z_MIN, TARGET_Z_MAX);
367 if(debug_level>3)
_DBG_<<
"Seed z-vertex outside of target range (z="<<seed.
z_vertex<<
" TARGET_Z_MIN="<<TARGET_Z_MIN<<
" TARGET_Z_MAX="<<TARGET_Z_MAX<<endl;
374 for(
unsigned int i=0; i<seed.
hits.size(); i++){
376 if(trkhit->
flags&IN_Z_RANGE)trkhit->
flags |= USED;
382 for(
unsigned int i=0; i<seed.
hits.size(); i++){
384 if(trkhit->
flags&ON_CIRCLE)trkhit->
flags |= CANT_BE_IN_SEED;
407 unsigned int Nbins = 1000;
409 for(
unsigned int i=0; i<
Nbins; i++)hist[i] = 0;
410 double bin_width = 2.0*M_PI/(double)Nbins;
411 double hist_low_limit = -M_PI;
414 double &r0 = seed.
r0;
415 for(
unsigned int i=0; i<seed.
hits.size(); i++){
417 if(!trkhit->
flags&VALID_HIT)
continue;
418 if(!trkhit->
flags&ON_CIRCLE)
continue;
422 if(seed.
q<0.0)alpha = -
alpha;
424 double tmin = atan2(alpha, z_hit - target_z_min);
425 double tmax = atan2(alpha, z_hit - target_z_max);
431 if(debug_level>3)
_DBG_<<
" -- phi_hit="<<trkhit->
phi_hit<<
" z_hit="<<z_hit<<endl;
432 if(debug_level>3)
_DBG_<<
" -- tmin="<<tmin<<
" tmax="<<tmax<<endl;
439 unsigned int imin = (
unsigned int)floor((tmin-hist_low_limit)/bin_width);
440 unsigned int imax = (
unsigned int)floor((tmax-hist_low_limit)/bin_width);
444 if(imin>=Nbins)
continue;
447 if(imin>=Nbins)imin=Nbins-1;
448 if(imax>=Nbins)imax=Nbins-1;
451 for(
unsigned int j=imin; j<=imax; j++)hist[j]++;
455 unsigned int istart=0;
457 for(
unsigned int i=1; i<
Nbins; i++){
458 if(hist[i]>hist[istart]){
460 if(debug_level>3)
_DBG_<<
" -- istart="<<istart<<
" (theta="<<hist_low_limit + bin_width*(0.5+(double)istart)<<
" , N="<<hist[i]<<
")"<<endl;
462 if(hist[i] == hist[istart])iend = i;
466 if(hist[istart]==0.0){
467 if(debug_level>3)
_DBG_<<
" - No entries in theta hist. Seed aborted."<<endl;
472 seed.
theta_min = hist_low_limit + bin_width*(0.5+(double)istart);
473 seed.
theta_max = hist_low_limit + bin_width*(0.5+(double)iend);
475 if(debug_level>3)
_DBG_<<
"istart="<<istart<<
" iend="<<iend<<
" theta_min="<<seed.
theta_min<<
" theta_max="<<seed.
theta_max<<endl;
479 for(
unsigned int i=0; i<seed.
hits.size(); i++){
481 trkhit->
flags &= ~IN_THETA_RANGE;
482 if(!trkhit->
flags&VALID_HIT)
continue;
483 if(!trkhit->
flags&ON_CIRCLE)
continue;
486 trkhit->
flags |= IN_THETA_RANGE;
497 if(seed.
phi > 2.0*M_PI)seed.
phi -= 2.0*M_PI;
518 unsigned int Nbins = 300;
520 for(
unsigned int i=0; i<
Nbins; i++)hist[i] = 0;
521 double bin_width = 0.5;
522 double hist_low_limit = 0.0;
529 double theta_err = 1.0/57.3;
533 double tan_alpha_min = tan(theta_min - theta_err)/r0;
534 double tan_alpha_max = tan(theta_max + theta_err)/r0;
535 if(tan_alpha_min<0.0)tan_alpha_min=0.0;
536 for(
unsigned int i=0; i<seed.
hits.size(); i++){
538 if(!trkhit->
flags&VALID_HIT)
continue;
539 if(!trkhit->
flags&ON_CIRCLE)
continue;
540 if(!trkhit->
flags&IN_THETA_RANGE)
continue;
543 double q_sign = seed.
q>0.0 ? +1.0:-1.0;
545 double zmin = z_hit - q_sign*trkhit->
phi_hit/tan_alpha_min;
546 double zmax = z_hit - q_sign*trkhit->
phi_hit/tan_alpha_max;
558 unsigned int imin = zmin<hist_low_limit ? 0:(
unsigned int)floor((zmin-hist_low_limit)/bin_width);
559 unsigned int imax = zmax<hist_low_limit ? 0:(
unsigned int)floor((zmax-hist_low_limit)/bin_width);
561 if(debug_level>3)
_DBG_<<
" -- phi_hit="<<trkhit->
phi_hit<<
" z_hit="<<z_hit<<endl;
562 if(debug_level>3)
_DBG_<<
" -- zmin="<<zmin<<
" zmax="<<zmax<<endl;
563 if(debug_level>3)
_DBG_<<
" -- imin="<<imin<<
" imax="<<imax<<endl;
567 if(imax<=0 || imin>=Nbins)
continue;
570 if(imin>=Nbins)imin=Nbins-1;
571 if(imax>=Nbins)imax=Nbins-1;
574 for(
unsigned int j=imin; j<=imax; j++)hist[j]++;
578 unsigned int istart=(
unsigned int)((TARGET_Z_MIN-hist_low_limit)/bin_width);
580 for(
unsigned int i=1; i<
Nbins; i++){
583 double z = hist_low_limit + bin_width*(0.5+(double)i);
584 if(z<TARGET_Z_MIN || z>TARGET_Z_MAX)
continue;
586 if(hist[i]>hist[istart]){
588 if(debug_level>3)
_DBG_<<
" -- istart="<<istart<<
" (z="<<hist_low_limit + bin_width*(0.5+(double)istart)<<
" , N="<<hist[i]<<
")"<<endl;
590 if(hist[i] == hist[istart])iend = i;
594 if(hist[istart]==0.0){
595 if(debug_level>3)
_DBG_<<
" - No entries in z-vertex hist. Seed aborted."<<endl;
600 seed.
z_min = hist_low_limit + bin_width*(0.5+(double)istart);
601 seed.
z_max = hist_low_limit + bin_width*(0.5+(double)iend);
603 if(debug_level>3)
_DBG_<<
"istart="<<istart<<
" iend="<<iend<<
" z_min="<<seed.
z_min<<
" z_max="<<seed.
z_max<<
" hits[istart]="<<hist[istart]<<endl;
607 for(
unsigned int i=0; i<seed.
hits.size(); i++){
609 trkhit->
flags &= ~IN_Z_RANGE;
610 if(!trkhit->
flags&VALID_HIT)
continue;
611 if(!trkhit->
flags&ON_CIRCLE)
continue;
612 if(!trkhit->
flags&IN_THETA_RANGE)
continue;
615 trkhit->
flags |= IN_Z_RANGE;
void setMomentum(const DVector3 &aMomentum)
DVector2 xy
rough x,y coordinates in lab coordinate system
void FillSeedHits(DFDCSeed &seed)
vector< DFDCTrkHit * > hits
unsigned int NumAvailableHits(void)
const DFDCWire * wire
DFDCWire for this wire.
class DFDCPseudo: definition for a reconstructed point in the FDC
void FindThetaZ(DFDCSeed &seed)
void FindSeeds(vector< DFDCSeed > &seeds)
void FindZ(DFDCSeed &seed, double theta_min, double theta_max)
void GetTrkHits(JEventLoop *loop)
void FindTheta(DFDCSeed &seed, double target_z_min, double target_z_max)
virtual jerror_t brun(JEventLoop *loop, int32_t runnumber)
bool FDCSortByZincreasing(DTrackCandidate_factory_FDC::DFDCTrkHit *const &hit1, DTrackCandidate_factory_FDC::DFDCTrkHit *const &hit2)
virtual jerror_t fini(void)
Invoked via JEventProcessor virtual method.
virtual jerror_t init(void)
<A href="index.html#legend"> <IMG src="CORE.png" width="100"> </A>
void setPID(Particle_t locPID)
virtual jerror_t evnt(JEventLoop *loop, uint64_t eventnumber)
Invoked via JEventProcessor virtual method.
DTrackCandidate_factory_FDCpseudo()
void setPosition(const DVector3 &aPosition)
double Dist2(const DFDCTrkHit *trkhit)