119 constexpr bool IsDstH2D = std::is_same_v<RootHistogram, TH2D>;
120 constexpr bool IsDstProf2D = std::is_same_v<RootHistogram, TProfile2D>;
121 constexpr bool IsSrcH1D = std::is_same_v<QaHistogram, H1D>;
122 constexpr bool IsSrcProf1D = std::is_same_v<QaHistogram, Prof1D>;
124 static_assert((IsDstH2D && IsSrcH1D) || (IsDstProf2D && IsSrcProf1D),
125 "function not implemented for a given (RootHistogram, QaHistogram) pair");
127 auto iBinX = this->GetXaxis()->FindBin(val);
128 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
129 int iGlobBin = this->GetBin(iBinX, iBinY);
130 auto binSrc = src.GetBinAccumulator(iBinY);
131 if constexpr (IsSrcH1D) {
132 this->fArray[iGlobBin] += binSrc.value();
133 if (this->fSumw2.fN) {
134 this->fSumw2.fArray[iGlobBin] += binSrc.variance();
137 else if constexpr (IsSrcProf1D) {
138 this->fArray[iGlobBin] += binSrc.GetSumWV();
139 this->fBinEntries.fArray[iGlobBin] += binSrc.GetSumW();
140 this->fSumw2.fArray[iGlobBin] += binSrc.GetSumWV2();
141 this->fBinSumw2.fArray[iGlobBin] += binSrc.GetSumW2();
142 this->fTsumwz += binSrc.GetSumWV();
143 this->fTsumwz2 += binSrc.GetSumWV2();
146 this->fTsumw += src.GetTotSumW();
147 this->fTsumw2 += src.GetTotSumW2();
148 this->fTsumwx += src.GetTotSumWX();
149 this->fTsumwx2 += src.GetTotSumWX2();
150 this->SetEntries(this->GetEntries() + src.GetEntries());
160 if constexpr (std::is_same_v<RootHistogram, TProfile> || std::is_same_v<RootHistogram, TProfile2D>) {
162 auto SetBin = [&](
int iBinRoot,
const auto& binQa) {
163 this->fArray[iBinRoot] = binQa.GetSumWV();
164 this->fBinEntries.fArray[iBinRoot] = binQa.GetSumW();
165 this->fSumw2.fArray[iBinRoot] = binQa.GetSumWV2();
166 this->fBinSumw2.fArray[iBinRoot] = binQa.GetSumW2();
168 if constexpr (std::is_same_v<RootHistogram, TProfile>) {
169 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
170 int iBin = this->GetBin(iBinX);
171 auto bin = hist.GetBinAccumulator(iBinX);
173 this->fTsumwy += bin.GetSumWV();
174 this->fTsumwy2 += bin.GetSumWV2();
177 else if constexpr (std::is_same_v<RootHistogram, TProfile2D>) {
178 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
179 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
180 int iBin = this->GetBin(iBinX, iBinY);
181 auto bin = hist.GetBinAccumulator(iBinX, iBinY);
183 this->fTsumwz += bin.GetSumWV();
184 this->fTsumwz2 += bin.GetSumWV2();
189 else if constexpr (std::is_same_v<RootHistogram, TH1D> || std::is_same_v<RootHistogram, TH2D>) {
190 if (hist.GetTotSumW() != hist.GetTotSumW2()) {
191 if (!this->fSumw2.fN) {
195 auto SetBin = [&](
int iBinRoot,
const auto& binQa) {
196 this->fArray[iBinRoot] = binQa.value();
197 if (this->fSumw2.fN) {
198 this->fSumw2.fArray[iBinRoot] = binQa.variance();
201 if constexpr (std::is_same_v<RootHistogram, TH1D>) {
202 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
203 SetBin(this->GetBin(iBinX), hist.GetBinAccumulator(iBinX));
206 else if constexpr (std::is_same_v<RootHistogram, TH2D>) {
207 for (
int iBinX = 0; iBinX <= this->GetNbinsX() + 1; ++iBinX) {
208 for (
int iBinY = 0; iBinY <= this->GetNbinsY() + 1; ++iBinY) {
209 SetBin(this->GetBin(iBinX, iBinY), hist.GetBinAccumulator(iBinX, iBinY));
216 if constexpr (std::is_base_of_v<TH2D, RootHistogram>) {
217 this->fTsumwy = hist.GetTotSumWY();
218 this->fTsumwy2 = hist.GetTotSumWY2();
219 this->fTsumwxy = hist.GetTotSumWXY();
221 this->fTsumw = hist.GetTotSumW();
222 this->fTsumw2 = hist.GetTotSumW2();
223 this->fTsumwx = hist.GetTotSumWX();
224 this->fTsumwx2 = hist.GetTotSumWX2();
225 this->SetEntries(hist.GetEntries());