110 constexpr bool IsDstH2D = std::is_same_v<RootHistogram, TH2D>;
111 constexpr bool IsDstProf2D = std::is_same_v<RootHistogram, TProfile2D>;
112 constexpr bool IsSrcH1D = std::is_same_v<QaHistogram, H1D>;
113 constexpr bool IsSrcProf1D = std::is_same_v<QaHistogram, Prof1D>;
115 static_assert((IsDstH2D && IsSrcH1D) || (IsDstProf2D && IsSrcProf1D),
116 "function not implemented for a given (RootHistogram, QaHistogram) pair");
118 auto iBinX = this->GetXaxis()->FindBin(val);
119 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
120 int iGlobBin = this->GetBin(iBinX, iBinY);
121 auto binSrc = src.GetBinAccumulator(iBinY);
122 if constexpr (IsSrcH1D) {
123 this->fArray[iGlobBin] += binSrc.value();
124 if (this->fSumw2.fN) {
125 this->fSumw2.fArray[iGlobBin] += binSrc.variance();
128 else if constexpr (IsSrcProf1D) {
129 this->fArray[iGlobBin] += binSrc.GetSumWV();
130 this->fBinEntries.fArray[iGlobBin] += binSrc.GetSumW();
131 this->fSumw2.fArray[iGlobBin] += binSrc.GetSumWV2();
132 this->fBinSumw2.fArray[iGlobBin] += binSrc.GetSumW2();
133 this->fTsumwz += binSrc.GetSumWV();
134 this->fTsumwz2 += binSrc.GetSumWV2();
137 this->fTsumw += src.GetTotSumW();
138 this->fTsumw2 += src.GetTotSumW2();
139 this->fTsumwx += src.GetTotSumWX();
140 this->fTsumwx2 += src.GetTotSumWX2();
141 this->SetEntries(this->GetEntries() + src.GetEntries());
151 if constexpr (std::is_same_v<RootHistogram, TProfile> || std::is_same_v<RootHistogram, TProfile2D>) {
153 auto SetBin = [&](
int iBinRoot,
const auto& binQa) {
154 this->fArray[iBinRoot] = binQa.GetSumWV();
155 this->fBinEntries.fArray[iBinRoot] = binQa.GetSumW();
156 this->fSumw2.fArray[iBinRoot] = binQa.GetSumWV2();
157 this->fBinSumw2.fArray[iBinRoot] = binQa.GetSumW2();
159 if constexpr (std::is_same_v<RootHistogram, TProfile>) {
160 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
161 int iBin = this->GetBin(iBinX);
162 auto bin = hist.GetBinAccumulator(iBinX);
164 this->fTsumwy += bin.GetSumWV();
165 this->fTsumwy2 += bin.GetSumWV2();
168 else if constexpr (std::is_same_v<RootHistogram, TProfile2D>) {
169 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
170 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
171 int iBin = this->GetBin(iBinX, iBinY);
172 auto bin = hist.GetBinAccumulator(iBinX, iBinY);
174 this->fTsumwz += bin.GetSumWV();
175 this->fTsumwz2 += bin.GetSumWV2();
180 else if constexpr (std::is_same_v<RootHistogram, TH1D> || std::is_same_v<RootHistogram, TH2D>) {
181 if (hist.GetTotSumW() != hist.GetTotSumW2()) {
182 if (!this->fSumw2.fN) {
186 auto SetBin = [&](
int iBinRoot,
const auto& binQa) {
187 this->fArray[iBinRoot] = binQa.value();
188 if (this->fSumw2.fN) {
189 this->fSumw2.fArray[iBinRoot] = binQa.variance();
192 if constexpr (std::is_same_v<RootHistogram, TH1D>) {
193 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
194 SetBin(this->GetBin(iBinX), hist.GetBinAccumulator(iBinX));
197 else if constexpr (std::is_same_v<RootHistogram, TH2D>) {
198 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
199 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
200 SetBin(this->GetBin(iBinX, iBinY), hist.GetBinAccumulator(iBinX, iBinY));
207 if constexpr (std::is_base_of_v<TH2D, RootHistogram>) {
208 this->fTsumwy = hist.GetTotSumWY();
209 this->fTsumwy2 = hist.GetTotSumWY2();
210 this->fTsumwxy = hist.GetTotSumWXY();
212 this->fTsumw = hist.GetTotSumW();
213 this->fTsumw2 = hist.GetTotSumW2();
214 this->fTsumwx = hist.GetTotSumWX();
215 this->fTsumwx2 = hist.GetTotSumWX2();
216 this->SetEntries(hist.GetEntries());