event generation in very restricted phase space

Asked by Alessio Mastroddi

Dear Experts,
I am trying to generate the process e- e+ > e- e+ a a a in the case where all of the final photons are invisible to the detector I am considering. I modified cuts.f appropriately to ensure this condition; then, if I want to generate them in a small kinematic window (explicitly, small in missing mass and missing eta, all defined in cuts.f), the simulation produces only O(100) events of the 10k asked, or sometimes it ends in error with zero cross section.
However, I know that this region is not forbidden by kinematics; if I try to generate events in a larger allowed phase space region, I still get very few events in my (statistically very unfavorable) interesting region. Of course, the price to pay is that even if I generate 10^6 events, the interesting ones drop to about O(10).
Is there a way to actually obtain 10k events already generated in the interesting region, without having to simulate a humongous amount of events in a larger region?

I am using version 3.3.1; I attach here an example of a failed generation: a run card I am using, and the new lines I added in cuts.f (the rest is of course the same). (Note that eb and ej have assigned values in the run card because they are used in cuts.f even if in my process there are no jets or b quarks)

Thanks in advance for your help,
Alessio

#*********************************************************************
# MadGraph5_aMC@NLO *
# *
# run_card.dat MadEvent *
# *
# This file is used to set the parameters of the run. *
# *
# Some notation/conventions: *
# *
# Lines starting with a '# ' are info or comments *
# *
# mind the format: value = variable ! comment *
# *
# To display more options, you can type the command: *
# update full_run_card *
#*********************************************************************
#
#*********************************************************************
# Tag name for the run (one word) *
#*********************************************************************
  tag_1 = run_tag ! name of the run
#*********************************************************************
# Number of events and rnd seed *
# Warning: Do not generate more than 1M events in a single run *
#*********************************************************************
  10000 = nevents ! Number of unweighted events requested
  0 = iseed ! rnd seed (0=assigned automatically=default))
#*********************************************************************
# Collider type and energy *
# lpp: 0=No PDF, 1=proton, -1=antiproton, 2=elastic photon of proton,*
# +/-3=PDF of electron/positron beam *
# +/-4=PDF of muon/antimuon beam *
#*********************************************************************
  0 = lpp1 ! beam 1 type
  0 = lpp2 ! beam 2 type
  5.29 = ebeam1 ! beam 1 total energy in GeV
  5.29 = ebeam2 ! beam 2 total energy in GeV
#*********************************************************************
# Beam polarization from -100 (left-handed) to 100 (right-handed) *
#*********************************************************************
  0.0 = polbeam1 ! beam polarization for beam 1
  0.0 = polbeam2 ! beam polarization for beam 2

#*********************************************************************
# PDF CHOICE: this automatically fixes alpha_s and its evol. *
# pdlabel: lhapdf=LHAPDF (installation needed) [1412.7420] *
# iww=Improved Weizsaecker-Williams Approx.[hep-ph/9310350] *
# eva=Effective W/Z/A Approx. [21yy.zzzzz] *
# none=No PDF, same as lhapdf with lppx=0 *
#*********************************************************************
     none = pdlabel1 ! PDF type for beam #1
     none = pdlabel2 ! PDF type for beam #2230000 = lhaid ! if pdlabel=lhapdf, this is the lhapdf number
# To see heavy ion options: type "update ion_pdf"
#*********************************************************************
# Renormalization and factorization scales *
#*********************************************************************
  False = fixed_ren_scale ! if .true. use fixed ren scale
  False = fixed_fac_scale ! if .true. use fixed fac scale
  91.188 = scale ! fixed ren scale
  91.188 = dsqrt_q2fact1 ! fixed fact scale for pdf1
  91.188 = dsqrt_q2fact2 ! fixed fact scale for pdf2
  -1 = dynamical_scale_choice ! Choose one of the preselected dynamical choices
  1.0 = scalefact ! scale factor for event-by-event scales

#*********************************************************************
# Type and output format
#*********************************************************************
  False = gridpack !True = setting up the grid pack
  -1.0 = time_of_flight ! threshold (in mm) below which the invariant livetime is not written (-1 means not written)
  average = event_norm ! average/sum. Normalization of the weight in the LHEF
# To see MLM/CKKW merging options: type "update MLM" or "update CKKW"

#*********************************************************************
#
#*********************************************************************
# Phase-Space Optimization strategy (basic options)
#*********************************************************************
  0 = nhel ! using helicities importance sampling or not.
                             ! 0: sum over helicity, 1: importance sampling
  2 = sde_strategy ! default integration strategy (hep-ph/2021.xxxxx)
                             ! 1 is old strategy (using amp square)
        ! 2 is new strategy (using only the denominator)
# To see advanced option for Phase-Space optimization: type "update psoptim"
#*********************************************************************
# Generation bias, check the wiki page below for more information: *
# 'cp3.irmp.ucl.ac.be/projects/madgraph/wiki/LOEventGenerationBias' *
#*********************************************************************
  None = bias_module ! Bias type of bias, [None, ptj_bias, -custom_folder-]
  {} = bias_parameters ! Specifies the parameters of the module.
#
#*******************************
# Parton level cuts definition *
#*******************************
  0.0 = dsqrt_shat ! minimal shat for full process
#
#
#*********************************************************************
# BW cutoff (M+/-bwcutoff*Gamma) ! Define on/off-shell for "$" and decay
#*********************************************************************
  15.0 = bwcutoff ! (M+/-bwcutoff*Gamma)
#*********************************************************************
# Standard Cuts *
#*********************************************************************
# Minimum and maximum pt's (for max, -1 means no cut) *
#*********************************************************************
  0.0 = pta ! minimum pt for the photons
  0.0 = ptl ! minimum pt for the charged leptons
  -1.0 = ptamax ! maximum pt for the photons
  -1.0 = ptlmax ! maximum pt for the charged leptons
  {} = pt_min_pdg ! pt cut for other particles (use pdg code). Applied on particle and anti-particle
  {} = pt_max_pdg ! pt cut for other particles (syntax e.g. {6: 100, 25: 50})
#*********************************************************************
# Minimum and maximum E's (in the center of mass frame) *
#*********************************************************************
  -1.5 = ej ! minimum E for the jets
  0.2 = eb ! minimum E for the b
  0.001 = ea ! minimum E for the photons
  0.25 = el ! minimum E for the charged leptons
  1.5 = ejmax ! maximum E for the jets
  1.0 = ebmax ! maximum E for the b
  -1.0 = eamax ! maximum E for the photons
  -1.0 = elmax ! maximum E for the charged leptons
  {} = e_min_pdg ! E cut for other particles (use pdg code). Applied on particle and anti-particle
  {} = e_max_pdg ! E cut for other particles (syntax e.g. {6: 100, 25: 50})

#*********************************************************************
# Maximum and minimum absolute rapidity (for max, -1 means no cut) *
#*********************************************************************
  5.0 = etaa ! max rap for the photons
  1.63 = etal ! max rap for the charged leptons
  0.0 = etajmin ! min rap for the jets
  -5.0 = etaamin ! min rap for the photons
  -1.63 = etalmin ! main rap for the charged leptons
  {} = eta_min_pdg ! rap cut for other particles (use pdg code). Applied on particle and anti-particle
  {} = eta_max_pdg ! rap cut for other particles (syntax e.g. {6: 2.5, 23: 5})
#*********************************************************************
# Minimum and maximum DeltaR distance *
#*********************************************************************
  0.001 = drll ! min distance between leptons
  0.001 = draa ! min distance between gammas
  0.001 = dral ! min distance between gamma and lepton
  -1.0 = drllmax ! max distance between leptons
  -1.0 = draamax ! max distance between gammas
  -1.0 = dralmax ! maxdistance between gamma and lepton
#*********************************************************************
# Minimum and maximum invariant mass for pairs *
#*********************************************************************
  0.001 = mmaa ! min invariant mass of gamma gamma pair
  0.01 = mmll ! min invariant mass of l+l- (same flavour) lepton pair
  -1.0 = mmaamax ! max invariant mass of gamma gamma pair
  -1.0 = mmllmax ! max invariant mass of l+l- (same flavour) lepton pair
  {} = mxx_min_pdg ! min invariant mass of a pair of particles X/X~ (e.g. {6:250})
  {'default': False} = mxx_only_part_antipart ! if True the invariant mass is applied only
                       ! to pairs of particle/antiparticle and not to pairs of the same pdg codes.
 #*********************************************************************
 # Minimum and maximum invariant mass for all letpons *
 #*********************************************************************
  0.01 = mmnl ! min invariant mass for all letpons (l+- and vl)
  -1.0 = mmnlmax ! max invariant mass for all letpons (l+- and vl)
 #*********************************************************************
 # Minimum and maximum pt for 4-momenta sum of leptons / neutrino *
 # for pair of lepton includes only same flavor, opposite charge
 #*********************************************************************
  0.0 = ptllmin ! Minimum pt for 4-momenta sum of leptons(l and vl)
  -1.0 = ptllmax ! Maximum pt for 4-momenta sum of leptons(l and vl)
#*********************************************************************
# Inclusive cuts *
#*********************************************************************
  0.0 = xpta ! minimum pt for at least one photon
  0.0 = xptl ! minimum pt for at least one charged lepton
 #*********************************************************************
 # Control the pt's of leptons sorted by pt *
 #*********************************************************************
  0.0 = ptl1min ! minimum pt for the leading lepton in pt
  0.0 = ptl2min ! minimum pt for the second lepton in pt
  -1.0 = ptl1max ! maximum pt for the leading lepton in pt
  -1.0 = ptl2max ! maximum pt for the second lepton in pt
#*********************************************************************
# maximal pdg code for quark to be considered as a light jet *
# (otherwise b cuts are applied) *
#*********************************************************************
  4 = maxjetflavor ! Maximum jet pdg code
#*********************************************************************
#
#*********************************************************************
# Store info for systematics studies *
# WARNING: Do not use for interference type of computation *
#*********************************************************************
  False = use_syst ! Enable systematics studies
#
  systematics = systematics_program ! none, systematics [python], SysCalc [depreceted, C++]
  ['--mur=0.5,1,2', '--muf=0.5,1,2', '--pdf=errorset'] = systematics_arguments ! see: https://cp3.irmp.ucl.ac.be/projects/madgraph/wiki/Systematics#Systematicspythonmodule

#####CUTS.F NEW LINES #######################

      gp1=rap(p(0,5)).lt.1.63.and.p(0,5).gt.0.25
      gp2=rap(p(0,6)).lt.1.63.and.p(0,6).gt.0.25
      gp3=rap(p(0,7)).lt.1.63.and.p(0,7).gt.0.25

      if (gp1.or.gp2.or.gp3) then
        passcuts=.false.
        return
      endif

      do j=0,3
         my_miss_mom(j)=my_miss_mom(j)+p(j,1)+p(j,2)-p(j,3)-p(j,4)
      enddo
      tmp=sqrt(my_miss_mom(1)**2+my_miss_mom(2)**2+my_miss_mom(3)**2)
      miss_rap=.5d0*dlog((tmp+my_miss_mom(3))/(tmp-my_miss_mom(3)))

c Missing energy

      if (my_miss_mom(0).lt.2) then
        passcuts=.false.
        return
      endif

c Missing mass

      tmp=dot(my_miss_mom,my_miss_mom)
      if ((tmp.lt.(eb**2)).or.(tmp.gt.(ebmax**2))) then
        passcuts=.false.
        return
      endif

c Missing rapidity

      if ((miss_rap.lt.ej).or.(miss_rap.gt.ejmax)) then
        passcuts=.false.
        return
      endif

Question information

Language:
English Edit question
Status:
Answered
For:
MadGraph5_aMC@NLO Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Olivier Mattelaer (olivier-mattelaer) said :
#1

Hi,

define cut in cuts.f typically works only for mild cut.

Because at the first iteration, you are actually doing a probe of the phase-space and if your cut is too strong you can fail to probe the too small area of the phase-space that is relevant. Hard cut implemented like that can therefore lead to zero cross-section if the integration fails to find any. But it can be worse and lead to wrong value. This is because we use multi-channel method and some channel can fail while others do not which can lead to an under-estimation of the cross-section.

After the first iteration things can improve thanks to the machine learning layer (VEGAS) but depending of the type of cuts this can also fails.

So long story short the solution might be that you need to redefine your phase-space parametrization, which is far from trivial.

> (Note that eb and ej have assigned values in the run card because they are used in cuts.f even if in my process there are no jets or b quarks)

I guess this is fine here, but re-using variable for something else can be dangerous since those variables are used to optimize the phase-space parametrization and can therefore lead to un-expected behavior.

So i guess a solution is to find a sweet spot where the cut are mild enough to converge and strong enough such that you do not waste too much.
I see that you are using a quite old run_card. In the default one of 3.3.1, you have instruction (via the update command during the edition of the card) to include a block of parameter related to optimization of the phase-space.
You can in particular use the hard_survey parameter within that block to increase the limit before the phase-space gives up on a given contribution.

Cheers,

Olivier

Revision history for this message
Francesca Acanfora (facanfora) said :
#2

Hi Olivier,
I refer to you saying
"at the first iteration, you are actually doing a probe of the phase-space".
I am interested in the phase space volume associated to the cuts I asked for the run. Is there any way of recovering this information? With what error?
Thanks
Francesca Acanfora

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) said :
#3

Hi,

Not in an easy way. In principle, you can define a bias module where you should be able to setup the bias as the inverse of the product of the matrix-element times pdf.
But now the convergence of such extreme bias will likely be problematic.

Cheers,

Olivier

Revision history for this message
Francesca Acanfora (facanfora) said :
#4

Got it, thank you!
Francesca

Can you help with this problem?

Provide an answer of your own, or ask Alessio Mastroddi for more information if necessary.

To post a message you must log in.