@@ -2147,34 +2147,53 @@ RooProdPdf::compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileC
21472147 }
21482148 }
21492149
2150+ return compileToFixedProdPdf (normSet, nullptr , nullptr , ctx, true );
2151+ }
2152+
2153+ std::unique_ptr<RooAbsArg> RooProdPdf::compileToFixedProdPdf (RooArgSet const &normSet, RooArgSet const *intSet,
2154+ const char *rangeName, RooFit::Detail::CompileContext &ctx,
2155+ bool compileServers) const
2156+ {
21502157 std::unique_ptr<RooProdPdf> prodPdfClone{static_cast <RooProdPdf *>(this ->Clone ())};
21512158 ctx.markAsCompiled (*prodPdfClone);
21522159
2153- for (const auto server : prodPdfClone->servers ()) {
2154- auto nsetForServer = fillNormSetForServer (normSet, *server);
2155- RooArgSet const &nset = nsetForServer ? *nsetForServer : normSet;
2160+ if (compileServers)
2161+ for (const auto server : prodPdfClone->servers ()) {
2162+ auto nsetForServer = fillNormSetForServer (normSet, *server);
2163+ RooArgSet const &nset = nsetForServer ? *nsetForServer : normSet;
21562164
2157- RooArgSet depList;
2158- server->getObservables (&nset, depList);
2165+ RooArgSet depList;
2166+ server->getObservables (&nset, depList);
21592167
2160- ctx.compileServer (*server, *prodPdfClone, depList);
2161- }
2168+ ctx.compileServer (*server, *prodPdfClone, depList);
2169+ }
21622170
2163- auto fixedProdPdf = std::make_unique<RooFit::Detail::RooFixedProdPdf>(std::move (prodPdfClone), normSet);
2164- ctx.markAsCompiled (*fixedProdPdf);
2171+ auto fixedProdPdf =
2172+ std::make_unique<RooFit::Detail::RooFixedProdPdf>(std::move (prodPdfClone), normSet, intSet, rangeName);
2173+ if (compileServers)
2174+ ctx.markAsCompiled (*fixedProdPdf);
2175+ else
2176+ ctx.compileServers (*fixedProdPdf, normSet);
21652177
21662178 return fixedProdPdf;
21672179}
21682180
21692181namespace RooFit ::Detail {
21702182
2171- RooFixedProdPdf::RooFixedProdPdf (std::unique_ptr<RooProdPdf> &&prodPdf, RooArgSet const &normSet)
2183+ RooFixedProdPdf::RooFixedProdPdf (std::unique_ptr<RooProdPdf> &&prodPdf, RooArgSet const &normSet,
2184+ RooArgSet const *intSet, const char *rangeName)
21722185 : RooAbsPdf(prodPdf->GetName (), prodPdf->GetTitle()),
21732186 _normSet{normSet},
21742187 _servers (" !servers" , " List of servers" , this ),
2175- _prodPdf{std::move (prodPdf)}
2188+ _prodPdf{std::move (prodPdf)},
2189+ _rangeName{rangeName ? rangeName : " " }
21762190{
2177- auto cache = _prodPdf->createCacheElem (&_normSet, nullptr );
2191+ if (intSet) {
2192+ _intSet.add (*intSet);
2193+ }
2194+
2195+ RooArgSet const *iset = _intSet.empty () ? nullptr : &_intSet;
2196+ auto cache = _prodPdf->createCacheElem (&_normSet, iset, _rangeName.empty () ? nullptr : _rangeName.c_str ());
21782197 _isRearranged = cache->_isRearranged ;
21792198
21802199 // The actual servers for a given normalization set depend on whether the
@@ -2190,25 +2209,27 @@ RooFixedProdPdf::RooFixedProdPdf(std::unique_ptr<RooProdPdf> &&prodPdf, RooArgSe
21902209 // We don't want to carry the full cache object around, so we let it go out
21912210 // of scope and transfer the ownership of the args that we actually need.
21922211 cache->_ownedList .releaseOwnership ();
2193- std::vector<std::unique_ptr<RooAbsArg>> owned;
2194- for (RooAbsArg *arg : cache->_ownedList ) {
2195- owned.emplace_back (arg);
2196- }
2212+ // std::vector<std::unique_ptr<RooAbsArg>> owned;
2213+ // for (RooAbsArg *arg : cache->_ownedList) {
2214+ // owned.emplace_back(arg);
2215+ // }
21972216 for (RooAbsArg *arg : cache->_partList ) {
21982217 _servers.add (*arg);
2199- auto found = std::find_if (owned.begin (), owned.end (), [&](auto const &ptr) { return arg == ptr.get (); });
2200- if (found != owned.end ()) {
2201- addOwnedComponents (std::move (owned[std::distance (owned.begin (), found)]));
2202- }
2218+ // auto found = std::find_if(owned.begin(), owned.end(), [&](auto const &ptr) { return arg == ptr.get(); });
2219+ // if (found != owned.end()) {
2220+ // addOwnedComponents(std::move(owned[std::distance(owned.begin(), found)]));
2221+ // }
22032222 }
22042223}
22052224
22062225RooFixedProdPdf::RooFixedProdPdf (const RooFixedProdPdf &other, const char *name)
22072226 : RooAbsPdf(other, name),
2227+ _intSet{other._intSet },
22082228 _normSet{other._normSet },
22092229 _servers (" !servers" , this , other._servers),
22102230 _prodPdf{static_cast <RooProdPdf *>(other._prodPdf ->Clone ())},
2211- _isRearranged{other._isRearranged }
2231+ _isRearranged{other._isRearranged },
2232+ _rangeName{other._rangeName }
22122233{
22132234}
22142235
0 commit comments