BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TrkHitOnTrk.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: TrkHitOnTrk.cxx,v 1.5 2010/09/26 00:31:59 zhangy Exp $
4//
5// Description:
6//
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author(s): Steve Schaffner
12//
13//
14// Modified 3-july-97 by Leon Rochester to add '<' & '==' operators for
15// Roguewave Sorted Vector
16//------------------------------------------------------------------------
17#include "TrkBase/TrkHitOnTrk.h"
18#include "TrkBase/TrkDifPoca.h"
19#include "TrkBase/TrkDifTraj.h"
20#include "TrkBase/TrkFundHit.h"
21#include "TrkBase/TrkPoca.h"
22#include "TrkBase/TrkRecoTrk.h"
23#include "TrkBase/TrkRep.h"
24#include "TrkBase/TrkSimpTraj.h"
25#include <assert.h>
26// #include "MdcData/MdcHit.h"//yzhang debug
27using std::endl;
28using std::ostream;
29
30const MdcHitOnTrack* TrkHitOnTrk::mdcHitOnTrack() const { return 0; }
31const SvtHitOnTrack* TrkHitOnTrk::svtHitOnTrack() const { return 0; }
32
33TrkHitOnTrk::TrkHitOnTrk( const TrkFundHit* hit, double tolerance )
34 : _parentRep( 0 )
35 , _theHit( const_cast<TrkFundHit*>( hit ) )
36 , _isActive( true )
37 , _isUsable( true )
38 ,
39 // make caches invalid
40 _hitRms( -9.e50 )
41 , _trkLen( 0.0 )
42 , _hitLen( 0.0 )
43 , _trkTraj( 0 )
44 , _poca( 0 )
45 , _tolerance( tolerance ) {}
46
47// This is effectively a copy ctor:
49 const TrkDifTraj* trkTraj )
50 : _parentRep( newRep )
51 , _theHit( oldHit._theHit )
52 , _isActive( oldHit._isActive )
53 , _isUsable( oldHit._isUsable )
54 , _hitRms( oldHit._hitRms )
55 , _trkLen( oldHit._trkLen )
56 , _hitLen( oldHit._hitLen )
57 , _resid( 9999.9 )
58 , _trkTraj( 0 )
59 , _poca( 0 )
60 , _tolerance( oldHit._tolerance ) {
61 assert( 0 != newRep );
62 if ( oldHit._trkTraj != 0 && trkTraj != 0 && oldHit._trkTraj == trkTraj )
63 {
64 // re-use cache as traj are the same
65 _resid = oldHit._resid;
67 _poca = ( oldHit._poca == 0 ? 0 : new TrkPoca( *oldHit._poca ) );
68 }
69 else
70 {
71 double fl = oldHit.fltLen();
72 double dum;
73 const TrkSimpTraj* t1 =
74 ( oldHit._trkTraj == 0 ? 0 : oldHit._trkTraj->localTrajectory( fl, dum ) );
75 const TrkSimpTraj* t2 = ( trkTraj == 0 ? 0 : trkTraj->localTrajectory( fl, dum ) );
76 if ( t1 != 0 && t2 != 0 && t1->parameters()->parameter() == t2->parameters()->parameter() )
77 {
78 // re-use cache as traj are sufficiently equiv
79 _resid = oldHit._resid;
81 _poca = ( oldHit._poca == 0 ? 0 : new TrkPoca( *oldHit._poca ) );
82 }
83 }
84 // Only record hots if on default TrkRep
85 if ( getParentRep()->particleType() == getParentTrack()->defaultType() ) { setUsedHit(); }
86}
87
89 delete _poca;
90 if ( hit() != 0 && getParentRep() != 0 ) { setUnusedHit(); }
91}
92
93void TrkHitOnTrk::setActivity( bool turnOn ) {
94 if ( !isUsable() || isActive() == turnOn ) return;
95 if ( getParentRep() != 0 )
96 { // needed until Rep-less HoTs go away
97 turnOn ? parentRep()->activateHot( this ) : parentRep()->deactivateHot( this );
98 }
99 else { _isActive = turnOn; }
100}
101
102void TrkHitOnTrk::setUsability( int usability ) {
103 _isUsable = usability;
104 if ( isActive() && !isUsable() )
105 {
106 _isActive = false;
107 if ( getParentRep() != 0 ) parentRep()->deactivateHot( this );
108 }
109 if ( !isActive() && mustUse() )
110 {
111 _isActive = true;
112 if ( getParentRep() != 0 ) parentRep()->activateHot( this );
113 }
114}
115
116double TrkHitOnTrk::weight() const {
117 // could be cached
118 double rms = hitRms();
119 assert( rms > 0 );
120 return double( 1 ) / ( rms * rms );
121}
122
123void TrkHitOnTrk::print( ostream& o ) const {
124 hit()->printAll( o );
125 o << " hitlen " << hitLen() << " fltlen " << fltLen() << " act " << ( isActive() != 0 )
126 << endl;
127}
128
129void TrkHitOnTrk::printAll( ostream& o ) const { print( o ); }
130
132
134
136
138 if ( hit() != 0 ) hit()->setUsedHit( this );
139}
140
142 if ( hit() != 0 ) hit()->setUnusedHit( this );
143}
144
145bool TrkHitOnTrk::operator==( const TrkHitOnTrk& rhs ) const { return this == &rhs; }
146
148 return 0; // by default no ambiguity
149}
150
151void TrkHitOnTrk::setAmbig( int newambig ) {} // by default nothing to set
152
153double TrkHitOnTrk::resid( bool exclude ) const {
154 double r( -99999.9 ), re( -9999.9 );
155 bool s = getParentRep()->resid( this, r, re, exclude );
156 if ( !s && r < -99999.8 )
157 {
158#ifdef MDCPATREC_ROUTINE
159 std::cout << "ErrMsg(routine) "
160 << "error calling parentRep()->residual()" << std::endl;
161#endif
162 }
163 return r;
164}
165
166bool TrkHitOnTrk::resid( double& resid, double& residErr, bool exclude ) const {
167 assert( getParentRep() != 0 );
168 return getParentRep()->resid( this, resid, residErr, exclude );
169}
170
171double TrkHitOnTrk::residual() const {
172 assert( _trkTraj == &( getParentRep()->traj() ) );
173 return _resid;
174}
175
177 _trkTraj = ( trkTraj != 0 ? trkTraj : &( getParentRep()->traj() ) );
178 if ( _poca == 0 )
179 { _poca = new TrkPoca( *_trkTraj, fltLen(), *hitTraj(), hitLen(), _tolerance ); }
180 else { *_poca = TrkPoca( *_trkTraj, fltLen(), *hitTraj(), hitLen(), _tolerance ); }
181 if ( _poca->status().failure() )
182 {
183 if ( isActive() )
184 {
185#ifdef MDCPATREC_WARNING
186 std::cout << "ErrMsg(warning) "
187 << " TrkPoca failed in TrkHitOnTrk::updatePoca" << std::endl;
188#endif
189 }
190 delete _poca;
191 _poca = 0;
192 return TrkErrCode( TrkErrCode::fail, 4 );
193 }
194 _trkLen = _poca->flt1();
195 _hitLen = _poca->flt2();
196 double dca = _poca->doca();
197 if ( !maintainAmb ) setAmbig( dca > 0 ? +1 : -1 );
199}
200
201TrkErrCode TrkHitOnTrk::getFitStuff( HepVector& derivs, double& deltaChi ) const {
202 if ( _poca == 0 || _poca->status().failure() ) { return TrkErrCode( TrkErrCode::fail ); }
203 // FIXME: I wish I could tell poca to NOT iterate
204 // and ONLY compute the distance & derivatives...
206 if ( poca.status().failure() ) { return TrkErrCode( TrkErrCode::fail ); }
207 if ( derivs.num_row() != 0 ) { poca.fetchDerivs( derivs ); }
208 else { derivs = poca.derivs(); }
209 double sigInv = 1. / hitRms();
210 deltaChi = _resid * sigInv; // NOTE: use _INTERNAL_ residual
211 derivs *= sigInv;
213}
214
215TrkErrCode TrkHitOnTrk::getFitStuff( double& deltaChi ) const {
216 assert( _trkTraj == &( getParentRep()->traj() ) );
217 deltaChi = _resid / hitRms(); // NOTE: use _INTERNAL_ residual
219}
220
221ostream& operator<<( ostream& o, const TrkHitOnTrk& x ) {
222 x.print( o );
223 return o;
224}
XmlRpcServer s
ostream & operator<<(ostream &o, const TrkHitOnTrk &x)
virtual const TrkDifTraj & traj() const =0
virtual const TrkSimpTraj * localTrajectory(double fltLen, double &localFlt) const =0
const TrkHitOnTrk * setUnusedHit(const TrkHitOnTrk *hit)
virtual void printAll(std::ostream &os) const
const TrkHitOnTrk * setUsedHit(const TrkHitOnTrk *hit)
void setActivity(bool turnOn)
TrkErrCode updatePoca(const TrkDifTraj *trkTraj, bool maintainAmbiguity)
double residual() const
void setUsability(int usability)
double resid(bool exclude=false) const
virtual void setAmbig(int newambig)
TrkHitOnTrk(const TrkFundHit *, double tolerance)
virtual const Trajectory * hitTraj() const =0
const TrkRecoTrk * getParentTrack() const
virtual const SvtHitOnTrack * svtHitOnTrack() const
virtual const MdcHitOnTrack * mdcHitOnTrack() const
double weight() const
PdtPid::PidType particleType() const
TrkRecoTrk * parentTrack() const
bool operator==(const TrkHitOnTrk &) const
virtual ~TrkHitOnTrk()
void setUnusedHit()
void setUsedHit()
virtual int ambig() const
TrkErrCode getFitStuff(HepVector &derivs, double &deltaChi) const
virtual void print(std::ostream &) const
virtual void printAll(std::ostream &) const
virtual PdtPid::PidType particleType() const
Definition TrkRep.cxx:249
virtual void deactivateHot(TrkHitOnTrk *theHot)
Definition TrkRep.cxx:141
virtual void activateHot(TrkHitOnTrk *theHot)
Definition TrkRep.cxx:128
virtual bool resid(const TrkHitOnTrk *theHot, double &residual, double &residErr, bool exclude=false) const
Definition TrkRep.cxx:269