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();