29#include "EvTimeEvent/RecEsTime.h"
30#include "EventModel/EventHeader.h"
32#include "GaudiKernel/DataSvc.h"
33#include "GaudiKernel/IDataManagerSvc.h"
34#include "GaudiKernel/IDataProviderSvc.h"
35#include "GaudiKernel/ISvcLocator.h"
36#include "GaudiKernel/MsgStream.h"
37#include "GaudiKernel/PropertyMgr.h"
38#include "GaudiKernel/SmartDataPtr.h"
39#include "Identifier/Identifier.h"
40#include "Identifier/MdcID.h"
41#include "MagneticFieldSvc/IBesMagFieldSvc.h"
42#include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
43#include "MdcData/MdcHitMap.h"
44#include "MdcData/MdcHitOnTrack.h"
45#include "MdcData/MdcHitUse.h"
46#include "MdcData/MdcRecoHitOnTrack.h"
47#include "MdcGeom/Constants.h"
48#include "MdcRecEvent/RecMdcHit.h"
49#include "MdcTrkRecon/MdcTrack.h"
50#include "TrkBase/TrkErrCode.h"
51#include "TrkBase/TrkExchangePar.h"
52#include "TrkBase/TrkFit.h"
53#include "TrkBase/TrkHitList.h"
54#include "TrkBase/TrkRecoTrk.h"
55#include "TrkFitter/TrkContextEv.h"
56#include "TrkFitter/TrkHelixMaker.h"
60 : Algorithm( name, pSvcLocator ) {
61 declareProperty(
"debug", m_debug = 0 );
63 declareProperty(
"maxDd0InMerge", m_maxDd0InMerge = 2.7 );
64 declareProperty(
"maxDphi0InMerge", m_maxDphi0InMerge = 0.15 );
65 declareProperty(
"maxDPdradInMerge", m_maxPdradInMerge = 0.22 );
66 declareProperty(
"maxRcsInMerge", m_maxRcsInMerge = 18. );
68 declareProperty(
"mergePt", m_mergePt = 0.13 );
69 declareProperty(
"mergeLoadAx", m_mergeLoadAx = 3. );
70 declareProperty(
"mergeLoadSt", m_mergeLoadSt = 4. );
71 declareProperty(
"mergeOverlapRatio", m_mergeOverlapRatio = 0.7 );
82 if ( NULL == m_gm )
return StatusCode::FAILURE;
83 return StatusCode::SUCCESS;
90 MsgStream log(
msgSvc(), name() );
91 log << MSG::INFO <<
"in initialize()" << endmsg;
96 sc = service(
"MagneticFieldSvc", m_pIMF );
97 if ( sc != StatusCode::SUCCESS )
99 log << MSG::ERROR <<
"Unable to open Magnetic field service" << endmsg;
100 return StatusCode::FAILURE;
102 m_bfield =
new BField( m_pIMF );
104 return StatusCode::SUCCESS;
111 if ( sc.isFailure() )
113 error() <<
"beginRun failed" << endmsg;
114 return StatusCode::FAILURE;
119 MsgStream log(
msgSvc(), name() );
120 log << MSG::INFO <<
"in execute()" << endmsg;
121 setFilterPassed(
false );
124 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
125 if ( !aevtimeCol || aevtimeCol->size() == 0 )
127 log << MSG::WARNING <<
" Could not find RecEsTimeCol" << endmsg;
128 return StatusCode::SUCCESS;
131 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
132 for ( ; iter_evt != aevtimeCol->end(); iter_evt++ ) { m_bunchT0 = ( *iter_evt )->getTest(); }
138 std::cout << name() <<
": Merged " << nMerged <<
" track " << std::endl;
142 return StatusCode::SUCCESS;
146 MsgStream log(
msgSvc(), name() );
147 log << MSG::INFO <<
"in finalize()" << endmsg;
149 return StatusCode::SUCCESS;
157 if ( !trackList )
return -1;
162 RecMdcTrackCol::iterator iterRefTk = trackList->begin();
163 for ( ; iterRefTk != trackList->end(); iterRefTk++ )
166 if ( refTk->
stat() < 0 )
continue;
167 std::vector<RecMdcTrack*> mergeTkList;
168 mergeTkList.push_back( refTk );
172 RecMdcTrackCol::iterator iterTestTk = trackList->begin();
173 for ( ; iterTestTk != trackList->end(); iterTestTk++ )
176 if ( iterRefTk == iterTestTk || ( testTk->
stat() < 0 ) )
continue;
182 std::cout << __FILE__ <<
" overlape tk:" << refTk->
trackId() <<
" with "
183 << testTk->
trackId() << std::endl;
184 mergeTkList.push_back( testTk );
191 std::cout << __FILE__ <<
" same param tk:" << refTk->
trackId() <<
" with "
192 << testTk->
trackId() << std::endl;
193 mergeTkList.push_back( testTk );
196 if ( mergeTkList.size() > 1 && curl ) needMerge =
doMergeCurl( mergeTkList );
197 if ( ( needMerge < 999 ) && mergeTkList.size() > 1 )
204 if ( needMerge <= 0 )
return 0;
207 iterRefTk = trackList->begin();
210 for ( ; iterRefTk != trackList->end(); )
212 if ( ( *iterRefTk )->stat() >= 0 )
214 ( *iterRefTk )->setTrackId( iTk );
220 int id = ( *iterRefTk )->trackId();
225 if ( m_debug > 0 ) std::cout << __FILE__ <<
" erase track No." <<
id << std::endl;
229 if ( m_debug > 0 ) std::cout << __FILE__ <<
" erase failed !" << std::endl;
234 std::cout << __FILE__ <<
" After merge save " << iTk <<
" tracks" << std::endl;
247 double Bz = m_bfield->bFieldZ();
255 double d01 = -refTk->
helix( 0 );
256 double d02 = -testTk->
helix( 0 );
257 double dphi0 = fabs( phi01 - phi02 );
258 double dd0 = fabs( d01 - d02 );
259 double prodo = omega1 * omega2;
262 if ( fabs( omega1 ) > 0.00001 ) r1 = 1.0 / fabs( omega1 );
263 if ( fabs( omega2 ) > 0.00001 ) r2 = 1.0 / fabs( omega2 );
264 double pdrad = fabs( ( r1 - r2 ) / ( r1 + r2 ) );
268 std::cout <<
" fabs(d01 - d02) " << fabs( d01 - d02 ) << std::endl;
269 std::cout <<
" fabs(phi01-phi02) " << fabs( phi01 - phi02 ) << std::endl;
272 if ( ( prodo > 0. ) && ( dd0 < m_maxDd0InMerge ) && ( dphi0 < m_maxDphi0InMerge ) &&
273 ( pdrad < m_maxPdradInMerge ) )
277 if ( ( prodo < 0. ) && ( fabs( d01 + d02 ) < 4.0 ) && ( dd0 > 47.0 ) &&
278 ( fabs( dphi0 -
Constants::pi ) < m_maxDphi0InMerge ) && ( pdrad < m_maxPdradInMerge ) )
290 double minRcs = 999.;
293 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin();
294 for (
int iTk = 0; itTk != mergeTkList.end(); itTk++, iTk++ )
297 double chi2 = tk->
chi2();
298 double ndf = tk->
ndof();
299 if ( chi2 / ndf < minRcs )
305 if ( minRcs < m_maxRcsInMerge )
return bestTkId;
369 if ( ( testTk->
pxy() >= m_mergePt ) || ( refTk->
pxy() >= m_mergePt ) )
return overlaped;
372 int nHit = testHits.size();
375 HitRefVec::iterator iterHit = testHits.begin();
376 for ( ; iterHit != testHits.end(); iterHit++ )
381 double load = m_mergeLoadAx;
383 if ( isStLayer ) load = m_mergeLoadSt;
386 double vx0 = refTk->
getVX0();
387 double vy0 = refTk->
getVY0();
388 double vz0 = refTk->
getVZ0();
389 double dr = refTk->
helix( 0 );
390 double phi0 = refTk->
helix( 1 );
391 double Bz = m_bfield->bFieldZ();
393 double dz = refTk->
helix( 3 );
394 double tanl = refTk->
helix( 4 );
397 double xc = vx0 + ( dr + r ) *
cos( phi0 );
398 double yc = vy0 + ( dr + r ) *
sin( phi0 );
402 double phi = ( vz0 + dz - zHit ) / ( r * tanl );
403 double xHit = vx0 + dr *
cos( phi0 ) + r * (
cos( phi0 ) -
cos( phi0 + phi ) );
404 double yHit = vy0 + dr *
sin( phi0 ) + r * (
sin( phi0 ) -
sin( phi0 + phi ) );
407 double dx = xc - xHit;
408 double dy = yc - yHit;
409 double dHit2Center = sqrt( dx * dx + dy * dy );
410 double rTk = fabs( r );
413 if ( ( dHit2Center > ( rTk - load ) ) && ( dHit2Center < ( rTk + load ) ) ) nOverlap++;
416 if ( nOverlap <= 0 )
return overlaped;
418 double overlapRatio = double( nOverlap ) / double( nHit );
420 if ( overlapRatio > m_mergeOverlapRatio ) overlaped = 1;
428 int innerMostTkId = 999;
430 unsigned innerMostLayerOfTk = 999;
431 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin();
432 for (
int iTk = 0; itTk != mergeTkList.end(); itTk++, iTk++ )
435 unsigned innerMostLayer = 999;
436 for (
unsigned iHit = 0; iHit < tk->
getVecHits().size(); iHit++ )
439 if ( layer < innerMostLayer ) innerMostLayer = layer;
443 std::cout << __FILE__ <<
" to be merged track id=" << tk->
trackId() << std::endl;
445 if ( innerMostLayer < innerMostLayerOfTk )
450 else if ( innerMostLayer == innerMostLayerOfTk )
453 if ( tk->
helix( 3 ) < innerMostTk->
helix( 3 ) )
462 return innerMostTkId;
467 if ( !trackList )
return;
469 if ( !hitList )
return;
471 assert( aTrack != NULL );
474 if ( m_debug > 1 ) std::cout << __FILE__ <<
" STORED" << std::endl;
478 mdcTrack.
storeTrack( -1, trackList, hitList, tkStat );
483 if ( !trackList )
return false;
485 if ( !hitList )
return false;
487 HitRefVec::iterator iterHit = hits.begin();
488 for ( ; iterHit != hits.end(); iterHit++ )
492 trackList->erase( tk );
498 if ( !trackList )
return;
499 if ( trackList->size() != 4 ) setFilterPassed(
true );
500 std::cout <<
"N track after Merged = " << trackList->size() << std::endl;
501 if ( m_debug <= 1 )
return;
502 RecMdcTrackCol::iterator it = trackList->begin();
503 for ( ; it != trackList->end(); it++ )
506 std::cout <<
"//====RecMdcTrack " << tk->
trackId() <<
"====:" << std::endl;
507 cout <<
" d0 " << tk->
helix( 0 ) <<
" phi0 " << tk->
helix( 1 ) <<
" cpa " << tk->
helix( 2 )
508 <<
" z0 " << tk->
helix( 3 ) <<
" tanl " << tk->
helix( 4 ) << endl;
509 std::cout <<
" q " << tk->
charge() <<
" theta " << tk->
theta() <<
" phi " << tk->
phi()
510 <<
" x0 " << tk->
x() <<
" y0 " << tk->
y() <<
" z0 " << tk->
z() <<
" r0 "
512 std::cout <<
" p " << tk->
p() <<
" pt " << tk->
pxy() <<
" px " << tk->
px() <<
" py "
513 << tk->
py() <<
" pz " << tk->
pz() << endl;
514 std::cout <<
" tkStat " << tk->
stat() <<
" chi2 " << tk->
chi2() <<
" ndof " << tk->
ndof()
515 <<
" nhit " << tk->
getNhits() <<
" nst " << tk->
nster() << endl;
521 std::cout << nhits <<
" Hits: " << std::endl;
522 for (
int ii = 0; ii < nhits; ii++ )
527 cout <<
"(" << layer <<
"," << wire <<
"," << tk->
getVecHits()[ii]->getStat()
528 <<
",lr:" << tk->
getVecHits()[ii]->getFlagLR() <<
") ";
530 std::cout <<
" " << std::endl;
532 std::cout <<
" " << std::endl;
DECLARE_COMPONENT(BesBdkRc)
double sin(const BesAngle a)
double cos(const BesAngle a)
SmartRefVector< RecMdcHit > HitRefVec
static const double twoPi
const double theta() const
const double chi2() const
void setStat(const int stat)
const int trackId() const
const HepVector helix() const
......
static MdcDetector * instance()
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
int doMergeLong(std::vector< RecMdcTrack * > mergeTkList)
int testByParam(RecMdcTrack *refTk, RecMdcTrack *testTk)
void store(TrkRecoTrk *aTrack)
bool eraseTdsTrack(RecMdcTrackCol::iterator tk)
int testByOverlapHit(RecMdcTrack *refTk, RecMdcTrack *testTk)
int doMergeCurl(std::vector< RecMdcTrack * > mergeTkList)
MdcMergeDups(const std::string &name, ISvcLocator *pSvcLocator)
void storeTrack(int trackId, RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat)
const double getZhit(void) const
const Identifier getMdcId(void) const
const double getVZ0() const
const HitRefVec getVecHits(void) const
const double getVY0() const
const int getNhits() const
const double getVX0() const
virtual TrkExchangePar helix(double fltL) const =0
const TrkFit * fitResult() const
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol