33 auto lhs = out->createIterator();
35 auto rhs = operand->createIterator();
38 if (!lhs_it || !rhs_it) {
39 throw std::logic_error(
"Histo iterators have wrong type.");
43 double lhs_s = lhs_it->getSignal();
44 double lhs_err = lhs_it->getError();
45 double rhs_s = rhs_it->getSignal();
46 double rhs_err = rhs_it->getError();
49 if ((lhs_err > 0.0) && (rhs_err > 0.0)) {
50 double rhs_err_sq = rhs_err * rhs_err;
51 double lhs_err_sq = lhs_err * lhs_err;
52 double s = (rhs_s / rhs_err_sq) + (lhs_s / lhs_err_sq);
53 double e = rhs_err_sq * lhs_err_sq / (rhs_err_sq + lhs_err_sq);
56 }
else if ((rhs_err > 0) && (lhs_err == 0)) {
58 error_sq = rhs_err * rhs_err;
59 }
else if ((lhs_err > 0) && (rhs_err == 0)) {
61 error_sq = lhs_err * lhs_err;
64 size_t pos = lhs_it->getLinearIndex();
65 out->setSignalAt(pos, signal);
66 out->setErrorSquaredAt(pos, error_sq);
67 }
while (lhs_it->next() && rhs_it->next());