9 |
|
#include "l1menu/ReducedEvent.h" |
10 |
|
#include <TH1F.h> |
11 |
|
#include <sstream> |
12 |
+ |
#include <algorithm> |
13 |
|
|
14 |
< |
l1menu::TriggerRatePlot::TriggerRatePlot( const l1menu::ITrigger& trigger, std::unique_ptr<TH1> pHistogram, const std::string versusParameter ) |
14 |
> |
#include <iostream> |
15 |
> |
|
16 |
> |
l1menu::TriggerRatePlot::TriggerRatePlot( const l1menu::ITrigger& trigger, std::unique_ptr<TH1> pHistogram, const std::string& versusParameter, const std::vector<std::string> scaledParameters ) |
17 |
|
: pHistogram_( std::move(pHistogram) ), versusParameter_(versusParameter), histogramOwnedByMe_(true) |
18 |
|
{ |
19 |
|
// Take a copy of the trigger |
21 |
|
pTrigger_=table.copyTrigger( trigger ); |
22 |
|
|
23 |
|
// Make sure the versusParameter_ supplied is valid. If it's not then this call will |
24 |
< |
// throw an exception. |
24 |
> |
// throw an exception. Take a pointer to the parameter so I don't need to keep performing |
25 |
> |
// expensive string comparisons. |
26 |
|
pParameter_=&pTrigger_->parameter(versusParameter_); |
27 |
|
|
28 |
+ |
// If any parameters have been requested to be scaled along with the versusParameter, figure |
29 |
+ |
// out what the scaling should be and take a note of pointers. |
30 |
+ |
for( const auto& parameterToScale : scaledParameters ) |
31 |
+ |
{ |
32 |
+ |
if( parameterToScale!=versusParameter_ ) |
33 |
+ |
{ |
34 |
+ |
otherParameterScalings_.push_back( std::make_pair( &pTrigger_->parameter(parameterToScale), pTrigger_->parameter(parameterToScale)/(*pParameter_) ) ); |
35 |
+ |
} |
36 |
+ |
} |
37 |
|
// I want to make a note of the other parameters set for the trigger. As far as I know TH1 |
38 |
|
// has no way of adding annotations so I'll tag it on the end of the title. |
39 |
|
std::stringstream description; |
46 |
|
for( std::vector<std::string>::const_iterator iName=parameterNames.begin(); iName!=parameterNames.end(); ++iName ) |
47 |
|
{ |
48 |
|
if( *iName==versusParameter ) continue; // Don't bother adding the parameter I'm plotting against |
49 |
< |
description << *iName << "=" << pTrigger_->parameter(*iName); |
49 |
> |
|
50 |
> |
// First check to see if this is one of the parameters that are being scaled |
51 |
> |
if( std::find(scaledParameters.begin(),scaledParameters.end(),*iName)==scaledParameters.end() ) |
52 |
> |
{ |
53 |
> |
// This parameter isn't being scaled, so write the absoulte value in the description |
54 |
> |
description << *iName << "=" << pTrigger_->parameter(*iName); |
55 |
> |
} |
56 |
> |
else |
57 |
> |
{ |
58 |
> |
// This parameter is being scaled, so write what the scaling is in the description |
59 |
> |
description << *iName << "=x*" << pTrigger_->parameter(*iName)/(*pParameter_); |
60 |
> |
} |
61 |
> |
|
62 |
|
if( iName+1!=parameterNames.end() ) description << ","; // Add delimeter between parameter names |
63 |
|
} |
64 |
|
description << "]"; |
69 |
|
|
70 |
|
l1menu::TriggerRatePlot::TriggerRatePlot( l1menu::TriggerRatePlot&& otherTriggerRatePlot ) noexcept |
71 |
|
: pTrigger_( std::move(otherTriggerRatePlot.pTrigger_) ), pHistogram_( std::move(otherTriggerRatePlot.pHistogram_) ), |
72 |
< |
versusParameter_( std::move(otherTriggerRatePlot.versusParameter_) ), pParameter_(otherTriggerRatePlot.pParameter_), |
73 |
< |
histogramOwnedByMe_(histogramOwnedByMe_) |
72 |
> |
versusParameter_( std::move(otherTriggerRatePlot.versusParameter_) ), pParameter_(&pTrigger_->parameter(versusParameter_)), |
73 |
> |
otherParameterScalings_( std::move(otherTriggerRatePlot.otherParameterScalings_) ), histogramOwnedByMe_(histogramOwnedByMe_) |
74 |
|
{ |
75 |
|
// No operation besides the initaliser list |
76 |
|
} |
86 |
|
pTrigger_=std::move(otherTriggerRatePlot.pTrigger_); |
87 |
|
pHistogram_=std::move(otherTriggerRatePlot.pHistogram_); |
88 |
|
versusParameter_=std::move(otherTriggerRatePlot.versusParameter_); |
89 |
< |
pParameter_=otherTriggerRatePlot.pParameter_; |
89 |
> |
pParameter_=&pTrigger_->parameter(versusParameter_); |
90 |
> |
otherParameterScalings_=std::move(otherTriggerRatePlot.otherParameterScalings_); |
91 |
|
histogramOwnedByMe_=otherTriggerRatePlot.histogramOwnedByMe_; |
92 |
|
|
93 |
|
return *this; |
110 |
|
for( int binNumber=1; binNumber<pHistogram_->GetNbinsX(); ++binNumber ) |
111 |
|
{ |
112 |
|
(*pParameter_)=pHistogram_->GetBinCenter(binNumber); |
113 |
+ |
|
114 |
+ |
// Scale accordingly any other parameters that should be scaled. |
115 |
+ |
for( const auto& parameterScalingPair : otherParameterScalings_ ) *(parameterScalingPair.first)=parameterScalingPair.second*(*pParameter_); |
116 |
+ |
|
117 |
|
if( pTrigger_->apply( event ) ) |
118 |
|
{ |
119 |
|
pHistogram_->Fill( (*pParameter_), event.weight() ); |
140 |
|
for( int binNumber=1; binNumber<pHistogram_->GetNbinsX(); ++binNumber ) |
141 |
|
{ |
142 |
|
(*pParameter_)=pHistogram_->GetBinCenter(binNumber); |
143 |
+ |
|
144 |
+ |
// Scale accordingly any other parameters that should be scaled. |
145 |
+ |
for( const auto& parameterScalingPair : otherParameterScalings_ ) *(parameterScalingPair.first)=parameterScalingPair.second*(*pParameter_); |
146 |
+ |
|
147 |
|
if( pCachedTrigger->apply(event) ) // If the event passes the trigger |
148 |
|
{ |
149 |
|
pHistogram_->Fill( (*pParameter_), event.weight()*weightPerEvent ); |
154 |
|
// bins will pass. |
155 |
|
} // end of loop over histogram bins |
156 |
|
} // end of loop over events |
157 |
+ |
|
158 |
|
} |
159 |
|
|
160 |
|
const l1menu::ITrigger& l1menu::TriggerRatePlot::getTrigger() const |
174 |
|
for( int binNumber=1; binNumber<pHistogram_->GetNbinsX(); ++binNumber ) |
175 |
|
{ |
176 |
|
(*pParameter_)=pHistogram_->GetBinCenter(binNumber); |
177 |
+ |
|
178 |
+ |
// Scale accordingly any other parameters that should be scaled. |
179 |
+ |
for( const auto& parameterScalingPair : otherParameterScalings_ ) *(parameterScalingPair.first)=parameterScalingPair.second*(*pParameter_); |
180 |
+ |
|
181 |
|
if( pTrigger_->apply( event ) ) |
182 |
|
{ |
183 |
|
pHistogram_->Fill( (*pParameter_), event.weight() ); |