Created
April 2, 2024 08:11
-
-
Save VanyaBelyaev/05d461ad7076819f4cb550bde33b22ef to your computer and use it in GitHub Desktop.
problme with pythoinns PDF for new ROOT/cppyy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import ROOT, math | |
print ( 'ROOT version %s' % ROOT.gROOT.GetVersion() ) | |
ROOT.gInterpreter.Declare(''' | |
#include "RooAbsPdf.h" | |
class PyPdf : public RooAbsPdf | |
{ | |
public: | |
// ====================================================================== | |
ClassDefOverride(PyPdf, 2 ) ; | |
// ====================================================================== | |
public : | |
// ====================================================================== | |
PyPdf ( const char* name , | |
const char* title , | |
RooArgList& varlist ) | |
: RooAbsPdf ( name , title ) | |
, m_varlist ( "!varlist" , "All variables(list)" , this ) | |
{ | |
m_varlist.addTyped<RooAbsReal>( varlist ) ; | |
} | |
// copy constructor | |
PyPdf ( const PyPdf& right , const char* name = nullptr ) | |
: RooAbsPdf ( right , name ) | |
, m_varlist ( "!varlist" , this , right.m_varlist ) | |
{} | |
// virtual destructor | |
virtual ~PyPdf(){} ; | |
/// clone method | |
PyPdf* clone ( const char* name ) const override | |
{ return new PyPdf ( *this , name ) ; } | |
/// | |
const RooArgList& varlist () const { return m_varlist ; } | |
// | |
// the actual evaluation of function (will be redefiend ni python! | |
Double_t evaluate() const override | |
{ return 1 ; } | |
// | |
protected: | |
/// all variables as list of variables | |
RooListProxy m_varlist {} ; // all variables as list of variables | |
}; | |
ClassImp(PyPdf); | |
''') | |
class MyPdf(ROOT.PyPdf) : | |
def __init__ ( self , name , title , x , mean , sigma ) : | |
vlst = ROOT.RooArgList() | |
vlst.add ( x ) | |
vlst.add ( mean ) | |
vlst.add ( sigma ) | |
super(MyPdf,self).__init__ ( name , title, vlst ) | |
def evaluate ( self ) : | |
vars = self.varlist() | |
x = vars[0].getVal() | |
mean = vars[1].getVal() | |
sigma = vars[2].getVal() | |
dx = ( x - mean ) / sigma | |
return math.exp ( -0.5 * dx * dx ) | |
def clone ( self, newname ) : | |
if not newname : | |
newname = self.GetName () + '_clone' | |
vars = self.varlist() | |
x = vars[0] | |
mean = vars[1] | |
sigma = vars[2] | |
cl = MyPdf ( newname , self.GetTitle() , | |
x, mean , sigma ) | |
ROOT.SetOwnership ( cl , False ) ## NB! | |
return cl | |
xvar = ROOT.RooRealVar ( 'x' , 'observable' , 0 , 10 ) | |
mean = ROOT.RooRealVar ( 'mean' , 'gaussian mean' , 5 , 4, 6 ) | |
sigma = ROOT.RooRealVar ( 'sigma' , 'gaussian sigma' , 1.5 , 1 , 2 ) | |
gauss = ROOT.RooGaussian ( 'gauss' , 'gauss' , xvar, mean , sigma ) | |
varset = ROOT.RooArgSet ( xvar ) | |
dataset = gauss.generate ( varset , ROOT.RooFit.NumEvents ( 1000 ) ) | |
pars = ROOT.RooFit.Save() , ROOT.RooFit.Verbose ( False ) , ROOT.RooFit.PrintLevel ( -1 ) | |
print ( 'Fit with native C++ RooGaussian' ) | |
r_cpp = gauss.fitTo ( dataset , *pars ) | |
r_cpp.Print ( 'vvv') | |
pypdf = MyPdf ( 'pypdf' , 'my python pdf' , xvar , mean , sigma ) | |
print ( 'Fit with python Gaussian' ) | |
r_py = pypdf.fitTo ( dataset , *pars ) | |
r_py.Print ( 'vvv') | |
print ( 'after the fit with python Gaussian' ) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment