283 {
284
285 if ( m_ifOutPut ) { m_timer->start(); }
286
287
288 SmartDataPtr<Event::EventHeader> evt( eventSvc(), "/Event/EventHeader" );
289 if ( !evt ) { return StatusCode::FAILURE; }
290
291 if ( m_RealizationSvc->UseDBFlag() == true && m_RealizationSvc->ifReadRandTrg() == true &&
292 m_dbUserRequest == false )
293 {
294 int runNo = evt->runNumber();
295 if ( (
runNo != m_runNo ) ||
297 {
300 m_mdcCnv->setRunId(
runNo );
301 std::vector<std::string> bgfiles = m_RealizationSvc->getBgFileName();
302 if ( bgfiles.size() == 0 )
303 {
304 ( *log ) << MSG::ERROR << "No random trigger files are found in the run " << m_runNo
305 << std::endl;
306 exit( -1 );
307 }
308
309 if ( !m_pattern.empty() )
310 {
311 for ( unsigned int k = 0; k < bgfiles.size(); k++ )
312 {
313 size_t pos_round = bgfiles[k].rfind( "round" );
314 ( *log ) << MSG::INFO << "bgfiles: " << bgfiles[k] << endmsg;
315 if ( pos_round != string::npos )
316 {
317 bgfiles[k].replace( bgfiles[k].begin(), bgfiles[k].begin() + pos_round,
318 m_pattern );
319 ( *log ) << MSG::INFO << "new random trigger data path: " << bgfiles[k] << endmsg;
320 }
321 else
322 {
323 ( *log ) << MSG::ERROR << "string 'round' not found in random trigger path!"
324 << endmsg;
325 exit( -1 );
326 }
327 }
328 }
329 if ( !m_newdatadir.empty() )
330 {
331 for ( unsigned int k = 0; k < bgfiles.size(); k++ )
332 {
333 char tmp[255];
334 std::strcpy( tmp, bgfiles[k].
c_str() );
335 string fname = basename( tmp );
336 bgfiles[k].replace( bgfiles[k].begin(), bgfiles[k].end(),
337 m_newdatadir + '/' + fname );
338 ( *log ) << MSG::INFO << "new random trigger data path: " << bgfiles[k] << endmsg;
339 }
340 }
341
342
343 std::vector<std::string> bgfilesIndex;
344 bgfilesIndex.clear();
345 for ( unsigned int bg_index = 0; bg_index < bgfiles.size(); bg_index++ )
346 { bgfilesIndex.push_back( bgfiles[bg_index] + ".idx" ); }
347
348
349 if ( m_fr ) delete m_fr;
350 m_fr = new RawFileReader( bgfiles );
351 std::vector<int> ranTrgEvents = m_fr->getEventNumber( bgfilesIndex );
352
353
354 m_bgfiles.clear();
355 m_bgfilesIndex.clear();
356 m_ranTrgEvents.clear();
357 for ( unsigned int bg_index = 0; bg_index < bgfiles.size(); bg_index++ )
358 {
359 if ( ranTrgEvents[bg_index] > 0 )
360 {
361 m_bgfiles.push_back( bgfiles[bg_index] );
362 m_bgfilesIndex.push_back( bgfilesIndex[bg_index] );
363 m_ranTrgEvents.push_back( ranTrgEvents[bg_index] );
364 }
365 }
366
367
368 if ( m_fr ) delete m_fr;
369 m_fr = new RawFileReader( m_bgfiles );
370
371
372 bgfiles.clear();
373 bgfilesIndex.clear();
374 ranTrgEvents.clear();
375
376
377 if ( m_bgfiles.empty() || m_ranTrgEvents.empty() )
378 {
379 ( *log ) << MSG::WARNING << "No background datafiles found!!!" << endmsg;
380 return StatusCode::SUCCESS;
381 }
382
383 if ( m_skip == true )
384 {
385 if ( m_mixingMethod == 1 )
386 {
387
388 m_ranStepLenInCurrentFile.clear();
389 currentBGFile = "";
390 m_skipCount = 0;
391 m_totalEvent = 0;
392
393
394 bool ifsucc =
file_sort( m_bgfiles, m_ranTrgEvents );
395 if ( !ifsucc ) return StatusCode::FAILURE;
396
397
398 m_bgfilesIndex.clear();
399 for ( unsigned int bg_index = 0; bg_index < m_bgfiles.size(); bg_index++ )
400 { m_bgfilesIndex.push_back( m_bgfiles[bg_index] + ".idx" ); }
401
402
403 m_vRanEvtNumInSubSet.clear();
404 m_vStreamNumInSubSet.clear();
405 m_totRanEvtNum = 0;
406 int set_no = -1;
407 int ranEvtNumInSubSet = 0;
408 int nstream = 0;
409 for ( unsigned int i = 0; i < m_ranTrgEvents.size(); i++ )
410 {
411 if ( i == 0 ) set_no = m_numSets[i];
412 if ( ( i != 0 ) && ( set_no != m_numSets[i] ) )
413 {
414 m_vRanEvtNumInSubSet.push_back( ranEvtNumInSubSet );
415 m_vStreamNumInSubSet.push_back( nstream );
416 ranEvtNumInSubSet = 0;
417 nstream = 0;
418 set_no = m_numSets[i];
419 }
420
421 m_totRanEvtNum += m_ranTrgEvents[i];
422 ranEvtNumInSubSet += m_ranTrgEvents[i];
423 nstream++;
424 if ( i == m_ranTrgEvents.size() - 1 )
425 {
426 m_vRanEvtNumInSubSet.push_back( ranEvtNumInSubSet );
427 m_vStreamNumInSubSet.push_back( nstream );
428 }
429 }
430
431
432 int evtNumInRun = -1;
433 std::vector<int> vtotEvtNo = m_jobInfoSvc->getTotEvtNo();
434 for ( unsigned int ii = 0; ii < vtotEvtNo.size(); ii += 2 )
435 {
436 if ( std::abs(
runNo ) == std::abs( vtotEvtNo[ii] ) )
437 evtNumInRun = vtotEvtNo[ii + 1];
438 }
439
440
441 double tau = m_RealizationSvc->getTauValue();
442 double totalTime = m_RealizationSvc->getRunTotalTime();
443 if ( m_RealizationSvc->getTauValue() == 0. ||
444 m_RealizationSvc->getRunTotalTime() == 0. )
445 {
446 std::cout << "ERROR: In MixerAlg::execute() ---> The tau value or total run time "
447 "is 0, please check it. Exit! "
448 << std::endl;
449 exit( 1 );
450 }
451
452 bool using_exp = true;
453 if ( totalTime * 100 < tau ) using_exp = false;
454 m_vStepLength.clear();
455 while ( 1 )
456 {
457 double ranNum;
458 if ( using_exp == true ) ranNum = RandExponential::shoot( tau );
459 else ranNum = RandFlat::shoot( 0., totalTime );
460 if ( ranNum > totalTime ) continue;
461 ranNum = ranNum * m_totRanEvtNum / totalTime;
462 m_vStepLength.push_back( (int)ranNum );
463 if ( m_vStepLength.size() == evtNumInRun * m_nevent ) break;
464 }
465
466 sort( m_vStepLength.begin(), m_vStepLength.end() );
467
468
469
470
471 if ( evtNumInRun <= 0 || m_totRanEvtNum <= 0 )
472 {
473 ( *log ) << MSG::ERROR
474 << "The event number (or random trigger event number) in run "
475 << evt->runNumber() << " is zero" << endmsg;
476 return StatusCode::FAILURE;
477 }
478
479
480
481
482
483 map_stepLength.clear();
484 for ( unsigned int i = 0; i < m_ranTrgEvents.size(); i++ )
485 {
486 std::vector<int> vstepLength;
487 typedef pair<int, std::vector<int>> vpair;
488 map_stepLength.insert( vpair( i, vstepLength ) );
489 }
490
491 for ( unsigned int i = 0; i < m_ranTrgEvents.size(); )
492 {
493
494 int pre_ranEvtNumSubSet = 0;
495 int cur_ranEvtNumSubSet = 0;
496 set_no = m_numSets[i];
497 for ( int j = 0; j < set_no; j++ )
498 {
499 if ( j != ( set_no - 1 ) ) pre_ranEvtNumSubSet += m_vRanEvtNumInSubSet[j];
500 cur_ranEvtNumSubSet += m_vRanEvtNumInSubSet[j];
501 }
502
503 for ( unsigned j = 0; j < m_vStepLength.size(); j++ )
504 {
505
506 if ( ( m_vStepLength[j] >= pre_ranEvtNumSubSet ) &&
507 ( m_vStepLength[j] < cur_ranEvtNumSubSet ) )
508 {
509 int sub_stepLength = int( ( m_vStepLength[j] - pre_ranEvtNumSubSet ) /
510 m_vStreamNumInSubSet[set_no - 1] );
511 int file_id = 0;
512 int begin_fileId = -1, end_fileId = -1;
513 for ( std::map<
int, std::vector<int>>::iterator
iter = map_stepLength.begin();
514 iter != map_stepLength.end();
iter++ )
515 {
516
517 if ( set_no == m_numSets[
iter->first] )
518 {
519 if ( begin_fileId == -1 ) begin_fileId =
iter->first;
520 file_id++;
521 }
522 }
523 end_fileId = begin_fileId + file_id;
524 bool add_succ = false;
525 long loop_count = 0;
526
527 while ( 1 )
528 {
529 int random_file = int( RandFlat::shootInt(
530 long( begin_fileId ), long( end_fileId ) ) );
531 if ( sub_stepLength < m_ranTrgEvents[random_file] )
532 {
533 map_stepLength[random_file].push_back( sub_stepLength );
534 add_succ = true;
535 loop_count = 0;
536 }
537 if ( add_succ ) break;
538 loop_count++;
540 {
541 ( *log ) << MSG::ALWAYS << "Loop time is larger than MAX_LOOP_TIMES("
543 << ") in MixAlg, when assigning step length for each bg file."
544 << endmsg;
545 exit( 1 );
546 }
547 }
548 }
549 }
550 i += m_vStreamNumInSubSet[set_no - 1];
551 }
552
553
554 unsigned int ranSelectedNum = 0;
555 for ( std::map<
int, std::vector<int>>::iterator
iter = map_stepLength.begin();
556 iter != map_stepLength.end();
iter++ )
557 {
558 ranSelectedNum += (
iter->second ).size();
559
560
561 }
562 if ( ranSelectedNum != m_vStepLength.size() )
563 {
564 ( *log )
565 << MSG::ERROR
566 << "In MixerAlg::excute()--> selected bg events number not equal to MC events"
567 << endmsg;
568 return StatusCode::FAILURE;
569 }
570 }
571 }
572
573 if ( m_mixingMethod == 2 )
574 {
575
576 if ( m_fr ) delete m_fr;
577 m_fr = NULL;
578 try
579 {
580 m_bgfilesIndex.clear();
581 for ( unsigned int bg_index = 0; bg_index < m_bgfiles.size(); bg_index++ )
582 { m_bgfilesIndex.push_back( m_bgfiles[bg_index] + ".idx" ); }
583 if ( m_skip == true && m_readBGMethod == 1 )
584 m_fr = new RawFileReader( m_bgfiles, m_bgfilesIndex );
585 else m_fr = new RawFileReader( m_bgfiles );
586 } catch ( RawFileException& ex )
587 {
589 return StatusCode::FAILURE;
590 }
591 }
592
593 m_raw_event->reset();
594 }
595 }
596 if ( m_ifOutPut )
597 {
598 m_timer->stop();
599 m_time1 = m_timer->elapsed();
600 m_timer->start();
601 }
602
603 SmartDataPtr<MdcDigiCol> mdcMcDigits( eventSvc(), "/Event/Digi/MdcDigiCol" );
604 if ( !mdcMcDigits ) ( *log ) << MSG::ERROR << "Unable to retrieve MdcDigiCol" << endmsg;
605 else
606 ( *log ) << MSG::INFO << "MdcDigiCol retrieved of size " << mdcMcDigits->size() << endmsg;
607
608 SmartDataPtr<EmcDigiCol> emcMcDigits( eventSvc(), "/Event/Digi/EmcDigiCol" );
609 if ( !emcMcDigits ) ( *log ) << MSG::ERROR << "Unable to retrieve EmcDigiCol" << endmsg;
610 else
611 ( *log ) << MSG::INFO << "EmcDigiCol retrieved of size " << emcMcDigits->size() << endmsg;
612
613 SmartDataPtr<MucDigiCol> mucMcDigits( eventSvc(), "/Event/Digi/MucDigiCol" );
614 if ( !mucMcDigits ) ( *log ) << MSG::ERROR << "Unable to retrieve MucDigiCol" << endmsg;
615 else
616 ( *log ) << MSG::INFO << "MucDigiCol retrieved of size " << mucMcDigits->size() << endmsg;
617
618 SmartDataPtr<TofDigiCol> tofMcDigits( eventSvc(), "/Event/Digi/TofDigiCol" );
619 if ( !tofMcDigits ) ( *log ) << MSG::ERROR << "Unable to retrieve TofDigiCol" << endmsg;
620 else
621 ( *log ) << MSG::INFO << "TofDigiCol retrieved of size " << tofMcDigits->size() << endmsg;
622
623 for ( int ievent = 0; ievent < m_nevent; ievent++ )
624 {
625 ( *log ) << MSG::INFO << "Mixing BG Event " << ievent << endmsg;
626
627
628
629
631 if ( m_skip == true )
632 {
633 int nskip = 0;
634 if ( m_mixingMethod == 1 )
635 {
636 if ( m_RealizationSvc->UseDBFlag() == true && m_dbUserRequest == false )
637 {
638 if ( m_skipCount >= m_ranStepLenInCurrentFile.size() )
639 {
640 m_ranStepLenInCurrentFile.clear();
641 for ( std::map<
int, std::vector<int>>::iterator
iter = map_stepLength.begin();
642 iter != map_stepLength.end();
iter++ )
643 {
644 if ( currentBGFile == "" )
645 {
646 if ( (
iter->second ).size() == 0 )
continue;
647 if ( m_fr ) delete m_fr;
648 try
649 {
650 if ( m_readBGMethod == 1 )
651 m_fr =
new RawFileReader( m_bgfiles[
iter->first],
652 m_bgfiles[
iter->first] +
".idx" );
653 else m_fr =
new RawFileReader( m_bgfiles[
iter->first] );
654 m_totEvtNumInCurFile = m_ranTrgEvents[
iter->first];
655 } catch ( RawFileException& ex )
657 m_ranStepLenInCurrentFile =
iter->second;
658 m_skipCount = 0;
659 currentBGFile = m_fr->currentFile();
660 break;
661 }
662 if ( currentBGFile == m_bgfiles[
iter->first] )
663 {
665 if (
iter == map_stepLength.end() )
return StatusCode::FAILURE;
666 if ( (
iter->second ).size() == 0 )
667 {
668 while ( 1 )
669 {
671 if (
iter == map_stepLength.end() )
return StatusCode::FAILURE;
672 if ( (
iter->second ).size() > 0 )
break;
673 }
674 }
675 if ( m_fr ) delete m_fr;
676 try
677 {
678 if ( m_readBGMethod == 1 )
679 m_fr =
new RawFileReader( m_bgfiles[
iter->first],
680 m_bgfiles[
iter->first] +
".idx" );
681 else m_fr =
new RawFileReader( m_bgfiles[
iter->first] );
682 m_totEvtNumInCurFile = m_ranTrgEvents[
iter->first];
683 } catch ( RawFileException& ex )
685 m_ranStepLenInCurrentFile =
iter->second;
686 m_skipCount = 0;
687 currentBGFile = m_fr->currentFile();
688 break;
689 }
690 }
691 }
692
693
694
695
696 if ( m_skipCount == 0 ) nskip = m_ranStepLenInCurrentFile[m_skipCount];
697 else
698 nskip = m_ranStepLenInCurrentFile[m_skipCount] -
699 m_ranStepLenInCurrentFile[m_skipCount - 1];
700
701 m_nEventsToEnd = ( m_totEvtNumInCurFile - 1 ) -
702 m_ranStepLenInCurrentFile[m_skipCount];
703
704
705 if ( m_skipCount == 0 && nskip == 0 ) nskip = 1;
706
707 m_skipCount++;
708 }
709 if ( m_RealizationSvc->UseDBFlag() == false || m_dbUserRequest == true )
710 nskip = int( 2 * m_NSkip * ( RandFlat::shoot() ) ) + 1;
711 if ( m_totalEvent == 0 && nskip == 0 ) nskip = 1;
712 }
713 if ( m_mixingMethod == 2 ) { nskip = int( 2 * m_NSkip * ( RandFlat::shoot() ) ) + 1; }
714 if ( m_ifOutPut )
715 {
716 m_timer->stop();
717 m_time2 = m_timer->elapsed();
718 m_timer->start();
719 }
720
721
722 if ( m_readBGMethod == 0 )
723 {
724
725 for ( int j = 0; j < nskip; j++ )
726 {
728 if ( !next )
729 {
730 ( *log ) << MSG::ERROR << "Cannot get next background event" << endmsg;
731 return StatusCode::FAILURE;
732 }
733 }
734 }
735 if ( m_readBGMethod == 1 )
736 {
737
739 if ( !next )
740 {
741 ( *log ) << MSG::ERROR << "Cannot get next background event" << endmsg;
742 return StatusCode::FAILURE;
743 }
744 }
745 if ( m_readBGMethod == 2 )
746 {
747
749 if ( !next )
750 {
751 ( *log ) << MSG::ERROR << "Cannot get next background event" << endmsg;
752 return StatusCode::FAILURE;
753 }
754 }
755 }
756 else
757 {
759 }
760
761 if ( m_mixingMethod == 1 )
762 {
763 if ( !next && m_totalEvent == 0 )
764 {
765 ( *log ) << MSG::ERROR << "Cannot get next background event" << endmsg;
766 return StatusCode::FAILURE;
767 }
768 }
769
770 if ( m_mixingMethod == 2 )
771 {
772 if ( !next )
773 {
774 ( *log ) << MSG::ERROR << "Cannot get next background event" << endmsg;
775 return StatusCode::FAILURE;
776 }
777 }
778
779 mixDigi( mdcMcDigits, emcMcDigits, mucMcDigits, tofMcDigits );
780 }
781
782 m_totalEvent++;
783
784 if ( m_ifOutPut )
785 {
786 m_timer->stop();
787 m_time3 = m_timer->elapsed();
788 m_tuple1->write();
789 }
790 return StatusCode::SUCCESS;
791}
bool file_sort(std::vector< std::string > &files, std::vector< int > &ranEvtNums)
void mixDigi(SmartDataPtr< MdcDigiCol > &mdcMcDigits, SmartDataPtr< EmcDigiCol > &emcMcDigits, SmartDataPtr< MucDigiCol > &mucMcDigits, SmartDataPtr< TofDigiCol > &tofMcDigits)
bool nextEvent(int nskip=0, int evtbyte=0, int eventsToEnd=0)
virtual void print() const
static RootInterface * Instance(const std::string &name)
singleton behaviour
virtual std::string getCurrentFileName()