RooFit does not converge using RooFFTConvPdf in RooProdPdf with Root 6.06/02

Dear all,
I’m trying to fit a 2-dimensional distribution using RooProdPdf. One dimension, x1, is described by a Breit Wigner convoluted with a Gaussian resolution, the other simply by a Gaussian. I am running the fit on toy data produced from the RooProdPdf itself.

I have tried two approaches:

  1. describe distribution in x1 with a RooVoigtian (line 40 used in script):
    the fit converges and reproduces the parameters used for the sampling of the toy data

  2. describe distribution in x1 with a RooFFTConvPdf of a Breit Wigner and a Gaussian (line 44 used in script):
    the fit tells me, it converged, but it does not reproduce the parameters used for the sampling of the toy data

I am using RooFit v3.60 with Root 6.06/02 built for linuxx8664gcc and run the script with “root test_convolution.cc”

Attached is the script I use and two text files with the output of the fit for both aproaches.

As approach 1) works, but 2) does not, the problem seems to lie with RooFFTConvPdf and is probably connected to the one from sft.its.cern.ch/jira/browse/ROOT-5380 opened a few years ago.

Is there a way to get RooFFTConvPdf to work with RooProdPdf properly? In the end I want to use a custom pdf with a Gaussian resolution model for my fit, so sticking with approach 1) won’t work for me unfortunately.

Thanks in advance,
Jascha
output_RooFFTConv.txt (7.29 KB)
test_convolution.cc (2.42 KB)
output_RooVoigtian.txt (4.44 KB)

Hi Jascha,

I can reproduce this bug. Is particular visible by plotting the NLL function in two different ways, one using RooAbsReal::asTF and the other using RooAbsReal::createHistogram.
One can see that in the first case the NLL is computed incorrectly.

As you suspect, the problem is caused by the RooProdPdf, although the two components are uncorrelated.

For reference I attached your modified script. I will submit a JIRA bug on this and contact the RooFit author.

Best Regards

Lorenzo

Modified macro:

test_convolution(0) : use Voigtian works fine
test_convolution(1) : use FFTW - wrong NLL is computed
test_convolution.cc (4.11 KB)