10 #include <JANA/JCalibration.h>
15 #define TWO(c) (0x1u << (c))
16 #define MASK(c) ((unsigned int)(-1)) / (TWO(TWO(c)) + 1u)
17 #define COUNT(x,c) ((x) & MASK(c)) + (((x) >> (TWO(c))) & MASK(c))
20 #define M_TWO_PI 6.28318530717958647692
58 return (locIntersection1.
perp2 < locIntersection2.
perp2);
61 inline bool CDCSort_DeltaPhis(
const pair<DTrackCandidate_factory_CDC::DCDCTrkHit*, double>& locDeltaPhiPair1,
const pair<DTrackCandidate_factory_CDC::DCDCTrkHit*, double>& locDeltaPhiPair2)
64 return (locDeltaPhiPair1.second < locDeltaPhiPair2.second);
78 MAX_DCDCTrkHitPoolSize = 200;
79 MAX_DCDCSuperLayerSeedPoolSize = 50;
80 MAX_HelicalFitPoolSize = 100;
81 MAX_DCDCTrackCirclePoolSize = 100;
83 MAX_ALLOWED_CDC_HITS = 10000;
84 MAX_ALLOWED_TRACK_CIRCLES = 5000;
86 MAX_HIT_DIST2 = MAX_HIT_DIST*MAX_HIT_DIST;
91 MAX_NUM_RINGSEED_RINGS_SKIPABLE = 1;
96 MIN_STRAWS_POTENTIAL_SPIRAL_TURN = 4;
97 MIN_STRAWS_DEFINITE_SPIRAL_TURN = 6;
98 MIN_STRAWS_ADJACENT_TO_SPIRAL_TURN = 3;
101 MAX_STRAWS_BETWEEN_LINK_SPIRAL_TURN = 6;
106 SEED_DENSITY_BIN_STRAW_WIDTH = 8;
107 MAX_SEEDS_IN_STRAW_BIN = 15;
111 ENABLE_DEAD_HV_BOARD_LINKING =
false;
116 MAX_SUPERLAYER_NEW_TRACK = 4;
120 MAX_COMMON_HIT_FRACTION = 0.49;
122 MAX_DRIFT_TIME = 1000.0;
123 MAX_SEED_TIME_DIFF = 1000.0;
126 MIN_CIRCLE_ASYMMETRY = 0.10;
130 MIN_PRUNED_STEREO_HITS = 4;
133 MAX_UNUSED_HIT_LINK_ANGLE = 10.0;
136 VERTEX_Z_MIN = -100.0;
137 VERTEX_Z_MAX = 200.0;
139 cdchits_by_superlayer.resize(7);
140 dSuperLayerSeeds.resize(7);
141 for(
unsigned int loc_i = 0; loc_i < 7; ++loc_i)
142 superlayer_boundaries.push_back(4*(1 + loc_i));
144 dNumStrawsPerRing.resize(28);
146 dNumSeedDensityPhiBins = 360;
156 gPARMS->SetDefaultParameter(
"TRKFIND:DEBUG_LEVEL", DEBUG_LEVEL);
157 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_ALLOWED_CDC_HITS", MAX_ALLOWED_CDC_HITS);
158 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_ALLOWED_TRACK_CIRCLES", MAX_ALLOWED_TRACK_CIRCLES);
159 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_HIT_DIST", MAX_HIT_DIST);
160 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_NUM_RINGSEED_RINGS_SKIPABLE", MAX_NUM_RINGSEED_RINGS_SKIPABLE);
161 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_SEED_HITS", MIN_SEED_HITS);
162 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_STRAWS_POTENTIAL_SPIRAL_TURN", MIN_STRAWS_POTENTIAL_SPIRAL_TURN);
163 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_STRAWS_DEFINITE_SPIRAL_TURN", MIN_STRAWS_DEFINITE_SPIRAL_TURN);
164 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_STRAWS_ADJACENT_TO_SPIRAL_TURN", MIN_STRAWS_ADJACENT_TO_SPIRAL_TURN);
165 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_STRAWS_BETWEEN_LINK_SPIRAL_TURN", MAX_STRAWS_BETWEEN_LINK_SPIRAL_TURN);
166 gPARMS->SetDefaultParameter(
"TRKFIND:SEED_DENSITY_BIN_STRAW_WIDTH", SEED_DENSITY_BIN_STRAW_WIDTH);
167 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_SEEDS_IN_STRAW_BIN", MAX_SEEDS_IN_STRAW_BIN);
168 gPARMS->SetDefaultParameter(
"TRKFIND:ENABLE_DEAD_HV_BOARD_LINKING", ENABLE_DEAD_HV_BOARD_LINKING);
169 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_SUPERLAYER_NEW_TRACK", MAX_SUPERLAYER_NEW_TRACK);
170 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_COMMON_HIT_FRACTION", MAX_COMMON_HIT_FRACTION);
171 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_CIRCLE_ASYMMETRY", MIN_CIRCLE_ASYMMETRY);
172 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_DRIFT_TIME", MAX_DRIFT_TIME);
173 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_SEED_TIME_DIFF", MAX_SEED_TIME_DIFF);
174 gPARMS->SetDefaultParameter(
"TRKFIND:MIN_PRUNED_STEREO_HITS", MIN_PRUNED_STEREO_HITS);
175 gPARMS->SetDefaultParameter(
"TRKFIND:MAX_UNUSED_HIT_LINK_ANGLE", MAX_UNUSED_HIT_LINK_ANGLE);
176 gPARMS->SetDefaultParameter(
"TRKFIND:VERTEX_Z_MIN", VERTEX_Z_MIN);
177 gPARMS->SetDefaultParameter(
"TRKFIND:VERTEX_Z_MAX", VERTEX_Z_MAX);
179 MAX_HIT_DIST2 = MAX_HIT_DIST*MAX_HIT_DIST;
182 dMagneticField = locApplication->
GetBfield(runnumber);
183 dFactorForSenseOfRotation=(dMagneticField->GetBz(0.,0.,65.)>0.)?-1.:1.;
186 JCalibration *jcalib = locApplication->GetJCalibration(runnumber);
187 map<string, double> targetparms;
188 if (jcalib->Get(
"TARGET/target_parms",targetparms)==
false){
189 TARGET_Z = targetparms[
"TARGET_Z_POSITION"];
196 vector<vector<DCDCWire*> > locCDCWires;
198 for(
size_t loc_i = 0; loc_i < locCDCWires.size(); ++loc_i)
199 dNumStrawsPerRing[loc_i] = locCDCWires[loc_i].
size();
202 for (
size_t i=0;i<locCDCWires.size();i++){
203 for (
size_t j=0;j<locCDCWires[i].size();j++){
204 delete locCDCWires[i][j];
217 dRejectedPhiRegions.clear();
218 dStereoHitNumUsedMap.clear();
219 for(
unsigned int loc_i = 0; loc_i < 7; ++loc_i)
220 dSuperLayerSeeds[loc_i].clear();
226 if(Get_CDCHits(locEventLoop) != NOERROR)
229 return RESOURCE_UNAVAILABLE;
233 for(
unsigned int loc_i = 0; loc_i < 7; ++loc_i)
236 cout <<
"Find Seeds, Super Layer = " << loc_i + 1 << endl;
237 Find_SuperLayerSeeds(cdchits_by_superlayer[loc_i], loc_i + 1);
238 Reject_SuperLayerSeeds_HighSeedDensity(loc_i + 1);
241 Set_SpiralLinkParams();
244 cout <<
"init super layers" << endl;
245 Print_SuperLayerSeeds();
249 vector<DCDCTrackCircle*> locCDCTrackCircles;
250 bool locStatusFlag = Build_TrackCircles(locCDCTrackCircles);
255 return OBJECT_NOT_AVAILABLE;
257 if(locCDCTrackCircles.empty())
262 Handle_StereoAndFilter(locCDCTrackCircles,
false);
266 Add_UnusedHits(locCDCTrackCircles);
271 Fit_Circles(locCDCTrackCircles,
false,
true);
274 cout <<
"final fit track circles" << endl;
275 Print_TrackCircles(locCDCTrackCircles);
279 Handle_StereoAndFilter(locCDCTrackCircles,
true);
282 cout <<
"final track circles" << endl;
283 Print_TrackCircles(locCDCTrackCircles);
287 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
288 Create_TrackCandidiate(locCDCTrackCircles[loc_i]);
302 if(dCDCTrkHitPool_All.size() > MAX_DCDCTrkHitPoolSize)
304 for(
size_t loc_i = MAX_DCDCTrkHitPoolSize; loc_i < dCDCTrkHitPool_All.size(); ++loc_i)
305 delete dCDCTrkHitPool_All[loc_i];
306 dCDCTrkHitPool_All.resize(MAX_DCDCTrkHitPoolSize);
308 dCDCTrkHitPool_Available = dCDCTrkHitPool_All;
310 if(dCDCSuperLayerSeedPool_All.size() > MAX_DCDCSuperLayerSeedPoolSize)
312 for(
size_t loc_i = MAX_DCDCSuperLayerSeedPoolSize; loc_i < dCDCSuperLayerSeedPool_All.size(); ++loc_i)
313 delete dCDCSuperLayerSeedPool_All[loc_i];
314 dCDCSuperLayerSeedPool_All.resize(MAX_DCDCSuperLayerSeedPoolSize);
316 dCDCSuperLayerSeedPool_Available = dCDCSuperLayerSeedPool_All;
318 if(dHelicalFitPool_All.size() > MAX_HelicalFitPoolSize)
320 for(
unsigned int loc_i = MAX_HelicalFitPoolSize; loc_i < dHelicalFitPool_All.size(); ++loc_i)
321 delete dHelicalFitPool_All[loc_i];
322 dHelicalFitPool_All.resize(MAX_HelicalFitPoolSize);
324 dHelicalFitPool_Available = dHelicalFitPool_All;
326 if(dCDCTrackCirclePool_All.size() > MAX_DCDCTrackCirclePoolSize)
328 for(
size_t loc_i = MAX_DCDCTrackCirclePoolSize; loc_i < dCDCTrackCirclePool_All.size(); ++loc_i)
329 delete dCDCTrackCirclePool_All[loc_i];
330 dCDCTrackCirclePool_All.resize(MAX_DCDCTrackCirclePoolSize);
332 dCDCTrackCirclePool_Available = dCDCTrackCirclePool_All;
338 if(dCDCTrkHitPool_Available.empty())
341 dCDCTrkHitPool_All.push_back(locCDCTrkHit);
345 locCDCTrkHit = dCDCTrkHitPool_Available.back();
346 dCDCTrkHitPool_Available.pop_back();
348 locCDCTrkHit->
Reset();
355 if(dCDCSuperLayerSeedPool_Available.empty())
358 dCDCSuperLayerSeedPool_All.push_back(locCDCSuperLayerSeed);
362 locCDCSuperLayerSeed = dCDCSuperLayerSeedPool_Available.back();
363 dCDCSuperLayerSeedPool_Available.pop_back();
365 locCDCSuperLayerSeed->
Reset();
366 return locCDCSuperLayerSeed;
372 if(dHelicalFitPool_Available.empty())
375 dHelicalFitPool_All.push_back(locHelicalFit);
379 locHelicalFit = dHelicalFitPool_Available.back();
380 dHelicalFitPool_Available.pop_back();
382 locHelicalFit->
Reset();
383 return locHelicalFit;
389 if(dCDCTrackCirclePool_Available.empty())
392 dCDCTrackCirclePool_All.push_back(locCDCTrackCircle);
396 locCDCTrackCircle = dCDCTrackCirclePool_Available.back();
397 dCDCTrackCirclePool_Available.pop_back();
399 locCDCTrackCircle->
Reset();
400 return locCDCTrackCircle;
409 vector<const DCDCTrackHit*> cdctrackhits;
410 loop->Get(cdctrackhits);
411 dNumCDCHits = cdctrackhits.size();
414 if(cdctrackhits.empty())
415 return RESOURCE_UNAVAILABLE;
418 if(cdctrackhits.size() > MAX_ALLOWED_CDC_HITS)
420 cout <<
"Too many hits in CDC (" <<cdctrackhits.size() <<
", max = " << MAX_ALLOWED_CDC_HITS <<
")! Track finding in CDC bypassed for event " << loop->GetJEvent().GetEventNumber() << endl;
421 cdctrackhits.clear();
422 return UNRECOVERABLE_ERROR;
427 for(
unsigned int i = 0; i < cdchits_by_superlayer.size(); i++)
428 cdchits_by_superlayer[i].clear();
432 for(
size_t i = 0; i< cdctrackhits.size(); ++i)
436 int newwire = cdctrackhits[i]->wire->ring*1000 + cdctrackhits[i]->wire->straw;
437 if(newwire == oldwire)
442 cout <<
"adding ring, straw = " << cdctrackhits[i]->wire->ring <<
", " << cdctrackhits[i]->wire->straw << endl;
445 DCDCTrkHit* cdctrkhit = Get_Resource_CDCTrkHit();
446 cdctrkhit->
index = i;
447 cdctrkhit->
hit = cdctrackhits[i];
448 cdctrkhit->
flags = NONE;
449 cdctrkhit->
flags |= NOISE;
450 cdctrkhits.push_back(cdctrkhit);
453 for(
size_t j = 0; j < superlayer_boundaries.size(); ++j)
455 if(cdctrkhit->
hit->
wire->
ring <=
int(superlayer_boundaries[j]))
457 cdchits_by_superlayer[j].push_back(cdctrkhit);
464 for(
size_t i = 0; i < cdchits_by_superlayer.size(); ++i)
465 stable_sort(cdchits_by_superlayer[i].begin(), cdchits_by_superlayer[i].end(),
CDCSortByRdecreasing);
470 for(
size_t i = 0; i < cdctrkhits.size(); ++i)
473 if(trkhit1->
hit->
tdrift > MAX_DRIFT_TIME)
474 trkhit1->
flags |= OUT_OF_TIME;
475 if(!(trkhit1->
flags & NOISE))
477 for(
size_t j = 0; j < cdctrkhits.size(); ++j)
481 double d2 = trkhit1->
Dist2(cdctrkhits[j]);
482 if(d2 > 9.0*MAX_HIT_DIST2)
484 trkhit1->
flags &= ~NOISE;
485 cdctrkhits[j]->flags &= ~NOISE;
509 vector<DCDCSuperLayerSeed*>& locSuperLayerSeeds = dSuperLayerSeeds[locSuperLayer - 1];
510 locSuperLayerSeeds.clear();
513 vector<DCDCRingSeed> locCDCRingSeeds;
514 vector<vector<DCDCRingSeed> > rings;
517 for(
size_t i = 0; i < locSuperLayerHits.size(); ++i)
527 cout <<
"new ring, last ring = " << trkhit->
hit->
wire->
ring <<
", " << last_ring << endl;
529 if(!locCDCRingSeed.
hits.empty())
530 locCDCRingSeeds.push_back(locCDCRingSeed);
533 if(locCDCRingSeeds.size() > 1)
535 unsigned int locMinStraw = locCDCRingSeeds[0].hits[0]->hit->wire->straw;
536 unsigned int locMaxStraw = locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits[locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.size() - 1]->hit->wire->straw;
537 unsigned int locNumStrawsInRing = dNumStrawsPerRing[locCDCRingSeeds[0].hits[0]->hit->wire->ring - 1];
538 if((locMinStraw + locNumStrawsInRing - locMaxStraw) <= 1)
541 cout <<
"straw boundary: merge ringseeds" << endl;
542 locCDCRingSeeds[0].hits.insert(locCDCRingSeeds[0].hits.begin(), locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.begin(), locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.end());
544 locCDCRingSeeds.pop_back();
548 if(!locCDCRingSeeds.empty())
549 rings.push_back(locCDCRingSeeds);
551 cout <<
" ringseed hits:" << locCDCRingSeed.
hits.size() <<
" locCDCRingSeeds:" << locCDCRingSeeds.size() << endl;
553 locCDCRingSeeds.clear();
554 locCDCRingSeed.
hits.clear();
556 locCDCRingSeed.
hits.push_back(trkhit);
558 locCDCRingSeed.
linked =
false;
564 if((
unsigned int)abs(locCDCRingSeed.
hits[locCDCRingSeed.
hits.size() - 1]->hit->wire->straw - trkhit->
hit->
wire->
straw) > 1)
568 cout <<
"straw diff" << endl;
569 if(!locCDCRingSeed.
hits.empty())
570 locCDCRingSeeds.push_back(locCDCRingSeed);
572 cout <<
"ringseed hits: " << locCDCRingSeed.
hits.size() << endl;
573 locCDCRingSeed.
hits.clear();
574 locCDCRingSeed.
linked =
false;
577 locCDCRingSeed.
hits.push_back(trkhit);
579 cout <<
"push back hit straw = " << trkhit->
hit->
wire->
straw << endl;
582 if(!locCDCRingSeed.
hits.empty())
583 locCDCRingSeeds.push_back(locCDCRingSeed);
584 if(locCDCRingSeeds.size() > 1)
587 unsigned int locMinStraw = locCDCRingSeeds[0].hits[0]->hit->wire->straw;
588 unsigned int locMaxStraw = locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits[locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.size() - 1]->hit->wire->straw;
589 unsigned int locNumStrawsInRing = dNumStrawsPerRing[locCDCRingSeeds[0].hits[0]->hit->wire->ring - 1];
590 if((locMinStraw + locNumStrawsInRing - locMaxStraw) <= 1)
593 cout <<
"straw boundary: merge ringseeds" << endl;
594 locCDCRingSeeds[0].hits.insert(locCDCRingSeeds[0].hits.begin(), locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.begin(), locCDCRingSeeds[locCDCRingSeeds.size() - 1].hits.end());
596 locCDCRingSeeds.pop_back();
599 if(!locCDCRingSeeds.empty())
600 rings.push_back(locCDCRingSeeds);
602 cout <<
" ringseed hits:" << locCDCRingSeed.
hits.size() <<
" ringseeds:" << locCDCRingSeeds.size() << endl;
604 cout <<
"rings: " << rings.size() << endl;
609 for(
size_t i = 0; i < rings.size(); ++i)
611 for(
size_t k = 0; k < rings[i].size(); ++k)
613 cout <<
"hits for ringseed ring, seed indices " << i <<
", " << k <<
":" << endl;
614 for(
size_t j = 0; j < rings[i][k].hits.size(); ++j)
615 cout <<
"wire ring, straw = " << rings[i][k].hits[j]->hit->wire->ring <<
", " << rings[i][k].hits[j]->hit->wire->straw << endl;
625 for(
ringiter ring = rings.begin(); ring != rings.end(); ++ring)
627 vector<DCDCRingSeed>& locCDCRingSeeds = *ring;
632 for(
size_t j = 0; j < locCDCRingSeeds.size(); ++j)
634 if(locCDCRingSeeds[j].linked)
638 vector<DCDCRingSeed*> parent;
639 parent.push_back(&locCDCRingSeeds[j]);
640 Link_RingSeeds(parent, next_ring, rings.end(), locSuperLayer, 0);
645 for(
size_t loc_i = 0; loc_i < locSuperLayerSeeds.size(); ++loc_i)
647 locSuperLayerSeeds[loc_i]->dSuperLayer = locSuperLayer;
648 locSuperLayerSeeds[loc_i]->dSeedIndex = loc_i;
649 if((locSuperLayer == 7) || (locSuperLayer == 4) || (locSuperLayer == 1))
650 locSuperLayerSeeds[loc_i]->dWireOrientation = WIRE_DIRECTION_AXIAL;
651 else if((locSuperLayer == 2) || (locSuperLayer == 6))
652 locSuperLayerSeeds[loc_i]->dWireOrientation = WIRE_DIRECTION_STEREOLEFT;
654 locSuperLayerSeeds[loc_i]->dWireOrientation = WIRE_DIRECTION_STEREORIGHT;
679 cout <<
"parent has no ringseeds!!" << endl;
684 bool seed_extended =
false;
688 DCDCRingSeed *parent_ringseed = parent[parent.size() - 1];
689 double r_parent = parent_ringseed->
hits[0]->hit->wire->origin.Perp();
692 vector<DCDCRingSeed> &locCDCRingSeeds = (*ring);
695 for(
size_t i = 0; i < locCDCRingSeeds.size(); ++i)
698 double dr = r_parent - locCDCRingSeeds[i].hits[0]->hit->wire->origin.Perp();
699 double locTransverseDist2 = fabs(MinDist2(locCDCRingSeeds[i], *parent_ringseed) - dr*dr);
702 cout <<
"ring1, ring2, locTransverseDist2, MAX_HIT_DIST2, dr*dr = " << locCDCRingSeeds[i].hits[0]->hit->wire->ring <<
", " << parent_ringseed->
hits[0]->hit->wire->ring <<
", " << locTransverseDist2 <<
", " << MAX_HIT_DIST2 <<
", " << dr*dr << endl;
703 if(locTransverseDist2 < MAX_HIT_DIST2)
706 vector<DCDCRingSeed*> myparent = parent;
707 myparent.push_back(&locCDCRingSeeds[i]);
708 locCDCRingSeeds[i].linked =
true;
710 Link_RingSeeds(myparent, ring, ringend, locSuperLayer, 0);
711 seed_extended =
true;
714 if((!seed_extended) && (locNumPreviousRingsWithoutHit < MAX_NUM_RINGSEED_RINGS_SKIPABLE))
717 Link_RingSeeds(parent, ring, ringend, locSuperLayer, locNumPreviousRingsWithoutHit + 1);
718 seed_extended =
true;
727 int locSpiralRingIndex = -1;
728 for(
size_t i = 0; i < parent.size(); ++i)
730 if(parent[i]->hits.size() < MIN_STRAWS_DEFINITE_SPIRAL_TURN)
732 locSpiralRingIndex = i;
737 bool locSeparateSeedsFlag =
false;
738 if((locSpiralRingIndex != -1) && (parent.size() > 1))
740 double locAvgNumHitsInNonSpiralRing = 0.0;
741 for(
size_t i = 0; i < parent.size(); ++i)
743 if(
int(i) == locSpiralRingIndex)
745 locAvgNumHitsInNonSpiralRing += parent[i]->hits.size();
747 locAvgNumHitsInNonSpiralRing /= double(parent.size() - 1);
748 if(locAvgNumHitsInNonSpiralRing < 2)
749 locSeparateSeedsFlag =
true;
753 if(locSeparateSeedsFlag && (parent[locSpiralRingIndex]->hits.size() >= MIN_SEED_HITS))
756 for(
size_t loc_i = 0; loc_i < parent[locSpiralRingIndex]->hits.size(); ++loc_i)
757 parent[locSpiralRingIndex]->hits[loc_i]->flags |= USED;
758 dSuperLayerSeeds[locSuperLayer - 1].push_back(locSuperLayerSeed);
759 locSuperLayerSeed->
dCDCRingSeeds.push_back(*(parent[locSpiralRingIndex]));
763 unsigned int locTotalNumHits = 0;
764 for(
size_t i = 0; i < parent.size(); ++i)
766 if((
int(i) == locSpiralRingIndex) && locSeparateSeedsFlag)
768 locTotalNumHits += parent[i]->hits.size();
770 if(locTotalNumHits < MIN_SEED_HITS)
773 cout <<
"rejecting seed due to too few hits (have " << locTotalNumHits <<
" need " << MIN_SEED_HITS <<
")" << endl;
778 for(
size_t i = 0; i < parent.size(); ++i)
780 if((
int(i) == locSpiralRingIndex) && locSeparateSeedsFlag)
783 for(
size_t loc_j = 0; loc_j < parent[i]->hits.size(); ++loc_j)
784 parent[i]->hits[loc_j]->flags |= USED;
786 dSuperLayerSeeds[locSuperLayer - 1].push_back(locSuperLayerSeed);
795 const vector<DCDCTrkHit*>& locInnerSeedHits = locInnerRingSeed.
hits;
796 const vector<DCDCTrkHit*>& locOuterSeedHits = locOuterRingSeed.
hits;
797 return MinDist2(locInnerSeedHits, locOuterSeedHits);
809 if(locInnerSeedHits.empty() || locOuterSeedHits.empty())
811 cout <<
"Number of seed hits 0! (Ninner = " << locInnerSeedHits.size() <<
" ,Nouter = " << locOuterSeedHits.size() <<
")" << endl;
815 DCDCTrkHit* locInnermostRingFirstStrawHit = locInnerSeedHits.front();
816 DCDCTrkHit* locInnermostRingLastStrawHit = locInnerSeedHits.back();
817 DCDCTrkHit* locOutermostRingFirstStrawHit = locOuterSeedHits.front();
818 DCDCTrkHit* locOutermostRingLastStrawHit = locOuterSeedHits.back();
821 float locInnermostRingFirstStrawPhi = locInnermostRingFirstStrawHit->
hit->
wire->
phi;
822 float locInnermostRingLastStrawPhi = locInnermostRingLastStrawHit->
hit->
wire->
phi;
823 float locOutermostRingFirstStrawPhi = locOutermostRingFirstStrawHit->
hit->
wire->
phi;
824 float locOutermostRingLastStrawPhi = locOutermostRingLastStrawHit->
hit->
wire->
phi;
825 if(DEBUG_LEVEL > 100)
826 cout <<
"inner ring: ring, first/last straws & phis = " << locInnermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locInnermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingFirstStrawPhi <<
", " << locInnermostRingLastStrawPhi << endl;
827 if(DEBUG_LEVEL > 100)
828 cout <<
"outer ring: ring, first/last straws & phis = " << locOutermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locOutermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingFirstStrawPhi <<
", " << locOutermostRingLastStrawPhi << endl;
831 bool locInnerRingCrossesBoundaryFlag = (locInnermostRingLastStrawPhi < locInnermostRingFirstStrawPhi);
832 bool locOuterRingCrossesBoundaryFlag = (locOutermostRingLastStrawPhi < locOutermostRingFirstStrawPhi);
833 if(DEBUG_LEVEL > 100)
834 cout <<
"in/out boundary flags = " << locInnerRingCrossesBoundaryFlag <<
", " << locOuterRingCrossesBoundaryFlag << endl;
835 if(locOuterRingCrossesBoundaryFlag)
836 locOutermostRingLastStrawPhi +=
M_TWO_PI;
837 if(locInnerRingCrossesBoundaryFlag)
838 locInnermostRingLastStrawPhi +=
M_TWO_PI;
839 if(locOuterRingCrossesBoundaryFlag & (!locInnerRingCrossesBoundaryFlag) && ((locOutermostRingLastStrawPhi - locInnermostRingLastStrawPhi) > M_PI))
841 locInnermostRingFirstStrawPhi +=
M_TWO_PI;
842 locInnermostRingLastStrawPhi +=
M_TWO_PI;
844 if(locInnerRingCrossesBoundaryFlag & (!locOuterRingCrossesBoundaryFlag) && ((locInnermostRingLastStrawPhi - locOutermostRingLastStrawPhi) > M_PI))
846 locOutermostRingFirstStrawPhi +=
M_TWO_PI;
847 locOutermostRingLastStrawPhi +=
M_TWO_PI;
850 if(DEBUG_LEVEL > 100)
851 cout <<
"final inner ring: ring, first/last straws & phis = " << locInnermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locInnermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingFirstStrawPhi <<
", " << locInnermostRingLastStrawPhi << endl;
852 if(DEBUG_LEVEL > 100)
853 cout <<
"final outer ring: ring, first/last straws & phis = " << locOutermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locOutermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingFirstStrawPhi <<
", " << locOutermostRingLastStrawPhi << endl;
857 if((locOutermostRingFirstStrawPhi >= locInnermostRingFirstStrawPhi) && (locOutermostRingFirstStrawPhi <= locInnermostRingLastStrawPhi))
859 if((locOutermostRingLastStrawPhi >= locInnermostRingFirstStrawPhi) && (locOutermostRingLastStrawPhi <= locInnermostRingLastStrawPhi))
861 if((locInnermostRingFirstStrawPhi >= locOutermostRingFirstStrawPhi) && (locInnermostRingFirstStrawPhi <= locOutermostRingLastStrawPhi))
866 d2min = locInnermostRingFirstStrawHit->
Dist2(locOutermostRingFirstStrawHit);
867 if(locOutermostRingFirstStrawHit != locOutermostRingLastStrawHit)
869 d2 = locInnermostRingFirstStrawHit->
Dist2(locOutermostRingLastStrawHit);
873 if(locInnermostRingFirstStrawHit == locInnermostRingLastStrawHit)
876 d2 = locInnermostRingLastStrawHit->
Dist2(locOutermostRingFirstStrawHit);
879 if(locOutermostRingFirstStrawHit != locOutermostRingLastStrawHit)
881 d2 = locInnermostRingLastStrawHit->
Dist2(locOutermostRingLastStrawHit);
900 if(SEED_DENSITY_BIN_STRAW_WIDTH == 0)
903 vector<DCDCSuperLayerSeed*>& locSuperLayerSeeds = dSuperLayerSeeds[locSuperLayer - 1];
904 if(locSuperLayerSeeds.size() <= MAX_SEEDS_IN_STRAW_BIN)
910 unsigned int hist[dNumSeedDensityPhiBins];
911 for(
unsigned int i = 0; i < dNumSeedDensityPhiBins; ++i)
913 double bin_width =
M_TWO_PI/(double)dNumSeedDensityPhiBins;
914 double hist_low_limit = 0.0;
917 map<unsigned int, pair<double, double> > locMapPhiRanges;
918 for(
size_t loc_i = 0; loc_i < locSuperLayerSeeds.size(); ++loc_i)
920 double locSeedFirstPhi, locSeedLastPhi;
921 Calc_SuperLayerPhiRange(locSuperLayerSeeds[loc_i], locSeedFirstPhi, locSeedLastPhi);
922 locMapPhiRanges[locSuperLayerSeeds[loc_i]->dSeedIndex] = pair<double, double>(locSeedFirstPhi, locSeedLastPhi);
924 cout <<
"super layer, seed index, first phi, last phi = " << locSuperLayer <<
", " << locSuperLayerSeeds[loc_i]->dSeedIndex <<
", " << locSeedFirstPhi <<
", " << locSeedLastPhi << endl;
926 unsigned int locFirstPhiBin = (
unsigned int)((locSeedFirstPhi - hist_low_limit)/bin_width);
927 unsigned int locLastPhiBin = (
unsigned int)((locSeedLastPhi - hist_low_limit)/bin_width);
928 for(
unsigned int locPhiBin = locFirstPhiBin; locPhiBin <= locLastPhiBin; ++locPhiBin)
933 unsigned int locOuterRing = superlayer_boundaries[locSuperLayer - 1];
934 unsigned int locAverageNumStrawsInRing = (dNumStrawsPerRing[locOuterRing - 4] + dNumStrawsPerRing[locOuterRing - 1])/2;
935 double locSearchBinPhiSize = double(SEED_DENSITY_BIN_STRAW_WIDTH)*
M_TWO_PI/double(locAverageNumStrawsInRing);
938 int locStartPhiBin = -1;
939 for(
unsigned int locPhiBin = 0; locPhiBin < dNumSeedDensityPhiBins; ++locPhiBin)
941 if(hist[locPhiBin] > 0)
946 if(locStartPhiBin == -1)
947 locStartPhiBin = locPhiBin;
948 else if((locPhiBin - locStartPhiBin) > locSearchBinPhiSize)
951 if(locStartPhiBin == -1)
955 set<unsigned int> locSeedsToReject;
956 for(
unsigned int locPhiBin = 0; locPhiBin < dNumSeedDensityPhiBins; ++locPhiBin)
958 unsigned int locReadPhiBin = locStartPhiBin + locPhiBin;
959 if(locReadPhiBin >= dNumSeedDensityPhiBins)
960 locReadPhiBin -= dNumSeedDensityPhiBins;
962 double locWindowPhiRangeMin = hist_low_limit + bin_width*(double(locReadPhiBin));
963 if(locWindowPhiRangeMin >=
M_TWO_PI)
965 double locWindowPhiRangeMax = locWindowPhiRangeMin + locSearchBinPhiSize;
967 map<unsigned int, pair<double, double> >::const_iterator locSeedIterator = locMapPhiRanges.begin();
968 vector<unsigned int> locSeedsInThisRange;
969 for(; locSeedIterator != locMapPhiRanges.end(); ++locSeedIterator)
971 double locSeedPhiRangeMin = locSeedIterator->second.first;
972 double locSeedPhiRangeMax = locSeedIterator->second.second;
973 if(Check_IfPhiRangesOverlap(locSeedPhiRangeMin, locSeedPhiRangeMax, locWindowPhiRangeMin, locWindowPhiRangeMax))
974 locSeedsInThisRange.push_back(locSeedIterator->first);
976 if(locSeedsInThisRange.size() <= MAX_SEEDS_IN_STRAW_BIN)
980 for(
size_t loc_i = 0; loc_i < locSeedsInThisRange.size(); ++loc_i)
981 locSeedsToReject.insert(locSeedsInThisRange[loc_i]);
987 set<unsigned int>::const_iterator locRejectIterator = locSeedsToReject.begin();
988 int locBeginIndex = -1, locPreviousIndex = 0, locFirstIndex = 0, locEndIndex = 0;
989 set<unsigned int> locSeedsToNotReject;
990 for(; locRejectIterator != locSeedsToReject.end(); ++locRejectIterator)
992 unsigned int locCurrentIndex = *locRejectIterator;
994 cout <<
"Marked for rejection: super layer, seed index = " << locSuperLayer <<
", " << locCurrentIndex << endl;
995 if(locBeginIndex == -1)
997 locFirstIndex = locCurrentIndex;
998 locBeginIndex = locCurrentIndex;
999 locSeedsToNotReject.insert(locBeginIndex);
1000 if(DEBUG_LEVEL > 15)
1001 cout <<
"don't reject: " << locBeginIndex << endl;
1003 if(DEBUG_LEVEL > 30)
1004 cout <<
"window size, current phis, previous phis = " << locSearchBinPhiSize <<
", " << locMapPhiRanges[locCurrentIndex].first <<
", " << locMapPhiRanges[locCurrentIndex].second <<
", " << locMapPhiRanges[locPreviousIndex].first <<
", " << locMapPhiRanges[locPreviousIndex].second << endl;
1005 if(Check_IfPhiRangesOverlap(locMapPhiRanges[locCurrentIndex].first, locMapPhiRanges[locCurrentIndex].second, locMapPhiRanges[locPreviousIndex].first, locMapPhiRanges[locPreviousIndex].second + locSearchBinPhiSize))
1007 locPreviousIndex = locCurrentIndex;
1008 locEndIndex = locCurrentIndex;
1011 if(Check_IfPhiRangesOverlap(locMapPhiRanges[locCurrentIndex].first, locMapPhiRanges[locCurrentIndex].second, locMapPhiRanges[locPreviousIndex].first - locSearchBinPhiSize, locMapPhiRanges[locPreviousIndex].second))
1013 locPreviousIndex = locCurrentIndex;
1014 locEndIndex = locCurrentIndex;
1019 if(DEBUG_LEVEL > 15)
1020 cout <<
"Unmark for rejection: super layer, seed indexes = " << locSuperLayer <<
", " << locBeginIndex <<
", " << locPreviousIndex << endl;
1023 dRejectedPhiRegions[locSuperLayer - 1].push_back(pair<double, double>(locMapPhiRanges[locBeginIndex].first, locMapPhiRanges[locPreviousIndex].second));
1025 locSeedsToNotReject.insert(locPreviousIndex);
1026 locSeedsToNotReject.insert(locCurrentIndex);
1027 locBeginIndex = locCurrentIndex;
1028 locPreviousIndex = locCurrentIndex;
1029 locEndIndex = locCurrentIndex;
1031 locSeedsToNotReject.insert(locEndIndex);
1033 if(DEBUG_LEVEL > 30)
1034 cout <<
"first phis, last phis = " << locMapPhiRanges[locFirstIndex].first <<
", " << locMapPhiRanges[locFirstIndex].second <<
", " << locMapPhiRanges[locEndIndex].first <<
", " << locMapPhiRanges[locEndIndex].second << endl;
1037 if(Check_IfPhiRangesOverlap(locMapPhiRanges[locFirstIndex].first, locMapPhiRanges[locFirstIndex].second, locMapPhiRanges[locEndIndex].first, locMapPhiRanges[locEndIndex].second))
1039 if(DEBUG_LEVEL > 15)
1040 cout <<
"re-reject first/last = " << locFirstIndex <<
", " << locEndIndex << endl;
1042 locSeedsToNotReject.erase(locFirstIndex);
1043 locSeedsToNotReject.erase(locEndIndex);
1048 for(vector<DCDCSuperLayerSeed*>::iterator locvectorIterator = locSuperLayerSeeds.begin(); locvectorIterator != locSuperLayerSeeds.end();)
1050 unsigned int locSeedIndex = (*locvectorIterator)->dSeedIndex;
1051 if((locSeedsToReject.find(locSeedIndex) != locSeedsToReject.end()) && (locSeedsToNotReject.find(locSeedIndex) == locSeedsToNotReject.end()))
1053 if(DEBUG_LEVEL > 10)
1054 cout <<
"seed density too high, reject seed: " << locSeedIndex << endl;
1055 dCDCSuperLayerSeedPool_Available.push_back(*locvectorIterator);
1056 locvectorIterator = locSuperLayerSeeds.erase(locvectorIterator);
1059 ++locvectorIterator;
1069 locSeedFirstPhi = 9.9E9;
1070 locSeedLastPhi = -9.9E9;
1071 for(
size_t loc_j = 0; loc_j < locSuperLayerSeed->
dCDCRingSeeds.size(); ++loc_j)
1073 if (locSuperLayerSeed->
dCDCRingSeeds[loc_j].hits.empty())
continue;
1077 double locRingFirstPhi = locFirstStrawHit->
hit->
wire->
phi;
1078 if(locRingFirstPhi < 0.0)
1080 double locRingLastPhi = locLastStrawHit->
hit->
wire->
phi;
1081 if(locRingLastPhi < 0.0)
1085 locSeedFirstPhi = locRingFirstPhi;
1086 locSeedLastPhi = locRingLastPhi;
1090 if(locSeedFirstPhi > locSeedLastPhi)
1092 if(locRingFirstPhi > locRingLastPhi)
1094 if(locRingFirstPhi < locSeedFirstPhi)
1095 locSeedFirstPhi = locRingFirstPhi;
1096 if(locRingLastPhi > locSeedLastPhi)
1097 locSeedLastPhi = locRingLastPhi;
1101 if((locRingFirstPhi > M_PI) && (locRingFirstPhi < locSeedFirstPhi))
1102 locSeedFirstPhi = locRingFirstPhi;
1103 else if((locRingLastPhi < M_PI) && (locRingLastPhi > locSeedLastPhi))
1104 locSeedLastPhi = locRingLastPhi;
1109 if(locRingFirstPhi > locRingLastPhi)
1111 locSeedFirstPhi = locRingFirstPhi;
1112 if(locRingLastPhi > locSeedLastPhi)
1113 locSeedLastPhi = locRingLastPhi;
1117 if(locRingFirstPhi < locSeedFirstPhi)
1118 locSeedFirstPhi = locRingFirstPhi;
1119 if(locRingLastPhi > locSeedLastPhi)
1120 locSeedLastPhi = locRingLastPhi;
1132 if(locFirstSeedPhi > locLastSeedPhi)
1134 if(locTargetFirstPhi > locTargetLastPhi)
1140 if(locTargetLastPhi > locFirstSeedPhi)
1142 else if(locTargetFirstPhi < locLastSeedPhi)
1148 if(locTargetFirstPhi > locTargetLastPhi)
1152 if(locLastSeedPhi > locTargetFirstPhi)
1154 else if(locFirstSeedPhi < locTargetLastPhi)
1159 if((locTargetFirstPhi > locFirstSeedPhi) && (locTargetFirstPhi < locLastSeedPhi))
1161 else if((locTargetLastPhi > locFirstSeedPhi) && (locTargetLastPhi < locLastSeedPhi))
1163 else if((locFirstSeedPhi > locTargetFirstPhi) && (locFirstSeedPhi < locTargetLastPhi))
1181 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds.size(); ++loc_i)
1183 vector<DCDCSuperLayerSeed*>& locSuperLayerSeeds = dSuperLayerSeeds[loc_i];
1184 for(
size_t loc_j = 0; loc_j < locSuperLayerSeeds.size(); ++loc_j)
1186 for(
size_t loc_k = loc_j + 1; loc_k < locSuperLayerSeeds.size(); ++loc_k)
1188 if(SearchFor_SpiralTurn_TwoSeedsSharingManyHits(locSuperLayerSeeds[loc_j], locSuperLayerSeeds[loc_k]))
1190 if(SearchFor_SpiralTurn_TwoSeedsSharingFewHits(locSuperLayerSeeds[loc_j], locSuperLayerSeeds[loc_k]))
1192 if(SearchFor_SpiralTurn_MissingOrBetweenRings(locSuperLayerSeeds[loc_j], locSuperLayerSeeds[loc_k]))
1197 if(locSuperLayerSeeds[loc_j]->dSpiralLinkParams.empty())
1198 SearchFor_SpiralTurn_SingleSeed(locSuperLayerSeeds[loc_j]);
1210 int locMaxSpiralNumHits = 0;
1212 for(
size_t loc_i = 0; loc_i < locSuperLayerSeed1->
dCDCRingSeeds.size(); ++loc_i)
1214 int locRing = locSuperLayerSeed1->
dCDCRingSeeds[loc_i].ring;
1217 int locLocalRingNumber = (locRing - 1)%4 + 1;
1220 int locNumHits = locSuperLayerSeed1->
dCDCRingSeeds[loc_i].hits.size();
1221 if(locNumHits < locMaxSpiralNumHits)
1224 if(locNumHits >=
int(MIN_STRAWS_POTENTIAL_SPIRAL_TURN))
1228 int locFirstRing1 = locSuperLayerSeed1->
dCDCRingSeeds.front().ring;
1229 int locFirstRing2 = locSuperLayerSeed2->
dCDCRingSeeds.front().ring;
1230 int locLastRing1 = locSuperLayerSeed1->
dCDCRingSeeds.back().ring;
1231 int locLastRing2 = locSuperLayerSeed2->
dCDCRingSeeds.back().ring;
1232 if((locFirstRing1 == locFirstRing2) && (locLastRing1 == locLastRing2))
1238 int locTempSpiralNumHits = 0;
1239 if((locLocalRingNumber != 1) && (locLocalRingNumber != 4))
1243 if(!SearchFor_SpiralTurn_ManyHitsAdjacentRing(locSuperLayerSeed1, locSuperLayerSeed2, locRing + 1, MIN_STRAWS_ADJACENT_TO_SPIRAL_TURN, locTempSpiralNumHits))
1245 if(!SearchFor_SpiralTurn_ManyHitsAdjacentRing(locSuperLayerSeed1, locSuperLayerSeed2, locRing - 1, MIN_STRAWS_ADJACENT_TO_SPIRAL_TURN, locTempSpiralNumHits))
1251 locMaxSpiralNumHits = locNumHits;
1254 int locSpiralTurnRingFlag = 0;
1256 locSpiralTurnRingFlag = ((locRing - 1)%4 > 1) ? 1 : -1;
1258 locSpiralTurnRingFlag = -1;
1259 else if(loc_i == (locSuperLayerSeed1->
dCDCRingSeeds.size() - 1))
1260 locSpiralTurnRingFlag = 1;
1262 locSpiralTurnRingFlag = -1;
1264 locSpiralTurnRingFlag = 1;
1267 locSpiralTurnParams.
dDefiniteSpiralTurnRingFlag = (locNumHits >= int(MIN_STRAWS_DEFINITE_SPIRAL_TURN)) ? locSpiralTurnRingFlag : 0;
1270 if(DEBUG_LEVEL > 10)
1271 cout <<
"SL" << locSuperLayerSeed1->
dSuperLayer <<
" Seed" << locSuperLayerSeed1->
dSeedIndex <<
" Spiral-linked to SL" << locSuperLayerSeed2->
dSuperLayer <<
" Seed" << locSuperLayerSeed2->
dSeedIndex <<
": Share Many Hits, Ring = " << locRing << endl;
1274 return (locMaxSpiralNumHits > 0);
1284 int locMaxSpiralNumHits = 0;
1285 for(
size_t loc_i = 0; loc_i < locSuperLayerSeed1->
dCDCRingSeeds.size(); ++loc_i)
1287 int locRing = locSuperLayerSeed1->
dCDCRingSeeds[loc_i].ring;
1292 int locTempSpiralNumHits = -2;
1293 if(SearchFor_SpiralTurn_ManyHitsAdjacentRing(locSuperLayerSeed1, locSuperLayerSeed2, locRing - 1, MIN_STRAWS_POTENTIAL_SPIRAL_TURN, locTempSpiralNumHits))
1296 if(locTempSpiralNumHits > locMaxSpiralNumHits)
1298 locMaxSpiralNumHits = locTempSpiralNumHits;
1300 int locSpiralTurnRingFlag = 1;
1303 bool locIsDefiniteSpiralTurn = (locTempSpiralNumHits > int(MIN_STRAWS_DEFINITE_SPIRAL_TURN));
1307 if(DEBUG_LEVEL > 10)
1308 cout <<
"SL" << locSuperLayerSeed1->
dSuperLayer <<
" Seed" << locSuperLayerSeed1->
dSeedIndex <<
" Spiral-linked to SL" << locSuperLayerSeed2->
dSuperLayer <<
" Seed" << locSuperLayerSeed2->
dSeedIndex <<
": Share Few Hits, Ring = " << locRing << endl;
1313 locTempSpiralNumHits = -2;
1314 if(SearchFor_SpiralTurn_ManyHitsAdjacentRing(locSuperLayerSeed1, locSuperLayerSeed2, locRing + 1, MIN_STRAWS_POTENTIAL_SPIRAL_TURN, locTempSpiralNumHits))
1317 if(locTempSpiralNumHits > locMaxSpiralNumHits)
1319 locMaxSpiralNumHits = locTempSpiralNumHits;
1321 int locSpiralTurnRingFlag = -1;
1324 bool locIsDefiniteSpiralTurn = (locTempSpiralNumHits > int(MIN_STRAWS_DEFINITE_SPIRAL_TURN));
1328 if(DEBUG_LEVEL > 10)
1329 cout <<
"SL" << locSuperLayerSeed1->
dSuperLayer <<
" Seed" << locSuperLayerSeed1->
dSeedIndex <<
" Spiral-linked to SL" << locSuperLayerSeed2->
dSuperLayer <<
" Seed" << locSuperLayerSeed2->
dSeedIndex <<
": Share Few Hits, Ring = " << locRing << endl;
1334 return (locMaxSpiralNumHits > 0);
1346 vector<DCDCTrkHit*> locHits1;
1347 for(
size_t loc_i = 0; loc_i < locSuperLayerSeed1->
dCDCRingSeeds.size(); ++loc_i)
1349 if(locSuperLayerSeed1->
dCDCRingSeeds[loc_i].ring != locRingToCheck)
1354 if(locHits1.empty())
1357 vector<DCDCTrkHit*> locHits2;
1358 for(
size_t loc_j = 0; loc_j < locSuperLayerSeed2->
dCDCRingSeeds.size(); ++loc_j)
1360 if(locSuperLayerSeed2->
dCDCRingSeeds[loc_j].ring != locRingToCheck)
1365 if(locHits2.empty())
1368 int locNumHits1 = locHits1.size();
1369 int locNumHits2 = locHits2.size();
1371 if((locNumHits1 <
int(locMinStrawsAdjacentRing)) || (locNumHits2 <
int(locMinStrawsAdjacentRing)))
1376 int locFirstRing1 = locSuperLayerSeed1->
dCDCRingSeeds.front().ring;
1377 int locFirstRing2 = locSuperLayerSeed2->
dCDCRingSeeds.front().ring;
1378 int locLastRing1 = locSuperLayerSeed1->
dCDCRingSeeds.back().ring;
1379 int locLastRing2 = locSuperLayerSeed2->
dCDCRingSeeds.back().ring;
1380 if((locFirstRing1 == locFirstRing2) && (locLastRing1 == locLastRing2))
1386 locMaxSpiralNumHits = locNumHits1;
1387 if(locNumHits2 > locMaxSpiralNumHits)
1388 locMaxSpiralNumHits = locNumHits2;
1400 int locMaxSpiralNumHits = 0;
1401 for(
size_t loc_i = 0; loc_i < locSuperLayerSeed1->
dCDCRingSeeds.size(); ++loc_i)
1403 int locRing = locSuperLayerSeed1->
dCDCRingSeeds[loc_i].ring;
1406 vector<DCDCTrkHit*>& locHits1 = locSuperLayerSeed1->
dCDCRingSeeds[loc_i].hits;
1407 int locNumHits1 = locHits1.size();
1408 if(locNumHits1 <
int(MIN_STRAWS_POTENTIAL_SPIRAL_TURN))
1411 for(
size_t loc_j = 0; loc_j < locSuperLayerSeed2->
dCDCRingSeeds.size(); ++loc_j)
1413 if(locSuperLayerSeed2->
dCDCRingSeeds[loc_j].ring != locRing)
1416 vector<DCDCTrkHit*>& locHits2 = locSuperLayerSeed2->
dCDCRingSeeds[loc_j].hits;
1417 if(locHits2 == locHits1)
1421 int locNumHits2 = locHits2.size();
1422 if(locNumHits2 <
int(MIN_STRAWS_POTENTIAL_SPIRAL_TURN))
1425 bool locAtLeastOneSeedDefiniteTurnFlag = (locNumHits1 >= int(MIN_STRAWS_DEFINITE_SPIRAL_TURN));
1426 if(locNumHits2 >=
int(MIN_STRAWS_DEFINITE_SPIRAL_TURN))
1427 locAtLeastOneSeedDefiniteTurnFlag =
true;
1430 int locStrawNumDiff = abs(locHits2.front()->hit->wire->straw - locHits1.back()->hit->wire->straw);
1431 int locNumStrawsInRing = dNumStrawsPerRing[locRing - 1];
1432 if(locStrawNumDiff > locNumStrawsInRing/2)
1433 locStrawNumDiff = locNumStrawsInRing - locStrawNumDiff;
1434 int locNumHits = locStrawNumDiff - 1;
1435 if(locNumHits >
int(MAX_STRAWS_BETWEEN_LINK_SPIRAL_TURN))
1440 int locFirstRing1 = locSuperLayerSeed1->
dCDCRingSeeds.front().ring;
1441 int locFirstRing2 = locSuperLayerSeed2->
dCDCRingSeeds.front().ring;
1442 int locLastRing1 = locSuperLayerSeed1->
dCDCRingSeeds.back().ring;
1443 int locLastRing2 = locSuperLayerSeed2->
dCDCRingSeeds.back().ring;
1444 if((locFirstRing1 == locFirstRing2) && (locLastRing1 == locLastRing2))
1450 if((locNumHits1 < locMaxSpiralNumHits) && (locNumHits2 < locMaxSpiralNumHits))
1452 if(locNumHits1 > locMaxSpiralNumHits)
1453 locMaxSpiralNumHits = locNumHits1;
1454 if(locNumHits2 > locMaxSpiralNumHits)
1455 locMaxSpiralNumHits = locNumHits2;
1460 int locSpiralTurnRingFlag = 0;
1462 locSpiralTurnRingFlag = ((locRing - 1)%4 > 1) ? 1 : -1;
1464 locSpiralTurnRingFlag = -1;
1465 else if(loc_i == (locSuperLayerSeed1->
dCDCRingSeeds.size() - 1))
1466 locSpiralTurnRingFlag = 1;
1468 locSpiralTurnRingFlag = -1;
1470 locSpiralTurnRingFlag = 1;
1477 if(DEBUG_LEVEL > 10)
1478 cout <<
"SL" << locSuperLayerSeed1->
dSuperLayer <<
" Seed" << locSuperLayerSeed1->
dSeedIndex <<
" Spiral-linked to SL" << locSuperLayerSeed2->
dSuperLayer <<
" Seed" << locSuperLayerSeed2->
dSeedIndex <<
": Share No Hits, Ring = " << locRing << endl;
1482 return (locMaxSpiralNumHits > 0);
1492 int locMaxSpiralNumHits = 0;
1493 for(
size_t loc_i = 0; loc_i < locSuperLayerSeed->
dCDCRingSeeds.size(); ++loc_i)
1496 int locNumHits = locSuperLayerSeed->
dCDCRingSeeds[loc_i].hits.size();
1497 if(locNumHits < locMaxSpiralNumHits)
1500 if(locNumHits <
int(MIN_STRAWS_POTENTIAL_SPIRAL_TURN))
1502 locMaxSpiralNumHits = locNumHits;
1505 int locSpiralTurnRingFlag = ((locRing - 1)%4 > 1) ? 1 : -1;
1508 locSpiralTurnParams.
dDefiniteSpiralTurnRingFlag = (locNumHits >= int(MIN_STRAWS_DEFINITE_SPIRAL_TURN)) ? locSpiralTurnRingFlag : 0;
1510 if(DEBUG_LEVEL > 10)
1511 cout <<
"SL" << locSuperLayerSeed->
dSuperLayer <<
" Seed" << locSuperLayerSeed->
dSeedIndex <<
" Self-spiral-linked: Ring = " << locRing << endl;
1513 return (locMaxSpiralNumHits > 0);
1521 cout <<
"HITS BY SUPER LAYER & SEED INDEX:" << endl;
1522 for(
unsigned int loc_i = 0; loc_i < 7; ++loc_i)
1524 cout <<
" SUPER LAYER " << loc_i + 1 <<
":" << endl;
1525 for(
unsigned int loc_j = 0; loc_j < dSuperLayerSeeds[loc_i].size(); ++loc_j)
1527 cout <<
" Seed Index " << loc_j <<
":" << endl;
1529 vector<DCDCTrkHit*> locHits;
1530 locSuperLayerSeed->
Get_Hits(locHits);
1531 for(
unsigned int loc_k = 0; loc_k < locHits.size(); ++loc_k)
1532 cout <<
"ring, straw, E (keV) = " << locHits[loc_k]->hit->wire->ring <<
", " << locHits[loc_k]->hit->wire->straw <<
", " << 1.0E6*locHits[loc_k]->hit->dE << endl;
1533 for(map<int, DSpiralParams_t>::iterator locIterator = locSuperLayerSeed->
dSpiralLinkParams.begin(); locIterator != locSuperLayerSeed->
dSpiralLinkParams.end(); ++locIterator)
1534 cout <<
"dSpiralLinkSeedIndex, dSpiralTurnRingFlag, dSpiralTurnRing, dDefiniteSpiralTurnRingFlag = " << locIterator->first <<
", " << locIterator->second.dSpiralTurnRingFlag <<
", " << locIterator->second.dSpiralTurnRing <<
", " << locIterator->second.dDefiniteSpiralTurnRingFlag << endl;
1552 locCDCTrackCircles.clear();
1553 for(
unsigned int locOuterSuperLayer = 2; locOuterSuperLayer <= 7; ++locOuterSuperLayer)
1555 unsigned int locInnerSuperLayer = locOuterSuperLayer - 1;
1556 if(locCDCTrackCircles.empty())
1559 if(locInnerSuperLayer > MAX_SUPERLAYER_NEW_TRACK)
1561 if(dSuperLayerSeeds[locInnerSuperLayer - 1].empty())
1564 for(
size_t loc_j = 0; loc_j < dSuperLayerSeeds[locInnerSuperLayer - 1].size(); ++loc_j)
1566 DCDCSuperLayerSeed* locSuperLayerSeed = dSuperLayerSeeds[locInnerSuperLayer - 1][loc_j];
1568 if((locInnerSuperLayer == 1) || (locInnerSuperLayer == 4) || (locInnerSuperLayer == 7))
1570 else if((locInnerSuperLayer == 2) || (locInnerSuperLayer == 3))
1574 locCDCTrackCircles.push_back(locCDCTrackCircle);
1578 if(!Link_SuperLayers(locCDCTrackCircles, locOuterSuperLayer))
1582 if(locCDCTrackCircles.empty() && (MAX_SUPERLAYER_NEW_TRACK >= 7))
1584 for(
size_t loc_j = 0; loc_j < dSuperLayerSeeds[6].size(); ++loc_j)
1589 locCDCTrackCircles.push_back(locCDCTrackCircle);
1592 if(locCDCTrackCircles.empty())
1596 if(locCDCTrackCircles.size() >= MAX_ALLOWED_TRACK_CIRCLES)
1598 if(DEBUG_LEVEL > 10)
1599 cout <<
"Too many track circles; bailing" << endl;
1600 locCDCTrackCircles.clear();
1605 Reject_DefiniteSpiralArms(locCDCTrackCircles);
1606 if(locCDCTrackCircles.empty())
1610 Drop_IncompleteGroups(locCDCTrackCircles);
1611 if(locCDCTrackCircles.empty())
1616 cout <<
"LINKED TRACK CIRCLES" << endl;
1617 Print_TrackCircles(locCDCTrackCircles);
1622 Fit_Circles(locCDCTrackCircles,
false,
false);
1623 if(locCDCTrackCircles.empty())
1629 cout <<
"post circle fit" << endl;
1630 Print_TrackCircles(locCDCTrackCircles);
1647 cout <<
"Linking seeds, locOuterSuperLayer = " << locOuterSuperLayer << endl;
1650 unsigned int locInnerSuperLayer = locOuterSuperLayer - 1;
1651 if((locInnerSuperLayer == 1) || (locInnerSuperLayer == 4))
1652 Link_SuperLayers_FromAxial(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer);
1653 else if((locOuterSuperLayer == 4) || (locOuterSuperLayer == 7))
1655 if(!Link_SuperLayers_FromStereo_ToAxial(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer))
1659 Link_SuperLayers_FromStereo_ToStereo(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer);
1660 if(DEBUG_LEVEL > 25)
1662 cout <<
"Link-to SL" << locOuterSuperLayer <<
", v1" << endl;
1663 Print_TrackCircles(locCDCTrackCircles);
1667 if(ENABLE_DEAD_HV_BOARD_LINKING && (locInnerSuperLayer != 1))
1669 --locInnerSuperLayer;
1671 cout <<
"Try to skip super layer (e.g. HV board dead); new inner super layer = " << locInnerSuperLayer << endl;
1672 if((locInnerSuperLayer == 1) || (locInnerSuperLayer == 4))
1673 Link_SuperLayers_FromAxial(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer);
1674 else if((locOuterSuperLayer == 4) || (locOuterSuperLayer == 7))
1676 if(!Link_SuperLayers_FromStereo_ToAxial(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer))
1680 Link_SuperLayers_FromStereo_ToStereo(locCDCTrackCircles, locOuterSuperLayer, locInnerSuperLayer);
1681 if(DEBUG_LEVEL > 25)
1683 cout <<
"Link-to SL" << locOuterSuperLayer <<
", v2" << endl;
1684 Print_TrackCircles(locCDCTrackCircles);
1691 if(locOuterSuperLayer <= MAX_SUPERLAYER_NEW_TRACK)
1694 cout <<
"Save any unlinked as new track circles" << endl;
1695 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds[locOuterSuperLayer - 1].size(); ++loc_i)
1697 DCDCSuperLayerSeed* locSuperLayerSeed = dSuperLayerSeeds[locOuterSuperLayer - 1][loc_i];
1698 if(locSuperLayerSeed->
linked)
1702 double locSeedFirstPhi, locSeedLastPhi;
1703 Calc_SuperLayerPhiRange(locSuperLayerSeed, locSeedFirstPhi, locSeedLastPhi);
1704 bool locHitDensityPreviouslyTooHighFlag =
false;
1705 for(
size_t loc_j = 1; loc_j < locOuterSuperLayer; ++loc_j)
1707 for(
size_t loc_k = 0; loc_k < dRejectedPhiRegions[loc_j].size(); ++loc_k)
1709 if(!Check_IfPhiRangesOverlap(locSeedFirstPhi, locSeedLastPhi, dRejectedPhiRegions[loc_j][loc_k].first, dRejectedPhiRegions[loc_j][loc_k].second))
1711 locHitDensityPreviouslyTooHighFlag =
true;
1714 if(locHitDensityPreviouslyTooHighFlag)
1717 if(locHitDensityPreviouslyTooHighFlag)
1720 if(DEBUG_LEVEL > 10)
1721 cout <<
"Unlinked seed; create new track circle: super layer & seed index = " << locSuperLayerSeed->
dSuperLayer <<
", " << locSuperLayerSeed->
dSeedIndex << endl;
1722 if(locCDCTrackCircles.size() >= MAX_ALLOWED_TRACK_CIRCLES)
1724 if(DEBUG_LEVEL > 10)
1725 cout <<
"Too many track circles; bailing" << endl;
1726 locCDCTrackCircles.clear();
1730 if((locOuterSuperLayer == 4) || (locOuterSuperLayer == 7))
1732 else if((locOuterSuperLayer == 2) || (locOuterSuperLayer == 3))
1736 locCDCTrackCircles.push_back(locCDCTrackCircle);
1738 if(DEBUG_LEVEL > 25)
1740 cout <<
"Link-to SL" << locOuterSuperLayer <<
", v3" << endl;
1741 Print_TrackCircles(locCDCTrackCircles);
1754 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
1760 if(locSuperLayerSeed1->
dSuperLayer != locInnerSuperLayer)
1762 if(DEBUG_LEVEL > 10)
1763 cout <<
"Seed 1 Super Layer, Seed Index = " << locSuperLayerSeed1->
dSuperLayer <<
", " << locSuperLayerSeed1->
dSeedIndex << endl;
1764 if(!Check_IfShouldAttemptLink(locSuperLayerSeed1,
true))
1773 for(
size_t loc_j = 0; loc_j < dSuperLayerSeeds[locOuterSuperLayer - 1].size(); ++loc_j)
1775 DCDCSuperLayerSeed* locSuperLayerSeed2 = dSuperLayerSeeds[locOuterSuperLayer - 1][loc_j];
1776 if(DEBUG_LEVEL > 10)
1777 cout <<
"Seed 2 Super Layer, Seed Index = " << locSuperLayerSeed2->
dSuperLayer <<
", " << locSuperLayerSeed2->
dSeedIndex << endl;
1778 if(!Check_IfShouldAttemptLink(locSuperLayerSeed2,
false))
1780 if(DEBUG_LEVEL > 10)
1781 cout <<
"Attempting Seed Link" << endl;
1782 if(!Attempt_SeedLink(locSuperLayerSeed1, locSuperLayerSeed2))
1785 if(DEBUG_LEVEL > 10)
1786 cout <<
"LINK SUCCESSFUL" << endl;
1787 locSuperLayerSeed1->
linked =
true;
1788 locSuperLayerSeed2->
linked =
true;
1791 if(locOuterSuperLayer < 4)
1808 vector<DCDCTrackCircle*> locNewCDCTrackCircles;
1815 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
1822 locNewCDCTrackCircles.push_back(locCDCTrackCircle);
1829 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
1843 bool locFromInnerStereoFlag = (locInnerSuperLayer < 4);
1847 locFromInnerStereoFlag =
true;
1851 vector<vector<DCDCSuperLayerSeed*> > locPreLinkedCDCSuperLayerSeeds;
1852 if(locFromInnerStereoFlag)
1857 bool locTrackCircleSavedFlag =
false;
1859 for(
size_t loc_j = 0; loc_j < locPreLinkedCDCSuperLayerSeeds.size(); ++loc_j)
1862 vector<DCDCSuperLayerSeed*> locStereoSeedSeries = locPreLinkedCDCSuperLayerSeeds[loc_j];
1863 DCDCSuperLayerSeed* locSuperLayerSeed1 = locPreLinkedCDCSuperLayerSeeds[loc_j].back();
1864 if(DEBUG_LEVEL > 10)
1865 cout <<
"Seed 1 Super Layer, Seed Index = " << locSuperLayerSeed1->
dSuperLayer <<
", " << locSuperLayerSeed1->
dSeedIndex << endl;
1867 bool locInnerSeedLinkSuccessfulFlag =
false;
1869 if((locSuperLayerSeed1->
dSuperLayer == locInnerSuperLayer) && Check_IfShouldAttemptLink(locSuperLayerSeed1,
true))
1872 for(
size_t loc_k = 0; loc_k < dSuperLayerSeeds[locOuterSuperLayer - 1].size(); ++loc_k)
1874 DCDCSuperLayerSeed* locSuperLayerSeed2 = dSuperLayerSeeds[locOuterSuperLayer - 1][loc_k];
1875 if(DEBUG_LEVEL > 10)
1876 cout <<
"Seed 2 Super Layer, Seed Index = " << locSuperLayerSeed2->
dSuperLayer <<
", " << locSuperLayerSeed2->
dSeedIndex << endl;
1877 if(!Check_IfShouldAttemptLink(locSuperLayerSeed2,
false))
1879 if(DEBUG_LEVEL > 10)
1880 cout <<
"Attempting Seed Link" << endl;
1881 if(!Attempt_SeedLink(locSuperLayerSeed1, locSuperLayerSeed2))
1884 if(DEBUG_LEVEL > 10)
1885 cout <<
"LINK SUCCESSFUL" << endl;
1886 locSuperLayerSeed1->
linked =
true;
1887 locSuperLayerSeed2->
linked =
true;
1888 locInnerSeedLinkSuccessfulFlag =
true;
1892 locNewCDCSuperLayerSeeds_Axial.push_back(locSuperLayerSeed2);
1896 for(
size_t loc_l = 0; loc_l < locNewCDCTrackCircles.size(); ++loc_l)
1898 if(locNewCDCSuperLayerSeeds_Axial != locNewCDCTrackCircles[loc_l]->dSuperLayerSeeds_Axial)
1901 locNewCDCTrackCircle = locNewCDCTrackCircles[loc_l];
1903 if(locNewCDCTrackCircle == NULL)
1906 if(locNewCDCTrackCircles.size() >= MAX_ALLOWED_TRACK_CIRCLES)
1908 if(DEBUG_LEVEL > 10)
1909 cout <<
"Too many track circles; bailing" << endl;
1910 locCDCTrackCircles.clear();
1913 locNewCDCTrackCircle = Get_Resource_CDCTrackCircle();
1915 if(!locFromInnerStereoFlag)
1917 locNewCDCTrackCircles.push_back(locNewCDCTrackCircle);
1918 locTrackCircleSavedFlag =
true;
1921 if(locFromInnerStereoFlag)
1927 if(!locInnerSeedLinkSuccessfulFlag)
1932 for(
size_t loc_l = 0; loc_l < locNewCDCTrackCircles.size(); ++loc_l)
1937 locNewCDCTrackCircle = locNewCDCTrackCircles[loc_l];
1939 if(locNewCDCTrackCircle == NULL)
1942 if(locNewCDCTrackCircles.size() >= MAX_ALLOWED_TRACK_CIRCLES)
1944 if(DEBUG_LEVEL > 10)
1945 cout <<
"Too many track circles; bailing" << endl;
1946 locCDCTrackCircles.clear();
1949 locNewCDCTrackCircle = Get_Resource_CDCTrackCircle();
1951 if(!locFromInnerStereoFlag)
1953 locNewCDCTrackCircles.push_back(locNewCDCTrackCircle);
1954 locTrackCircleSavedFlag =
true;
1957 if(locFromInnerStereoFlag)
1964 if(!locTrackCircleSavedFlag)
1965 locNewCDCTrackCircles.push_back(locCDCTrackCircle);
1968 locCDCTrackCircles = locNewCDCTrackCircles;
1980 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
1993 bool locFromInnerStereoFlag = (locInnerSuperLayer < 4);
1997 locFromInnerStereoFlag =
true;
2001 vector<vector<DCDCSuperLayerSeed*> > locPreLinkedCDCSuperLayerSeeds;
2002 if(locFromInnerStereoFlag)
2016 for(
size_t loc_j = 0; loc_j < locPreLinkedCDCSuperLayerSeeds.size(); ++loc_j)
2019 vector<DCDCSuperLayerSeed*> locStereoSeedSeries = locPreLinkedCDCSuperLayerSeeds[loc_j];
2020 DCDCSuperLayerSeed* locSuperLayerSeed1 = locPreLinkedCDCSuperLayerSeeds[loc_j].back();
2021 if(DEBUG_LEVEL > 10)
2022 cout <<
"Seed 1 Super Layer, Seed Index = " << locSuperLayerSeed1->
dSuperLayer <<
", " << locSuperLayerSeed1->
dSeedIndex << endl;
2024 bool locInnerSeedLinkSuccessfulFlag =
false;
2026 if((locSuperLayerSeed1->
dSuperLayer == locInnerSuperLayer) && Check_IfShouldAttemptLink(locSuperLayerSeed1,
true))
2029 for(
size_t loc_k = 0; loc_k < dSuperLayerSeeds[locOuterSuperLayer - 1].size(); ++loc_k)
2031 DCDCSuperLayerSeed* locSuperLayerSeed2 = dSuperLayerSeeds[locOuterSuperLayer - 1][loc_k];
2032 if(DEBUG_LEVEL > 10)
2033 cout <<
"Seed 2 Super Layer, Seed Index = " << locSuperLayerSeed2->
dSuperLayer <<
", " << locSuperLayerSeed2->
dSeedIndex << endl;
2034 if(!Check_IfShouldAttemptLink(locSuperLayerSeed2,
false))
2036 if(DEBUG_LEVEL > 10)
2037 cout <<
"Attempting Seed Link" << endl;
2038 if(!Attempt_SeedLink(locSuperLayerSeed1, locSuperLayerSeed2))
2041 if(DEBUG_LEVEL > 10)
2042 cout <<
"LINK SUCCESSFUL" << endl;
2043 locSuperLayerSeed1->
linked =
true;
2044 locSuperLayerSeed2->
linked =
true;
2045 locInnerSeedLinkSuccessfulFlag =
true;
2048 vector<DCDCSuperLayerSeed*> locNewStereoSeedSeries = locStereoSeedSeries;
2049 locNewStereoSeedSeries.push_back(locSuperLayerSeed2);
2052 if(locFromInnerStereoFlag)
2058 if(!locInnerSeedLinkSuccessfulFlag)
2061 if(locFromInnerStereoFlag)
2080 const map<int, DSpiralParams_t>& locSpiralLinkParams = locSuperLayerSeed->
dSpiralLinkParams;
2081 bool locSelfLinkFlag = (locSpiralLinkParams.find(locSuperLayerSeed->
dSeedIndex) != locSpiralLinkParams.end());
2084 bool locIsTurningOutwardsFlag =
false;
2085 bool locIsTurningInwardsFlag =
false;
2086 map<int, DSpiralParams_t>::const_iterator locIterator;
2089 if(locIterator->second.dDefiniteSpiralTurnRingFlag == -1)
2090 locIsTurningOutwardsFlag =
true;
2091 else if(locIterator->second.dDefiniteSpiralTurnRingFlag == 1)
2092 locIsTurningInwardsFlag =
true;
2094 if(locIsTurningOutwardsFlag == locIsTurningInwardsFlag)
2098 if(locInnerSeedFlag)
2100 if(!locSelfLinkFlag)
2102 if(locIsTurningInwardsFlag)
2105 if(DEBUG_LEVEL > 10)
2106 cout <<
"Seed1 part of spiral turn in different direction, don't link it here." << endl;
2110 else if(locIsTurningOutwardsFlag)
2113 if(DEBUG_LEVEL > 10)
2114 cout <<
"Seed1 part of spiral turn in different direction, don't link it here." << endl;
2120 if(!locSelfLinkFlag)
2122 if(locIsTurningOutwardsFlag)
2125 if(DEBUG_LEVEL > 10)
2126 cout <<
"Seed2 part of spiral turn in different direction, don't link it here." << endl;
2130 else if(locIsTurningInwardsFlag)
2133 if(DEBUG_LEVEL > 10)
2134 cout <<
"Seed2 part of spiral turn in different direction, don't link it here." << endl;
2154 return Attempt_SeedLink(locRingSeed1, locRingSeed2, locWireDirection1, locWireDirection2);
2164 vector<DCDCTrkHit*> &hits1 = locRingSeed1.
hits;
2168 vector<DCDCTrkHit*> &hits2 = locRingSeed2.
hits;
2172 const DCDCWire* wire1 = hits1[0]->hit->wire;
2173 const DCDCWire* wire2 = hits2[0]->hit->wire;
2176 double locMinDist2 = MinDist2(locRingSeed1, locRingSeed2);
2183 if((locWireDirection1 == WIRE_DIRECTION_AXIAL) && (locWireDirection2 == WIRE_DIRECTION_AXIAL))
2184 locMaxDist2 = MAX_HIT_DIST2;
2185 else if((locWireDirection1 == WIRE_DIRECTION_AXIAL) && (locWireDirection2 != WIRE_DIRECTION_AXIAL))
2187 locMaxDist2 = MAX_HIT_DIST + 0.5*wire2->
L*fabs(
sin(wire2->
stereo));
2188 locMaxDist2 *= locMaxDist2;
2190 else if((locWireDirection1 != WIRE_DIRECTION_AXIAL) && (locWireDirection2 == WIRE_DIRECTION_AXIAL))
2192 locMaxDist2 = MAX_HIT_DIST + 0.5*wire1->
L*fabs(
sin(wire1->
stereo));
2193 locMaxDist2 *= locMaxDist2;
2195 else if((locWireDirection1 == WIRE_DIRECTION_STEREORIGHT) && (locWireDirection2 == WIRE_DIRECTION_STEREOLEFT))
2197 locMaxDist2 = MAX_HIT_DIST + 0.5*wire1->
L*fabs(
sin(wire1->
stereo)) + 0.5*wire2->
L*fabs(
sin(wire2->
stereo));
2198 locMaxDist2 *= locMaxDist2;
2200 else if((locWireDirection1 == WIRE_DIRECTION_STEREOLEFT) && (locWireDirection2 == WIRE_DIRECTION_STEREORIGHT))
2202 locMaxDist2 = MAX_HIT_DIST + 0.5*wire1->
L*fabs(
sin(wire1->
stereo)) + 0.5*wire2->
L*fabs(
sin(wire2->
stereo));
2203 locMaxDist2 *= locMaxDist2;
2206 locMaxDist2 = MAX_HIT_DIST2;
2208 double dr = wire2->
origin.Perp() - wire1->
origin.Perp();
2209 if(DEBUG_LEVEL > 20)
2210 cout <<
"locMinDist2, locMaxDist2, dr = " << locMinDist2 <<
", " << locMaxDist2 <<
", " << dr << endl;
2213 double locTransverseDist2 = locMinDist2 - dr*dr;
2214 return (locTransverseDist2 < locMaxDist2);
2222 cout <<
"Track Circle Super Layer Seeds (Axial, Inner/Outer Stereo):" << endl;
2223 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
2225 cout <<
"Track Circle Index = " << loc_i << endl;
2226 Print_TrackCircle(locCDCTrackCircles[loc_i]);
2237 for(
size_t loc_j = 0; loc_j < locCDCTrackCircle->dSuperLayerSeeds_InnerStereo.size(); ++loc_j)
2239 cout <<
"Inner Stereo Series " << loc_j <<
":" << endl;
2245 cout <<
"Outer Stereo Series " << loc_j <<
":" << endl;
2252 cout <<
"Fit h, x0, y0, r0, phi = " << locFit->
h <<
", " << locFit->
x0 <<
", " << locFit->
y0 <<
", " << locFit->
r0 <<
", " << locFit->
phi << endl;
2265 vector<DCDCTrackCircle*>::iterator locIterator;
2266 for(locIterator = locCDCTrackCircles.begin(); locIterator != locCDCTrackCircles.end();)
2277 if(locInnermostSuperLayerSeed == NULL)
2278 locInnermostSuperLayerSeed = locTempSuperLayerSeed;
2280 locInnermostSuperLayerSeed = locTempSuperLayerSeed;
2285 if(locInnermostSuperLayerSeed == NULL)
2286 locInnermostSuperLayerSeed = locTempSuperLayerSeed;
2288 locInnermostSuperLayerSeed = locTempSuperLayerSeed;
2290 if (locInnermostSuperLayerSeed == NULL)
2294 bool locIsDefinitelyTurningFlag =
false;
2295 map<int, DSpiralParams_t>::iterator locSpiralIterator;
2296 for(locSpiralIterator = locInnermostSuperLayerSeed->
dSpiralLinkParams.begin(); locSpiralIterator != locInnermostSuperLayerSeed->
dSpiralLinkParams.end(); ++locSpiralIterator)
2298 if(locSpiralIterator->second.dDefiniteSpiralTurnRingFlag == 0)
2300 locIsDefinitelyTurningFlag =
true;
2305 if(locIsDefinitelyTurningFlag)
2307 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2308 locIterator = locCDCTrackCircles.erase(locIterator);
2323 vector<DCDCTrackCircle*>::iterator locIterator;
2324 for(locIterator = locCDCTrackCircles.begin(); locIterator != locCDCTrackCircles.end();)
2329 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2330 locIterator = locCDCTrackCircles.erase(locIterator);
2342 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2343 locIterator = locCDCTrackCircles.erase(locIterator);
2366 double locAxialStrawVariance = 0.214401;
2367 vector<DCDCTrackCircle*>::iterator locIterator;
2368 for(locIterator = locCDCTrackCircles.begin(); locIterator != locCDCTrackCircles.end();)
2373 if(locFitDuringLinkingFlag && (locNumAxialSuperLayers < 2))
2383 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2384 locIterator = locCDCTrackCircles.erase(locIterator);
2388 if(locFitOnlyIfNullFitFlag && (locCDCTrackCircle->
fit != NULL))
2396 unsigned int locNumHitsInFit = 0;
2397 for(
size_t loc_i = 0; loc_i < locNumAxialSuperLayers; ++loc_i)
2399 vector<DCDCTrkHit*> hits;
2401 for(
size_t k = 0; k < hits.size(); ++k)
2403 if(hits[k]->flags & OUT_OF_TIME)
2405 DVector3 pos = hits[k]->hit->wire->origin;
2406 locFit->
AddHitXYZ(pos.x(), pos.y(), pos.z(), locAxialStrawVariance, locAxialStrawVariance, 0.0);
2413 if(locAddStereoLayerIntersectionsFlag)
2417 if((locInnerSuperLayerSeed != NULL) && (locOuterSuperLayerSeed != NULL))
2420 DVector3 locIntersection = Find_IntersectionBetweenSuperLayers(locInnerSuperLayerSeed, locOuterSuperLayerSeed);
2422 locFit->
AddHitXYZ(locIntersection.x(), locIntersection.y(), locIntersection.z(), locAxialStrawVariance, locAxialStrawVariance, 0.0);
2426 if((locInnerSuperLayerSeed != NULL) && (locOuterSuperLayerSeed != NULL))
2429 DVector3 locIntersection = Find_IntersectionBetweenSuperLayers(locInnerSuperLayerSeed, locOuterSuperLayerSeed);
2431 locFit->
AddHitXYZ(locIntersection.x(), locIntersection.y(), locIntersection.z(), locAxialStrawVariance, locAxialStrawVariance, 0.0);
2436 double locBeamRMS =
BeamRMS*locNumAxialSuperLayers;
2442 cout <<
"Riemann fit failed. Attempting regression fit..." << endl;
2446 cout <<
"Regression circle fit failed. Trying straight line." << endl;
2450 cout <<
"Trying straight line fit failed. Giving up." << endl;
2451 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2452 locIterator = locCDCTrackCircles.erase(locIterator);
2463 double x0 = locFit->
x0;
2464 double y0 = locFit->
y0;
2465 double r0 = locFit->
r0;
2466 size_t locNumHitsCloseToCircle = 0;
2467 double locAverageDriftTime = 0.0;
2468 unsigned int locTotalNumHits = 0;
2469 for(
size_t loc_i = 0; loc_i < locNumAxialSuperLayers; ++loc_i)
2471 vector<DCDCTrkHit*> hits;
2473 locTotalNumHits += hits.size();
2474 for(
size_t k = 0; k < hits.size(); ++k)
2476 if(hits[k]->flags & OUT_OF_TIME)
2478 double dx = hits[k]->hit->wire->origin.X() - x0;
2479 double dy = hits[k]->hit->wire->origin.Y() - y0;
2480 double d =
sqrt(dx*dx + dy*dy);
2481 if(DEBUG_LEVEL > 15)
2482 cout <<
"dist = " << d - r0 << endl;
2483 if(fabs(d - r0) > MAX_HIT_DIST)
2485 ++locNumHitsCloseToCircle;
2486 locAverageDriftTime += hits[k]->hit->tdrift;
2489 locAverageDriftTime /= ((double)locNumHitsCloseToCircle);
2492 cout <<
"Circle fit: Nhits=" << locFit->
GetNhits() <<
" h=" << locFit->
h <<
" N=" << locNumHitsCloseToCircle <<
" phi=" << locFit->
phi << endl;
2493 if(locNumHitsCloseToCircle < MIN_SEED_HITS)
2496 cout <<
"Rejected circle fit due to too few hits on track (N=" << locNumHitsCloseToCircle <<
" MIN_SEED_HITS=" << MIN_SEED_HITS <<
")" << endl;
2497 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2498 locIterator = locCDCTrackCircles.erase(locIterator);
2502 if(locNumHitsCloseToCircle < locTotalNumHits/2)
2505 cout <<
"Rejected circle fit due to minority of hits on track (N=" << locNumHitsCloseToCircle <<
" locTotalNumHits/2=" << locTotalNumHits/2 <<
")" << endl;
2506 Recycle_DCDCTrackCircle(locCDCTrackCircle);
2507 locIterator = locCDCTrackCircles.erase(locIterator);
2512 locCDCTrackCircle->
fit = locFit;
2513 double locWeightedChiSqPerDF = ((fabs(locFit->
chisq) > 0.0) && (locFit->
ndof > 0)) ? locFit->
chisq/(float(locFit->
ndof*locNumAxialSuperLayers*locNumAxialSuperLayers)) : 9.9E50;
2514 if(DEBUG_LEVEL > 10)
2515 cout <<
"chisq, ndof, numaxial, weightedchisq = " << locFit->
chisq <<
", " << locFit->
ndof <<
", " << locNumAxialSuperLayers <<
", " << locWeightedChiSqPerDF << endl;
2531 const DCDCWire* first_wire = locInnerSuperLayerRing.
hits.front()->hit->wire;
2532 const DCDCWire* second_wire = locOuterSuperLayerRing.
hits.front()->hit->wire;
2539 double u_dot_v=udir.Dot(vdir);
2540 double u_dot_diff=udir.Dot(diff);
2541 double v_dot_diff=vdir.Dot(diff);
2542 double scale=1./(1.-u_dot_v*u_dot_v);
2543 double ul=scale*(u_dot_v*v_dot_diff-u_dot_diff);
2544 double vl=scale*(v_dot_diff-u_dot_v*u_dot_diff);
2545 DVector3 pos=0.5*(u0+ul*udir+v0+vl*vdir);
2547 if(DEBUG_LEVEL > 10)
2548 cout <<
"XYZ intersection between SL" << locInnerSuperLayerSeed->
dSuperLayer <<
" and SL" << locOuterSuperLayerSeed->
dSuperLayer <<
": " << pos.X() <<
", " << pos.Y() <<
", " << pos.Z() << endl;
2562 if(!locFinalPassFlag)
2564 Truncate_TrackCircles(locCDCTrackCircles);
2565 Set_HitBitPattern_Axial(locCDCTrackCircles);
2566 Filter_TrackCircles_Axial(locCDCTrackCircles);
2569 cout <<
"post filter clone seeds" << endl;
2570 Print_TrackCircles(locCDCTrackCircles);
2576 vector<DCDCTrackCircle*>::iterator locIterator;
2577 size_t locCircleCounter = 0;
2578 for(locIterator = locCDCTrackCircles.begin(); locIterator != locCDCTrackCircles.end();)
2581 cout <<
"Create new Super Layer Seeds for Track Circle " << locCircleCounter << endl;
2583 Create_NewCDCSuperLayerSeeds(*locIterator);
2585 cout <<
"Select Super Layer Seeds for Track Circle " << locCircleCounter << endl;
2588 if(Select_CDCSuperLayerSeeds(*locIterator, locFinalPassFlag))
2592 Recycle_DCDCTrackCircle(*locIterator);
2593 locIterator = locCDCTrackCircles.erase(locIterator);
2597 Set_HitBitPattern_All(locCDCTrackCircles);
2600 if(!locFinalPassFlag)
2604 cout <<
"stereo-selected track circles" << endl;
2605 Print_TrackCircles(locCDCTrackCircles);
2608 Filter_TrackCircles_Stereo(locCDCTrackCircles);
2611 cout <<
"stereo-filtered track circles" << endl;
2612 Print_TrackCircles(locCDCTrackCircles);
2622 unsigned int locNumBits = 8*
sizeof(
unsigned int);
2623 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
2627 locCDCTrackCircle->
HitBitPattern.resize(dNumCDCHits/(8*
sizeof(
unsigned int)) + 1);
2630 vector<DCDCTrkHit*> locHits;
2632 for(
size_t loc_k = 0; loc_k < locHits.size(); ++loc_k)
2633 locCDCTrackCircle->
HitBitPattern[locHits[loc_k]->index/locNumBits] |= 1 << locHits[loc_k]->index % locNumBits;
2643 if(locCDCTrackCircles.empty())
2673 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
2675 if(!locCDCTrackCircles[loc_i]->dSuperLayerSeeds_InnerStereo.empty())
2676 locCDCTrackCircles[loc_i]->dHasNonTruncatedSeedsFlag_InnerStereo =
true;
2677 if(!locCDCTrackCircles[loc_i]->dSuperLayerSeeds_OuterStereo.empty())
2678 locCDCTrackCircles[loc_i]->dHasNonTruncatedSeedsFlag_OuterStereo =
true;
2679 else if(locCDCTrackCircles[loc_i]->Get_LastSuperLayerSeed()->dSuperLayer > 4)
2680 locCDCTrackCircles[loc_i]->dHasNonTruncatedSeedsFlag_OuterStereo =
true;
2685 vector<DCDCTrackCircle*>::iterator locIterator_Validating, locIterator_ToCompareTo;
2688 bool locTruncationPerformedFlag =
false;
2689 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end(); ++locIterator_Validating)
2691 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2692 if(DEBUG_LEVEL > 10)
2694 cout <<
"validating: search for SL7 truncation for circle with axial seeds:" << endl;
2700 if(locSuperLayerSeed_Validating == NULL)
2703 for(locIterator_ToCompareTo = --(locCDCTrackCircles.end()); locIterator_ToCompareTo != locIterator_Validating; --locIterator_ToCompareTo)
2705 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
2706 if(DEBUG_LEVEL > 10)
2708 cout <<
"to-compare-to: search for SL7 truncation for circle with axial seeds:" << endl;
2714 if(locSuperLayerSeed_Validating != locSuperLayerSeed_ToCompareTo)
2723 locSuperLayerSeed_ToCompareTo = locCDCTrackCircle_ToCompareTo->
Get_SuperLayerSeed(4);
2724 if(locSuperLayerSeed_Validating == locSuperLayerSeed_ToCompareTo)
2730 cout <<
"SL7's and SL4's identical: truncate to SL2" << endl;
2732 if(DEBUG_LEVEL > 20)
2734 cout <<
"post truncate" << endl;
2735 Print_TrackCircle(locCDCTrackCircle_Validating);
2743 cout <<
"SL7's identical (but not SL4's): truncate to SL5" << endl;
2745 if(DEBUG_LEVEL > 20)
2747 cout <<
"post truncate" << endl;
2748 Print_TrackCircle(locCDCTrackCircle_Validating);
2753 dHelicalFitPool_Available.push_back(locCDCTrackCircle_Validating->
fit);
2754 locCDCTrackCircle_Validating->
fit = NULL;
2759 locTruncationPerformedFlag =
true;
2764 if(locTruncationPerformedFlag)
2769 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
2771 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2772 bool locMergedTrackCircleFlag =
false;
2773 for(locIterator_ToCompareTo = --(locCDCTrackCircles.end()); locIterator_ToCompareTo != locIterator_Validating; --locIterator_ToCompareTo)
2775 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
2779 if(DEBUG_LEVEL > 20)
2781 cout <<
"sl7 merging circles: validating = " << endl;
2782 Print_TrackCircle(locCDCTrackCircle_Validating);
2783 cout <<
"sl7 merging circles: to-compare-to = " << endl;
2784 Print_TrackCircle(locCDCTrackCircle_ToCompareTo);
2787 if(DEBUG_LEVEL > 20)
2789 cout <<
"sl7 merge circles: output = " << endl;
2790 Print_TrackCircle(locCDCTrackCircle_ToCompareTo);
2792 locMergedTrackCircleFlag =
true;
2795 if(locMergedTrackCircleFlag)
2797 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
2798 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
2801 ++locIterator_Validating;
2807 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
2809 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2812 ++locIterator_Validating;
2815 if(DEBUG_LEVEL > 20)
2817 cout <<
"sl7 checking-for-subsets: validating = " << endl;
2818 Print_TrackCircle(locCDCTrackCircle_Validating);
2820 bool locRejectTrackFlag =
false;
2821 for(locIterator_ToCompareTo = locCDCTrackCircles.begin(); locIterator_ToCompareTo != locCDCTrackCircles.end(); ++locIterator_ToCompareTo)
2823 if(locIterator_ToCompareTo == locIterator_Validating)
2825 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
2826 if(DEBUG_LEVEL > 20)
2828 cout <<
"sl7 checking-for-subsets: to-compare-to = " << endl;
2829 Print_TrackCircle(locCDCTrackCircle_ToCompareTo);
2835 if(DEBUG_LEVEL > 10)
2836 cout <<
"rejecting subset circle" << endl;
2837 locRejectTrackFlag =
true;
2840 if(locRejectTrackFlag)
2842 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
2843 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
2846 ++locIterator_Validating;
2850 Fit_Circles(locCDCTrackCircles,
true,
false);
2854 cout <<
"Post-SL7-turncation track circles" << endl;
2855 Print_TrackCircles(locCDCTrackCircles);
2860 locTruncationPerformedFlag =
false;
2861 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
2863 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2864 if(DEBUG_LEVEL > 10)
2866 cout <<
"validating: search for SL4 truncation for circle with axial seeds:" << endl;
2872 if(locSuperLayerSeed_Validating == NULL)
2874 ++locIterator_Validating;
2884 ++locIterator_Validating;
2889 bool locRejectTrackFlag =
false;
2890 for(locIterator_ToCompareTo = --(locCDCTrackCircles.end()); locIterator_ToCompareTo != locIterator_Validating; --locIterator_ToCompareTo)
2892 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
2893 if(DEBUG_LEVEL > 10)
2895 cout <<
"to-compare-to: search for SL4 truncation for circle with axial seeds:" << endl;
2901 if(locSuperLayerSeed_Validating != locSuperLayerSeed_ToCompareTo)
2906 if(locSuperLayerSeed1_Validating == locSuperLayerSeed1_ToCompareTo)
2911 cout <<
"SL1 and SL4 are identical, while SL7 of validating is missing: reject validating track" << endl;
2912 locRejectTrackFlag =
true;
2923 cout <<
"SL4 is identical, SL1 is not, while SL7 of validating is missing: truncate to SL2" << endl;
2927 if(locCDCTrackCircle_Validating->
fit != NULL)
2929 dHelicalFitPool_Available.push_back(locCDCTrackCircle_Validating->
fit);
2930 locCDCTrackCircle_Validating->
fit = NULL;
2934 bool locIsAlreadyTruncationSourceFlag =
false;
2939 locIsAlreadyTruncationSourceFlag =
true;
2942 if(!locIsAlreadyTruncationSourceFlag)
2945 locTruncationPerformedFlag =
true;
2949 if(locRejectTrackFlag)
2951 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
2952 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
2955 ++locIterator_Validating;
2958 if(locTruncationPerformedFlag)
2961 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
2963 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2964 bool locMergedTrackCircleFlag =
false;
2965 for(locIterator_ToCompareTo = --(locCDCTrackCircles.end()); locIterator_ToCompareTo != locIterator_Validating; --locIterator_ToCompareTo)
2967 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
2972 locMergedTrackCircleFlag =
true;
2975 if(locMergedTrackCircleFlag)
2977 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
2978 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
2981 ++locIterator_Validating;
2987 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
2989 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
2990 bool locRejectTrackFlag =
false;
2991 if(DEBUG_LEVEL > 20)
2993 cout <<
"sl4 checking-for-subsets: validating = " << endl;
2994 Print_TrackCircle(locCDCTrackCircle_Validating);
2996 for(locIterator_ToCompareTo = locCDCTrackCircles.begin(); locIterator_ToCompareTo != locCDCTrackCircles.end(); ++locIterator_ToCompareTo)
2998 if(locIterator_ToCompareTo == locIterator_Validating)
3000 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
3001 if(DEBUG_LEVEL > 20)
3003 cout <<
"sl4 checking-for-subsets: to-compare-to = " << endl;
3004 Print_TrackCircle(locCDCTrackCircle_ToCompareTo);
3010 locRejectTrackFlag =
true;
3011 if(DEBUG_LEVEL > 10)
3012 cout <<
"rejecting subset circle" << endl;
3015 if(locRejectTrackFlag)
3017 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
3018 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
3021 ++locIterator_Validating;
3025 Fit_Circles(locCDCTrackCircles,
true,
false);
3029 cout <<
"Post-SL4-turncation track circles" << endl;
3030 Print_TrackCircles(locCDCTrackCircles);
3040 if(locCDCTrackCircles.empty())
3045 vector<DCDCTrackCircle*>::iterator locIterator_Validating, locIterator_ToCompareTo;
3048 for(locIterator_Validating = locCDCTrackCircles.begin(); locIterator_Validating != locCDCTrackCircles.end();)
3050 DCDCTrackCircle* locCDCTrackCircle_Validating = *locIterator_Validating;
3054 size_t locNumHits_Validating = 0;
3055 vector<DCDCTrkHit*> hits;
3059 locNumHits_Validating += hits.size();
3062 bool locRejectTrackCircleFlag =
false;
3063 for(locIterator_ToCompareTo = --(locCDCTrackCircles.end()); locIterator_ToCompareTo != locIterator_Validating; --locIterator_ToCompareTo)
3065 DCDCTrackCircle* locCDCTrackCircle_ToCompareTo = *locIterator_ToCompareTo;
3070 size_t locNumCommonHits = 0;
3071 size_t locNumWords = locCDCTrackCircle_Validating->
HitBitPattern.size();
3072 for(
size_t loc_i = 0; loc_i < locNumWords; ++loc_i)
3074 double locHitFraction = double(locNumCommonHits)/double(locNumHits_Validating);
3076 if(locHitFraction > MAX_COMMON_HIT_FRACTION)
3078 locRejectTrackCircleFlag =
true;
3082 if(locRejectTrackCircleFlag)
3085 Recycle_DCDCTrackCircle(locCDCTrackCircle_Validating);
3086 locIterator_Validating = locCDCTrackCircles.erase(locIterator_Validating);
3089 ++locIterator_Validating;
3100 map<DCDCSuperLayerSeed*, DCDCSuperLayerSeed*> locConvertedSuperLayerSeeds;
3101 map<DCDCSuperLayerSeed*, DCDCSuperLayerSeed*>::iterator locMapIterator;
3102 map<DCDCTrkHit*, DCDCTrkHit*> locProjectedStereoHitMap;
3110 locMapIterator = locConvertedSuperLayerSeeds.find(locCDCSuperLayerSeed);
3111 if(locMapIterator != locConvertedSuperLayerSeeds.end())
3116 DCDCSuperLayerSeed* locNewCDCSuperLayerSeed = Create_NewStereoSuperLayerSeed(locCDCSuperLayerSeed, locCDCTrackCircle, locProjectedStereoHitMap);
3118 locConvertedSuperLayerSeeds[locCDCSuperLayerSeed] = locNewCDCSuperLayerSeed;
3128 locMapIterator = locConvertedSuperLayerSeeds.find(locCDCSuperLayerSeed);
3129 if(locMapIterator != locConvertedSuperLayerSeeds.end())
3134 DCDCSuperLayerSeed* locNewCDCSuperLayerSeed = Create_NewStereoSuperLayerSeed(locCDCSuperLayerSeed, locCDCTrackCircle, locProjectedStereoHitMap);
3136 locConvertedSuperLayerSeeds[locCDCSuperLayerSeed] = locNewCDCSuperLayerSeed;
3148 *locNewCDCSuperLayerSeed = *locCDCSuperLayerSeed;
3152 for(
size_t loc_i = 0; loc_i < locCDCSuperLayerSeed->
dCDCRingSeeds.size(); ++loc_i)
3154 vector<DCDCTrkHit*>& hits = locCDCSuperLayerSeed->
dCDCRingSeeds[loc_i].hits;
3155 vector<DCDCTrkHit*> locProjectedHits;
3156 for(
size_t loc_l = 0; loc_l < hits.size(); ++loc_l)
3158 if(fabs(hits[loc_l]->hit->tdrift - locCDCTrackCircle->
dAverageDriftTime) > MAX_SEED_TIME_DIFF)
3163 map<DCDCTrkHit*, DCDCTrkHit*>::iterator locHitIterator = locProjectedStereoHitMap.find(hits[loc_l]);
3164 if(locHitIterator == locProjectedStereoHitMap.end())
3168 double locPhiStereo = 0.0, var_z = 9.9E9;
3169 locProjectedCDCTrkHit = Get_Resource_CDCTrkHit();
3170 *locProjectedCDCTrkHit = *hits[loc_l];
3173 if(Calc_StereoPosition(locProjectedCDCTrkHit->
hit->
wire, locCDCTrackCircle->
fit, locStereoHitPos, var_z, locPhiStereo))
3176 locProjectedCDCTrkHit->
var_z = var_z;
3177 locProjectedCDCTrkHit->
dPhiStereo = locPhiStereo;
3178 dStereoHitNumUsedMap[locProjectedCDCTrkHit] = 1;
3183 locProjectedCDCTrkHit = locHitIterator->second;
3184 ++dStereoHitNumUsedMap[locProjectedCDCTrkHit];
3188 locProjectedHits.push_back(locProjectedCDCTrkHit);
3190 locNewCDCSuperLayerSeed->
dCDCRingSeeds[loc_i].hits = locProjectedHits;
3193 return locNewCDCSuperLayerSeed;
3204 double dx = origin.x() - fit->
x0;
3205 double dy = origin.y() - fit->
y0;
3206 double ux = dir.x();
3207 double uy = dir.y();
3208 double temp1 = ux*ux + uy*uy;
3209 double temp2 = ux*dy - uy*dx;
3210 double b = -ux*dx - uy*dy;
3211 double dr = fit->
r0 - d;
3212 double r0_sq = dr*dr;
3213 double A = r0_sq*temp1 - temp2*temp2;
3221 var_z = temp*temp/12.;
3225 double dz1 = (b - B)/temp1;
3226 double dz2 = (b + B)/temp1;
3228 if(DEBUG_LEVEL > 15)
3229 cout<<
"dz1="<<dz1<<
" dz2="<<dz2<<endl;
3235 if(fabs(dz2) < fabs(dz1))
3239 pos = origin + dz*
dir;
3242 double s = dz/cos(wire->
stereo);
3244 if(DEBUG_LEVEL > 15)
3245 cout<<
"s="<<s<<
" ring="<<wire->
ring<<
" straw="<<wire->
straw<<
" stereo="<<wire->
stereo<<endl;
3249 locPhiStereo = atan2(pos.Y() - R.Y(), pos.X() - R.X());
3251 locPhiStereo -= R.Phi();
3254 double phi_hi = fit->
h > 0.0 ? +
M_TWO_PI : 0.0;
3255 double phi_lo = fit->
h > 0.0 ? 0.0 : -
M_TWO_PI;
3256 while(locPhiStereo < phi_lo)
3258 while(locPhiStereo > phi_hi)
3281 double locBestTheta = 0.0, locBestZ = TARGET_Z, locBestChiSqPerNDF = 9.9E99;
3282 vector<DCDCSuperLayerSeed*> locBestSuperLayerSeeds_Inner;
3283 vector<DCDCSuperLayerSeed*> locBestSuperLayerSeeds_Outer;
3284 bool locGoodStereoComboFoundFlag =
false;
3294 vector<DCDCTrkHit*> locComboHits;
3295 Select_ThetaZStereoHits(locCDCTrackCircle, loc_i, loc_j, locFinalPassFlag, locComboHits);
3298 double locTheta = 0.0, locZ = TARGET_Z, locChiSqPerNDF = 9.9E50;
3300 cout <<
"in/out try theta/z, num stereo hits = " << locComboHits.size() << endl;
3301 if(!Find_ThetaZ(locCDCTrackCircle->
fit, locComboHits, locTheta, locZ, locChiSqPerNDF))
3303 if(!((locChiSqPerNDF < 1.0) || (locChiSqPerNDF > -1.0)))
3305 locGoodStereoComboFoundFlag =
true;
3307 cout <<
"in/out good theta/z: theta, z, chisq, best-chisq = " << locTheta <<
", " << locZ <<
", " << locChiSqPerNDF <<
", " << locBestChiSqPerNDF << endl;
3308 if(locChiSqPerNDF >= locBestChiSqPerNDF)
3311 locBestSuperLayerSeeds_Inner.clear();
3314 locBestSuperLayerSeeds_Outer.clear();
3317 locBestTheta = locTheta;
3319 locBestChiSqPerNDF = locChiSqPerNDF;
3329 vector<DCDCTrkHit*> locComboHits;
3330 Select_ThetaZStereoHits(locCDCTrackCircle, loc_i, -1, locFinalPassFlag, locComboHits);
3333 double locTheta = 0.0, locZ = TARGET_Z, locChiSqPerNDF = 9.9E50;
3335 cout <<
"in-only try theta/z, num stereo hits = " << locComboHits.size() << endl;
3336 if(!Find_ThetaZ(locCDCTrackCircle->
fit, locComboHits, locTheta, locZ, locChiSqPerNDF))
3338 if(!((locChiSqPerNDF < 1.0) || (locChiSqPerNDF > -1.0)))
3340 locGoodStereoComboFoundFlag =
true;
3342 cout <<
"in-only good theta/z: theta, z, chisq, best-chisq = " << locTheta <<
", " << locZ <<
", " << locChiSqPerNDF <<
", " << locBestChiSqPerNDF << endl;
3343 if(locChiSqPerNDF >= locBestChiSqPerNDF)
3346 locBestSuperLayerSeeds_Inner.clear();
3349 locBestSuperLayerSeeds_Outer.clear();
3350 locBestTheta = locTheta;
3352 locBestChiSqPerNDF = locChiSqPerNDF;
3361 vector<DCDCTrkHit*> locComboHits;
3362 Select_ThetaZStereoHits(locCDCTrackCircle, -1, loc_j, locFinalPassFlag, locComboHits);
3365 double locTheta = 0.0, locZ = TARGET_Z, locChiSqPerNDF = 9.9E50;
3367 cout <<
"out-only try theta/z, num stereo hits = " << locComboHits.size() << endl;
3368 if(!Find_ThetaZ(locCDCTrackCircle->
fit, locComboHits, locTheta, locZ, locChiSqPerNDF))
3370 if(!((locChiSqPerNDF < 1.0) || (locChiSqPerNDF > -1.0)))
3372 locGoodStereoComboFoundFlag =
true;
3374 cout <<
"out-only good theta/z: theta, z, chisq, best-chisq = " << locTheta <<
", " << locZ <<
", " << locChiSqPerNDF <<
", " << locBestChiSqPerNDF << endl;
3375 if(locChiSqPerNDF >= locBestChiSqPerNDF)
3378 locBestSuperLayerSeeds_Inner.clear();
3379 locBestSuperLayerSeeds_Outer.clear();
3382 locBestTheta = locTheta;
3384 locBestChiSqPerNDF = locChiSqPerNDF;
3388 return (!locFinalPassFlag);
3391 locCDCTrackCircle->
dTheta = locBestTheta;
3392 locCDCTrackCircle->
dVertexZ = locBestZ;
3393 double locNumStereoSuperLayers = double(locBestSuperLayerSeeds_Inner.size() + locBestSuperLayerSeeds_Outer.size());
3396 set<DCDCSuperLayerSeed*> locAlreadyRecycledSuperLayerSeeds;
3406 if(locAlreadyRecycledSuperLayerSeeds.find(locCDCSuperLayerSeed) != locAlreadyRecycledSuperLayerSeeds.end())
3408 bool locKeepSuperLayerSeed =
false;
3409 for(
size_t loc_k = 0; loc_k < locBestSuperLayerSeeds_Inner.size(); ++loc_k)
3411 if(locBestSuperLayerSeeds_Inner[loc_k] != locCDCSuperLayerSeed)
3413 locKeepSuperLayerSeed =
true;
3416 if(locKeepSuperLayerSeed)
3418 Recycle_DCDCSuperLayerSeed(locCDCSuperLayerSeed);
3419 locAlreadyRecycledSuperLayerSeeds.insert(locCDCSuperLayerSeed);
3423 if(locGoodStereoComboFoundFlag)
3426 locAlreadyRecycledSuperLayerSeeds.clear();
3436 if(locAlreadyRecycledSuperLayerSeeds.find(locCDCSuperLayerSeed) != locAlreadyRecycledSuperLayerSeeds.end())
3438 bool locKeepSuperLayerSeed =
false;
3439 for(
size_t loc_k = 0; loc_k < locBestSuperLayerSeeds_Outer.size(); ++loc_k)
3441 if(locBestSuperLayerSeeds_Outer[loc_k] != locCDCSuperLayerSeed)
3443 locKeepSuperLayerSeed =
true;
3446 if(locKeepSuperLayerSeed)
3448 Recycle_DCDCSuperLayerSeed(locCDCSuperLayerSeed);
3449 locAlreadyRecycledSuperLayerSeeds.insert(locCDCSuperLayerSeed);
3453 if(locGoodStereoComboFoundFlag)
3457 return locGoodStereoComboFoundFlag;
3473 locComboHits.clear();
3476 vector<DCDCSuperLayerSeed*> locSuperLayerSeeds;
3477 if(locInnerSeedSeriesIndex >= 0)
3482 if(locOuterSeedSeriesIndex >= 0)
3489 vector<DCDCTrkHit*> locHits;
3490 map<unsigned int, vector<DCDCTrkHit*> > locHitsBySuperLayer;
3491 unsigned int locTotalNumStereoHits = 0;
3492 for(
size_t loc_k = 0; loc_k < locSuperLayerSeeds.size(); ++loc_k)
3494 locSuperLayerSeeds[loc_k]->Get_Hits(locHits);
3495 for(vector<DCDCTrkHit*>::iterator locIterator = locHits.begin(); locIterator != locHits.end();)
3497 if((*locIterator)->dValidStereoHitPosFlag)
3500 locIterator = locHits.erase(locIterator);
3502 locHitsBySuperLayer[locSuperLayerSeeds[loc_k]->dSuperLayer] = locHits;
3503 locTotalNumStereoHits += locHits.size();
3508 if((!locFinalPassFlag) || (locTotalNumStereoHits <= MIN_PRUNED_STEREO_HITS))
3511 map<unsigned int, vector<DCDCTrkHit*> >::iterator locMapIterator;
3512 for(locMapIterator = locHitsBySuperLayer.begin(); locMapIterator != locHitsBySuperLayer.end(); ++locMapIterator)
3513 locComboHits.insert(locComboHits.end(), locMapIterator->second.begin(), locMapIterator->second.end());
3514 if(DEBUG_LEVEL > 10)
3515 cout <<
"no more pruning, total num stereo hits = " << locTotalNumStereoHits << endl;
3524 vector<pair<DCDCTrkHit*, double> > locDeltaPhis;
3525 for(
size_t loc_k = 0; loc_k < locSuperLayerSeeds.size(); ++loc_k)
3527 unsigned int locSuperLayer = locSuperLayerSeeds[loc_k]->dSuperLayer;
3528 Calc_StereoHitDeltaPhis(locSuperLayer, locHitsBySuperLayer[locSuperLayer], locCDCTrackCircle, locDeltaPhis);
3532 if(locDeltaPhis.size() <= MIN_PRUNED_STEREO_HITS)
3534 for(
size_t loc_k = 0; loc_k < locDeltaPhis.size(); ++loc_k)
3535 locComboHits.push_back(locDeltaPhis[loc_k].first);
3540 double locMaxHitDeltaPhi = locDeltaPhis[MIN_PRUNED_STEREO_HITS - 1].second;
3543 double locDeltaPhiRangeExtension = 0.0;
3557 if(((locLastSuperLayer == 4) || (locLastSuperLayer == 7)) && (locCDCTrackCircle->
dSpiralTurnRing != -1))
3558 locDeltaPhiRangeExtension = M_PI;
3559 else if(locCDCTrackCircle->
fit->
r0 > 65.0/2.0)
3560 locDeltaPhiRangeExtension = 10.0;
3562 locDeltaPhiRangeExtension = 5.0;
3563 locMaxHitDeltaPhi += locDeltaPhiRangeExtension;
3565 if(DEBUG_LEVEL > 10)
3566 cout <<
"prune with max delta-phi, fit circle r0 = " << locMaxHitDeltaPhi <<
", " << locCDCTrackCircle->
fit->
r0 << endl;
3567 size_t locDeltaPhiIndex = 0;
3569 for(locDeltaPhiIndex = 0; locDeltaPhiIndex < locDeltaPhis.size(); ++locDeltaPhiIndex)
3571 if(locDeltaPhis[locDeltaPhiIndex].second > locMaxHitDeltaPhi)
3573 locComboHits.push_back(locDeltaPhis[locDeltaPhiIndex].first);
3582 map<unsigned int, vector<DCDCTrkHit*> >::iterator locMapIterator;
3583 for(
size_t loc_i = 0; loc_i < locComboHits.size(); ++loc_i)
3585 unsigned int locSuperLayer = (locComboHits[loc_i]->hit->wire->ring - 1)/4 + 1;
3586 locMapIterator = locHitsBySuperLayer.find(locSuperLayer);
3587 if(locMapIterator == locHitsBySuperLayer.end())
3589 locHitsBySuperLayer.erase(locMapIterator);
3590 if(locHitsBySuperLayer.empty())
3595 for(locMapIterator = locHitsBySuperLayer.begin(); locMapIterator != locHitsBySuperLayer.end(); ++locMapIterator)
3598 for(
size_t loc_i = locDeltaPhiIndex; loc_i < locDeltaPhis.size(); ++loc_i)
3600 unsigned int locSuperLayer = (locDeltaPhis[loc_i].first->hit->wire->ring - 1)/4 + 1;
3601 if(locSuperLayer != locMapIterator->first)
3603 locComboHits.push_back(locDeltaPhis[loc_i].first);
3604 if(DEBUG_LEVEL > 10)
3605 cout <<
"Add stereo hit on SL" << locSuperLayer <<
": ring, straw = " << locDeltaPhis[loc_i].first->hit->wire->ring <<
", " << locDeltaPhis[loc_i].first->hit->wire->straw << endl;
3610 if(DEBUG_LEVEL > 10)
3611 cout <<
"final #hits = " << locComboHits.size() << endl;
3624 if(DEBUG_LEVEL > 10)
3625 cout <<
"Calc_StereoHitDeltaPhis, SL = " << locSuperLayer <<
", #hits = " << locHits.size() << endl;
3634 else if((locCDCTrackCircle->
dSuperLayerSeeds_Axial[loc_k]->dSuperLayer > locSuperLayer) && (locNextAxialSuperLayerSeed == NULL))
3640 if(locPriorAxialSuperLayerSeed != NULL)
3642 locPriorAxialRingSeed = &(locPriorAxialSuperLayerSeed->
dCDCRingSeeds.back());
3643 if(DEBUG_LEVEL > 10)
3644 cout <<
"Prior axial ring = " << locPriorAxialRingSeed->
ring << endl;
3647 if(locNextAxialSuperLayerSeed != NULL)
3649 locNextAxialRingSeed = &(locNextAxialSuperLayerSeed->
dCDCRingSeeds.front());
3650 if(DEBUG_LEVEL > 10)
3651 cout <<
"Next axial ring = " << locNextAxialRingSeed->
ring << endl;
3653 if((locPriorAxialRingSeed == NULL) && (locNextAxialRingSeed == NULL))
3657 for(
size_t loc_i = 0; loc_i < locHits.size(); ++loc_i)
3659 vector<DCDCTrkHit*> locTempvector(1, locHits[loc_i]);
3660 double locMinDeltaPhi = M_PI;
3662 if(locPriorAxialRingSeed != NULL)
3664 double locDeltaPhi = MinDeltaPhi(locPriorAxialRingSeed->
hits, locTempvector);
3665 if(locDeltaPhi < locMinDeltaPhi)
3666 locMinDeltaPhi = locDeltaPhi;
3669 if(locNextAxialRingSeed != NULL)
3671 double locDeltaPhi = MinDeltaPhi(locTempvector, locNextAxialRingSeed->
hits);
3672 if(locDeltaPhi < locMinDeltaPhi)
3673 locMinDeltaPhi = locDeltaPhi;
3675 locMinDeltaPhi *= 180.0/M_PI;
3676 if(DEBUG_LEVEL > 10)
3677 cout <<
"Ring, Straw, min delta phi = " << locHits[loc_i]->hit->wire->ring <<
", " << locHits[loc_i]->hit->wire->straw <<
", " << locMinDeltaPhi << endl;
3679 locDeltaPhis.push_back(pair<DCDCTrkHit*, double>(locHits[loc_i], locMinDeltaPhi));
3692 if(locInnerSeedHits.empty() || locOuterSeedHits.empty())
3694 cout <<
"Number of seed hits 0! (Ninner = " << locInnerSeedHits.size() <<
" ,Nouter = " << locOuterSeedHits.size() <<
")" << endl;
3698 DCDCTrkHit* locInnermostRingFirstStrawHit = locInnerSeedHits.front();
3699 DCDCTrkHit* locInnermostRingLastStrawHit = locInnerSeedHits.back();
3700 DCDCTrkHit* locOutermostRingFirstStrawHit = locOuterSeedHits.front();
3701 DCDCTrkHit* locOutermostRingLastStrawHit = locOuterSeedHits.back();
3704 float locInnermostRingFirstStrawPhi = locInnermostRingFirstStrawHit->
hit->
wire->
phi;
3705 float locInnermostRingLastStrawPhi = locInnermostRingLastStrawHit->
hit->
wire->
phi;
3706 float locOutermostRingFirstStrawPhi = locOutermostRingFirstStrawHit->
hit->
wire->
phi;
3707 float locOutermostRingLastStrawPhi = locOutermostRingLastStrawHit->
hit->
wire->
phi;
3708 if(DEBUG_LEVEL > 100)
3709 cout <<
"inner ring: ring, first/last straws & phis = " << locInnermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locInnermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingFirstStrawPhi <<
", " << locInnermostRingLastStrawPhi << endl;
3710 if(DEBUG_LEVEL > 100)
3711 cout <<
"outer ring: ring, first/last straws & phis = " << locOutermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locOutermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingFirstStrawPhi <<
", " << locOutermostRingLastStrawPhi << endl;
3714 bool locInnerRingCrossesBoundaryFlag = (locInnermostRingLastStrawPhi < locInnermostRingFirstStrawPhi);
3715 bool locOuterRingCrossesBoundaryFlag = (locOutermostRingLastStrawPhi < locOutermostRingFirstStrawPhi);
3716 if(DEBUG_LEVEL > 100)
3717 cout <<
"in/out boundary flags = " << locInnerRingCrossesBoundaryFlag <<
", " << locOuterRingCrossesBoundaryFlag << endl;
3718 if(locOuterRingCrossesBoundaryFlag)
3719 locOutermostRingLastStrawPhi +=
M_TWO_PI;
3720 if(locInnerRingCrossesBoundaryFlag)
3721 locInnermostRingLastStrawPhi +=
M_TWO_PI;
3722 if(locOuterRingCrossesBoundaryFlag & (!locInnerRingCrossesBoundaryFlag) && ((locOutermostRingLastStrawPhi - locInnermostRingLastStrawPhi) > M_PI))
3724 locInnermostRingFirstStrawPhi +=
M_TWO_PI;
3725 locInnermostRingLastStrawPhi +=
M_TWO_PI;
3727 if(locInnerRingCrossesBoundaryFlag & (!locOuterRingCrossesBoundaryFlag) && ((locInnermostRingLastStrawPhi - locOutermostRingLastStrawPhi) > M_PI))
3729 locOutermostRingFirstStrawPhi +=
M_TWO_PI;
3730 locOutermostRingLastStrawPhi +=
M_TWO_PI;
3733 if(DEBUG_LEVEL > 100)
3734 cout <<
"final inner ring: ring, first/last straws & phis = " << locInnermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locInnermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locInnermostRingFirstStrawPhi <<
", " << locInnermostRingLastStrawPhi << endl;
3735 if(DEBUG_LEVEL > 100)
3736 cout <<
"final outer ring: ring, first/last straws & phis = " << locOutermostRingFirstStrawHit->
hit->
wire->
ring <<
", " << locOutermostRingFirstStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingLastStrawHit->
hit->
wire->
straw <<
", " << locOutermostRingFirstStrawPhi <<
", " << locOutermostRingLastStrawPhi << endl;
3738 if((locOutermostRingFirstStrawPhi >= locInnermostRingFirstStrawPhi) && (locOutermostRingFirstStrawPhi <= locInnermostRingLastStrawPhi))
3740 if((locOutermostRingLastStrawPhi >= locInnermostRingFirstStrawPhi) && (locOutermostRingLastStrawPhi <= locInnermostRingLastStrawPhi))
3742 if((locInnermostRingFirstStrawPhi >= locOutermostRingFirstStrawPhi) && (locInnermostRingFirstStrawPhi <= locOutermostRingLastStrawPhi))
3746 double locDeltaPhi, locMinDeltaPhi;
3747 locMinDeltaPhi = fabs(locInnermostRingFirstStrawPhi - locOutermostRingFirstStrawPhi);
3748 if(locMinDeltaPhi > M_PI)
3749 locMinDeltaPhi = fabs(locMinDeltaPhi -
M_TWO_PI);
3750 if(locOutermostRingFirstStrawHit != locOutermostRingLastStrawHit)
3752 locDeltaPhi = fabs(locInnermostRingFirstStrawPhi - locOutermostRingLastStrawPhi);
3753 if(locDeltaPhi > M_PI)
3754 locDeltaPhi = fabs(locDeltaPhi -
M_TWO_PI);
3755 if(locDeltaPhi < locMinDeltaPhi)
3756 locMinDeltaPhi = locDeltaPhi;
3758 if(locInnermostRingFirstStrawHit == locInnermostRingLastStrawHit)
3759 return locMinDeltaPhi;
3761 locDeltaPhi = fabs(locInnermostRingLastStrawPhi - locOutermostRingFirstStrawPhi);
3762 if(locDeltaPhi > M_PI)
3763 locDeltaPhi = fabs(locDeltaPhi -
M_TWO_PI);
3764 if(locDeltaPhi < locMinDeltaPhi)
3765 locMinDeltaPhi = locDeltaPhi;
3766 if(locOutermostRingFirstStrawHit != locOutermostRingLastStrawHit)
3768 locDeltaPhi = fabs(locInnermostRingLastStrawPhi - locOutermostRingLastStrawPhi);
3769 if(locDeltaPhi > M_PI)
3770 locDeltaPhi = fabs(locDeltaPhi -
M_TWO_PI);
3771 if(locDeltaPhi < locMinDeltaPhi)
3772 locMinDeltaPhi = locDeltaPhi;
3775 return locMinDeltaPhi;
3784 if(locStereoHits.empty())
3787 if(Find_ThetaZ_Regression(locFit, locStereoHits, locTheta, locZ, locChiSqPerNDF))
3789 double locThetaMin, locThetaMax;
3792 bool locThetaOKFlag = Find_Theta(locFit, locStereoHits, locTheta, locThetaMin, locThetaMax, locChiSqPerNDF);
3795 if(Find_Z(locFit, locStereoHits, locThetaMin, locThetaMax, locZ))
3802 locChiSqPerNDF = 9.9E8;
3808 double x = locStereoHits[0]->dStereoHitPos.X();
3809 double y = locStereoHits[0]->dStereoHitPos.Y();
3810 double tworc = 2.0*locFit->
r0;
3811 double ratio =
sqrt(x*x + y*y)/tworc;
3815 double tanl = (locStereoHits[0]->dStereoHitPos.Z() - locZ)/(tworc*asin(ratio));
3816 locTheta = M_PI_2 - atan(tanl);
3830 cout<<
"Finding theta and z via linear regression method."<<endl;
3832 if(locStereoHits.empty() || (!(locFit->
normal.Mag() > 0.0)))
3836 vector<intersection_t> intersections;
3837 for(
size_t m = 0; m < locStereoHits.size(); ++m)
3845 intersection.
perp2 = intersection.
x*intersection.
x + intersection.
y*intersection.
y;
3848 intersections.push_back(intersection);
3855 vector<double> arclengths(intersections.size());
3856 vector<double> ratios(intersections.size());
3857 double xc = locFit->
x0;
3858 double yc = locFit->
y0;
3859 double rc = locFit->
r0;
3860 double two_rc = 2.*rc;
3863 double myphi = atan2(yc, xc);
3864 double y0 = yc - rc*
sin(myphi);
3865 double x0 = xc - rc*cos(myphi);
3868 double diffx = intersections[0].x - x0;
3869 double diffy = intersections[0].y - y0;
3870 double chord =
sqrt(diffx*diffx + diffy*diffy);
3871 double ratio = chord/two_rc;
3872 double s = (ratio < 1.) ? two_rc*asin(ratio) : M_PI_2*two_rc;
3877 for(
size_t m = 1; m < arclengths.size(); ++m)
3879 diffx = intersections[m].x - intersections[m - 1].x;
3880 diffy = intersections[m].y - intersections[m - 1].y;
3881 chord =
sqrt(diffx*diffx + diffy*diffy);
3882 ratio = chord/two_rc;
3885 double ds = two_rc*asin(ratio);
3892 double tanl = 0.,z0 = 0.;
3893 if(arclengths.size() > 1)
3896 size_t n = fit.
n = intersections.size();
3898 fit.
var_s.resize(n);
3900 fit.
var_z.resize(n);
3904 double avg_var_s = 0., avg_var_z = 0.;
3905 double var_r = 1.6*1.6/12.;
3906 for (
size_t m = 0; m < n; ++m)
3908 fit.
s[m] = arclengths[m];
3909 fit.
var_s[m] = var_r/(1. - ratios[m]*ratios[m]);
3911 avg_var_s += fit.
var_s[m];
3912 avg_var_z += intersections[m].var_z;
3915 cout<<
"Using CDC hit "<<m<<
" z="<<intersections[m].z <<
" s=" << arclengths[m] <<endl;
3919 double scale2 = avg_var_s/avg_var_z;
3920 double scale =
sqrt(scale2);
3921 vector<double> weight(n);
3922 for (
size_t m = 0; m < n; ++m)
3924 fit.
z[m] = scale*intersections[m].z;
3925 fit.
var_z[m] = scale2*intersections[m].var_z;
3930 double sumv=0., sumx=0.;
3931 double sumy=0., sumxx=0., sumxy=0.;
3932 for(
size_t m = 0; m < n; ++m)
3935 double temp = 1./weight[m];
3937 sumx += arclengths[m]*
temp;
3938 sumy += fit.
z[m]*
temp;
3939 sumxx += arclengths[m]*arclengths[m]*
temp;
3940 sumxy += arclengths[m]*fit.
z[m]*
temp;
3942 double Delta = sumv*sumxx - sumx*sumx;
3943 if(!(fabs(Delta) > 0.0))
3946 tanl = (sumv*sumxy - sumx*sumy)/Delta;
3947 fit.
z0 = (sumxx*sumy - sumx*sumxy)/Delta;
3952 angle[1] = atan(tanl);
3956 for (
unsigned int m = 0; m < 3; ++m)
3957 ch[m] = fit.
ChiXY(angle[m]);
3963 locChiSqPerNDF = fit.
FindMinimumChisq(angle[0], angle[1], angle[2], lambda)/2.0;
3966 tanl = tan(lambda)/scale;
3971 tanl = (intersections[0].z - z0)/arclengths[0];
3972 locChiSqPerNDF = 9.9E9;
3975 locTheta = M_PI_2 - atan(tanl);
3986 if(locStereoHits.empty())
4000 unsigned int Nbins = 1000;
4002 for(
unsigned int i=0; i<
Nbins; ++i)
4004 double bin_width =
M_TWO_PI/(double)Nbins;
4005 double hist_low_limit = -M_PI;
4008 double r0 = locFit->
r0;
4009 for(
unsigned int i=0; i < locStereoHits.size(); ++i)
4017 double tmin = atan2(alpha, trkhit->
dStereoHitPos.Z() - VERTEX_Z_MIN);
4018 double tmax = atan2(alpha, trkhit->
dStereoHitPos.Z() - VERTEX_Z_MAX);
4028 cout<<
" -- tmin="<<tmin<<
" tmax="<<tmax<<endl;
4031 unsigned int imin = (
unsigned int)floor((tmin-hist_low_limit)/bin_width);
4032 unsigned int imax = (
unsigned int)floor((tmax-hist_low_limit)/bin_width);
4046 for(
unsigned int j=imin; j<=imax; ++j)
4051 unsigned int istart=0;
4052 unsigned int iend=0;
4053 for(
unsigned int i=1; i<
Nbins; ++i)
4055 if(hist[i]>hist[istart])
4059 cout<<
" -- istart="<<istart<<
" (theta="<<hist_low_limit + bin_width*(0.5+(double)istart)<<
" , N="<<hist[i]<<
")"<<endl;
4061 if(hist[i] == hist[istart])
4066 if(hist[istart] == 0)
4070 locThetaMin = hist_low_limit + bin_width*(0.5+(double)istart);
4071 locThetaMax = hist_low_limit + bin_width*(0.5+(double)iend);
4072 locTheta = (locThetaMax + locThetaMin)/2.0;
4074 cout<<
"istart="<<istart<<
" iend="<<iend<<
" theta_min="<<locThetaMin<<
" theta_max="<<locThetaMax<<endl;
4075 locChiSqPerNDF = 9.9E5;
4085 if(locStereoHits.empty())
4098 unsigned int Nbins = 300;
4100 for(
unsigned int i=0; i<
Nbins; ++i)
4102 double bin_width = 0.5;
4103 double hist_low_limit = 0.0;
4106 double r0 = locFit->
r0;
4107 double tan_alpha_min = tan(locThetaMin)/r0;
4108 double tan_alpha_max = tan(locThetaMax)/r0;
4109 for(
unsigned int i=0; i< locStereoHits.size(); ++i)
4114 double q_sign = locFit->
h > 0.0 ? +1.0:-1.0;
4126 cout<<
" -- zmin="<<zmin<<
" zmax="<<zmax<<endl;
4129 unsigned int imin = (
unsigned int)floor((zmin-hist_low_limit)/bin_width);
4130 unsigned int imax = (
unsigned int)floor((zmax-hist_low_limit)/bin_width);
4134 if(imax<=0 || imin>=Nbins)
4144 for(
unsigned int j=imin; j<=imax; ++j)
4149 unsigned int istart=0;
4150 unsigned int iend=0;
4151 for(
unsigned int i=1; i<
Nbins; ++i)
4153 if(hist[i]>hist[istart])
4157 cout<<
" -- istart="<<istart<<
" (z="<<hist_low_limit + bin_width*(0.5+(double)istart)<<
" , N="<<hist[i]<<
")"<<endl;
4159 if(hist[i] == hist[istart])
4164 if(hist[istart] == 0)
4168 double locZMin = hist_low_limit + bin_width*(0.5+(double)istart);
4169 double locZMax = hist_low_limit + bin_width*(0.5+(double)iend);
4170 locZ = (locZMax + locZMin)/2.0;
4172 cout<<
"istart="<<istart<<
" iend="<<iend<<
" z_min="<<locZMin<<
" z_max="<<locZMax<<
" hits[istart]="<<hist[istart]<<endl;
4185 vector<DCDCTrkHit*> locHits;
4186 locCDCSuperLayerSeed->
Get_Hits(locHits);
4187 for(
size_t loc_i = 0; loc_i < locHits.size(); ++loc_i)
4190 if(dStereoHitNumUsedMap[locCDCTrkHit] == 1)
4191 dCDCTrkHitPool_Available.push_back(locCDCTrkHit);
4193 --dStereoHitNumUsedMap[locCDCTrkHit];
4195 dCDCSuperLayerSeedPool_Available.push_back(locCDCSuperLayerSeed);
4203 if(locCDCTrackCircle->
fit != NULL)
4205 dHelicalFitPool_Available.push_back(locCDCTrackCircle->
fit);
4206 locCDCTrackCircle->
fit = NULL;
4208 locCDCTrackCircle->
Reset();
4209 dCDCTrackCirclePool_Available.push_back(locCDCTrackCircle);
4217 unsigned int locNumBits = 8*
sizeof(
unsigned int);
4218 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
4222 locCDCTrackCircle->
HitBitPattern.resize(dNumCDCHits/(8*
sizeof(
unsigned int)) + 1);
4223 vector<DCDCTrkHit*> locHits;
4227 for(
size_t loc_k = 0; loc_k < locHits.size(); ++loc_k)
4228 locCDCTrackCircle->
HitBitPattern[locHits[loc_k]->index/locNumBits] |= 1 << locHits[loc_k]->index % locNumBits;
4236 for(
size_t loc_k = 0; loc_k < locHits.size(); ++loc_k)
4237 locCDCTrackCircle->
HitBitPattern[locHits[loc_k]->index/locNumBits] |= 1 << locHits[loc_k]->index % locNumBits;
4245 for(
size_t loc_k = 0; loc_k < locHits.size(); ++loc_k)
4246 locCDCTrackCircle->
HitBitPattern[locHits[loc_k]->index/locNumBits] |= 1 << locHits[loc_k]->index % locNumBits;
4257 if(locCDCTrackCircles.empty())
4265 cout <<
"filter stereo, circles sorted by stereo chisq/ndf" << endl;
4266 Print_TrackCircles(locCDCTrackCircles);
4272 for(
size_t loc_i = 0; loc_i < (locCDCTrackCircles.size() - 1); ++loc_i)
4275 DCDCTrackCircle* locTrackCircle_ToCompareTo = locCDCTrackCircles[loc_i];
4276 vector<DCDCSuperLayerSeed*> locStereoSuperLayerSeeds;
4280 bool locSeedsStrippedFlag_AnyCircle =
false;
4281 for(
size_t loc_j = loc_i + 1; loc_j < locCDCTrackCircles.size(); ++loc_j)
4283 DCDCTrackCircle* locTrackCircle_Validating = locCDCTrackCircles[loc_j];
4286 bool locSeedsStrippedFlag =
false;
4287 for(
size_t loc_k = 0; loc_k < locStereoSuperLayerSeeds.size(); ++loc_k)
4292 unsigned int locSuperLayer = locStereoSuperLayerSeeds[loc_k]->dSuperLayer;
4293 unsigned int locSeedIndex = locStereoSuperLayerSeeds[loc_k]->dSeedIndex;
4295 if(locSuperLayerSeed == NULL)
4297 if((locSuperLayerSeed->
dSuperLayer != locSuperLayer) || (locSuperLayerSeed->
dSeedIndex != locSeedIndex))
4300 if(DEBUG_LEVEL > 10)
4301 cout <<
"strip SL" << locSuperLayer <<
" from track circle " << loc_j << endl;
4303 locSeedsStrippedFlag =
true;
4304 locSeedsStrippedFlag_AnyCircle =
true;
4306 if(locSeedsStrippedFlag)
4307 Select_CDCSuperLayerSeeds(locTrackCircle_Validating,
false);
4310 if(locSeedsStrippedFlag_AnyCircle)
4319 cout <<
"filter stereo, circles sorted by axial chisq/ndf" << endl;
4320 Print_TrackCircles(locCDCTrackCircles);
4330 cout <<
"Add unused hits" << endl;
4337 for(
size_t loc_i = 0; loc_i < locCDCTrackCircles.size(); ++loc_i)
4339 DCDCSuperLayerSeed* locLastSuperLayerSeed = locCDCTrackCircles[loc_i]->Get_LastSuperLayerSeed();
4340 unsigned int locLastSuperLayer = locLastSuperLayerSeed->
dSuperLayer;
4342 cout <<
"i, last super layer = " << loc_i <<
", " << locLastSuperLayer << endl;
4343 if(locLastSuperLayer == 7)
4345 unsigned int locSearchSuperLayer = locLastSuperLayer + 1;
4346 const DHelicalFit* locFit = locCDCTrackCircles[loc_i]->fit;
4349 double locSeedFirstPhi, locSeedLastPhi;
4350 Calc_SuperLayerPhiRange(locLastSuperLayerSeed, locSeedFirstPhi, locSeedLastPhi);
4351 bool locHitDensityTooHighFlag =
false;
4352 for(
size_t loc_k = 0; loc_k < dRejectedPhiRegions[locSearchSuperLayer].size(); ++loc_k)
4354 if(!Check_IfPhiRangesOverlap(locSeedFirstPhi, locSeedLastPhi, dRejectedPhiRegions[locSearchSuperLayer][loc_k].first, dRejectedPhiRegions[locSearchSuperLayer][loc_k].second))
4356 locHitDensityTooHighFlag =
true;
4359 if(locHitDensityTooHighFlag)
4362 cout <<
"hit density too high, don't add unused hits" << endl;
4367 int locLastHitRing = locLastSuperLayerSeed->
dCDCRingSeeds.back().ring;
4368 if((4*locLastSuperLayer - locLastHitRing) > MAX_NUM_RINGSEED_RINGS_SKIPABLE)
4371 cout <<
"too many rings missing at the end of the last super layer: actual, max = " << 4*locLastSuperLayer - locLastHitRing <<
", " << MAX_NUM_RINGSEED_RINGS_SKIPABLE << endl;
4376 if((locSearchSuperLayer == 1) || (locSearchSuperLayer == 4) || (locSearchSuperLayer == 7))
4377 locWireDirection = WIRE_DIRECTION_AXIAL;
4378 else if((locSearchSuperLayer == 2) || (locSearchSuperLayer == 6))
4379 locWireDirection = WIRE_DIRECTION_STEREOLEFT;
4381 locWireDirection = WIRE_DIRECTION_STEREORIGHT;
4385 int locAmbiguousHitRing = -1;
4386 double locBestDeltaPhi = 9.9E9;
4387 for(
size_t loc_j = 0; loc_j < cdchits_by_superlayer[locSearchSuperLayer - 1].size(); ++loc_j)
4389 DCDCTrkHit* locTrkHit = cdchits_by_superlayer[locSearchSuperLayer - 1][loc_j];
4390 if(locTrkHit->
flags & USED)
4392 if(locTrkHit->
hit->
wire->
ring == locAmbiguousHitRing)
4396 int locNumRingsSkipped = locTrkHit->
hit->
wire->
ring - locLastHitRing - 1;
4397 if(locNumRingsSkipped >
int(MAX_NUM_RINGSEED_RINGS_SKIPABLE))
4400 cout <<
"would skip too many rings: actual, max = " << locNumRingsSkipped <<
", " << MAX_NUM_RINGSEED_RINGS_SKIPABLE << endl;
4406 locRingSeed.
hits.push_back(locTrkHit);
4408 locRingSeed.
linked =
false;
4412 cout <<
"new hit isn't close to wires in previous seed" << endl;
4416 cout <<
"hit is close to wires in previous seed, ring = " << locTrkHit->
hit->
wire->
ring << endl;
4419 double locDeltaPhi = 9.9E9;
4420 if((locSearchSuperLayer == 4) || (locSearchSuperLayer == 7))
4424 double dx = locOrigin.x() - locFit->
x0;
4425 double dy = locOrigin.y() - locFit->
y0;
4426 double one_over_denom = 1.0/
sqrt(dx*dx + dy*dy);
4427 double x = locFit->
x0 + locFit->
r0*dx*one_over_denom;
4428 double y = locFit->
y0 + locFit->
r0*dy*one_over_denom;
4432 locDeltaPhi = fabs(locCirclePosition.Phi() - locOrigin.Phi());
4433 while(locDeltaPhi > M_PI)
4435 locDeltaPhi *= 180.0/M_PI;
4437 cout <<
"hit is axial, check if delta phi is close enough: " << fabs(locDeltaPhi) <<
", " << MAX_UNUSED_HIT_LINK_ANGLE << endl;
4438 if(fabs(locDeltaPhi) > MAX_UNUSED_HIT_LINK_ANGLE)
4444 if(locBestTrkHit == NULL)
4447 locBestTrkHit = locTrkHit;
4448 locBestDeltaPhi = locDeltaPhi;
4450 cout <<
"brand new track hit, delta phi = " << locBestDeltaPhi << endl;
4458 cout <<
"new hit not as good as the current best one" << endl;
4465 locAmbiguousHitRing = -1;
4466 locBestTrkHit = locTrkHit;
4467 locBestDeltaPhi = locDeltaPhi;
4469 cout <<
"new best track hit (better ring), delta phi = " << locBestDeltaPhi << endl;
4475 if((locSearchSuperLayer != 4) && (locSearchSuperLayer != 7))
4478 locAmbiguousHitRing = locBestTrkHit->
hit->
wire->
ring;
4479 locBestTrkHit = NULL;
4481 cout <<
"stereo, can't tell which hit is best, label ring " << locAmbiguousHitRing <<
" as ambiguous" << endl;
4486 if(locDeltaPhi >= locBestDeltaPhi)
4490 cout <<
"axial, not the best hit, phis = " << locDeltaPhi <<
", " << locBestDeltaPhi << endl;
4495 locBestTrkHit = locTrkHit;
4496 locBestDeltaPhi = locDeltaPhi;
4498 cout <<
"new best track hit (same ring), delta phi = " << locBestDeltaPhi << endl;
4500 if(locBestTrkHit == NULL)
4504 locBestTrkHit->
flags |= USED;
4506 locRingSeed.
hits.push_back(locBestTrkHit);
4508 locRingSeed.
linked =
true;
4512 locNewSuperLayerSeed->
dSuperLayer = locSearchSuperLayer;
4513 locNewSuperLayerSeed->
dSeedIndex = dSuperLayerSeeds[locSearchSuperLayer - 1].size();
4514 locNewSuperLayerSeed->
linked =
true;
4516 dSuperLayerSeeds[locSearchSuperLayer - 1].push_back(locNewSuperLayerSeed);
4517 locCDCTrackCircles[loc_i]->Add_LastSuperLayerSeed(locNewSuperLayerSeed);
4527 if(!Calc_PositionAndMomentum(locCDCTrackCircle, pos, mom))
4530 cout <<
"Track momentum not greater than zero (or NaN), DTrackCandidate object not created." << endl;
4536 locTrackCandidate->
rc=locCDCTrackCircle->
fit->
r0;
4537 locTrackCandidate->
xc=locCDCTrackCircle->
fit->
x0;
4538 locTrackCandidate->
yc=locCDCTrackCircle->
fit->
y0;
4540 locTrackCandidate->
setPID(locPID);
4542 locTrackCandidate->
Ndof = locCDCTrackCircle->
fit->
ndof;
4547 vector<DCDCTrkHit*> locHits;
4551 for(
size_t loc_j = 0; loc_j < locHits.size(); ++loc_j)
4553 locTrackCandidate->AddAssociatedObject(locHits[loc_j]->hit);
4564 for(
size_t loc_j = 0; loc_j < locHits.size(); ++loc_j)
4566 locTrackCandidate->AddAssociatedObject(locHits[loc_j]->hit);
4578 for(
size_t loc_j = 0; loc_j < locHits.size(); ++loc_j)
4580 locTrackCandidate->AddAssociatedObject(locHits[loc_j]->hit);
4587 cout<<
"Final Candidate parameters: p="<<mom.Mag()<<
" theta="<<mom.Theta()<<
" phi="<<mom.Phi()<<
" z="<<pos.Z()<<endl;
4589 _data.push_back(locTrackCandidate);
4600 double tanl = tan(M_PI_2 - locCDCTrackCircle->
dTheta);
4607 double xc = locCDCTrackCircle->
fit->
x0;
4608 double yc = locCDCTrackCircle->
fit->
y0;
4609 double rc = locCDCTrackCircle->
fit->
r0;
4613 double xc2_plus_yc2 = xc2 + yc2;
4616 double a = (r2 - xc2_plus_yc2 - rc2)/(2.*rc);
4617 double temp1 = yc*
sqrt(xc2_plus_yc2 - a*a);
4618 double temp2 = xc*a;
4619 double cosphi_plus = (temp2 + temp1)/xc2_plus_yc2;
4620 double cosphi_minus = (temp2 - temp1)/xc2_plus_yc2;
4623 if(!isfinite(temp1) || !isfinite(temp2))
4627 double my_seed_phi = locCDCTrackCircle->
fit->
phi;
4628 double my_center_phi = atan2(yc,xc);
4629 double xv = xc - rc*cos(my_center_phi);
4630 double yv = yc - rc*
sin(my_center_phi);
4631 pos.SetXYZ(xv, yv, locCDCTrackCircle->
dVertexZ);
4633 double pt = 0.003*fabs(dMagneticField->GetBz(pos.x(), pos.y(), pos.z()))*rc;
4634 mom.SetXYZ(pt*cos(my_seed_phi), pt*
sin(my_seed_phi), pt*tanl);
4635 return (mom.Mag() > 0.0);
4639 double phi_plus = -acos(cosphi_plus);
4640 double phi_minus = -acos(cosphi_minus);
4641 double x_plus = xc + rc*cosphi_plus;
4642 double x_minus = xc + rc*cosphi_minus;
4643 double y_plus = yc + rc*
sin(phi_plus);
4644 double y_minus = yc + rc*
sin(phi_minus);
4649 double r2_plus = x_plus*x_plus + y_plus*y_plus;
4650 double r2_minus = x_minus*x_minus + y_minus*y_minus;
4651 if(fabs(r2 - r2_plus) >
EPS)
4654 y_plus = yc + rc*
sin(phi_plus);
4656 if(fabs(r2 - r2_minus) >
EPS)
4659 y_minus = yc + rc*
sin(phi_minus);
4671 double dx = x_minus - xwire;
4672 double dy = y_minus - ywire;
4673 double d2_minus = dx*dx + dy*dy;
4674 dx = x_plus - xwire;
4675 dy = y_plus - ywire;
4676 double d2_plus = dx*dx + dy*dy;
4677 if(d2_plus > d2_minus)
4680 if(locCDCTrackCircle->
fit->
h < 0)
4682 double myphi = atan2(yc, xc);
4683 double xv = xc - rc*cos(myphi);
4684 double yv = yc - rc*
sin(myphi);
4685 double dx = x_minus - xv;
4686 double dy = y_minus - yv;
4687 double chord =
sqrt(dx*dx + dy*dy);
4688 double two_rc = 2.*rc;
4689 double ratio = chord/two_rc;
4690 double ds = (ratio < 1.) ? (two_rc*asin(ratio)) : (two_rc*M_PI_2);
4691 pos.SetXYZ(x_minus, y_minus, locCDCTrackCircle->
dVertexZ + ds*tanl);
4693 double pt = 0.003*fabs(dMagneticField->GetBz(pos.x(), pos.y(), pos.z()))*rc;
4694 mom.SetXYZ(pt*
sin(phi_minus), pt*cos(phi_minus), pt*tanl);
4699 if(locCDCTrackCircle->
fit->
h < 0)
4701 double myphi = atan2(yc, xc);
4702 double xv = xc - rc*cos(myphi);
4703 double yv = yc - rc*
sin(myphi);
4704 double dx = x_plus - xv;
4705 double dy = y_plus - yv;
4706 double chord =
sqrt(dx*dx + dy*dy);
4707 double two_rc = 2.*rc;
4708 double ratio = chord/two_rc;
4709 double ds = (ratio < 1.) ? (two_rc*asin(ratio)) : (two_rc*M_PI_2);
4710 pos.SetXYZ(x_plus, y_plus, locCDCTrackCircle->
dVertexZ + ds*tanl);
4712 double pt =0.003*fabs(dMagneticField->GetBz(pos.x(), pos.y(), pos.z()))*rc;
4713 mom.SetXYZ(pt*
sin(phi_plus), pt*cos(phi_plus), pt*tanl);
4715 return (mom.Mag() > 0.0);
4732 for(
size_t loc_i = 0; loc_i < dCDCTrkHitPool_All.size(); ++loc_i)
4733 delete dCDCTrkHitPool_All[loc_i];
4735 for(
size_t loc_i = 0; loc_i < dCDCSuperLayerSeedPool_All.size(); ++loc_i)
4736 delete dCDCSuperLayerSeedPool_All[loc_i];
4738 for(
size_t loc_i = 0; loc_i < dHelicalFitPool_All.size(); ++loc_i)
4739 delete dHelicalFitPool_All[loc_i];
4741 for(
size_t loc_i = 0; loc_i < dCDCTrackCirclePool_All.size(); ++loc_i)
4742 delete dCDCTrackCirclePool_All[loc_i];
4753 dStereoHitPos.SetXYZ(0.0, 0.0, 0.0);
4755 dValidStereoHitPosFlag =
false;
4763 dSpiralLinkParams.clear();
4764 dCDCRingSeeds.clear();
4769 vector<DCDCTrkHit*> locRingHits;
4770 for(
size_t loc_i = 0; loc_i < dCDCRingSeeds.size(); ++loc_i)
4772 if(dCDCRingSeeds[loc_i].ring != locRing)
4774 locRingHits = dCDCRingSeeds[loc_i].hits;
4778 vector<DCDCTrkHit*> locRingHits_CompareTo;
4779 for(
size_t loc_i = 0; loc_i < locCDCSuperLayerSeed->
dCDCRingSeeds.size(); ++loc_i)
4781 if(locCDCSuperLayerSeed->
dCDCRingSeeds[loc_i].ring != locRing)
4783 locRingHits_CompareTo = locCDCSuperLayerSeed->
dCDCRingSeeds[loc_i].hits;
4787 return (locRingHits == locRingHits_CompareTo);
4792 dSuperLayerSeeds_Axial.clear();
4793 dSuperLayerSeeds_InnerStereo.clear();
4794 dSuperLayerSeeds_OuterStereo.clear();
4796 dWeightedChiSqPerDF = 0.0;
4797 dWeightedChiSqPerDF_Stereo = 0.0;
4798 dAverageDriftTime = 0.0;
4799 HitBitPattern.clear();
4802 dSpiralTurnRing = -1;
4803 dTruncationSourceCircles.clear();
4804 dHasNonTruncatedSeedsFlag_InnerStereo =
false;
4805 dHasNonTruncatedSeedsFlag_OuterStereo =
false;
4812 if(!dSuperLayerSeeds_Axial.empty())
4814 locLastAxialSuperLayerSeed = dSuperLayerSeeds_Axial.back();
4816 return locLastAxialSuperLayerSeed;
4818 if(!dSuperLayerSeeds_OuterStereo.empty())
4820 DCDCSuperLayerSeed* locLastOuterStereoSuperLayerSeed = dSuperLayerSeeds_OuterStereo[0].back();
4821 if(locLastOuterStereoSuperLayerSeed != NULL){
4822 if(locLastAxialSuperLayerSeed == NULL)
return locLastOuterStereoSuperLayerSeed;
4824 return locLastOuterStereoSuperLayerSeed;
4826 return locLastAxialSuperLayerSeed;
4830 if(!dSuperLayerSeeds_InnerStereo.empty())
4832 DCDCSuperLayerSeed* locLastInnerStereoSuperLayerSeed = dSuperLayerSeeds_InnerStereo[0].back();
4833 if(locLastInnerStereoSuperLayerSeed != NULL){
4834 if(locLastAxialSuperLayerSeed == NULL)
return locLastInnerStereoSuperLayerSeed;
4836 return locLastInnerStereoSuperLayerSeed;
4838 return locLastAxialSuperLayerSeed;
4842 return locLastAxialSuperLayerSeed;
4848 if((locSuperLayer == 1) || (locSuperLayer == 4) || (locSuperLayer == 7))
4850 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds_Axial.size(); ++loc_i)
4852 if(dSuperLayerSeeds_Axial[loc_i]->dSuperLayer == locSuperLayer)
4853 return dSuperLayerSeeds_Axial[loc_i];
4857 else if((locSuperLayer == 2) || (locSuperLayer == 3))
4859 if(dSuperLayerSeeds_InnerStereo.empty())
4861 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds_InnerStereo[0].size(); ++loc_i)
4863 if(dSuperLayerSeeds_InnerStereo[0][loc_i]->dSuperLayer == locSuperLayer)
4864 return dSuperLayerSeeds_InnerStereo[0][loc_i];
4869 if(!dSuperLayerSeeds_OuterStereo.empty())
4871 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds_OuterStereo[0].size(); ++loc_i)
4873 if(dSuperLayerSeeds_OuterStereo[0][loc_i]->dSuperLayer == locSuperLayer)
4874 return dSuperLayerSeeds_OuterStereo[0][loc_i];
4877 if(!dSuperLayerSeeds_InnerStereo.empty())
4879 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds_InnerStereo[0].size(); ++loc_i)
4881 if(dSuperLayerSeeds_InnerStereo[0][loc_i]->dSuperLayer == locSuperLayer)
4882 return dSuperLayerSeeds_InnerStereo[0][loc_i];
4892 vector<DCDCSuperLayerSeed*>::iterator locIterator;
4893 if(!dSuperLayerSeeds_OuterStereo.empty())
4895 for(locIterator = dSuperLayerSeeds_OuterStereo[0].begin(); locIterator != dSuperLayerSeeds_OuterStereo[0].end(); ++locIterator)
4897 if((*locIterator)->dSuperLayer != locSuperLayer)
4899 dSuperLayerSeeds_OuterStereo[0].erase(locIterator);
4900 if(dSuperLayerSeeds_OuterStereo[0].empty())
4901 dSuperLayerSeeds_OuterStereo.clear();
4905 if(!dSuperLayerSeeds_InnerStereo.empty())
4907 for(locIterator = dSuperLayerSeeds_InnerStereo[0].begin(); locIterator != dSuperLayerSeeds_InnerStereo[0].end(); ++locIterator)
4909 if((*locIterator)->dSuperLayer != locSuperLayer)
4911 dSuperLayerSeeds_InnerStereo[0].erase(locIterator);
4912 if(dSuperLayerSeeds_InnerStereo[0].empty())
4913 dSuperLayerSeeds_InnerStereo.clear();
4922 unsigned int locSuperLayer = locSuperLayerSeed->
dSuperLayer;
4923 if((locSuperLayer == 1) || (locSuperLayer == 4) || (locSuperLayer == 7))
4924 dSuperLayerSeeds_Axial.push_back(locSuperLayerSeed);
4925 else if((locSuperLayer == 2) || (locSuperLayer == 3))
4927 if(dSuperLayerSeeds_InnerStereo.empty())
4928 dSuperLayerSeeds_InnerStereo.resize(1);
4929 dSuperLayerSeeds_InnerStereo[0].push_back(locSuperLayerSeed);
4933 unsigned int locLastAxialLayer = dSuperLayerSeeds_Axial.empty() ? 0 : dSuperLayerSeeds_Axial.back()->dSuperLayer;
4934 if(dSuperLayerSeeds_InnerStereo.empty() || (locLastAxialLayer == 4))
4936 if(dSuperLayerSeeds_OuterStereo.empty())
4937 dSuperLayerSeeds_OuterStereo.resize(1);
4938 dSuperLayerSeeds_OuterStereo[0].push_back(locSuperLayerSeed);
4941 dSuperLayerSeeds_InnerStereo[0].push_back(locSuperLayerSeed);
4949 for(
size_t loc_i = 0; loc_i < dSuperLayerSeeds_Axial.size(); ++loc_i)
4951 if(dSuperLayerSeeds_Axial[loc_i]->dSuperLayer <= locNewLastSuperLayer)
4953 ((loc_i == 0) ? dSuperLayerSeeds_Axial.clear() : dSuperLayerSeeds_Axial.resize(loc_i));
4958 vector<vector<DCDCSuperLayerSeed*> >::iterator locIterator, locIterator2;
4959 if(locNewLastSuperLayer < 5)
4960 dSuperLayerSeeds_OuterStereo.clear();
4961 else if(locNewLastSuperLayer < 7)
4963 bool locClippedEveryStereoSeedFlag =
true;
4964 for(locIterator = dSuperLayerSeeds_OuterStereo.begin(); locIterator != dSuperLayerSeeds_OuterStereo.end();)
4966 vector<DCDCSuperLayerSeed*>& locSeedSeries = *locIterator;
4967 bool locClippedstereoSeriesFlag =
false;
4968 for(
size_t loc_j = 0; loc_j < locSeedSeries.size(); ++loc_j)
4970 if(locSeedSeries[loc_j]->dSuperLayer <= locNewLastSuperLayer)
4972 locClippedstereoSeriesFlag =
true;
4975 locSeedSeries.clear();
4978 locSeedSeries.resize(loc_j);
4980 for(locIterator2 = dSuperLayerSeeds_OuterStereo.begin(); locIterator2 != dSuperLayerSeeds_OuterStereo.end(); ++locIterator2)
4982 if(locIterator2 == locIterator)
4984 vector<DCDCSuperLayerSeed*>& locSeedSeries2 = *locIterator2;
4985 if(locSeedSeries == locSeedSeries2)
4987 locSeedSeries.clear();
4993 if(!locClippedstereoSeriesFlag)
4994 locClippedEveryStereoSeedFlag =
false;
4995 (locSeedSeries.empty() ? (locIterator = dSuperLayerSeeds_OuterStereo.erase(locIterator)) : ++locIterator);
4997 if(locClippedEveryStereoSeedFlag)
4998 dHasNonTruncatedSeedsFlag_OuterStereo =
false;
5002 if(locNewLastSuperLayer < 2)
5004 dSuperLayerSeeds_InnerStereo.clear();
5007 else if(locNewLastSuperLayer < 7)
5009 bool locClippedEveryStereoSeedFlag =
true;
5010 for(locIterator = dSuperLayerSeeds_InnerStereo.begin(); locIterator != dSuperLayerSeeds_InnerStereo.end();)
5012 vector<DCDCSuperLayerSeed*>& locSeedSeries = *locIterator;
5013 bool locClippedstereoSeriesFlag =
false;
5014 for(
size_t loc_j = 0; loc_j < locSeedSeries.size(); ++loc_j)
5016 if(locSeedSeries[loc_j]->dSuperLayer <= locNewLastSuperLayer)
5018 locClippedstereoSeriesFlag =
true;
5021 locSeedSeries.clear();
5024 locSeedSeries.resize(loc_j);
5026 for(locIterator2 = dSuperLayerSeeds_InnerStereo.begin(); locIterator2 != dSuperLayerSeeds_InnerStereo.end(); ++locIterator2)
5028 if(locIterator2 == locIterator)
5030 vector<DCDCSuperLayerSeed*>& locSeedSeries2 = *locIterator2;
5031 if(locSeedSeries == locSeedSeries2)
5033 locSeedSeries.clear();
5039 if(!locClippedstereoSeriesFlag)
5040 locClippedEveryStereoSeedFlag =
false;
5041 (locSeedSeries.empty() ? (locIterator = dSuperLayerSeeds_InnerStereo.erase(locIterator)) : ++locIterator);
5043 if(locClippedEveryStereoSeedFlag)
5044 dHasNonTruncatedSeedsFlag_InnerStereo =
false;
5054 bool locComboAlreadyPresentFlag =
false;
5055 for(
size_t loc_j = 0; loc_j < dSuperLayerSeeds_InnerStereo.size(); ++loc_j)
5057 if(locSeedSeries == dSuperLayerSeeds_InnerStereo[loc_j])
5059 locComboAlreadyPresentFlag =
true;
5062 else if((locSeedSeries.size() == 1) && (locSeedSeries[0] == dSuperLayerSeeds_InnerStereo[loc_j][0]))
5064 locComboAlreadyPresentFlag =
true;
5068 if(!locComboAlreadyPresentFlag)
5069 dSuperLayerSeeds_InnerStereo.push_back(locSeedSeries);
5075 bool locComboAlreadyPresentFlag =
false;
5076 for(
size_t loc_j = 0; loc_j < dSuperLayerSeeds_OuterStereo.size(); ++loc_j)
5078 if(locSeedSeries == dSuperLayerSeeds_OuterStereo[loc_j])
5080 locComboAlreadyPresentFlag =
true;
5083 else if((locSeedSeries.size() == 1) && (locSeedSeries[0] == dSuperLayerSeeds_OuterStereo[loc_j][0]))
5085 locComboAlreadyPresentFlag =
true;
5089 if(!locComboAlreadyPresentFlag)
5090 dSuperLayerSeeds_OuterStereo.push_back(locSeedSeries);
5094 dHasNonTruncatedSeedsFlag_InnerStereo =
true;
5096 dHasNonTruncatedSeedsFlag_OuterStereo =
true;
5100 bool locIsAlreadyTruncationSourceFlag =
false;
5101 for(
size_t loc_j = 0; loc_j < dTruncationSourceCircles.size(); ++loc_j)
5105 locIsAlreadyTruncationSourceFlag =
true;
5108 if(!locIsAlreadyTruncationSourceFlag)
5126 if(Get_SuperLayerSeed(locSuperLayerSeed->
dSuperLayer) != locSuperLayerSeed)
5144 locStereoSuperLayerSeeds.clear();
5145 if(!dSuperLayerSeeds_InnerStereo.empty())
5146 locStereoSuperLayerSeeds = dSuperLayerSeeds_InnerStereo[0];
5147 if(!dSuperLayerSeeds_OuterStereo.empty())
5148 locStereoSuperLayerSeeds.insert(locStereoSuperLayerSeeds.begin(), dSuperLayerSeeds_OuterStereo[0].begin(), dSuperLayerSeeds_OuterStereo[0].end());
5154 unsigned int locNumStereoSuperLayerSeeds = 0;
5155 if(!dSuperLayerSeeds_InnerStereo.empty())
5156 locNumStereoSuperLayerSeeds += dSuperLayerSeeds_InnerStereo[0].
size();
5157 if(!dSuperLayerSeeds_OuterStereo.empty())
5158 locNumStereoSuperLayerSeeds += dSuperLayerSeeds_OuterStereo[0].
size();
5159 return locNumStereoSuperLayerSeeds;
5170 double tanl=tan(lambda);
5171 double sumw=0.,avg_s=0.,avg_z=0.,my_chi2=0.;
5172 for (
unsigned i=0;i<n;i++){
5173 w[i]=1./(tanl*tanl*var_s[i]+var_z[i]);
5180 z0=avg_z-tanl*avg_s;
5181 for (
unsigned int i=0;i<n;i++){
5182 double temp=z[i]-z0-tanl*s[i];
5183 my_chi2+=w[i]*temp*
temp;
5190 #define SHFT(w,x,y,z) (w)=(x);(x)=(y);(y)=(z)
5191 #define SIGN(x,y) ((y)>=0.0 ? fabs(x):-fabs(x))
5194 const double GOLD=1.618034;
5195 const double GLIMIT=100.0;
5202 SHFT(dummy,a,b,dummy);
5203 SHFT(dummy,chi2b,chi2a,dummy);
5207 while (chi2b>chi2c){
5208 double r=(b-a)*(chi2b-chi2c);
5209 double q=(b-
c)*(chi2b-chi2a);
5210 double q_minus_r=q-r;
5211 double fabs_q_minus_r=fabs(q_minus_r);
5212 double max=(fabs_q_minus_r>1.e-20)?fabs_q_minus_r:1.
e-20;
5213 double u=b-((b-
c)*q-(b-a)*r)/(2.*
SIGN(max,q_minus_r));
5214 double ulim=b+GLIMIT*(c-b);
5215 if ((b-u)*(u-
c)>0.0){
5224 else if (chi2u>chi2b){
5232 else if ((c-u)*(u-ulim)>0.0){
5235 SHFT(b,c,u,c+GOLD*(c-b));
5236 SHFT(chi2b,chi2c,chi2u,ChiXY(u));
5239 else if ((u-ulim)*(ulim-c)>=0.0){
5248 SHFT(chi2a,chi2b,chi2c,chi2u);
5256 const double CGOLD=0.3819660;
5257 double a=(ax<cx)?ax:cx;
5258 double b=(ax>cx)?ax:cx;
5259 double x=bx,w=bx,v=bx;
5260 double fx=ChiXY(x),fv=fx,fw=fx,fu=0.;
5261 double tol=1
e-3,err=0.0,d=0.,
u=0.;
5262 for (
int iter=1;iter<=100;iter++){
5263 double xm=0.5*(a+b);
5264 double tol1=tol*fabs(x)+1
e-10;
5265 double tol2=2.0*tol1;
5266 if (fabs(x-xm)<=(tol2-0.5*(b-a))){
5270 if (fabs(err)>tol1){
5271 double r=(x-w)*(fx-fv);
5272 double q=(x-v)*(fx-fw);
5273 double p=(x-v)*q-(x-w)*r;
5279 if (fabs(p)>=fabs(0.5*q*etemp) || p<=q*(a-x)|| p>=q*(b-x)){
5280 d=CGOLD*(err=(x>=xm ? a-x : b-
x));
5285 if (
u-a < tol2 || b-
u < tol2) d=
SIGN(tol1,xm-x);
5288 d=CGOLD*(err=(x>=xm ? a-x : b-
x ));
5290 u=(fabs(d)>=tol1 ? x+d : x+
SIGN(tol1,d));
5301 if (fu<=fw || w==x){
5307 else if (fu<=fv || v==x || v==w){
unsigned char dSuperLayer
float dWeightedChiSqPerDF
bool SearchFor_SpiralTurn_TwoSeedsSharingFewHits(DCDCSuperLayerSeed *locSuperLayerSeed1, DCDCSuperLayerSeed *locSuperLayerSeed2)
void setMomentum(const DVector3 &aMomentum)
void Calc_SuperLayerPhiRange(DCDCSuperLayerSeed *locSuperLayerSeed, double &locSeedFirstPhi, double &locSeedLastPhi)
bool Find_Theta(const DHelicalFit *locFit, const vector< DCDCTrkHit * > &locStereoHits, double &locTheta, double &locThetaMin, double &locThetaMax, double &locChiSqPerNDF)
DCDCSuperLayerSeed * Get_SuperLayerSeed(unsigned int locSuperLayer) const
float dWeightedChiSqPerDF_Stereo
jerror_t Get_CDCHits(JEventLoop *loop)
jerror_t init(void)
Called once at program start.
void Filter_TrackCircles_Stereo(vector< DCDCTrackCircle * > &locCDCTrackCircles)
bool Check_IfInputIsSubset(const DCDCTrackCircle *locTrackCircle)
bool dValidStereoHitPosFlag
void Truncate_Circle(unsigned int locNewLastSuperLayer)
bool SearchFor_SpiralTurn_MissingOrBetweenRings(DCDCSuperLayerSeed *locSuperLayerSeed1, DCDCSuperLayerSeed *locSuperLayerSeed2)
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
jerror_t brun(JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
jerror_t fini(void)
Called after last event of last event source has been processed.
bool SearchFor_SpiralTurn_ManyHitsAdjacentRing(DCDCSuperLayerSeed *locSuperLayerSeed1, DCDCSuperLayerSeed *locSuperLayerSeed2, int locRingToCheck, int locMinStrawsAdjacentRing, int &locMaxSpiralNumHits)
bool Check_IfShouldAttemptLink(const DCDCSuperLayerSeed *locSuperLayerSeed, bool locInnerSeedFlag)
bool Link_SuperLayers(vector< DCDCTrackCircle * > &locCDCTrackCircles, unsigned int locOuterSuperLayer)
signed char dSpiralTurnRing
void Create_TrackCandidiate(DCDCTrackCircle *locCDCTrackCircle)
vector< const DCDCTrackCircle * > dTruncationSourceCircles
bool Find_Z(const DHelicalFit *locFit, const vector< DCDCTrkHit * > &locStereoHits, double locThetaMin, double locThetaMax, double &locZ)
DCDCSuperLayerSeed * Create_NewStereoSuperLayerSeed(DCDCSuperLayerSeed *locCDCSuperLayerSeed, const DCDCTrackCircle *locCDCTrackCircle, map< DCDCTrkHit *, DCDCTrkHit * > &locProjectedStereoHitMap)
vector< vector< DCDCSuperLayerSeed * > > dSuperLayerSeeds_InnerStereo
vector< vector< DCDCSuperLayerSeed * > > dSuperLayerSeeds_OuterStereo
jerror_t FitCircleRiemann(float rc=0.)
DCDCTrkHit * Get_Resource_CDCTrkHit(void)
double ChiXY(double lambda)
vector< DCDCTrkHit * > hits
void Add_UnusedHits(vector< DCDCTrackCircle * > &locCDCTrackCircles)
static char index(char c)
void Reject_SuperLayerSeeds_HighSeedDensity(unsigned int locSuperLayer)
void Handle_StereoAndFilter(vector< DCDCTrackCircle * > &locCDCTrackCircles, bool locFinalPassFlag)
bool GetCDCWires(vector< vector< DCDCWire * > > &cdcwires) const
wire_direction_t dWireOrientation
jerror_t AddHitXYZ(float x, float y, float z)
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
void Print_TrackCircle(DCDCTrackCircle *locCDCTrackCircle)
vector< DCDCRingSeed > dCDCRingSeeds
void Get_AllStereoSuperLayerSeeds(vector< DCDCSuperLayerSeed * > &locStereoSuperLayerSeeds)
void Link_RingSeeds(vector< DCDCRingSeed * > &parent, ringiter ring, ringiter ringend, unsigned int locSuperLayer, unsigned int locNumPreviousRingsWithoutHit)
void Recycle_DCDCSuperLayerSeed(DCDCSuperLayerSeed *locCDCSuperLayerSeed)
DCDCTrackCircle * Get_Resource_CDCTrackCircle(void)
void Strip_StereoSuperLayerSeed(unsigned int locSuperLayer)
void Calc_StereoHitDeltaPhis(unsigned int locSuperLayer, vector< DCDCTrkHit * > &locHits, const DCDCTrackCircle *locCDCTrackCircle, vector< pair< DCDCTrkHit *, double > > &locDeltaPhis)
vector< unsigned int > HitBitPattern
void Link_SuperLayers_FromAxial(vector< DCDCTrackCircle * > &locCDCTrackCircles, unsigned int locOuterSuperLayer, unsigned int locInnerSuperLayer)
vector< int > used_cdc_indexes
bool CDCSortByChiSqPerNDFDecreasing(const DTrackCandidate_factory_CDC::DCDCTrackCircle *locTrackCircle1, const DTrackCandidate_factory_CDC::DCDCTrackCircle *locTrackCircle2)
void Print_TrackCircles(vector< DCDCTrackCircle * > &locCDCTrackCircles)
bool CDCSortByStereoChiSqPerNDFIncreasing(const DTrackCandidate_factory_CDC::DCDCTrackCircle *locTrackCircle1, const DTrackCandidate_factory_CDC::DCDCTrackCircle *locTrackCircle2)
vector< DCDCSuperLayerSeed * > dSuperLayerSeeds_Axial
jerror_t GuessChargeFromCircleFit(void)
double Dist2(DCDCTrkHit *trkhit) const
bool Calc_PositionAndMomentum(DCDCTrackCircle *locCDCTrackCircle, DVector3 &pos, DVector3 &mom)
bool CDCSort_Intersections(const DTrackCandidate_factory_CDC::intersection_t &locIntersection1, const DTrackCandidate_factory_CDC::intersection_t &locIntersection2)
bool Check_IfPhiRangesOverlap(double locFirstSeedPhi, double locLastSeedPhi, double locTargetFirstPhi, double locTargetLastPhi)
bool Are_AllHitsOnRingShared(const DCDCSuperLayerSeed *locCDCSuperLayerSeed, int locRing) const
DGeometry * GetDGeometry(unsigned int run_number)
void Get_Hits(vector< DCDCTrkHit * > &locHits) const
void Create_NewCDCSuperLayerSeeds(DCDCTrackCircle *locCDCTrackCircle)
bool Calc_StereoPosition(const DCDCWire *wire, const DHelicalFit *fit, DVector3 &pos, double &var_z, double &locPhiStereo, double d=0.0)
void Add_LastSuperLayerSeed(DCDCSuperLayerSeed *locSuperLayerSeed)
void Recycle_DCDCTrackCircle(DCDCTrackCircle *locCDCTrackCircle)
bool SearchFor_SpiralTurn_TwoSeedsSharingManyHits(DCDCSuperLayerSeed *locSuperLayerSeed1, DCDCSuperLayerSeed *locSuperLayerSeed2)
void Truncate_TrackCircles(vector< DCDCTrackCircle * > &locCDCTrackCircles)
void Drop_IncompleteGroups(vector< DCDCTrackCircle * > &locCDCTrackCircles)
void Set_SpiralLinkParams(void)
void Find_SuperLayerSeeds(vector< DCDCTrkHit * > &locSuperLayerHits, unsigned int locSuperLayer)
bool Build_TrackCircles(vector< DCDCTrackCircle * > &locCDCTrackCircles)
int bitcount(unsigned int n)
void Reject_DefiniteSpiralArms(vector< DCDCTrackCircle * > &locCDCTrackCircles)
<A href="index.html#legend"> <IMG src="CORE.png" width="100"> </A>
void setPID(Particle_t locPID)
void Print_SuperLayerSeeds(void)
signed char dDefiniteSpiralTurnRingFlag
DVector3 Find_IntersectionBetweenSuperLayers(const DCDCSuperLayerSeed *locInnerSuperLayerSeed, const DCDCSuperLayerSeed *locOuterSuperLayerSeed)
bool Link_SuperLayers_FromStereo_ToAxial(vector< DCDCTrackCircle * > &locCDCTrackCircles, unsigned int locOuterSuperLayer, unsigned int locInnerSuperLayer)
float chisq
Chi-squared for the track (not chisq/dof!)
void FindSenseOfRotation(void)
jerror_t evnt(JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
jerror_t FitCircleStraightTrack()
double FindMinimumChisq(double a, double b, double c, double &lambda)
vector< vector< DCDCRingSeed > >::iterator ringiter
bool Attempt_SeedLink(DCDCSuperLayerSeed *locSuperLayerSeed1, DCDCSuperLayerSeed *locSuperLayerSeed2)
DCDCSuperLayerSeed * Get_Resource_CDCSuperLayerSeed(void)
DCDCSuperLayerSeed * Get_LastSuperLayerSeed(void) const
void BracketMinimumChisq(double &a, double &b, double &c, double &chi2a, double &chi2b, double &chi2c)
void Absorb_TrackCircle(const DCDCTrackCircle *locTrackCircle)
bool Find_ThetaZ_Regression(const DHelicalFit *locFit, const vector< DCDCTrkHit * > &locStereoHits, double &locTheta, double &locZ, double &locChiSqPerNDF)
unsigned int Get_NumStereoSuperLayerSeeds(void)
bool Select_CDCSuperLayerSeeds(DCDCTrackCircle *locCDCTrackCircle, bool locFinalPassFlag)
bool dHasNonTruncatedSeedsFlag_InnerStereo
bool Find_ThetaZ(const DHelicalFit *locFit, const vector< DCDCTrkHit * > &locStereoHits, double &locTheta, double &locZ, double &locChiSqPerNDF)
void Set_HitBitPattern_All(vector< DCDCTrackCircle * > &locCDCTrackCircles)
bool dHasNonTruncatedSeedsFlag_OuterStereo
void Select_ThetaZStereoHits(const DCDCTrackCircle *locCDCTrackCircle, int locInnerSeedSeriesIndex, int locOuterSeedSeriesIndex, bool locFinalPassFlag, vector< DCDCTrkHit * > &locComboHits)
bool SearchFor_SpiralTurn_SingleSeed(DCDCSuperLayerSeed *locSuperLayerSeed)
DHelicalFit * Get_Resource_HelicalFit(void)
int Ndof
Number of degrees of freedom in the fit.
void Fit_Circles(vector< DCDCTrackCircle * > &locCDCTrackCircles, bool locFitOnlyIfNullFitFlag, bool locAddStereoLayerIntersectionsFlag, bool locFitDuringLinkingFlag=false)
signed char dSpiralTurnRingFlag
void Set_HitBitPattern_Axial(vector< DCDCTrackCircle * > &locCDCTrackCircles)
signed char dSpiralTurnRing
bool CDCSort_DeltaPhis(const pair< DTrackCandidate_factory_CDC::DCDCTrkHit *, double > &locDeltaPhiPair1, const pair< DTrackCandidate_factory_CDC::DCDCTrkHit *, double > &locDeltaPhiPair2)
void setPosition(const DVector3 &aPosition)
double MinDist2(const DCDCRingSeed &locInnerRingSeed, const DCDCRingSeed &locOuterRingSeed)
void Link_SuperLayers_FromStereo_ToStereo(vector< DCDCTrackCircle * > &locCDCTrackCircles, unsigned int locOuterSuperLayer, unsigned int locInnerSuperLayer)
bool GetTargetZ(double &z_target) const
z-location of center of target
void Filter_TrackCircles_Axial(vector< DCDCTrackCircle * > &locCDCTrackCircles)
bool CDCSortByRdecreasing(const DTrackCandidate_factory_CDC::DCDCTrkHit *hit1, const DTrackCandidate_factory_CDC::DCDCTrkHit *hit2)
double MinDeltaPhi(const vector< DCDCTrkHit * > &locInnerSeedHits, const vector< DCDCTrkHit * > &locOuterSeedHits)
~DTrackCandidate_factory_CDC()
map< int, DSpiralParams_t > dSpiralLinkParams