TBuilderCosmic Class Reference

A class to build a cosmic track. More...

#include <TBuilderCosmic.h>

Inheritance diagram for TBuilderCosmic:

TBuilder0 List of all members.

Public Member Functions

 TBuilderCosmic (const std::string &name, float salvageLevel)
 Constructor.
virtual ~TBuilderCosmic ()
 Destructor.
TTrackbuildStereo (TTrack &track, const AList< TMLink > &) const
 appends stereo hits to a track.
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.
const TMSelectortrackSelector (void) const
 returns a track selector.
virtual const TMSelectortrackSelector (const TMSelector &)
 sets a track selector.
TTrackbuildRphi (const AList< TMLink > &) const
 builds a r/phi track from TMLinks or from Segments.
TTrackbuildStereo0 (TTrack &track, const AList< TMLink > &) const
 appends stereo hits to a track. (old version)
void appendClusters (TTrack &track, const AList< TMLink > &) const
 appends TMLinks in a list.
void salvage (TTrack &track, AList< TMLink > &list) const
 salvages links in a list. Used links will be removed from a list.
virtual int fit (TTrackBase &) const
 fits a track using a private fitter.

Protected Attributes

TMSelector _circleSelector
TMSelector _trackSelector
TMSelector _lineSelector
float _stereoZ3
float _stereoZ4
float _stereoChisq3
float _stereoChisq4
float _stereoMaxSigma

Private Attributes

TCosmicFitter _fitter

Detailed Description

A class to build a cosmic track.

Definition at line 36 of file TBuilderCosmic.h.


Constructor & Destructor Documentation

TBuilderCosmic::TBuilderCosmic ( const std::string name,
float  salvageLevel 
)

Constructor.

Definition at line 24 of file TBuilderCosmic.cxx.

00025 : TBuilder0(name, salvageLevel), _fitter("TBuilderCosmic Fitter") {
00026 }

TBuilderCosmic::~TBuilderCosmic (  )  [virtual]

Destructor.

Definition at line 28 of file TBuilderCosmic.cxx.

00028                                 {
00029 }


Member Function Documentation

void TBuilder0::appendClusters ( TTrack track,
const AList< TMLink > &   
) const [inherited]

appends TMLinks in a list.

Definition at line 1417 of file TBuilder0.cxx.

References TBuilder0::_trackSelector, TTrackBase::appendByApproach(), TBuilder0::fit(), TMSelector::maxSigma(), and TTrackBase::refine().

Referenced by TConformalFinder0::appendClusters2().

01418                                                            {
01419 
01420     AList<TMLink> tmp = list;
01421 
01422     //...Append them...
01423     track.appendByApproach(tmp, _trackSelector.maxSigma() * 2. / 3.);
01424 
01425     //...Refine it...
01426     AList<TMLink> bad;
01427     fit(track);
01428     track.refine(bad, _trackSelector.maxSigma());
01429 }

TTrack * TBuilder0::buildRphi ( const AList< TMLink > &   )  const [inherited]

builds a r/phi track from TMLinks or from Segments.

Definition at line 83 of file TBuilder0.cxx.

References TBuilder0::_circleSelector, TBuilder0::_name, TBuilder0::_trackSelector, check_raw_filter::dist, Dump(), showlog::err, TBuilder0::fit(), TTrackBase::fit(), genRecEmupikp::i, ganga-rec::j, TMSelector::maxSigma(), NLayers(), TMSelector::nLinks(), NSuperLayers(), TMSelector::preSelect(), SameSuperLayer(), TMSelector::select(), TBuilder0::selectHits(), SuperLayer(), t(), and WireHitFittingValid.

Referenced by TFastFinder::doit(), and TConformalFinder0::makeTrack().

00083                                                      {
00084 #ifdef TRKRECO_DEBUG_DETAIL
00085     std::cout << _name << " ... building a rphi track" << std::endl;
00086     std::cout << _name << " ... selecting good hits" << std::endl;
00087 //      TTrackBase tmp;
00088 //      tmp.append(list);
00089 //      rphiWindow->append(tmp, leda_red);
00090 #endif
00091 
00092     //...Check # of links...
00093     if (list.length() < _circleSelector.nLinks()) {
00094 #ifdef TRKRECO_DEBUG_DETAIL
00095         std::cout << _name << " ... rejected by nLinks(";
00096         std::cout << list.length() << ") < ";
00097         std::cout << _circleSelector.nLinks() << std::endl;
00098 #endif  
00099     }
00100 
00101     //...Select core hits...
00102     AList<TMLink> cores = list;
00103     selectHits(cores);
00104     if (cores.length() < 5) cores = list;
00105     //cout<<"list: "<<list.length()<<"  core: "<<cores.length()<<endl;
00106 
00107     //...Core check...
00108 #ifdef TRKRECO_DEBUG_DETAIL
00109     std::cout << _name << " ... checking cores : cores=" << std::endl;
00110     Dump(cores, "detail");
00111 #endif
00112     unsigned sLinks = SuperLayer(list);
00113     unsigned sUsed = SuperLayer(cores);
00114 #ifdef TRKRECO_DEBUG_DETAIL
00115     std::cout << "    super layer ptn=" << sLinks;
00116     std::cout << ",super layer used=" << sUsed << std::endl;
00117 #endif
00118     if (sLinks != sUsed) {
00119 #ifdef TRKRECO_DEBUG_DETAIL
00120         std::cout << _name << "    ... appending hits to cores" << std::endl;
00121 #endif
00122         unsigned diff = sLinks - sUsed;
00123         unsigned asl[5] = {2, 3, 4, 9, 10};
00124         for (unsigned j = 0; j < 5; j++) {
00125             //if (diff & (1 << ((5 - j) * 2))) {
00126             if (diff & (1 << asl[5 - j])) {
00127 #ifdef TRKRECO_DEBUG_DETAIL
00128                 std::cout << "    super layer " << (5 - j) * 2 << "searching";
00129                 std::cout << std::endl;
00130 #endif
00131                 AList<TMLink> links = SameSuperLayer(list, asl[5 - j]);
00132                 TMLink * best = NULL;
00133                 double bestD = 999.;
00134                 for (unsigned i = 0; i < links.length(); i++) {
00135                     double dist = links[i]->hit()->drift();
00136                     if (dist < 0.02) {
00137 #ifdef TRKRECO_DEBUG_DETAIL
00138                         std::cout << "    " << links[i]->wire()->name();
00139                         std::cout << " appended (small dist)" << std::endl;
00140 #endif
00141                         cores.append(links[i]);
00142                         continue;
00143                     }
00144                     if (dist < bestD) {
00145                         best = links[i];
00146                         bestD = dist;
00147                     }
00148                 }
00149                 if (best) {
00150                     cores.append(best);
00151 #ifdef TRKRECO_DEBUG_DETAIL
00152                     std::cout << "    " << best->wire()->name();
00153                     std::cout << " appended (best)" << std::endl;
00154 #endif
00155                 }
00156             }
00157         }
00158     }
00159 
00160     //...Check cores again...
00161     unsigned nCores = cores.length();
00162     AList<TMLink> realCores;
00163     for (unsigned i = 0; i < nCores; i++) {
00164         TMLink * l = cores[i];
00165         if (l->hit()->state() & WireHitFittingValid)
00166             realCores.append(l);
00167     }
00168     if (NSuperLayers(realCores) < 2) {
00169 #ifdef TRKRECO_DEBUG_DETAIL
00170         std::cout << "    ... rejected by small number of super layers" << std::endl;
00171 #endif  
00172         return NULL;
00173     }
00174     if (NLayers(realCores) < 5) {
00175 #ifdef TRKRECO_DEBUG_DETAIL
00176         std::cout << "    ... rejected by small number of layers" << std::endl;
00177 #endif  
00178         return NULL;
00179     }
00180 
00181     //...Make a circle...
00182 #ifdef TRKRECO_DEBUG_DETAIL
00183     std::cout << _name << " ... making a circle : #cores=" << cores.length();
00184     std::cout << std::endl;
00185 #endif
00186     AList<TMLink> hits = list;
00187     hits.remove(cores);
00188     TCircle c(cores);
00189 
00190     //...Test it...
00191     if (! _circleSelector.preSelect(c)) return NULL;
00192 
00193     //...Fitting...
00194     int err = c.fit();
00195     if (err < 0) {
00196 #ifdef TRKRECO_DEBUG_DETAIL
00197         std::cout << "    ... rejected by failure of the 1st fit : ";
00198         std::cout << "err = " << err << std::endl;
00199 #endif
00200         return NULL;
00201     }
00202 
00203     //...Test it...
00204     if (! _circleSelector.select(c)) return NULL;
00205 
00206     //...Make a track...
00207 #ifdef TRKRECO_DEBUG_DETAIL
00208     std::cout << _name << " ... making a track" << std::endl;
00209 #endif
00210     TTrack * t = new TTrack(c);
00211     if (! _trackSelector.preSelect(* t)) {
00212         delete t;
00213         return NULL;
00214     }
00215 
00216     //...Fitting...
00217     AList<TMLink> bad;
00218     //cout<<"track0: "<<t->nLinks()<<endl;
00219     err = fit(* t);
00220     if (err < 0) goto discard;
00221     t->refine(bad, _trackSelector.maxSigma() * 100.);
00222     //cout<<"track1: "<<t->nLinks()<<endl;
00223     err = fit(* t);
00224     if (err < 0) goto discard;
00225 #ifdef TRKRECO_DEBUG_DETAIL
00226     t->dump("detail", "    1st> ");
00227 #endif
00228 
00229     //...Test it...
00230     if (! _trackSelector.select(* t)) goto discard;
00231 
00232     //...Try to append non-core hits...
00233 #ifdef TRKRECO_DEBUG_DETAIL
00234     std::cout << _name << " ... appending non-core hits" << std::endl;
00235 #endif
00236     t->appendByApproach(hits, sqrt(_trackSelector.maxSigma()));
00237     err = fit(* t);
00238     if (err < 0) goto discard;
00239 //    cout<<"  2D track1: "<<t->links().length()<<endl;
00240     t->refine(bad, _trackSelector.maxSigma() * 10.);
00241     err = fit(* t);
00242     if (err < 0) goto discard;
00243 //    cout<<"  2D track2: "<<t->links().length()<<endl;
00244     t->refine(bad, _trackSelector.maxSigma());
00245     err = fit(* t);
00246     if (err < 0) goto discard;
00247 //    cout<<"  2D track3: "<<t->links().length()<<endl;
00248 #ifdef TRKRECO_DEBUG_DETAIL
00249     t->dump("detail", "    2nd> ");
00250 #endif
00251 
00252     //...Test it...
00253     if (! _trackSelector.select(* t)) goto discard;
00254 
00255     //...OK...
00256 #ifdef TRKRECO_DEBUG_DETAIL
00257 //      rphiWindow->append(* t, leda_blue);
00258 //      rphiWindow->draw();
00259 //      rphiWindow->wait();
00260 //      rphiWindow->remove(tmp);
00261 //      rphiWindow->remove(* t);
00262 #endif
00263 
00264     return t;
00265 
00266     //...Something happened...
00267 discard:
00268 #ifdef TRKRECO_DEBUG_DETAIL
00269     std::cout << "    ... rejected by fitting failure : ";
00270     std::cout << " err = " << err << std::endl;
00271 //      rphiWindow->append(* t, leda_blue);
00272 //      rphiWindow->draw();
00273 //      rphiWindow->wait();
00274 //      rphiWindow->remove(tmp);
00275 //      rphiWindow->remove(* t);
00276 #endif
00277     delete t;
00278     return NULL;
00279 }

TTrack * TBuilderCosmic::buildStereo ( TTrack track,
const AList< TMLink > &   
) const [virtual]

appends stereo hits to a track.

Reimplemented from TBuilder0.

Definition at line 32 of file TBuilderCosmic.cxx.

References _fitter, TTrack::_helix, TBuilder0::_lineSelector, TBuilder0::_trackSelector, TLine0::a(), Helix::a(), TTrackBase::append(), TLine0::b(), TTrack::charge(), showlog::err, TCosmicFitter::fit(), TTrackBase::fit(), T3DLine::helix(), TTrack::helix(), genRecEmupikp::i, TMLink::leftRight(), genRecEmupikp::line, TMLink::link(), TTrackBase::links(), TMSelector::maxSigma(), TBuilder0::name(), TMSelector::nLinks(), TMSelector::nLinksStereo(), TMLink::position(), TTrackBase::refine(), TTrackBase::removeLinks(), TMSelector::select(), SortByWireId(), TTrack::szPosition(), t(), tr, WireHitFittingValid, WireHitLeft, and WireHitRight.

00032                                                                             {
00033 #ifdef TRKRECO_DEBUG_DETAIL
00034     std::cout << name() << "(stereo) ... dump of stereo candidate hits" << std::endl;
00035     AList<TMLink> tmp = list;
00036     tmp.sort(SortByWireId);
00037     std::cout << "    ";
00038     for (unsigned i = 0; i < tmp.length(); i++) {
00039         TMLink * l = tmp[i];
00040         std::cout << l->wire()->layerId() << "-";
00041         std::cout << l->wire()->localId() << ",";
00042     }
00043     std::cout << std::endl;
00044 #endif
00045 
00046     //...Check # of links...
00047     if (list.length() < _lineSelector.nLinksStereo()) {
00048 #ifdef TRKRECO_DEBUG_DETAIL
00049         std::cout << name() << "(stereo) ... rejected by nLinks(";
00050         std::cout << list.length() << ") < ";
00051         std::cout << _lineSelector.nLinks() << std::endl;
00052 #endif  
00053         return NULL;
00054     }
00055 
00056     //...Calculate s and z for every links...
00057     unsigned n = list.length();
00058     AList<TMLink> forLine;
00059     for (unsigned i = 0; i < n; i++) {
00060         TMLink * l = list[i];
00061 
00062         //... Require Fitting vaildation 
00063         if(!(l->hit()->state()& WireHitFittingValid)) continue;
00064 
00065         TMLink * t = new TMLink(* l);
00066 
00067         //...Assuming wire position...
00068         t->leftRight(2);
00069         int err = track.szPosition(* t);
00070         if (err) {
00071             delete t;
00072             continue;
00073         }
00074 
00075         //...Store the sz link...
00076         t->link(l);
00077         forLine.append(t);
00078     }
00079 
00080 #ifdef TRKRECO_DEBUG_DETAIL
00081     std::cout << name() << "(stereo) ... dump of sz links" << std::endl;
00082     std::cout << "    ";
00083     tmp = forLine;
00084     tmp.sort(SortByWireId);
00085     for (unsigned i = 0; i < tmp.length(); i++) {
00086         TMLink * l = tmp[i];
00087         std::cout << l->wire()->layerId() << "-";
00088         std::cout << l->wire()->localId() << ",";
00089     }
00090     std::cout << std::endl;
00091 #endif  
00092     
00093     //...Check # of sz links...
00094     if (forLine.length() < _lineSelector.nLinksStereo()) {
00095 #ifdef TRKRECO_DEBUG_DETAIL
00096         std::cout << name() << "(stereo) ... rejected by sz nLinks(";
00097         std::cout << forLine.length() << ") < ";
00098         std::cout << _lineSelector.nLinks() << std::endl;
00099 #endif  
00100         HepAListDeleteAll(forLine);
00101         return NULL;
00102     }
00103 
00104     //...Make a line...
00105     unsigned nLine = forLine.length();
00106     TLine0 line(forLine);
00107     int err = line.fit();
00108 
00109     //...Linear fit...
00110     if (err < 0) {
00111 #ifdef TRKRECO_DEBUG_DETAIL
00112         std::cout << name() << "(stereo) ... linear fit failure. nLinks(";
00113         std::cout << forLine.length() << ")" << std::endl;
00114 #endif  
00115         HepAListDeleteAll(forLine);
00116         return NULL;
00117     }
00118 
00119 #ifdef TRKRECO_DEBUG_DETAIL
00120     std::cout << name() << "(stereo) ... dump of left-right" << std::endl;
00121 #endif
00122 
00123     //...Decide Left or Right...
00124     AList<TMLink> forNewLine;
00125     for (unsigned i = 0; i < nLine; i++) {
00126         TMLink * t = forLine[i];
00127         TMLink * tl = new TMLink(* t);
00128         TMLink * tr = new TMLink(* t);
00129 
00130         tl->leftRight(WireHitLeft);
00131         tr->leftRight(WireHitRight);
00132 
00133         int err = track.szPosition(* tl);
00134         if (err) {
00135             delete tl;
00136             tl = NULL;
00137         }
00138         err = track.szPosition(* tr);
00139         if (err) {
00140             delete tr;
00141             tr = NULL;
00142         }
00143         if ((tl == NULL) && (tr == NULL)) continue;
00144 
00145         TMLink * best;
00146         if (tl == NULL) best = tr;
00147         else if (tr == NULL) best = tl;
00148         else {
00149             if (line.distance(* tl) < line.distance(* tr)) {
00150                 best = tl;
00151                 delete tr;
00152             }
00153             else {
00154                 best = tr;
00155                 delete tl;
00156             }
00157         }
00158 
00159 #ifdef TRKRECO_DEBUG_DETAIL
00160         std::cout << "    ";
00161         std::cout << t->wire()->layerId() << "-";
00162         std::cout << t->wire()->localId();
00163         if (tl != NULL)
00164             std::cout << ",left " << tl->position() << "," << line.distance(* tl);
00165         if (tr != NULL)
00166             std::cout << ",right " << tr->position() << "," << line.distance(* tr);
00167         std::cout << std::endl;
00168 #endif
00169 
00170         best->link(t->link());
00171         forNewLine.append(best);
00172     }
00173 
00174     //...Check # of sz links...
00175     if (forNewLine.length() < _lineSelector.nLinksStereo()) {
00176 #ifdef TRKRECO_DEBUG_DETAIL
00177         std::cout << name() << "(stereo) ... rejected by lr nLinks(";
00178         std::cout << forNewLine.length() << ") < ";
00179         std::cout << _lineSelector.nLinks() << std::endl;
00180 #endif  
00181         HepAListDeleteAll(forLine);
00182         HepAListDeleteAll(forNewLine);
00183         return NULL;
00184     }
00185 
00186     //...Create new line...
00187 #ifdef TRKRECO_DEBUG_DETAIL
00188     std::cout << name() << "(stereo) ... creating a new line" << std::endl;
00189 #endif  
00190     unsigned nNewLine = forNewLine.length();
00191     TLine0 newLine(forNewLine);
00192 
00193     //...Make a seed track again
00194     err = newLine.fit();
00195 
00196     //...Linear fit...
00197     if (err < 0) {
00198 #ifdef TRKRECO_DEBUG_DETAIL
00199         std::cout << name() << "(stereo) ... 2nd linear fit failure. nLinks(";
00200         std::cout << forNewLine.length() << ")" << std::endl;
00201 #endif  
00202         HepAListDeleteAll(forLine);
00203         HepAListDeleteAll(forNewLine);
00204         return NULL;
00205     }
00206 
00207     //...Remove bad points...
00208     AList<TMLink> bad;
00209 //    newLine.refine(bad, 40.);  //Liuqg, meaningless while without magnetic field
00210 //    err = newLine.fit();
00211 //    newLine.refine(bad, 20.);
00212 //    err = newLine.fit();
00213 //    newLine.refine(bad, 10.);
00214 //    err = newLine.fit();
00215 
00216     //...Linear fit again...
00217     if (err < 0) {
00218         HepAListDeleteAll(forLine);
00219         HepAListDeleteAll(forNewLine);
00220 #ifdef TRKRECO_DEBUG_DETAIL
00221         std::cout << "    appendStereo cut ... new line 2nd linear fit failure. ";
00222         std::cout << "# of links = " << n << "," << nLine;
00223         std::cout << "," << nNewLine << std::endl;
00224 #endif  
00225         return NULL;
00226     }
00227 
00228     //...3D fit...
00229     const AList<TMLink> & good = newLine.links();
00230     unsigned nn = good.length();
00231     for (unsigned i = 0; i < nn; i++) {
00232         track.append(* good[i]->link());
00233     }
00234     Vector a(5);
00235     a = track.helix().a();
00236     a[3] = newLine.b();
00237     a[4] = track.charge() * newLine.a();
00238     track._helix->a(a);
00239 
00240 #ifdef LINE_COSMIC
00241     T3DLine * Ltrack = new T3DLine(track);
00242     
00243     //...Refine...
00244     err = _fitter.fit(*Ltrack);
00245     Ltrack->refine(bad, _trackSelector.maxSigma() * 30.);
00246     err = _fitter.fit(*Ltrack);
00247     Ltrack->refine(bad, _trackSelector.maxSigma() * 3.);
00248     err = _fitter.fit(*Ltrack);
00249 //    Ltrack->refine(bad, _trackSelector.maxSigma() * 0.21);  //liuqg, for prelimilary test
00250     track.refine(bad, _trackSelector.maxSigma()); 
00251     err = _fitter.fit(*Ltrack);
00252 
00253     //...Test it...
00254 /*    if (! _trackSelector.select(*Ltrack)) {
00255         HepAListDeleteAll(forLine);
00256         HepAListDeleteAll(forNewLine);
00257         delete Ltrack;
00258         return NULL;
00259     }
00260 */
00261     //...Termination...
00262     HepAListDeleteAll(forLine);
00263     HepAListDeleteAll(forNewLine);
00264     track.removeLinks();
00265     track.append(Ltrack->links());
00266     Vector a1(5);
00267     a1 = Ltrack->helix().a();
00268     track._helix->a(a1);
00269     delete Ltrack;
00270     return & track;
00271 #endif
00272 
00273     //...Refine...
00274     err = _fitter.fit(track);
00275     track.refine(bad, _trackSelector.maxSigma() * 30.);
00276     err = _fitter.fit(track);
00277     track.refine(bad, _trackSelector.maxSigma() * 3.);
00278     err = _fitter.fit(track);
00279     track.refine(bad, _trackSelector.maxSigma());  //liuqg, for prelimilary test
00280 //    track.refine(bad, _trackSelector.maxSigma() * 0.21); 
00281     err = _fitter.fit(track);
00282     //...Test it...
00283     if (! _trackSelector.select(track)) {
00284         HepAListDeleteAll(forLine);
00285         HepAListDeleteAll(forNewLine);
00286         return NULL;
00287     }
00288 
00289     //...Termination...
00290     HepAListDeleteAll(forLine);
00291     HepAListDeleteAll(forNewLine);
00292     return & track;
00293 }

TTrack * TBuilder0::buildStereo0 ( TTrack track,
const AList< TMLink > &   
) const [inherited]

appends stereo hits to a track. (old version)

Definition at line 307 of file TBuilder0.cxx.

References TTrack::_helix, TBuilder0::_lineSelector, TBuilder0::_name, TBuilder0::_trackSelector, TLine0::a(), Helix::a(), TTrackBase::append(), TTrack::charge(), Helix::curv(), Dump(), showlog::err, TBuilder0::fit(), TTrackBase::fit(), TLine0::fit2p(), TLine0::fit2sp(), TTrack::helix(), genRecEmupikp::i, TMLink::leftRight(), genRecEmupikp::line, TMLink::link(), TTrackBase::links(), TMSelector::maxSigma(), TMSelector::nLinks(), TMSelector::nLinksStereo(), TMLink::position(), rb::R(), TTrackBase::refine(), TLine0::refine(), TLine0::removeChits(), TMSelector::select(), TTrack::szPosition(), t(), tr, WireHitLeft, and WireHitRight.

00307                                                                         {
00308 #ifdef TRKRECO_DEBUG_DETAIL
00309     std::cout << _name << "(stereo) ... dump of stereo candidate hits" << std::endl;
00310     Dump(list, "sort flag", "    ");
00311 #endif
00312 
00313     //...Check # of links...
00314     if (list.length() < _lineSelector.nLinksStereo()) {
00315 #ifdef TRKRECO_DEBUG_DETAIL
00316         std::cout << _name << "(stereo) ... rejected by nLinks(";
00317         std::cout << list.length() << ") < ";
00318         std::cout << _lineSelector.nLinks() << std::endl;
00319 #endif  
00320         return NULL;
00321     }
00322 
00323     //...Calculate s and z for every links...
00324     unsigned n = list.length();
00325     AList<TMLink> forLine;
00326     for (unsigned i = 0; i < n; i++) {
00327         TMLink * l = list[i];
00328         TMLink * t = new TMLink(* l);
00329 
00330         //...Assuming wire position...
00331         t->leftRight(2);
00332         int err = track.szPosition(* t);
00333         if (err) {
00334             delete t;
00335             continue;
00336         }
00337 
00338         //...Store the sz link...
00339         t->link(l);
00340         forLine.append(t);
00341     }
00342 
00343 #ifdef TRKRECO_DEBUG_DETAIL
00344     std::cout << _name << "(stereo) ... dump of sz links" << std::endl;
00345     Dump(forLine, "sort flag", "    ");
00346 #endif    
00347 
00348     //...Check # of sz links...
00349     if (forLine.length() < _lineSelector.nLinksStereo()) {
00350 #ifdef TRKRECO_DEBUG_DETAIL
00351         std::cout << _name << "(stereo) ... rejected by sz nLinks(";
00352         std::cout << forLine.length() << ") < ";
00353         std::cout << _lineSelector.nLinks() << std::endl;
00354 #endif  
00355         HepAListDeleteAll(forLine);
00356         return NULL;
00357     }
00358 
00359     //...Make a line...
00360     unsigned nLine = forLine.length();
00361     TLine0 line(forLine);
00362     int err = line.fit2sp();
00363     if (err < 0) {
00364         err = line.fit2p();
00365         if (err < 0) err = line.fit();
00366     }
00367 
00368     //...Linear fit...
00369     if (err < 0) {
00370 #ifdef TRKRECO_DEBUG_DETAIL
00371         std::cout << _name << "(stereo) ... linear fit failure. nLinks(";
00372         std::cout << forLine.length() << ")" << std::endl;
00373 #endif  
00374         HepAListDeleteAll(forLine);
00375         return NULL;
00376     }
00377 
00378 #ifdef TRKRECO_DEBUG_DETAIL
00379     std::cout << _name << "(stereo) ... dump of left-right" << std::endl;
00380 #endif
00381 
00382     //...Decide Left or Right...
00383     AList<TMLink> forNewLine;
00384     for (unsigned i = 0; i < nLine; i++) {
00385         TMLink * t = forLine[i];
00386         TMLink * tl = new TMLink(* t);
00387         TMLink * tr = new TMLink(* t);
00388 
00389         tl->leftRight(WireHitLeft);
00390         tr->leftRight(WireHitRight);
00391 
00392         int err = track.szPosition(* tl);
00393         if (err) {
00394             delete tl;
00395             tl = NULL;
00396         }
00397         err = track.szPosition(* tr);
00398         if (err) {
00399             delete tr;
00400             tr = NULL;
00401         }
00402         if ((tl == NULL) && (tr == NULL)) continue;
00403 
00404         TMLink * best;
00405         if (tl == NULL) best = tr;
00406         else if (tr == NULL) best = tl;
00407         else {
00408             if (line.distance(* tl) < line.distance(* tr)) {
00409                 best = tl;
00410                 delete tr;
00411             }
00412             else {
00413                 best = tr;
00414                 delete tl;
00415             }
00416         }
00417 
00418 #ifdef TRKRECO_DEBUG_DETAIL
00419         std::cout << "    ";
00420         std::cout << t->wire()->layerId() << "-";
00421         std::cout << t->wire()->localId();
00422         if (tl != NULL)
00423             std::cout << ",left " << tl->position() << "," << line.distance(* tl);
00424         if (tr != NULL)
00425             std::cout << ",right " << tr->position() << "," << line.distance(* tr);
00426         std::cout << std::endl;
00427 #endif
00428 
00429         best->link(t->link());
00430         forNewLine.append(best);
00431     }
00432 
00433     //...Check # of sz links...
00434     if (forNewLine.length() < _lineSelector.nLinksStereo()) {
00435 #ifdef TRKRECO_DEBUG_DETAIL
00436         std::cout << _name << "(stereo) ... rejected by lr nLinks(";
00437         std::cout << forNewLine.length() << ") < ";
00438         std::cout << _lineSelector.nLinks() << std::endl;
00439 #endif  
00440         HepAListDeleteAll(forLine);
00441         HepAListDeleteAll(forNewLine);
00442         return NULL;
00443     }
00444 
00445     //...Create new line...
00446 #ifdef TRKRECO_DEBUG_DETAIL
00447     std::cout << _name << "(stereo) ... creating a new line" << std::endl;
00448 #endif  
00449     unsigned nNewLine = forNewLine.length();
00450     TLine0 newLine(forNewLine);
00451 
00452     //... Remove extremely bad points
00453     newLine.removeChits();
00454 
00455     //...Make a seed track again
00456     err = newLine.fit2sp();
00457     if (err < 0) {
00458         err = newLine.fit2p();
00459         if (err < 0) err = newLine.fit();
00460     }
00461 
00462     //...Linear fit...
00463     if (err < 0) {
00464 #ifdef TRKRECO_DEBUG_DETAIL
00465         std::cout << _name << "(stereo) ... 2nd linear fit failure. nLinks(";
00466         std::cout << forNewLine.length() << ")" << std::endl;
00467 #endif  
00468         HepAListDeleteAll(forLine);
00469         HepAListDeleteAll(forNewLine);
00470         return NULL;
00471     }
00472 
00473     //...Remove bad points...
00474     AList<TMLink> bad;
00475     newLine.refine(bad, 40.);
00476     err = newLine.fit();
00477     newLine.refine(bad, 30.);
00478     err = newLine.fit();
00479     newLine.refine(bad, 20.);
00480     err = newLine.fit();
00481     newLine.refine(bad, 10.);
00482     err = newLine.fit();
00483     float R = fabs(track.helix().curv());
00484     if (R > 80.) {
00485         newLine.refine(bad, 5.);
00486         err = newLine.fit();
00487     }
00488 
00489     //...Linear fit again...
00490     if (err < 0) {
00491         HepAListDeleteAll(forLine);
00492         HepAListDeleteAll(forNewLine);
00493 #ifdef TRKRECO_DEBUG_DETAIL
00494         std::cout << "    appendStereo cut ... new line 2nd linear fit failure. ";
00495         std::cout << "# of links = " << n << "," << nLine;
00496         std::cout << "," << nNewLine << std::endl;
00497 #endif  
00498         return NULL;
00499     }
00500 
00501     //...3D fit...
00502     const AList<TMLink> & good = newLine.links();
00503     unsigned nn = good.length();
00504     for (unsigned i = 0; i < nn; i++) {
00505         track.append(* good[i]->link());
00506     }
00507     Vector a(5);
00508     a = track.helix().a();
00509     a[4] = track.charge() * newLine.a();
00510     track._helix->a(a);
00511 
00512     //...Refine...
00513     err = fit(track);
00514     track.refine(bad, _trackSelector.maxSigma() * 100.);
00515     err = fit(track);
00516     track.refine(bad, _trackSelector.maxSigma() * 10.);
00517     err = fit(track);
00518     track.refine(bad, _trackSelector.maxSigma());
00519     err = fit(track);
00520 
00521     //...Test it...
00522     if (! _trackSelector.select(track)) {
00523         HepAListDeleteAll(forLine);
00524         HepAListDeleteAll(forNewLine);
00525         return NULL;
00526     }
00527 
00528     //...Termination...
00529     HepAListDeleteAll(forLine);
00530     HepAListDeleteAll(forNewLine);
00531     return & track;
00532 }

void TBuilder0::dump ( const std::string message = std::string(""),
const std::string prefix = std::string("") 
) const [inherited]

dumps debug information.

Definition at line 79 of file TBuilder0.cxx.

00079                                                                   {
00080 }

int TBuilder0::fit ( TTrackBase  )  const [inline, virtual, inherited]

fits a track using a private fitter.

Definition at line 143 of file TBuilder0.h.

References TBuilder0::_fitter, and TCosmicFitter::fit().

Referenced by TBuilder0::appendClusters(), TBuilder0::buildRphi(), TBuilder0::buildStereo(), TBuilder0::buildStereo0(), TBuilderCurl::resetHelixFit(), TBuilder0::salvage(), and TBuilder0::salvageNormal().

00143                                    {
00144     return _fitter.fit(a);
00145 }

const std::string & TBuilder0::name ( void   )  const [inline, inherited]

returns name.

Definition at line 137 of file TBuilder0.h.

References TBuilder0::_name.

Referenced by buildStereo(), TBuilder0::salvage(), and TBuilder0::salvageNormal().

00137                           {
00138     return _name;
00139 }

void TBuilder0::salvage ( TTrack track,
AList< TMLink > &  list 
) const [inherited]

salvages links in a list. Used links will be removed from a list.

Definition at line 1479 of file TBuilder0.cxx.

References TBuilder0::_salvageLevel, TBuilder0::fit(), genRecEmupikp::i, TBuilder0::name(), TBuilder0::salvageNormal(), TMDCWireHit::state(), t(), TrackOldConformalFinder, WireHitConformalFinder, and WireHitUsed.

01479                                                          {
01480 
01481 //    if (t.type() == TrackTypeNormal) {
01482         salvageNormal(t, hits);   //Pt high enough; fromIP.
01483         return;
01484 //    }
01485   //tmply for cosmic ray...
01486 #ifdef TRKRECO_DEBUG_DETAIL
01487     std::cout << name() << " ... salvaging" << std::endl;
01488     std::cout << "    # of given hits=" << hits.length() << std::endl;
01489 #endif
01490 
01491     unsigned nHits = hits.length();
01492     if (nHits == 0) return;
01493 
01494     //...Hit loop...
01495     AList<TMLink> candidates;
01496     for (unsigned i = 0; i < nHits; i++) {
01497         TMLink & l = * hits[i];
01498         const TMDCWireHit & h = * l.hit();
01499 
01500         //...Already used?...
01501         if (h.state() & WireHitUsed) continue;
01502         candidates.append(l);
01503     }
01504 
01505     //...Try to append this hit...
01506 //    t.appendByApproach(candidates, 10.);
01507     t.appendByApproach(candidates, _salvageLevel);
01508     fit(t);
01509     hits.remove(candidates);
01510     t.assign(WireHitConformalFinder);
01511     t.finder(TrackOldConformalFinder);
01512     // t.assign(WireHitConformalFinder, TrackOldConformalFinder);
01513 }

const TMSelector & TBuilder0::trackSelector ( const TMSelector  )  [virtual, inherited]

sets a track selector.

Definition at line 1400 of file TBuilder0.cxx.

References TBuilder0::_circleSelector, TBuilder0::_lineSelector, TBuilder0::_trackSelector, TMSelector::maxDistance(), TMSelector::maxImpact(), TMSelector::maxSigma(), TMSelector::minPt(), TMSelector::nLinks(), TMSelector::nLinksStereo(), and TMSelector::nSuperLayers().

const TMSelector & TBuilder0::trackSelector ( void   )  const [inline, inherited]

returns a track selector.

Definition at line 131 of file TBuilder0.h.

References TBuilder0::_trackSelector.

Referenced by TConformalFinder0::TConformalFinder0(), and TFastFinder::TFastFinder().

00131                                    {
00132     return _trackSelector;
00133 }


Member Data Documentation

TMSelector TBuilder0::_circleSelector [protected, inherited]

Definition at line 106 of file TBuilder0.h.

Referenced by TBuilder0::buildRphi(), and TBuilder0::trackSelector().

TCosmicFitter TBuilderCosmic::_fitter [private]

Reimplemented from TBuilder0.

Definition at line 54 of file TBuilderCosmic.h.

Referenced by buildStereo().

TMSelector TBuilder0::_lineSelector [protected, inherited]

Definition at line 110 of file TBuilder0.h.

Referenced by buildStereo(), TBuilder0::buildStereo(), TBuilder0::buildStereo0(), and TBuilder0::trackSelector().

float TBuilder0::_stereoChisq3 [protected, inherited]

Definition at line 113 of file TBuilder0.h.

Referenced by TBuilder0::buildStereo().

float TBuilder0::_stereoChisq4 [protected, inherited]

Definition at line 114 of file TBuilder0.h.

Referenced by TBuilder0::buildStereo().

float TBuilder0::_stereoMaxSigma [protected, inherited]

Definition at line 115 of file TBuilder0.h.

Referenced by TBuilder0::buildStereo().

float TBuilder0::_stereoZ3 [protected, inherited]

Definition at line 111 of file TBuilder0.h.

Referenced by TBuilder0::buildStereo().

float TBuilder0::_stereoZ4 [protected, inherited]

Definition at line 112 of file TBuilder0.h.

Referenced by TBuilder0::buildStereo().

TMSelector TBuilder0::_trackSelector [protected, inherited]

Definition at line 107 of file TBuilder0.h.

Referenced by TBuilder0::appendClusters(), TBuilder0::buildRphi(), buildStereo(), TBuilder0::buildStereo(), TBuilder0::buildStereo0(), and TBuilder0::trackSelector().


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