8 #include "KVAlphaCalibration.h"
48 void KVAlphaCalibration::HistoInit(TH1* h)
52 double min = Histo->GetBinCenter(h->GetMinimumBin());
53 double max = Histo->GetBinCenter(h->GetMaximumBin());
54 GaussianFit =
new TF1(
"fitPeak",
this, &KVAlphaCalibration::FunctionToFit, min, max, NumberOfPeak + 3);
66 spec =
new TSpectrum();
68 factorGraph =
new TGraph();
69 InitializationFit =
new TF1(
"calib",
"pol1", 0, 100);
70 SigmaOfTSpectrum = 1.;
71 ThresholdOfTSpectrum = 0.05;
74 if (NumberOfPeak_ <= 0) {
75 std::cerr <<
"ERROR in KVAlphaCalibration Constructor : The number of peak you want to fit has to be positive" << std::endl;
78 NumberOfPeak = NumberOfPeak_;
93 if (Intensity_ <= 0) {
94 std::cerr <<
"ERROR in KVAlphaCalibration::SetPeak : Normalization factor can not be equal nor inferior to 0" << std::endl;
98 MeanOfPeak.push_back(Energy_);
99 IntensityOfPeak.push_back(Intensity_);
123 Histo->GetXaxis()->SetRangeUser(xmin, xmax);
134 if (SigmaOfTSpectrum_ <= 0) {
135 std::cerr <<
"ERROR in KVAlphaCalibration::SetParameters : SigmaOfTSpectrum can not be equal nor inferior to 0" << std::endl;
139 SigmaOfTSpectrum = SigmaOfTSpectrum_;
141 if (SigmaOfGaussian_ <= 0) {
142 std::cerr <<
"ERROR in KVAlphaCalibration::SetParameters : SigmaOfGaussian can not be equal nor inferior to 0" << std::endl;
146 SigmaOfGaussian = SigmaOfGaussian_;
148 if (ThresholdOfTSpectrum_ <= 0) {
149 std::cerr <<
"ERROR in KVAlphaCalibration::SetParameters : ThresholdOfTSpectrumOfTSpectrum can not be equal nor inferior to 0" << std::endl;
153 IsOriginAtZero = IsOriginAtZero_;
155 ThresholdOfTSpectrum = ThresholdOfTSpectrum_;
174 if (j != 0 && j != 1) {
175 std::cerr <<
"ERROR in KVAlphaCalibration::GetLinerFitParameter : You asked for a wrong parameter value, it needs to be 1 or 0"
177 <<
"-> Ignoring command" << std::endl;
182 return InitializationFitResults[j];
203 if (j < 0 || j > NumberOfPeak + 2) {
204 std::cerr <<
"ERROR in KVAlphaCalibration::GetGaussianFitParameter : You asked for a wrong parameter value, it needs to be between 0 or "
207 <<
"-> Ignoring command" << std::endl;
212 return GaussianFitResults[j];
233 if (j < 0 || j > NumberOfPeak + 2) {
234 std::cerr <<
"ERROR in KVAlphaCalibration::GetGaussianFitParameter : You asked for a wrong parameter value, it needs to be between 0 or "
237 <<
"-> Ignoring command" << std::endl;
242 return GaussianFitResultsError[j];
281 if (debug_) std::cerr <<
"DEBUG IN FitInit : Searching for peaks in histogram" << std::endl;
282 unsigned int npeaks = spec->Search(Histo, SigmaOfTSpectrum,
"", ThresholdOfTSpectrum);
284 #if ROOT_VERSION_CODE > ROOT_VERSION(5,99,01)
285 Double_t* xpos = spec->GetPositionX();
287 Float_t* xpos = spec->GetPositionX();
290 InitializationPeak.clear();
291 for (
unsigned int i = 0; i < npeaks; i++) {
292 InitializationPeak.push_back(xpos[i]);
295 std::sort(InitializationPeak.begin(), InitializationPeak.end());
296 std::sort(MeanOfPeak.begin(), MeanOfPeak.end());
297 std::sort(IntensityOfPeak.begin(), IntensityOfPeak.end());
299 if (debug_) std::cerr <<
"DEBUG IN FitInit : Number of peaks found is " << spec->GetNPeaks() << std::endl;
304 if (spec->GetNPeaks() == NumberOfPeak) {
306 for (
int i = 0; i < NumberOfPeak; i++) {
307 if (debug_) std::cerr <<
"DEBUG IN FitInit : Peak position number " << i <<
" = " << InitializationPeak[i] << std::endl;
308 factorGraph->SetPoint(i, MeanOfPeak[i], InitializationPeak[i]);
311 if (debug_) std::cerr <<
"DEBUG IN FitInit : Initializing Parameters" << std::endl;
313 InitializationFit->SetParameter(0, 1);
314 InitializationFit->SetParameter(1, xpos[0] / MeanOfPeak[0]);
316 if (debug_) std::cerr <<
"DEBUG IN FitInit : Fitting" << std::endl;
317 factorGraph->SetMarkerStyle(5);
318 factorGraph->Fit(
"calib",
"Q");
319 if (debug_) std::cerr <<
"DEBUG IN FitInit : Fitting done" << std::endl;
321 if (debug_) std::cerr <<
"DEBUG IN FitInit : Writing fit output in InitializationFitResults array" << std::endl;
322 InitializationFitResults[0] = InitializationFit->GetParameter(0);
324 InitializationFitResults[1] = InitializationFit->GetParameter(1);
327 if (debug_) std::cerr <<
"DEBUG IN FitInit : Ending FitInit" << std::endl;
345 std::vector<double> GaussianFitResultsTemp;
346 std::vector<double> GaussianFitResultsErrorTemp;
348 if (debug_) std::cerr <<
"Entering FitSpectrum method" << std::endl;
349 if (debug_) std::cerr <<
"Setting Parameters" << std::endl;
351 std::cout << &InitializationFitResults << std::endl;
352 GaussianFit->SetParameter(0, InitializationFitResults[1]);
354 if (IsOriginAtZero) {
356 GaussianFit->FixParameter(1, 0);
361 GaussianFit->SetParameter(1, InitializationFitResults[0]);
365 GaussianFit->SetParameter(2, SigmaOfGaussian);
366 GaussianFit->SetNpx(1000);
368 if (debug_) std::cerr <<
"Setting Normalization factors" << std::endl;
369 for (
int i = 0; i < NumberOfPeak; i++) {
371 GaussianFit->SetParameter(i + 3, IntensityOfPeak[i]);
376 std::cerr <<
"Fitting" << std::endl;
377 Histo->Fit(
"fitPeak");
378 std::cerr <<
"FitEnded" << std::endl;
380 else Histo->Fit(
"fitPeak",
"Q");
383 GaussianFitResults.clear();
384 GaussianFitResultsError.clear();
385 GaussianFitResultsTemp.clear();
386 GaussianFitResultsErrorTemp.clear();
388 for (
int i = 0; i < NumberOfPeak + 3; i++) {
390 GaussianFitResultsTemp.push_back(GaussianFit->GetParameter(i));
391 GaussianFitResultsErrorTemp.push_back(GaussianFit->GetParError(i));
395 GaussianFitResults.push_back(1 / GaussianFitResultsTemp[0]);
396 GaussianFitResults.push_back(-GaussianFitResultsTemp[1] / GaussianFitResultsTemp[0]);
398 GaussianFitResults.push_back(GaussianFitResultsTemp[2] / GaussianFitResultsTemp[0]);
400 GaussianFitResultsError.push_back(GaussianFitResultsErrorTemp[0] / GaussianFitResultsTemp[0]);
401 GaussianFitResultsError.push_back(GaussianFitResultsTemp[1] * 0.02);
402 GaussianFitResultsError.push_back(GaussianFitResultsErrorTemp[2] / GaussianFitResultsTemp[0]);
404 for (
int i = 3; i < NumberOfPeak + 3; i++) {
406 GaussianFitResults.push_back(GaussianFitResultsTemp[i]);
407 GaussianFitResultsError.push_back(GaussianFitResultsErrorTemp[i]);
410 if (debug_) std::cerr <<
"FitSpectrum ended" << std::endl;
421 double KVAlphaCalibration::FunctionToFit(
double* x,
double* par)
427 double gauss[NumberOfPeak];
428 double factor_ = par[0];
434 for (
int i = 0; i < NumberOfPeak; i++) {
436 gauss[i] = par[i + 3] / MeanOfPeak[i] * S * TMath::Sqrt(2 * TMath::Pi())
437 * TMath::Exp(-TMath::Power(x[0] - factor_ * MeanOfPeak[i] - b, 2) / (2 * TMath::Power(S, 2)));
459 GaussianFit->Draw(
"same");
461 std::cout <<
"Conversion factor : " << GaussianFitResults[0] << std::endl
462 <<
" Y at x = 0 : " << GaussianFitResults[1] << std::endl
463 <<
"Sigma Factor : " << GaussianFitResults[2] << std::endl;
465 for (
int i = 3; i < NumberOfPeak + 3; i++) {
467 std::cout <<
" Normalization factor " << i <<
" : " << GaussianFitResults[i] << std::endl;
486 std::cout <<
"Slope : " << GaussianFitResults[0] << std::endl
487 <<
"Y at x = 0 : " << GaussianFitResults[1] << std::endl
488 <<
"Peak width factor : " << GaussianFitResults[2] << std::endl;
Set up and run the calibration of siliciums.
void AddPeak(double Energy_, double Intensity_)
void SetHistRange(double xmin, double xmax)
double GetGaussianFitParError(int)
void FitSpectrum(bool debug_=false)
~KVAlphaCalibration()
Default destructor.
double GetGaussianFitParameter(int)
void DrawResult(bool WhatToDraw=true)
double GetInitializationFitParameter(int)
void FitAll(bool debug_=false)
This function calls the FitInit and FitSpectrum function.
void SetParameters(double SigmaOfTSpectrum_=1., double SigmaOfGaussian_=1., double ThresholdOfTSpectrum_=0.5, double IsOriginAtZero_=false)
KVAlphaCalibration(int NumberOfPeak_)
void SetHisto(TH1 *h)
Set the histogram that contains the data.
TGraph * FitInit(bool debug_=false)