8 #include "KVAlphaCalibration.h"
48 void KVAlphaCalibration::HistoInit(
TH1* h)
54 GaussianFit =
new TF1(
"fitPeak",
this, &KVAlphaCalibration::FunctionToFit, min, max, NumberOfPeak + 3,
"KVAlphaCalibration",
"FonctionToFit");
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_);
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)
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;
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;
316 if (debug_) std::cerr <<
"DEBUG IN FitInit : Fitting" << std::endl;
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) {
361 GaussianFit->
SetParameter(1, InitializationFitResults[0]);
366 GaussianFit->
SetNpx(1000);
368 if (debug_) std::cerr <<
"Setting Normalization factors" << std::endl;
369 for (
int i = 0; i < NumberOfPeak; 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++) {
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;
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void xpos
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)
virtual void SetMarkerStyle(Style_t mstyle=1)
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
virtual Double_t GetParameter(const TString &name) const
virtual Double_t GetParError(Int_t ipar) const
virtual void SetNpx(Int_t npx=100)
void Draw(Option_t *option="") override
virtual void SetParameter(const TString &name, Double_t value)
virtual void FixParameter(Int_t ipar, Double_t value)
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
void Draw(Option_t *chopt="") override
virtual Double_t GetBinCenter(Int_t bin) const
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
void Draw(Option_t *option="") override
virtual Int_t GetMaximumBin() const
virtual Int_t GetMinimumBin() const
virtual Int_t Search(const TH1 *hist, Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
Double_t * GetPositionX() const
RooArgSet S(Args_t &&... args)
double min(double x, double y)
double max(double x, double y)
Double_t Power(Double_t x, Double_t y)
Double_t Sqrt(Double_t x)