diff --git a/PWGCF/EbyEFluctuations/Tasks/FactorialMomentsTask.cxx b/PWGCF/EbyEFluctuations/Tasks/FactorialMomentsTask.cxx index f01ce200c9b..f28fe6d641e 100644 --- a/PWGCF/EbyEFluctuations/Tasks/FactorialMomentsTask.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/FactorialMomentsTask.cxx @@ -170,19 +170,18 @@ struct FactorialMomentsTask { const double dcaxyMaxTrackPar0 = 0.0105; const double dcaxyMaxTrackPar1 = 0.035; const double dcaxyMaxTrackPar2 = 1.1; - const double dcazMaxTrack = 2.0; static const int nBins = 52; double kMinCharge = 1e-6; static const int nfqOrder = 6; int countSamples = 0; int testc1 = 0, testc2 = 0, testc3 = 0; - std::array binningM; + std::array binningM{}; std::array countTracks{0, 0, 0, 0, 0}; - std::array, 5>, 6> fqEvent; - std::array, 5>, 6> fqEventSampled; - std::array, 5> binConEvent; - std::array, 5>, 6> binConEventSampled; - std::array, 5>, 6> errorFq = {{{{{0, 0, 0, 0, 0}}}}}; + std::array, 5>, 6> fqEvent{}; + std::array, 5>, 6> fqEventSampled{}; + std::array, 5> binConEvent{}; + std::array, 5>, 6> binConEventSampled{}; + std::array, 5>, nfqOrder> nSubsamples{}; std::vector> mHistArrReset; std::vector> mHistArrQA; std::vector> mHistArrEff; @@ -191,9 +190,7 @@ struct FactorialMomentsTask { std::vector> mFqBinFinalSampled; std::vector> mBinConFinalSampled; std::vector> mFqError; - // max number of bins restricted to 5 - static constexpr std::array - mbinNames{"bin1/", "bin2/", "bin3/", "bin4/", "bin5/"}; + void init(o2::framework::InitContext&) { // NOTE: check to make number of pt and the vector consistent @@ -307,23 +304,28 @@ struct FactorialMomentsTask { } binConEvent[iPt][iM] = binContent / (std::pow(binningM[iM], 2)); for (int iq = 0; iq < nfqOrder; ++iq) { - if (sumfqBin[iq] > 0) { - fqEvent[iq][iPt][iM] = sumfqBin[iq] / (std::pow(binningM[iM], 2)); - fqEventSampled[iq][iPt][iM] += fqEvent[iq][iPt][iM]; - } + // Always accumulate raw fq numerator and binCon unconditionally so + // both sums run over exactly the same set of events. + fqEvent[iq][iPt][iM] = sumfqBin[iq] / (std::pow(binningM[iM], 2)); + fqEventSampled[iq][iPt][iM] += fqEvent[iq][iPt][iM]; binConEventSampled[iq][iPt][iM] += binConEvent[iPt][iM]; mFqBinFinal[iPt * 6 + iq]->Fill(iM, fqEvent[iq][iPt][iM]); mBinConFinal[iPt * 6 + iq]->Fill(iM, binConEvent[iPt][iM]); if (compSample) { - mBinConFinalSampled[iPt * 6 + iq]->Fill(iM, binConEventSampled[iq][iPt][iM] / samplesize); + const double avM = binConEventSampled[iq][iPt][iM] / samplesize; + mBinConFinalSampled[iPt * 6 + iq]->Fill(iM, avM); + const double den = std::pow(avM, iq + 2); + const double fqM = ((fqEventSampled[iq][iPt][iM]) / samplesize); - double tmp = (fqEventSampled[iq][iPt][iM] / (samplesize)) / (std::pow(binConEventSampled[iq][iPt][iM] / (samplesize), (iq + 2))); + const double tmp = (den > 0.) ? fqM / den : 0.; mFqBinFinalSampled[iPt * 6 + iq]->Fill(iM, tmp); - tmpFqErr[iq][iPt][iM]->Fill(tmp); - errorFq[iq][iPt][iM] += std::pow(fqEventSampled[iq][iPt][iM] / (samplesize), 2); - mFqError[iPt * 6 + iq]->SetBinContent(iM + 1, 0); - mFqError[iPt * 6 + iq]->Fill(iM, tmpFqErr[iq][iPt][iM]->GetStdDev()); + tmpFqErr[iq][iPt][iM]->Fill(tmp); + ++nSubsamples[iq][iPt][iM]; + const double stdErr = (nSubsamples[iq][iPt][iM] > 1) + ? tmpFqErr[iq][iPt][iM]->GetStdDev() / std::sqrt(static_cast(nSubsamples[iq][iPt][iM])) + : 0.; + mFqError[iPt * 6 + iq]->SetBinContent(iM + 1, stdErr); fqEventSampled[iq][iPt][iM] = 0; binConEventSampled[iq][iPt][iM] = 0; }