RooCFunction3Binding.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  *    File: $Id: RooCFunction3Binding.cxx 25185 2008-08-20 14:00:42Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, NIKHEF, verkerke@nikhef.nl                         *
00007  *                                                                           *
00008  * Copyright (c) 2000-2008, NIKHEF, Regents of the University of California  *
00009  *                          and Stanford University. All rights reserved.    *
00010  *                                                                           *
00011  *****************************************************************************/
00012 
00013 //////////////////////////////////////////////////////////////////////////////
00014 // 
00015 // BEGIN_HTML
00016 // RooCFunction3Binding is a templated implementation of class RooAbsReal that binds 
00017 // generic C(++) functions to a RooAbsReal argument thus allowing generic C++
00018 // functions to be used as RooFit functions. Instances of function binding
00019 // classes are fully functional RooFit function objects with one exception:
00020 // if the bound function is _not_ a standard TMath or MathMore function the
00021 // class cannot be persisted in a RooWorkspace without registering the function
00022 // pointer first using RooCFunction3Binding<T1,T2,T3,T4>::register().
00023 // END_HTML
00024 //
00025 
00026 #include "Riostream.h" 
00027 #include "RooCFunction3Binding.h" 
00028 #include "RooCintUtils.h"
00029 
00030 using namespace std ;
00031 
00032 #ifndef ROOFIT_R__NO_CLASS_TEMPLATE_SPECIALIZATION
00033 #define ROOFIT_R__NO_CLASS_TEMPLATE_SPECIALIZATION
00034 templateClassImp(RooCFunction3Binding) 
00035 templateClassImp(RooCFunction3Ref) 
00036 #endif 
00037 
00038 
00039 template<> RooCFunction3Map<double,double,double,double>* RooCFunction3Ref<double,double,double,double>::_fmap = 0 ;
00040 template<> RooCFunction3Map<double,double,double,bool>* RooCFunction3Ref<double,double,double,bool>::_fmap = 0 ;
00041 template<> RooCFunction3Map<double,double,int,int>* RooCFunction3Ref<double,double,int,int>::_fmap = 0 ;
00042 template<> RooCFunction3Map<double,unsigned int,double,unsigned int>* RooCFunction3Ref<double,unsigned int,double,unsigned int>::_fmap = 0 ;
00043 template<> RooCFunction3Map<double,unsigned int,double,double>* RooCFunction3Ref<double,unsigned int,double,double>::_fmap = 0 ;
00044 template<> RooCFunction3Map<double,unsigned int,unsigned int,double>* RooCFunction3Ref<double,unsigned int,unsigned int,double>::_fmap = 0 ;
00045 
00046 namespace RooFit {
00047 
00048   RooAbsReal* bindFunction(const char* name,void* func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00049     // This function is for use in CINT, which does not properly handly
00050     // overloading on function pointer types, so we do it here explicitly
00051     if (RooCintUtils::matchFuncPtrArgs(func,"double,double,double")) return new RooCFunction3Binding<Double_t,Double_t,Double_t,Double_t>(name,name,(CFUNCD3DDD)func,x,y,z) ;
00052     if (RooCintUtils::matchFuncPtrArgs(func,"double,double,bool")) return new RooCFunction3Binding<Double_t,Double_t,Double_t,Bool_t>(name,name,(CFUNCD3DDB)func,x,y,z) ;
00053     if (RooCintUtils::matchFuncPtrArgs(func,"double,int,int")) return new RooCFunction3Binding<Double_t,Double_t,Int_t,Int_t>(name,name,(CFUNCD3DII)func,x,y,z) ;
00054     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,double,unsigned int")) return new RooCFunction3Binding<Double_t,UInt_t,Double_t,UInt_t>(name,name,(CFUNCD3UDU)func,x,y,z) ;
00055     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,double,double")) return new RooCFunction3Binding<Double_t,UInt_t,Double_t,Double_t>(name,name,(CFUNCD3UDD)func,x,y,z) ;
00056     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,unsigned int,double")) return new RooCFunction3Binding<Double_t,UInt_t,UInt_t,Double_t>(name,name,(CFUNCD3UUD)func,x,y,z) ;
00057     oocoutE((TObject*)0,InputArguments) << "bindFunction::ERROR No matching RooCFunction3Binding<> class found for function " << RooCintUtils::functionName(func) << endl ;
00058     return 0 ;
00059   }
00060 
00061   RooAbsReal* bindFunction(const char* name,CFUNCD3DDD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00062     return new RooCFunction3Binding<Double_t,Double_t,Double_t,Double_t>(name,name,func,x,y,z) ;
00063   }
00064 
00065   RooAbsReal* bindFunction(const char* name,CFUNCD3DDB func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00066     return new RooCFunction3Binding<Double_t,Double_t,Double_t,Bool_t>(name,name,func,x,y,z) ;
00067   }
00068 
00069   RooAbsReal* bindFunction(const char* name,CFUNCD3DII func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00070     return new RooCFunction3Binding<Double_t,Double_t,Int_t,Int_t>(name,name,func,x,y,z) ;
00071   }
00072 
00073   RooAbsReal* bindFunction(const char* name,CFUNCD3UDU func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00074     return new RooCFunction3Binding<Double_t,UInt_t,Double_t,UInt_t>(name,name,func,x,y,z) ;
00075   }
00076 
00077   RooAbsReal* bindFunction(const char* name,CFUNCD3UDD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00078     return new RooCFunction3Binding<Double_t,UInt_t,Double_t,Double_t>(name,name,func,x,y,z) ;
00079   }
00080 
00081   RooAbsReal* bindFunction(const char* name,CFUNCD3UUD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00082     return new RooCFunction3Binding<Double_t,UInt_t,UInt_t,Double_t>(name,name,func,x,y,z) ;
00083   }
00084 
00085 
00086   RooAbsPdf* bindPdf(const char* name,void* func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00087     // This function is for use in CINT, which does not properly handly
00088     // overloading on function pointer types, so we do it here explicitly
00089     if (RooCintUtils::matchFuncPtrArgs(func,"double,double,double")) return new RooCFunction3PdfBinding<Double_t,Double_t,Double_t,Double_t>(name,name,(CFUNCD3DDD)func,x,y,z) ;
00090     if (RooCintUtils::matchFuncPtrArgs(func,"double,double,bool")) return new RooCFunction3PdfBinding<Double_t,Double_t,Double_t,Bool_t>(name,name,(CFUNCD3DDB)func,x,y,z) ;
00091     if (RooCintUtils::matchFuncPtrArgs(func,"double,int,int")) return new RooCFunction3PdfBinding<Double_t,Double_t,Int_t,Int_t>(name,name,(CFUNCD3DII)func,x,y,z) ;
00092     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,double,unsigned int")) return new RooCFunction3PdfBinding<Double_t,UInt_t,Double_t,UInt_t>(name,name,(CFUNCD3UDU)func,x,y,z) ;
00093     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,double,double")) return new RooCFunction3PdfBinding<Double_t,UInt_t,Double_t,Double_t>(name,name,(CFUNCD3UDD)func,x,y,z) ;
00094     if (RooCintUtils::matchFuncPtrArgs(func,"unsigned int,unsigned int,double")) return new RooCFunction3PdfBinding<Double_t,UInt_t,UInt_t,Double_t>(name,name,(CFUNCD3UUD)func,x,y,z) ;
00095     oocoutE((TObject*)0,InputArguments) << "bindPdf::ERROR No matching RooCFunction3PdfBinding<> class found for function " << RooCintUtils::functionName(func) << endl ;
00096     return 0 ;
00097   }
00098 
00099   RooAbsPdf* bindPdf(const char* name,CFUNCD3DDD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00100     return new RooCFunction3PdfBinding<Double_t,Double_t,Double_t,Double_t>(name,name,func,x,y,z) ;
00101   }
00102 
00103   RooAbsPdf* bindPdf(const char* name,CFUNCD3DDB func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00104     return new RooCFunction3PdfBinding<Double_t,Double_t,Double_t,Bool_t>(name,name,func,x,y,z) ;
00105   }
00106 
00107   RooAbsPdf* bindPdf(const char* name,CFUNCD3DII func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00108     return new RooCFunction3PdfBinding<Double_t,Double_t,Int_t,Int_t>(name,name,func,x,y,z) ;
00109   }
00110 
00111   RooAbsPdf* bindPdf(const char* name,CFUNCD3UDU func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00112     return new RooCFunction3PdfBinding<Double_t,UInt_t,Double_t,UInt_t>(name,name,func,x,y,z) ;
00113   }
00114 
00115   RooAbsPdf* bindPdf(const char* name,CFUNCD3UDD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00116     return new RooCFunction3PdfBinding<Double_t,UInt_t,Double_t,Double_t>(name,name,func,x,y,z) ;
00117   }
00118 
00119   RooAbsPdf* bindPdf(const char* name,CFUNCD3UUD func,RooAbsReal& x, RooAbsReal& y, RooAbsReal& z) {
00120     return new RooCFunction3PdfBinding<Double_t,UInt_t,UInt_t,Double_t>(name,name,func,x,y,z) ;
00121   }
00122 
00123 }

Generated on Tue Jul 5 14:55:02 2011 for ROOT_528-00b_version by  doxygen 1.5.1