[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?