/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * Authors:                                                                  *
 *   AL, Alfio Lazzaro,   INFN Milan,        alfio.lazzaro@mi.infn.it        *
 *                                                                           *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

#ifndef __ROOFIT_NOROOMINIMIZER

//////////////////////////////////////////////////////////////////////////////
//
// RooMinimizerFcn is am interface class to the ROOT::Math function 
// for minization.
//                                                                                   

#include <iostream>

#include "RooFit.h"
#include "RooMinimizerFcn.h"

#include "Riostream.h"

#include "TIterator.h"
#include "TClass.h"

#include "RooAbsArg.h"
#include "RooAbsPdf.h"
#include "RooArgSet.h"
#include "RooRealVar.h"
#include "RooAbsRealLValue.h"
#include "RooMsgService.h"

#include "RooMinimizer.h"

using namespace std;

RooMinimizerFcn::RooMinimizerFcn(RooAbsReal *funct, RooMinimizer* context,
			   bool verbose) :
  _funct(funct), _context(context),
  // Reset the *largest* negative log-likelihood value we have seen so far
  _maxFCN(-1e30), _numBadNLL(0),  
  _printEvalErrors(10), _doEvalErrorWall(kTRUE),
  _nDim(0), _logfile(0),
  _verbose(verbose)
{ 

  _evalCounter = 0 ;
  
  // Examine parameter list
  RooArgSet* paramSet = _funct->getParameters(RooArgSet());
  RooArgList paramList(*paramSet);
  delete paramSet;

  _floatParamList = (RooArgList*) paramList.selectByAttrib("Constant",kFALSE);
  if (_floatParamList->getSize()>1) {
    _floatParamList->sort();
  }
  _floatParamList->setName("floatParamList");

  _constParamList = (RooArgList*) paramList.selectByAttrib("Constant",kTRUE);
  if (_constParamList->getSize()>1) {
    _constParamList->sort();
  }
  _constParamList->setName("constParamList");

  // Remove all non-RooRealVar parameters from list (MINUIT cannot handle them)
  TIterator* pIter = _floatParamList->createIterator();
  RooAbsArg* arg;
  while ((arg=(RooAbsArg*)pIter->Next())) {
    if (!arg->IsA()->InheritsFrom(RooAbsRealLValue::Class())) {
      oocoutW(_context,Minimization) << "RooMinimizerFcn::RooMinimizerFcn: removing parameter " 
				     << arg->GetName()
                                     << " from list because it is not of type RooRealVar" << endl;
      _floatParamList->remove(*arg);
    }
  }
  delete pIter;

  _nDim = _floatParamList->getSize();

  updateFloatVec() ;
  
  // Save snapshot of initial lists
  _initFloatParamList = (RooArgList*) _floatParamList->snapshot(kFALSE) ;
  _initConstParamList = (RooArgList*) _constParamList->snapshot(kFALSE) ;

}



RooMinimizerFcn::RooMinimizerFcn(const RooMinimizerFcn& other) : ROOT::Math::IBaseFunctionMultiDim(other), 
  _evalCounter(other._evalCounter),
  _funct(other._funct),
  _context(other._context),
  _maxFCN(other._maxFCN),
  _numBadNLL(other._numBadNLL),
  _printEvalErrors(other._printEvalErrors),
  _doEvalErrorWall(other._doEvalErrorWall),
  _nDim(other._nDim),
  _logfile(other._logfile),
  _verbose(other._verbose),
  _floatParamVec(other._floatParamVec)
{  
  _floatParamList = new RooArgList(*other._floatParamList) ;
  _constParamList = new RooArgList(*other._constParamList) ;
  _initFloatParamList = (RooArgList*) other._initFloatParamList->snapshot(kFALSE) ;
  _initConstParamList = (RooArgList*) other._initConstParamList->snapshot(kFALSE) ;  
}


RooMinimizerFcn::~RooMinimizerFcn()
{
  delete _floatParamList;
  delete _initFloatParamList;
  delete _constParamList;
  delete _initConstParamList;
}


ROOT::Math::IBaseFunctionMultiDim* RooMinimizerFcn::Clone() const 
{  
  return new RooMinimizerFcn(*this) ;
}


Bool_t RooMinimizerFcn::Synchronize(std::vector<ROOT::Fit::ParameterSettings>& parameters, 
				 Bool_t optConst, Bool_t verbose)
{

  // Internal function to synchronize TMinimizer with current
  // information in RooAbsReal function parameters
  
  Bool_t constValChange(kFALSE) ;
  Bool_t constStatChange(kFALSE) ;
  
  Int_t index(0) ;
  
  // Handle eventual migrations from constParamList -> floatParamList
  for(index= 0; index < _constParamList->getSize() ; index++) {

    RooRealVar *par= dynamic_cast<RooRealVar*>(_constParamList->at(index)) ;
    if (!par) continue ;

    RooRealVar *oldpar= dynamic_cast<RooRealVar*>(_initConstParamList->at(index)) ;
    if (!oldpar) continue ;

    // Test if constness changed
    if (!par->isConstant()) {      
    
      // Remove from constList, add to floatList
      _constParamList->remove(*par) ;
      _floatParamList->add(*par) ;
      _initFloatParamList->addClone(*oldpar) ;      
      _initConstParamList->remove(*oldpar) ;
      constStatChange=kTRUE ;
      _nDim++ ;

      if (verbose) {
	oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: parameter " 
				     << par->GetName() << " is now floating." << endl ;
      }
    } 

    // Test if value changed
    if (par->getVal()!= oldpar->getVal()) {
      constValChange=kTRUE ;      
      if (verbose) {
	oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: value of constant parameter " 
				       << par->GetName() 
				       << " changed from " << oldpar->getVal() << " to " 
				       << par->getVal() << endl ;
      }
    }

  }

  // Update reference list
  *_initConstParamList = *_constParamList ;
  
  // Synchronize MINUIT with function state
  // Handle floatParamList
  for(index= 0; index < _floatParamList->getSize(); index++) {
    RooRealVar *par= dynamic_cast<RooRealVar*>(_floatParamList->at(index)) ;
    
    if (!par) continue ;

    Double_t pstep(0) ;
    Double_t pmin(0) ;
    Double_t pmax(0) ;

    if(!par->isConstant()) {

      // Verify that floating parameter is indeed of type RooRealVar 
      if (!par->IsA()->InheritsFrom(RooRealVar::Class())) {
	oocoutW(_context,Minimization) << "RooMinimizerFcn::fit: Error, non-constant parameter " 
				       << par->GetName() 
				       << " is not of type RooRealVar, skipping" << endl ;
	_floatParamList->remove(*par);
	index--;
	_nDim--;
	continue ;
      }

      // Set the limits, if not infinite
      if (par->hasMin() )
	pmin = par->getMin();
      if (par->hasMax() )
	pmax = par->getMax();
      
      // Calculate step size
      pstep = par->getError();
      if(pstep <= 0) {
	// Floating parameter without error estitimate
	if (par->hasMin() && par->hasMax()) {
	  pstep= 0.1*(pmax-pmin);

	  // Trim default choice of error if within 2 sigma of limit
	  if (pmax - par->getVal() < 2*pstep) {
	    pstep = (pmax - par->getVal())/2 ;
	  } else if (par->getVal() - pmin < 2*pstep) {
	    pstep = (par->getVal() - pmin )/2 ;	    
	  }	  

	  // If trimming results in zero error, restore default
	  if (pstep==0) {
	    pstep= 0.1*(pmax-pmin);
	  }

	} else {
	  pstep=1 ;
	}						  
	if(verbose) {
	  oocoutW(_context,Minimization) << "RooMinimizerFcn::synchronize: WARNING: no initial error estimate available for "
					 << par->GetName() << ": using " << pstep << endl;
	}
      }       
    } else {
      pmin = par->getVal() ;
      pmax = par->getVal() ;      
    }

    // new parameter
    if (index>=Int_t(parameters.size())) {

      if (par->hasMin() && par->hasMax()) {
	parameters.push_back(ROOT::Fit::ParameterSettings(par->GetName(),
							  par->getVal(),
							  pstep,
							  pmin,pmax));
      }
      else {
	parameters.push_back(ROOT::Fit::ParameterSettings(par->GetName(),
							  par->getVal(),
							  pstep));
        if (par->hasMin() ) 
           parameters.back().SetLowerLimit(pmin);
        else if (par->hasMax() ) 
           parameters.back().SetUpperLimit(pmax);
      }
      
      continue;

    }

    Bool_t oldFixed = parameters[index].IsFixed();
    Double_t oldVar = parameters[index].Value();
    Double_t oldVerr = parameters[index].StepSize();
    Double_t oldVlo = parameters[index].LowerLimit();
    Double_t oldVhi = parameters[index].UpperLimit();

    if (par->isConstant() && !oldFixed) {

      // Parameter changes floating -> constant : update only value if necessary
      if (oldVar!=par->getVal()) {
	parameters[index].SetValue(par->getVal());
	if (verbose) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: value of parameter " 
					 << par->GetName() << " changed from " << oldVar 
					 << " to " << par->getVal() << endl ;
	}
      }
      parameters[index].Fix();
      constStatChange=kTRUE ;
      if (verbose) {
	oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: parameter " 
				       << par->GetName() << " is now fixed." << endl ;
      }

    } else if (par->isConstant() && oldFixed) {
      
      // Parameter changes constant -> constant : update only value if necessary
      if (oldVar!=par->getVal()) {
	parameters[index].SetValue(par->getVal());
	constValChange=kTRUE ;

	if (verbose) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: value of fixed parameter " 
					 << par->GetName() << " changed from " << oldVar 
					 << " to " << par->getVal() << endl ;
	}
      }

    } else {
      // Parameter changes constant -> floating
      if (!par->isConstant() && oldFixed) {
	parameters[index].Release();
	constStatChange=kTRUE ;
	
	if (verbose) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: parameter " 
					 << par->GetName() << " is now floating." << endl ;
	}
      } 

      // Parameter changes constant -> floating : update all if necessary      
      if (oldVar!=par->getVal() || oldVlo!=pmin || oldVhi != pmax || oldVerr!=pstep) {
	parameters[index].SetValue(par->getVal()); 
	parameters[index].SetStepSize(pstep);
        if (par->hasMin() && par->hasMax() ) 
           parameters[index].SetLimits(pmin,pmax);  
        else if (par->hasMin() )
           parameters[index].SetLowerLimit(pmin);  
        else if (par->hasMax() )
           parameters[index].SetUpperLimit(pmax);  
      }

      // Inform user about changes in verbose mode
      if (verbose) {
	// if ierr<0, par was moved from the const list and a message was already printed

	if (oldVar!=par->getVal()) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: value of parameter " 
					 << par->GetName() << " changed from " << oldVar << " to " 
					 << par->getVal() << endl ;
	}
	if (oldVlo!=pmin || oldVhi!=pmax) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: limits of parameter " 
					 << par->GetName() << " changed from [" << oldVlo << "," << oldVhi 
					 << "] to [" << pmin << "," << pmax << "]" << endl ;
	}

	// If oldVerr=0, then parameter was previously fixed
	if (oldVerr!=pstep && oldVerr!=0) {
	  oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: error/step size of parameter " 
					 << par->GetName() << " changed from " << oldVerr << " to " << pstep << endl ;
	}
      }      
    }
  }

  if (optConst) {
    if (constStatChange) {

      RooAbsReal::setEvalErrorLoggingMode(RooAbsReal::CollectErrors) ;

      oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: set of constant parameters changed, rerunning const optimizer" << endl ;
      _funct->constOptimizeTestStatistic(RooAbsArg::ConfigChange) ;
    } else if (constValChange) {
      oocoutI(_context,Minimization) << "RooMinimizerFcn::synchronize: constant parameter values changed, rerunning const optimizer" << endl ;
      _funct->constOptimizeTestStatistic(RooAbsArg::ValueChange) ;
    }
    
    RooAbsReal::setEvalErrorLoggingMode(RooAbsReal::PrintErrors) ;  

  }

  updateFloatVec() ;

  return 0 ;  

}

Double_t RooMinimizerFcn::GetPdfParamVal(Int_t index)
{
  // Access PDF parameter value by ordinal index (needed by MINUIT)

  return ((RooRealVar*)_floatParamList->at(index))->getVal() ;
}

Double_t RooMinimizerFcn::GetPdfParamErr(Int_t index)
{
  // Access PDF parameter error by ordinal index (needed by MINUIT)
  return ((RooRealVar*)_floatParamList->at(index))->getError() ;
}


void RooMinimizerFcn::SetPdfParamErr(Int_t index, Double_t value)
{
  // Modify PDF parameter error by ordinal index (needed by MINUIT)

  ((RooRealVar*)_floatParamList->at(index))->setError(value) ;
}



void RooMinimizerFcn::ClearPdfParamAsymErr(Int_t index)
{
  // Modify PDF parameter error by ordinal index (needed by MINUIT)

  ((RooRealVar*)_floatParamList->at(index))->removeAsymError() ;
}


void RooMinimizerFcn::SetPdfParamErr(Int_t index, Double_t loVal, Double_t hiVal)
{
  // Modify PDF parameter error by ordinal index (needed by MINUIT)

  ((RooRealVar*)_floatParamList->at(index))->setAsymError(loVal,hiVal) ;
}


void RooMinimizerFcn::BackProp(const ROOT::Fit::FitResult &results)
{
  // Transfer MINUIT fit results back into RooFit objects

  for (Int_t index= 0; index < _nDim; index++) {
    Double_t value = results.Value(index);
    SetPdfParamVal(index, value);

    // Set the parabolic error    
    Double_t err = results.Error(index);
    SetPdfParamErr(index, err);
    
    Double_t eminus = results.LowerError(index);
    Double_t eplus = results.UpperError(index);

    if(eplus > 0 || eminus < 0) {
      // Store the asymmetric error, if it is available
      SetPdfParamErr(index, eminus,eplus);
    } else {
      // Clear the asymmetric error
      ClearPdfParamAsymErr(index) ;
    }
  }

}

Bool_t RooMinimizerFcn::SetLogFile(const char* inLogfile) 
{
  // Change the file name for logging of a RooMinimizer of all MINUIT steppings
  // through the parameter space. If inLogfile is null, the current log file
  // is closed and logging is stopped.

  if (_logfile) {
    oocoutI(_context,Minimization) << "RooMinimizerFcn::setLogFile: closing previous log file" << endl ;
    _logfile->close() ;
    delete _logfile ;
    _logfile = 0 ;
  }
  _logfile = new ofstream(inLogfile) ;
  if (!_logfile->good()) {
    oocoutI(_context,Minimization) << "RooMinimizerFcn::setLogFile: cannot open file " << inLogfile << endl ;
    _logfile->close() ;
    delete _logfile ;
    _logfile= 0;
  }  
  
  return kFALSE ;

}


void RooMinimizerFcn::ApplyCovarianceMatrix(TMatrixDSym& V) 
{
  // Apply results of given external covariance matrix. i.e. propagate its errors
  // to all RRV parameter representations and give this matrix instead of the
  // HESSE matrix at the next save() call

  for (Int_t i=0 ; i<_nDim ; i++) {
    // Skip fixed parameters
    if (_floatParamList->at(i)->isConstant()) {
      continue ;
    }
    SetPdfParamErr(i, sqrt(V(i,i))) ;		  
  }

}


Bool_t RooMinimizerFcn::SetPdfParamVal(const Int_t &index, const Double_t &value) const
{
  //RooRealVar* par = (RooRealVar*)_floatParamList->at(index);
  RooRealVar* par = (RooRealVar*)_floatParamVec[index] ;

  if (par->getVal()!=value) {
    if (_verbose) cout << par->GetName() << "=" << value << ", " ;
    
    par->setVal(value);
    return kTRUE;
  }

  return kFALSE;
}



//_____________________________________________________________________________
void RooMinimizerFcn::updateFloatVec() 
{
  _floatParamVec.clear() ;
  RooFIter iter = _floatParamList->fwdIterator() ;
  RooAbsArg* arg ;
  _floatParamVec = std::vector<RooAbsArg*>(_floatParamList->getSize()) ;
  Int_t i(0) ;
  while((arg=iter.next())) {
    _floatParamVec[i++] = arg ;
  }
}



double RooMinimizerFcn::DoEval(const double *x) const 
{

  // Set the parameter values for this iteration
  for (int index = 0; index < _nDim; index++) {
    if (_logfile) (*_logfile) << x[index] << " " ;
    SetPdfParamVal(index,x[index]);
  }

  // Calculate the function for these parameters  
  RooAbsReal::setHideOffset(kFALSE) ;
  double fvalue = _funct->getVal();
  RooAbsReal::setHideOffset(kTRUE) ;

  if (RooAbsPdf::evalError() || RooAbsReal::numEvalErrors()>0 || fvalue>1e30) {

    if (_printEvalErrors>=0) {

      if (_doEvalErrorWall) {
        oocoutW(_context,Minimization) << "RooMinimizerFcn: Minimized function has error status." << endl 
				       << "Returning maximum FCN so far (" << _maxFCN 
				       << ") to force MIGRAD to back out of this region. Error log follows" << endl ;
      } else {
        oocoutW(_context,Minimization) << "RooMinimizerFcn: Minimized function has error status but is ignored" << endl ;
      } 

      TIterator* iter = _floatParamList->createIterator() ;
      RooRealVar* var ;
      Bool_t first(kTRUE) ;
      ooccoutW(_context,Minimization) << "Parameter values: " ;
      while((var=(RooRealVar*)iter->Next())) {
        if (first) { first = kFALSE ; } else ooccoutW(_context,Minimization) << ", " ;
        ooccoutW(_context,Minimization) << var->GetName() << "=" << var->getVal() ;
      }
      delete iter ;
      ooccoutW(_context,Minimization) << endl ;
      
      RooAbsReal::printEvalErrors(ooccoutW(_context,Minimization),_printEvalErrors) ;
      ooccoutW(_context,Minimization) << endl ;
    } 

    if (_doEvalErrorWall) {
      fvalue = _maxFCN+1 ;
    }

    RooAbsPdf::clearEvalError() ;
    RooAbsReal::clearEvalErrorLog() ;
    _numBadNLL++ ;
  } else if (fvalue>_maxFCN) {
    _maxFCN = fvalue ;
  }
      
  // Optional logging
  if (_logfile) 
    (*_logfile) << setprecision(15) << fvalue << setprecision(4) << endl;
  if (_verbose) {
    cout << "\nprevFCN" << (_funct->isOffsetting()?"-offset":"") << " = " << setprecision(10) 
         << fvalue << setprecision(4) << "  " ;
    cout.flush() ;
  }

  _evalCounter++ ;

  return fvalue;
}

#endif

 RooMinimizerFcn.cxx:1
 RooMinimizerFcn.cxx:2
 RooMinimizerFcn.cxx:3
 RooMinimizerFcn.cxx:4
 RooMinimizerFcn.cxx:5
 RooMinimizerFcn.cxx:6
 RooMinimizerFcn.cxx:7
 RooMinimizerFcn.cxx:8
 RooMinimizerFcn.cxx:9
 RooMinimizerFcn.cxx:10
 RooMinimizerFcn.cxx:11
 RooMinimizerFcn.cxx:12
 RooMinimizerFcn.cxx:13
 RooMinimizerFcn.cxx:14
 RooMinimizerFcn.cxx:15
 RooMinimizerFcn.cxx:16
 RooMinimizerFcn.cxx:17
 RooMinimizerFcn.cxx:18
 RooMinimizerFcn.cxx:19
 RooMinimizerFcn.cxx:20
 RooMinimizerFcn.cxx:21
 RooMinimizerFcn.cxx:22
 RooMinimizerFcn.cxx:23
 RooMinimizerFcn.cxx:24
 RooMinimizerFcn.cxx:25
 RooMinimizerFcn.cxx:26
 RooMinimizerFcn.cxx:27
 RooMinimizerFcn.cxx:28
 RooMinimizerFcn.cxx:29
 RooMinimizerFcn.cxx:30
 RooMinimizerFcn.cxx:31
 RooMinimizerFcn.cxx:32
 RooMinimizerFcn.cxx:33
 RooMinimizerFcn.cxx:34
 RooMinimizerFcn.cxx:35
 RooMinimizerFcn.cxx:36
 RooMinimizerFcn.cxx:37
 RooMinimizerFcn.cxx:38
 RooMinimizerFcn.cxx:39
 RooMinimizerFcn.cxx:40
 RooMinimizerFcn.cxx:41
 RooMinimizerFcn.cxx:42
 RooMinimizerFcn.cxx:43
 RooMinimizerFcn.cxx:44
 RooMinimizerFcn.cxx:45
 RooMinimizerFcn.cxx:46
 RooMinimizerFcn.cxx:47
 RooMinimizerFcn.cxx:48
 RooMinimizerFcn.cxx:49
 RooMinimizerFcn.cxx:50
 RooMinimizerFcn.cxx:51
 RooMinimizerFcn.cxx:52
 RooMinimizerFcn.cxx:53
 RooMinimizerFcn.cxx:54
 RooMinimizerFcn.cxx:55
 RooMinimizerFcn.cxx:56
 RooMinimizerFcn.cxx:57
 RooMinimizerFcn.cxx:58
 RooMinimizerFcn.cxx:59
 RooMinimizerFcn.cxx:60
 RooMinimizerFcn.cxx:61
 RooMinimizerFcn.cxx:62
 RooMinimizerFcn.cxx:63
 RooMinimizerFcn.cxx:64
 RooMinimizerFcn.cxx:65
 RooMinimizerFcn.cxx:66
 RooMinimizerFcn.cxx:67
 RooMinimizerFcn.cxx:68
 RooMinimizerFcn.cxx:69
 RooMinimizerFcn.cxx:70
 RooMinimizerFcn.cxx:71
 RooMinimizerFcn.cxx:72
 RooMinimizerFcn.cxx:73
 RooMinimizerFcn.cxx:74
 RooMinimizerFcn.cxx:75
 RooMinimizerFcn.cxx:76
 RooMinimizerFcn.cxx:77
 RooMinimizerFcn.cxx:78
 RooMinimizerFcn.cxx:79
 RooMinimizerFcn.cxx:80
 RooMinimizerFcn.cxx:81
 RooMinimizerFcn.cxx:82
 RooMinimizerFcn.cxx:83
 RooMinimizerFcn.cxx:84
 RooMinimizerFcn.cxx:85
 RooMinimizerFcn.cxx:86
 RooMinimizerFcn.cxx:87
 RooMinimizerFcn.cxx:88
 RooMinimizerFcn.cxx:89
 RooMinimizerFcn.cxx:90
 RooMinimizerFcn.cxx:91
 RooMinimizerFcn.cxx:92
 RooMinimizerFcn.cxx:93
 RooMinimizerFcn.cxx:94
 RooMinimizerFcn.cxx:95
 RooMinimizerFcn.cxx:96
 RooMinimizerFcn.cxx:97
 RooMinimizerFcn.cxx:98
 RooMinimizerFcn.cxx:99
 RooMinimizerFcn.cxx:100
 RooMinimizerFcn.cxx:101
 RooMinimizerFcn.cxx:102
 RooMinimizerFcn.cxx:103
 RooMinimizerFcn.cxx:104
 RooMinimizerFcn.cxx:105
 RooMinimizerFcn.cxx:106
 RooMinimizerFcn.cxx:107
 RooMinimizerFcn.cxx:108
 RooMinimizerFcn.cxx:109
 RooMinimizerFcn.cxx:110
 RooMinimizerFcn.cxx:111
 RooMinimizerFcn.cxx:112
 RooMinimizerFcn.cxx:113
 RooMinimizerFcn.cxx:114
 RooMinimizerFcn.cxx:115
 RooMinimizerFcn.cxx:116
 RooMinimizerFcn.cxx:117
 RooMinimizerFcn.cxx:118
 RooMinimizerFcn.cxx:119
 RooMinimizerFcn.cxx:120
 RooMinimizerFcn.cxx:121
 RooMinimizerFcn.cxx:122
 RooMinimizerFcn.cxx:123
 RooMinimizerFcn.cxx:124
 RooMinimizerFcn.cxx:125
 RooMinimizerFcn.cxx:126
 RooMinimizerFcn.cxx:127
 RooMinimizerFcn.cxx:128
 RooMinimizerFcn.cxx:129
 RooMinimizerFcn.cxx:130
 RooMinimizerFcn.cxx:131
 RooMinimizerFcn.cxx:132
 RooMinimizerFcn.cxx:133
 RooMinimizerFcn.cxx:134
 RooMinimizerFcn.cxx:135
 RooMinimizerFcn.cxx:136
 RooMinimizerFcn.cxx:137
 RooMinimizerFcn.cxx:138
 RooMinimizerFcn.cxx:139
 RooMinimizerFcn.cxx:140
 RooMinimizerFcn.cxx:141
 RooMinimizerFcn.cxx:142
 RooMinimizerFcn.cxx:143
 RooMinimizerFcn.cxx:144
 RooMinimizerFcn.cxx:145
 RooMinimizerFcn.cxx:146
 RooMinimizerFcn.cxx:147
 RooMinimizerFcn.cxx:148
 RooMinimizerFcn.cxx:149
 RooMinimizerFcn.cxx:150
 RooMinimizerFcn.cxx:151
 RooMinimizerFcn.cxx:152
 RooMinimizerFcn.cxx:153
 RooMinimizerFcn.cxx:154
 RooMinimizerFcn.cxx:155
 RooMinimizerFcn.cxx:156
 RooMinimizerFcn.cxx:157
 RooMinimizerFcn.cxx:158
 RooMinimizerFcn.cxx:159
 RooMinimizerFcn.cxx:160
 RooMinimizerFcn.cxx:161
 RooMinimizerFcn.cxx:162
 RooMinimizerFcn.cxx:163
 RooMinimizerFcn.cxx:164
 RooMinimizerFcn.cxx:165
 RooMinimizerFcn.cxx:166
 RooMinimizerFcn.cxx:167
 RooMinimizerFcn.cxx:168
 RooMinimizerFcn.cxx:169
 RooMinimizerFcn.cxx:170
 RooMinimizerFcn.cxx:171
 RooMinimizerFcn.cxx:172
 RooMinimizerFcn.cxx:173
 RooMinimizerFcn.cxx:174
 RooMinimizerFcn.cxx:175
 RooMinimizerFcn.cxx:176
 RooMinimizerFcn.cxx:177
 RooMinimizerFcn.cxx:178
 RooMinimizerFcn.cxx:179
 RooMinimizerFcn.cxx:180
 RooMinimizerFcn.cxx:181
 RooMinimizerFcn.cxx:182
 RooMinimizerFcn.cxx:183
 RooMinimizerFcn.cxx:184
 RooMinimizerFcn.cxx:185
 RooMinimizerFcn.cxx:186
 RooMinimizerFcn.cxx:187
 RooMinimizerFcn.cxx:188
 RooMinimizerFcn.cxx:189
 RooMinimizerFcn.cxx:190
 RooMinimizerFcn.cxx:191
 RooMinimizerFcn.cxx:192
 RooMinimizerFcn.cxx:193
 RooMinimizerFcn.cxx:194
 RooMinimizerFcn.cxx:195
 RooMinimizerFcn.cxx:196
 RooMinimizerFcn.cxx:197
 RooMinimizerFcn.cxx:198
 RooMinimizerFcn.cxx:199
 RooMinimizerFcn.cxx:200
 RooMinimizerFcn.cxx:201
 RooMinimizerFcn.cxx:202
 RooMinimizerFcn.cxx:203
 RooMinimizerFcn.cxx:204
 RooMinimizerFcn.cxx:205
 RooMinimizerFcn.cxx:206
 RooMinimizerFcn.cxx:207
 RooMinimizerFcn.cxx:208
 RooMinimizerFcn.cxx:209
 RooMinimizerFcn.cxx:210
 RooMinimizerFcn.cxx:211
 RooMinimizerFcn.cxx:212
 RooMinimizerFcn.cxx:213
 RooMinimizerFcn.cxx:214
 RooMinimizerFcn.cxx:215
 RooMinimizerFcn.cxx:216
 RooMinimizerFcn.cxx:217
 RooMinimizerFcn.cxx:218
 RooMinimizerFcn.cxx:219
 RooMinimizerFcn.cxx:220
 RooMinimizerFcn.cxx:221
 RooMinimizerFcn.cxx:222
 RooMinimizerFcn.cxx:223
 RooMinimizerFcn.cxx:224
 RooMinimizerFcn.cxx:225
 RooMinimizerFcn.cxx:226
 RooMinimizerFcn.cxx:227
 RooMinimizerFcn.cxx:228
 RooMinimizerFcn.cxx:229
 RooMinimizerFcn.cxx:230
 RooMinimizerFcn.cxx:231
 RooMinimizerFcn.cxx:232
 RooMinimizerFcn.cxx:233
 RooMinimizerFcn.cxx:234
 RooMinimizerFcn.cxx:235
 RooMinimizerFcn.cxx:236
 RooMinimizerFcn.cxx:237
 RooMinimizerFcn.cxx:238
 RooMinimizerFcn.cxx:239
 RooMinimizerFcn.cxx:240
 RooMinimizerFcn.cxx:241
 RooMinimizerFcn.cxx:242
 RooMinimizerFcn.cxx:243
 RooMinimizerFcn.cxx:244
 RooMinimizerFcn.cxx:245
 RooMinimizerFcn.cxx:246
 RooMinimizerFcn.cxx:247
 RooMinimizerFcn.cxx:248
 RooMinimizerFcn.cxx:249
 RooMinimizerFcn.cxx:250
 RooMinimizerFcn.cxx:251
 RooMinimizerFcn.cxx:252
 RooMinimizerFcn.cxx:253
 RooMinimizerFcn.cxx:254
 RooMinimizerFcn.cxx:255
 RooMinimizerFcn.cxx:256
 RooMinimizerFcn.cxx:257
 RooMinimizerFcn.cxx:258
 RooMinimizerFcn.cxx:259
 RooMinimizerFcn.cxx:260
 RooMinimizerFcn.cxx:261
 RooMinimizerFcn.cxx:262
 RooMinimizerFcn.cxx:263
 RooMinimizerFcn.cxx:264
 RooMinimizerFcn.cxx:265
 RooMinimizerFcn.cxx:266
 RooMinimizerFcn.cxx:267
 RooMinimizerFcn.cxx:268
 RooMinimizerFcn.cxx:269
 RooMinimizerFcn.cxx:270
 RooMinimizerFcn.cxx:271
 RooMinimizerFcn.cxx:272
 RooMinimizerFcn.cxx:273
 RooMinimizerFcn.cxx:274
 RooMinimizerFcn.cxx:275
 RooMinimizerFcn.cxx:276
 RooMinimizerFcn.cxx:277
 RooMinimizerFcn.cxx:278
 RooMinimizerFcn.cxx:279
 RooMinimizerFcn.cxx:280
 RooMinimizerFcn.cxx:281
 RooMinimizerFcn.cxx:282
 RooMinimizerFcn.cxx:283
 RooMinimizerFcn.cxx:284
 RooMinimizerFcn.cxx:285
 RooMinimizerFcn.cxx:286
 RooMinimizerFcn.cxx:287
 RooMinimizerFcn.cxx:288
 RooMinimizerFcn.cxx:289
 RooMinimizerFcn.cxx:290
 RooMinimizerFcn.cxx:291
 RooMinimizerFcn.cxx:292
 RooMinimizerFcn.cxx:293
 RooMinimizerFcn.cxx:294
 RooMinimizerFcn.cxx:295
 RooMinimizerFcn.cxx:296
 RooMinimizerFcn.cxx:297
 RooMinimizerFcn.cxx:298
 RooMinimizerFcn.cxx:299
 RooMinimizerFcn.cxx:300
 RooMinimizerFcn.cxx:301
 RooMinimizerFcn.cxx:302
 RooMinimizerFcn.cxx:303
 RooMinimizerFcn.cxx:304
 RooMinimizerFcn.cxx:305
 RooMinimizerFcn.cxx:306
 RooMinimizerFcn.cxx:307
 RooMinimizerFcn.cxx:308
 RooMinimizerFcn.cxx:309
 RooMinimizerFcn.cxx:310
 RooMinimizerFcn.cxx:311
 RooMinimizerFcn.cxx:312
 RooMinimizerFcn.cxx:313
 RooMinimizerFcn.cxx:314
 RooMinimizerFcn.cxx:315
 RooMinimizerFcn.cxx:316
 RooMinimizerFcn.cxx:317
 RooMinimizerFcn.cxx:318
 RooMinimizerFcn.cxx:319
 RooMinimizerFcn.cxx:320
 RooMinimizerFcn.cxx:321
 RooMinimizerFcn.cxx:322
 RooMinimizerFcn.cxx:323
 RooMinimizerFcn.cxx:324
 RooMinimizerFcn.cxx:325
 RooMinimizerFcn.cxx:326
 RooMinimizerFcn.cxx:327
 RooMinimizerFcn.cxx:328
 RooMinimizerFcn.cxx:329
 RooMinimizerFcn.cxx:330
 RooMinimizerFcn.cxx:331
 RooMinimizerFcn.cxx:332
 RooMinimizerFcn.cxx:333
 RooMinimizerFcn.cxx:334
 RooMinimizerFcn.cxx:335
 RooMinimizerFcn.cxx:336
 RooMinimizerFcn.cxx:337
 RooMinimizerFcn.cxx:338
 RooMinimizerFcn.cxx:339
 RooMinimizerFcn.cxx:340
 RooMinimizerFcn.cxx:341
 RooMinimizerFcn.cxx:342
 RooMinimizerFcn.cxx:343
 RooMinimizerFcn.cxx:344
 RooMinimizerFcn.cxx:345
 RooMinimizerFcn.cxx:346
 RooMinimizerFcn.cxx:347
 RooMinimizerFcn.cxx:348
 RooMinimizerFcn.cxx:349
 RooMinimizerFcn.cxx:350
 RooMinimizerFcn.cxx:351
 RooMinimizerFcn.cxx:352
 RooMinimizerFcn.cxx:353
 RooMinimizerFcn.cxx:354
 RooMinimizerFcn.cxx:355
 RooMinimizerFcn.cxx:356
 RooMinimizerFcn.cxx:357
 RooMinimizerFcn.cxx:358
 RooMinimizerFcn.cxx:359
 RooMinimizerFcn.cxx:360
 RooMinimizerFcn.cxx:361
 RooMinimizerFcn.cxx:362
 RooMinimizerFcn.cxx:363
 RooMinimizerFcn.cxx:364
 RooMinimizerFcn.cxx:365
 RooMinimizerFcn.cxx:366
 RooMinimizerFcn.cxx:367
 RooMinimizerFcn.cxx:368
 RooMinimizerFcn.cxx:369
 RooMinimizerFcn.cxx:370
 RooMinimizerFcn.cxx:371
 RooMinimizerFcn.cxx:372
 RooMinimizerFcn.cxx:373
 RooMinimizerFcn.cxx:374
 RooMinimizerFcn.cxx:375
 RooMinimizerFcn.cxx:376
 RooMinimizerFcn.cxx:377
 RooMinimizerFcn.cxx:378
 RooMinimizerFcn.cxx:379
 RooMinimizerFcn.cxx:380
 RooMinimizerFcn.cxx:381
 RooMinimizerFcn.cxx:382
 RooMinimizerFcn.cxx:383
 RooMinimizerFcn.cxx:384
 RooMinimizerFcn.cxx:385
 RooMinimizerFcn.cxx:386
 RooMinimizerFcn.cxx:387
 RooMinimizerFcn.cxx:388
 RooMinimizerFcn.cxx:389
 RooMinimizerFcn.cxx:390
 RooMinimizerFcn.cxx:391
 RooMinimizerFcn.cxx:392
 RooMinimizerFcn.cxx:393
 RooMinimizerFcn.cxx:394
 RooMinimizerFcn.cxx:395
 RooMinimizerFcn.cxx:396
 RooMinimizerFcn.cxx:397
 RooMinimizerFcn.cxx:398
 RooMinimizerFcn.cxx:399
 RooMinimizerFcn.cxx:400
 RooMinimizerFcn.cxx:401
 RooMinimizerFcn.cxx:402
 RooMinimizerFcn.cxx:403
 RooMinimizerFcn.cxx:404
 RooMinimizerFcn.cxx:405
 RooMinimizerFcn.cxx:406
 RooMinimizerFcn.cxx:407
 RooMinimizerFcn.cxx:408
 RooMinimizerFcn.cxx:409
 RooMinimizerFcn.cxx:410
 RooMinimizerFcn.cxx:411
 RooMinimizerFcn.cxx:412
 RooMinimizerFcn.cxx:413
 RooMinimizerFcn.cxx:414
 RooMinimizerFcn.cxx:415
 RooMinimizerFcn.cxx:416
 RooMinimizerFcn.cxx:417
 RooMinimizerFcn.cxx:418
 RooMinimizerFcn.cxx:419
 RooMinimizerFcn.cxx:420
 RooMinimizerFcn.cxx:421
 RooMinimizerFcn.cxx:422
 RooMinimizerFcn.cxx:423
 RooMinimizerFcn.cxx:424
 RooMinimizerFcn.cxx:425
 RooMinimizerFcn.cxx:426
 RooMinimizerFcn.cxx:427
 RooMinimizerFcn.cxx:428
 RooMinimizerFcn.cxx:429
 RooMinimizerFcn.cxx:430
 RooMinimizerFcn.cxx:431
 RooMinimizerFcn.cxx:432
 RooMinimizerFcn.cxx:433
 RooMinimizerFcn.cxx:434
 RooMinimizerFcn.cxx:435
 RooMinimizerFcn.cxx:436
 RooMinimizerFcn.cxx:437
 RooMinimizerFcn.cxx:438
 RooMinimizerFcn.cxx:439
 RooMinimizerFcn.cxx:440
 RooMinimizerFcn.cxx:441
 RooMinimizerFcn.cxx:442
 RooMinimizerFcn.cxx:443
 RooMinimizerFcn.cxx:444
 RooMinimizerFcn.cxx:445
 RooMinimizerFcn.cxx:446
 RooMinimizerFcn.cxx:447
 RooMinimizerFcn.cxx:448
 RooMinimizerFcn.cxx:449
 RooMinimizerFcn.cxx:450
 RooMinimizerFcn.cxx:451
 RooMinimizerFcn.cxx:452
 RooMinimizerFcn.cxx:453
 RooMinimizerFcn.cxx:454
 RooMinimizerFcn.cxx:455
 RooMinimizerFcn.cxx:456
 RooMinimizerFcn.cxx:457
 RooMinimizerFcn.cxx:458
 RooMinimizerFcn.cxx:459
 RooMinimizerFcn.cxx:460
 RooMinimizerFcn.cxx:461
 RooMinimizerFcn.cxx:462
 RooMinimizerFcn.cxx:463
 RooMinimizerFcn.cxx:464
 RooMinimizerFcn.cxx:465
 RooMinimizerFcn.cxx:466
 RooMinimizerFcn.cxx:467
 RooMinimizerFcn.cxx:468
 RooMinimizerFcn.cxx:469
 RooMinimizerFcn.cxx:470
 RooMinimizerFcn.cxx:471
 RooMinimizerFcn.cxx:472
 RooMinimizerFcn.cxx:473
 RooMinimizerFcn.cxx:474
 RooMinimizerFcn.cxx:475
 RooMinimizerFcn.cxx:476
 RooMinimizerFcn.cxx:477
 RooMinimizerFcn.cxx:478
 RooMinimizerFcn.cxx:479
 RooMinimizerFcn.cxx:480
 RooMinimizerFcn.cxx:481
 RooMinimizerFcn.cxx:482
 RooMinimizerFcn.cxx:483
 RooMinimizerFcn.cxx:484
 RooMinimizerFcn.cxx:485
 RooMinimizerFcn.cxx:486
 RooMinimizerFcn.cxx:487
 RooMinimizerFcn.cxx:488
 RooMinimizerFcn.cxx:489
 RooMinimizerFcn.cxx:490
 RooMinimizerFcn.cxx:491
 RooMinimizerFcn.cxx:492
 RooMinimizerFcn.cxx:493
 RooMinimizerFcn.cxx:494
 RooMinimizerFcn.cxx:495
 RooMinimizerFcn.cxx:496
 RooMinimizerFcn.cxx:497
 RooMinimizerFcn.cxx:498
 RooMinimizerFcn.cxx:499
 RooMinimizerFcn.cxx:500
 RooMinimizerFcn.cxx:501
 RooMinimizerFcn.cxx:502
 RooMinimizerFcn.cxx:503
 RooMinimizerFcn.cxx:504
 RooMinimizerFcn.cxx:505
 RooMinimizerFcn.cxx:506
 RooMinimizerFcn.cxx:507
 RooMinimizerFcn.cxx:508
 RooMinimizerFcn.cxx:509
 RooMinimizerFcn.cxx:510
 RooMinimizerFcn.cxx:511
 RooMinimizerFcn.cxx:512
 RooMinimizerFcn.cxx:513
 RooMinimizerFcn.cxx:514
 RooMinimizerFcn.cxx:515
 RooMinimizerFcn.cxx:516
 RooMinimizerFcn.cxx:517
 RooMinimizerFcn.cxx:518
 RooMinimizerFcn.cxx:519
 RooMinimizerFcn.cxx:520
 RooMinimizerFcn.cxx:521
 RooMinimizerFcn.cxx:522
 RooMinimizerFcn.cxx:523
 RooMinimizerFcn.cxx:524
 RooMinimizerFcn.cxx:525
 RooMinimizerFcn.cxx:526
 RooMinimizerFcn.cxx:527
 RooMinimizerFcn.cxx:528
 RooMinimizerFcn.cxx:529
 RooMinimizerFcn.cxx:530
 RooMinimizerFcn.cxx:531
 RooMinimizerFcn.cxx:532
 RooMinimizerFcn.cxx:533
 RooMinimizerFcn.cxx:534
 RooMinimizerFcn.cxx:535
 RooMinimizerFcn.cxx:536
 RooMinimizerFcn.cxx:537
 RooMinimizerFcn.cxx:538
 RooMinimizerFcn.cxx:539
 RooMinimizerFcn.cxx:540
 RooMinimizerFcn.cxx:541
 RooMinimizerFcn.cxx:542
 RooMinimizerFcn.cxx:543
 RooMinimizerFcn.cxx:544
 RooMinimizerFcn.cxx:545
 RooMinimizerFcn.cxx:546
 RooMinimizerFcn.cxx:547
 RooMinimizerFcn.cxx:548
 RooMinimizerFcn.cxx:549
 RooMinimizerFcn.cxx:550
 RooMinimizerFcn.cxx:551
 RooMinimizerFcn.cxx:552
 RooMinimizerFcn.cxx:553
 RooMinimizerFcn.cxx:554
 RooMinimizerFcn.cxx:555
 RooMinimizerFcn.cxx:556
 RooMinimizerFcn.cxx:557
 RooMinimizerFcn.cxx:558
 RooMinimizerFcn.cxx:559
 RooMinimizerFcn.cxx:560
 RooMinimizerFcn.cxx:561
 RooMinimizerFcn.cxx:562
 RooMinimizerFcn.cxx:563
 RooMinimizerFcn.cxx:564
 RooMinimizerFcn.cxx:565
 RooMinimizerFcn.cxx:566
 RooMinimizerFcn.cxx:567
 RooMinimizerFcn.cxx:568
 RooMinimizerFcn.cxx:569
 RooMinimizerFcn.cxx:570
 RooMinimizerFcn.cxx:571
 RooMinimizerFcn.cxx:572
 RooMinimizerFcn.cxx:573
 RooMinimizerFcn.cxx:574
 RooMinimizerFcn.cxx:575
 RooMinimizerFcn.cxx:576
 RooMinimizerFcn.cxx:577
 RooMinimizerFcn.cxx:578
 RooMinimizerFcn.cxx:579
 RooMinimizerFcn.cxx:580
 RooMinimizerFcn.cxx:581
 RooMinimizerFcn.cxx:582
 RooMinimizerFcn.cxx:583
 RooMinimizerFcn.cxx:584
 RooMinimizerFcn.cxx:585