From 6c9adda7d257fd94453b62413eeff817b9ce22ee Mon Sep 17 00:00:00 2001 From: Suter Andreas Date: Tue, 3 May 2016 11:19:16 +0200 Subject: [PATCH] made start-/endTimeBin class variables. --- src/classes/PRunAsymmetryRRF.cpp | 30 ++++++++------------ src/classes/PRunSingleHistoRRF.cpp | 44 ++++++++++-------------------- src/include/PRunAsymmetryRRF.h | 6 ++++ src/include/PRunSingleHistoRRF.h | 6 ++++ 4 files changed, 37 insertions(+), 49 deletions(-) diff --git a/src/classes/PRunAsymmetryRRF.cpp b/src/classes/PRunAsymmetryRRF.cpp index 7e7f21df..cd3f27e3 100644 --- a/src/classes/PRunAsymmetryRRF.cpp +++ b/src/classes/PRunAsymmetryRRF.cpp @@ -187,15 +187,7 @@ Double_t PRunAsymmetryRRF::CalcChiSquare(const std::vector& par) // calculate chi square Double_t time(1.0); - Int_t i, N(static_cast(fData.GetValue()->size())); - - // In order not to have an IF in the next loop, determine the start and end bins for the fit range now - Int_t startTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); - if (startTimeBin < 0) - startTimeBin = 0; - Int_t endTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; - if (endTimeBin > N) - endTimeBin = N; + Int_t i; // Calculate the theory function once to ensure one function evaluation for the current set of parameters. // This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once @@ -204,12 +196,12 @@ Double_t PRunAsymmetryRRF::CalcChiSquare(const std::vector& par) asymFcnValue = fTheory->Func(time, par, fFuncValues); #ifdef HAVE_GOMP - Int_t chunk = (endTimeBin - startTimeBin)/omp_get_num_procs(); + Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); if (chunk < 10) chunk = 10; #pragma omp parallel for default(shared) private(i,time,diff,asymFcnValue,a,b,f) schedule(dynamic,chunk) reduction(+:chisq) #endif - for (i=startTimeBin; i(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); - if (startTimeBin < 0) - startTimeBin = 0; - Int_t endTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; - if (endTimeBin > static_cast(fData.GetValue()->size())) - endTimeBin = fData.GetValue()->size(); + fStartTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); + if (fStartTimeBin < 0) + fStartTimeBin = 0; + fEndTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; + if (fEndTimeBin > static_cast(fData.GetValue()->size())) + fEndTimeBin = fData.GetValue()->size(); - if (endTimeBin > startTimeBin) - fNoOfFitBins = endTimeBin - startTimeBin; + if (fEndTimeBin > fStartTimeBin) + fNoOfFitBins = fEndTimeBin - fStartTimeBin; else fNoOfFitBins = 0; } diff --git a/src/classes/PRunSingleHistoRRF.cpp b/src/classes/PRunSingleHistoRRF.cpp index b09aee8b..3777c462 100644 --- a/src/classes/PRunSingleHistoRRF.cpp +++ b/src/classes/PRunSingleHistoRRF.cpp @@ -159,15 +159,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquare(const std::vector& par) // calculate chi square Double_t time(1.0); - Int_t i, N(static_cast(fData.GetValue()->size())); - - // In order not to have an IF in the next loop, determine the start and end bins for the fit range now - Int_t startTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); - if (startTimeBin < 0) - startTimeBin = 0; - Int_t endTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; - if (endTimeBin > N) - endTimeBin = N; + Int_t i; // Calculate the theory function once to ensure one function evaluation for the current set of parameters. // This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once @@ -176,12 +168,12 @@ Double_t PRunSingleHistoRRF::CalcChiSquare(const std::vector& par) time = fTheory->Func(time, par, fFuncValues); #ifdef HAVE_GOMP - Int_t chunk = (endTimeBin - startTimeBin)/omp_get_num_procs(); + Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); if (chunk < 10) chunk = 10; #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif - for (i=startTimeBin; iat(i) - fTheory->Func(time, par, fFuncValues); chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); @@ -215,15 +207,7 @@ Double_t PRunSingleHistoRRF::CalcChiSquareExpected(const std::vector& // calculate chi square Double_t time(1.0); - Int_t i, N(static_cast(fData.GetValue()->size())); - - // In order not to have an IF in the next loop, determine the start and end bins for the fit range now - Int_t startTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); - if (startTimeBin < 0) - startTimeBin = 0; - Int_t endTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; - if (endTimeBin > N) - endTimeBin = N; + Int_t i; // Calculate the theory function once to ensure one function evaluation for the current set of parameters. // This is needed for the LF and user functions where some non-thread-save calculations only need to be calculated once @@ -232,12 +216,12 @@ Double_t PRunSingleHistoRRF::CalcChiSquareExpected(const std::vector& time = fTheory->Func(time, par, fFuncValues); #ifdef HAVE_GOMP - Int_t chunk = (endTimeBin - startTimeBin)/omp_get_num_procs(); + Int_t chunk = (fEndTimeBin - fStartTimeBin)/omp_get_num_procs(); if (chunk < 10) chunk = 10; #pragma omp parallel for default(shared) private(i,time,diff) schedule(dynamic,chunk) reduction(+:chisq) #endif - for (i=startTimeBin; i < endTimeBin; ++i) { + for (i=fStartTimeBin; i < fEndTimeBin; ++i) { time = fData.GetDataTimeStart() + (Double_t)i*fData.GetDataTimeStep(); theo = fTheory->Func(time, par, fFuncValues); diff = fData.GetValue()->at(i) - theo; @@ -412,15 +396,15 @@ void PRunSingleHistoRRF::SetFitRangeBin(const TString fitRange) void PRunSingleHistoRRF::CalcNoOfFitBins() { // In order not having to loop over all bins and to stay consistent with the chisq method, calculate the start and end bins explicitly - Int_t startTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); - if (startTimeBin < 0) - startTimeBin = 0; - Int_t endTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; - if (endTimeBin > static_cast(fData.GetValue()->size())) - endTimeBin = fData.GetValue()->size(); + fStartTimeBin = static_cast(ceil((fFitStartTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())); + if (fStartTimeBin < 0) + fStartTimeBin = 0; + fEndTimeBin = static_cast(floor((fFitEndTime - fData.GetDataTimeStart())/fData.GetDataTimeStep())) + 1; + if (fEndTimeBin > static_cast(fData.GetValue()->size())) + fEndTimeBin = fData.GetValue()->size(); - if (endTimeBin > startTimeBin) - fNoOfFitBins = endTimeBin - startTimeBin; + if (fEndTimeBin > fStartTimeBin) + fNoOfFitBins = fEndTimeBin - fStartTimeBin; else fNoOfFitBins = 0; } diff --git a/src/include/PRunAsymmetryRRF.h b/src/include/PRunAsymmetryRRF.h index d0aefd7d..31911634 100644 --- a/src/include/PRunAsymmetryRRF.h +++ b/src/include/PRunAsymmetryRRF.h @@ -52,6 +52,9 @@ class PRunAsymmetryRRF : public PRunBase virtual void SetFitRangeBin(const TString fitRange); + virtual Int_t GetStartTimeBin() { return fStartTimeBin; } + virtual Int_t GetEndTimeBin() { return fEndTimeBin; } + protected: virtual void CalcNoOfFitBins(); virtual Bool_t PrepareData(); @@ -70,6 +73,9 @@ class PRunAsymmetryRRF : public PRunBase Int_t fGoodBins[4]; ///< keep first/last good bins. 0=fgb, 1=lgb (forward); 2=fgb, 3=lgb (backward) + Int_t fStartTimeBin; ///< bin at which the fit starts + Int_t fEndTimeBin; ///< bin at which the fit ends + Bool_t SubtractFixBkg(); Bool_t SubtractEstimatedBkg(); diff --git a/src/include/PRunSingleHistoRRF.h b/src/include/PRunSingleHistoRRF.h index b937611c..670b90db 100644 --- a/src/include/PRunSingleHistoRRF.h +++ b/src/include/PRunSingleHistoRRF.h @@ -51,6 +51,9 @@ class PRunSingleHistoRRF : public PRunBase virtual void SetFitRangeBin(const TString fitRange); + virtual Int_t GetStartTimeBin() { return fStartTimeBin; } + virtual Int_t GetEndTimeBin() { return fEndTimeBin; } + protected: virtual void CalcNoOfFitBins(); virtual Bool_t PrepareData(); @@ -66,6 +69,9 @@ class PRunSingleHistoRRF : public PRunBase Int_t fGoodBins[2]; ///< keep first/last good bins. 0=fgb, 1=lgb + Int_t fStartTimeBin; ///< bin at which the fit starts + Int_t fEndTimeBin; ///< bin at which the fit ends + PDoubleVector fForward; ///< forward histo data PDoubleVector fM; ///< vector holding M(t) = [N(t)-N_bkg] exp(+t/tau). Needed to estimate N0. PDoubleVector fMerr; ///< vector holding the error of M(t): M_err = exp(+t/tau) sqrt(N(t)).