Succession of multiple fits differs from performance of single fits

Hello,

I have a problem with a root macro. What I basically want to do is that I have one big root tree where several single plots/histograms of length 900000 each are after each other. Then I want to fit a standard gaussian distribution to each single plot what I do via a loop and extract the fitting parameters. Unfortunately, root seems to remember the previous fits, because the first fit works and then I get problems. This always happens no matter at which positon/ with which of the single histograms I start, so it must have someting to do with the fitting in the loop. I do delete the histogram and the function at the end, but despite that, it happens again and again.

My full code is:

void get_baseline_cuts_gaus(){
TFile *file1 = TFile::Open(“datatree.root”);
TTree treeInput = (TTree) file1->Get(“treeData”);

unsigned int evt_n;
double peak_integral;
double peak_maximum;
double time_maximum;
double baseline_mean;
double baseline_rms;

treeInput->SetBranchAddress("evt_n", &evt_n);
treeInput->SetBranchStatus("evt_n",0);
treeInput->SetBranchAddress("peak_integral",&peak_integral);
treeInput->SetBranchStatus("peak_integral",1);
treeInput->SetBranchAddress("peak_maximum",&peak_maximum);
treeInput->SetBranchStatus("peak_maximum",0);
treeInput->SetBranchAddress("time_maximum",&time_maximum);
treeInput->SetBranchStatus("time_maximum",0);
treeInput->SetBranchAddress("baseline_mean",&baseline_mean);
treeInput->SetBranchStatus("baseline_mean",0);
treeInput->SetBranchAddress("baseline_rms",&baseline_rms);
treeInput->SetBranchStatus("baseline_rms",1);


string runnumber[15] = {"Run00695", "Run00696", "Run00697", "Run00698", "Run00699", "Run00700", "Run00701", "Run00702", "Run00703", "Run00704", "Run00705", "Run00706", "Run00707", "Run00708", "Run00709"};
double maximum[15] = {0};
double baseline_cut_gaus[15][4] = {0};
int number = 0;
double cut[4][4] = {0};
for ( int j = 0; j < 2; j++ ){
	//~ int j = 1;
	number += 900000;
	//~ number += 900000;
	//~ number += 900000;
	//~ number += 900000;
	
	TH1F *hist1 = new TH1F ("hist", "hist", 400, 0, 1 );
	for( int i = number; i < ( 900000 + number ); i++){
		treeInput->GetEntry(i);
		hist1->Fill(baseline_rms);
	}
	number += 900000;
	cout << "number:\t" << number << endl;
	int binmax = hist1->GetMaximumBin();
	maximum[j] = hist1->GetXaxis()->GetBinCenter(binmax);
	cout << "maximum:\t" << maximum[j] << endl;
	cout << "Binmax:\t:" << binmax <<endl;	
	
	// fit gaus to baseline:
	double left_end = maximum[j] - 0.02;
	double right_end = maximum[j] + 0.015;
	TF1 *g1 = new TF1("g1", "gaus", left_end, right_end);
	hist1->Fit(g1, "R") ;
	
	hist1->Draw();
	g1->Draw("same");
	
	double amplitude = g1->GetParameter(0);
	double mean = g1->GetParameter(1);
	double sigma = g1->GetParameter(2);
	
	cout << "amplitude:\t" << amplitude << endl;
	cout << "mean:\t" << mean << endl;
	cout << "sigma:\t" << sigma << endl;
	
	
	for ( int n = 0; n < 4; n++){
	//~ int n = 1;
		baseline_cut_gaus[j][n-1] = mean + n * sigma;
		cout << "baseline_cut_gaus:\t" << baseline_cut_gaus[j][n-1] << endl;
	}
	delete g1;
	delete hist1;
}

}

And I get the following error:

FCN=435.937 FROM MIGRAD STATUS=CONVERGED 74 CALLS 75 TOTAL
EDM=2.31573e-10 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 2.1 per cent
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 Constant 6.88087e+04 1.08427e+02 -7.18223e-03 2.16701e-07
2 Mean 1.97145e-01 2.06284e-05 -7.33589e-09 -3.76929e-02
3 Sigma 1.18415e-02 2.22333e-05 -6.04209e-07 5.25611e-02

FCN=8.84646e-13 FROM HESSE STATUS=NOT POSDEF 16 CALLS 97 TOTAL
EDM=1.76722e-12 STRATEGY= 1 ERR MATRIX NOT POS-DEF
EXT PARAMETER APPROXIMATE STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 Constant 1.16370e+06 1.82904e+04 2.77448e-01 1.53354e-09
2 Mean 3.94067e-01 5.43747e-03 9.39529e-08 -5.15770e-03
3 Sigma 2.48038e-01 7.58441e-03 2.21709e-07 2.76288e-03

So the first fit converges, but the second not.

Has anyone an idea why that is and how to solve this problem?

Kind regards
Judith

Dear Judith,

Are the values (position of the max, …) correct (i.e. what you expect) before doing the fit?
To debug the problem, it may be worth to save a few of the generated histograms to a file to see how they look.

Could you also specify the version of ROOT that you are using?

G Ganis

Dear Ganis,

the maximum of the histogram (maximum bin and xaxis value of it) is
found correctly also for the second histogram. What exactly do you mean
with saving the histograms? Saving it as a .txt or a tree again (I can
plot it for single fits, they look like an asymmetric gaussian and I fit
only a certain range of the histogram). Should I send a picture or the
files? The ROOT version I am using is 6.08/02.

Kind regards

Judith

Dear Judith,

I meant adding this:

...
int number = 0;
double cut[4][4] = {0};
// Open a new ROOT file for the histograms
TFile *filehistos = TFile::Open("myhistos.root", "RECREATE") 
for ( int j = 0; j < 2; j++ ){
   ...
   
   TH1F *hist1 = new TH1F ("hist", "hist", 400, 0, 1 );
   for( int i = number; i < ( 900000 + number ); i++){
 	  treeInput->GetEntry(i);
	  hist1->Fill(baseline_rms);
   }
    
   // Somewhere after the loop filling the histogram
   hist1->Write():
 
   ...

 }
 // Close the file
 filehistos->Close();

The file myhistos.root should contain the histos you are trying to fit and may give hints where the problem stands.

G Ganis

Dear Ganis,

ah ok, I tried this and indeed the first histogram looks reasonable, but
the following not. I attached both files as a screenshot. I don’t really
understand why that is, as the number of entries seems to be correct,
but all entries are stored in one bin. Do you have any idea?

Kind regards

Judith

second file which does not work properly

Dera Judith,

Ok, now you have to understand why it is like this.
You can check the content of the first 100 entries supposed to go in your second histo with:

 treeInput->Scan("baseline_rms", "", "", 100, 270000)

What does this give you?

G Ganis

Dear Ganis,

when I do this, I get:

Dear Ganis,

it seems to work now, I changed the reading of the histogram.

Thanks a lot for your help.

Kind regards

Judith

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.