From: Benjamin Linnik Date: Tue, 28 Nov 2017 12:27:55 +0000 (+0100) Subject: Analyzer: Bugfix X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=9495bf2cd0845689c5871e443fab425f18d7a6f4;p=radhard.git Analyzer: Bugfix --- diff --git a/MABS_run_analyzer/HistogramType.c b/MABS_run_analyzer/HistogramType.c index 38df915..0a5c06f 100644 --- a/MABS_run_analyzer/HistogramType.c +++ b/MABS_run_analyzer/HistogramType.c @@ -488,8 +488,8 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType const Double_t def_amplitude=histogrampointer->GetBinContent(histogrampointer->GetMaximumBin()); const Double_t def_peakcenter=histogrampointer->GetBinCenter(histogrampointer->GetMaximumBin()); -// cout << colorcyan << "def_amplitude: " << def_amplitude << endlr; -// cout << colorcyan << "def_peakcenter: " << def_peakcenter << endlr; +// cout << colorcyan << "def_amplitude: " << def_amplitude << endlr; +// cout << colorcyan << "def_peakcenter: " << def_peakcenter << endlr; const Double_t def_gausssig=10; // set start values for some parameters fitFunc->SetParName(0,"amplitude of peak"); @@ -499,20 +499,14 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType fitFunc->SetParLimits(1,def_peakcenter*0.8,def_peakcenter*1.2); fitFunc->SetParName(2,"Gaussian sigma"); fitFunc->SetParameter(2,def_gausssig); - fitFunc->SetParLimits(2,0,100); + fitFunc->SetParLimits(2,0.0,100.0); fitFunc->SetLineWidth(4); fitFunc->SetLineColor(kGreen); int fittries = 0; Bool_t failed = false; - do { - if (failed) - { - fitFunc->SetParameter(0,def_amplitude*(1.0-0.1*++fittries)); - fitFunc->SetParameter(1,def_peakcenter); - fitFunc->SetParameter(2,def_gausssig); - } else fittries = 100; + do { failed = false; fit_result_ptr = histogrampointer->Fit(fitFunc, "NMWQS", "", noiseborder, posMaxValHist); if (gMinuit == nullptr) { @@ -522,8 +516,15 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType if (gMinuit->fCstatu == "NOT POSDEF" || gMinuit->fCstatu.Contains("FAILED")) { failed = true; } - } + } + if (failed) + { + fitFunc->SetParameter(0,def_amplitude*(1.0-0.1*++fittries)); + fitFunc->SetParameter(1,def_peakcenter); + fitFunc->SetParameter(2,def_gausssig); + } else fittries = 100; } while (fittries < 6); + // get parameters for (Int_t pari=0; pari<3; pari++) { //cout << colorcyan << fitFunc->GetParameter(pari) << endlr; @@ -558,6 +559,7 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType integralPeak = histogrampointer->IntegralAndError(histogrampointer->GetXaxis()->FindBin( parameters[7] ), histogrampointer->GetXaxis()->FindBin( parameters[8]), integralPeakError, "width"); // integral value of histogram (NOT fit), normaliezed with bin size! posMax = fitFunc->GetMaximumX(); // Methode 2 fitFunc->SetLineStyle(1); // normal for the following fits + if (verbose) fitFunc->Draw("SAME"); } @@ -755,7 +757,7 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType cout << colorcyan << "noiseborder: " << noiseborder << endlr; } // histogrampointer->GetXaxis()->SetRange(noiseborder,histogrampointer->FindLastBinAbove(0)); // look only for maxima with x greater than noiseborder, cut away noise - histogrampointer->GetXaxis()->SetRange(histogrampointer->FindBin(noiseborder),histogrampointer->FindBin(posMaxValHist)); // look only for maxima with x greater than noiseborder, cut away noise + histogrampointer->GetXaxis()->SetRange(histogrampointer->GetXaxis()->FindBin(noiseborder),histogrampointer->GetXaxis()->FindBin(posMaxValHist)); // look only for maxima with x greater than noiseborder, cut away noise // histogrampointer->GetXaxis()->SetRangeUser(noiseborder,posMaxValHist); TF1* fitFunc = new TF1("fitFunc",GaussTail,noiseborder,posMaxValHist,6); @@ -784,8 +786,7 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType // fitFunc->SetParLimits(1,def_peakcenter*0.8,def_peakcenter*1.2); fitFunc->SetParName(2,"Gaussian sigma"); fitFunc->SetParameter(2,def_gausssig); - fitFunc->SetParLimits(2,2,50); - fitFunc->SetParLimits(2,0,10000); + fitFunc->SetParLimits(2,0,150); fitFunc->SetParName(3,"Distance from Gauss"); fitFunc->SetParameter(3,def_distgauss); fitFunc->SetParLimits(3,0,def_distgauss*4); @@ -804,7 +805,6 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType Bool_t failed = false; do { failed = false; -// cout << fittries << ": New range: " << histogrampointer->GetXaxis()->GetBinCenter(min+fittries*min/20) << " to " << posMaxValHist << endl; fit_result_ptr = histogrampointer->Fit(fitFunc, "N,M,W,Q,S", "", noiseborder, posMaxValHist); // cout << colorcyan << " AFTER fit " << endlr; if (gMinuit == nullptr) { @@ -831,7 +831,7 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType fittries = 0; do { failed = false; - fit_result_ptr = histogrampointer->Fit(fitFunc, "N,M,W,Q,S", "", posMaxValHist-posMaxValHist/6*(fittries+1), posMaxValHist); + fit_result_ptr = histogrampointer->Fit(fitFunc, "N,M,W,Q,S", "", posMaxValHist-posMaxValHist/4*(++fittries), posMaxValHist); // cout << colorcyan << " AFTER fit " << endlr; if (gMinuit == nullptr) { failed = true; @@ -844,7 +844,7 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType if (failed) { fitFunc->SetParameter(0,def_amplitude); - fitFunc->SetParameter(1,def_peakcenter); + fitFunc->SetParameter(1,posMaxValHist-posMaxValHist/4*(fittries)); fitFunc->SetParameter(2,def_gausssig); fitFunc->SetParameter(3,def_distgauss); fitFunc->SetParameter(4,def_bgslope); @@ -852,10 +852,11 @@ Double_t* HistogramType::FitPerform(TH1FO* histogrampointer, TString fitFuncType } else fittries = 100; - } while (fittries < 6); + } while (fittries < 4); if (failed) { failed = false; + cout << "Most emphasized estimate" << endlr; histogrampointer->GetXaxis()->SetRange(0,posMaxValHist); // look only for maxima with x greater than noiseborder, cut away noise fitFunc->SetParameter(0,def_amplitude); fitFunc->SetParameter(1,def_peakcenter); diff --git a/MABS_run_analyzer/Run.c b/MABS_run_analyzer/Run.c index f43a7e7..b357019 100644 --- a/MABS_run_analyzer/Run.c +++ b/MABS_run_analyzer/Run.c @@ -1698,14 +1698,12 @@ Bool_t Run::binSeedSumVeto() for (vector::iterator curHistogramClass = HistogramClassVector.begin(); curHistogramClass != HistogramClassVector.end(); curHistogramClass++) { Double_t* parameters = (Double_t *)calloc(11, sizeof(Double_t)); // allocate 11 parameters for safety, maximum 10 used at the moment - cout << colorcyan << "Start fitting" << endlr; - cout << colorcyan << (*curHistogramClass)->histogramdescription << endlr; + cout << colorcyan << (*curHistogramClass)->histogramdescription << endlr; (*curHistogramClass)->FindNoisethresholdborder((*curHistogramClass)->Seed, false, false); if (labbook.runnumber == 343056) (*curHistogramClass)->noisethresholdborder = 34; if (labbook.source.Contains("Fe")||labbook.source.Contains("Cd")) { - cout << colorcyan << "Veto" << endlr; parameters = (*curHistogramClass)->FitPerform((*curHistogramClass)->Veto, "GaussTail"); (*curHistogramClass)->posVeto = parameters[1]; if (labbook.runnumber == 343056) @@ -1721,7 +1719,6 @@ Bool_t Run::binSeedSumVeto() // cout << (*curHistogramClass)->histogramdescription << ": " << colorcyan << parameters[1] << endlr; (*curHistogramClass)->integralVeto = parameters[6]; } - cout << colorcyan << "Seed" << endlr; if (labbook.chipGen.EqualTo("Pipper2") || labbook.chipGen.EqualTo("Pegasus")) parameters = (*curHistogramClass)->FitPerform((*curHistogramClass)->Seed, "gaus", 0, false, (*curHistogramClass)->fixedThresholdValue); else @@ -1730,7 +1727,6 @@ Bool_t Run::binSeedSumVeto() (*curHistogramClass)->posSeed = parameters[1]; (*curHistogramClass)->integralSeedErr = parameters[9]; - cout << colorcyan << "Sum" << endlr; parameters = (*curHistogramClass)->FitPerform((*(*curHistogramClass)->Sum), "gaus", 0, false, (*curHistogramClass)->fixedThresholdValue); //TODO change back to gauss (*curHistogramClass)->posSum = parameters[1]; (*curHistogramClass)->integralSum = parameters[6]; @@ -1739,7 +1735,6 @@ Bool_t Run::binSeedSumVeto() for (Int_t bini = 1; bini <= (*curHistogramClass)->clustermultiplicity->GetNbinsX(); bini++) { (*curHistogramClass)->clustermultiplicity->SetBinContent(bini, (*curHistogramClass)->clustermultiplicity->GetBinContent(bini)/(*curHistogramClass)->numberofhits); } - cout << colorcyan << "Sum9" << endlr; for (u_int sumi = 0; sumi < (*curHistogramClass)->a_Sum9.size(); sumi++) { // Float_t integratestart = (*curHistogramClass)->FindNoisethresholdborder((*curHistogramClass)->a_Sum[sumi], false, false); // parameters = (*curHistogramClass)->FitPerform((*curHistogramClass)->a_Sum[sumi], "gaus", 0, false, integratestart); //TODO change back to gauss @@ -1748,7 +1743,6 @@ Bool_t Run::binSeedSumVeto() (*curHistogramClass)->a_integralSum9.push_back(parameters[6]); (*curHistogramClass)->a_integralSumErr9.push_back(parameters[9]); } - cout << colorcyan << "Sum25" << endlr; for (u_int sumi = 0; sumi < (*curHistogramClass)->a_Sum25.size(); sumi++) { // Float_t integratestart = (*curHistogramClass)->FindNoisethresholdborder((*curHistogramClass)->a_Sum[sumi], false, false); // parameters = (*curHistogramClass)->FitPerform((*curHistogramClass)->a_Sum[sumi], "gaus", 0, false, integratestart); //TODO change back to gauss @@ -1758,7 +1752,6 @@ Bool_t Run::binSeedSumVeto() (*curHistogramClass)->a_integralSumErr25.push_back(parameters[9]); } - cout << colorcyan << "SeedPerc" << endlr; parameters =(*curHistogramClass)->FitPerform((*curHistogramClass)->SeedPerc, "landau"); (*curHistogramClass)->posSeedPerc = parameters[1]; (*curHistogramClass)->sigmaSeedPerc = parameters[2];