MaCh3  2.2.3
Reference Guide
HistogramUtils.h
Go to the documentation of this file.
1 #pragma once
2 
3 // MaCh3 includes
6 
8 // ROOT include
9 #include "TGraphAsymmErrors.h"
10 #include "TObjString.h"
11 #include "TRandom3.h"
13 
17 
19 double OverflowIntegral(TH2Poly* poly);
20 
22 double NoOverflowIntegral(TH2Poly* poly);
23 
25 TH1D* PolyProjectionX(TObject* poly, std::string TempName, const std::vector<double>& xbins, const bool computeErrors = false);
27 TH1D* PolyProjectionY(TObject* poly, std::string TempName, const std::vector<double>& ybins, const bool computeErrors = false);
28 
30 TH2D* ConvertTH2PolyToTH2D(TH2Poly *poly, TH2D *TH2Dhist);
32 TH2Poly* ConvertTH2DtoTH2Poly(TH2D *TH2Dhist);
33 
35 TH2Poly* NormalisePoly(TH2Poly* Histogram);
36 
39 void NormaliseTH2Poly(TH2Poly* Histogram);
40 
42 TH2Poly* PolyScaleWidth(TH2Poly *Histogram, double scale);
43 
45 double PolyIntegralWidth(TH2Poly *Histogram);
46 
48 template<class HistType> HistType* RatioHists(HistType* NumHist, HistType* DenomHist);
49 
51 TH2Poly* RatioPolys(TH2Poly* NumPoly, TH2Poly* DenomPoly);
52 
57 TH2Poly* MakePolyHist(const std::string& name, const std::vector<double>& BinArray_x, const std::vector<double>& BinArray_y);
58 
62 void CheckTH2PolyFileVersion(TFile *file);
63 
65 void RemoveFitter(TH1D* hist, const std::string& name);
66 
68 void MakeFluctuatedHistogramStandard(TH1D *FluctHist, TH1D* PolyHist, TRandom3* rand);
70 void MakeFluctuatedHistogramAlternative(TH1D *FluctHist, TH1D* PolyHist, TRandom3* rand);
71 
73 void MakeFluctuatedHistogramStandard(TH2Poly *FluctHist, TH2Poly* PolyHist, TRandom3* rand);
75 void MakeFluctuatedHistogramAlternative(TH2Poly *FluctHist, TH2Poly* PolyHist, TRandom3* rand);
76 
78 int GetRandomPoly2(const TH2Poly* PolyHist, TRandom3* rand);
79 
86 std::unique_ptr<TGraphAsymmErrors> MakeAsymGraph(TH1* sigmaArrayLeft, TH1* sigmaArrayCentr, TH1* sigmaArrayRight, const std::string& title);
87 
91 void FastViolinFill(TH2D* violin, TH1D* hist_1d);
92 
98 template <typename Derived, typename Base>
99 std::vector<Base*> CastVector(const std::vector<Derived*>& inputVec) {
100  std::vector<Base*> outputVec;
101  // Reserve space for efficiency
102  outputVec.reserve(inputVec.size());
103  for (auto* ptr : inputVec) {
104  outputVec.push_back(static_cast<Base*>(ptr));
105  }
106  return outputVec;
107 }
108 
110 inline std::string file_exists(std::string filename) {
111  std::ifstream infile(filename.c_str());
112  if (!infile.good()) {
113  MACH3LOG_ERROR("*** ERROR ***");
114  MACH3LOG_ERROR("File {} does not exist", filename);
115  MACH3LOG_ERROR("Please try again");
116  MACH3LOG_ERROR("*************");
117  throw MaCh3Exception(__FILE__ , __LINE__ );
118  }
119  return filename;
120 }
121 
123 double returnCherenkovThresholdMomentum(int PDG);
124 
126 double CalculateQ2(double PLep, double PUpd, double EnuTrue, double InitialQ2 = 0.0);
127 
129 double CalculateEnu(double PLep, double cosTheta, double EB, bool neutrino);
130 
131 namespace M3 {
138 template <typename ObjectType>
139 std::unique_ptr<ObjectType> Clone(const ObjectType* obj, const std::string& name = "") {
140  std::string cloneName = name.empty() ? obj->GetName() : name;
141 
142  std::unique_ptr<ObjectType> Hist(static_cast<ObjectType*>(obj->Clone(cloneName.c_str())));
143  // Disable ROOT memory management because it causes lot of headache especially as smart pointers are much smarter
144  Hist->SetDirectory(nullptr);
145 
146  return Hist;
147 }
148 
149 
158 TFile* Open(const std::string& Name, const std::string& Type, const std::string& File, const int Line);
159 
160 } //end M3
#define _MaCh3_Safe_Include_Start_
KS: Avoiding warning checking for headers.
Definition: Core.h:109
#define _MaCh3_Safe_Include_End_
KS: Restore warning checking after including external headers.
Definition: Core.h:120
std::unique_ptr< TGraphAsymmErrors > MakeAsymGraph(TH1 *sigmaArrayLeft, TH1 *sigmaArrayCentr, TH1 *sigmaArrayRight, const std::string &title)
Used by sigma variation, check how 1 sigma changes spectra.
double CalculateQ2(double PLep, double PUpd, double EnuTrue, double InitialQ2=0.0)
Recalculate Q^2 after Eb shift. Takes in shifted lepton momentum, lepton angle, and true neutrino ene...
std::vector< Base * > CastVector(const std::vector< Derived * > &inputVec)
Converts a vector of pointers from a derived type to a base type.
void CheckTH2PolyFileVersion(TFile *file)
KS: ROOT changes something with binning when moving from ROOT 5 to ROOT 6. If you open ROOT5 produced...
void MakeFluctuatedHistogramAlternative(TH1D *FluctHist, TH1D *PolyHist, TRandom3 *rand)
Make Poisson fluctuation of TH1D hist using slow method which is only for cross-check.
TH2Poly * RatioPolys(TH2Poly *NumPoly, TH2Poly *DenomPoly)
Helper to make ratio of TH2Polys.
double CalculateEnu(double PLep, double cosTheta, double EB, bool neutrino)
Recalculate Enu after Eb shift. Takes in shifted lepton momentum, lepton angle, and binding energy ch...
void NormaliseTH2Poly(TH2Poly *Histogram)
Helper to Normalise histograms.
double OverflowIntegral(TH2Poly *poly)
WP: Helper function for calculating unbinned Integral of TH2Poly i.e including overflow.
void MakeFluctuatedHistogramStandard(TH1D *FluctHist, TH1D *PolyHist, TRandom3 *rand)
Make Poisson fluctuation of TH1D hist using default fast method.
TH2D * ConvertTH2PolyToTH2D(TH2Poly *poly, TH2D *TH2Dhist)
KS: Convert TH2D to TH2Poly.
int GetRandomPoly2(const TH2Poly *PolyHist, TRandom3 *rand)
KS: ROOT developers were too lazy do develop getRanom2 for TH2Poly, this implementation is based on l...
void FastViolinFill(TH2D *violin, TH1D *hist_1d)
KS: Fill Violin histogram with entry from a toy.
TH2Poly * NormalisePoly(TH2Poly *Histogram)
WP: Helper to Normalise histograms.
HistType * RatioHists(HistType *NumHist, HistType *DenomHist)
Helper to make ratio histograms.
double returnCherenkovThresholdMomentum(int PDG)
DB Get the Cherenkov momentum threshold in MeV.
TH2Poly * PolyScaleWidth(TH2Poly *Histogram, double scale)
WP: Helper to scale th2poly analogous to th2d scale with option "width".
void RemoveFitter(TH1D *hist, const std::string &name)
KS: Remove fitted TF1 from hist to make comparison easier.
double PolyIntegralWidth(TH2Poly *Histogram)
WP: Helper to calc integral of th2poly analogous to th2d integra; with option "width".
TH2Poly * ConvertTH2DtoTH2Poly(TH2D *TH2Dhist)
KS: Convert TH2Poly to TH2D.
double NoOverflowIntegral(TH2Poly *poly)
WP: Helper function for calculating binned Integral of TH2Poly i.e not including overflow.
TH2Poly * MakePolyHist(const std::string &name, const std::vector< double > &BinArray_x, const std::vector< double > &BinArray_y)
WP: Helper function to create TH2Poly histogram with uniform binning.
TH1D * PolyProjectionY(TObject *poly, std::string TempName, const std::vector< double > &ybins, const bool computeErrors=false)
WP: Poly Projectors.
TH1D * PolyProjectionX(TObject *poly, std::string TempName, const std::vector< double > &xbins, const bool computeErrors=false)
WP: Poly Projectors.
std::string file_exists(std::string filename)
Helper to check if files exist or not.
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:27
Custom exception class for MaCh3 errors.
Definition: Core.h:19
std::unique_ptr< ObjectType > Clone(const ObjectType *obj, const std::string &name="")
KS: Creates a copy of a ROOT-like object and wraps it in a smart pointer.
TFile * Open(const std::string &Name, const std::string &Type, const std::string &File, const int Line)
Opens a ROOT file with the given name and mode.