diff --git a/examples/AnalysisROOT.cc b/examples/AnalysisROOT.cc index 82bed58..648925a 100644 --- a/examples/AnalysisROOT.cc +++ b/examples/AnalysisROOT.cc @@ -1,109 +1,111 @@ //! Simple HEJ analysis to plot Delta y_{fb} with ROOT #include // for std::unique_ptr #include // for std::cout #include "TFile.h" +#include "TKey.h" #include "TH1.h" #include "HEJ/Analysis.hh" #include "HEJ/Event.hh" #include "HEJ/Version.hh" namespace YAML { class Node; } namespace LHEF { class HEPRUP; } namespace { void Fill2DHistogram(TH1D & h,double x,double wt) { const int binnumber=h.GetXaxis()->FindBin(x); const double binwidth=h.GetXaxis()->GetBinWidth(binnumber); h.Fill(x,wt/binwidth); } class AnalysisROOT: public HEJ::Analysis { private: TFile hfile_; TH1D htotal_,hydif_,hyf_,hyb_; public: AnalysisROOT( YAML::Node const & /* config */, LHEF::HEPRUP const & /* heprup */ ):hfile_{"HEJ.root","RECREATE", ("Output from "+HEJ::Version::package_name_full()).c_str()}, htotal_{"total","total",1,-0.5,.5}, hydif_{"ydif","ydif",40,0.,10.}, hyf_{"yf","yf",40,-5.,5.}, hyb_{"yb","yb",40,-5.,5.} { // Setup histograms htotal_.Sumw2(); hydif_.Sumw2(); hyf_.Sumw2(); hyb_.Sumw2(); } void fill( HEJ::Event const & event, HEJ::Event const & /* FO_event */ ) override { const double weight=event.central().weight; htotal_.Fill(0.0,weight); auto const & jets=event.jets(); // jets are sorted in rapidity Fill2DHistogram(hydif_, fabs(jets.back().rapidity()-jets.front().rapidity()), weight); Fill2DHistogram(hyf_, jets.front().rapidity(), weight); Fill2DHistogram(hyb_, jets.back().rapidity(), weight); } bool pass_cuts( HEJ::Event const & event, HEJ::Event const & /* FO_event */ ) override { if (event.jets().size()<2) return false; return true; } void scale(const double xsscale) override { std::cout << "AnalysisROOT scales the histograms" << std::endl; - TList* list = hfile_->GetListOfKeys() ; + TList* list = hfile_.GetListOfKeys() ; if (!list) { printf(" No keys defined \n") ; exit(1) ; } TIter next(list) ; TKey* key ; TObject* obj ; - while ( key = (TKey*)next() ) { + while ( (key = (TKey*)next()) ) { obj = key->ReadObj() ; - if ( (strcmp(obj->IsA()->GetName(),"TProfile")!=0) - && (!obj->InheritsFrom("TH2")) - && (!obj->InheritsFrom("TH1")) - ) { - printf(" Object %s is not 1D or 2D histogram : " - "will not be scaled\n",obj->GetName()) ; + auto hist = dynamic_cast(obj); + if(hist) { + std::cerr << "Histo name: " << hist->GetName() + << " title: " << hist->GetTitle() + << "will be scaled\n"; + hist->Scale(xsscale); + } else { + std::cerr << " Object " << obj->GetName() + << " is not 1D or 2D histogram : will not be scaled\n"; } - printf("Histo name:%s title:%s will be scaled\n",obj->GetName(),obj->GetTitle()); - obj->scale(xsscale); } } void finalise() override { hfile_.Write(); hfile_.Close(); std::cout << "AnalysisROOT bids you farewell " << std::endl; // be polite } }; } extern "C" __attribute__((visibility("default"))) std::unique_ptr make_analysis( YAML::Node const & config, LHEF::HEPRUP const & heprup ){ return std::make_unique(config, heprup); }