#ifndef TEST_H #define TEST_H #include #include #include #include #include #include #include #include #include #include #include #include "Minuit2/Minuit2Minimizer.h" #include "Math/Functor.h" const double pionmass = 0.1349766; class Test : public TObject { private: // Variables int m_vars; int m_nEntries; ROOT::Minuit2::Minuit2Minimizer* gMinuit; ROOT::Math::IMultiGenFunction * fFunc; double fcn( const double* ); public: // Constructors and configuration Test() : gMinuit(0), fFunc(0) {} virtual ~Test() { if (gMinuit) delete gMinuit; if (fFunc) delete fFunc; } void configureMinuit( const int ); int addVar( const int varNum , const TString varName , const float initialValue ); int minimize(); ClassDef( Test , 1 ); }; #endif //#include "Test.h" #if !defined( __CINT__ ) ClassImp( Test ); #endif void Test::configureMinuit( const int nVars ){ gMinuit = new ROOT::Minuit2::Minuit2Minimizer( ROOT::Minuit2::kMigrad ); //ROOT::Math::Functor f( this , &Test::fcn , nVars ); // need to have the function object available during the minimization fFunc = new ROOT::Math::Functor ( this , &Test::fcn , nVars ); m_vars = nVars; //gMinuit->SetFunction( f ); gMinuit->SetFunction( *fFunc ); // Setting value of UP parameter gMinuit->SetErrorDef( 1.0 ); gMinuit->SetMaxFunctionCalls(10000000); gMinuit->SetMaxIterations(100000); gMinuit->SetTolerance(10); } int Test::addVar( const int varNum , const TString varName , const float initialValue ){ gMinuit->SetLimitedVariable( varNum , varName.Data() , initialValue , 0.01 , 0.80 , 1.20 ); return 1; } int Test::minimize(){ time_t tstart, tend; tstart = time(0); gMinuit->Minimize(); tend = time(0); std::cout << "The calibration took " << difftime( tend, tstart ) << " seconds" << std::endl; return 1; } double Test::fcn( const double *par ){ return par[0]*par[0]; }