BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcMergeDups Class Reference

#include <MdcMergeDups.h>

Inheritance diagram for MdcMergeDups:

Public Member Functions

 MdcMergeDups (const std::string &name, ISvcLocator *pSvcLocator)
virtual ~MdcMergeDups ()
StatusCode initialize ()
StatusCode execute ()
StatusCode finalize ()
StatusCode beginRun ()
int mergeDups (void)
int mergeCurl (void)
int testByOverlapHit (RecMdcTrack *refTk, RecMdcTrack *testTk)
int testByParam (RecMdcTrack *refTk, RecMdcTrack *testTk)
int doMergeLong (std::vector< RecMdcTrack * > mergeTkList)
int doMergeCurl (std::vector< RecMdcTrack * > mergeTkList)
void store (TrkRecoTrk *aTrack)
bool eraseTdsTrack (RecMdcTrackCol::iterator tk)
void dumpRecMdcTrack ()

Detailed Description

Definition at line 48 of file MdcMergeDups.h.

Constructor & Destructor Documentation

◆ MdcMergeDups()

MdcMergeDups::MdcMergeDups ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 59 of file MdcMergeDups.cxx.

60 : Algorithm( name, pSvcLocator ) {
61 declareProperty( "debug", m_debug = 0 );
62 // cuts for mergeDups()
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. );
67 // cuts for mergeCurl()
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 );
72}

Referenced by MdcMergeDups().

◆ ~MdcMergeDups()

MdcMergeDups::~MdcMergeDups ( )
virtual

Definition at line 77 of file MdcMergeDups.cxx.

77{ delete m_bfield; }

Member Function Documentation

◆ beginRun()

StatusCode MdcMergeDups::beginRun ( )

Definition at line 79 of file MdcMergeDups.cxx.

79 {
80 // Detector geometry
81 m_gm = MdcDetector::instance();
82 if ( NULL == m_gm ) return StatusCode::FAILURE;
83 return StatusCode::SUCCESS;
84}
static MdcDetector * instance()

Referenced by execute().

◆ doMergeCurl()

int MdcMergeDups::doMergeCurl ( std::vector< RecMdcTrack * > mergeTkList)

Definition at line 426 of file MdcMergeDups.cxx.

426 {
427 //-------------------------------------------------------------------
428 int innerMostTkId = 999;
429 RecMdcTrack* innerMostTk = NULL;
430 unsigned innerMostLayerOfTk = 999;
431 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin();
432 for ( int iTk = 0; itTk != mergeTkList.end(); itTk++, iTk++ )
433 {
434 RecMdcTrack* tk = ( *itTk );
435 unsigned innerMostLayer = 999;
436 for ( unsigned iHit = 0; iHit < tk->getVecHits().size(); iHit++ )
437 {
438 unsigned layer = MdcID::layer( tk->getVecHits()[iHit]->getMdcId() );
439 if ( layer < innerMostLayer ) innerMostLayer = layer;
440 }
441
442 if ( m_debug > 0 )
443 std::cout << __FILE__ << " to be merged track id=" << tk->trackId() << std::endl;
444 // test inner most layer id; if same, test dz
445 if ( innerMostLayer < innerMostLayerOfTk )
446 {
447 innerMostTkId = iTk;
448 innerMostTk = tk;
449 }
450 else if ( innerMostLayer == innerMostLayerOfTk )
451 {
452 // test by dz
453 if ( tk->helix( 3 ) < innerMostTk->helix( 3 ) )
454 {
455 innerMostTkId = iTk;
456 innerMostTk = tk;
457 }
458 }
459 } // end of for mergeTkList
460 innerMostTk->setStat( -1 );
461
462 return innerMostTkId;
463}
const HepVector helix() const
......
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
Definition MdcID.cxx:47

Referenced by mergeCurl().

◆ doMergeLong()

int MdcMergeDups::doMergeLong ( std::vector< RecMdcTrack * > mergeTkList)

Definition at line 287 of file MdcMergeDups.cxx.

287 {
288 //-------------------------------------------------------------------
289 // merge hitlist
290 double minRcs = 999.;
291 int bestTkId = 999;
292 RecMdcTrack* bestTk = NULL;
293 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin();
294 for ( int iTk = 0; itTk != mergeTkList.end(); itTk++, iTk++ )
295 {
296 RecMdcTrack* tk = ( *itTk );
297 double chi2 = tk->chi2();
298 double ndf = tk->ndof();
299 if ( chi2 / ndf < minRcs )
300 {
301 bestTkId = tk->trackId();
302 bestTk = tk;
303 }
304 }
305 if ( minRcs < m_maxRcsInMerge ) return bestTkId;
306 bestTk->setStat( -1 );
307
308 return 999;
309 // FIXME
310 /*
311 //fit with track parameter respectively
312 MdcxFittedHel fit1(dcxhlist, *iptr);
313 MdcxFittedHel fit2(dcxhlist, *trkl[j]);
314 int uf = 0;
315 //get a best fit
316 if ( !fit1.Fail() && (fit1.Rcs()<m_maxRcsInMerge) ) uf = 1;
317 if ( !fit2.Fail() && (fit2.Rcs()<fit1.Rcs()) ) uf = 2;
318
319 if (uf) {//two fit all ok
320 //delete bad track
321 MdcxHel fitme = (uf == 1) ? fit1 : fit2;
322 }
323 */
324}

Referenced by mergeCurl().

◆ dumpRecMdcTrack()

void MdcMergeDups::dumpRecMdcTrack ( )

Definition at line 496 of file MdcMergeDups.cxx.

496 {
497 SmartDataPtr<RecMdcTrackCol> trackList( eventSvc(), EventModel::Recon::RecMdcTrackCol );
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++ )
504 {
505 RecMdcTrack* tk = *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 "
511 << tk->r() << endl;
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;
516 // std::cout<< "errmat " << std::endl;
517 // for (int i=0; i<15; i++){ std::cout<< " "<<tk->err(i); }
518 // std::cout<< " " << std::endl;
519
520 int nhits = tk->getVecHits().size();
521 std::cout << nhits << " Hits: " << std::endl;
522 for ( int ii = 0; ii < nhits; ii++ )
523 {
524 Identifier id( tk->getVecHits()[ii]->getMdcId() );
525 int layer = MdcID::layer( id );
526 int wire = MdcID::wire( id );
527 cout << "(" << layer << "," << wire << "," << tk->getVecHits()[ii]->getStat()
528 << ",lr:" << tk->getVecHits()[ii]->getFlagLR() << ") ";
529 } // end of hit list
530 std::cout << " " << std::endl;
531 } // end of tk list
532 std::cout << " " << std::endl;
533}
static int wire(const Identifier &id)
Definition MdcID.cxx:52

Referenced by execute().

◆ eraseTdsTrack()

bool MdcMergeDups::eraseTdsTrack ( RecMdcTrackCol::iterator tk)

Definition at line 481 of file MdcMergeDups.cxx.

481 {
482 SmartDataPtr<RecMdcTrackCol> trackList( eventSvc(), EventModel::Recon::RecMdcTrackCol );
483 if ( !trackList ) return false;
484 SmartDataPtr<RecMdcHitCol> hitList( eventSvc(), EventModel::Recon::RecMdcHitCol );
485 if ( !hitList ) return false;
486 HitRefVec hits = ( *tk )->getVecHits();
487 HitRefVec::iterator iterHit = hits.begin();
488 for ( ; iterHit != hits.end(); iterHit++ )
489 {
490 // hitList->erase(iterHit);
491 }
492 trackList->erase( tk );
493 return true;
494}

Referenced by mergeCurl().

◆ execute()

StatusCode MdcMergeDups::execute ( )

Definition at line 107 of file MdcMergeDups.cxx.

107 {
108 if ( !m_beginRun )
109 {
110 StatusCode sc = beginRun();
111 if ( sc.isFailure() )
112 {
113 error() << "beginRun failed" << endmsg;
114 return StatusCode::FAILURE;
115 }
116 m_beginRun = true;
117 }
118
119 MsgStream log( msgSvc(), name() );
120 log << MSG::INFO << "in execute()" << endmsg;
121 setFilterPassed( false );
122
123 m_bunchT0 = -999.;
124 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
125 if ( !aevtimeCol || aevtimeCol->size() == 0 )
126 {
127 log << MSG::WARNING << " Could not find RecEsTimeCol" << endmsg;
128 return StatusCode::SUCCESS;
129 }
130
131 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
132 for ( ; iter_evt != aevtimeCol->end(); iter_evt++ ) { m_bunchT0 = ( *iter_evt )->getTest(); }
133
134 int nMerged = mergeCurl();
135
136 if ( m_debug > 0 )
137 {
138 std::cout << name() << ": Merged " << nMerged << " track " << std::endl;
140 }
141
142 return StatusCode::SUCCESS;
143}
IMessageSvc * msgSvc()
void dumpRecMdcTrack()
StatusCode beginRun()
int mergeCurl(void)

◆ finalize()

StatusCode MdcMergeDups::finalize ( )

Definition at line 145 of file MdcMergeDups.cxx.

145 {
146 MsgStream log( msgSvc(), name() );
147 log << MSG::INFO << "in finalize()" << endmsg;
148
149 return StatusCode::SUCCESS;
150}

◆ initialize()

StatusCode MdcMergeDups::initialize ( )

Definition at line 89 of file MdcMergeDups.cxx.

89 {
90 MsgStream log( msgSvc(), name() );
91 log << MSG::INFO << "in initialize()" << endmsg;
92 StatusCode sc;
93
94 // Initailize magnetic filed
95 IBesMagFieldSvc* m_pIMF;
96 sc = service( "MagneticFieldSvc", m_pIMF );
97 if ( sc != StatusCode::SUCCESS )
98 {
99 log << MSG::ERROR << "Unable to open Magnetic field service" << endmsg;
100 return StatusCode::FAILURE;
101 }
102 m_bfield = new BField( m_pIMF );
103
104 return StatusCode::SUCCESS;
105}

◆ mergeCurl()

int MdcMergeDups::mergeCurl ( void )

Definition at line 153 of file MdcMergeDups.cxx.

153 {
154 //-------------------------------------------------------------------
155
156 SmartDataPtr<RecMdcTrackCol> trackList( eventSvc(), EventModel::Recon::RecMdcTrackCol );
157 if ( !trackList ) return -1;
158
159 int needMerge = 0;
160
161 //...Merging. Search a track to be merged...
162 RecMdcTrackCol::iterator iterRefTk = trackList->begin();
163 for ( ; iterRefTk != trackList->end(); iterRefTk++ )
164 {
165 RecMdcTrack* refTk = *iterRefTk;
166 if ( refTk->stat() < 0 ) continue;
167 std::vector<RecMdcTrack*> mergeTkList;
168 mergeTkList.push_back( refTk );
169
170 bool curl = false;
171 int sameParm = 0;
172 RecMdcTrackCol::iterator iterTestTk = trackList->begin();
173 for ( ; iterTestTk != trackList->end(); iterTestTk++ )
174 {
175 RecMdcTrack* testTk = *iterTestTk;
176 if ( iterRefTk == iterTestTk || ( testTk->stat() < 0 ) ) continue;
177
178 //-- overlapRatio cut 0.7 by jialk, original is 0.8
179 if ( testByOverlapHit( refTk, testTk ) )
180 {
181 if ( m_debug > 0 )
182 std::cout << __FILE__ << " overlape tk:" << refTk->trackId() << " with "
183 << testTk->trackId() << std::endl;
184 mergeTkList.push_back( testTk );
185 curl = true;
186 }
187 sameParm = testByParam( refTk, testTk );
188 if ( sameParm > 0 )
189 {
190 if ( m_debug > 0 )
191 std::cout << __FILE__ << " same param tk:" << refTk->trackId() << " with "
192 << testTk->trackId() << std::endl;
193 mergeTkList.push_back( testTk );
194 }
195 }
196 if ( mergeTkList.size() > 1 && curl ) needMerge = doMergeCurl( mergeTkList );
197 if ( ( needMerge < 999 ) && mergeTkList.size() > 1 )
198 needMerge = doMergeLong( mergeTkList );
199 // if ((needMerge <999) && mergeTkList.size()==2 && (sameParm==2) ) needMerge =
200 // doMergeOdd(mergeTkList); //FIXME
201 }
202
203 // return 0 if No track need merged
204 if ( needMerge <= 0 ) return 0;
205
206 // reset track Id
207 iterRefTk = trackList->begin();
208 int iTk = 0;
209 int nDeleted = 0;
210 for ( ; iterRefTk != trackList->end(); )
211 {
212 if ( ( *iterRefTk )->stat() >= 0 )
213 {
214 ( *iterRefTk )->setTrackId( iTk );
215 iterRefTk++;
216 iTk++;
217 }
218 else
219 {
220 int id = ( *iterRefTk )->trackId();
221 bool erased = eraseTdsTrack( iterRefTk );
222 if ( erased )
223 {
224 nDeleted++;
225 if ( m_debug > 0 ) std::cout << __FILE__ << " erase track No." << id << std::endl;
226 }
227 else
228 {
229 if ( m_debug > 0 ) std::cout << __FILE__ << " erase failed !" << std::endl;
230 }
231 }
232 }
233 if ( m_debug > 0 )
234 std::cout << __FILE__ << " After merge save " << iTk << " tracks" << std::endl;
235
236 return nDeleted;
237}
int doMergeLong(std::vector< RecMdcTrack * > mergeTkList)
int testByParam(RecMdcTrack *refTk, RecMdcTrack *testTk)
bool eraseTdsTrack(RecMdcTrackCol::iterator tk)
int testByOverlapHit(RecMdcTrack *refTk, RecMdcTrack *testTk)
int doMergeCurl(std::vector< RecMdcTrack * > mergeTkList)

Referenced by execute().

◆ mergeDups()

int MdcMergeDups::mergeDups ( void )

◆ store()

void MdcMergeDups::store ( TrkRecoTrk * aTrack)

Definition at line 465 of file MdcMergeDups.cxx.

465 {
466 SmartDataPtr<RecMdcTrackCol> trackList( eventSvc(), EventModel::Recon::RecMdcTrackCol );
467 if ( !trackList ) return;
468 SmartDataPtr<RecMdcHitCol> hitList( eventSvc(), EventModel::Recon::RecMdcHitCol );
469 if ( !hitList ) return;
470
471 assert( aTrack != NULL );
472 TrkExchangePar helix = aTrack->fitResult()->helix( 0. );
473
474 if ( m_debug > 1 ) std::cout << __FILE__ << " STORED" << std::endl;
475 MdcTrack mdcTrack( aTrack ); // aTrack have been deleted in ~MdcTrack()
476 // tkStat: 0,Tsf 1,CurlFinder 2,PatRec 3,MdcxReco 4,MergeCurl
477 int tkStat = 4;
478 mdcTrack.storeTrack( -1, trackList, hitList, tkStat );
479}
virtual TrkExchangePar helix(double fltL) const =0
const TrkFit * fitResult() const

◆ testByOverlapHit()

int MdcMergeDups::testByOverlapHit ( RecMdcTrack * refTk,
RecMdcTrack * testTk )

Definition at line 366 of file MdcMergeDups.cxx.

366 {
367 //-------------------------------------------------------------------
368 int overlaped = 0;
369 if ( ( testTk->pxy() >= m_mergePt ) || ( refTk->pxy() >= m_mergePt ) ) return overlaped;
370
371 HitRefVec testHits = testTk->getVecHits();
372 int nHit = testHits.size();
373 int nOverlap = 0;
374
375 HitRefVec::iterator iterHit = testHits.begin();
376 for ( ; iterHit != testHits.end(); iterHit++ )
377 {
378 RecMdcHit* hit = *iterHit;
379
380 //-- load for Axial and Stereo layer are 3,4 by jialk, original is 2,3
381 double load = m_mergeLoadAx;
382 bool isStLayer = ( m_gm->Layer( MdcID::layer( hit->getMdcId() ) )->view() != 0 );
383 if ( isStLayer ) load = m_mergeLoadSt;
384
385 // helix parameters
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();
392 double r = 10000. / ( Constants::c * Bz * refTk->helix( 2 ) );
393 double dz = refTk->helix( 3 );
394 double tanl = refTk->helix( 4 );
395
396 // center of circle
397 double xc = vx0 + ( dr + r ) * cos( phi0 );
398 double yc = vy0 + ( dr + r ) * sin( phi0 );
399
400 // position of hit
401 double zHit = hit->getZhit();
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 ) );
405
406 // distance from center of circle to hit
407 double dx = xc - xHit;
408 double dy = yc - yHit;
409 double dHit2Center = sqrt( dx * dx + dy * dy );
410 double rTk = fabs( r );
411
412 // is this hit overlaped ?
413 if ( ( dHit2Center > ( rTk - load ) ) && ( dHit2Center < ( rTk + load ) ) ) nOverlap++;
414 }
415
416 if ( nOverlap <= 0 ) return overlaped;
417
418 double overlapRatio = double( nOverlap ) / double( nHit );
419
420 if ( overlapRatio > m_mergeOverlapRatio ) overlaped = 1;
421
422 return overlaped;
423}

Referenced by mergeCurl().

◆ testByParam()

int MdcMergeDups::testByParam ( RecMdcTrack * refTk,
RecMdcTrack * testTk )

Definition at line 242 of file MdcMergeDups.cxx.

242 {
243 //-------------------------------------------------------------------
244 int overlaped = 0;
245
246 // Convert to Babar track convension
247 double Bz = m_bfield->bFieldZ();
248 double omega1 = ( Constants::c * Bz * refTk->helix( 2 ) ) / 10000.;
249 double omega2 = ( Constants::c * Bz * testTk->helix( 2 ) ) / 10000.;
250 // phi0_babar = phi0_belle + pi/2 [0,2pi)
251 double phi01 = refTk->helix( 1 ) + Constants::pi / 2.;
252 double phi02 = testTk->helix( 1 ) + Constants::pi / 2.;
253 while ( phi01 > Constants::twoPi ) phi01 -= Constants::twoPi;
254 while ( phi02 > Constants::twoPi ) phi02 -= Constants::twoPi;
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;
260 double r1 = 100000.;
261 double r2 = 100000.;
262 if ( fabs( omega1 ) > 0.00001 ) r1 = 1.0 / fabs( omega1 );
263 if ( fabs( omega2 ) > 0.00001 ) r2 = 1.0 / fabs( omega2 ); // FIXME
264 double pdrad = fabs( ( r1 - r2 ) / ( r1 + r2 ) );
265
266 if ( 2 == m_debug )
267 {
268 std::cout << " fabs(d01 - d02) " << fabs( d01 - d02 ) << std::endl;
269 std::cout << " fabs(phi01-phi02) " << fabs( phi01 - phi02 ) << std::endl;
270 }
271 // Try to merge pair that looks like duplicates (same charge)
272 if ( ( prodo > 0. ) && ( dd0 < m_maxDd0InMerge ) && ( dphi0 < m_maxDphi0InMerge ) &&
273 ( pdrad < m_maxPdradInMerge ) )
274 { overlaped = 1; }
275
276 // Try to merge pair that looks like albedo (opp charge, large d0)
277 if ( ( prodo < 0. ) && ( fabs( d01 + d02 ) < 4.0 ) && ( dd0 > 47.0 ) &&
278 ( fabs( dphi0 - Constants::pi ) < m_maxDphi0InMerge ) && ( pdrad < m_maxPdradInMerge ) )
279 { overlaped = 2; }
280
281 return overlaped;
282}

Referenced by mergeCurl().


The documentation for this class was generated from the following files: