Skip to content
Snippets Groups Projects
Commit 9dc62a67 authored by Sergey Gorbunov's avatar Sergey Gorbunov
Browse files

CbmQaHist wrapper for histograms that ensures update of the stat window

parent 6d87bc16
No related branches found
No related tags found
1 merge request!170CbmQaHist wrapper for histograms that ensures the update of the stat window
...@@ -21,11 +21,11 @@ link_directories( ${LINK_DIRECTORIES}) ...@@ -21,11 +21,11 @@ link_directories( ${LINK_DIRECTORIES})
set(SRCS set(SRCS
CbmQaCanvas.cxx CbmQaCanvas.cxx
CbmQaPie.cxx CbmQaPie.cxx
CbmQaHist.cxx
) )
set(LINKDEF CbmQaBaseLinkDef.h) set(LINKDEF CbmQaBaseLinkDef.h)
Set(LIBRARY_NAME CbmQaBase) Set(LIBRARY_NAME CbmQaBase)
Set(DEPENDENCIES Set(DEPENDENCIES)
)
GENERATE_LIBRARY() GENERATE_LIBRARY()
...@@ -4,7 +4,13 @@ ...@@ -4,7 +4,13 @@
#pragma link off all classes; #pragma link off all classes;
#pragma link off all functions; #pragma link off all functions;
#pragma link C++ nestedclasses;
#pragma link C++ nestedtypedef;
#pragma link C++ class CbmQaCanvas - ; #pragma link C++ class CbmQaCanvas - ;
#pragma link C++ class CbmQaPieSlice + ; #pragma link C++ class CbmQaPieSlice + ;
#pragma link C++ class CbmQaPie - ; #pragma link C++ class CbmQaPie - ;
#pragma link C++ class CbmQaH1F + ;
#pragma link C++ class CbmQaH1D + ;
#endif #endif
/// \file CbmQaHist.cxx
/// \brief Implementation of the CbmQaHist class
/// \author Sergey Gorbunov <se.gorbunov@gsi.de>
/// \date 22.11.2020
#include "CbmQaHist.h"
templateClassImp(CbmQaHist);
// create definitions of specific CbmQaHist classes,
// otherwise they will not be linked by the ROOT linker
//
template class CbmQaHist<TH1F>;
template class CbmQaHist<TH1D>;
/// \file CbmQaHist.h
/// \brief Definition of the CbmQaHist class
/// \author Sergey Gorbunov <se.gorbunov@gsi.de>
/// \date 22.11.2020
#ifndef CbmQaHist_H
#define CbmQaHist_H
#include "CbmQaCanvas.h"
#include "TFitResultPtr.h"
#include "TH1D.h"
#include "TH1F.h"
#include "TStyle.h"
#include "TVirtualPad.h"
/// A modification of TH* classes that keeps statistics & fit drawing options
/// and resizes the stat window accordingly without actual drawing.
/// In the original classes, hist->Draw() & canv->Update() must be called
/// for resetting Stat/Fit window.
///
template<class HistTypeT>
class CbmQaHist : public HistTypeT {
public:
/// Default constructor only for the streamer
CbmQaHist() : HistTypeT() {
// we don't call SetOptStatFit() here since it will call Clone()
// which calls this default constructor in an endless recursion
if (gStyle) {
fOptStat = gStyle->GetOptStat();
fOptFit = gStyle->GetOptFit();
}
}
/// Copy constructor
CbmQaHist(const CbmQaHist& h) : HistTypeT(h) {
SetOptStatFit(h.fOptStat, h.fOptFit);
}
/// Reimplementation of all other HistTypeT constructors
/// that creates a stat window with current gStyle options.
template<typename... Types>
CbmQaHist(Types... args) : HistTypeT(args...) {
if (gStyle) { SetOptStatFit(gStyle->GetOptStat(), gStyle->GetOptFit()); }
}
/// Destructor
~CbmQaHist() {}
/// Reimplementation of Fit()
/// that suppresses an immediate drawing in the active window
///
template<typename... Types>
TFitResultPtr Fit(Types... args) {
TVirtualPad* padsav = gPad;
GetCanvas().cd();
auto ret = HistTypeT::Fit(args...);
GetCanvas().Clear();
if (padsav) padsav->cd();
auto* f = this->GetFunction("gaus");
if (f) {
f->SetParName(0, "Peak");
f->SetParName(1, "#mu");
f->SetParName(2, "#sigma");
f->SetLineColor(kRed);
f->SetLineWidth(3);
}
return ret;
}
/// Set stat drawing options and resize the stat window
void SetOptStat(Int_t stat = 1) { SetOptStatFit(stat, fOptFit); }
/// Set fit drawing options and resize the stat window
void SetOptFit(Int_t fit = 1) { SetOptStatFit(fOptStat, fit); }
/// Set stat & fit drawing options and resize the stat window
void SetOptStatFit(int stat, int fit) {
fOptStat = stat;
fOptFit = fit;
if (!gStyle) { return; }
TVirtualPad* savePad = gPad;
int saveStat = gStyle->GetOptStat();
int saveFit = gStyle->GetOptFit();
this->SetStats(0); // remove the old stat window
this->SetStats(1); // set the flag to create thes stat window during Draw()
CbmQaHist* tmp = (CbmQaHist*) this->Clone("myClone");
GetCanvas().cd();
gStyle->SetOptStat(fOptStat);
gStyle->SetOptFit(fOptFit);
// the only way to create and auto-size the stat window
tmp->Draw();
GetCanvas().Update();
// move the stat window to *this
TObject* obj = tmp->FindObject("stats");
// the list of functions seems always to exist, but let's check it
if (obj && this->GetListOfFunctions()) {
tmp->GetListOfFunctions()->Remove(obj);
this->GetListOfFunctions()->Add(obj);
}
GetCanvas().Clear();
gStyle->SetOptStat(saveStat);
gStyle->SetOptFit(saveFit);
if (savePad) savePad->cd();
}
private:
/// a static canvas for temporary drawing
static CbmQaCanvas& GetCanvas() {
/// the static variable will be initialised at the first call;
/// deleted at the application end (c++11)
static CbmQaCanvas tmp("CbmQaTempCanvas", "CbmQaTempCanvas", 1, 1);
return tmp;
}
int fOptStat = 1;
int fOptFit = 0;
ClassDefNV(CbmQaHist, 1);
};
// shortcuts
typedef CbmQaHist<TH1F> CbmQaH1F;
typedef CbmQaHist<TH1D> CbmQaH1D;
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment