00001
00002
00003
00004
00005
00006
00007
00008 #include "TH1.h"
00009 #include "TF1.h"
00010 #include "TRandom3.h"
00011 #include "TVirtualFitter.h"
00012 #include "TStyle.h"
00013 #include "Minuit2/FCNBase.h"
00014 #include "TFitterMinuit.h"
00015 #include "TSystem.h"
00016 #include "TStopwatch.h"
00017
00018 #include <vector>
00019 #include <iostream>
00020
00021 class MyFCN : public ROOT::Minuit2::FCNBase {
00022
00023 public:
00024
00025 MyFCN(double a = 100, double b = 1) : fA(a), fB(b) {}
00026
00027 double operator() (const std::vector<double> & x) const {
00028
00029 return fA*(x[1] - x[0]*x[0])*(x[1] - x[0]*x[0]) + fB*(1 - x[0])*(1 - x[0]);
00030 }
00031
00032 double Up() const { return 1.; }
00033
00034 private:
00035
00036 double fA;
00037 double fB;
00038
00039 };
00040
00041 int testMinimize() {
00042
00043 gSystem->Load("libMinuit2");
00044
00045 TFitterMinuit * minuit = new TFitterMinuit();
00046
00047 MyFCN fcn;
00048 minuit->SetMinuitFCN(&fcn);
00049
00050 double startX = -1.2;
00051 double startY = 1.0;
00052
00053 minuit->SetParameter(0,"x",startX,0.1,0,0);
00054 minuit->SetParameter(1,"y",startY,0.1,0,0);
00055 minuit->SetPrintLevel(3);
00056
00057 minuit->CreateMinimizer();
00058 int iret = minuit->Minimize();
00059 if (iret != 0) {
00060 return iret;
00061 }
00062
00063 std::cout << "\nTest performances........\n\n";
00064
00065
00066 int nMin = 10000;
00067 TStopwatch w;
00068 w.Start();
00069 for (int i = 0; i < nMin; ++i) {
00070 minuit->Clear();
00071
00072
00073 minuit->SetParameter(0,"x",startX,0.1,0,0);
00074 minuit->SetParameter(1,"y",startY,0.1,0,0);
00075 minuit->SetPrintLevel(0);
00076
00077 minuit->CreateMinimizer();
00078 iret = minuit->Minimize();
00079 if (iret != 0) {
00080 std::cout << "Minimization failed - exit " ;
00081 return iret;
00082 }
00083 }
00084 w.Stop();
00085 std::cout << "\nTime: \t" << w.RealTime() << " , " << w.CpuTime() << std::endl;
00086 return 0;
00087 }
00088
00089 #ifndef __CINT__
00090 int main() {
00091 int iret = testMinimize();
00092 if (iret != 0) {
00093 std::cerr << "ERROR: Minimize test failed !" << std::endl;
00094 return iret;
00095 }
00096 return 0;
00097 }
00098 #endif