210 {
211 if ( !m_beginRun )
212 {
214 if ( sc.isFailure() )
215 {
216 error() <<
"beginRun failed" << endmsg;
217 return StatusCode::FAILURE;
218 }
219 m_beginRun = true;
220 }
221
222 setFilterPassed( false );
223
224 MsgStream log(
msgSvc(), name() );
225 log << MSG::INFO << "in execute()" << endmsg;
226
227
228 if ( m_hist > 0 )
229 {
230 for ( int ii = 0; ii < 43; ii++ )
231 {
232 for ( int jj = 0; jj < 288; jj++ )
233 {
241 mcDrift[ii][jj] = -99.;
242 mcX[ii][jj] = -99.;
243 mcY[ii][jj] = -99.;
244 mcZ[ii][jj] = -99.;
245 mcLR[ii][jj] = -99.;
246 hitPoisoned[ii][jj] = -99;
247 }
248 }
249 }
250
251 TrkContextEv context( m_bfield );
252#ifdef MDCPATREC_TIMETEST
253 m_timer[1]->start();
254 ti_nHit = 0;
255#endif
256
257 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(), "/Event/EventHeader" );
258 if ( !evtHead )
259 {
260 log << MSG::FATAL << "Could not retrieve event header" << endmsg;
261 return ( StatusCode::FAILURE );
262 }
263 t_eventNo = evtHead->eventNumber();
264 if ( m_debug != 0 )
265 std::cout << t_iExexute << " run " << evtHead->runNumber() << " evt " << t_eventNo
266 << std::endl;
267 t_iExexute++;
268
269 if ( m_selEvtNo.size() > 0 )
270 {
271 std::vector<int>::iterator it = m_selEvtNo.begin();
272 for ( ; it != m_selEvtNo.end(); it++ )
273 {
274 if ( ( *it ) == t_eventNo ) setFilterPassed( true );
275 }
276 }
277
278 double t0 = 0.;
279 t_t0 = -1.;
280 t_t0Stat = -1;
281 bool iterateT0 = false;
282 const int nBunch = 3;
283 double iBunch = 0;
284 double BeamDeltaTime = 24. / nBunch;
285 SmartDataPtr<RecEsTimeCol> evTimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
286 if ( !evTimeCol || evTimeCol->size() == 0 )
287 {
288 log << MSG::WARNING << " run " << evtHead->runNumber() << " evt " << t_eventNo
289 << " Could not find RecEsTimeCol" << endmsg;
290 if ( m_fieldCosmic )
291 {
292 return StatusCode::SUCCESS;
293 }
294 }
295 RecEsTimeCol::iterator iter_evt = evTimeCol->begin();
296
297 if ( iter_evt != evTimeCol->end() )
298 {
299 t_t0Stat = ( *iter_evt )->getStat();
300 t_t0 = ( *iter_evt )->getTest();
301
302 if ( m_doLineFit )
303 {
304
305 if (
abs( t_t0 ) < 0.00001 || ( t_t0 < 0 ) || ( t_t0 > 9999.0 ) )
306 {
307 log << MSG::WARNING << "Skip with t0 = " << t_t0 << endmsg;
308 return StatusCode::SUCCESS;
309 }
310 }
311 t0 = t_t0 * 1.e-9;
312 if ( m_debug > 0 ) std::cout << name() << " t0 " << t0 << " " << std::endl;
313 }
314
315restart:
316 if ( !m_recForEsTime && m_tryBunch )
317 {
318 if ( t_t0Stat < 10 ) return StatusCode::SUCCESS;
319 }
320 if ( m_tryBunch )
321 {
322 if ( iBunch > ( nBunch - 1 ) ) return StatusCode::SUCCESS;
323 if ( t_t0Stat < 0 ) { iterateT0 = true; }
324 if ( iterateT0 )
325 {
326
327 if ( ( t_t0Stat > -1 ) && ( fabs( iBunch * BeamDeltaTime - t_t0 ) < 2. ) )
328 {
329 ++iBunch;
330 goto restart;
331 }
332 else { t0 = iBunch * BeamDeltaTime * 1.e-9; }
333 ++iBunch;
334 }
335 }
336
337 SmartDataPtr<MdcHitMap> hitMap( eventSvc(), "/Event/Hit/MdcHitMap" );
338 if ( !hitMap )
339 {
340 log << MSG::FATAL << "Could not retrieve MDC hit map" << endmsg;
341 return ( StatusCode::FAILURE );
342 }
343
344 SmartDataPtr<MdcHitCol> hitCol( eventSvc(), "/Event/Hit/MdcHitCol" );
345 if ( !hitCol )
346 {
347 log << MSG::FATAL << "Could not retrieve MDC hit list" << endmsg;
348 return ( StatusCode::FAILURE );
349 }
350 StatusCode sc;
351
352
353 DataObject* aReconEvent;
354 eventSvc()->findObject( "/Event/Recon", aReconEvent );
355 if ( aReconEvent == NULL )
356 {
357 aReconEvent = new ReconEvent();
358 StatusCode sc = eventSvc()->registerObject( "/Event/Recon", aReconEvent );
359 if ( sc != StatusCode::SUCCESS )
360 {
361 log << MSG::FATAL << "Could not register ReconEvent" << endmsg;
362 return ( StatusCode::FAILURE );
363 }
364 }
365
366 DataObject* aTrackCol;
367 DataObject* aRecHitCol;
368
369 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
370 if ( !m_combineTracking )
371 {
372 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
373 if ( aTrackCol )
374 {
375 dataManSvc->clearSubTree( "/Event/Recon/RecMdcTrackCol" );
376 eventSvc()->unregisterObject( "/Event/Recon/RecMdcTrackCol" );
377 }
378 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aRecHitCol );
379 if ( aRecHitCol )
380 {
381 dataManSvc->clearSubTree( "/Event/Recon/RecMdcHitCol" );
382 eventSvc()->unregisterObject( "/Event/Recon/RecMdcHitCol" );
383 }
384 }
385
387 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
388 if ( aTrackCol ) { trackList =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
389 else
390 {
393 if ( !sc.isSuccess() )
394 {
395 log << MSG::FATAL << " Could not register RecMdcTrack collection" << endmsg;
396 return StatusCode::FAILURE;
397 }
398 }
400 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aRecHitCol );
401 if ( aRecHitCol ) { hitList =
dynamic_cast<RecMdcHitCol*
>( aRecHitCol ); }
402 else
403 {
406 if ( !sc.isSuccess() )
407 {
408 log << MSG::FATAL << " Could not register RecMdcHit collection" << endmsg;
409 return StatusCode::FAILURE;
410 }
411 }
412
413 if ( m_debug > 0 ) std::cout << name() << " t0 " << t0 << " " << std::endl;
414 m_hitData->loadevent( hitCol, hitMap, t0 );
415 t_nDigi = hitCol->size();
416
417 if (
poisoningHits() ) { m_hitData->poisonHits( _gm, m_debug ); }
418
420 {
421 for ( int i = 0; i < m_hitData->nhits(); i++ )
422 {
423 const MdcHit* thisHit = m_hitData->hit( i );
426 if ( m_hitData->segUsage().get( thisHit )->deadHit() ) { hitPoisoned[l][
w] = 1; }
427 else { hitPoisoned[l][
w] = 0; }
428 }
429 }
430
431#ifdef MDCPATREC_TIMETEST
432 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(), "/Event/MC/McParticleCol" );
433 if ( !mcParticleCol ) { log << MSG::INFO << "Could not retrieve McParticelCol" << endmsg; }
434 m_mcTkNum = mcParticleCol->size();
435#endif
436
438
439
440
441 int nSegs = 0;
442 if ( m_flags.findSegs )
443 {
444
445 nSegs = m_segFinder->createSegs( _gm, *m_segs, m_hitData->segUsage(), m_hitData->hitMap(),
446 t0 );
447 }
448 log << MSG::INFO << " Found " << nSegs << " segments" << endmsg;
449 if ( m_debug > 1 )
450 {
451 std::cout << "------------------------------------------------" << std::endl;
452 std::cout << "==event " << t_eventNo << " Found " << nSegs << " segments" << std::endl;
453 m_segs->plot();
454 }
455
456 if ( m_flags.lHist || m_flags.segPar.lPrint ) {
fillSegList(); }
457
458
459
460
461 int nTracks = 0;
462 int nDeleted = 0;
463 if ( m_flags.findTracks && m_flags.findSegs )
464 {
465 if ( nSegs > 2 )
466 {
467 nTracks =
468 m_tracks->createFromSegs( m_segs.get(), m_hitData->hitMap(), _gm, context, t0 );
469 }
470
471 if ( m_arbitrateHits ) nDeleted = m_tracks->arbitrateHits();
472 int nKeep = nTracks - nDeleted;
473
474 if ( m_debug > 0 && ( nTracks - nDeleted ) > 0 )
475 {
476 std::cout << "MdcTrkRecon: evt " << setw( 5 ) << t_eventNo << " nDigi " << setw( 4 )
477 << t_nDigi << " t0 " << setw( 5 ) << t_t0 << " keep " << nKeep << " track(s)";
478 if ( nDeleted != 0 ) { std::cout << ",deleted " << nDeleted; }
479 std::cout << std::endl;
480 }
481 else
482 {
483 if ( m_debug > 0 )
484 {
485 std::cout << "MdcTrkRecon: evt " << setw( 5 ) << t_eventNo << " nDigi " << setw( 4 )
486 << t_nDigi << " t0 " << setw( 5 ) << t_t0 << " found 0 track " << endl;
487 }
488 }
489
490 if ( m_flags.lHist ) t_nRecTk = nKeep;
491
492#ifdef MDCPATREC_RESLAYER
493 m_tracks->setResLayer( m_resLayer );
494#endif
496
497 m_tracks->store( trackList, hitList );
498
499 if ( m_debug > 1 )
500 {
501 std::cout << name() << " print track list " << std::endl;
502 m_mdcPrintSvc->printRecMdcTrackCol();
503 }
504
505
506
507#ifdef MDCPATREC_TIMETEST
508 RecMdcTrackCol::iterator
iter = trackList->begin();
509 for ( ;
iter != trackList->end();
iter++ )
510 {
511 MdcTrack* tk = *
iter;
512 ti_nHit += tk->getNhits();
513 }
514#endif
515 }
516
517 m_segs->destroySegs();
518
519
520
521
522
524#ifdef MDCPATREC_TIMETEST
525 m_timer[1]->stop();
526
527
528 m_eventTime = m_timer[1]->elapsed();
529 m_t5recTkNum = m_tracks->length();
530 m_t5EvtNo = t_eventNo;
531 m_t5nHit = ti_nHit;
532 m_t5nDigi = t_nDigi;
533 sc = m_tupleTime->write();
534#endif
535
536 if ( m_tryBunch )
537 {
538 if ( nTracks < 1 )
539 {
540 iterateT0 = true;
541 goto restart;
542 }
543 }
545
546 return StatusCode::SUCCESS;
547}
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
double haveDigiDrift[43][288]
int haveDigiAmbig[43][288]
double haveDigiPhi[43][288]
double haveDigiTheta[43][288]
double haveDigiPt[43][288]
unsigned layernumber() const
unsigned wirenumber() const
bool poisoningHits() const
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol