Problem with Minuit Migrad

[code]vector *xVecPtr=new vector();
TH1F *Ele,*Pro;

double fe(Int_t x){
double e=Ele->GetBinContent(x);
return e;
}

double fp(Int_t x){
double p=Pro->GetBinContent(x);
return p;
}

void fcn(int& npar, double* deriv, double& f, double par[], int flag){
vector nev = *xVecPtr;
int n = nev.size();
int nu=0;
double f1;
double lnL = 0.0;
// xVecPtr is global
for (int i=0; i<n; i++){
double x = nev[i];
f1=(par[0]*nev[i]*fe(i)+par[1]*nev[i]*fp(i));// probability for that event
lnL += log(f1); // need positive f
nu+=nev[i];
}
lnL -= nu ;
f=-lnL;
}

void like(){

TFile *f=TFile::Open(“template.root”);
TH1F *Dati;
f->GetObject(“TemplateE”,Ele);
f->GetObject(“TemplateP”,Pro);

double *par[2];
TFile *dino=TFile::Open(“out.root”);
TH1F *dati_volo; dino->GetObject(“Data”,dati_volo);

for (int i=0;i<200;i++){
Double_t nev=dati_volo->GetBinContent(i);
xVecPtr->push_back(nev);

const int npar=2;
TMinuit minuit(npar);
minuit.SetFCN(fcn);
double par[npar];
double stepSize[npar];
double minVal[npar];            // minimum bound on parameter 
double maxVal[npar];            // maximum bound on parameter
string parName[npar];

par[0] = 0;            // a guess
stepSize[0] = 0.1;       // take e.g. 0.1 of start value
minVal[0] = 0;   // if min and max values = 0, parameter is unbounded.
maxVal[0] = 1;
parName[0] = "electron_fraction";


par[1] = 1;            // a guess
stepSize[1] = 0.1;       // take e.g. 0.1 of start value
minVal[1] = 0;   // if min and max values = 0, parameter is unbounded.
maxVal[1] = 1;
parName[1] = "proton_fraction";


for (int i=0; i<npar; i++){
  minuit.DefineParameter(i, parName[i].c_str(), 
		     par[i], stepSize[i], minVal[i], maxVal[i]);
}

minuit.Migrad();       // Minuit's best minimization algorithm
double outpar[npar], err[npar];
for (int i=0; i<npar; i++){
  minuit.GetParameter(i,outpar[i],err[i]);
}

}

}[/code]

I have this code where I try to fit a collection of Flight data ( protons and electrons ), Root compiles and runs smoothly except for the fact that, even if I change the data, output values of the parameters don’t change at all: [quote] MIGRAD FAILS TO FIND IMPROVEMENT
MACHINE ACCURACY LIMITS FURTHER IMPROVEMENT.
MIGRAD MINIMIZATION HAS CONVERGED.
MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX.
MINUIT WARNING IN HESSE
============== MATRIX FORCED POS-DEF BY ADDING nan TO DIAGONAL.
FCN=inf FROM MIGRAD STATUS=CONVERGED 102 CALLS 103 TOTAL
EDM=nan STRATEGY= 1 ERR MATRIX NOT POS-DEF
EXT PARAMETER APPROXIMATE STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 electron_fraction 9.53674e-07 nan 5.00000e-01 nan
2 proton_fraction 9.99999e-01 nan 5.00000e-01 nan
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 2 ERR DEF=1
nan nan
nan nan
ERR MATRIX NOT POS-DEF
PARAMETER CORRELATION COEFFICIENTS
NO. GLOBAL 1 2
1 nan nan nan
2 nan nan nan
ERR MATRIX NOT POS-DEF[/quote] i pasted only the last run of the algorithm.
Please I really need help, what am I doing wrong?

Hi,
It looks that “f” doesn’t depend on parameters. Could you check it?

f depends on parameters : f1=(par[0]*nev[i]*fe(i)+par[1]*nev[i]*fp(i));// probability for that event lnL += log(f1); // lnL depends on parameters nu+=nev[i]; } lnL -= nu ; f=-lnL; //so does f