#include <TBuilderCosmic.h>
Inheritance diagram for TBuilderCosmic:
Public Member Functions | |
TBuilderCosmic (const std::string &name, float salvageLevel) | |
Constructor. | |
virtual | ~TBuilderCosmic () |
Destructor. | |
TTrack * | buildStereo (TTrack &track, const AList< TMLink > &) const |
appends stereo hits to a track. | |
const std::string & | name (void) const |
returns name. | |
void | dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const |
dumps debug information. | |
const TMSelector & | trackSelector (void) const |
returns a track selector. | |
virtual const TMSelector & | trackSelector (const TMSelector &) |
sets a track selector. | |
TTrack * | buildRphi (const AList< TMLink > &) const |
builds a r/phi track from TMLinks or from Segments. | |
TTrack * | buildStereo0 (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 |
Definition at line 36 of file TBuilderCosmic.h.
TBuilderCosmic::TBuilderCosmic | ( | const std::string & | name, | |
float | salvageLevel | |||
) |
TBuilderCosmic::~TBuilderCosmic | ( | ) | [virtual] |
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 }
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 }
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 }
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] |
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().
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 }
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().
01400 { 01401 _circleSelector.nLinks(a.nLinks()); 01402 _circleSelector.nSuperLayers(a.nSuperLayers()); 01403 _circleSelector.minPt(a.minPt()); 01404 _circleSelector.maxImpact(a.maxImpact()); 01405 01406 _trackSelector.nLinks(a.nLinks()); 01407 _trackSelector.nSuperLayers(a.nSuperLayers()); 01408 _trackSelector.maxSigma(a.maxSigma()); 01409 01410 _lineSelector.nLinksStereo(a.nLinksStereo()); 01411 _lineSelector.maxDistance(a.maxDistance()); 01412 01413 return a; 01414 }
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 }
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] |
float TBuilder0::_stereoChisq4 [protected, inherited] |
float TBuilder0::_stereoMaxSigma [protected, inherited] |
float TBuilder0::_stereoZ3 [protected, inherited] |
float TBuilder0::_stereoZ4 [protected, inherited] |
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().