/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/TrkReco/TrkReco-00-08-59-patch4-slc6tag/src/TTrackBase.cxx

Go to the documentation of this file.
00001 //-----------------------------------------------------------------------------
00002 // $Id: TTrackBase.cxx,v 1.19 2011/09/05 17:32:47 maoh Exp $
00003 //-----------------------------------------------------------------------------
00004 // Filename : TTrackBase.h
00005 // Section  : Tracking
00006 // Owner    : Yoshi Iwasaki
00007 // Email    : yoshihito.iwasaki@kek.jp
00008 //-----------------------------------------------------------------------------
00009 // Description : A virtual class for a track class in tracking.
00010 //               See http://bsunsrv1.kek.jp/~yiwasaki/tracking/
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 //    _superLayer(0),
00028 //    _nSuperLayers(0),
00029   _fitter(0),
00030   _updated(false),
00031   _fitted(false),
00032   _time(0.) {
00033 //      _layer[0] = 0;
00034 //      _layer[1] = 0;
00035 //      _nLayers[0] = 0;
00036 //      _nLayers[1] = 0;
00037 //    update();
00038 }
00039 
00040 TTrackBase::TTrackBase()
00041 : _mc(0),
00042 //    _superLayer(0),
00043 //    _nSuperLayers(0),
00044   _fitter(0),
00045   _updated(true),
00046   _fitted(false),
00047   _time(0.) {
00048 //      _layer[0] = 0;
00049 //      _layer[1] = 0;
00050 //      _nLayers[0] = 0;
00051 //      _nLayers[1] = 0;
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         //...Calculate closest approach...
00115         int err = approach(l);
00116         if (err < 0) {
00117             unused.append(l);
00118             continue;
00119         }
00120 
00121         //...Calculate sigma...
00122         float distance = (l.positionOnWire() - l.positionOnTrack()).mag();
00123         float diff = fabs(distance - l.drift());
00124         float sigma = diff / l.dDrift();
00125 
00126         //...For debug...
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         //...Make sigma cut...
00138         if (sigma > maxSigma) {
00139             unused.append(l);
00140             continue;
00141         }
00142 
00143         //...OK...
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 //      std::cout<<" pull of link = "<<_links[i]->pull()<<std::endl;
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 //      for (unsigned i = 0; i < bad.length(); i++) {
00197 //      const TMDCWireHit * hit = bad[i]->hit();
00198 //      hit->state(hit->state() | WireHitInvalidForFit);
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    // if(g_sigmalyr1)g_sigmalyr1->fill(sqrt(_links[i]->pull()),_links[i]->wire()->layerId());
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   //if(sigma>9){bad.append(_links[jbad]);if(g_sigmalyr)g_sigmalyr->fill(sqrt(sigma),_links[jbad]->wire()->layerId());}
00229 //  if(sigma>20.25&&chi2>2.08){bad.append(_links[jbad]);}
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     //...Calculate closest approach...
00262     int err = approach(l);
00263     if (err < 0) return 0;
00264     //...Calculate sigma...
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     //...For debug...
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     //...Make sigma cut...
00281     if (sigma < maxSigma) return 1;
00282 
00283     return 0;
00284 }
00285 
00286 //  unsigned
00287 //  TTrackBase::nAxialHits(void) const {
00288 //      unsigned n = _links.length();
00289 //      unsigned a = 0;
00290 //      for (unsigned i = 0; i < n; i++) {
00291 //      if (_links[i]->wire()->axial()) ++a;
00292 //      }
00293 //      return a;
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 //  TMLink *
00333 //  TTrackBase::innerMostLink(unsigned mask) const {
00334 //      if (mask == 0) return InnerMost(_links);
00335 //      unsigned n = _links.length();
00336 //      AList<TMLink> tmp;
00337 //      for (unsigned i = 0; i < n; i++) {
00338 //      const TMDCWireHit & h = * _links[i]->hit();
00339 //      if (h.state() & mask) tmp.append(_links[i]);
00340 //      }
00341 //      return InnerMost(tmp);
00342 //  }
00343 
00344 //  TMLink *
00345 //  TTrackBase::outerMostLink(unsigned mask) const {
00346 //      if (mask == 0) return OuterMost(_links);
00347 //      unsigned n = _links.length();
00348 //      AList<TMLink> tmp;
00349 //      for (unsigned i = 0; i < n; i++) {
00350 //      const TMDCWireHit & h = * _links[i]->hit();
00351 //      if (h.state() & mask) tmp.append(_links[i]);
00352 //      }
00353 //      return OuterMost(tmp);
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; // added by matsu ( 1999/05/24 )
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; // added by matsu ( 1999/05/24 )
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 }

Generated on Tue Nov 29 23:14:16 2016 for BOSS_7.0.2 by  doxygen 1.4.7