/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/MdcFastTrkAlg/MdcFastTrkAlg-00-04-09/MdcFastTrkAlg/FTTrack.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     MdcFastTrkAlg
00004 // Module:      FTTrack
00005 // 
00006 // Description:  track class for MdcFastTrkAlg
00007 //
00008 
00009 #ifndef FTTrack_FLAG_
00010 #define FTTrack_FLAG_
00011 
00012 #include"TrackUtil/Helix.h"
00013 #include"TrackUtil/Lpav.h"
00014 #include"TrackUtil/zav.h"
00015 
00016 #include "MdcFastTrkAlg/FTList.h"
00017 #include "MdcFastTrkAlg/FTSegment.h"
00018 #include "MdcFastTrkAlg/MdcParameter.h"
00019 #include "MagneticField/IMagneticFieldSvc.h"
00020 #include "MagneticField/MagneticFieldSvc.h"
00021 
00022 #ifndef ENABLE_BACKWARDS_COMPATIBILITY
00023 typedef HepGeom::Point3D<double> HepPoint3D;
00024 #endif
00025 
00026 class FTWire;
00027 class FTTrack{
00028 public:
00030   FTTrack(FTList<FTSegment *> & axial_segments, float kappa, float chi2_kappa);
00031 
00033   ~FTTrack();
00034 
00035 public: // public member functions
00037   int r_phiFit(void);
00038 
00040   int  r_phiReFit(float vx, float xy, int vtx_flag);
00041   
00042   // cut the largest residual hit when do r-phi fit 
00043   int  r_phi2Fit(float vx, float xy, int vtx_flag);
00044   int  r_phi3Fit(int l, float vx, float xy, int vtx_flag);
00045   int  r_phi4Fit(float vx, float xy, int vtx_flag);
00046 
00048   int s_zFit(void);
00049 
00051   void updateSZ(void);
00052 
00054   int linkStereoSegments(void);
00055 
00056 public: // Selectors
00057 
00059   Helix * helix(void) const;
00060 
00062   const Lpav & lpav(void) const;
00063 
00065   const zav & Zav(void) const;
00066 
00068   FTList<FTSegment *>& axial_segments(void) const;
00069 
00071   FTList<FTSegment *>& stereo_segments(void) const;
00072 
00074   float kappa_tmp(void) const;
00075 
00077   float chi2_kappa_tmp(void) const;
00078 
00081   float d_z(float s, float z) const;
00082 
00083 #ifndef OnlineMode
00086   void printout();
00087 #endif
00088 
00089 public: // Modifiers
00091   float SigmaZ(float z);
00092 
00094   float SigmaS(float s);
00095 
00097   float SigmaSS(float ss);
00098 
00100   float SigmaSZ(float sz);
00101 
00103   void append_stereo(FTSegment *, float s, float z);
00104 
00106   void append_stereo_cache(FTSegment *);
00107 
00109   int get_nhits(void);
00110 
00111 public: // static data members
00112    float minPt;
00113    float minDr;
00114    //const HepPoint3D pivot;
00115   // int evtTiming;
00116    float xtCoEff;
00117    float Testime;
00118 
00119 public: 
00120    void setFTFinder(FTFinder*);
00121 
00122 private:
00123   FTFinder* m_ftFinder;
00124   IMagneticFieldSvc* m_pmgnIMF;
00125   
00126 public: // private data members
00127   Lpav * _la;
00128   zav * _za;
00129   Helix * _helix;
00130   FTList<FTSegment *> & _axial_segments;
00131   FTList<FTSegment *> * _stereo_segments;
00132   FTList<FTSegment *> * _stereo_segments_cache;
00133   FTList<FTList<FTSegment *> *> * _stereo_segments_by_superLayer;
00134   static MdcParameter * param;
00135 
00136   union{
00137     float _kappa;
00138     float _SigmaS;
00139   };
00140   union{
00141     float _chi2_kappa;
00142     float _SigmaSS;
00143   };
00144   float _SigmaZ;
00145   float _SigmaSZ;
00146 };
00147 
00148 
00149 //----------------------------------------------
00150 #ifdef FTTrack_NO_INLINE
00151 #define inline
00152 #else
00153 #undef inline
00154 #define FTTrack_INLINE_DEFINE_HERE
00155 #endif
00156 
00157 #ifdef FTTrack_INLINE_DEFINE_HERE
00158 
00159 inline
00160 FTTrack::FTTrack(FTList<FTSegment *> & axial_segments,
00161                  float kappa, float chi2_kappa)
00162   : _la(NULL),
00163     _za(NULL),
00164     _helix(NULL),
00165     _axial_segments(axial_segments),
00166     _stereo_segments(NULL),
00167     _stereo_segments_cache(NULL),
00168     _stereo_segments_by_superLayer(NULL),
00169     //_wireHits(*(new FTList<FTWire *>(50))),
00170     _kappa(kappa),
00171     _chi2_kappa(chi2_kappa)
00172 {
00173   StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF);
00174   if(scmgn!=StatusCode::SUCCESS) {
00175     std::cout<< "Unable to open Magnetic field service"<<std::endl;
00176   }
00177 }
00178 
00179 inline
00180 FTTrack::~FTTrack()
00181 {
00182   delete &_axial_segments;
00183   delete _la;
00184   delete _za;
00185   delete _stereo_segments;
00186   delete _helix;
00187 }
00188 
00189 inline
00190 FTList<FTSegment *>& 
00191 FTTrack::axial_segments(void) const
00192 {
00193   return _axial_segments;
00194 }
00195 
00196 inline
00197 FTList<FTSegment *>& 
00198 FTTrack::stereo_segments(void) const
00199 {
00200   return *_stereo_segments;
00201 }
00202 
00203 inline
00204 void
00205 FTTrack::append_stereo_cache(FTSegment * src)
00206 {
00207   _stereo_segments_cache->append(src);
00208 }
00209 
00210 inline
00211 void
00212 FTTrack::append_stereo(FTSegment * src, float s = 0, float z = 0)
00213 {
00214   _stereo_segments->append(src);
00215   _SigmaS += s;
00216   _SigmaZ += z;
00217   _SigmaSZ += s*z;
00218   _SigmaSS += s*s;
00219 }
00220 
00221 inline
00222 float
00223 FTTrack::kappa_tmp(void) const
00224 {
00225   return _kappa;
00226 }
00227 
00228 inline
00229 float
00230 FTTrack::chi2_kappa_tmp(void) const
00231 {
00232   return _chi2_kappa;
00233 }
00234 
00235 inline
00236 const Lpav &
00237 FTTrack::lpav(void) const
00238 {
00239   return *_la;
00240 }
00241 
00242 inline
00243 const zav &
00244 FTTrack::Zav(void) const
00245 {
00246   return *_za;
00247 }
00248 
00249 inline
00250 Helix *
00251 FTTrack::helix(void) const
00252 {
00253   return _helix;
00254 }
00255 
00256 inline 
00257 float 
00258 FTTrack::SigmaZ(float z)
00259 {
00260   return _SigmaZ += z;
00261 }
00262 
00263 inline 
00264 float
00265 FTTrack::SigmaS(float s)
00266 {
00267   return _SigmaS += s;
00268 }
00269 
00270 inline
00271 float
00272 FTTrack::SigmaSZ(float sz)
00273 {
00274   return _SigmaSZ += sz;
00275 }
00276 
00277 inline 
00278 float
00279 FTTrack::SigmaSS(float ss)
00280 {
00281   return _SigmaSS += ss;
00282 }
00283 
00284 inline 
00285 float
00286 FTTrack::d_z(float s, float z) const
00287 {
00288   int n = _stereo_segments->length();
00289   if (!n) return 0;
00290   float Dz = (n==1)
00291     ? z - s*_SigmaZ/_SigmaS
00292     : z - (s*(_SigmaSZ-_SigmaS*_SigmaZ)+_SigmaSS*_SigmaZ-_SigmaS*_SigmaSZ)
00293       / (_SigmaSS - _SigmaS*_SigmaS);
00294   return (Dz < 10*(7-n)) ? Dz : 9999.;
00295 }
00296 
00297 
00298 inline
00299 void
00300 FTTrack::updateSZ(void)
00301 {
00302   int n = _stereo_segments_cache->length();
00303   if (n==1){
00304     FTSegment * s = _stereo_segments_cache->first();
00305     float s_tmp = s->s();
00306     float z_tmp = s->z();
00307     if (d_z(s_tmp,z_tmp) < 9998.){
00308       _SigmaS += s_tmp;
00309       _SigmaZ += z_tmp;
00310       _SigmaSS += s_tmp*s_tmp;
00311       _SigmaSZ += s_tmp*z_tmp;
00312       _stereo_segments->append(s);
00313     }
00314     _stereo_segments_cache->clear();
00315   }else if(n){
00316     _stereo_segments_by_superLayer->append(_stereo_segments_cache);
00317     _stereo_segments_cache = new FTList<FTSegment *>(3);
00318   }
00319 }
00320 
00321 inline
00322 void
00323 FTTrack::setFTFinder(FTFinder * finder)
00324 {
00325   m_ftFinder = finder;
00326 }
00327 
00328 #endif
00329 
00330 #undef inline
00331 
00332 #endif /* FTTrack_FLAG_ */
00333 

Generated on Tue Nov 29 23:13:27 2016 for BOSS_7.0.2 by  doxygen 1.4.7