/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/MdcPatRec/MdcData/MdcData-00-01-27/src/MdcHitOnTrack.cxx

Go to the documentation of this file.
00001 // $Id: MdcHitOnTrack.cxx,v 1.22 2012/08/13 00:01:16 zhangy Exp $
00002 //
00003 #include "MdcData/MdcHitOnTrack.h"
00004 #include "MdcData/MdcHit.h"
00005 #include "MdcGeom/Constants.h"
00006 #include "MdcGeom/BesAngle.h"
00007 // MdcGeom needed to verify if hit is inside of chamber...
00008 // and to find the trajectory describing the hit, i.e. wire
00009 #include "MdcGeom/MdcLayer.h"
00010 #include "MdcGeom/MdcSWire.h"
00011 #include "TrkBase/TrkPoca.h"
00012 #include "TrkBase/TrkDifTraj.h"
00013 #include "TrkBase/TrkRep.h"
00014 #include "TrkBase/TrkSimpTraj.h"
00015 #include "TrkBase/TrkRecoTrk.h"
00016 #include "MdcGeom/EntranceAngle.h"
00017 using std::cout;
00018 using std::endl;
00019 /*
00020 #include "GaudiKernel/NTuple.h"
00021 extern NTuple::Tuple*                   g_tupleHit;
00022 extern NTuple::Item<int>                g_hitLayer;
00023 extern NTuple::Item<int>                g_hitWire;
00024 extern NTuple::Item<double>             g_hitAmbig;
00025 extern NTuple::Item<double>             g_hitEAngle;
00026 extern NTuple::Item<double>             g_hitZ;
00027 extern NTuple::Item<double>             g_hitAmbigMc;
00028 extern NTuple::Item<double>             g_hitEAngleMc;
00029 extern NTuple::Item<double>             g_hitZMc;
00030 extern NTuple::Item<double>             g_hitDrift;
00031 extern NTuple::Item<double>             g_hitDriftMc;
00032 extern NTuple::Item<int>                g_hitTkIdMc;
00033 extern NTuple::Item<double>             g_hitPhiPoca;
00034 extern NTuple::Item<double>             g_hitPhiHit;
00035 extern NTuple::Item<double>             g_hitPhiHit0;
00036 extern NTuple::Item<double>             g_hitPhiHitDel;
00037 extern int haveDigiTk[43][288];
00038 extern int haveDigiMcLr[43][288];
00039 extern double haveDigiEAngle[43][288];
00040 extern double haveDigiZ[43][288];
00041 extern double haveDigiDrift[43][288];
00042 */
00043 
00044 //-------------
00045 // Constructors
00046 //-------------
00047 MdcHitOnTrack::MdcHitOnTrack(const TrkFundHit& fundHit,
00048     const MdcHit& baseHit,
00049     int ambig,  double t0)
00050 : TrkHitOnTrk(&fundHit,10.e-4),
00051   _ambig(ambig),
00052   _hitTraj(baseHit.hitTraj()),  
00053   _fitTime(baseHit.rawTime()-t0*1e-9),
00054   _dHit(&baseHit)
00055 {
00056   // need to flag somehow that that we haven't computed things yet...
00057   //   now, we know that _drift[0] is for ambig <0, and _drift[1] is ambig >0
00058   //   and _drift is signed according to ambig. Thus _drift[0] should be -tive
00059   //   and _drift[1] should be +tive. To indicate this are not yet initialized,
00060   //   put 'impossible' values here...
00061   _drift[0] = +9999;
00062   _drift[1] = -9999;
00063   setHitResid(-21212121.0);
00064   setHitRms( 0.02 );
00065   setHitLen(0.5 * baseHit.layer()->zLength());
00066   setFltLen(0.);
00067   _startLen = hitTraj()->lowRange() - 5.;
00068   _endLen   = hitTraj()->hiRange()  + 5.;
00069 }
00070 
00071 //MdcHitOnTrack::MdcHitOnTrack(const TrkFundHit *fundHit, int ambig, double fittime,
00072 //                             int layer, int wire)
00073 //  : TrkHitOnTrk(fundHit,10.e-4),
00074 //    _ambig(ambig), _fitTime(fittime)
00075 //{
00076 //  cout << "using old MdcHitOnTrack constructor..." << endl;
00077 
00078 //  IService* ser;
00079 //  StatusCode sc = Gaudi::svcLocator()->getService("MdcGeomSvc",ser);
00080 //  if (!sc.isSuccess())
00081 //    cout <<"MdcHitOnTrack::Could not open Geometry Service"<<endl;
00082 //  MdcGeomSvc *m_gmSvc = dynamic_cast<MdcGeomSvc*> (ser);
00083 //  if(!m_gmSvc) cout <<"MdcHitOnTrack::Could not open Geometry Service"<<endl;
00084 
00085 
00086 
00087 //  _drift[0] = +9999;
00088 //  _drift[1] = -9999;
00089 //  _hitTraj = gblEnv->getMdc()->getMdcLayer(layer)->makeHitTrajInGlobalCoords(wire);
00090 //    _hitTraj = m_gmSvc->Layer(layer)->makeHitTrajInGlobalCoords(wire);
00091 //  setHitResid(-21212121.0);
00092 //  setHitRms( 0.01 );
00093 //  setHitLen(2.);
00094 //  setFltLen(0.);
00095 //  _startLen = hitTraj()->lowRange() - 5.;
00096 //  _endLen   = hitTraj()->hiRange()  + 5.;
00097 //}
00098 
00099 MdcHitOnTrack::MdcHitOnTrack(const MdcHitOnTrack &hot,TrkRep *newRep,
00100     const TrkDifTraj* trkTraj, const MdcHit *hb)
00101 : TrkHitOnTrk(hot,newRep,trkTraj)
00102 {
00103   _ambig = hot._ambig;
00104   _hitTraj  = hot._hitTraj;
00105   _fitTime  = hot._fitTime;
00106   _drift[0] = hot._drift[0];
00107   _drift[1] = hot._drift[1];
00108   _startLen = hot._startLen;
00109   _endLen   = hot._endLen;
00110   _dHit = (hb==0?hot._dHit:hb);
00111 }
00112 
00113 MdcHitOnTrack::~MdcHitOnTrack()
00114 { ; }
00115 
00116   void
00117 MdcHitOnTrack::setT0(double t0)
00118 { 
00119   _fitTime= _dHit->rawTime()-t0*1e-9; 
00120 }
00121 
00122 double
00123 MdcHitOnTrack::dcaToWire() const
00124 {
00125   double dca = -9999.;
00126   if ( getParentRep() == 0 ) {
00127     //     cout << "no parent rep" << endl;
00128     return dca;
00129   }
00130   // WARNING: cannot use the internal _poca, as it lags one iteration
00131   //          behind the fit... therfore use _EXTERNAL_ residual
00132   if (isActive())  {  // FIXME: currently can only use 'resid()' if isActive..
00133     dca = resid()+drift();
00134   } else {
00135     TrkPoca poca(getParentRep()->traj(), fltLen(), *hitTraj(), hitLen(),
00136         _tolerance);
00137     if (poca.status().success()) dca = poca.doca();
00138   }
00139   return dca;
00140 }
00141 
00142   bool
00143 MdcHitOnTrack::updateAmbiguity(double dca)
00144 {
00145   if (dca < 0 && ambig() >= 0) {
00146     setAmbig(-1); return isActive();
00147   } else if (dca > 0 && ambig() <= 0) {
00148     setAmbig(1); return isActive();
00149   } else {
00150     return false;
00151   }
00152 }
00153 
00154 const MdcHitOnTrack*
00155 MdcHitOnTrack::mdcHitOnTrack() const
00156 {
00157   return this;
00158 }
00159 
00160 double
00161 MdcHitOnTrack::entranceAngleHit() const
00162 {
00163   static Hep3Vector dir;
00164   static HepPoint3D pos;
00165   if (getParentRep() == 0) return 0.;
00166   getParentRep()->traj().getInfo(fltLen(), pos, dir);
00167 
00168   return BesAngle(dir.phi() - pos.phi());
00169 }
00170 
00171 double
00172 MdcHitOnTrack::entranceAngle() const
00173 {
00174   static Hep3Vector dir;
00175   static HepPoint3D pos;
00176   if (getParentRep() == 0) return 0.;
00177   getParentRep()->traj().getInfo(fltLen(), pos, dir);
00178 
00179   return entranceAngle(pos, dir);
00180 }
00181 
00182 double
00183 MdcHitOnTrack::entranceAngle(const HepPoint3D pos, const Hep3Vector dir) const
00184 {
00185   double angle = EntranceAngle(dir.phi() - _dHit->phi(pos.z()));
00186   //std::cout<< "eAngle("<<layernumber()<<","<<wire()<<") dir.phi()  "<<dir.phi()*180./3.14<<" hit phi "<<_dHit->phi(pos.z())*180./3.14<<" eAngle "<<angle*180./3.14<<" degree "<<angle<<std::endl;
00187 
00188   //std::cout<< __FILE__ << "   " << __LINE__ << "   ("<<layernumber()<<","<<wire()<<") "<<
00189   //" phiPoca "<<dir.phi()*180/3.14<< " phiWire "<<_dHit->phi(pos.z())*180/3.14<<" z "<<pos.z()<<
00190   //" dPhiz "<<_dHit->wire()->dPhizDC(pos.z())*180/3.14<< " eAngle "<<angle*180/3.14<< " angle "<<(dir.phi() - _dHit->phi(pos.z()))*180./3.14<<std::endl;
00191   /*
00192      if(g_tupleHit && fabs(angle)>0.0001){
00193      int layer = layernumber();
00194      int wireId = wire();
00195      g_hitLayer = layer;
00196      g_hitWire = wireId;
00197 
00198      int lrCalib=2;
00199      if (ambig()==1) lrCalib = 0;
00200      else if (ambig()==-1) lrCalib = 1;
00201      g_hitAmbig = lrCalib;
00202      g_hitAmbigMc = haveDigiMcLr[layer][wireId];
00203      g_hitEAngle = angle*180./3.14;
00204      g_hitEAngleMc = haveDigiEAngle[layer][wireId]*180./3.14;
00205      g_hitZ = pos.z();
00206      g_hitZMc = haveDigiZ[layer][wireId];
00207      g_hitDrift = _drift[ambig()];
00208      g_hitDriftMc = haveDigiDrift[layer][wireId];
00209      g_hitTkIdMc = haveDigiTk[layer][wireId];
00210      g_hitPhiPoca = dir.phi()*180./3.41;
00211      g_hitPhiHit = _dHit->phi(pos.z())*180./3.41;
00212      g_hitPhiHit0 = _dHit->phi()*180./3.41;
00213      g_hitPhiHitDel = _dHit->wire()->dPhiz()*180./3.41;
00214      g_tupleHit->write();
00215      }
00216      */
00217   return angle;
00218 }
00219 
00220 unsigned
00221 MdcHitOnTrack::layerNumber() const
00222 {
00223   return layernumber();
00224 }
00225 
00226 double
00227 MdcHitOnTrack::dipAngle() const
00228 {
00229   return getParentRep()==0?0:Constants::pi/2-getParentRep()->traj().direction(fltLen()).theta();
00230 }
00231 
00232   TrkErrCode
00233 MdcHitOnTrack::updateMeasurement(const TrkDifTraj* traj, bool maintainAmb)
00234 {
00235   TrkErrCode status=updatePoca(traj,maintainAmb);
00236   if (status.failure()) {
00237 #ifdef MDCPATREC_DEBUG
00238     std::cout<<" ErrMsg(warning) " << "MdcHitOnTrack::updateMeasurement failed " << status << std::endl;
00239 #endif
00240     return status;
00241   }
00242   assert (_poca!=0);
00243   double dca=_poca->doca();
00244   bool forceIteration = (maintainAmb&&ambig()!=0)?false:updateAmbiguity(dca);
00245   //std::cout<< __FILE__ << "   " << __LINE__ << " maintainAmb "<< maintainAmb
00246   //<< " maintain&& ambig "<<(maintainAmb&&ambig()!=0)
00247   //<< " forceIteration  "<<forceIteration<<std::endl;
00248   assert(ambig()!=0);
00249   // Check for hits beyond end plates.  !!Turn off hit if it is == temp. hack
00250   if (isBeyondEndflange()) setUsability(false);
00251   if (forceIteration || !driftCurrent() ) {
00252     updateCorrections(); // force recomputation of drift for current ambig(), setting of hitRms
00253     forceIteration=true;
00254   }
00255   setHitResid(dca-drift());
00256   return !forceIteration?status:
00257     TrkErrCode(TrkErrCode::succeed, 11, "Ambiguity flipped");
00258 }
00259 
00260   void
00261 MdcHitOnTrack::updateCorrections()
00262 {
00263   const TrkRep* tkRep = getParentRep();
00264   assert(tkRep != 0);
00265   static HepPoint3D pos; static Hep3Vector dir;
00266   _trkTraj->getInfo(fltLen(), pos, dir);
00267 
00268   // for bes3 cosmic test
00269   int wireAmb = wireAmbig();
00270   double tof = tkRep->arrivalTime(fltLen());
00271   // at this point, since dcaToWire is computed, _ambig must be either -1 or +1
00272   assert( ambig() == -1 || ambig() == 1 );
00273   double eAngle = entranceAngle(pos, dir);//2011-11-22
00274   double dAngle = Constants::pi/2 - dir.theta();
00275   double z = pos.z();
00276   // note the special case for INCOMING tracks:
00277   //    wire left of track implies hit on the right side of wire
00278   //int wireAmb= fabs(eAngle)<Constants::pi/2?_ambig:-_ambig; //yzhang delete 2012-07-17 
00279 
00280   // provide the underlying hit with the *external* information
00281   // needed to compute the drift distance, i.e. those numbers that
00282   // the hit cannot figure out by itself...
00283   double dist = _dHit->driftDist(tof, wireAmb, eAngle, dAngle, z); 
00284   //<<" dir "<<dir<<" pos "<<pos
00285   //assert(dist>0);//yzhang 2011-12-05 delete
00286   _fitTime = _dHit->driftTime(tof,z);
00287   //std::cout<<" MdcHitOnTrack  ("<<layernumber()<<","<<wire()<<") "<<mdcHit()->isCosmicFit()<<" fltLen "<<fltLen() <<" eAngle "<<eAngle<<" ambig "<<ambig()<<" wireAmb "<<wireAmb<<" tof "<<tof<<" dd "<<dist<<" dt "<<_fitTime<<std::endl;
00288   _drift[ambig()<0?0:1] = ambig() * dist;
00289   assert( driftCurrent() );
00290 
00291   double newSig = _dHit->sigma(dist, wireAmb, eAngle, dAngle, z);
00292 
00293   //assert(newSig>0);//yzhang 2011-12-05 delete
00294   setHitRms(newSig);
00295 }
00296 
00297 double
00298 MdcHitOnTrack::driftVelocity() const
00299 {
00300   const TrkRep* tkRep = getParentRep();
00301   assert(tkRep != 0);
00302   double tof =  tkRep->arrivalTime(fltLen());
00303   static HepPoint3D pos; static Hep3Vector dir;
00304   _trkTraj->getInfo(fltLen(), pos, dir);
00305   double eAngle = entranceAngle(pos, dir);//2011-11-22
00306   double dAngle = Constants::pi/2 - dir.theta();
00307   double z = pos.z();
00308   // note the special case for INCOMING tracks:
00309   //    wire left of track implies hit on the right side of wire
00310   int wireAmb= fabs(eAngle)<Constants::pi/2?_ambig:-_ambig;
00311 
00312   static const double epsilon = 0.5e-9; // tof are in s;
00313   double dist1 =  _dHit->driftDist(tof+epsilon, wireAmb, eAngle, dAngle, z);
00314   double dist2 =  _dHit->driftDist(tof-epsilon, wireAmb, eAngle, dAngle, z);
00315 
00316   return (dist2-dist1)/(2*epsilon); // velocity in cm/s
00317 }
00318 
00319 bool
00320 MdcHitOnTrack::timeResid(double &t, double &tErr) const
00321 {
00322   double v = driftVelocity();
00323   if (v <= 0) return false;
00324   t = (fabs(drift())-fabs(dcaToWire()))/v;
00325   tErr= hitRms()/v;
00326   return true;
00327 }
00328 
00329 bool
00330 MdcHitOnTrack::timeAbsolute(double &t, double &tErr) const
00331 {
00332   double tresid(-1.0);
00333   if(timeResid(tresid,tErr)){
00334     // add back the track time
00335     t = tresid + getParentRep()->parentTrack()->trackT0();
00336     return true;
00337   } else
00338     return false;
00339 }
00340 
00341 TrkEnums::TrkViewInfo
00342 MdcHitOnTrack::whatView() const
00343 {
00344   return _dHit->whatView();
00345 }
00346 
00347 int
00348 MdcHitOnTrack::layernumber() const
00349 {
00350   return _dHit->layernumber();
00351 }
00352 
00353 const MdcLayer*
00354 MdcHitOnTrack::layer() const
00355 {
00356   return _dHit->layer();
00357 }
00358 
00359 int
00360 MdcHitOnTrack::wire() const
00361 {
00362   return _dHit->wirenumber();
00363 }
00364 
00365 int
00366 MdcHitOnTrack::whichView() const
00367 {
00368   return _dHit->whichView();
00369 }
00370 
00371 double
00372 MdcHitOnTrack::rawTime() const
00373 {
00374   return _dHit->rawTime();
00375 }
00376 
00377 double
00378 MdcHitOnTrack::charge() const
00379 {
00380   return _dHit->charge();
00381 }
00382 
00383 const Trajectory*
00384 MdcHitOnTrack::hitTraj() const
00385 {
00386   return _hitTraj;
00387 }
00388 
00389 const MdcHit*
00390 MdcHitOnTrack::mdcHit() const
00391 {
00392   return 0;
00393 }
00394 
00395 
00396 // Replace underlying hit pointer (base class doesn't own it)
00397 
00398   void 
00399 MdcHitOnTrack::changeBase(MdcHit* newBase)
00400 {
00401   _dHit = newBase;
00402 }
00403 
00404 /*
00405    MdcHitOnTrack::isBeyondEndflange() const { 
00406    std::cout<<__FILE__<<" "<<__LINE__
00407    <<" hitLen "<<hitLen()
00408    <<" startLen "<<_startLen
00409    <<" endLen "<<_endLen
00410    <<  std::endl;
00411    return (hitLen() < _startLen || hitLen() > _endLen); 
00412    }
00413    */
00414 
00415 int MdcHitOnTrack::wireAmbig() const {
00416   // hit wrt the wire location
00417 
00418   //return fabs(entranceAngle())<Constants::pi/2?ambig():-ambig();
00419   const TrkRep* tkRep = getParentRep();
00420   static Hep3Vector dir;
00421   static HepPoint3D pos;
00422   if (getParentRep() == 0) return 0.;
00423   getParentRep()->traj().getInfo(fltLen(), pos, dir);
00424 
00425   double wireAmb = ambig();
00426   if (mdcHit()->isCosmicFit()){
00427     HepPoint3D poca = tkRep->position(0.);
00428     if ( pos.y() > poca.y()){
00429       wireAmb = -1.*_ambig;//yzhang 2012-07-17 
00430       //std::cout<<"MdcHitOnTrack CosmicFit  up ambig *-1"<<std::endl;
00431     }
00432   } 
00433 
00434   return wireAmb;
00435 }

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