BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcHitOnTrack.cxx
Go to the documentation of this file.
1// $Id: MdcHitOnTrack.cxx,v 1.22 2012/08/13 00:01:16 zhangy Exp $
2//
3#include "MdcData/MdcHitOnTrack.h"
4#include "MdcData/MdcHit.h"
5#include "MdcGeom/BesAngle.h"
6#include "MdcGeom/Constants.h"
7// MdcGeom needed to verify if hit is inside of chamber...
8// and to find the trajectory describing the hit, i.e. wire
9#include "MdcGeom/EntranceAngle.h"
10#include "MdcGeom/MdcLayer.h"
11#include "MdcGeom/MdcSWire.h"
12#include "TrkBase/TrkDifTraj.h"
13#include "TrkBase/TrkPoca.h"
14#include "TrkBase/TrkRecoTrk.h"
15#include "TrkBase/TrkRep.h"
16#include "TrkBase/TrkSimpTraj.h"
17using std::cout;
18using std::endl;
19/*
20#include "GaudiKernel/NTuple.h"
21extern NTuple::Tuple* g_tupleHit;
22extern NTuple::Item<int> g_hitLayer;
23extern NTuple::Item<int> g_hitWire;
24extern NTuple::Item<double> g_hitAmbig;
25extern NTuple::Item<double> g_hitEAngle;
26extern NTuple::Item<double> g_hitZ;
27extern NTuple::Item<double> g_hitAmbigMc;
28extern NTuple::Item<double> g_hitEAngleMc;
29extern NTuple::Item<double> g_hitZMc;
30extern NTuple::Item<double> g_hitDrift;
31extern NTuple::Item<double> g_hitDriftMc;
32extern NTuple::Item<int> g_hitTkIdMc;
33extern NTuple::Item<double> g_hitPhiPoca;
34extern NTuple::Item<double> g_hitPhiHit;
35extern NTuple::Item<double> g_hitPhiHit0;
36extern NTuple::Item<double> g_hitPhiHitDel;
37extern int haveDigiTk[43][288];
38extern int haveDigiMcLr[43][288];
39extern double haveDigiEAngle[43][288];
40extern double haveDigiZ[43][288];
41extern double haveDigiDrift[43][288];
42*/
43
44//-------------
45// Constructors
46//-------------
48 double t0 )
49 : TrkHitOnTrk( &fundHit, 10.e-4 )
50 , _ambig( ambig )
51 , _hitTraj( baseHit.hitTraj() )
52 , _fitTime( baseHit.rawTime() - t0 * 1e-9 )
53 , _dHit( &baseHit ) {
54 // need to flag somehow that that we haven't computed things yet...
55 // now, we know that _drift[0] is for ambig <0, and _drift[1] is ambig >0
56 // and _drift is signed according to ambig. Thus _drift[0] should be -tive
57 // and _drift[1] should be +tive. To indicate this are not yet initialized,
58 // put 'impossible' values here...
59 _drift[0] = +9999;
60 _drift[1] = -9999;
61 setHitResid( -21212121.0 );
62 setHitRms( 0.02 );
63 setHitLen( 0.5 * baseHit.layer()->zLength() );
64 setFltLen( 0. );
65 _startLen = hitTraj()->lowRange() - 5.;
66 _endLen = hitTraj()->hiRange() + 5.;
67}
68
69// MdcHitOnTrack::MdcHitOnTrack(const TrkFundHit *fundHit, int ambig, double fittime,
70// int layer, int wire)
71// : TrkHitOnTrk(fundHit,10.e-4),
72// _ambig(ambig), _fitTime(fittime)
73//{
74// cout << "using old MdcHitOnTrack constructor..." << endl;
75
76// IService* ser;
77// StatusCode sc = Gaudi::svcLocator()->getService("MdcGeomSvc",ser);
78// if (!sc.isSuccess())
79// cout <<"MdcHitOnTrack::Could not open Geometry Service"<<endl;
80// MdcGeomSvc *m_gmSvc = dynamic_cast<MdcGeomSvc*> (ser);
81// if(!m_gmSvc) cout <<"MdcHitOnTrack::Could not open Geometry Service"<<endl;
82
83// _drift[0] = +9999;
84// _drift[1] = -9999;
85// _hitTraj = gblEnv->getMdc()->getMdcLayer(layer)->makeHitTrajInGlobalCoords(wire);
86// _hitTraj = m_gmSvc->Layer(layer)->makeHitTrajInGlobalCoords(wire);
87// setHitResid(-21212121.0);
88// setHitRms( 0.01 );
89// setHitLen(2.);
90// setFltLen(0.);
91// _startLen = hitTraj()->lowRange() - 5.;
92// _endLen = hitTraj()->hiRange() + 5.;
93//}
94
96 const TrkDifTraj* trkTraj, const MdcHit* hb )
97 : TrkHitOnTrk( hot, newRep, trkTraj ) {
98 _ambig = hot._ambig;
99 _hitTraj = hot._hitTraj;
100 _fitTime = hot._fitTime;
101 _drift[0] = hot._drift[0];
102 _drift[1] = hot._drift[1];
103 _startLen = hot._startLen;
104 _endLen = hot._endLen;
105 _dHit = ( hb == 0 ? hot._dHit : hb );
106}
107
109
110void MdcHitOnTrack::setT0( double t0 ) { _fitTime = _dHit->rawTime() - t0 * 1e-9; }
111
113 double dca = -9999.;
114 if ( getParentRep() == 0 )
115 {
116 // cout << "no parent rep" << endl;
117 return dca;
118 }
119 // WARNING: cannot use the internal _poca, as it lags one iteration
120 // behind the fit... therfore use _EXTERNAL_ residual
121 if ( isActive() )
122 { // FIXME: currently can only use 'resid()' if isActive..
123 dca = resid() + drift();
124 }
125 else
126 {
127 TrkPoca poca( getParentRep()->traj(), fltLen(), *hitTraj(), hitLen(), _tolerance );
128 if ( poca.status().success() ) dca = poca.doca();
129 }
130 return dca;
131}
132
134 if ( dca < 0 && ambig() >= 0 )
135 {
136 setAmbig( -1 );
137 return isActive();
138 }
139 else if ( dca > 0 && ambig() <= 0 )
140 {
141 setAmbig( 1 );
142 return isActive();
143 }
144 else { return false; }
145}
146
147const MdcHitOnTrack* MdcHitOnTrack::mdcHitOnTrack() const { return this; }
148
150 static Hep3Vector dir;
151 static HepPoint3D pos;
152 if ( getParentRep() == 0 ) return 0.;
153 getParentRep()->traj().getInfo( fltLen(), pos, dir );
154
155 return BesAngle( dir.phi() - pos.phi() );
156}
157
159 static Hep3Vector dir;
160 static HepPoint3D pos;
161 if ( getParentRep() == 0 ) return 0.;
162 getParentRep()->traj().getInfo( fltLen(), pos, dir );
163
164 return entranceAngle( pos, dir );
165}
166
167double MdcHitOnTrack::entranceAngle( const HepPoint3D pos, const Hep3Vector dir ) const {
168 double angle = EntranceAngle( dir.phi() - _dHit->phi( pos.z() ) );
169 // std::cout<< "eAngle("<<layernumber()<<","<<wire()<<") dir.phi() "<<dir.phi()*180./3.14<<"
170 // hit phi
171 // "<<_dHit->phi(pos.z())*180./3.14<<" eAngle "<<angle*180./3.14<<" degree
172 // "<<angle<<std::endl;
173
174 // std::cout<< __FILE__ << " " << __LINE__ << " ("<<layernumber()<<","<<wire()<<") "<<
175 //" phiPoca "<<dir.phi()*180/3.14<< " phiWire "<<_dHit->phi(pos.z())*180/3.14<<" z
176 //"<<pos.z()<< " dPhiz "<<_dHit->wire()->dPhizDC(pos.z())*180/3.14<< " eAngle
177 //"<<angle*180/3.14<< " angle "<<(dir.phi() - _dHit->phi(pos.z()))*180./3.14<<std::endl;
178 /*
179 if(g_tupleHit && fabs(angle)>0.0001){
180 int layer = layernumber();
181 int wireId = wire();
182 g_hitLayer = layer;
183 g_hitWire = wireId;
184
185 int lrCalib=2;
186 if (ambig()==1) lrCalib = 0;
187 else if (ambig()==-1) lrCalib = 1;
188 g_hitAmbig = lrCalib;
189 g_hitAmbigMc = haveDigiMcLr[layer][wireId];
190 g_hitEAngle = angle*180./3.14;
191 g_hitEAngleMc = haveDigiEAngle[layer][wireId]*180./3.14;
192 g_hitZ = pos.z();
193 g_hitZMc = haveDigiZ[layer][wireId];
194 g_hitDrift = _drift[ambig()];
195 g_hitDriftMc = haveDigiDrift[layer][wireId];
196 g_hitTkIdMc = haveDigiTk[layer][wireId];
197 g_hitPhiPoca = dir.phi()*180./3.41;
198 g_hitPhiHit = _dHit->phi(pos.z())*180./3.41;
199 g_hitPhiHit0 = _dHit->phi()*180./3.41;
200 g_hitPhiHitDel = _dHit->wire()->dPhiz()*180./3.41;
201 g_tupleHit->write();
202 }
203 */
204 return angle;
205}
206
207unsigned MdcHitOnTrack::layerNumber() const { return layernumber(); }
208
210 return getParentRep() == 0
211 ? 0
212 : Constants::pi / 2 - getParentRep()->traj().direction( fltLen() ).theta();
213}
214
216 TrkErrCode status = updatePoca( traj, maintainAmb );
217 if ( status.failure() )
218 {
219#ifdef MDCPATREC_DEBUG
220 std::cout << " ErrMsg(warning) "
221 << "MdcHitOnTrack::updateMeasurement failed " << status << std::endl;
222#endif
223 return status;
224 }
225 assert( _poca != 0 );
226 double dca = _poca->doca();
227 bool forceIteration = ( maintainAmb && ambig() != 0 ) ? false : updateAmbiguity( dca );
228 // std::cout<< __FILE__ << " " << __LINE__ << " maintainAmb "<< maintainAmb
229 //<< " maintain&& ambig "<<(maintainAmb&&ambig()!=0)
230 //<< " forceIteration "<<forceIteration<<std::endl;
231 assert( ambig() != 0 );
232 // Check for hits beyond end plates. !!Turn off hit if it is == temp. hack
233 if ( isBeyondEndflange() ) setUsability( false );
234 if ( forceIteration || !driftCurrent() )
235 {
236 updateCorrections(); // force recomputation of drift for current ambig(), setting of hitRms
237 forceIteration = true;
238 }
239 setHitResid( dca - drift() );
240 return !forceIteration ? status : TrkErrCode( TrkErrCode::succeed, 11, "Ambiguity flipped" );
241}
242
243void MdcHitOnTrack::updateCorrections() {
244 const TrkRep* tkRep = getParentRep();
245 assert( tkRep != 0 );
246 static HepPoint3D pos;
247 static Hep3Vector dir;
248 _trkTraj->getInfo( fltLen(), pos, dir );
249
250 // for bes3 cosmic test
251 int wireAmb = wireAmbig();
252 double tof = tkRep->arrivalTime( fltLen() );
253 // at this point, since dcaToWire is computed, _ambig must be either -1 or +1
254 assert( ambig() == -1 || ambig() == 1 );
255 double eAngle = entranceAngle( pos, dir ); // 2011-11-22
256 double dAngle = Constants::pi / 2 - dir.theta();
257 double z = pos.z();
258 // note the special case for INCOMING tracks:
259 // wire left of track implies hit on the right side of wire
260 // int wireAmb= fabs(eAngle)<Constants::pi/2?_ambig:-_ambig; //yzhang delete 2012-07-17
261
262 // provide the underlying hit with the *external* information
263 // needed to compute the drift distance, i.e. those numbers that
264 // the hit cannot figure out by itself...
265 double dist = _dHit->driftDist( tof, wireAmb, eAngle, dAngle, z );
266 //<<" dir "<<dir<<" pos "<<pos
267 // assert(dist>0);//yzhang 2011-12-05 delete
268 _fitTime = _dHit->driftTime( tof, z );
269 // std::cout<<" MdcHitOnTrack ("<<layernumber()<<","<<wire()<<")
270 // "<<mdcHit()->isCosmicFit()<<" fltLen "<<fltLen() <<" eAngle "<<eAngle<<" ambig
271 // "<<ambig()<<" wireAmb "<<wireAmb<<" tof "<<tof<<" dd "<<dist<<" dt
272 // "<<_fitTime<<std::endl;
273 _drift[ambig() < 0 ? 0 : 1] = ambig() * dist;
274
275 // assert( driftCurrent() );//yzhang 24-11-01 remove for upgrad of BOSS
276
277 // std::cout<<" MdcHitOnTrack ("<<layernumber()<<","<<wire()<<")"
278 //<< "ambig "<<ambig()<<" drift "<<_drift[ambig() < 0 ? 0 : 1]<<std::endl;
279
280 double newSig = _dHit->sigma( dist, wireAmb, eAngle, dAngle, z );
281
282 // assert(newSig>0);//yzhang 2011-12-05 delete
283 setHitRms( newSig );
284}
285
286double MdcHitOnTrack::driftVelocity() const {
287 const TrkRep* tkRep = getParentRep();
288 assert( tkRep != 0 );
289 double tof = tkRep->arrivalTime( fltLen() );
290 static HepPoint3D pos;
291 static Hep3Vector dir;
292 _trkTraj->getInfo( fltLen(), pos, dir );
293 double eAngle = entranceAngle( pos, dir ); // 2011-11-22
294 double dAngle = Constants::pi / 2 - dir.theta();
295 double z = pos.z();
296 // note the special case for INCOMING tracks:
297 // wire left of track implies hit on the right side of wire
298 int wireAmb = fabs( eAngle ) < Constants::pi / 2 ? _ambig : -_ambig;
299
300 static const double epsilon = 0.5e-9; // tof are in s;
301 double dist1 = _dHit->driftDist( tof + epsilon, wireAmb, eAngle, dAngle, z );
302 double dist2 = _dHit->driftDist( tof - epsilon, wireAmb, eAngle, dAngle, z );
303
304 return ( dist2 - dist1 ) / ( 2 * epsilon ); // velocity in cm/s
305}
306
307bool MdcHitOnTrack::timeResid( double& t, double& tErr ) const {
308 double v = driftVelocity();
309 if ( v <= 0 ) return false;
310 t = ( fabs( drift() ) - fabs( dcaToWire() ) ) / v;
311 tErr = hitRms() / v;
312 return true;
313}
314
315bool MdcHitOnTrack::timeAbsolute( double& t, double& tErr ) const {
316 double tresid( -1.0 );
317 if ( timeResid( tresid, tErr ) )
318 {
319 // add back the track time
320 t = tresid + getParentRep()->parentTrack()->trackT0();
321 return true;
322 }
323 else return false;
324}
325
326TrkEnums::TrkViewInfo MdcHitOnTrack::whatView() const { return _dHit->whatView(); }
327
328int MdcHitOnTrack::layernumber() const { return _dHit->layernumber(); }
329
330const MdcLayer* MdcHitOnTrack::layer() const { return _dHit->layer(); }
331
332int MdcHitOnTrack::wire() const { return _dHit->wirenumber(); }
333
334int MdcHitOnTrack::whichView() const { return _dHit->whichView(); }
335
336double MdcHitOnTrack::rawTime() const { return _dHit->rawTime(); }
337
338double MdcHitOnTrack::charge() const { return _dHit->charge(); }
339
340const Trajectory* MdcHitOnTrack::hitTraj() const { return _hitTraj; }
341
342const MdcHit* MdcHitOnTrack::mdcHit() const { return 0; }
343
344// Replace underlying hit pointer (base class doesn't own it)
345
346void MdcHitOnTrack::changeBase( MdcHit* newBase ) { _dHit = newBase; }
347
348/*
349 MdcHitOnTrack::isBeyondEndflange() const {
350 std::cout<<__FILE__<<" "<<__LINE__
351 <<" hitLen "<<hitLen()
352 <<" startLen "<<_startLen
353 <<" endLen "<<_endLen
354 << std::endl;
355 return (hitLen() < _startLen || hitLen() > _endLen);
356 }
357 */
358
360 // hit wrt the wire location
361
362 // return fabs(entranceAngle())<Constants::pi/2?ambig():-ambig();
363 const TrkRep* tkRep = getParentRep();
364 static Hep3Vector dir;
365 static HepPoint3D pos;
366 if ( getParentRep() == 0 ) return 0.;
367 getParentRep()->traj().getInfo( fltLen(), pos, dir );
368
369 double wireAmb = ambig();
370 if ( mdcHit()->isCosmicFit() )
371 {
372 HepPoint3D poca = tkRep->position( 0. );
373 if ( pos.y() > poca.y() )
374 {
375 wireAmb = -1. * _ambig; // yzhang 2012-07-17
376 // std::cout<<"MdcHitOnTrack CosmicFit up ambig *-1"<<std::endl;
377 }
378 }
379
380 return wireAmb;
381}
HepGeom::Point3D< double > HepPoint3D
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
const double epsilon
virtual const MdcHit * mdcHit() const
void changeBase(MdcHit *newBase)
int wireAmbig() const
virtual bool timeAbsolute(double &t, double &tErr) const
virtual const Trajectory * hitTraj() const
unsigned layerNumber() const
double entranceAngleHit() const
bool updateAmbiguity(double dca)
int wire() const
virtual bool timeResid(double &t, double &tErr) const
double rawTime() const
double dcaToWire() const
virtual const MdcHitOnTrack * mdcHitOnTrack() const
double charge() const
virtual unsigned status() const =0
TrkEnums::TrkViewInfo whatView() const
virtual ~MdcHitOnTrack()
double entranceAngle() const
int whichView() const
double dipAngle() const
const MdcLayer * layer() const
int layernumber() const
MdcHitOnTrack(const TrkFundHit &fundHit, const MdcHit &baseHit, int ambig, double fittime)
void setT0(double t0)
double driftTime(double tof, double z) const
Definition MdcHit.cxx:142
double sigma(double, int, double, double, double) const
Definition MdcHit.cxx:183
double driftDist(double, int, double, double, double) const
Definition MdcHit.cxx:157
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &direction) const =0
virtual Hep3Vector direction(double) const =0
virtual const TrkDifTraj & traj() const =0
TrkErrCode updatePoca(const TrkDifTraj *trkTraj, bool maintainAmbiguity)
void setUsability(int usability)
double resid(bool exclude=false) const
TrkHitOnTrk(const TrkFundHit *, double tolerance)
double trackT0() const
virtual HepPoint3D position(double fltL) const
Definition TrkRep.cxx:154
virtual double arrivalTime(double fltL) const
Definition TrkRep.cxx:158
int t()
Definition t.c:1