00001
00002
00003
00004
00005
00006
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:
00037 int r_phiFit(void);
00038
00040 int r_phiReFit(float vx, float xy, int vtx_flag);
00041
00042
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:
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:
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:
00112 float minPt;
00113 float minDr;
00114
00115
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:
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
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
00333