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