diff --git a/roofit/roofitcore/src/RooFit/Evaluator.cxx b/roofit/roofitcore/src/RooFit/Evaluator.cxx index 2cb6f4589df70..0ad61d2774a26 100644 --- a/roofit/roofitcore/src/RooFit/Evaluator.cxx +++ b/roofit/roofitcore/src/RooFit/Evaluator.cxx @@ -112,6 +112,7 @@ struct NodeInfo { bool isCategory = false; bool hasLogged = false; bool computeInGPU = false; + bool isValueServer = false; // if this node is a value server to the top node std::size_t outputSize = 1; std::size_t lastSetValCount = std::numeric_limits::max(); int lastCatVal = std::numeric_limits::max(); @@ -207,6 +208,16 @@ Evaluator::Evaluator(const RooAbsReal &absReal, bool useGPU) } } + // Figure out which nodes are value servers to the top node + _nodes.back().isValueServer = true; // the top node itself + for (auto iter = _nodes.rbegin(); iter != _nodes.rend(); ++iter) { + if (!iter->isValueServer) + continue; + for (auto &serverInfo : iter->serverInfos) { + serverInfo->isValueServer = true; + } + } + syncDataTokens(); if (_useGPU) { @@ -687,7 +698,7 @@ RooArgSet Evaluator::getParameters() const { RooArgSet parameters; for (auto &nodeInfo : _nodes) { - if (nodeInfo.absArg->isFundamental()) { + if (nodeInfo.isValueServer && nodeInfo.absArg->isFundamental()) { parameters.add(*nodeInfo.absArg); } }