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

#include <MdcxTrackFinder.h>

Inheritance diagram for MdcxTrackFinder:

Public Member Functions

 MdcxTrackFinder (const std::string &name, ISvcLocator *pSvcLocator)
virtual ~MdcxTrackFinder ()
StatusCode initialize ()
StatusCode execute ()
StatusCode finalize ()
StatusCode beginRun ()

Detailed Description

Definition at line 62 of file MdcxTrackFinder.h.

Constructor & Destructor Documentation

◆ MdcxTrackFinder()

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

Definition at line 106 of file MdcxTrackFinder.cxx.

107 : Algorithm( name, pSvcLocator ), m_mdcCalibFunSvc( 0 ) {
108 // input
109 declareProperty( "pdtFile", m_pdtFile = "pdt.table" );
110 // debug control
111 declareProperty( "debug", m_debug = 0 );
112 declareProperty( "hist", m_hist = 0 );
113 declareProperty( "mcHist", m_mcHist = false );
114 // cuts and control
115 declareProperty( "cresol", m_cresol = 0.013 );
116
117 declareProperty( "getDigiFlag", m_getDigiFlag = 0 );
118 declareProperty( "maxMdcDigi", m_maxMdcDigi = 0 );
119 declareProperty( "keepBadTdc", m_keepBadTdc = 0 );
120 declareProperty( "dropHot", m_dropHot = 0 );
121 declareProperty( "keepUnmatch", m_keepUnmatch = 0 );
122 declareProperty( "salvageTrk", m_salvageTrk = false );
123 declareProperty( "dropMultiHotInLayer", m_dropMultiHotInLayer = false );
124 declareProperty( "dropTrkPt", m_dropTrkPt = -999. );
125 declareProperty( "d0Cut", m_d0Cut = 999. );
126 declareProperty( "z0Cut", m_z0Cut = 999. );
127
128 declareProperty( "minMdcDigi", m_minMdcDigi = 0 );
129 declareProperty( "countPropTime", m_countPropTime = true );
130 declareProperty( "addHitCut", m_addHitCut = 5. );
131 declareProperty( "dropHitsSigma", m_dropHitsSigma );
132 declareProperty( "helixFitCut", m_helixFitCut );
133 declareProperty( "minTrkProb", m_minTrkProb = 0.01 );
134 declareProperty( "csmax4", m_csmax4 = 50. );
135 declareProperty( "csmax3", m_csmax3 = 1. );
136 declareProperty( "helixFitSigma", m_helixFitSigma = 5. );
137 declareProperty( "maxRcsInAddSeg", m_maxRcsInAddSeg = 50. );
138 declareProperty( "nSigAddHitTrk", m_nSigAddHitTrk = 5. );
139 declareProperty( "maxProca", m_maxProca = 0.6 );
140 declareProperty( "doSag", m_doSag = false );
141 declareProperty( "lineFit", m_lineFit = false );
142 // declareProperty("cosmicFit", m_cosmicFit= false);
143}

Referenced by MdcxTrackFinder().

◆ ~MdcxTrackFinder()

MdcxTrackFinder::~MdcxTrackFinder ( )
virtual

Definition at line 148 of file MdcxTrackFinder.cxx.

148 {
149 if ( m_bfield ) delete m_bfield;
150}

Member Function Documentation

◆ beginRun()

StatusCode MdcxTrackFinder::beginRun ( )

Definition at line 152 of file MdcxTrackFinder.cxx.

152 {
153 // Get Mdc Detector Geometry
154 m_gm = MdcDetector::instance( m_doSag );
155 if ( NULL == m_gm ) return StatusCode::FAILURE;
157
158 return StatusCode::SUCCESS;
159}
static MdcDetector * instance()
static void setMdcDetector(const MdcDetector *gm)
Definition MdcxHit.cxx:64

Referenced by execute().

◆ execute()

StatusCode MdcxTrackFinder::execute ( )

Definition at line 244 of file MdcxTrackFinder.cxx.

244 {
245 if ( !m_beginRun )
246 {
247 StatusCode sc = beginRun();
248 if ( sc.isFailure() )
249 {
250 error() << "beginRun failed" << endmsg;
251 return StatusCode::FAILURE;
252 }
253 m_beginRun = true;
254 }
255
256 MsgStream log( msgSvc(), name() );
257 log << MSG::INFO << "in execute()" << endmsg;
258 StatusCode sc;
259
260 b_saveEvent = false;
261 setFilterPassed( b_saveEvent );
262
263#ifdef MDCXTIMEDEBUG
264 m_timer[0]->start();
265 m_timer[1]->start();
266#endif
267
268 nTk = 0;
269 t_nTdsTk = 0;
270 t_nDigi = 0;
271 t_nSeg = 0; // yzhang for fill
272 //------------------------------------
273 // Get event No.
274 //------------------------------------
275 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(), "/Event/EventHeader" );
276 if ( !evtHead )
277 {
278 log << MSG::FATAL << "Could not retrieve event header" << endmsg;
279 return StatusCode::FAILURE;
280 }
281 m_eventNo = evtHead->eventNumber();
282 if ( m_debug > 0 )
283 std::cout << "x evt: " << evtHead->runNumber() << " " << m_eventNo << std::endl;
284 long t_evtNo = m_eventNo;
285 g_eventNo = m_eventNo;
286 // if (t_evtNo % 1000 == 0) std::cout << "x evt: " << t_evtNo << std::endl;
287 IDataManagerSvc* dataManSvc;
288 DataObject* aTrackCol;
289 DataObject* aHitCol;
290 if ( !m_salvageTrk )
291 {
292 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
293 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
294 if ( aTrackCol )
295 {
296 dataManSvc->clearSubTree( "/Event/Recon/RecMdcTrackCol" );
297 eventSvc()->unregisterObject( "/Event/Recon/RecMdcTrackCol" );
298 }
299 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aHitCol );
300 if ( aHitCol )
301 {
302 dataManSvc->clearSubTree( "/Event/Recon/RecMdcHitCol" );
303 eventSvc()->unregisterObject( "/Event/Recon/RecMdcHitCol" );
304 }
305 }
306
307 //------------------------------------
308 // Initialize track collection in TDS
309 //------------------------------------
310 DataObject* aReconEvent;
311 eventSvc()->findObject( "/Event/Recon", aReconEvent );
312 if ( aReconEvent == NULL )
313 {
314 aReconEvent = new ReconEvent();
315 sc = eventSvc()->registerObject( "/Event/Recon", aReconEvent );
316 if ( sc != StatusCode::SUCCESS )
317 {
318 log << MSG::FATAL << "Could not register ReconEvent" << endmsg;
319 return StatusCode::FAILURE;
320 }
321 }
322 RecMdcTrackCol* trackList;
323 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
324 if ( aTrackCol ) { trackList = dynamic_cast<RecMdcTrackCol*>( aTrackCol ); }
325 else
326 {
327 trackList = new RecMdcTrackCol;
328 sc = eventSvc()->registerObject( EventModel::Recon::RecMdcTrackCol, trackList );
329 if ( !sc.isSuccess() )
330 {
331 log << MSG::FATAL << " Could not register RecMdcTrack collection" << endmsg;
332 return StatusCode::FAILURE;
333 }
334 }
335 RecMdcHitCol* hitList;
336 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aHitCol );
337 if ( aHitCol ) { hitList = dynamic_cast<RecMdcHitCol*>( aHitCol ); }
338 else
339 {
340 hitList = new RecMdcHitCol;
341 sc = eventSvc()->registerObject( EventModel::Recon::RecMdcHitCol, hitList );
342 if ( !sc.isSuccess() )
343 {
344 log << MSG::FATAL << " Could not register RecMdcHit collection" << endmsg;
345 return StatusCode::FAILURE;
346 }
347 }
348
349 //------------------------------------
350 // Initialize hit collection in TDS
351 //------------------------------------
352 DataObject* pnode = 0;
353 sc = eventSvc()->retrieveObject( "/Event/Hit", pnode );
354 if ( !sc.isSuccess() )
355 {
356 pnode = new DataObject;
357 sc = eventSvc()->registerObject( "/Event/Hit", pnode );
358 if ( !sc.isSuccess() )
359 {
360 log << MSG::FATAL << " Could not register /Event/Hit branch " << endmsg;
361 return StatusCode::FAILURE;
362 }
363 }
364 SmartDataPtr<MdcHitCol> m_hitCol( eventSvc(), "/Event/Hit/MdcHitCol" );
365 if ( !m_hitCol )
366 {
367 m_hitCol = new MdcHitCol;
368 sc = eventSvc()->registerObject( "/Event/Hit/MdcHitCol", m_hitCol );
369 if ( !sc.isSuccess() )
370 {
371 log << MSG::FATAL << " Could not register hit collection" << endmsg;
372 return StatusCode::FAILURE;
373 }
374 }
375
376 //------------------------------------
377 // Get bunch time t0 (ns) and timing
378 //------------------------------------
379 m_bunchT0 = -999.;
380 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
381 if ( !aevtimeCol || aevtimeCol->size() == 0 )
382 {
383 log << MSG::WARNING << "evt " << m_eventNo << " Could not find RecEsTimeCol" << endmsg;
384 return StatusCode::SUCCESS;
385 }
386
387 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
388 for ( ; iter_evt != aevtimeCol->end(); iter_evt++ )
389 {
390 m_bunchT0 = ( *iter_evt )->getTest();
391 m_t0Stat = ( *iter_evt )->getStat();
392 if ( m_debug > 1 )
393 std::cout << name() << " " << t_evtNo << " t0 " << m_bunchT0 << " t0Stat " << m_t0Stat
394 << std::endl;
395 if ( ( m_t0Stat == 0 ) || ( m_bunchT0 < 0. ) || ( m_bunchT0 > 9999.0 ) )
396 {
397 log << MSG::WARNING << "Skip evt:" << m_eventNo << " by t0 = " << m_bunchT0 << endmsg;
398 // return StatusCode::SUCCESS;
399 }
400 }
401 if ( m_debug > 1 )
402 std::cout << name() << " evt " << t_evtNo << " t0 " << m_bunchT0 << " t0Stat "
403 << m_t0Stat << std::endl;
404 int trigtiming = -10;
405 SmartDataPtr<TrigData> trigData( eventSvc(), "/Event/Trig/TrigData" );
406 if ( trigData )
407 {
408 log << MSG::INFO << "Trigger conditions 0--43:" << endmsg;
409 for ( int i = 0; i < 48; i++ )
410 {
411 log << MSG::INFO << trigData->getTrigCondName( i ) << " ---- "
412 << trigData->getTrigCondition( i ) << endmsg;
413 }
414 for ( int i = 0; i < 16; i++ )
415 log << MSG::INFO << "Trigger channel " << i << ": " << trigData->getTrigChannel( i )
416 << endmsg;
417 m_timing = trigData->getTimingType();
418 // cout<<"-----------------trigger timing type-----------------------: "<<trigtiming<<endl;
419 log << MSG::INFO << "Tigger Timing type: " << trigtiming << endmsg;
420 }
421
422 //------------------------------------
423 // Initialize MdcxHits
424 //------------------------------------
425 m_mdcxHits.reset();
426 uint32_t getDigiFlag = 0;
427 getDigiFlag += m_maxMdcDigi;
428 if ( m_dropHot || m_salvageTrk ) getDigiFlag |= MdcRawDataProvider::b_dropHot;
429 if ( m_keepBadTdc ) getDigiFlag |= MdcRawDataProvider::b_keepBadTdc;
430 if ( m_keepUnmatch ) getDigiFlag |= MdcRawDataProvider::b_keepUnmatch;
431 mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
432 t_nDigi = mdcDigiVec.size();
433
434 // fill Mc truth
435 // if(m_hist) fillMcTruth();
436
437 // skip event by hit numbe
438 if ( t_nDigi < m_minMdcDigi )
439 {
440 if ( 0 == t_nDigi ) { log << MSG::WARNING << " No hits in MdcDigiVec" << endmsg; }
441 log << MSG::WARNING << " Skip this event for MdcDigiVec.size() < " << m_minMdcDigi
442 << endmsg;
443 return StatusCode::SUCCESS;
444 }
445 m_mdcxHits.create( mdcDigiVec, m_bunchT0, m_cresol );
446 const HepAList<MdcxHit>& dchitlist = m_mdcxHits.GetMdcxHitList();
447
448 if ( m_debug > 2 ) m_mdcxHits.print( std::cout, 6796 );
449
450 //--------------------------------------------
451 // Make segments (MdcxSeg's) out of MdcxHit's
452 //--------------------------------------------
453 MdcxFindSegs dcsegs( dchitlist, m_debug );
454 const HepAList<MdcxSeg>& seglist = dcsegs.GetMdcxSeglist();
455 if ( m_debug > 1 ) { dumpMdcxSegs( seglist ); }
456 t_nSeg = seglist.length();
457 // if(m_hist){ fillMdcxSegs(seglist);}
458
459#ifdef MDCXTIMEDEBUG
460 m_timer[1]->stop();
461 m_timer[2]->start();
462#endif
463 //--------------------------------------------
464 // Make tracks (MdcxFittedHel's) out of MdcxSeg's
465 //--------------------------------------------
466 MdcxFindTracks dctrks( seglist, m_debug );
467 HepAList<MdcxFittedHel>& firsttrkl = (HepAList<MdcxFittedHel>&)dctrks.GetMdcxTrklist();
468 if ( m_debug > 1 ) dumpTrackList( firsttrkl );
469
470#ifdef MDCXTIMEDEBUG
471 m_timer[2]->stop();
472 m_timer[3]->start();
473#endif
474 // if(m_hist){ fillTrkl(firsttrkl);}
475
476 // if(m_debug>1){
477 // std::cout << "dchitlist after find tracks before MergeDups, nhits=" <<
478 // dchitlist.length() << std::endl; for (int ii = 0; ii < dchitlist.length(); ii++) {
479 // dchitlist[ii]->print(std::cout, ii);
480 // }
481 // std::cout<<std::endl;
482 // }
483 MdcxMergeDups dcmergeem( firsttrkl, m_debug );
484 HepAList<MdcxFittedHel>& trkl = (HepAList<MdcxFittedHel>&)dcmergeem.GetMergedTrklist();
485
486 // if (m_debug > 1 ){
487 // cout << "MdcxTrackFinder: after MergeDups, have "
488 // << trkl.length() << " track(s). nhits=" << dchitlist.length() << endl;
489 // for (int ii = 0; ii < dchitlist.length(); ii++) {
490 // dchitlist[ii]->print(std::cout, ii);
491 // }
492 // std::cout<<std::endl;
493 // }
494
495 //---------------------------------------------------------
496 // Put my tracks into official fitter and store to TDS
497 //----------------------------------------------------------
498
499 sc = FitMdcxTrack( trkl, dchitlist, m_hitCol, trackList, hitList );
500 if ( !sc.isSuccess() ) { return StatusCode::SUCCESS; }
501 t_nTdsTk = trackList->size();
502
503 t_nTkTot += trackList->size();
504 if ( t_nTdsTk < 20 ) t_nTkNum[t_nTdsTk]++;
505
506#ifdef MDCXTIMEDEBUG
507 m_timer[0]->stop();
508 m_timer[3]->stop();
509#endif
510
511 if ( m_hist ) fillEvent();
512 if ( m_debug > 0 )
513 {
514 DataObject* pNode;
515 eventSvc()->retrieveObject( "/Event/Recon/RecMdcTrackCol", pNode );
516 RecMdcTrackCol* tmpTrackCol = dynamic_cast<RecMdcTrackCol*>( pNode );
517 eventSvc()->retrieveObject( "/Event/Recon/RecMdcHitCol", pNode );
518 int nTdsTk = 0;
519 if ( tmpTrackCol ) nTdsTk = tmpTrackCol->size();
520
521 // if (t_evtNo % 1000 == 0) {
522 std::cout << "MdcxTrackFinder: evtNo " << m_eventNo << " t0=" << m_bunchT0 << " Found "
523 << trkl.length() << " keep " << t_nTdsTk << " finialy keep " << nTdsTk;
524
525 int ndelete = 0;
526 trkl.length() - trackList->size();
527 if ( ndelete > 0 ) std::cout << " delete " << ndelete;
528 std::cout << " track(s)" << endl;
529 //}
530
531 if ( m_debug > 1 ) dumpTdsTrack( tmpTrackCol );
532 if ( m_debug > 1 ) dumpTrack( tmpTrackCol );
533 // dumpTdsHits(tmpHitCol);
534 }
535 if ( ( trackList->size() != 4 ) ) b_saveEvent = true;
536 setFilterPassed( b_saveEvent );
537
538 return StatusCode::SUCCESS;
539}
int g_eventNo
Definition FTFinder.cxx:61
IMessageSvc * msgSvc()
StatusCode beginRun()

◆ finalize()

StatusCode MdcxTrackFinder::finalize ( )

Definition at line 541 of file MdcxTrackFinder.cxx.

541 {
542 MsgStream log( msgSvc(), name() );
543 log << MSG::INFO << "in finalize()" << endmsg;
544
545 std::cout << " --after " << name() << " keep " << t_nTkTot << " tracks " << std::endl;
546 for ( int i = 0; i < 20; i++ )
547 {
548 if ( t_nTkNum[i] > 0 ) std::cout << " nTk=" << i << " " << t_nTkNum[i] << std::endl;
549 }
550
551 // tot evtNo, trkNum
552 return StatusCode::SUCCESS;
553}

◆ initialize()

StatusCode MdcxTrackFinder::initialize ( )

Definition at line 163 of file MdcxTrackFinder.cxx.

163 {
164 MsgStream log( msgSvc(), name() );
165 log << MSG::INFO << "in initialize()" << endmsg;
166
167 t_nTkTot = 0;
168 for ( int i = 0; i < 20; i++ ) t_nTkNum[i] = 0;
169
170 // m_flags.readPar(m_paramFile);
171#ifdef MDCXTIMEDEBUG
172 StatusCode tsc = service( "BesTimerSvc", m_timersvc );
173 if ( tsc.isFailure() )
174 {
175 log << MSG::WARNING << name() << ": Unable to locate BesTimer Service" << endmsg;
176 return StatusCode::FAILURE;
177 }
178 m_timer[0] = m_timersvc->addItem( "Execution" );
179 m_timer[0]->propName( "Execution" );
180 m_timer[1] = m_timersvc->addItem( "findSeg" );
181 m_timer[1]->propName( "findSeg" );
182 m_timer[2] = m_timersvc->addItem( "findTrack" );
183 m_timer[2]->propName( "findTrack" );
184 m_timer[3] = m_timersvc->addItem( "fitting" );
185 m_timer[3]->propName( "fitting" );
186#endif
187
188 if ( m_helixFitCut.size() == 43 )
189 {
190 for ( int i = 0; i < 43; i++ )
191 {
192 // MdcTrkReconCut_helix_fit[i] = m_helixFitCut[i];
193 TrkHelixFitter::nSigmaCut[i] = m_helixFitCut[i];
194 }
195 }
196 MdcxParameters::debug = m_debug;
197 MdcxParameters::minTrkProb = m_minTrkProb;
198 MdcxParameters::csmax4 = m_csmax4;
199 MdcxParameters::csmax3 = m_csmax3;
200 MdcxParameters::helixFitSigma = m_helixFitSigma;
201 MdcxParameters::maxRcsInAddSeg = m_maxRcsInAddSeg;
202 MdcxParameters::nSigAddHitTrk = m_nSigAddHitTrk;
203 MdcxParameters::maxProca = m_maxProca;
204 TrkHelixFitter::m_debug = ( m_debug > 7 );
205 Pdt::readMCppTable( m_pdtFile );
206 MdcxFittedHel::debug = m_debug;
207
208 // Get MdcCalibFunSvc
209 StatusCode sc = service( "MdcCalibFunSvc", m_mdcCalibFunSvc );
210 if ( sc.isFailure() )
211 {
212 log << MSG::FATAL << "Could not load MdcCalibFunSvc!" << endmsg;
213 return StatusCode::FAILURE;
214 }
215 MdcxHit::setMdcCalibFunSvc( m_mdcCalibFunSvc );
216 MdcxHit::setCountPropTime( m_countPropTime );
217
218 // Get RawDataProviderSvc
219 sc = service( "RawDataProviderSvc", m_rawDataProviderSvc );
220 if ( sc.isFailure() )
221 {
222 log << MSG::FATAL << "Could not load RawDataProviderSvc!" << endmsg;
223 return StatusCode::FAILURE;
224 }
225
226 // Initailize magnetic filed
227 sc = service( "MagneticFieldSvc", m_pIMF );
228 if ( sc != StatusCode::SUCCESS )
229 { log << MSG::ERROR << "Unable to open Magnetic field service" << endmsg; }
230 m_bfield = new BField( m_pIMF );
231 log << MSG::INFO << "field z = " << m_bfield->bFieldNominal() << endmsg;
232 m_context = new TrkContextEv( m_bfield );
233
234 if ( m_hist ) { bookNTuple(); }
235 if ( m_dropHitsSigma.size() == 43 )
236 {
237 for ( int ii = 0; ii < 43; ii++ )
238 { MdcxParameters::dropHitsSigma[ii] = m_dropHitsSigma[ii]; }
239 }
240
241 return StatusCode::SUCCESS;
242}
static void setMdcCalibFunSvc(const IMdcCalibFunSvc *calibSvc)
Definition MdcxHit.cxx:58
static void setCountPropTime(bool countPropTime)
Definition MdcxHit.cxx:62
static void readMCppTable(std::string filenm)

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