1 |
#ifndef l1menu_TriggerRatePlot_h
|
2 |
#define l1menu_TriggerRatePlot_h
|
3 |
|
4 |
#include <memory>
|
5 |
#include <string>
|
6 |
#include <vector>
|
7 |
|
8 |
//
|
9 |
// Forward declarations
|
10 |
//
|
11 |
class TH1;
|
12 |
namespace l1menu
|
13 |
{
|
14 |
class IEvent;
|
15 |
class ITrigger;
|
16 |
class ICachedTrigger;
|
17 |
class ISample;
|
18 |
}
|
19 |
|
20 |
|
21 |
namespace l1menu
|
22 |
{
|
23 |
/** @brief Class that plots trigger rates versus threshold.
|
24 |
*
|
25 |
* @author Mark Grimes (mark.grimes@bristol.ac.uk)
|
26 |
* @date 24/May/2013
|
27 |
*/
|
28 |
class TriggerRatePlot
|
29 |
{
|
30 |
public:
|
31 |
/** @brief Constructor that sets the trigger to plot for, the histogram to plot into, and the trigger parameter to vary.
|
32 |
*
|
33 |
* Note that the title of the histogram is modified to record the state of the trigger (all other parameters).
|
34 |
*
|
35 |
* @param[in] trigger The trigger that the plot will be created for. The trigger should be set exactly as you want
|
36 |
* the plots made for it, e.g. with the correct eta cuts already set. The other thresholds are
|
37 |
* not modified so you should set these to zero beforehand if that's what you want. The trigger
|
38 |
* is copied so these cannot be changed afterwards.
|
39 |
* @param[in] pHistogram The root histogram to fill with the rates. This should be set up with the required binning
|
40 |
* beforehand. The title is changed to record the trigger name, version, parameter plotted against
|
41 |
* and other parameter values.
|
42 |
* @param[in] versusParameter The trigger parameter to plot along the x-axis. Defaults to "threshold1".
|
43 |
* @param[in] scaledParameters A list of parameters that should be scaled along with the versusParameter. The ratio between each
|
44 |
* parameter and the versusParameter at the time of construction is kept as the versusParameter is
|
45 |
* changed. A check is made to ensure the versusParameter is taken out of the list if it is present.
|
46 |
*/
|
47 |
TriggerRatePlot( const l1menu::ITrigger& trigger, std::unique_ptr<TH1> pHistogram, const std::string& versusParameter="threshold1", const std::vector<std::string> scaledParameters=std::vector<std::string>() );
|
48 |
/** @brief Constructor that creates the histogram itself.
|
49 |
*
|
50 |
* Similar to the other constructor, except that instead of taking a previously created histogram takes the information required
|
51 |
* to create a histogram itself (number of bins etcetera).
|
52 |
*/
|
53 |
TriggerRatePlot( const l1menu::ITrigger& trigger, const std::string& name, size_t numberOfBins, float lowEdge, float highEdge, const std::string& versusParameter="threshold1", const std::vector<std::string> scaledParameters=std::vector<std::string>() );
|
54 |
/** @brief Constructor that takes a histogram previously created by TriggerRatePlot, e.g. to load from disk.
|
55 |
*
|
56 |
* Tries to tell from the information in the title all of the information required to recreate the TriggerRateObject
|
57 |
* instance. If anything goes wrong a runtime_error is thrown. Probably advisable to only use this to load a fully
|
58 |
* filled plot from disk for use with other classes (e.g. MenuFitter), rather than adding anything else on to it.
|
59 |
*
|
60 |
* Note that a copy is made of the histogram.
|
61 |
*/
|
62 |
explicit TriggerRatePlot( const TH1* pPreExisitingHistogram );
|
63 |
TriggerRatePlot( l1menu::TriggerRatePlot& otherTriggerRatePlot ) = delete;
|
64 |
TriggerRatePlot& operator=( l1menu::TriggerRatePlot& otherTriggerRatePlot ) = delete;
|
65 |
|
66 |
/** @brief Explicit rvalue constructor to allow moving of TriggerRatePlot objects. */
|
67 |
TriggerRatePlot( l1menu::TriggerRatePlot&& otherTriggerRatePlot ) noexcept;
|
68 |
/** @brief Explicit rvalue assignment operator to allow moving of TriggerRatePlot objects. */
|
69 |
TriggerRatePlot& operator=( l1menu::TriggerRatePlot&& otherTriggerRatePlot ) noexcept;
|
70 |
|
71 |
virtual ~TriggerRatePlot();
|
72 |
|
73 |
void addEvent( const l1menu::IEvent& event );
|
74 |
void addSample( const l1menu::ISample& sample );
|
75 |
|
76 |
/** @brief Returns the trigger being used to create the plot. */
|
77 |
const l1menu::ITrigger& getTrigger() const;
|
78 |
|
79 |
/** @brief Returns the threshold that will will provide a given rate.
|
80 |
*
|
81 |
* Interpolates between the bins using a simple linear fit of the two bins
|
82 |
* before and the two bins after the point.
|
83 |
*/
|
84 |
float findThreshold( float targetRate ) const;
|
85 |
|
86 |
/** @brief Returns the internal pointer to the root histogram. Ownership is retained by TriggerRatePlot. */
|
87 |
TH1* getPlot();
|
88 |
|
89 |
/** @brief Tells TriggerRatePlot to relinquish ownership of the internal root histogram. A pointer to the
|
90 |
* histogram is also returned.
|
91 |
*
|
92 |
* Note that the pointer is still held so that further operations on this object are still valid,
|
93 |
* just that the TH1 won't be deleted when the instance goes out of scope. */
|
94 |
TH1* relinquishOwnershipOfPlot();
|
95 |
protected:
|
96 |
void initiate( const l1menu::ITrigger& trigger, const std::vector<std::string>& scaledParameters );
|
97 |
std::unique_ptr<l1menu::ITrigger> pTrigger_;
|
98 |
std::unique_ptr<TH1> pHistogram_;
|
99 |
/// The parameter to plot against, usually "threshold1";
|
100 |
std::string versusParameter_;
|
101 |
/// Pointer to the versusParameter_ reference in pTrigger_ to avoid expensive string comparison look ups
|
102 |
float* pParameter_;
|
103 |
/// A vector of pointers of any other parameters that should be scaled, and what the scaling should be.
|
104 |
std::vector< std::pair<float*,float> > otherParameterScalings_;
|
105 |
/// Flag to say whether the histogram should be deleted when this instance goes out of scope.
|
106 |
bool histogramOwnedByMe_;
|
107 |
/// The implementation that the public methods delegate to
|
108 |
void addEvent( const l1menu::IEvent& event, const std::unique_ptr<l1menu::ICachedTrigger>& pCachedTrigger, float weightPerEvent );
|
109 |
};
|
110 |
}
|
111 |
#endif
|