File indexing completed on 2024-04-06 12:22:43
0001 #ifndef Legend_h
0002 #define Legend_h
0003
0004 #include "TString.h"
0005 #include "TPaveText.h"
0006 #include "TF1.h"
0007
0008 #include <iomanip>
0009 #include <sstream>
0010
0011
0012
0013
0014
0015 TString setText(const char * text, const double & num1, const char * divider = "", const double & num2 = 0)
0016 {
0017
0018
0019 int precision = 1;
0020 int k=1;
0021 while( int(num2*k) == 0 ) {
0022 k*=10;
0023 ++precision;
0024 }
0025
0026 std::stringstream numString;
0027 TString textString(text);
0028 numString << std::setprecision(precision) << std::fixed << num1;
0029 textString += numString.str();
0030 if( num2 != 0 ) {
0031 textString += divider;
0032 numString.str("");
0033 if( std::string(text).find("ndf") != std::string::npos ) precision = 0;
0034 numString << std::setprecision(precision) << std::fixed << num2;
0035 textString += numString.str();
0036 }
0037 return textString;
0038 }
0039
0040
0041 void setTPaveText(const TF1 * fit, TPaveText * paveText) {
0042 Double_t chi2 = fit->GetChisquare();
0043 Int_t ndf = fit->GetNDF();
0044 paveText->AddText(setText("#chi^2 / ndf = ", chi2, " / ", ndf));
0045
0046 for( int iPar=0; iPar<fit->GetNpar(); ++iPar ) {
0047 TString parName(fit->GetParName(iPar));
0048 Double_t parValue = fit->GetParameter(iPar);
0049 Double_t parError = fit->GetParError(iPar);
0050 paveText->AddText(setText(parName + " = ", parValue, " #pm ", parError));
0051 }
0052 }
0053
0054
0055
0056
0057
0058 class TwinLegend
0059 {
0060 public:
0061 TwinLegend() : drawSecondLegend_(true)
0062 {
0063 paveText1_ = new TPaveText(0.20,0.15,0.49,0.28,"NDC");
0064 paveText1_->SetFillColor(0);
0065 paveText1_->SetTextColor(1);
0066 paveText1_->SetTextSize(0.04);
0067 paveText1_->SetBorderSize(1);
0068
0069 paveText2_ = new TPaveText(0.59,0.15,0.88,0.28,"NDC");
0070 paveText2_->SetFillColor(0);
0071 paveText2_->SetTextColor(2);
0072 paveText2_->SetTextSize(0.04);
0073 paveText2_->SetBorderSize(1);
0074 }
0075
0076 void setText(TF1 * fit1, TF1 * fit2)
0077 {
0078 setTPaveText(fit1, paveText1_);
0079 if( fit2 != 0 ) {
0080 setTPaveText(fit2, paveText2_);
0081 }
0082 else {
0083 drawSecondLegend_ = false;
0084 }
0085 }
0086
0087 void Draw(const TString & option)
0088 {
0089 paveText1_->Draw(option);
0090 if( drawSecondLegend_ ) {
0091 paveText2_->Draw(option);
0092 }
0093 }
0094
0095 TPaveText * paveText1_;
0096 TPaveText * paveText2_;
0097 bool drawSecondLegend_;
0098 };
0099
0100 #endif