244 {
245 if ( !m_beginRun )
246 {
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;
272
273
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;
286
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
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 }
323 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
324 if ( aTrackCol ) { trackList =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
325 else
326 {
329 if ( !sc.isSuccess() )
330 {
331 log << MSG::FATAL << " Could not register RecMdcTrack collection" << endmsg;
332 return StatusCode::FAILURE;
333 }
334 }
336 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aHitCol );
337 if ( aHitCol ) { hitList =
dynamic_cast<RecMdcHitCol*
>( aHitCol ); }
338 else
339 {
342 if ( !sc.isSuccess() )
343 {
344 log << MSG::FATAL << " Could not register RecMdcHit collection" << endmsg;
345 return StatusCode::FAILURE;
346 }
347 }
348
349
350
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 {
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
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
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
419 log << MSG::INFO << "Tigger Timing type: " << trigtiming << endmsg;
420 }
421
422
423
424
425 m_mdcxHits.reset();
426 uint32_t getDigiFlag = 0;
427 getDigiFlag += m_maxMdcDigi;
431 mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
432 t_nDigi = mdcDigiVec.size();
433
434
435
436
437
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
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
458
459#ifdef MDCXTIMEDEBUG
460 m_timer[1]->stop();
461 m_timer[2]->start();
462#endif
463
464
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
475
476
477
478
479
480
481
482
483 MdcxMergeDups dcmergeem( firsttrkl, m_debug );
484 HepAList<MdcxFittedHel>& trkl = (HepAList<MdcxFittedHel>&)dcmergeem.GetMergedTrklist();
485
486
487
488
489
490
491
492
493
494
495
496
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 );
517 eventSvc()->retrieveObject( "/Event/Recon/RecMdcHitCol", pNode );
518 int nTdsTk = 0;
519 if ( tmpTrackCol ) nTdsTk = tmpTrackCol->size();
520
521
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
534 }
535 if ( ( trackList->size() != 4 ) ) b_saveEvent = true;
536 setFilterPassed( b_saveEvent );
537
538 return StatusCode::SUCCESS;
539}
ObjectVector< MdcHit > MdcHitCol
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol