Skip to content

Commit

Permalink
[14x-comb2023] Support ROOT 6.30 and C++20 (#892)
Browse files Browse the repository at this point in the history
* Fix errors and warnings with C++20 in `FastTemplate.h`

The destructor and assignment operators are not allowed to include
template specializations in C++20.

They were not needed anyway, because the class itself is templated.

Also, generalize the assignment operators to take `TH1` and check for
the dimension at runtime. This is necessary to avoid other compiler
warnings, such as:

```
interface/FastTemplate.h:123:34: warning: ‘FastTemplate_t<T>& FastTemplate_t<T>::operator=(const TH1&) [with T = double]’ was hidden [-Woverloaded-virtual=]
  123 |         virtual FastTemplate_t & operator=(const TH1 &other) {
      |                                  ^~~~~~~~
interface/FastTemplate.h:284:24: note:   by ‘FastHisto2D_t<double>::operator=’
  284 |         FastHisto2D_t& operator=(const TH2 &other) {
```

That is a very valid warning! `FastHisto2D_t` inherits from
`FastTemplate_t`, and it's not good if their assignment operators take
different types.

* Add missing include to compile with ROOT `master`

* Avoid `operator-` on TComplex and RooRealProxy

This will not work anymore in ROOT 6.30. The `double` value needs to be
retrieved from the proxy first.
  • Loading branch information
guitargeek authored Apr 11, 2024
1 parent 7dbb213 commit f063bbf
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 22 deletions.
25 changes: 17 additions & 8 deletions interface/FastTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,10 @@ template <typename T> class FastTemplate_t {
}
return *this;
}
virtual FastTemplate_t<T> & operator=(const TH1 &other) {
virtual FastTemplate_t & operator=(const TH1 &other) {
if(other.GetDimension() != 1) {
throw std::invalid_argument("FastTemplate_t assignment error: right hand histogram must be 1-dimensional");
}
if ((int)size() != other.GetNbinsX()) {
size_ = (unsigned int)other.GetNbinsX();
values_.resize(size_);
Expand Down Expand Up @@ -200,7 +203,7 @@ template <typename T, typename U=Double_t> class FastHisto_t : public FastTempla
else this->CopyValues(other);
return *this;
}
~FastHisto_t<T,U>(){}
~FastHisto_t(){}
};
template <typename T, typename U=Double_t> class FastHisto2D_t : public FastTemplate_t<T> {
private:
Expand Down Expand Up @@ -278,9 +281,12 @@ template <typename T, typename U=Double_t> class FastHisto2D_t : public FastTemp
else this->CopyValues(other);
return *this;
}
FastHisto2D_t<T,U>& operator=(const TH2 &other) {
if (GetNbinsX() != other.GetNbinsX() || GetNbinsY() != other.GetNbinsY()) {
FastHisto2D_t<T,U> fh(other);
FastHisto2D_t& operator=(const TH1 &other) {
if(other.GetDimension() != 2) {
throw std::invalid_argument("FastHisto2D_t assignment error: right hand histogram must be 2-dimensional");
}
if (int(GetNbinsX()) != other.GetNbinsX() || int(GetNbinsY()) != other.GetNbinsY()) {
FastHisto2D_t<T,U> fh(static_cast<TH2 const&>(other));
swap(fh);
}
else this->CopyValues(other);
Expand Down Expand Up @@ -374,9 +380,12 @@ template <typename T, typename U=Double_t> class FastHisto3D_t : public FastTemp
else this->CopyValues(other);
return *this;
}
FastHisto3D_t<T,U>& operator=(const TH3 &other) {
if (GetNbinsX() != other.GetNbinsX() || GetNbinsY() != other.GetNbinsY() || GetNbinsZ() != other.GetNbinsZ()) {
FastHisto3D_t<T,U> fh(other);
FastHisto3D_t<T,U>& operator=(const TH1 &other) {
if(other.GetDimension() != 3) {
throw std::invalid_argument("FastHisto3D_t assignment error: right hand histogram must be 3-dimensional");
}
if (int(GetNbinsX()) != other.GetNbinsX() || int(GetNbinsY()) != other.GetNbinsY() || int(GetNbinsZ()) != other.GetNbinsZ()) {
FastHisto3D_t<T,U> fh(static_cast<TH3 const&>(other));
swap(fh);
}
else this->CopyValues(other);
Expand Down
41 changes: 27 additions & 14 deletions src/HZZ4LRooPdfs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4009,11 +4009,14 @@ ClassImp(RooCPSHighMassGGH)
beta = getBeta(mH,effKPrime);
}

// Cast the "x" proxy to double only once to avoid overhead and ambiguous
// overloads the TComplex operators.
const double xVal = x;

Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) );
Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) );

Double_t splineFactor;
if (x<1850) splineFactor = Spline(x);
if (xVal<1850) splineFactor = Spline(xVal);
else splineFactor = Spline(1850);

Double_t signal = bwHM*splineFactor;
Expand All @@ -4024,9 +4027,9 @@ ClassImp(RooCPSHighMassGGH)
TComplex M = MSquared.Sqrt(MSquared);
TComplex Exp1 = MSquared.Exp((TComplex)alpha);
TComplex Exp2 = MSquared.Exp(-(TComplex)alpha);
TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M);
TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M);

double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re();
double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re();

Double_t fValue = signal + IntStr*interference/( TMath::Sqrt(1-BRnew) );
if (fValue > 0) return fValue;
Expand Down Expand Up @@ -4655,7 +4658,11 @@ ClassImp(RooBWHighMassGGH)
Double_t r = getR(mH,effKPrime);
Double_t beta = getBeta(mH,effKPrime);

Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) );
// Cast the "x" proxy to double only once to avoid overhead and ambiguous
// overloads the TComplex operators.
const double xVal = x;

Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) );
Double_t signal = bwHM;

Double_t k=0.25;
Expand All @@ -4666,7 +4673,7 @@ ClassImp(RooBWHighMassGGH)
TComplex Exp2 = MSquared.Exp(-(TComplex)alpha);
TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M);

double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re();
double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re();

Double_t fValue = signal + IntStr*interference/( TMath::Sqrt(1-BRnew) );
if (fValue > 0) return fValue;
Expand Down Expand Up @@ -6552,11 +6559,14 @@ ClassImp(RooCPSHighMassVBF)
beta = getBeta(mH,effKPrime);
}

// Cast the "x" proxy to double only once to avoid overhead and ambiguous
// overloads the TComplex operators.
const double xVal = x;

Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) );
Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) );

Double_t splineFactor;
if (x<1850) splineFactor = Spline(x);
if (xVal<1850) splineFactor = Spline(xVal);
else splineFactor = Spline(1850);

Double_t signal = bwHM*splineFactor;
Expand All @@ -6567,9 +6577,9 @@ ClassImp(RooCPSHighMassVBF)
TComplex M = MSquared.Sqrt(MSquared);
TComplex Exp1 = MSquared.Exp((TComplex)alpha);
TComplex Exp2 = MSquared.Exp(-(TComplex)alpha);
TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M);
TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M);

double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re();
double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re();

Double_t fValue = signal*(1+IntStr*interference/(bwHM*( TMath::Sqrt(1-BRnew) )));
if (fValue > 0) return fValue;
Expand Down Expand Up @@ -7645,23 +7655,26 @@ ClassImp(RooSigPlusInt)

Double_t RooSigPlusInt::evaluate() const
{
// Cast the "x" proxy to double only once to avoid overhead and ambiguous
// overloads the TComplex operators.
const double xVal = x;

Double_t totWidthSF = CSquared/(1-BRnew);

Double_t mH_eff = mH*TMath::Sqrt(1-k*(totWidthSF*width/mH)*(totWidthSF*width/mH));

Double_t splineFactor = Spline(x);
Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(totWidthSF*width,2) );
Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(totWidthSF*width,2) );

Double_t signal = splineFactor*bwHM;

TComplex MSquared(mH_eff*mH_eff,-totWidthSF*width*mH_eff);
TComplex M = MSquared.Sqrt(MSquared);
TComplex Exp1 = MSquared.Exp((TComplex)alpha);
TComplex Exp2 = MSquared.Exp(-(TComplex)alpha);
TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M);
TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M);

double interference = -r*sqrt(1/1-BRnew)*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re();
double interference = -r*sqrt(1/1-BRnew)*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re();

return signal + interference;

Expand Down
1 change: 1 addition & 0 deletions src/ProfiledLikelihoodRatioTestStat.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "../interface/ProfiledLikelihoodRatioTestStat.h"
#include "../interface/CloseCoutSentry.h"
#include <stdexcept>
#include <RooFitResult.h>
#include <RooRealVar.h>

Double_t ProfiledLikelihoodRatioTestStat::Evaluate(RooAbsData& data, RooArgSet& nullPOI)
Expand Down

0 comments on commit f063bbf

Please sign in to comment.