BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcTrack.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcTrack.cxx,v 1.18 2012/08/13 00:09:19 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):
12// Steve Schaffner
13// Zhang Yao(zhangyao@ihep.ac.cn) Migrate to BESIII
14//
15//------------------------------------------------------------------------
16#include "MdcTrkRecon/MdcTrack.h"
17#include "CLHEP/Alist/AList.h"
18#include "MdcData/MdcHitOnTrack.h"
19#include "MdcGeom/BesAngle.h"
20#include "MdcGeom/Constants.h"
21#include "MdcGeom/MdcLayer.h"
22#include "TrkBase/TrkContext.h"
23#include "TrkBase/TrkExchangePar.h"
24#include "TrkBase/TrkRecoTrk.h"
25#include "TrkBase/TrkRep.h"
26#include "TrkFitter/TrkCircleMaker.h"
27#include "TrkFitter/TrkHelixRep.h"
28#include <assert.h>
29#include <math.h>
30#include <stdlib.h>
31
32#include "Identifier/Identifier.h"
33#include "Identifier/MdcID.h"
34#include "MdcData/MdcHit.h"
35#include "MdcData/MdcHitOnTrack.h"
36#include "MdcData/MdcRecoHitOnTrack.h"
37#include "MdcRawEvent/MdcDigi.h"
38#include "PatBField/BField.h"
40//************************************************************************/
42 //************************************************************************/
43 _theTrack = aTrack;
44 _firstLayer = _lastLayer = 0;
45 _haveCurled = 0;
46}
47
48//************************************************************************/
49MdcTrack::MdcTrack( int nsupers, const TrkExchangePar& par, double chisq, TrkContext& context,
50 double trackT0 ) {
51 //************************************************************************/
52 TrkCircleMaker maker;
53 _theTrack = maker.makeTrack( par, chisq, context, trackT0 );
54 _firstLayer = _lastLayer = 0;
55 _haveCurled = 0;
56}
57
58//************************************************************************/
60 //************************************************************************/
61 delete _theTrack;
62}
63//************************************************************************/
64int MdcTrack::projectToR( double radius, BesAngle& phiIntersect, int lCurl ) const {
65 //************************************************************************/
66 // note that these are currently circle-only routines
67
68 // return -1 if no intersection
69
70 const TrkFit* tkFit = track().fitResult();
71 if ( tkFit == 0 ) return -1;
72 TrkExchangePar par = tkFit->helix( 0.0 );
73 double d0 = par.d0();
74 double omega = par.omega();
75 double phi0 = par.phi0();
76 double r2d2 = radius * radius - d0 * d0;
77 if ( r2d2 < 0 ) return -1;
78 double rinv = 1. / radius;
79 double k2dinv = 1. / ( 1 + omega * d0 );
80 if ( !lCurl )
81 {
82 double arg = d0 * rinv + 0.5 * omega * rinv * r2d2 * k2dinv;
83 if ( fabs( arg ) > 1.0 ) return -1;
84 phiIntersect.setRad( phi0 + asin( arg ) );
85 }
86 else
87 {
88 double arg = -d0 * rinv - 0.5 * omega * rinv * r2d2 * k2dinv;
89 if ( fabs( arg ) > 1.0 ) return -1;
90 phiIntersect.setRad( phi0 + Constants::pi + asin( arg ) );
91 }
92
93 return 0;
94}
95
96//************************************************************************/
97int MdcTrack::projectToR( double radius, BesAngle& phiIntersect, double& arcLength,
98 int lCurl ) const {
99 //************************************************************************/
100
101 // return -1 if no intersection
102 // Only valid for projecting track outwards from point of closest approach
103 // Returns arclength from POCA
104
105 const TrkFit* tkFit = track().fitResult();
106 if ( tkFit == 0 ) return -1;
107 TrkExchangePar par = tkFit->helix( 0.0 );
108 double d0 = par.d0();
109 double omega = par.omega();
110 double phi0 = par.phi0();
111 double r2d2 = radius * radius - d0 * d0;
112 if ( r2d2 < 0 ) return -1;
113 double rinv = 1. / radius;
114 double k2dinv = 1. / ( 1 + omega * d0 );
115 if ( k2dinv < 0.0 ) return -1;
116 double arg;
117
118 if ( !lCurl )
119 {
120 arg = d0 * rinv + 0.5 * omega * rinv * r2d2 * k2dinv;
121 if ( fabs( arg ) > 1.0 ) return -1;
122 phiIntersect.setRad( phi0 + asin( arg ) );
123 }
124 else
125 {
126 arg = -d0 * rinv - 0.5 * omega * rinv * r2d2 * k2dinv;
127 if ( fabs( arg ) > 1.0 ) return -1;
128 phiIntersect.setRad( phi0 + Constants::pi + asin( arg ) );
129 }
130
131 arg = 0.5 * omega * sqrt( r2d2 * k2dinv );
132 arcLength = 2. * asin( arg ) / omega;
133
134 return 0;
135}
136
137//----------------------------------------------------------------
138bool MdcTrack::operator==( const MdcTrack& tk ) const {
139 //----------------------------------------------------------------
140
141 return ( track() == tk.track() );
142}
143
144// yzhang for store to TDS
145void MdcTrack::storeTrack( int trackId, RecMdcTrackCol* trackList, RecMdcHitCol* hitList,
146 int tkStat ) {
147 // check the fit succeeded
148 // if (status().failure()) { return; }
149
150 // get the results of the fit to this track
151 const TrkFit* fitresult = track().fitResult();
152 // check the fit worked
153 if ( fitresult == 0 ) return;
154
155 // new a Rec. Track MdcTrack
156 RecMdcTrack* recMdcTrack = new RecMdcTrack();
157 const TrkHitList* aList = track().hits();
158 // some track info
159 const BField& theField = track().bField();
160 double Bz = theField.bFieldZ();
161 // Fit info
162 int hitId = 0;
163 int nHits = 0;
164 int nSt = 0;
165 // int nAct=0; int nSeg=0;
166 // int maxlay = 0; int minlay = 43; int seg[11];/* 11 slayer */ int segme;
167 //****************************
168 //* active flag open this
169 //****************************
170 //* if (allHit>0){
171 //* nHits = aList->nHit();//add inActive hit also
172 //* }else{
173 //* nHits = fitresult->nMdc();// = nActive()
174 //* }
175 //****************************
176 // for 5.1.0 use all hits
177 nHits = aList->nHit();
178 //****************************
179 // use active only
180 // nHits = fitresult->nMdc();// = nActive()
181 //****************************
182
183 int q = fitresult->charge();
184 double chisq = fitresult->chisq();
185 int nDof = fitresult->nDof();
186 // track parameters at closest approach to beamline
187 double fltLenPoca = 0.0;
188 TrkExchangePar helix = fitresult->helix( fltLenPoca );
189 // std::cout<< __FILE__ << " phi0 " << helix.phi0() << " omega "
190 // <<helix.omega()<<std::endl;
191 double phi0 = helix.phi0();
192 double tanDip = helix.tanDip();
193 // double z0 = helix.z0();
194 double d0 = helix.d0();
195 // momenta and position
196 // CLHEP::Hep3Vector mom = fitresult->momentum(fltLenPoca);
197 HepPoint3D poca = fitresult->position( fltLenPoca );
198
199 double helixPar[5];
200 // dro =-d0
201 helixPar[0] = -d0;
202 // phi0 = phi0 - pi/2 [0,2pi)
203 double tphi0 = phi0 - Constants::pi / 2.;
204 if ( tphi0 < 0. ) tphi0 += Constants::pi * 2.;
205 helixPar[1] = tphi0;
206 // kappa = q/pxy
207 double pxy = fitresult->pt();
208 if ( pxy == 0. ) helixPar[2] = 9999.;
209 else helixPar[2] = q / fabs( pxy );
210 if ( pxy > 9999. ) helixPar[2] = 0.00001;
211 // dz = z0
212 helixPar[3] = helix.z0();
213 // tanl
214 helixPar[4] = tanDip;
215 // error
216 // V(Y)=S * V(X) * ST , mS = S , mVy = V(Y) , helix.covariance() = V(X)
217 HepSymMatrix mS( helix.params().num_row(), 0 );
218 mS[0][0] = -1.; // dr0=-d0
219 mS[1][1] = 1.;
220 mS[2][2] = -333.567 / Bz; // pxy -> cpa
221 mS[3][3] = 1.;
222 mS[4][4] = 1.;
223 HepSymMatrix mVy = helix.covariance().similarity( mS );
224 double errorMat[15];
225 int k = 0;
226 for ( int ie = 0; ie < 5; ie++ )
227 {
228 for ( int je = ie; je < 5; je++ )
229 {
230 errorMat[k] = mVy[ie][je];
231 k++;
232 }
233 }
234 double p, px, py, pz;
235 px = pxy * ( -sin( helixPar[1] ) );
236 py = pxy * cos( helixPar[1] );
237 pz = pxy * helixPar[4];
238 p = sqrt( pxy * pxy + pz * pz );
239 // theta, phi
240 double theta = acos( pz / p );
241 double phi = atan2( py, px );
242 recMdcTrack->setTrackId( trackId );
243 recMdcTrack->setHelix( helixPar );
244 recMdcTrack->setCharge( q );
245 recMdcTrack->setPxy( pxy );
246 recMdcTrack->setPx( px );
247 recMdcTrack->setPy( py );
248 recMdcTrack->setPz( pz );
249 recMdcTrack->setP( p );
250 recMdcTrack->setTheta( theta );
251 recMdcTrack->setPhi( phi );
252 recMdcTrack->setPoca( poca );
253 recMdcTrack->setX( poca.x() ); // poca
254 recMdcTrack->setY( poca.y() );
255 recMdcTrack->setZ( poca.z() );
256 recMdcTrack->setR( sqrt( poca.x() * poca.x() + poca.y() * poca.y() ) );
257 HepPoint3D pivot( 0., 0., 0. );
258 recMdcTrack->setPivot( pivot );
259 recMdcTrack->setVX0( 0. ); // pivot
260 recMdcTrack->setVY0( 0. );
261 recMdcTrack->setVZ0( 0. );
262 recMdcTrack->setError( errorMat );
263 recMdcTrack->setError( mVy );
264 recMdcTrack->setChi2( chisq );
265 recMdcTrack->setNdof( nDof );
266 recMdcTrack->setStat( tkStat );
267 recMdcTrack->setNhits( nHits );
268 //-----------hit list-------------
269 HitRefVec hitRefVec;
270 vector<int> vecHits;
271 // for fiterm
272 int maxLayerId = -1;
273 int minLayerId = 43;
274 double fiTerm = 999.;
275 const MdcRecoHitOnTrack* fiTermHot = NULL;
276 TrkHitList::hot_iterator hot = aList->begin();
277 for ( ; hot != aList->end(); hot++ )
278 {
279 const MdcRecoHitOnTrack* recoHot;
280 recoHot = dynamic_cast<const MdcRecoHitOnTrack*>( &( *hot ) );
281 // if (!recoHot->mdcHit()) return;
282 RecMdcHit* recMdcHit = new RecMdcHit;
283 // id
284 recMdcHit->setId( hitId );
285 //---------BESIII----------
286 // phiWire - phiHit <0 flagLR=0 left driftleft<0 ;
287 // phiWire - phiHit >0 flagLR=1 right driftright>0;
288 // flag = 2 ambig;
289 //-----Babar wireAmbig----
290 //-1 -> right, 0 -> don't know, +1 -> left
291 //+1 phiWire-phiHit<0 Left,
292 //-1 phiWire-phiHit>0 Right,
293 // 0 don't know
294 // ambig() w.r.t track direction
295 // wireAmbig() w.r.t. wire location
296 double hotWireAmbig = recoHot->wireAmbig();
297 double driftDist = fabs( recoHot->drift() );
298 double sigma = recoHot->hitRms();
299 double doca = fabs( recoHot->dcaToWire() );
300 int flagLR = 2;
301 if ( hotWireAmbig == 1 )
302 {
303 flagLR = 0; // left driftDist <0
304 doca *= -1.; // 2012-07-19
305 }
306 else if ( hotWireAmbig == -1 )
307 {
308 flagLR = 1; // right driftDist >0
309 }
310 else if ( hotWireAmbig == 0 )
311 {
312 flagLR = 2; // don't know
313 }
314 recMdcHit->setFlagLR( flagLR );
315 recMdcHit->setDriftDistLeft( ( -1 ) * driftDist );
316 recMdcHit->setErrDriftDistLeft( sigma );
317 recMdcHit->setDriftDistRight( driftDist );
318 recMdcHit->setErrDriftDistRight( sigma );
319 // Mdc Id
320 Identifier mdcId = recoHot->mdcHit()->digi()->identify();
321 recMdcHit->setMdcId( mdcId );
322 // corrected ADC
323
324 // contribution to chisquare
325 // fill chisq
326 double res = 999., rese = 999.;
327 if ( recoHot->resid( res, rese, false ) ) {}
328 else {}
329 double deltaChi = 0;
330 recoHot->getFitStuff( deltaChi ); // yzhang open 2010-09-20
331 recMdcHit->setChisqAdd( deltaChi * deltaChi );
332 // set tracks containing this hit
333 recMdcHit->setTrkId( trackId );
334 // doca
335 recMdcHit->setDoca( doca ); // doca sign left<0
336 // entrance angle
337
338 recMdcHit->setEntra( recoHot->entranceAngle() );
339 // z of hit
340 HepPoint3D pos;
341 Hep3Vector dir;
342 double fltLen = recoHot->fltLen();
343 recMdcHit->setFltLen( fltLen );
344 recoHot->getParentRep()->traj().getInfo( fltLen, pos, dir );
345 recMdcHit->setZhit( pos.z() );
346 double tof = recoHot->getParentRep()->arrivalTime( fltLen );
347 recMdcHit->setTdc( recoHot->mdcHit()->tdcIndex() );
348 recMdcHit->setAdc( recoHot->mdcHit()->adcIndex() );
349 // drift time
350 recMdcHit->setDriftT( recoHot->mdcHit()->driftTime( tof, pos.z() ) );
351 // for fiterm
352 int layerId = recoHot->mdcHit()->layernumber();
353 int wireId = recoHot->mdcHit()->wirenumber();
354 // std::cout<<" MdcTrack::store() ("<<layerId<<","<<wireId<<") fltLen "<<fltLen<<"
355 // wireAmbig "<<hotWireAmbig<<" y "<<pos.y()<<std::endl;
356 //<<recoHot->entranceAngle()<<std::endl;
357 if ( layerId >= maxLayerId )
358 {
359 maxLayerId = layerId;
360 fiTermHot = recoHot;
361 }
362 if ( layerId < minLayerId ) { minLayerId = layerId; }
363 // status flag
364 if ( recoHot->isActive() ) { recMdcHit->setStat( 1 ); }
365 else { recMdcHit->setStat( 0 ); }
366 // for 5.1.0 use all hits
367 if ( recoHot->layer()->view() ) { ++nSt; }
368 hitList->push_back( recMdcHit );
369 SmartRef<RecMdcHit> refHit( recMdcHit );
370 hitRefVec.push_back( refHit );
371 vecHits.push_back( mdcId.get_value() );
372 ++hitId;
373 }
374 // fi terminal angle
375 if ( fiTermHot != NULL )
376 { fiTerm = ( 1. / sqrt( 1. + tanDip * tanDip ) ) * fiTermHot->fltLen() * helix.omega(); }
377 recMdcTrack->setFiTerm( fiTerm );
378 // number of stereo hits contained
379 recMdcTrack->setNster( nSt );
380 recMdcTrack->setFirstLayer( maxLayerId );
381 recMdcTrack->setLastLayer( minLayerId );
382 recMdcTrack->setVecHits( hitRefVec );
383 trackList->push_back( recMdcTrack );
384} // end of storeTrack
HepGeom::Point3D< double > HepPoint3D
double arg(const EvtComplex &c)
TrkSimpleMaker< TrkCircleRep > TrkCircleMaker
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition KKsem.h:33
void setError(double err[15])
void setHelix(double helix[5])
void setPoca(double poca[3])
int wireAmbig() const
double dcaToWire() const
double entranceAngle() const
const MdcLayer * layer() const
double driftTime(double tof, double z) const
Definition MdcHit.cxx:142
const MdcHit * mdcHit() const
int projectToR(double radius, BesAngle &phiIntersect, int lCurl=0) const
Definition MdcTrack.cxx:64
bool operator==(const MdcTrack &tk) const
Definition MdcTrack.cxx:138
void storeTrack(int trackId, RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat)
Definition MdcTrack.cxx:145
MdcTrack(TrkRecoTrk *aTrack)
Definition MdcTrack.cxx:41
virtual Identifier identify() const
Definition RawData.cxx:15
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &direction) const =0
virtual double pt(double fltL=0.) const =0
virtual double chisq() const =0
virtual int charge() const =0
virtual int nDof() const =0
virtual const TrkDifTraj & traj() const =0
virtual HepPoint3D position(double fltL) const =0
virtual TrkExchangePar helix(double fltL) const =0
double resid(bool exclude=false) const
TrkErrCode getFitStuff(HepVector &derivs, double &deltaChi) const
const TrkFit * fitResult() const
virtual double arrivalTime(double fltL) const
Definition TrkRep.cxx:158
TrkRecoTrk * makeTrack(const TrkExchangePar &helix, const double chi2, const TrkContext &, double trackT0) const