17 ClassImp(TMinuit2TraceObject);
19 TMinuit2TraceObject::TMinuit2TraceObject(
int parNumber) : ROOT::Minuit2::MnTraceObject(parNumber),
20 TNamed(
"Minuit2TraceObject",
"ROOT Trace Object for Minuit2"),
22 fHistoFval(0), fHistoEdm(0), fHistoParList(0),
23 fOldPad(0), fMinuitPad(0)
27 TMinuit2TraceObject::~TMinuit2TraceObject() {
29 if (fOldPad && gPad && fOldPad != gPad) gPad = fOldPad;
32 niter = int(fHistoFval->GetEntries()+0.5);
33 fHistoFval->GetXaxis()->SetRange(1,niter);
35 if (fHistoEdm) fHistoEdm->GetXaxis()->SetRange(1,niter);
37 for (
int i=0; i < fHistoParList->GetSize(); ++i) {
38 TH1 * h1 = (TH1*) fHistoParList->At(i);
39 if (h1) h1->GetXaxis()->SetRange(1,niter);
44 void TMinuit2TraceObject::Init(
const ROOT::Minuit2::MnUserParameterState & state) {
46 ROOT::Minuit2::MnTraceObject::Init(state);
51 if (fHistoFval)
delete fHistoFval;
52 if (fHistoEdm)
delete fHistoEdm;
53 if (fHistoParList) { fHistoParList->Delete();
delete fHistoParList; }
54 if (fMinuitPad)
delete fMinuitPad;
56 fHistoFval =
new TH1D(
"minuit2_hist_fval",
"Function Value/iteration",2,0,1);
57 fHistoEdm =
new TH1D(
"minuit2_hist_edm",
"Edm/iteration",2,0,1);
58 fHistoFval->SetCanExtend(TH1::kAllAxes);
59 fHistoEdm->SetCanExtend(TH1::kAllAxes);
62 fHistoParList =
new TList();
63 for (
unsigned int ipar = 0; ipar < state.Params().size(); ++ipar) {
64 if (state.Parameter(ipar).IsFixed() || state.Parameter(ipar).IsConst() )
continue;
65 TH1D * h1 =
new TH1D(TString::Format(
"minuit2_hist_par%d",ipar),TString::Format(
"Value of %s/iteration",state.Name(ipar)),2,0,1);
66 h1->SetCanExtend(TH1::kAllAxes);
67 fHistoParList->Add(h1);
72 if (gPad) fOldPad = gPad;
79 fHistoFval->Draw(
"hist");
83 void TMinuit2TraceObject::operator() (
int iter,
const ROOT::Minuit2::MinimumState & state) {
88 int lastIter = int( fHistoFval->GetEntries()+0.5);
92 if (iter == 0 && lastIter > 0)
93 fIterOffset = lastIter;
99 ROOT::Minuit2::MnTraceObject::operator()(iter,state);
102 fHistoFval->SetBinContent(iter+1,state.Fval());
103 fHistoEdm->SetBinContent(iter+1,state.Edm());
105 for (
unsigned int ipar = 0; ipar < state.Vec().size(); ++ipar) {
106 double eval = UserState().Trafo().Int2ext(ipar, state.Vec()(ipar) );
107 TH1 * histoPar = (TH1*) fHistoParList->At(ipar);
108 histoPar->SetBinContent(iter+1,eval);
112 if (ParNumber() == -2)
114 else if ( ParNumber() >= 0 && ParNumber() < fHistoParList->GetSize() ) {
115 fHistoParList->At(ParNumber() )->Draw();