RooWSFactoryTool crashes with long string expressions

Hi,

I am experiencing a crash when passing a long string expression into the RooWSFactoryTool. I am using the HLFactory as a interface to the RooWSFactoryTool and if the string expression is over a certain amount of characters a buffer overflow occurs. The error is as follows,

[#1] INFO:ObjectHandling – RooWorkspace::exportToCint(HLFavtoryexample_ws) INFO: references to all objects in this workspace will be created in CINT in ‘namespace HLFavtoryexample_ws’
[#0] ERROR:ObjectHandling – RooFactoryWSTool::createArg() ERROR class -epsc)(1-epsl)+1(1-epsb)(1-epsb)(1-epsc)epsl+1(1-epsb)(1-epsb)epsc(1-epsl)+2epsb*(1-epsb)(1-epsc)(1-epsl)+1*(1-epsb)(1-epsb)epscepsl+2epsb*(1-epsb)(1-epsc)epsl+2epsb(1-epsb)epsc(1-epsl)+1epsbepsb*(1-epsc)(1-epsl))))’,eff,xsec,lumi,epsb,epsl,epsc not defined in ROOT class table
[#0] ERROR:ObjectHandling – RooFactoryWSTool::createArg() ERROR class -epsc)
(1-epsl)+1*(1-epsb)(1-epsb)(1-epsc)epsl+1(1-epsb)(1-epsb)epsc(1-epsl)+2epsb*(1-epsb)(1-epsc)(1-epsl)+1*(1-epsb)(1-epsb)epscepsl+2epsb*(1-epsb)(1-epsc)epsl+2epsb(1-epsb)epsc(1-epsl)+1epsbepsb*(1-epsc)*(1-epsl))))’,eff,xsec,lumi,epsb,epsl,epsc not found in factory alias table, nor in ROOT class table
[#0] ERROR:ObjectHandling – RooFactoryWSTool::processExpression() ERRORS detected, transaction to workspace aborted, no objects committed

Below is the .C and .rs file which will reproduce the above error. If the expression (s1) found in the .rs file is shortened this error no longer occurs.

#include <fstream>
#include "TString.h"
#include "TROOT.h"
#include "RooGlobalFunc.h"
#include "RooWorkspace.h"
#include "RooRealVar.h"
#include "RooAbsPdf.h"
#include "RooDataSet.h"
#include "RooPlot.h"
#include "RooStats/HLFactory.h"

using namespace RooFit ;
using namespace RooStats ;
using namespace std;

void rs601_HLFactoryexample() {

    HLFactory hlf("HLFavtoryexample",
                  "hlfCardFile.rs",
                  false);
    RooWorkspace* w = hlf.GetWs();
}

and the corresponding .rs file

xsec[0.4];
lumi[40.0];
eff[0.05, 0, 1.0];
epsb[0.05, 0, 1.0];
epsc[0.05, 0, 1.0];
epsl[0.05, 0, 1.0];
     
s1 = expr('eff*xsec*lumi*((2 * (1 * (1-epsb) * (1-epsl) * (1-epsl) + 2 * (1-epsb) * epsl * (1-epsl) + 1 * epsb * (1-epsl) * (1-epsl) + 1 * (1-epsb) * epsl * epsl + 2 * epsb * epsl * (1-epsl)))  +   (3 * (1 * (1-epsb) * (1-epsl) * (1-epsl) * (1-epsl) + 3 * (1-epsb) * epsl * (1-epsl) * (1-epsl) + 1 * epsb * (1-epsl) * (1-epsl) * (1-epsl) + 3 * (1-epsb) * epsl * epsl * (1-epsl) + 3 * epsb * epsl * (1-epsl) * (1-epsl)))  +   (4 * (1 * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsc) * epsl + 1 * (1-epsb) * epsc * (1-epsl) + 1 * epsb * (1-epsc) * (1-epsl) + 1 * (1-epsb) * epsc * epsl + 1 * epsb * (1-epsc) * epsl + 1 * epsb * epsc * (1-epsl)))  +   (1 * (1 * (1-epsb) * (1-epsb) + 2 * epsb * (1-epsb) + 1 * epsb * epsb))  +   (2 * (1 * (1-epsb) * (1-epsb) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsl + 2 * epsb * (1-epsb) * (1-epsl) + 2 * epsb * (1-epsb) * epsl + 1 * epsb * epsb * (1-epsl)))  +   (6 * (1 * (1-epsb) * (1-epsb) * (1-epsl) * (1-epsl) + 2 * (1-epsb) * (1-epsb) * epsl * (1-epsl) + 2 * epsb * (1-epsb) * (1-epsl) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsl * epsl + 4 * epsb * (1-epsb) * epsl * (1-epsl) + 1 * epsb * epsb * (1-epsl) * (1-epsl)))  +   (3 * (1 * (1-epsb) * (1-epsb) * (1-epsc) + 1 * (1-epsb) * (1-epsb) * epsc + 2 * epsb * (1-epsb) * (1-epsc) + 2 * epsb * (1-epsb) * epsc + 1 * epsb * epsb * (1-epsc)))  +   (3 * (1 * (1-epsb) * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * (1-epsc) * epsl + 1 * (1-epsb) * (1-epsb) * epsc * (1-epsl) + 2 * epsb * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsc * epsl + 2 * epsb * (1-epsb) * (1-epsc) * epsl + 2 * epsb * (1-epsb) * epsc * (1-epsl) + 1 * epsb * epsb * (1-epsc) * (1-epsl))))', eff, xsec, lumi, epsb, epsl, epsc);

Thank you for your help

Hello,

I checked that independently of HLFactory the issue is the in bare RooFit. Here is a shorter macro. Thanks to have reported the issue; I’ll let Wouter handle it. As a temporary fix I would suggest you break down this long formula in parts. An aside comment is that by using RooAddition and RooProduct you might have a more efficient code since you don’t have interpreted expressions then (but it’s also more work to write this long formula).

Cheers,

– Gregory

RooWorkspace wks(“wks”);
wks->factory(“xsec[0.4]”);
wks->factory(“lumi[40.0]”);
wks->factory(“eff[0.05, 0, 1.0]”);
wks->factory(“epsb[0.05, 0, 1.0]”);
wks->factory(“epsc[0.05, 0, 1.0]”);
wks->factory(“epsl[0.05, 0, 1.0]”);
wks->factory(“s1 = expr(‘effxseclumi*((2 * (1 * (1-epsb) * (1-epsl) * (1-epsl) + 2 * (1-epsb) * epsl * (1-epsl) + 1 * epsb * (1-epsl) * (1-epsl) + 1 * (1-epsb) * epsl * epsl + 2 * epsb * epsl * (1-epsl))) + (3 * (1 * (1-epsb) * (1-epsl) * (1-epsl) * (1-epsl) + 3 * (1-epsb) * epsl * (1-epsl) * (1-epsl) + 1 * epsb * (1-epsl) * (1-epsl) * (1-epsl) + 3 * (1-epsb) * epsl * epsl * (1-epsl) + 3 * epsb * epsl * (1-epsl) * (1-epsl))) + (4 * (1 * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsc) * epsl + 1 * (1-epsb) * epsc * (1-epsl) + 1 * epsb * (1-epsc) * (1-epsl) + 1 * (1-epsb) * epsc * epsl + 1 * epsb * (1-epsc) * epsl + 1 * epsb * epsc * (1-epsl))) + (1 * (1 * (1-epsb) * (1-epsb) + 2 * epsb * (1-epsb) + 1 * epsb * epsb)) + (2 * (1 * (1-epsb) * (1-epsb) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsl + 2 * epsb * (1-epsb) * (1-epsl) + 2 * epsb * (1-epsb) * epsl + 1 * epsb * epsb * (1-epsl))) + (6 * (1 * (1-epsb) * (1-epsb) * (1-epsl) * (1-epsl) + 2 * (1-epsb) * (1-epsb) * epsl * (1-epsl) + 2 * epsb * (1-epsb) * (1-epsl) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsl * epsl + 4 * epsb * (1-epsb) * epsl * (1-epsl) + 1 * epsb * epsb * (1-epsl) * (1-epsl))) + (3 * (1 * (1-epsb) * (1-epsb) * (1-epsc) + 1 * (1-epsb) * (1-epsb) * epsc + 2 * epsb * (1-epsb) * (1-epsc) + 2 * epsb * (1-epsb) * epsc + 1 * epsb * epsb * (1-epsc))) + (3 * (1 * (1-epsb) * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * (1-epsc) * epsl + 1 * (1-epsb) * (1-epsb) * epsc * (1-epsl) + 2 * epsb * (1-epsb) * (1-epsc) * (1-epsl) + 1 * (1-epsb) * (1-epsb) * epsc * epsl + 2 * epsb * (1-epsb) * (1-epsc) * epsl + 2 * epsb * (1-epsb) * epsc * (1-epsl) + 1 * epsb * epsb * (1-epsc) * (1-epsl))))’, eff, xsec, lumi, epsb, epsl, epsc)”);