Skip to content

Instantly share code, notes, and snippets.

@VanyaBelyaev
Created April 2, 2024 08:11
Show Gist options
  • Save VanyaBelyaev/05d461ad7076819f4cb550bde33b22ef to your computer and use it in GitHub Desktop.
Save VanyaBelyaev/05d461ad7076819f4cb550bde33b22ef to your computer and use it in GitHub Desktop.
problme with pythoinns PDF for new ROOT/cppyy
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