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