TBuilder Class Reference

A class to build a track. More...

#include <TBuilder.h>

List of all members.

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::stringname (void) const
 returns name.
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 dumps debug information.
TTrackbuildRphi (const AList< TMLink > &) const
 builds a r/phi track from TMLinks or from Segments.
TTrackbuildRphi (const AList< TSegment > &) const
TTrackbuildStereoNew (const TTrack &t, AList< TSegment > &goodSegments, AList< TSegment > &badSegments) const
TTrackbuildStereo (const TTrack &t, AList< TSegment > &) const
TTrackbuildStereo (TTrack &t, TMLine &l, const AList< TMLink > &links) const
TTrackbuildStereoOld (TTrack &t, const AList< TMLink > &allLinks, const AList< TMLink > &isolatedLinks) const
TTrackbuild (TTrack &t, const TMLine &l) const
void salvage (TTrack &t, AList< TMLink > &hits) const
 salvages hits.
void salvage (TTrack &t, AList< TSegment > &segments) const
TMLineinitialLine (const TTrack &, AList< TSegment > &) const
 makes a line.
TMLineinitialLineOld (const TTrack &, AList< TSegment > &) const
TMLineinitialLine1 (const TTrack &, const AList< TSegment > &, const AList< TMLink > &) const
TMLineinitialLine2 (const TTrack &, const AList< TMLink > &) const
AList< TMLinesearchInitialLines (unsigned nSuperLayers) const
AList< TMLinesearchLines6 (void) const
AList< TMLinesearchLines5 (void) const
AList< TMLinesearchLines4 (void) const
AList< TMLinesearchLines3 (void) const
AList< TMLinesearchLines2 (void) const
AList< TMLinesearchLines1 (void) const
TMLine searchLine (const TMLine &initialLine) const
AList< TSegmentselectStereoSegment (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]


Detailed Description

A class to build a track.

Definition at line 34 of file TBuilder.h.


Constructor & Destructor Documentation

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]

Destructor.

Definition at line 58 of file TBuilder.cxx.

00058                     {
00059 }


Member Function Documentation

TTrack * TBuilder::build ( TTrack t,
const TMLine l 
) const

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 }

TTrack * TBuilder::buildRphi ( const AList< TSegment > &   )  const

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 }

TTrack * TBuilder::buildRphi ( const AList< TMLink > &   )  const

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 }

TTrack * TBuilder::buildStereo ( TTrack t,
TMLine l,
const AList< TMLink > &  links 
) const

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 }

TTrack * TBuilder::buildStereo ( const TTrack t,
AList< TSegment > &   
) const

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().

00062                                                                  {
00063 }

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 }

TMLine * TBuilder::initialLine ( const TTrack ,
AList< TSegment > &   
) const

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 }

TMLine * TBuilder::initialLine2 ( const TTrack ,
const AList< TMLink > &   
) const

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 }

TMLine * TBuilder::initialLineOld ( const TTrack ,
AList< TSegment > &   
) const

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 }

void TBuilder::removeFarSegment ( const TMLine ,
AList< TSegment > &  ,
AList< TMLink > &   
) const

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 }

void TBuilder::salvage ( TTrack t,
AList< TSegment > &  segments 
) const

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 }

void TBuilder::salvage ( TTrack t,
AList< TMLink > &  hits 
) const

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 }

TMLine TBuilder::searchLine ( const TMLine initialLine  )  const

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 }


Member Data Documentation

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]

Definition at line 115 of file TBuilder.h.

Referenced by buildRphi().

const float TBuilder::_maxSigmaStereo [private]

Definition at line 116 of file TBuilder.h.

Referenced by build(), and buildStereo().

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]

Definition at line 113 of file TBuilder.h.

Referenced by name().

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]

Definition at line 117 of file TBuilder.h.

Referenced by buildRphi(), and salvage().

const float TBuilder::_szLinkDistance [private]

Definition at line 119 of file TBuilder.h.

Referenced by buildStereo(), and searchLine().

const float TBuilder::_szSegmentDistance [private]

Definition at line 118 of file TBuilder.h.

Referenced by selectStereoSegment().


Generated on Tue Nov 29 23:35:57 2016 for BOSS_7.0.2 by  doxygen 1.4.7