#include <TBuilder.h>
Public Member Functions | |
TBuilder (const std::string &name, float maxSigma, float maxSigmaStereo, float salvageLevel, float szSegmentDistance, float szLinkDistance, unsigned fittingFlag) | |
Constructor with salvage level. | |
virtual | ~TBuilder () |
Destructor. | |
const std::string & | name (void) const |
returns name. | |
void | dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const |
dumps debug information. | |
TTrack * | buildRphi (const AList< TMLink > &) const |
builds a r/phi track from TMLinks or from Segments. | |
TTrack * | buildRphi (const AList< TSegment > &) const |
TTrack * | buildStereoNew (const TTrack &t, AList< TSegment > &goodSegments, AList< TSegment > &badSegments) const |
TTrack * | buildStereo (const TTrack &t, AList< TSegment > &) const |
TTrack * | buildStereo (TTrack &t, TMLine &l, const AList< TMLink > &links) const |
TTrack * | buildStereoOld (TTrack &t, const AList< TMLink > &allLinks, const AList< TMLink > &isolatedLinks) const |
TTrack * | build (TTrack &t, const TMLine &l) const |
void | salvage (TTrack &t, AList< TMLink > &hits) const |
salvages hits. | |
void | salvage (TTrack &t, AList< TSegment > &segments) const |
TMLine * | initialLine (const TTrack &, AList< TSegment > &) const |
makes a line. | |
TMLine * | initialLineOld (const TTrack &, AList< TSegment > &) const |
TMLine * | initialLine1 (const TTrack &, const AList< TSegment > &, const AList< TMLink > &) const |
TMLine * | initialLine2 (const TTrack &, const AList< TMLink > &) const |
AList< TMLine > | searchInitialLines (unsigned nSuperLayers) const |
AList< TMLine > | searchLines6 (void) const |
AList< TMLine > | searchLines5 (void) const |
AList< TMLine > | searchLines4 (void) const |
AList< TMLine > | searchLines3 (void) const |
AList< TMLine > | searchLines2 (void) const |
AList< TMLine > | searchLines1 (void) const |
TMLine | searchLine (const TMLine &initialLine) const |
AList< TSegment > | selectStereoSegment (const TMLine &line, const AList< TSegment > &list, const AList< TMLink > &szList) const |
void | removeFarSegment (const TMLine &, AList< TSegment > &, AList< TMLink > &) const |
Private Member Functions | |
bool | initializeForStereo (const TTrack &, const AList< TSegment > &, const AList< TSegment > &) const |
initializes internal variables for stereo reconstruction. This should be called with new stereo codes. | |
unsigned | stereoQuality (const AList< TMLink > &links) const |
checks stereo quality of a track. | |
Private Attributes | |
std::string | _name |
THelixFitter | _fitter |
const float | _maxSigma |
const float | _maxSigmaStereo |
const float | _salvageLevel |
const float | _szSegmentDistance |
const float | _szLinkDistance |
unsigned | _minNLinksForCircle |
unsigned | _minNCores |
AList< TMLink > | _allLinks |
AList< TMLink > | _links [6] |
AList< TMLink > | _forLine |
unsigned | _nSuperLayers |
unsigned | _nHits [5] |
Definition at line 34 of file TBuilder.h.
TBuilder::TBuilder | ( | const std::string & | name, | |
float | maxSigma, | |||
float | maxSigmaStereo, | |||
float | salvageLevel, | |||
float | szSegmentDistance, | |||
float | szLinkDistance, | |||
unsigned | fittingFlag | |||
) |
Constructor with salvage level.
Definition at line 36 of file TBuilder.cxx.
References _fitter, THelixFitter::freeT0(), THelixFitter::propagation(), THelixFitter::sag(), and THelixFitter::tof().
00043 : _name(a), 00044 _fitter("TBuilder Fitter"), 00045 _maxSigma(maxSigma), 00046 _maxSigmaStereo(maxSigmaStereo), 00047 _salvageLevel(sqrt(salvageLevel)), 00048 // _minNCores(3), //20060307 00049 _minNCores(2), //liuqg20070312 00050 _szSegmentDistance(szSegmentDistance), 00051 _szLinkDistance(szLinkDistance) { 00052 if (fittingFlag & 1) _fitter.sag(true); 00053 if (fittingFlag & 2) _fitter.propagation(true); 00054 if (fittingFlag & 4) _fitter.tof(true); 00055 if (fittingFlag & 8) _fitter.freeT0(true); 00056 }
TBuilder::~TBuilder | ( | ) | [virtual] |
Definition at line 1255 of file TBuilder.cxx.
References _fitter, _maxSigmaStereo, TMLine::a(), TMLine::b(), showlog::err, THelixFitter::fit(), THelixFitter::getMagneticFieldPointer(), IMagneticFieldSvc::getReferField(), genRecEmupikp::i, TTrackBase::links(), and t().
Referenced by buildStereoNew().
01255 { 01256 AList<TMLink> links = l.links(); 01257 AList<TMLink> toRemove; 01258 unsigned n = links.length(); 01259 for (unsigned i = 1; i < n; i++) { 01260 if (links[i - 1]->link() == links[i]->link()) { 01261 toRemove.append(links[i]); 01262 continue; 01263 } 01264 if (i < 2) 01265 continue; 01266 if (links[i - 2]->link() == links[i]->link()) 01267 toRemove.append(links[i]); 01268 } 01269 links.remove(toRemove); 01270 01271 //...Pick up links... 01272 n = links.length(); 01273 for (unsigned i = 0; i < n; i++) 01274 t.append(* links[i]->link()); 01275 01276 Vector a(5); 01277 a = t.helix().a(); 01278 a[3] = l.b(); 01279 //a[4] = t.charge() * l.a();//yzhang delete 2012-05-08 01280 // //yzhang add 2012-05-08 01281 if(_fitter.getMagneticFieldPointer() == NULL){ 01282 std::cout<<" "<<__FILE__<<" "<<__LINE__<<" Could not get MagneticFieldSvc "<<std::endl; 01283 } 01284 const double Bz = -1000 * _fitter.getMagneticFieldPointer()->getReferField(); 01285 if(Bz>0){ 01286 a[4] = t.charge() * l.a();//yzhang add 2012-05-08 ??? 01287 }else{ 01288 a[4] = -1. * t.charge() * l.a();//yzhang add 2012-05-08 ??? 01289 } 01290 //zhangy 01291 t._helix->a(a); 01292 01293 //#ifdef TRKRECO_WINDOW 01294 // TTrack * td = new TTrack(t); 01295 // sz.append(* td, leda_green); 01296 //#endif 01297 #ifdef TRKRECO_DEBUG_DETAIL 01298 static unsigned nTrk = 0; 01299 ++nTrk; 01300 // for (unsigned i = 0; i < t.nCores(); i++) 01301 // if (t.cores()[i]->wire()->name() == "43=220") { 01302 // std::cout << "43=220 removed" << std::endl; 01303 // t.remove(* t.cores()[i]); 01304 // } 01305 HepVector3D pp; 01306 if (links[0]->hit()->mc()) 01307 pp = links[0]->hit()->mc()->hep()->p().vect(); 01308 const HepVector3D p0 = pp; 01309 // if (nTrk == 1) { 01310 // Helix tmph(Point3D(0, 0, 0), p0, +1); 01311 // * t._helix = tmph; 01312 // } 01313 t.dump("detail", "before fit"); 01314 std::cout << "Pdif mag=" << (t.p() - p0).mag() << std::endl; 01315 // t.links().removeAll(); 01316 // for (unsigned i = 0; i < BsCouTab(RECMDC_WIRHIT 01317 // } 01318 #endif 01319 01320 //...Refine... 01321 AList<TMLink> bad; 01322 int err = _fitter.fit(t); 01323 01324 #ifdef TRKRECO_DEBUG_DETAIL 01325 t.dump("detail", "after fit"); 01326 std::cout << "Pdif mag=" << (t.p() - p0).mag() << std::endl; 01327 #endif 01328 01329 t.refine(bad, _maxSigmaStereo * 100.); 01330 err = _fitter.fit(t); 01331 t.refine(bad, _maxSigmaStereo * 10.); 01332 err = _fitter.fit(t); 01333 t.refine(bad, _maxSigmaStereo); 01334 #ifdef TRKRECO_DEBUG_DETAIL 01335 // if (nTrk == 2) { 01336 // Helix tmph(Point3D(0, 0, 0), p0, +1); 01337 // * t._helix = tmph; 01338 // std::cout << "initial mom" << p0 << " is set" << std::endl; 01339 // } 01340 #endif 01341 err = _fitter.fit(t); 01342 01343 #ifdef TRKRECO_DEBUG_DETAIL 01344 t.dump("detail"," "); 01345 std::cout << "Pdif mag=" << (t.p() - p0).mag() << std::endl; 01346 #endif 01347 01348 //...Termination... 01349 return & t; 01350 }
Definition at line 66 of file TBuilder.cxx.
References buildRphi(), dump(), genRecEmupikp::i, Links(), and t().
00066 { 00067 00068 #ifdef TRKRECO_DEBUG 00069 std::cout << "... building rphi by segments : # of segments = "; 00070 std::cout << list.length() << std::endl; 00071 for (unsigned i = 0; i < list.length(); i++) 00072 list[i]->dump("hits sort flag", " "); 00073 #endif 00074 //yuany 00075 // for (unsigned i = 0; i < list.length(); i++) 00076 // list[i]->dump("", " "); 00077 00078 //...Pick up links... 00079 AList<TMLink> links = Links(list); 00080 //yuany 00081 // for(unsigned i=0;i<links.length();i++){ 00082 // cout<<"wire name "<<links[i]->wire()->name()<<endl; 00083 // } 00084 00085 //...Main funtion... 00086 TTrack * t = buildRphi(links); 00087 00088 //...Check used segments... 00089 if (t) { 00090 const AList<TMLink> & usedLinks = t->links(); 00091 unsigned n = list.length(); 00092 for (unsigned i = 0; i < n; i++) { 00093 TSegment & segment = * list[i]; 00094 AList<TMLink> used = Links(segment, * t); 00095 if (used.length()) { 00096 t->segments().append(segment); 00097 segment.tracks().append(t); 00098 } 00099 } 00100 } 00101 00102 return t; 00103 00104 }
builds a r/phi track from TMLinks or from Segments.
Definition at line 107 of file TBuilder.cxx.
References _fitter, _maxSigma, _minNCores, _salvageLevel, TCircle::dump(), showlog::err, THelixFitter::fit(), TTrackBase::fit(), SeparateCores(), and t().
Referenced by buildRphi(), TConformalFinder::expand(), and TConformalFinder::fastFinding2D().
00107 { 00108 #ifdef TRKRECO_DEBUG 00109 std::cout << "... building rphi by links : # of links = "; 00110 std::cout << list.length() << std::endl; 00111 #endif 00112 00113 //...Classify TMLink's... 00114 AList<TMLink> cores; 00115 AList<TMLink> nonCores; 00116 SeparateCores(list, cores, nonCores); 00117 00118 #ifdef TRKRECO_DEBUG 00119 cout<<" ... cores..."<<endl; 00120 for(int ii = 0; ii < cores.length(); ++ii) { 00121 cout<<"layer: "<<cores[ii]->wire()->layerId() 00122 <<" local: "<<cores[ii]->wire()->localId()<<endl; 00123 } 00124 cout<<" ...noncores..."<<endl; 00125 for(int ii = 0; ii < nonCores.length(); ++ii) { 00126 cout<<"layer: "<<nonCores[ii]->wire()->layerId() 00127 <<" local: "<<nonCores[ii]->wire()->localId()<<endl; 00128 } 00129 #endif 00130 //...Check # of links... 00131 unsigned nCores = cores.length(); 00132 if (nCores < _minNCores) { 00133 #ifdef TRKRECO_DEBUG 00134 std::cout << "... building rphi failure : # of cores(=" << nCores; 00135 std::cout << ") is less then " << _minNCores << std::endl; 00136 #endif 00137 00138 return NULL; 00139 } 00140 00141 //...Make a circle... 00142 #ifdef TRKRECO_DEBUG 00143 std::cout <<"links in list = "<<list.length()<<std::endl; 00144 std::cout << "... making a circle : # cores =" << cores.length() << std::endl; 00145 #endif 00146 TCircle c(cores); 00147 int err = c.fit(); 00148 if (err < 0) { 00149 #ifdef TRKRECO_DEBUG 00150 std::cout << "... building rphi failure : circle fit error = "; 00151 std::cout << err << std::endl; 00152 #endif 00153 return NULL; 00154 } 00155 // cout<<"radius "<<c.radius()<<" charge "<<c.charge()<<" center "<<c.center()<<endl; 00156 //...Make a track... 00157 TTrack * t = new TTrack(c); 00158 // t->dump("hits sort flag", " "); 00159 AList<TMLink> bad; 00160 err = _fitter.fit(* t); 00161 //cout<<"fit 1 done err: "<<err<<endl; 00162 // t->dump("hits sort flag", " "); 00163 if (err < 0) goto discard; 00164 t->refine(bad, _maxSigma * 100.); 00165 //cout<<"refine 1 done"<<endl; 00166 //t->dump("hits sort flag", " "); 00167 err = _fitter.fit(* t); 00168 //cout<<"fit 2 done err: "<<err<<endl; 00169 //t->dump("hits sort flag", " "); 00170 t->refine(bad, _maxSigma * 10.); 00171 //cout<<"refine 2 done"<<endl; 00172 //t->dump("hits sort flag", " "); 00173 err = _fitter.fit(* t); 00174 //cout<<"fit 3 done err: "<<err<<endl; 00175 //t->dump("hits sort flag", " "); 00176 t->refine(bad, _maxSigma); 00177 //cout<<"refine 3 done"<<endl; 00178 //t->dump("hits sort flag", " "); 00179 err = _fitter.fit(* t); 00180 //cout<<"fit 4 done err: "<<err<<endl; 00181 00182 if (err < 0) goto discard; 00183 #ifdef TRKRECO_DEBUG_DETAIL 00184 c.dump("detail", " ccl> "); 00185 t->dump("detail", " 1st> "); 00186 #endif 00187 00188 //...Try to append non-core hits... 00189 #ifdef TRKRECO_DEBUG 00190 std::cout << "... appending non-core hits : # = " << nonCores.length(); 00191 std::cout << std::endl; 00192 #endif 00193 t->appendByApproach(nonCores, _salvageLevel); 00194 #ifdef TRKRECO_DEBUG 00195 t->dump("hits sort flag", " "); 00196 #endif 00197 // t->dump("hits sort flag", " "); 00198 return t; 00199 00200 //...Something happened... 00201 discard: 00202 #ifdef TRKRECO_DEBUG 00203 std::cout << "... building rphi failure : helix fit error = "; 00204 std::cout << err << std::endl; 00205 #endif 00206 delete t; 00207 return NULL; 00208 }
Definition at line 525 of file TBuilder.cxx.
References _fitter, TTrack::_helix, _maxSigmaStereo, _minNCores, _szLinkDistance, TMLine::a(), Helix::a(), TTrackBase::append(), TMLine::b(), TTrack::charge(), TMLine::distance(), Dump(), showlog::err, THelixFitter::fit(), TRobustLineFitter::fit(), TTrack::helix(), genRecEmupikp::i, genRecEmupikp::line, TMLink::link(), TTrackBase::refine(), SeparateCores(), TTrack::szPosition(), and t().
00527 { 00528 #ifdef TRKRECO_DEBUG 00529 std::cout << "... building stereo by links : # of links = "; 00530 std::cout << list.length() << std::endl; 00531 #endif 00532 00533 //...Classify TMLink's... 00534 AList<TMLink> cores; 00535 AList<TMLink> nonCores; 00536 SeparateCores(list, cores, nonCores); 00537 //...Check # of links... 00538 unsigned nCores = cores.length(); 00539 if (nCores < _minNCores) { 00540 #ifdef TRKRECO_DEBUG 00541 std::cout << "... stereo building failure : # of cores(=" << nCores; 00542 std::cout << ") is less then " << _minNCores << std::endl; 00543 #endif 00544 return NULL; 00545 } 00546 #ifdef TRKRECO_WINDOW 00547 sz.appendSz(track, cores, leda_brown); 00548 #endif 00549 00550 //...Cal. left and right position... 00551 AList<TMLink> forNewLine; 00552 for (unsigned i = 0; i < nCores; i++) { 00553 TMLink & t = * cores[i]; 00554 for (unsigned i = 0; i < 2; i++) { 00555 TMLink & tt = * new TMLink(t); 00556 tt.leftRight(i); 00557 int err = track.szPosition(tt); 00558 if (err) { 00559 delete & tt; 00560 } 00561 else { 00562 if (line.distance(tt) < _szLinkDistance) { 00563 tt.link(& t); 00564 forNewLine.append(tt); 00565 } 00566 else { 00567 delete & tt; 00568 } 00569 } 00570 } 00571 } 00572 00573 //...Create new line... 00574 #ifdef TRKRECO_DEBUG 00575 std::cout << " ... creating a new line" << std::endl; 00576 #endif 00577 unsigned nNewLine = forNewLine.length(); 00578 TMLine newLine(forNewLine); 00579 static TRobustLineFitter fitter("abc"); 00580 int err = fitter.fit(newLine); 00581 // int err = newLine.fit(); 00582 if (err < 0) { 00583 HepAListDeleteAll(forNewLine); 00584 #ifdef TRKRECO_DEBUG_DETAIL 00585 std::cout << " ... 2nd linear fit failure. nLinks("; 00586 std::cout << forNewLine.length() << ")" << std::endl; 00587 #endif 00588 return NULL; 00589 } 00590 00591 #ifdef TRKRECO_WINDOW 00592 sz.append(newLine, leda_green); 00593 sz.wait(); 00594 #endif 00595 00596 #ifdef TRKRECO_DEBUG_DETAIL 00597 Dump(forNewLine, "sort hits stereo", " "); 00598 #endif 00599 00600 //...Decide left/right... 00601 AList<TMLink> toRemove; 00602 TMLink * last = NULL; 00603 for (unsigned i = 0; i < nNewLine; i++) { 00604 if (last == NULL) last = forNewLine[i]->link(); 00605 else { 00606 if (last == forNewLine[i]->link()) { 00607 if (newLine.distance(* forNewLine[i - 1]) > 00608 newLine.distance(* forNewLine[i])) 00609 toRemove.append(forNewLine[i - 1]); 00610 else 00611 toRemove.append(forNewLine[i]); 00612 last = NULL; 00613 } 00614 else { 00615 last = forNewLine[i]->link(); 00616 } 00617 } 00618 } 00619 forNewLine.remove(toRemove); 00620 nNewLine = forNewLine.length(); 00621 00622 #ifdef TRKRECO_DEBUG_DETAIL 00623 Dump(toRemove, "sort hits stereo", " x "); 00624 Dump(forNewLine, "sort hits stereo", " "); 00625 #endif 00626 00627 //...3D fit... 00628 for (unsigned i = 0; i < nNewLine; i++) 00629 track.append(* forNewLine[i]->link()); 00630 Vector a(5); 00631 a = track.helix().a(); 00632 a[3] = newLine.b(); 00633 a[4] = track.charge() * newLine.a(); 00634 track._helix->a(a); 00635 00636 //...Refine... 00637 AList<TMLink> bad; 00638 err = _fitter.fit(track); 00639 track.refine(bad, _maxSigmaStereo * 100.); 00640 err = _fitter.fit(track); 00641 track.refine(bad, _maxSigmaStereo * 10.); 00642 err = _fitter.fit(track); 00643 track.refine(bad, _maxSigmaStereo); 00644 err = _fitter.fit(track); 00645 00646 #ifdef TRKRECO_WINDOW 00647 sz.text("stereo finished"); 00648 sz.oneShot(track, leda_blue); 00649 #endif 00650 00651 //...Termination... 00652 HepAListDeleteAll(toRemove); 00653 HepAListDeleteAll(forNewLine); 00654 return & track; 00655 }
Definition at line 658 of file TBuilder.cxx.
References dump(), genRecEmupikp::i, initialLineOld(), genRecEmupikp::line, Links(), s, StereoHits(), deljobs::string, and t().
Referenced by TConformalFinder::fastFinding3D().
00658 { 00659 00660 TTrack & t = * new TTrack(t0); 00661 00662 #ifdef TRKRECO_DEBUG 00663 std::cout << "... building stereo by segments : # of segments = "; 00664 std::cout << segments.length() << std::endl; 00665 for (unsigned i = 0; i < segments.length(); i++) 00666 segments[i]->dump("hits sort flag", " "); 00667 #endif 00668 #ifdef TRKRECO_WINDOW 00669 sz.clear(); 00670 sz.skip(false); 00671 sz.mode(2); 00672 sz.appendSz(t, segments, leda_black); 00673 AList<TSegment> tmps = segments; 00674 std::string s = "# of segments = " + itostring(int(segments.length())); 00675 #endif 00676 00677 //...Find initial line... 00678 TMLine * line = initialLineOld(t, segments); 00679 if (! line) { 00680 #ifdef TRKRECO_DEBUG 00681 std::cout << "... building stereo failure : no initial line found" << std::endl; 00682 #endif 00683 #ifdef TRKRECO_WINDOW 00684 s = "no initial line found : " + s; 00685 sz.text(s); 00686 sz.wait(); 00687 #endif 00688 return NULL; 00689 } 00690 #ifdef TRKRECO_WINDOW 00691 sz.append(* line, leda_red); 00692 sz.text(s); 00693 sz.wait(); 00694 #endif 00695 00696 //...Pick up links... 00697 AList<TMLink> links; 00698 unsigned n = segments.length(); 00699 for (unsigned i = 0; i < n; i++) 00700 links.append(segments[i]->links()); 00701 00702 //...Main funtion... 00703 TTrack * ts = buildStereo(t, * line, links); 00704 00705 //...Check used segments... 00706 if (ts) { 00707 AList<TMLink> usedLinks = StereoHits(t.links()); 00708 for (unsigned i = 0; i < n; i++) { 00709 TSegment & segment = * segments[i]; 00710 AList<TMLink> used = Links(segment, t); 00711 if (used.length()) { 00712 t.segments().append(segment); 00713 segment.tracks().append(t); 00714 } 00715 } 00716 } 00717 00718 HepAListDeleteAll((AList<TMLink> &) line->links()); 00719 delete line; 00720 return ts; 00721 }
TTrack * TBuilder::buildStereoNew | ( | const TTrack & | t, | |
AList< TSegment > & | goodSegments, | |||
AList< TSegment > & | badSegments | |||
) | const |
Definition at line 1535 of file TBuilder.cxx.
References _allLinks, _forLine, _links, _nSuperLayers, TTrackBase::append(), build(), TTrackBase::cores(), dump(), genRecEmupikp::i, initializeForStereo(), ganga-rec::j, genRecEmupikp::line, Links(), TTrackBase::links(), TTrackBase::remove(), s, searchInitialLines(), searchLine(), TTrack::segments(), StereoHits(), stereoQuality(), deljobs::string, and t().
Referenced by TConformalFinder::fastFinding3D().
01537 { 01538 01539 #ifdef TRKRECO_DEBUG 01540 std::cout << "... building stereo by segments(new) : # of segments = "; 01541 std::cout << segments.length() << std::endl; 01542 for (unsigned i = 0; i < segments.length(); i++) 01543 segments[i]->dump("hits sort flag", " "); 01544 #endif 01545 #ifdef TRKRECO_WINDOW 01546 sz.clear(); 01547 #endif 01548 TTrack * bestCandidate = NULL; 01549 AList< AList<TMLink> > poorSeeds; 01550 bool ok = initializeForStereo(t, segments, badSegments); 01551 unsigned nSuperLayers = _nSuperLayers + 1; 01552 // std::cout<<"nSuperLayers in buildStereoNew:"<<_nSuperLayers<<endl; 01553 // cout<<"ok of initializeForStereo: "<<ok<<endl; 01554 01555 if (! ok) goto endOfBuilding; 01556 //...Main loop... 01557 while (--nSuperLayers) { 01558 01559 //...Initial line search... 01560 AList<TMLine> initialLines = searchInitialLines(nSuperLayers); 01561 #ifdef TRKRECO_WINDOW 01562 sz.clear(); 01563 sz.skip(false); 01564 sz.mode(2); 01565 sz.appendSz(t, segments, leda_black); 01566 AList<TSegment> tmps = segments; 01567 std::string s = "# of segments = " + itostring(int(segments.length())); 01568 sz.appendSz(t, _allLinks, leda_black); 01569 sz.append(_forLine, leda_brown); 01570 s = "nSprLyr=" + itostring(int(nSuperLayers)) + 01571 ", # of initial lines = " + itostring(int(initialLines.length())); 01572 for (unsigned i = 0; i < initialLines.length(); i++) 01573 sz.append(* initialLines[i], leda_red); 01574 sz.text(s); 01575 sz.wait(); 01576 #endif 01577 // cout<<"length of initialLines = "<<initialLines.length()<<endl; 01578 if (initialLines.length() == 0) continue; 01579 //...Line loop... 01580 bool found = false; 01581 unsigned nInitialLines = initialLines.length(); 01582 // cout<<"nInitialLines:"<<nInitialLines<<endl; 01583 01584 for (unsigned i = 0; i < nInitialLines; i++) { 01585 01586 //...Linear fit... 01587 const TMLine & line = * initialLines[i]; 01588 TMLine newLine = searchLine(line); 01589 01590 //...Skip if this is a seed of the poor result... 01591 if (poorSeeds.length()) { 01592 bool poorCase = false; 01593 for (unsigned j = 0; j < poorSeeds.length(); j++) { 01594 if (poorSeeds[j]->length() == newLine.links().length()) { 01595 AList<TMLink> tmp = * poorSeeds[j]; 01596 tmp.remove(newLine.links()); 01597 if (tmp.length() == 0) { 01598 #ifdef TRKRECO_DEBUG_DETAIL 01599 std::cout << " ... This is a poor seed :" 01600 << " skipped" 01601 << " : # of poor seeds = " 01602 << poorSeeds.length() << std::endl; 01603 #endif 01604 poorCase = true; 01605 break; 01606 } 01607 } 01608 } 01609 if (poorCase) continue; 01610 } 01611 01612 //...Is this a good line... 01613 if (! stereoQuality(newLine.links())) 01614 continue; 01615 01616 //...3D fit... 01617 TTrack * t3d = new TTrack(t); 01618 t3d = build(* t3d, newLine); 01619 if (t3d == NULL) continue; 01620 01621 //...Check quality... 01622 unsigned quality = stereoQuality(t3d->links()); 01623 // cout<<"point3, quality:"<<quality<<endl; 01624 01625 //...Best case... 01626 if (quality == 2) { 01627 #ifdef TRKRECO_WINDOW 01628 sz.text("stereo finished"); 01629 sz.oneShot(* t3d, leda_blue); 01630 #endif 01631 if (bestCandidate) delete bestCandidate; 01632 bestCandidate = t3d; 01633 found = true; 01634 break; 01635 } 01636 01637 //...Poor case... 01638 AList<TMLink> * tmpL = new AList<TMLink>(); 01639 tmpL->append(newLine.links()); 01640 poorSeeds.append(tmpL); 01641 if (quality == 0) { 01642 #ifdef TRKRECO_WINDOW 01643 sz.text("this candidate discarded"); 01644 sz.oneShot(* t3d, leda_black); 01645 #endif 01646 delete t3d; 01647 continue; 01648 } 01649 01650 //...Not enough... 01651 if (bestCandidate) { 01652 if (bestCandidate->cores().length() < 01653 t3d->cores().length()) { 01654 #ifdef TRKRECO_WINDOW 01655 sz.text("new candidate"); 01656 sz.append(* bestCandidate, leda_brown); 01657 sz.oneShot(* t3d, leda_green); 01658 sz.remove(* bestCandidate); 01659 #endif 01660 delete bestCandidate; 01661 bestCandidate = t3d; 01662 } 01663 else { 01664 #ifdef TRKRECO_WINDOW 01665 sz.text("this candidate discarded"); 01666 sz.oneShot(* t3d, leda_black); 01667 #endif 01668 delete t3d; 01669 } 01670 } 01671 else { 01672 bestCandidate = t3d; 01673 #ifdef TRKRECO_WINDOW 01674 sz.text("new candidate"); 01675 sz.oneShot(* bestCandidate, leda_green); 01676 sz.remove(* t3d); 01677 #endif 01678 } 01679 } 01680 01681 //...Termination of a loop... 01682 HepAListDeleteAll(initialLines); 01683 if (found) break; 01684 } 01685 01686 endOfBuilding: 01687 _allLinks.removeAll(); 01688 for (unsigned i = 0; i < 6; i++) 01689 HepAListDeleteAll(_links[i]); 01690 HepAListDeleteAll(_forLine); 01691 01692 #ifdef TRKRECO_DEBUG_DETAIL 01693 std::cout << " ... # of poor seeds = " << poorSeeds.length() << std::endl; 01694 #endif 01695 #ifdef TRKRECO_WINDOW 01696 if (bestCandidate == NULL) { 01697 sz.text("3D failed"); 01698 sz.wait(); 01699 } 01700 #endif 01701 01702 //...Check used segments... 01703 if (bestCandidate) { 01704 AList<TMLink> usedLinks = StereoHits(bestCandidate->links()); 01705 for (unsigned i = 0; i < segments.length(); i++) { 01706 TSegment & segment = * segments[i]; 01707 AList<TMLink> used = Links(segment, * bestCandidate); 01708 if (used.length()) { 01709 bestCandidate->segments().append(segment); 01710 segment.tracks().append(bestCandidate); 01711 } 01712 } 01713 } 01714 01715 if (poorSeeds.length()) 01716 HepAListDeleteAll(poorSeeds); 01717 01718 #ifdef TRASA_DEBUG_DETAIL 01719 if (bestCandidate == NULL) 01720 std::cout << "... building stereo(new) failed" << std::endl; 01721 else 01722 std::cout << "... building stereo(new) ok" << std::endl; 01723 #endif 01724 return bestCandidate; 01725 }
TTrack* TBuilder::buildStereoOld | ( | TTrack & | t, | |
const AList< TMLink > & | allLinks, | |||
const AList< TMLink > & | isolatedLinks | |||
) | const |
void TBuilder::dump | ( | const std::string & | message = std::string("") , |
|
const std::string & | prefix = std::string("") | |||
) | const |
dumps debug information.
Definition at line 62 of file TBuilder.cxx.
Referenced by buildRphi(), buildStereo(), buildStereoNew(), and salvage().
bool TBuilder::initializeForStereo | ( | const TTrack & | , | |
const AList< TSegment > & | , | |||
const AList< TSegment > & | ||||
) | const [private] |
initializes internal variables for stereo reconstruction. This should be called with new stereo codes.
Definition at line 1353 of file TBuilder.cxx.
References _allLinks, _forLine, _links, _minNCores, _nHits, _nSuperLayers, showlog::err, genRecEmupikp::i, ganga-rec::j, t(), WireHitPatternLeft, and WireHitPatternRight.
Referenced by buildStereoNew().
01355 { 01356 _nSuperLayers = 0; 01357 for (unsigned i = 0; i < 5; i++) 01358 _nHits[i] = 0; 01359 //...sz position of segments... 01360 unsigned nSegments = segments.length(); 01361 // cout<<" used Segments in stereo = "<<nSegments<<endl; 01362 for (unsigned i = 0; i < nSegments; i++) { 01363 TMLink & l = * new TMLink(); 01364 int err = t.szPosition(* segments[i], l); 01365 //...Remove if sz can not be calculcated... 01366 if (err) { 01367 delete & l; 01368 continue; 01369 } 01370 // _links[l.wire()->superLayerId() / 2].append(l); 01371 if (!_links[l.wire()->axialStereoLayerId()/4].hasMember(l)) 01372 _links[l.wire()->axialStereoLayerId()/4].append(l); 01373 //? _allLinks.append(segments[i]->links()); 01374 // _allLinks.append(segments[i]->cores()); 01375 for (unsigned j = 0; j < segments[i]->cores().length(); ++j) { 01376 TMLink & cL = * segments[i]->cores()[j]; 01377 if(!_allLinks.hasMember(cL)) _allLinks.append(cL); 01378 } 01379 } 01380 01381 //...Count a number of super layers... 01382 for (unsigned i = 0; i < 6; i++) { 01383 if (_links[i].length() > 0) { 01384 ++_nSuperLayers; 01385 } 01386 // else { 01387 // _allLinks.append(badSegments[i]->links()); 01388 // #ifdef TRKRECO_DEBUG_DETAIL 01389 // std::cout << " ... stereo super layer " << i * 2 + 1 01390 // << " has no link," 01391 // << badSegments[i]->links().length() << " (bad) links added" 01392 // << std::endl; 01393 // badSegments[i]->dump("hits sort flag", " "); 01394 // #endif 01395 // } 01396 } 01397 01398 //...Append bad links also... 01399 if (badSegments.length()) { 01400 for (unsigned i = 0; i < 6; i++) { 01401 if (badSegments[i]->links().length()) { 01402 _allLinks.append(badSegments[i]->links()); 01403 #ifdef TRKRECO_DEBUG_DETAIL 01404 std::cout << " ... bad links added for stereo super layer " 01405 << i * 2 + 1 << std::endl; 01406 badSegments[i]->dump("hits sort flag", " "); 01407 #endif 01408 } 01409 } 01410 } 01411 01412 //...sz position of links... 01413 unsigned nCores = _allLinks.length(); 01414 if (nCores < _minNCores) { 01415 #ifdef TRKRECO_DEBUG_DETAIL 01416 std::cout << " ... initializeForStereo : # of cores(=" << nCores 01417 << ") is less then " << _minNCores << std::endl; 01418 #endif 01419 return false; 01420 } 01421 for (unsigned j = 0; j < nCores; j++) { 01422 TMLink & link = * _allLinks[j]; 01423 for (unsigned i = 0; i < 2; i++) { 01424 TMLink & tt = * new TMLink(link); 01425 unsigned stateR=(link.hit()->state())&WireHitPatternRight; 01426 unsigned stateL=(link.hit()->state())&WireHitPatternLeft; 01427 bool boolR=(stateR==WireHitPatternRight); 01428 bool boolL=(stateL==WireHitPatternLeft); 01429 // std::cout<<"zsl TBuilder::initializeForStereo::boolR:"<<boolR<<", boolL:"<<boolL<<endl; 01430 01431 tt.leftRight(i); 01432 int err = t.szPosition(tt); 01433 // std::cout<<"zsl TBuilder::initializeForStereo::err:"<<err<<endl; 01434 // std::cout<<"----------------------"<<endl; 01435 01436 if (err) { 01437 delete & tt; 01438 continue; 01439 } 01440 tt.link(& link); 01441 _forLine.append(tt); 01442 } 01443 } 01444 01445 //...Count # of axial hits... 01446 unsigned nA = t.cores().length(); 01447 for (unsigned i = 0; i < nA; i++) 01448 // ++_nHits[t.cores()[i]->wire()->superLayerId() / 2]; 01449 ++_nHits[t.cores()[i]->wire()->axialStereoLayerId()/4]; 01450 01451 #ifdef TRKRECO_DEBUG 01452 std::cout << " ... initializeForStereo : axial super layer usage = "; 01453 for (unsigned i = 0; i < 5; i++) 01454 std::cout << _nHits[i] << ","; 01455 std::cout << std::endl 01456 << " : # of stereo super layers=" 01457 << _nSuperLayers << std::endl; 01458 #endif 01459 01460 return true; 01461 }
makes a line.
Definition at line 315 of file TBuilder.cxx.
References showlog::err, genRecEmupikp::i, initialLine1(), initialLine2(), genRecEmupikp::line, NSuperLayers(), removeFarSegment(), selectStereoSegment(), and t().
Referenced by searchLine().
00315 { 00316 00317 //...Select good segments in acceptance... 00318 AList<TSegment> bad; 00319 AList<TMLink> lList; 00320 unsigned n = list.length(); 00321 for (unsigned i = 0; i < n; i++) { 00322 TMLink & l = * new TMLink(); 00323 int err = t.szPosition(* list[i], l); 00324 if (err) { 00325 bad.append(list[i]); 00326 delete & l; 00327 continue; 00328 } 00329 00330 const HepPoint3D & p = l.position(); 00331 if (p.y() > l.wire()->forwardPosition().z() || 00332 p.y() < l.wire()->backwardPosition().z()) { 00333 bad.append(list[i]); 00334 delete & l; 00335 continue; 00336 } 00337 lList.append(l); 00338 } 00339 list.remove(bad); 00340 n = list.length(); 00341 00342 //...Cal. expected # of super layers... 00343 unsigned nAMaxSL = 0; 00344 unsigned nAMinSL = 10; 00345 const AList<TSegment> & segments = t.segments(); 00346 unsigned nA = segments.length(); 00347 for (unsigned i = 0; i < nA; i++) { 00348 unsigned sl = segments[i]->superLayerId(); 00349 if (sl > nAMaxSL) nAMaxSL = sl; 00350 if (sl < nAMinSL) nAMinSL = sl; 00351 } 00352 unsigned nExpected = (nAMaxSL - nAMinSL) / 2; 00353 #ifdef TRKRECO_DEBUG 00354 std::cout << " ... initialLine : axial super layer usage = " << nAMinSL; 00355 std::cout << " ~ " << nAMaxSL << std::endl; 00356 std::cout << " : expected stereo super layers = "; 00357 std::cout << nExpected << std::endl; 00358 #endif 00359 00360 TMLine * line = NULL; 00361 AList<TSegment> list0 = list; 00362 AList<TMLink> lList0 = lList; 00363 while (1) { 00364 bool last = (NSuperLayers(lList) <= nExpected); 00365 00366 TMLine * line = initialLine2(t, lList); 00367 if (line) { 00368 AList<TSegment> tmp = selectStereoSegment(* line, list0, lList0); 00369 #ifdef TRKRECO_DEBUG 00370 std::cout << " ... initialLine2 : # of selected segments = "; 00371 std::cout << tmp.length() << std::endl; 00372 #endif 00373 if ((tmp.length() >= nExpected) || 00374 (tmp.length() >= 4) || 00375 last) { 00376 list = tmp; 00377 return line; 00378 } 00379 delete line; 00380 } 00381 00382 line = initialLine1(t, list, lList); 00383 if (line) { 00384 AList<TSegment> tmp = selectStereoSegment(* line, list0, lList0); 00385 bool ok = (tmp.length() >= nExpected); 00386 #ifdef TRKRECO_DEBUG 00387 std::cout << " ... initialLine2 : # of selected segments = "; 00388 std::cout << tmp.length() << " : ok, last = "; 00389 std::cout << ok << ", " << last << std::endl; 00390 #endif 00391 if (ok) { 00392 list = tmp; 00393 return line; 00394 } 00395 removeFarSegment(* line, list, lList); 00396 delete line; 00397 } 00398 else { 00399 return NULL; 00400 } 00401 } 00402 }
TMLine * TBuilder::initialLine1 | ( | const TTrack & | , | |
const AList< TSegment > & | , | |||
const AList< TMLink > & | ||||
) | const |
Definition at line 247 of file TBuilder.cxx.
References showlog::err, genRecEmupikp::i, ganga-rec::j, and genRecEmupikp::line.
Referenced by initialLine(), and initialLineOld().
00249 { 00250 00251 //...Check input... 00252 if (list.length() < 2) return NULL; 00253 00254 //...Check super layer pattern... 00255 AList<TSegment> sl[5]; 00256 AList<TMLink> tl[5]; 00257 unsigned n = list.length(); 00258 for (unsigned i = 0; i < n; i ++) { 00259 unsigned j = list[i]->superLayerId() / 2; 00260 sl[j].append(list[i]); 00261 tl[j].append(lList[i]); 00262 } 00263 #ifdef TRKRECO_DEBUG 00264 std::cout << " ... initialLine1 : super layer ptn = "; 00265 for (unsigned i = 0; i < 5; i++) std::cout << sl[i].length(); 00266 std::cout << std::endl; 00267 #endif 00268 00269 //...Count single segment layer... 00270 unsigned nSingle = 0; 00271 for (unsigned i = 0; i < 5; i++) 00272 if (sl[i].length() == 1) ++nSingle; 00273 #ifdef TRKRECO_DEBUG 00274 std::cout << " ... # of single segment layer = " << nSingle << std::endl; 00275 #endif 00276 if (nSingle < 2) return NULL; 00277 00278 //...Happy case... 00279 AList<TSegment> bestCombination; 00280 AList<TMLink> forLine; 00281 for (unsigned i = 0; i < 5; i++) { 00282 if (sl[i].length() != 1) continue; 00283 bestCombination.append(sl[i]); 00284 forLine.append(tl[i]); 00285 } 00286 TMLine & line = * new TMLine(forLine); 00287 int err = line.fit(); 00288 if (err) { 00289 delete & line; 00290 return NULL; 00291 } 00292 return & line; 00293 }
Definition at line 296 of file TBuilder.cxx.
References showlog::err, TRobustLineFitter::fit(), and genRecEmupikp::line.
Referenced by initialLine(), and initialLineOld().
00297 { 00298 #ifdef TRKRECO_DEBUG 00299 std::cout << " ... initlialLine2 : # of links = " << lList.length(); 00300 std::cout << std::endl; 00301 #endif 00302 00303 //...Static object... 00304 static TRobustLineFitter fitter("can you work?"); 00305 TMLine * line = new TMLine(lList); 00306 int err = fitter.fit(* line); 00307 if (err) { 00308 delete line; 00309 return NULL; 00310 } 00311 return line; 00312 }
Definition at line 405 of file TBuilder.cxx.
References showlog::err, genRecEmupikp::i, initialLine1(), initialLine2(), genRecEmupikp::line, NSuperLayers(), removeFarSegment(), selectStereoSegment(), and t().
Referenced by buildStereo().
00405 { 00406 00407 //...Select good segments in acceptance... 00408 AList<TSegment> bad; 00409 AList<TMLink> lList; 00410 unsigned n = list.length(); 00411 for (unsigned i = 0; i < n; i++) { 00412 TMLink & l = * new TMLink(); 00413 int err = t.szPosition(* list[i], l); 00414 if (err) { 00415 bad.append(list[i]); 00416 delete & l; 00417 continue; 00418 } 00419 00420 const HepPoint3D & p = l.position(); 00421 if (p.y() > l.wire()->forwardPosition().z() || 00422 p.y() < l.wire()->backwardPosition().z()) { 00423 bad.append(list[i]); 00424 delete & l; 00425 continue; 00426 } 00427 lList.append(l); 00428 } 00429 list.remove(bad); 00430 n = list.length(); 00431 00432 //...Cal. expected # of super layers... 00433 unsigned nAMaxSL = 0; 00434 unsigned nAMinSL = 10; 00435 const AList<TSegment> & segments = t.segments(); 00436 unsigned nA = segments.length(); 00437 for (unsigned i = 0; i < nA; i++) { 00438 unsigned sl = segments[i]->superLayerId(); 00439 if (sl > nAMaxSL) nAMaxSL = sl; 00440 if (sl < nAMinSL) nAMinSL = sl; 00441 } 00442 unsigned nExpected = (nAMaxSL - nAMinSL) / 2; 00443 #ifdef TRKRECO_DEBUG 00444 std::cout << " ... initialLine : axial super layer usage = " << nAMinSL; 00445 std::cout << " ~ " << nAMaxSL << std::endl; 00446 std::cout << " : expected stereo super layers = "; 00447 std::cout << nExpected << std::endl; 00448 #endif 00449 00450 TMLine * line = NULL; 00451 AList<TSegment> list0 = list; 00452 AList<TMLink> lList0 = lList; 00453 while (1) { 00454 TMLine * line = initialLine1(t, list, lList); 00455 if (line) { 00456 AList<TSegment> tmp = selectStereoSegment(* line, list0, lList0); 00457 #ifdef TRKRECO_DEBUG 00458 std::cout << " ... initialLine1 : # of selected segments = "; 00459 std::cout << tmp.length() << std::endl; 00460 #endif 00461 if (tmp.length() >= nExpected) { 00462 lList0.remove(line->links()); 00463 HepAListDeleteAll(lList0); 00464 list = tmp; 00465 return line; 00466 } 00467 delete line; 00468 } 00469 00470 line = initialLine2(t, lList); 00471 if (line) { 00472 AList<TSegment> tmp = selectStereoSegment(* line, list0, lList0); 00473 bool ok = (tmp.length() >= nExpected); 00474 bool last = (NSuperLayers(lList) <= nExpected); 00475 #ifdef TRKRECO_DEBUG 00476 std::cout << " ... initialLine2 : # of selected segments = "; 00477 std::cout << tmp.length() << " : ok, last = "; 00478 std::cout << ok << ", " << last << std::endl; 00479 #endif 00480 if (ok || last) { 00481 lList0.remove(line->links()); 00482 HepAListDeleteAll(lList0); 00483 list = tmp; 00484 return line; 00485 } 00486 removeFarSegment(* line, list, lList); 00487 delete line; 00488 } 00489 else { 00490 HepAListDeleteAll(lList0); 00491 return NULL; 00492 } 00493 } 00494 }
const std::string & TBuilder::name | ( | void | ) | const [inline] |
returns name.
Definition at line 146 of file TBuilder.h.
References _name.
00146 { 00147 return _name; 00148 }
Definition at line 510 of file TBuilder.cxx.
References genRecEmupikp::i, and genRecEmupikp::line.
Referenced by initialLine(), and initialLineOld().
00512 { 00513 unsigned n = list.length(); 00514 float maxDistance = 0.; 00515 unsigned maxId = 0; 00516 for (unsigned i = 0; i < n; i++) { 00517 float distance = line.distance(* szList[i]); 00518 if (distance > maxDistance) maxId = i; 00519 } 00520 list.remove(maxId); 00521 szList.remove(maxId); 00522 }
Definition at line 228 of file TBuilder.cxx.
References dump(), genRecEmupikp::i, salvage(), and t().
00228 { 00229 00230 #ifdef TRKRECO_DEBUG 00231 std::cout << "... salvaging by segments : # of segments = "; 00232 std::cout << list.length() << std::endl; 00233 for (unsigned i = 0; i < list.length(); i++) 00234 list[i]->dump("hits sort flag", " "); 00235 #endif 00236 00237 //...Pick up links... 00238 AList<TMLink> links; 00239 unsigned n = list.length(); 00240 for (unsigned i = 0; i < n; i++) 00241 links.append(list[i]->links()); 00242 00243 salvage(t, links); 00244 }
salvages hits.
Definition at line 211 of file TBuilder.cxx.
References _fitter, _salvageLevel, Dump(), THelixFitter::fit(), and t().
Referenced by TConformalFinder::expand(), TConformalFinder::salvage(), and salvage().
00211 { 00212 00213 #ifdef TRKRECO_DEBUG 00214 std::cout << "... salvaging(TBuilder) : # of given hits=" << hits.length(); 00215 std::cout << ", salvage level=" << _salvageLevel << std::endl; 00216 Dump(hits, "hits sort flag"); 00217 #endif 00218 00219 unsigned nHits = hits.length(); 00220 if (nHits == 0) return; 00221 00222 //...Try to append this hit... 00223 t.appendByApproach(hits, _salvageLevel); 00224 _fitter.fit(t); 00225 }
AList< TMLine > TBuilder::searchInitialLines | ( | unsigned | nSuperLayers | ) | const |
Definition at line 724 of file TBuilder.cxx.
References _links, genRecEmupikp::i, searchLines2(), searchLines3(), searchLines4(), searchLines5(), searchLines6(), and SortByB().
Referenced by buildStereoNew().
00724 { 00725 #ifdef TRKRECO_DEBUG 00726 std::cout << " ... searchInitialLines : # of segments in sl : "; 00727 for (unsigned i = 0; i < 5; i++) 00728 std::cout << _links[i].length() << ","; 00729 std::cout << std::endl 00730 << " : max # of super layers=" 00731 << nSuperLayerMax << std::endl; 00732 #endif 00733 00734 AList<TMLine> lines; 00735 if (nSuperLayerMax > 5) 00736 lines.append(searchLines6()); 00737 else if (nSuperLayerMax > 4) 00738 lines.append(searchLines5()); 00739 else if (nSuperLayerMax > 3) 00740 lines.append(searchLines4()); 00741 else if (nSuperLayerMax > 2) 00742 lines.append(searchLines3()); 00743 else if (nSuperLayerMax > 1) 00744 lines.append(searchLines2()); 00745 // else 00746 // lines.append(searchLines1()); 00747 00748 lines.sort(SortByB); 00749 return lines; 00750 }
Definition at line 1176 of file TBuilder.cxx.
References _forLine, _szLinkDistance, TMLine::distance(), showlog::err, TRobustLineFitter::fit(), TTrackBase::fitted(), genRecEmupikp::i, initialLine(), TTrackBase::links(), TTrackBase::remove(), s, and deljobs::string.
Referenced by buildStereoNew().
01176 { 01177 #ifdef TRKRECO_WINDOW 01178 std::string old = sz.text(); 01179 #endif 01180 01181 static float _szLinkMaxDistance = 5; 01182 01183 unsigned nLinks = _forLine.length(); 01184 TMLine line0 = initialLine; 01185 line0.remove(initialLine.links()); 01186 #ifdef TRKRECO_DEBUG 01187 line0.fitted(true); 01188 #endif 01189 unsigned nGoodLinks0 = 0; 01190 AList<TMLink> targets; 01191 unsigned nLoops = 0; 01192 while (1) { 01193 ++nLoops; 01194 01195 unsigned nGoodLinks = 0; 01196 for (unsigned i = 0; i < nLinks; i++) { 01197 float distance = line0.distance(* _forLine[i]); 01198 if (distance < _szLinkDistance) 01199 targets.append(_forLine[i]); 01200 if (distance < _szLinkMaxDistance) { 01201 ++nGoodLinks; 01202 } 01203 } 01204 01205 #ifdef TRKRECO_DEBUG 01206 std::cout << " ... searchLine : # of close hits(last) = " << nGoodLinks0 01207 << ", # of close hits = " << nGoodLinks << std::endl; 01208 #endif 01209 01210 //...Check condition... 01211 if (nGoodLinks0 == nGoodLinks) break; 01212 01213 //...Do fit... 01214 TMLine newLine(targets); 01215 static TRobustLineFitter fitter("robust fitter"); 01216 int err = fitter.fit(newLine); 01217 if (err) { 01218 #ifdef TRKRECO_WINDOW 01219 std::cout << " ... searchLine : failed to fit" << std::endl; 01220 std::string s = "line search failed"; 01221 sz.text(s); 01222 sz.wait(); 01223 #endif 01224 break; 01225 } 01226 01227 //...To protect infinite loop... 01228 if (nLoops > 10) { 01229 #ifdef TRKRECO_DEBUG_DETAIL 01230 std::cout << " reached to max # of loops(10) : break"; 01231 #endif 01232 break; 01233 } 01234 01235 #ifdef TRKRECO_WINDOW 01236 std::string ss = ", # of close hits(last) = " + itostring(int(nGoodLinks0)) 01237 + ", # of close hits = " + itostring(int(nGoodLinks)); 01238 sz.append(line0, leda_brown); 01239 sz.append(newLine, leda_green); 01240 sz.text(old + ", nLoops = " + itostring(int(nLoops)) + ss); 01241 sz.wait(); 01242 sz.remove(line0); 01243 sz.remove(newLine); 01244 #endif 01245 01246 line0 = newLine; 01247 nGoodLinks0 = nGoodLinks; 01248 targets.removeAll(); 01249 } 01250 01251 return line0; 01252 }
AList< TMLine > TBuilder::searchLines1 | ( | void | ) | const |
Definition at line 1155 of file TBuilder.cxx.
References _forLine, showlog::err, and genRecEmupikp::line.
01155 { 01156 AList<TMLine> lines; 01157 01158 TMLine & line = * new TMLine(_forLine); 01159 int err = line.fit(); 01160 if (err) { 01161 delete & line; 01162 } 01163 else { 01164 lines.append(line); 01165 } 01166 01167 #ifdef TRKRECO_DEBUG 01168 std::cout << " ... searchLines1 : # of lines found = " 01169 << lines.length() << std::endl; 01170 #endif 01171 01172 return lines; 01173 }
AList< TMLine > TBuilder::searchLines2 | ( | void | ) | const |
Definition at line 1069 of file TBuilder.cxx.
References _links, showlog::err, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by searchInitialLines().
01069 { 01070 AList<TMLine> lines; 01071 01072 const AList<TMLink> * l[2]; 01073 for (unsigned skip = 0; skip < 15; skip++) { 01074 if (skip == 0) { 01075 l[0] = & _links[0]; 01076 l[1] = & _links[1]; 01077 } 01078 else if (skip == 1) { 01079 l[1] = & _links[2]; 01080 } 01081 else if (skip == 2) { 01082 l[1] = & _links[3]; 01083 } 01084 else if (skip == 3) { 01085 l[1] = & _links[4]; 01086 } 01087 else if (skip == 4) { 01088 l[1] = & _links[5]; 01089 } 01090 else if (skip == 5) { 01091 l[0] = & _links[1]; 01092 l[1] = & _links[2]; 01093 } 01094 else if (skip == 6) { 01095 l[1] = & _links[3]; 01096 } 01097 else if (skip == 7) { 01098 l[1] = & _links[4]; 01099 } 01100 else if (skip == 8) { 01101 l[1] = & _links[5]; 01102 } 01103 else if (skip == 9) { 01104 l[0] = & _links[2]; 01105 l[1] = & _links[3]; 01106 } 01107 else if (skip == 10) { 01108 l[1] = & _links[4]; 01109 } 01110 else if (skip == 11) { 01111 l[1] = & _links[5]; 01112 } 01113 else if (skip == 12) { 01114 l[0] = & _links[3]; 01115 l[1] = & _links[4]; 01116 } 01117 else if (skip == 13) { 01118 l[1] = & _links[5]; 01119 } 01120 else if (skip == 14) { 01121 l[0] = & _links[4]; 01122 } 01123 01124 unsigned n[2]; 01125 for (unsigned i = 0; i < 2; i++) 01126 n[i] = l[i]->length(); 01127 01128 for (unsigned i0 = 0; i0 < n[0]; i0++) { 01129 for (unsigned i1 = 0; i1 < n[1]; i1++) { 01130 AList<TMLink> forLine; 01131 forLine.append((* l[0])[i0]); 01132 forLine.append((* l[1])[i1]); 01133 01134 TMLine & line = * new TMLine(forLine); 01135 int err = line.fit(); 01136 if (err) { 01137 delete & line; 01138 continue; 01139 } 01140 01141 lines.append(line); 01142 } 01143 } 01144 } 01145 01146 #ifdef TRKRECO_DEBUG 01147 std::cout << " ... searchLines2 : # of lines found = " 01148 << lines.length() << std::endl; 01149 #endif 01150 01151 return lines; 01152 }
AList< TMLine > TBuilder::searchLines3 | ( | void | ) | const |
Definition at line 964 of file TBuilder.cxx.
References _links, showlog::err, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by searchInitialLines().
00964 { 00965 AList<TMLine> lines; 00966 00967 const AList<TMLink> * l[3]; 00968 for (unsigned skip = 0; skip < 20; skip++) { 00969 if (skip == 0) { 00970 l[0] = & _links[0]; 00971 l[1] = & _links[1]; 00972 l[2] = & _links[2]; 00973 } 00974 else if (skip == 1) { 00975 l[2] = & _links[3]; 00976 } 00977 else if (skip == 2) { 00978 l[2] = & _links[4]; 00979 } 00980 else if (skip == 3) { 00981 l[2] = & _links[5]; 00982 } 00983 else if (skip == 4) { 00984 l[1] = & _links[2]; 00985 } 00986 else if (skip == 5) { 00987 l[2] = & _links[4]; 00988 } 00989 else if (skip == 6) { 00990 l[2] = & _links[3]; 00991 } 00992 else if (skip == 7) { 00993 l[1] = & _links[3]; 00994 l[2] = & _links[4]; 00995 } 00996 else if (skip == 8) { 00997 l[2] = & _links[5]; 00998 } 00999 else if (skip == 9) { 01000 l[1] = & _links[4]; 01001 } 01002 else if (skip == 10) { 01003 l[0] = & _links[1]; 01004 } 01005 else if (skip == 11) { 01006 l[1] = & _links[3]; 01007 } 01008 else if (skip == 12) { 01009 l[2] = & _links[4]; 01010 } 01011 else if (skip == 13) { 01012 l[1] = & _links[2]; 01013 } 01014 else if (skip == 14) { 01015 l[2] = & _links[3]; 01016 } 01017 else if (skip == 15) { 01018 l[2] = & _links[5]; 01019 } 01020 else if (skip == 16) { 01021 l[0] = & _links[2]; 01022 l[1] = & _links[3]; 01023 } 01024 else if (skip == 17) { 01025 l[2] = & _links[3]; 01026 } 01027 else if (skip == 18) { 01028 l[1] = & _links[4]; 01029 l[2] = & _links[5]; 01030 } 01031 else if (skip == 19) { 01032 l[0] = & _links[3]; 01033 } 01034 01035 unsigned n[3]; 01036 for (unsigned i = 0; i < 3; i++) 01037 n[i] = l[i]->length(); 01038 01039 for (unsigned i0 = 0; i0 < n[0]; i0++) { 01040 for (unsigned i1 = 0; i1 < n[1]; i1++) { 01041 for (unsigned i2 = 0; i2 < n[2]; i2++) { 01042 AList<TMLink> forLine; 01043 forLine.append((* l[0])[i0]); 01044 forLine.append((* l[1])[i1]); 01045 forLine.append((* l[2])[i2]); 01046 01047 TMLine & line = * new TMLine(forLine); 01048 int err = line.fit(); 01049 if (err) { 01050 delete & line; 01051 continue; 01052 } 01053 01054 lines.append(line); 01055 } 01056 } 01057 } 01058 } 01059 01060 #ifdef TRKRECO_DEBUG 01061 std::cout << " ... searchLines3 : # of lines found = " 01062 << lines.length() << std::endl; 01063 #endif 01064 01065 return lines; 01066 }
AList< TMLine > TBuilder::searchLines4 | ( | void | ) | const |
Definition at line 867 of file TBuilder.cxx.
References _links, showlog::err, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by searchInitialLines().
00867 { 00868 AList<TMLine> lines; 00869 00870 const AList<TMLink> * l[4]; 00871 for (unsigned skip = 0; skip < 15; skip++) { 00872 if (skip == 0) { 00873 l[0] = & _links[0]; 00874 l[1] = & _links[1]; 00875 l[2] = & _links[2]; 00876 l[3] = & _links[3]; 00877 } 00878 else if (skip == 1) { 00879 l[3] = & _links[4]; 00880 } 00881 else if (skip == 2) { 00882 l[3] = & _links[5]; 00883 } 00884 else if (skip == 3) { 00885 l[2] = & _links[3]; 00886 l[3] = & _links[4]; 00887 } 00888 else if (skip == 4) { 00889 l[3] = & _links[5]; 00890 } 00891 else if (skip == 5) { 00892 l[2] = & _links[4]; 00893 } 00894 else if (skip == 6) { 00895 l[1] = & _links[2]; 00896 l[2] = & _links[3]; 00897 l[3] = & _links[4]; 00898 } 00899 else if (skip == 7) { 00900 l[3] = & _links[5]; 00901 } 00902 else if (skip == 8) { 00903 l[2] = & _links[4]; 00904 } 00905 else if (skip == 9) { 00906 l[1] = & _links[3]; 00907 } 00908 else if (skip == 10) { 00909 l[0] = & _links[1]; 00910 l[1] = & _links[2]; 00911 l[2] = & _links[3]; 00912 l[3] = & _links[4]; 00913 } 00914 else if (skip == 11) { 00915 l[3] = & _links[5]; 00916 } 00917 else if (skip == 12) { 00918 l[2] = & _links[4]; 00919 } 00920 else if (skip == 13) { 00921 l[1] = & _links[3]; 00922 } 00923 else if (skip == 14) { 00924 l[0] = & _links[2]; 00925 } 00926 00927 unsigned n[4]; 00928 for (unsigned i = 0; i < 4; i++) 00929 n[i] = l[i]->length(); 00930 00931 for (unsigned i0 = 0; i0 < n[0]; i0++) { 00932 for (unsigned i1 = 0; i1 < n[1]; i1++) { 00933 for (unsigned i2 = 0; i2 < n[2]; i2++) { 00934 for (unsigned i3 = 0; i3 < n[3]; i3++) { 00935 AList<TMLink> forLine; 00936 forLine.append((* l[0])[i0]); 00937 forLine.append((* l[1])[i1]); 00938 forLine.append((* l[2])[i2]); 00939 forLine.append((* l[3])[i3]); 00940 00941 TMLine & line = * new TMLine(forLine); 00942 int err = line.fit(); 00943 if (err) { 00944 delete & line; 00945 continue; 00946 } 00947 00948 lines.append(line); 00949 } 00950 } 00951 } 00952 } 00953 } 00954 00955 #ifdef TRKRECO_DEBUG 00956 std::cout << " ... searchLines4 : # of lines found = " 00957 << lines.length() << std::endl; 00958 #endif 00959 00960 return lines; 00961 }
AList< TMLine > TBuilder::searchLines5 | ( | void | ) | const |
Definition at line 798 of file TBuilder.cxx.
References _links, showlog::err, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by searchInitialLines().
00798 { 00799 AList<TMLine> lines; 00800 00801 const AList<TMLink> * l[5]; 00802 for (unsigned skip = 0; skip < 6; skip++) { 00803 if (skip == 0) { 00804 l[0] = & _links[1]; 00805 l[1] = & _links[2]; 00806 l[2] = & _links[3]; 00807 l[3] = & _links[4]; 00808 l[4] = & _links[5]; 00809 } 00810 else if (skip == 1) { 00811 l[0] = & _links[0]; 00812 } 00813 else if (skip == 2) { 00814 l[1] = & _links[1]; 00815 } 00816 else if (skip == 3) { 00817 l[2] = & _links[2]; 00818 } 00819 else if (skip == 4) { 00820 l[3] = & _links[3]; 00821 } 00822 else if (skip == 5) { 00823 l[4] = & _links[4]; 00824 } 00825 00826 unsigned n[5]; 00827 for (unsigned i = 0; i < 5; i++) 00828 n[i] = l[i]->length(); 00829 00830 for (unsigned i0 = 0; i0 < n[0]; i0++) { 00831 for (unsigned i1 = 0; i1 < n[1]; i1++) { 00832 for (unsigned i2 = 0; i2 < n[2]; i2++) { 00833 for (unsigned i3 = 0; i3 < n[3]; i3++) { 00834 for (unsigned i4 = 0; i4 < n[4]; i4++) { 00835 00836 AList<TMLink> forLine; 00837 forLine.append((* l[0])[i0]); 00838 forLine.append((* l[1])[i1]); 00839 forLine.append((* l[2])[i2]); 00840 forLine.append((* l[3])[i3]); 00841 forLine.append((* l[4])[i4]); 00842 00843 TMLine & line = * new TMLine(forLine); 00844 int err = line.fit(); 00845 if (err) { 00846 delete & line; 00847 continue; 00848 } 00849 00850 lines.append(line); 00851 } 00852 } 00853 } 00854 } 00855 } 00856 } 00857 00858 #ifdef TRKRECO_DEBUG 00859 std::cout << " ... searchLines5 : # of lines found = " 00860 << lines.length() << std::endl; 00861 #endif 00862 00863 return lines; 00864 }
AList< TMLine > TBuilder::searchLines6 | ( | void | ) | const |
Definition at line 753 of file TBuilder.cxx.
References _links, showlog::err, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by searchInitialLines().
00753 { 00754 unsigned n[6]; 00755 for (unsigned i = 0; i < 6; i++) 00756 n[i] = _links[i].length(); 00757 00758 AList<TMLine> lines; 00759 for (unsigned i0 = 0; i0 < n[0]; i0++) { 00760 for (unsigned i1 = 0; i1 < n[1]; i1++) { 00761 for (unsigned i2 = 0; i2 < n[2]; i2++) { 00762 for (unsigned i3 = 0; i3 < n[3]; i3++) { 00763 for (unsigned i4 = 0; i4 < n[4]; i4++) { 00764 for (unsigned i5 = 0; i5 < n[5]; i5++) { 00765 00766 AList<TMLink> forLine; 00767 forLine.append(_links[0][i0]); 00768 forLine.append(_links[1][i1]); 00769 forLine.append(_links[2][i2]); 00770 forLine.append(_links[3][i3]); 00771 forLine.append(_links[4][i4]); 00772 forLine.append(_links[5][i5]); 00773 00774 TMLine & line = * new TMLine(forLine); 00775 int err = line.fit(); 00776 if (err) { 00777 delete & line; 00778 continue; 00779 } 00780 00781 lines.append(line); 00782 } 00783 } 00784 } 00785 } 00786 } 00787 } 00788 00789 #ifdef TRKRECO_DEBUG 00790 std::cout << " ... searchLines5 : # of lines found = " 00791 << lines.length() << std::endl; 00792 #endif 00793 00794 return lines; 00795 }
AList< TSegment > TBuilder::selectStereoSegment | ( | const TMLine & | line, | |
const AList< TSegment > & | list, | |||
const AList< TMLink > & | szList | |||
) | const |
Definition at line 497 of file TBuilder.cxx.
References _szSegmentDistance, genRecEmupikp::i, and genRecEmupikp::line.
Referenced by initialLine(), and initialLineOld().
00499 { 00500 AList<TSegment> outList; 00501 unsigned n = list.length(); 00502 for (unsigned i = 0; i < n; i++) { 00503 float distance = line.distance(* szList[i]); 00504 if (distance < _szSegmentDistance) outList.append(list[i]); 00505 } 00506 return outList; 00507 }
unsigned TBuilder::stereoQuality | ( | const AList< TMLink > & | links | ) | const [private] |
checks stereo quality of a track.
Definition at line 1464 of file TBuilder.cxx.
References _links, _nHits, and genRecEmupikp::i.
Referenced by buildStereoNew().
01464 { 01465 unsigned n[6] = {0, 0, 0, 0, 0, 0}; 01466 01467 //...Check superlayers... 01468 unsigned nLinks = links.length(); 01469 for (unsigned i = 0; i < nLinks; i++) { 01470 const TMLink & l = * links[i]; 01471 if (l.wire()->axial()) continue; 01472 // ++n[l.wire()->superLayerId() / 2]; 01473 // cout<<l.wire()->axialStereoLayerId()<<endl; 01474 ++n[l.wire()->axialStereoLayerId()/4]; 01475 } 01476 01477 unsigned nTotal = 0; 01478 unsigned nMissing = 0; 01479 unsigned innermostStereo = 5; 01480 unsigned outermostStereo = 0; 01481 unsigned innermostAxial = 4; 01482 unsigned outermostAxial = 0; 01483 unsigned innerSL = 6; 01484 unsigned outerSL = 0; 01485 for (unsigned i = 0; i < 6; i++) { 01486 if (_links[i].length() > 1) { 01487 if(i > outermostStereo) outermostStereo = i; 01488 if(i < innermostStereo) innermostStereo = i; 01489 } 01490 if (n[i] > 1) ++nTotal; 01491 } 01492 for (unsigned i = 0; i < 5; i++) { 01493 if (_nHits[i] > 1) { 01494 if (i > outermostAxial) outermostAxial = i; 01495 if (i < innermostAxial) innermostAxial = i; 01496 } 01497 } 01498 01499 if(innermostStereo > 1 && innermostAxial < 3) innerSL = 2; 01500 else innerSL = innermostStereo; 01501 if(outermostStereo > 1 && outermostAxial > 2) outerSL = 5; 01502 else outerSL = outermostStereo; 01503 01504 for (unsigned i = 0; i < 6; i++) { 01505 if (_links[i].length() > 0) { 01506 //zsl 051014 if ((_nHits[i] > 1) && (_nHits[i + 1] > 1)) 01507 if (i <= outerSL && i >= innerSL) 01508 if (n[i] < 2) 01509 ++nMissing; 01510 } 01511 if (n[i] > 1) ++nTotal; 01512 } 01513 unsigned toBeReturn = 0; 01514 if (nMissing <= 1) toBeReturn = 2; 01515 else if (nMissing == 2) toBeReturn = 1; 01516 if (nTotal < 2) toBeReturn = 0; 01517 01518 #ifdef TRKRECO_DEBUG 01519 std::cout << " ... stereoQuality : axial "; 01520 for (unsigned i = 0; i < 6; i++) 01521 std::cout << _nHits[i] << ","; 01522 std::cout << std::endl 01523 << " : stereo "; 01524 for (unsigned i = 0; i < 5; i++) 01525 std::cout << n[i] << ","; 01526 std::cout << " : total " << nTotal << " super layers, " 01527 << " : quality=" << toBeReturn << std::endl; 01528 #endif 01529 01530 return toBeReturn; 01531 }
AList<TMLink> TBuilder::_allLinks [mutable, private] |
Definition at line 126 of file TBuilder.h.
Referenced by buildStereoNew(), and initializeForStereo().
THelixFitter TBuilder::_fitter [private] |
Definition at line 114 of file TBuilder.h.
Referenced by build(), buildRphi(), buildStereo(), salvage(), and TBuilder().
AList<TMLink> TBuilder::_forLine [mutable, private] |
Definition at line 128 of file TBuilder.h.
Referenced by buildStereoNew(), initializeForStereo(), searchLine(), and searchLines1().
AList<TMLink> TBuilder::_links[6] [mutable, private] |
Definition at line 127 of file TBuilder.h.
Referenced by buildStereoNew(), initializeForStereo(), searchInitialLines(), searchLines2(), searchLines3(), searchLines4(), searchLines5(), searchLines6(), and stereoQuality().
const float TBuilder::_maxSigma [private] |
const float TBuilder::_maxSigmaStereo [private] |
unsigned TBuilder::_minNCores [private] |
Definition at line 123 of file TBuilder.h.
Referenced by buildRphi(), buildStereo(), and initializeForStereo().
unsigned TBuilder::_minNLinksForCircle [private] |
Definition at line 122 of file TBuilder.h.
std::string TBuilder::_name [private] |
unsigned TBuilder::_nHits[5] [mutable, private] |
Definition at line 130 of file TBuilder.h.
Referenced by initializeForStereo(), and stereoQuality().
unsigned TBuilder::_nSuperLayers [mutable, private] |
Definition at line 129 of file TBuilder.h.
Referenced by buildStereoNew(), and initializeForStereo().
const float TBuilder::_salvageLevel [private] |
const float TBuilder::_szLinkDistance [private] |
const float TBuilder::_szSegmentDistance [private] |