532 |
|
std::unique_ptr<const l1menu::IMenuRate> l1menu::ReducedSample::rate( const l1menu::TriggerMenu& menu ) const |
533 |
|
{ |
534 |
|
// TODO make sure the TriggerMenu is valid for this sample |
535 |
< |
|
536 |
< |
// The number of events that pass each trigger |
537 |
< |
std::vector<size_t> numberOfEventsPassed( menu.numberOfTriggers() ); |
538 |
< |
float numberOfEventsPassingAnyTrigger; |
539 |
< |
|
540 |
< |
// Using cached triggers significantly increases speed for ReducedSample |
541 |
< |
// because it cuts out expensive string comparisons when querying the trigger |
542 |
< |
// parameters. |
543 |
< |
std::vector< std::unique_ptr<l1menu::ICachedTrigger> > cachedTriggers; |
544 |
< |
for( size_t triggerNumber=0; triggerNumber<menu.numberOfTriggers(); ++triggerNumber ) |
545 |
< |
{ |
546 |
< |
cachedTriggers.push_back( createCachedTrigger( menu.getTrigger( triggerNumber ) ) ); |
547 |
< |
} |
548 |
< |
|
549 |
< |
for( size_t eventNumber=0; eventNumber<numberOfEvents(); ++eventNumber ) |
550 |
< |
{ |
551 |
< |
const l1menu::IEvent& event=getEvent(eventNumber); |
552 |
< |
bool anyTriggerPassed=false; |
553 |
< |
|
554 |
< |
for( size_t triggerNumber=0; triggerNumber<cachedTriggers.size(); ++triggerNumber ) |
555 |
< |
{ |
556 |
< |
if( cachedTriggers[triggerNumber]->apply(event) ) |
557 |
< |
{ |
558 |
< |
// If the event passes the trigger, increment the counter |
559 |
< |
++numberOfEventsPassed[triggerNumber]; |
560 |
< |
anyTriggerPassed=true; |
561 |
< |
} |
562 |
< |
} |
563 |
< |
|
564 |
< |
if( anyTriggerPassed ) ++numberOfEventsPassingAnyTrigger; |
565 |
< |
} |
566 |
< |
|
567 |
< |
l1menu::implementation::MenuRateImplementation* pRates=new l1menu::implementation::MenuRateImplementation; |
568 |
< |
// This is the value I want to return, but I still need access to the extended attributes of the subclass |
569 |
< |
std::unique_ptr<const l1menu::IMenuRate> pReturnValue( pRates ); |
570 |
< |
|
571 |
< |
pRates->setScaling( pImple_->eventRate ); |
572 |
< |
|
573 |
< |
pRates->setTotalFraction( static_cast<float>(numberOfEventsPassingAnyTrigger)/static_cast<float>(numberOfEvents()) ); |
574 |
< |
|
575 |
< |
for( size_t triggerNumber=0; triggerNumber<numberOfEventsPassed.size(); ++triggerNumber ) |
576 |
< |
{ |
577 |
< |
float fraction=static_cast<float>(numberOfEventsPassed[triggerNumber])/static_cast<float>(numberOfEvents()); |
578 |
< |
pRates->addTriggerRate( menu.getTrigger(triggerNumber), fraction ); |
579 |
< |
} |
580 |
< |
|
581 |
< |
return pReturnValue; |
535 |
> |
return std::unique_ptr<const l1menu::IMenuRate>( new l1menu::implementation::MenuRateImplementation( menu, *this ) ); |
536 |
|
} |