@@ -182,7 +182,7 @@ struct FactorialMomentsTask {
182182 std::array<std::array<std::array<double , nBins>, 5 >, 6 > fqEventSampled;
183183 std::array<std::array<double , nBins>, 5 > binConEvent;
184184 std::array<std::array<std::array<double , nBins>, 5 >, 6 > binConEventSampled;
185- std::array<std::array<std::array<double , nBins>, 5 >, 6 > errorFq = {{{{{ 0 , 0 , 0 , 0 , 0 }}}} };
185+ std::array<std::array<std::array<int , nBins>, 5 >, nfqOrder> nSubsamples{ };
186186 std::vector<std::shared_ptr<TH2 >> mHistArrReset ;
187187 std::vector<std::shared_ptr<TH1 >> mHistArrQA ;
188188 std::vector<std::shared_ptr<TH3 >> mHistArrEff ;
@@ -307,23 +307,28 @@ struct FactorialMomentsTask {
307307 }
308308 binConEvent[iPt][iM] = binContent / (std::pow (binningM[iM], 2 ));
309309 for (int iq = 0 ; iq < nfqOrder; ++iq) {
310- if (sumfqBin[iq] > 0 ) {
311- fqEvent[iq][iPt][iM] = sumfqBin[iq] / ( std::pow (binningM[iM], 2 ));
312- fqEventSampled [iq][iPt][iM] += fqEvent [iq][iPt][ iM];
313- }
310+ // Always accumulate raw fq numerator and binCon unconditionally so
311+ // both sums run over exactly the same set of events.
312+ fqEvent [iq][iPt][iM] = sumfqBin [iq] / ( std::pow (binningM[ iM], 2 )) ;
313+ fqEventSampled[iq][iPt][iM] += fqEvent[iq][iPt][iM];
314314 binConEventSampled[iq][iPt][iM] += binConEvent[iPt][iM];
315315 mFqBinFinal [iPt * 6 + iq]->Fill (iM, fqEvent[iq][iPt][iM]);
316316 mBinConFinal [iPt * 6 + iq]->Fill (iM, binConEvent[iPt][iM]);
317317 if (compSample) {
318- mBinConFinalSampled [iPt * 6 + iq]->Fill (iM, binConEventSampled[iq][iPt][iM] / samplesize);
318+ const double avM = binConEventSampled[iq][iPt][iM] / samplesize;
319+ mBinConFinalSampled [iPt * 6 + iq]->Fill (iM, avM);
320+ const double den = std::pow (avM, iq + 2 );
321+ const double fqM = ((fqEventSampled[iq][iPt][iM]) / samplesize);
319322
320- double tmp = (fqEventSampled[iq][iPt][iM] / (samplesize)) / ( std::pow (binConEventSampled[iq][iPt][iM] / (samplesize), (iq + 2 ))) ;
323+ const double tmp = (den > 0 .) ? fqM / den : 0 . ;
321324 mFqBinFinalSampled [iPt * 6 + iq]->Fill (iM, tmp);
322- tmpFqErr[iq][iPt][iM]->Fill (tmp);
323- errorFq[iq][iPt][iM] += std::pow (fqEventSampled[iq][iPt][iM] / (samplesize), 2 );
324- mFqError [iPt * 6 + iq]->SetBinContent (iM + 1 , 0 );
325- mFqError [iPt * 6 + iq]->Fill (iM, tmpFqErr[iq][iPt][iM]->GetStdDev ());
326325
326+ tmpFqErr[iq][iPt][iM]->Fill (tmp);
327+ ++nSubsamples[iq][iPt][iM];
328+ const double stdErr = (nSubsamples[iq][iPt][iM] > 1 )
329+ ? tmpFqErr[iq][iPt][iM]->GetStdDev () / std::sqrt (static_cast <double >(nSubsamples[iq][iPt][iM]))
330+ : 0 .;
331+ mFqError [iPt * 6 + iq]->SetBinContent (iM + 1 , stdErr);
327332 fqEventSampled[iq][iPt][iM] = 0 ;
328333 binConEventSampled[iq][iPt][iM] = 0 ;
329334 }
0 commit comments