00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #define HEP_SHORT_NAMES
00014 #include "CLHEP/Alist/CList.h"
00015 #include "TrkReco/TTrackBase.h"
00016 #include "TrkReco/TMLink.h"
00017 #include "TrkReco/TMDCWire.h"
00018 #include "TrkReco/TMDCWireHit.h"
00019 #include "TrkReco/TMDCWireHitMC.h"
00020 #include "TrkReco/TMDCUtil.h"
00021 #include "TrkReco/TTrackHEP.h"
00022 #include "TrkReco/TMFitter.h"
00023
00024 TTrackBase::TTrackBase(const AList<TMLink> & a)
00025 : _links(a),
00026 _mc(0),
00027
00028
00029 _fitter(0),
00030 _updated(false),
00031 _fitted(false),
00032 _time(0.) {
00033
00034
00035
00036
00037
00038 }
00039
00040 TTrackBase::TTrackBase()
00041 : _mc(0),
00042
00043
00044 _fitter(0),
00045 _updated(true),
00046 _fitted(false),
00047 _time(0.) {
00048
00049
00050
00051
00052 }
00053
00054 TTrackBase::~TTrackBase() {
00055 }
00056
00057 void
00058 TTrackBase::dump(const std::string & msg, const std::string & pre) const {
00059 bool mc = (msg.find("mc") != std::string::npos);
00060 bool pull = (msg.find("pull") != std::string::npos);
00061 bool flag = (msg.find("flag") != std::string::npos);
00062 bool detail = (msg.find("detail") != std::string::npos);
00063 if (detail)
00064 mc = pull = flag = true;
00065
00066 if (detail || (msg.find("layer") != std::string::npos)) {
00067 if (! _updated) update();
00068 }
00069 if (detail || (msg.find("hits") != std::string::npos)) {
00070 Dump(_links, msg, pre);
00071 }
00072 }
00073
00074 void
00075 TTrackBase::update(void) const {
00076 _cores.removeAll();
00077 unsigned n = _links.length();
00078 for (unsigned i = 0; i < n; i++) {
00079 TMLink * l = _links[i];
00080 const TMDCWireHit & h = * l->hit();
00081 if (h.state() & WireHitInvalidForFit) continue;
00082 if (! (h.state() & WireHitFittingValid)) continue;
00083 _cores.append(l);
00084 }
00085 _updated = true;
00086 }
00087
00088 double
00089 TTrackBase::distance(const TMLink &) const {
00090 std::cout << "TTrackBase::distance !!! not implemented" << std::endl;
00091 return 0.;
00092 }
00093
00094 int
00095 TTrackBase::approach(TMLink &) const {
00096 std::cout << "TTrackBase::approach !!! not implemented" << std::endl;
00097 return -1;
00098 }
00099
00100 void
00101 TTrackBase::appendByApproach(AList<TMLink> & list, double maxSigma) {
00102 #ifdef TRKRECO_DEBUG_DETAIL
00103 std::cout << " TTrackBase::appendByApproach ... sigma=" << maxSigma << std::endl;
00104 #endif
00105
00106 AList<TMLink> unused;
00107 unsigned n = list.length();
00108 for (unsigned i = 0; i < n; i++) {
00109 TMLink & l = * list[i];
00110
00111 if ((_links.hasMember(l)) || (l.hit()->state() & WireHitUsed))
00112 continue;
00113
00114
00115 int err = approach(l);
00116 if (err < 0) {
00117 unused.append(l);
00118 continue;
00119 }
00120
00121
00122 float distance = (l.positionOnWire() - l.positionOnTrack()).mag();
00123 float diff = fabs(distance - l.drift());
00124 float sigma = diff / l.dDrift();
00125
00126
00127 #ifdef TRKRECO_DEBUG_DETAIL
00128 std::cout << " sigma=" << sigma;
00129 std::cout << ",dist=" << distance;
00130 std::cout << ",diff=" << diff;
00131 std::cout << ",err=" << l.hit()->dDrift() << ",";
00132 if (sigma < maxSigma) std::cout << "ok,";
00133 else std::cout << "X,";
00134 l.dump("mc");
00135 #endif
00136
00137
00138 if (sigma > maxSigma) {
00139 unused.append(l);
00140 continue;
00141 }
00142
00143
00144 _links.append(l);
00145 _updated = false;
00146 _fitted = false;
00147 }
00148 list.remove(unused);
00149 }
00150
00151 void
00152 TTrackBase::appendByDistance(AList<TMLink> & list, double sigma) {
00153 std::cout << "TTrackBase::appendByDistance !!! not implemented" << std::endl;
00154 list.removeAll();
00155 }
00156
00157 AList<TMLink>
00158 TTrackBase::refineMain(double sigma) {
00159 AList<TMLink> bad;
00160 unsigned n = _links.length();
00161 for (unsigned i = 0; i < n; i++){
00162
00163 if (_links[i]->pull() > sigma)
00164 bad.append(_links[i]);
00165 }
00166 return bad;
00167 }
00168
00169 void
00170 TTrackBase::refine(AList<TMLink> & list, double sigma) {
00171 AList<TMLink> bad = refineMain(sigma);
00172 #ifdef TRKRECO_DEBUG
00173 std::cout << " refine ... sigma=" << sigma << ", # of rejected hits=";
00174 std::cout << bad.length() << std::endl;
00175 #endif
00176 #ifdef TRKRECO_DEBUG
00177 Dump(bad, "sort pull mc", " ");
00178 #endif
00179
00180 if (bad.length()) {
00181 _links.remove(bad);
00182 list.append(bad);
00183 _fitted = false;
00184 _updated = false;
00185 }
00186 }
00187
00188 void
00189 TTrackBase::removeLinks(void){
00190 _links.removeAll();
00191 }
00192
00193 void
00194 TTrackBase::refine(double sigma) {
00195 AList<TMLink> bad = refineMain(sigma);
00196
00197
00198
00199
00200
00201 #ifdef TRKRECO_DEBUG_DETAIL
00202 std::cout << " refine ... sigma=" << sigma << std::endl;
00203 Dump(bad, "detail sort", " ");
00204 #endif
00205
00206 if (bad.length()) {
00207 _fitted = false;
00208 _updated = false;
00209 }
00210 }
00211 int
00212 TTrackBase::DropWorst() {
00213 AList<TMLink> bad;
00214 int jbad=-1;
00215 double sigma=0;
00216 unsigned n = _links.length();
00217 double chi2=0;
00218 for (unsigned i = 0; i < n; i++){
00219
00220 chi2+=_links[i]->pull();
00221 if (_links[i]->pull() > sigma){
00222 jbad=i;
00223 sigma = _links[i]->pull();
00224 }
00225 }
00226
00227 chi2=chi2/n;
00228
00229
00230 if(sigma>9){bad.append(_links[jbad]);}
00231 if (bad.length()) {
00232 _links.remove(bad);
00233 _fitted = false;
00234 _updated = false;
00235 }
00236 return bad.length();
00237 }
00238
00239 unsigned
00240 TTrackBase::testByApproach(const AList<TMLink> & list, double maxSigma) const {
00241 #ifdef TRKRECO_DEBUG_DETAIL
00242 std::cout << " TTrackBase::testByApproach ... sigma=" << maxSigma << std::endl;
00243 #endif
00244
00245 unsigned nOK = 0;
00246 unsigned n = list.length();
00247 for (unsigned i = 0; i < n; i++) {
00248 TMLink & l = * list[i];
00249 nOK += testByApproach(l, maxSigma);
00250 }
00251 return nOK;
00252 }
00253
00254 unsigned
00255 TTrackBase::testByApproach(const TMLink & link, double maxSigma) const {
00256 #ifdef TRKRECO_DEBUG_DETAIL
00257 std::cout << " TTrackBase::testByApproach ... sigma=" << maxSigma << std::endl;
00258 #endif
00259 TMLink l = link;
00260
00261
00262 int err = approach(l);
00263 if (err < 0) return 0;
00264
00265 float distance = l.distance();
00266 float diff = fabs(distance - l.hit()->drift());
00267 float sigma = diff / l.hit()->dDrift();
00268 l.pull(sigma * sigma);
00269
00270
00271 #ifdef TRKRECO_DEBUG_DETAIL
00272 std::cout << " sigma=" << sigma;
00273 std::cout << ",dist=" << distance;
00274 std::cout << ",diff=" << diff << ",";
00275 if (sigma < maxSigma) std::cout << "ok,";
00276 else std::cout << "X,";
00277 l.dump("mc");
00278 #endif
00279
00280
00281 if (sigma < maxSigma) return 1;
00282
00283 return 0;
00284 }
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 const AList<TMLink> &
00297 TTrackBase::links(unsigned mask) const {
00298 if (mask == 0) return _links;
00299
00300 std::cout << "TTrackBase::links !!! mask is not supportted yet" << std::endl;
00301 return _links;
00302 }
00303
00304 unsigned
00305 TTrackBase::nLinks(unsigned mask) const {
00306 unsigned n = _links.length();
00307 if (mask == 0) return n;
00308 unsigned nn = 0;
00309 for (unsigned i = 0; i < n; i++) {
00310 const TMDCWireHit & h = * _links[i]->hit();
00311 if (h.state() & mask) ++nn;
00312 }
00313 return nn;
00314 }
00315
00316 const AList<TMLink> &
00317 TTrackBase::cores(unsigned mask) const {
00318 if (mask)
00319 std::cout << "TTrackBase::cores !!! mask is not supported" << std::endl;
00320 if (! _updated) update();
00321 return _cores;
00322 }
00323
00324 unsigned
00325 TTrackBase::nCores(unsigned mask) const {
00326 if (mask)
00327 std::cout << "TTrackBase::nCores !!! mask is not supported" << std::endl;
00328 if (! _updated) update();
00329 return _cores.length();
00330 }
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 int
00357 TTrackBase::fit(void) {
00358 return _fitter->fit(* this);
00359 }
00360
00361 void
00362 TTrackBase::append(TMLink & a) {
00363 if ((a.hit()->state() & WireHitUsed)) {
00364 #ifdef TRKRECO_DEBUG_DETAIL
00365 std::cout << "TTrackBase::append !!! " << a.wire()->name()
00366 << " this is already used by another track!" << std::endl;
00367 #endif
00368 return;
00369 }
00370 if (_links.hasMember(a)) {
00371 #ifdef TRKRECO_DEBUG_DETAIL
00372 std::cout << "TTrackBase::append !!! " << a.wire()->name()
00373 << " this is already included in this track!" << std::endl;
00374 #endif
00375 return;
00376 }
00377 _links.append(a);
00378 _updated = false;
00379 _fitted = false;
00380 _fittedWithCathode = false;
00381 }
00382
00383 void
00384 TTrackBase::append(const AList<TMLink> & a) {
00385 AList<TMLink> tmp;
00386 for (unsigned i = 0; i < a.length(); i++) {
00387 if ((_links.hasMember(a[i])) || (a[i]->hit()->state() & WireHitUsed)) {
00388 #ifdef TRKRECO_DEBUG_DETAIL
00389 std::cout << " TTrackBase::append(list) !!! ";
00390 std::cout << a[i]->wire()->name();
00391 std::cout << " Hey!, this is already used! Don't mess with me.";
00392 std::cout << std::endl;
00393 #endif
00394 continue;
00395 }
00396 else {
00397 tmp.append(a[i]);
00398 }
00399 }
00400 _links.append(tmp);
00401 _updated = false;
00402 _fitted = false;
00403 _fittedWithCathode = false;
00404 }
00405
00406 const TTrackHEP * const
00407 TTrackBase::hep(void) const {
00408 unsigned n = _links.length();
00409 CAList<TTrackHEP> hepList;
00410 CList<unsigned> hepCounter;
00411 for (unsigned i = 0; i < n; i++) {
00412 const TTrackHEP * hep = _links[i]->hit()->mc()->hep();
00413 unsigned nH = hepList.length();
00414 bool found = false;
00415 for (unsigned j = 0; j < nH; j++) {
00416 if (hepList[j] == hep) {
00417 found = true;
00418 ++(* hepCounter[j]);
00419 }
00420 }
00421
00422 if (! found) {
00423 hepList.append(hep);
00424 unsigned c = 0;
00425 hepCounter.append(c);
00426 }
00427 }
00428
00429 _nHeps = hepList.length();
00430 _hep = 0;
00431 unsigned max = 0;
00432 for (unsigned i = 0; i < _nHeps; i++) {
00433 if ((* hepCounter[i]) > max) {
00434 max = (* hepCounter[i]);
00435 _hep = hepList[i];
00436 }
00437 }
00438
00439 return _hep;
00440 }
00441
00442 unsigned
00443 TTrackBase::nHeps(void) const {
00444 hep();
00445 return _nHeps;
00446 }