Skip to content

hesse fails after calling getVal on nll #7659

@cburgard

Description

@cburgard

workspace.root.zip

Describe the bug

RooMinimizer::hesse() fails to find the correct hesse matrix if getVal has been used on the nll after minimize()

Expected behavior

The hesse matrix should be independent of the number of calls to getVal()

To Reproduce

Run this script on the attached workspace.

void test(){
  using namespace RooFit;
  
  TFile* infile = TFile::Open("workspace.root","READ");
  
  RooWorkspace * ws = (RooWorkspace*)(infile->Get("Test"));

  RooAbsData* data = ws->data("asimovData");
  RooAbsPdf* pdf = ws->pdf("simPdf");

  RooAbsReal* nll = pdf->createNLL(*data,NumCPU(1,3),Constrain(ws->argSet("norm_bkg,gamma_stat_CR_bin_0,gamma_stat_SR_bin_0,gamma_stat_SR_bin_1,gamma_stat_SR_bin_2,gamma_stat_SR_bin_3,gamma_stat_SR_bin_4,gamma_stat_SR_bin_5,gamma_stat_SR_bin_6,gamma_stat_SR_bin_7,gamma_stat_SR_bin_8,gamma_stat_SR_bin_9,gamma_stat_SR_bin_10,norm_bkg,gamma_stat_CR_bin_0,gamma_stat_SR_bin_0,gamma_stat_SR_bin_1,gamma_stat_SR_bin_2,gamma_stat_SR_bin_3,gamma_stat_SR_bin_4,gamma_stat_SR_bin_5,gamma_stat_SR_bin_6,gamma_stat_SR_bin_7,gamma_stat_SR_bin_8,gamma_stat_SR_bin_9,gamma_stat_SR_bin_10")),GlobalObservables(ws->argSet("nominalLumi,nom_gamma_stat_CR_bin_0,nom_gamma_stat_SR_bin_0,nom_gamma_stat_SR_bin_1,nom_gamma_stat_SR_bin_2,nom_gamma_stat_SR_bin_3,nom_gamma_stat_SR_bin_4,nom_gamma_stat_SR_bin_5,nom_gamma_stat_SR_bin_6,nom_gamma_stat_SR_bin_7,nom_gamma_stat_SR_bin_8,nom_gamma_stat_SR_bin_9,nom_gamma_stat_SR_bin_10,nominalLumi,nom_gamma_stat_CR_bin_0,nom_gamma_stat_SR_bin_0,nom_gamma_stat_SR_bin_1,nom_gamma_stat_SR_bin_2,nom_gamma_stat_SR_bin_3,nom_gamma_stat_SR_bin_4,nom_gamma_stat_SR_bin_5,nom_gamma_stat_SR_bin_6,nom_gamma_stat_SR_bin_7,nom_gamma_stat_SR_bin_8,nom_gamma_stat_SR_bin_9,nom_gamma_stat_SR_bin_10")));


  std::cout << "starting point : " << nll->getVal() << std::endl;
  RooArgSet params(*nll->getParameters((RooArgSet*)0));
  params.Print("v");
  
  gErrorIgnoreLevel = 0;
  ROOT::Minuit2::MnPrint::ClearFilter();
  ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(2);
  
  RooMinimizer mini(*nll);
  mini.setMaxFunctionCalls(10000);
  mini.setMaxIterations(175000);
  mini.setPrintLevel(2);
  mini.optimizeConst(1);
  mini.setMinimizerType("Minuit2");
  mini.setEvalErrorWall(1);
  mini.setOffsetting(1);
  mini.setPrintEvalErrors(5);
  mini.setVerbose(0);
  mini.setProfile(1);
  mini.setStrategy(2);
  mini.setEps(0.001);
  
  std::cout << "starting minimization" << std::endl;
  
  mini.minimize("Minuit2","Migrad");

  // the call to nll->getVal() here seems to break it
  std::cout << "nll val at minimum is " << nll->getVal() << std::endl;
  
  mini.hesse();
}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions