00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "CLHEP/String/Strings.h"
00014 #include "TrkReco/TBuilder.h"
00015 #include "TrkReco/TMDC.h"
00016 #include "TrkReco/TMDCWire.h"
00017 #include "TrkReco/TMDCWireHit.h"
00018 #include "TrkReco/TMLink.h"
00019 #include "TrkReco/TCircle.h"
00020 #include "TrkReco/TLine0.h"
00021 #include "TrkReco/TMLine.h"
00022 #include "TrkReco/TTrack.h"
00023 #include "TrkReco/TSegment.h"
00024 #include "TrkReco/TPoint2D.h"
00025 #include "TrkReco/TLine2D.h"
00026 #include "TrkReco/TRobustLineFitter.h"
00027 #ifdef TRKRECO_DEBUG
00028 #include "TrkReco/TMDCWireHitMC.h"
00029 #include "TrkReco/TTrackHEP.h"
00030 #endif
00031 #ifdef TRKRECO_WINDOW
00032 #include "TrkReco/TWindow.h"
00033 TWindow sz("sz");
00034 #endif
00035
00036 TBuilder::TBuilder(const std::string & a,
00037 float maxSigma,
00038 float maxSigmaStereo,
00039 float salvageLevel,
00040 float szSegmentDistance,
00041 float szLinkDistance,
00042 unsigned fittingFlag)
00043 : _name(a),
00044 _fitter("TBuilder Fitter"),
00045 _maxSigma(maxSigma),
00046 _maxSigmaStereo(maxSigmaStereo),
00047 _salvageLevel(sqrt(salvageLevel)),
00048
00049 _minNCores(2),
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 }
00057
00058 TBuilder::~TBuilder() {
00059 }
00060
00061 void
00062 TBuilder::dump(const std::string & msg, const std::string & pre) const {
00063 }
00064
00065 TTrack *
00066 TBuilder::buildRphi(const AList<TSegment> & list) const {
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
00075
00076
00077
00078
00079 AList<TMLink> links = Links(list);
00080
00081
00082
00083
00084
00085
00086 TTrack * t = buildRphi(links);
00087
00088
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 }
00105
00106 TTrack *
00107 TBuilder::buildRphi(const AList<TMLink> & list) const {
00108 #ifdef TRKRECO_DEBUG
00109 std::cout << "... building rphi by links : # of links = ";
00110 std::cout << list.length() << std::endl;
00111 #endif
00112
00113
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
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
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
00156
00157 TTrack * t = new TTrack(c);
00158
00159 AList<TMLink> bad;
00160 err = _fitter.fit(* t);
00161
00162
00163 if (err < 0) goto discard;
00164 t->refine(bad, _maxSigma * 100.);
00165
00166
00167 err = _fitter.fit(* t);
00168
00169
00170 t->refine(bad, _maxSigma * 10.);
00171
00172
00173 err = _fitter.fit(* t);
00174
00175
00176 t->refine(bad, _maxSigma);
00177
00178
00179 err = _fitter.fit(* t);
00180
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
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
00198 return t;
00199
00200
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 }
00209
00210 void
00211 TBuilder::salvage(TTrack & t, AList<TMLink> & hits) const {
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
00223 t.appendByApproach(hits, _salvageLevel);
00224 _fitter.fit(t);
00225 }
00226
00227 void
00228 TBuilder::salvage(TTrack & t, AList<TSegment> & list) const {
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
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 }
00245
00246 TMLine *
00247 TBuilder::initialLine1(const TTrack & t,
00248 const AList<TSegment> & list,
00249 const AList<TMLink> & lList) const {
00250
00251
00252 if (list.length() < 2) return NULL;
00253
00254
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
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
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 }
00294
00295 TMLine *
00296 TBuilder::initialLine2(const TTrack & t,
00297 const AList<TMLink> & lList) const {
00298 #ifdef TRKRECO_DEBUG
00299 std::cout << " ... initlialLine2 : # of links = " << lList.length();
00300 std::cout << std::endl;
00301 #endif
00302
00303
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 }
00313
00314 TMLine *
00315 TBuilder::initialLine(const TTrack & t, AList<TSegment> & list) const {
00316
00317
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
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 }
00403
00404 TMLine *
00405 TBuilder::initialLineOld(const TTrack & t, AList<TSegment> & list) const {
00406
00407
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
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 }
00495
00496 AList<TSegment>
00497 TBuilder::selectStereoSegment(const TMLine & line,
00498 const AList<TSegment> & list,
00499 const AList<TMLink> & szList) const {
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 }
00508
00509 void
00510 TBuilder::removeFarSegment(const TMLine & line,
00511 AList<TSegment> & list,
00512 AList<TMLink> & szList) const {
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 }
00523
00524 TTrack *
00525 TBuilder::buildStereo(TTrack & track,
00526 TMLine & line,
00527 const AList<TMLink> & list) const {
00528 #ifdef TRKRECO_DEBUG
00529 std::cout << "... building stereo by links : # of links = ";
00530 std::cout << list.length() << std::endl;
00531 #endif
00532
00533
00534 AList<TMLink> cores;
00535 AList<TMLink> nonCores;
00536 SeparateCores(list, cores, nonCores);
00537
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
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
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
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
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
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
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
00652 HepAListDeleteAll(toRemove);
00653 HepAListDeleteAll(forNewLine);
00654 return & track;
00655 }
00656
00657 TTrack *
00658 TBuilder::buildStereo(const TTrack & t0, AList<TSegment> & segments) const {
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
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
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
00703 TTrack * ts = buildStereo(t, * line, links);
00704
00705
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 }
00722
00723 AList<TMLine>
00724 TBuilder::searchInitialLines(unsigned nSuperLayerMax) const {
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
00746
00747
00748 lines.sort(SortByB);
00749 return lines;
00750 }
00751
00752 AList<TMLine>
00753 TBuilder::searchLines6(void) const {
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 }
00796
00797 AList<TMLine>
00798 TBuilder::searchLines5(void) const {
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 }
00865
00866 AList<TMLine>
00867 TBuilder::searchLines4(void) const {
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 }
00962
00963 AList<TMLine>
00964 TBuilder::searchLines3(void) const {
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 }
01067
01068 AList<TMLine>
01069 TBuilder::searchLines2(void) const {
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 }
01153
01154 AList<TMLine>
01155 TBuilder::searchLines1(void) const {
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 }
01174
01175 TMLine
01176 TBuilder::searchLine(const TMLine & initialLine) const {
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
01211 if (nGoodLinks0 == nGoodLinks) break;
01212
01213
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
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 }
01253
01254 TTrack *
01255 TBuilder::build(TTrack & t, const TMLine & l) const {
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
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
01280
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();
01287 }else{
01288 a[4] = -1. * t.charge() * l.a();
01289 }
01290
01291 t._helix->a(a);
01292
01293
01294
01295
01296
01297 #ifdef TRKRECO_DEBUG_DETAIL
01298 static unsigned nTrk = 0;
01299 ++nTrk;
01300
01301
01302
01303
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
01310
01311
01312
01313 t.dump("detail", "before fit");
01314 std::cout << "Pdif mag=" << (t.p() - p0).mag() << std::endl;
01315
01316
01317
01318 #endif
01319
01320
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
01336
01337
01338
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
01349 return & t;
01350 }
01351
01352 bool
01353 TBuilder::initializeForStereo(const TTrack & t,
01354 const AList<TSegment> & segments,
01355 const AList<TSegment> & badSegments) const {
01356 _nSuperLayers = 0;
01357 for (unsigned i = 0; i < 5; i++)
01358 _nHits[i] = 0;
01359
01360 unsigned nSegments = segments.length();
01361
01362 for (unsigned i = 0; i < nSegments; i++) {
01363 TMLink & l = * new TMLink();
01364 int err = t.szPosition(* segments[i], l);
01365
01366 if (err) {
01367 delete & l;
01368 continue;
01369 }
01370
01371 if (!_links[l.wire()->axialStereoLayerId()/4].hasMember(l))
01372 _links[l.wire()->axialStereoLayerId()/4].append(l);
01373
01374
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
01382 for (unsigned i = 0; i < 6; i++) {
01383 if (_links[i].length() > 0) {
01384 ++_nSuperLayers;
01385 }
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396 }
01397
01398
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
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
01430
01431 tt.leftRight(i);
01432 int err = t.szPosition(tt);
01433
01434
01435
01436 if (err) {
01437 delete & tt;
01438 continue;
01439 }
01440 tt.link(& link);
01441 _forLine.append(tt);
01442 }
01443 }
01444
01445
01446 unsigned nA = t.cores().length();
01447 for (unsigned i = 0; i < nA; i++)
01448
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 }
01462
01463 unsigned
01464 TBuilder::stereoQuality(const AList<TMLink> & links) const {
01465 unsigned n[6] = {0, 0, 0, 0, 0, 0};
01466
01467
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
01473
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
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 }
01532
01533
01534 TTrack *
01535 TBuilder::buildStereoNew(const TTrack & t,
01536 AList<TSegment> & segments,
01537 AList<TSegment> & badSegments) const {
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
01553
01554
01555 if (! ok) goto endOfBuilding;
01556
01557 while (--nSuperLayers) {
01558
01559
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
01578 if (initialLines.length() == 0) continue;
01579
01580 bool found = false;
01581 unsigned nInitialLines = initialLines.length();
01582
01583
01584 for (unsigned i = 0; i < nInitialLines; i++) {
01585
01586
01587 const TMLine & line = * initialLines[i];
01588 TMLine newLine = searchLine(line);
01589
01590
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
01613 if (! stereoQuality(newLine.links()))
01614 continue;
01615
01616
01617 TTrack * t3d = new TTrack(t);
01618 t3d = build(* t3d, newLine);
01619 if (t3d == NULL) continue;
01620
01621
01622 unsigned quality = stereoQuality(t3d->links());
01623
01624
01625
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
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
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
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
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 }