Hi Rooters,
I found a strange behavior while fitting TGraphErrors objects. When I fit
my data with a predefined function (let's say "pol1") I can see that the
fit / chisquare is different if I switch on/off the error bars along x
(ex). So in this case it behaves as I expect.
If now I use my user defined function, I can't see anymore this feature
(see macro at the end. I also attached the file used for defining my
function). I guess I am doing something wrong but I cannot figure out what
it is.
any help is welcome, thanks
Nicolas
P.S : I am using root 3.02/5 on RH7.1, and I see the same behavior with
root 3.00/06 on HP-UX
*************
macro chisq.C
*************
Graph *GR;
Int_t DIM;
Double_t *XX, *YY;
void chisq()
{
gStyle->SetOptStat(0);
gStyle->SetOptFit(1);
// on dessine un canvas
TCanvas *c1 = new TCanvas("c1", "c1");
c1->SetGrid();
// on dessine les axes
TH2F *h2 = new TH2F("h2", "test fit", 300, 2.65, 2.76, 1000, 0, 100);
h2->SetXTitle("Energie (MeV)");
h2->Draw();
// on creer les donnees
Double_t x[4] = {2.693, 2.7, 2.7, 2.708};
Double_t ex[4] = {0.002, 0.002, 0.002, 0.002};
Double_t y[4] = {64.02073, 61.66537, 64.23304, 33.05851};
Double_t ey[4] = {2.75809, 1.91538 ,1.89935, 1.26583};
// on remplit un TGraphErrors
TGraphErrors *data = new TGraphErrors(4, x, y, ex, ey);
// TGraphErrors *data = new TGraphErrors(4, x, y, 0, ey);
data->SetMarkerStyle(22);
data->SetMarkerColor(kRed);
data->SetLineColor(kRed);
data->Draw("P");
// on lit le fichier contenant la fonction a fitter
GR = read("reson_n02.out");
DIM = GR->GetN();
XX = GR->GetX();
YY = GR->GetY();
// on definit la fonction du fit
TF1 *fitf = new TF1("fitf", fitf, XX[0], XX[DIM-1], 1);
fitf->SetParameter(0, 1.1);
fitf->SetParName(0, "N");
// on fait le fit
data->Fit("fitf", "RV+");
// data->Fit("pol1");
}
TGraph* read(TString name)
{
// on construit le nom du fichier a lire
TString path = "/home/astronuc/deserevi/";
path += name;
// ouverture du fichier de donnees
ifstream fich;
fich.open(path);
if ( !fich )
cout << "Probleme dans l'ouverture du fichier : " << path << endl;
// saute les 'comm' premieres lignes de commentaires
Int_t comm = 0;
Char_t line[256];
for ( Int_t i = 0; i < comm; i++ ) fich.getline(line, sizeof(line));
// TGraphErrors *gre = new TGraphErrors();
TGraph *gre = new TGraph();
Int_t nlines = 0;
Float_t x, y;
// lecture du fichier de donnees
while ( fich >> x >> y ) gre->SetPoint(nlines++, x, y);
return gre;
}
Double_t fitf(Double_t *x, Double_t *par)
{
Int_t index = TMath::BinarySearch(DIM, XX, x[0]);
// interpolation lineaire
Double_t fitval = ((YY[index] - YY[index+1]) * x[0]
+ (XX[index]*YY[index+1] - XX[index+1]*YY[index]))
/ (XX[index] - XX[index+1]);
return par[0] * fitval;
}
--
:-------------------------------:
: Nicolas DE SEREVILLE :
: C.S.N.S.M. :
: Batiment 104 :
: 91405 ORSAY Campus :
: Tel : (+ 33) (0)1 69 15 48 57 :
: Fax : (+ 33) (0)1 69 15 50 08 :
:-------------------------------:
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:09 MET