10 This module contains convenience functions to setup most commonly used physics
11 generators correctly with their default settings. More information can be found
12 in `BELLE2-NOTE-PH-2015-006`_
14 .. _BELLE2-NOTE-PH-2015-006: https://docs.belle2.org/record/282
21 def get_default_decayfile():
22 """Return the default DECAY.dec for Belle2"""
23 return b2.find_file(
"decfiles/dec/DECAY_BELLE2.DEC")
26 def add_generator_preselection(
34 MaxChargedTheta=180.0,
41 stableParticles=False):
43 Adds generator preselection.
44 Should be added to the path after the generator.add_abc_generator but before simulation.add_simulation modules
45 It uses all particles from the event generator (i.e. primary, non-virtual, non-initial particles).
46 It checks if the required conditions are fulfilled.
47 If not, the events are given to the emptypath.
48 The main use case is a reduction of simulation time.
49 Note that you have to multiply the generated cross section by the retention fraction of the preselection.
52 path (basf2.Path): path where the generator should be added
53 emptypath (basf2.Path): path where the skipped events are given to
54 nChargedMin (int): minimum number of charged particles
55 nChargedMax (int): maximum number of charged particles
56 MinChargedP (float): minimum charged momentum [GeV]
57 MinChargedPt (float): minimum charged transverse momentum (pt) [GeV]
58 MinChargedTheta (float): minimum polar angle of charged particle [deg]
59 MaxChargedTheta (float): maximum polar angle of charged particle [deg]
60 nPhotonMin (int): minimum number of photons
61 nPhotonMax (int): maximum number of photons
62 MinPhotonEnergy (float): minimum photon energy [GeV]
63 MinPhotonTheta (float): minimum polar angle of photon [deg]
64 MaxPhotonTheta (float): maximum polar angle of photon [deg]
65 applyInCMS (bool): if true apply the P,Pt,theta, and energy cuts in the center of mass frame
66 stableParticles (bool): if true apply the selection criteria for stable particles in the generator
69 generatorpreselection = path.add_module(
'GeneratorPreselection',
70 nChargedMin=nChargedMin,
71 nChargedMax=nChargedMax,
72 MinChargedP=MinChargedP,
73 MinChargedPt=MinChargedPt,
74 MinChargedTheta=MinChargedTheta,
75 MaxChargedTheta=MaxChargedTheta,
76 nPhotonMin=nPhotonMin,
77 nPhotonMax=nPhotonMax,
78 MinPhotonEnergy=MinPhotonEnergy,
79 MinPhotonTheta=MinPhotonTheta,
80 MaxPhotonTheta=MaxPhotonTheta,
81 applyInCMS=applyInCMS,
82 stableParticles=stableParticles
86 generatorpreselection.if_value(
'<11', emptypath)
89 def add_aafh_generator(
100 Add the default two photon generator for four fermion final states
103 path (basf2.Path): path where the generator should be added
104 finalstate (str): either "e+e-e+e-", "e+e-mu+mu-", "e+e-tau+tau-", "mu+mu-mu+mu-" or "mu+mu-tau+tau-"
105 preselection (bool): if True, select events with at least one medium pt particle in the CDC acceptance
106 enableTauDecays (bool): if True, allow tau leptons to decay (using EvtGen)
107 minmass (float): minimum invariant mass
108 subweights (list(float)): list of four or eight values (first four are interpreted as WAP, rest as WBP)
109 which specify the relative weights for each of the four sub generators
110 maxsubweight (float): maximum expected subgenerator weight for rejection scheme
111 maxfinalweight (float): maximum expected final weight for rejection scheme
112 eventType (str) : event type information
115 if finalstate ==
'e+e-e+e-':
118 aafh_subgeneratorWeights = [1.0, 7.986e+01, 5.798e+04, 3.898e+05, 1.0, 1.664e+00, 2.812e+00, 7.321e-01]
120 aafh_subgeneratorWeights = subweights
121 if abs(minmass - 0.5) > 0.01
and not subweights:
122 b2.B2WARNING(
"add_aafh_generator: non default invariant mass cut without updated subweights requested!")
123 elif finalstate ==
'e+e-mu+mu-':
126 aafh_subgeneratorWeights = [1.000e+00, 1.520e+01, 3.106e+03, 6.374e+03, 1.000e+00, 1.778e+00, 6.075e+00, 6.512e+00]
128 aafh_subgeneratorWeights = subweights
129 if abs(minmass - 0.5) > 0.01
and not subweights:
130 b2.B2WARNING(
"add_aafh_generator: non default invariant mass cut without updated subweights requested!")
131 elif finalstate ==
'e+e-tau+tau-':
135 aafh_subgeneratorWeights = [1.000e+00, 2.214e+00, 1.202e+01, 1.536e+01, 1.000e+00, 1.664e+00, 1.680e+01, 6.934e+00]
137 aafh_subgeneratorWeights = subweights
140 f
"You requested a generator preselection for the final state {finalstate}: "
141 "please consider to remove it, since the cross section is small.")
142 elif finalstate ==
'mu+mu-mu+mu-':
147 aafh_subgeneratorWeights = [0.000e+00, 0.000e+00, 1.000e+00, 3.726e+00, 1.000e+00, 1.778e+00, 1.000e+00, 1.094e+00]
149 aafh_subgeneratorWeights = subweights
152 f
"You requested a generator preselection for the final state {finalstate}: "
153 "please consider to remove it, since the cross section is small.")
154 elif finalstate ==
'mu+mu-tau+tau-':
159 aafh_subgeneratorWeights = [0.000e+00, 0.000e+00, 1.000e+00, 1.715e+00, 1.000e+00, 1.778e+00, 1.000e+00, 6.257e-01]
161 aafh_subgeneratorWeights = subweights
164 f
"You requested a generator preselection for the final state {finalstate}: "
165 "please consider to remove it, since the cross section is small.")
166 elif finalstate ==
'tau+tau-tau+tau-':
167 b2.B2FATAL(f
"AAFH is not able to generate the {finalstate} final state. Please use KoralW instead.")
169 b2.B2FATAL(f
"add_aafh_generator final state not supported: {finalstate}")
171 aafh_maxSubgeneratorWeight = maxsubweight
172 aafh_maxFinalWeight = maxfinalweight
178 maxSubgeneratorWeight=aafh_maxSubgeneratorWeight,
179 maxFinalWeight=aafh_maxFinalWeight,
180 subgeneratorWeights=aafh_subgeneratorWeights,
181 suppressionLimits=[1e100] * 4,
187 generator_emptypath = b2.create_path()
188 add_generator_preselection(
190 emptypath=generator_emptypath,
193 MinChargedTheta=17.0,
194 MaxChargedTheta=150.0)
196 if 'tau+tau-' in finalstate:
198 path.add_module(
'EvtGenDecay')
200 b2.B2WARNING(
"The tau decays will not be generated.")
203 def add_kkmc_generator(path, finalstate='', signalconfigfile='', useTauolaBelle=False, tauinputfile='', eventType=''):
205 Add the default muon pair and tau pair generator KKMC.
206 For tau decays, TauolaBelle and TauolaBelle2 are available.
207 Signal events can be produced setting a configuration file. Please notice that the configuration files for
208 TauolaBelle and TauolaBelle2 has a very different structure (see the examples below generators/examples).
211 path (basf2.Path): path where the generator should be added
212 finalstate(str): either "mu-mu+" or "tau-tau+"
213 signalconfigfile(str): File with configuration of the signal event to generate. It doesn't affect mu-mu+ decays.
214 useTauolaBelle(bool): If true, tau decay is driven by TauolaBelle. Otherwise TauolaBelle2 is used.
215 It doesn't affect mu-mu+ decays.
216 tauinputfile(str) : File to override KK2f_defaults. Only [sometimes] needed when tau decay is driven by TauolaBelle.
217 eventType (str) : event type information
221 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/tauola_bbb.input.dat')
224 kkmc_logfile =
'kkmc_tautau.txt'
227 kkmc_config = b2.find_file(
'data/generators/kkmc/KK2f_defaults.dat')
230 kkmc_tauconfigfile =
''
232 if finalstate ==
'tau+tau-':
233 b2.B2WARNING(
"add_kkmc_generator: please set finalstate as 'tau-tau+'. 'tau+tau-' will be deprecated in the future"
234 " for consistency in the configuration files.")
235 finalstate =
'tau-tau+'
236 if finalstate ==
'mu+mu-':
237 b2.B2WARNING(
"add_kkmc_generator: please set finalstate as 'mu-mu+'. 'mu+mu-' will be deprecated in the future for"
238 " consistency in the configuration files.")
239 finalstate =
'mu-mu+'
241 if finalstate ==
'tau-tau+':
243 b2.B2INFO(
"Generating tau pair events with TauolaBelle")
245 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/tau.input.dat')
246 kkmc_tauconfigfile = b2.find_file(
'data/generators/kkmc/tau_decaytable.dat')
248 if not signalconfigfile ==
'':
249 b2.B2INFO(f
"Using config file defined by user: {signalconfigfile}")
251 kkmc_tauconfigfile = b2.find_file(signalconfigfile)
253 kkmc_inputfile = b2.find_file(signalconfigfile)
255 if not tauinputfile ==
'':
256 kkmc_inputfile = b2.find_file(tauinputfile)
258 elif finalstate ==
'mu-mu+':
259 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/mu.input.dat')
260 kkmc_logfile =
'kkmc_mumu.txt'
263 b2.B2FATAL(
"add_kkmc_generator final state not supported: {}".format(finalstate))
268 tauinputFile=kkmc_inputfile,
269 KKdefaultFile=kkmc_config,
270 taudecaytableFile=kkmc_tauconfigfile,
271 kkmcoutputfilename=kkmc_logfile,
276 def add_evtgen_generator(path, finalstate='', signaldecfile=None, coherentMixing=True, parentParticle='Upsilon(4S)
', eventType=''): """
277 Add EvtGen for mixed and charged BB
280 path (basf2.Path): path where the generator should be added
281 finalstate (str): Either "charged" for generation of generic B+/B-, "mixed" for generic B0/anti-B0, or "signal" for
282 generation of user-defined signal mode
283 signaldecfile (str): path to decfile which defines the signal decay to be generated
284 (only needed if ``finalstate`` set to "signal")
285 coherentMixing: Either True or False. Switches on or off the coherent decay of the B0-B0bar pair.
286 It should always be True, unless you are generating Y(5,6S) -> BBar. In the latter case,
287 setting it False solves the internal limitation of Evtgen that allows to make a
288 coherent decay only starting from the Y(4S).
289 parentParticle (str): initial state (used only if it is not Upsilon(4S).
290 eventType (str) : event type information
292 evtgen_userdecfile = b2.find_file(
'data/generators/evtgen/charged.dec')
294 if parentParticle !=
'Upsilon(3S)' and parentParticle !=
'Upsilon(4S)'\
295 and parentParticle !=
'Upsilon(5S)' and parentParticle !=
'Upsilon(6S)':
296 b2.B2FATAL(
"add_evtgen_generator initial state not supported: {}".format(parentParticle))
298 if finalstate ==
'charged':
300 elif finalstate ==
'mixed':
301 evtgen_userdecfile = b2.find_file(
'data/generators/evtgen/mixed.dec')
302 elif finalstate ==
'signal':
303 evtgen_userdecfile = signaldecfile
305 b2.B2FATAL(
"add_evtgen_generator final state not supported: {}".format(finalstate))
307 if signaldecfile
and finalstate
in [
'charged',
'mixed']:
308 b2.B2WARNING(
"ignoring decfile: {}".format(signaldecfile))
311 if parentParticle ==
'Upsilon(3S)':
312 if finalstate !=
'signal':
313 b2.B2FATAL(
"add_evtgen_generator initial state {} is supported only with 'signal' final state".format(parentParticle))
315 coherentMixing =
False
316 b2.B2WARNING(
"add_evtgen_generator initial state {} has no BB mixing, now switching coherentMixing OFF"
317 .format(parentParticle))
319 if parentParticle ==
'Upsilon(5S)':
320 if finalstate !=
'signal':
321 b2.B2FATAL(
"add_evtgen_generator initial state {} is supported only with 'signal' final state".format(parentParticle))
323 coherentMixing =
False
325 "add_evtgen_generator initial state {} is supported only with false coherentMixing, now switching it OFF"
326 .format(parentParticle))
327 pdg.load(b2.find_file(
'decfiles/dec/Y5S.pdl'))
329 if parentParticle ==
'Upsilon(6S)':
330 if finalstate !=
'signal':
331 b2.B2FATAL(
"add_evtgen_generator initial state {} is supported only with 'signal' final state".format(parentParticle))
333 coherentMixing =
False
335 "add_evtgen_generator initial state {} is supported only with false coherentMixing, now switching it OFF"
336 .format(parentParticle))
337 pdg.load(b2.find_file(
'decfiles/dec/Y6S.pdl'))
341 userDECFile=evtgen_userdecfile,
342 CoherentMixing=coherentMixing,
343 ParentParticle=parentParticle,
348 def add_continuum_generator(path, finalstate, userdecfile='', *, skip_on_failure=True, eventType=''):
350 Add the default continuum generators KKMC + PYTHIA including their default decfiles and PYTHIA settings
353 `add_inclusive_continuum_generator()` to add continuum generation with preselected particles
356 path (basf2.Path): path where the generator should be added
357 finalstate (str): uubar, ddbar, ssbar, ccbar
358 userdecfile (str): EvtGen decfile used for particle decays
359 skip_on_failure (bool): If True stop event processing right after
360 fragmentation fails. Otherwise continue normally
361 eventType (str) : event type information
365 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/uubar_nohadronization.input.dat')
368 kkmc_logfile =
'kkmc_uubar.txt'
371 pythia_config = b2.find_file(
'data/generators/modules/fragmentation/pythia_belle2.dat')
374 decay_user = b2.find_file(
'data/generators/modules/fragmentation/dec_belle2_qqbar.dec')
375 if userdecfile ==
'':
378 b2.B2INFO(
'Replacing default user decfile: {}'.format(userdecfile))
379 decay_user = userdecfile
382 kkmc_config = b2.find_file(
'data/generators/kkmc/KK2f_defaults.dat')
385 decay_file = get_default_decayfile()
387 if finalstate ==
'uubar':
389 elif finalstate ==
'ddbar':
390 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/ddbar_nohadronization.input.dat')
391 kkmc_logfile =
'kkmc_ddbar.txt'
392 elif finalstate ==
'ssbar':
393 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/ssbar_nohadronization.input.dat')
394 kkmc_logfile =
'kkmc_ssbar.txt'
395 elif finalstate ==
'ccbar':
396 kkmc_inputfile = b2.find_file(
'data/generators/kkmc/ccbar_nohadronization.input.dat')
397 pythia_config = b2.find_file(
'data/generators/modules/fragmentation/pythia_belle2_charm.dat')
398 kkmc_logfile =
'kkmc_ccbar.txt'
400 b2.B2FATAL(
"add_continuum_generator final state not supported: {}".format(finalstate))
405 tauinputFile=kkmc_inputfile,
406 KKdefaultFile=kkmc_config,
407 taudecaytableFile=
'',
408 kkmcoutputfilename=kkmc_logfile,
414 fragmentation = path.add_module(
416 ParameterFile=pythia_config,
420 UserDecFile=decay_user,
426 generator_emptypath = b2.create_path()
427 fragmentation.if_value(
'<1', generator_emptypath)
430 def add_inclusive_continuum_generator(path, finalstate, particles, userdecfile='',
431 *, include_conjugates=True, max_iterations=100000, eventType=''):
433 Add continuum generation but require at least one of the given particles be
434 present in the event.
436 For example to only generate ccbar events which contain a "D*+" or an
437 electron one could would use
439 >>> add_inclusive_continuum_generator(path, "ccbar", ["D*+", 11])
441 If you are unsure how the particles are named in Belle II please have a look
442 at the ``b2help-particles`` executable or the `pdg` python module.
445 `add_continuum_generator()` to add continuum generation without preselection
448 path (basf2.Path): path to which the generator should be added
449 finalstate (str): uubar, ddbar, ssbar, ccbar
450 particles (list): A list of particle names or pdg codes. An event is
451 only accepted if at lease one of those particles appears in the event.
452 userdecfile (str): EvtGen decfile used for particle decays
453 include_conjugates (bool): If True (default) accept the event also if a
454 charge conjugate of the given particles is found
455 max_iterations (int): maximum tries per event to generate the requested
456 particle. If exceeded processing will be stopped with a
457 `FATAL <LogLevel.FATAL>` error so for rare particles one might need a
459 eventType (str) : event type information
461 loop_path = b2.create_path()
464 loop_path.add_module(
"PruneDataStore", keepMatchedEntries=
False, matchEntries=[
"MCParticles",
"EventExtraInfo"])
467 add_continuum_generator(loop_path, finalstate, userdecfile, skip_on_failure=
False, eventType=eventType)
469 loop_path.add_module(
"InclusiveParticleChecker", particles=particles, includeConjugates=include_conjugates)
471 path.do_while(loop_path, max_iterations=max_iterations)
474 def add_bhwide_generator(path, minangle=0.5):
476 Add the high precision QED generator BHWIDE to the path. Settings are the default L1/HLT study settings
477 with a cross section of about 124000 nb (!)
480 path (basf2.Path): path where the generator should be added
481 minangle (float): minimum angle of the outgoing electron/positron in the CMS in degrees
484 if minangle < 0.0
or minangle > 180.0:
485 b2.B2FATAL(
"add_bhwide_generator minimum angle too small (<0.0) or too large (>180): {}".format(minangle))
487 bhwide = path.add_module(
"BHWideInput")
488 bhwide.param(
'ScatteringAngleRangePositron', [minangle, 180.0 - minangle])
489 bhwide.param(
'ScatteringAngleRangeElectron', [minangle, 180.0 - minangle])
490 bhwide.param(
'MaxAcollinearity', 180.0)
491 bhwide.param(
'MinEnergy', 0.10)
492 bhwide.param(
'VacuumPolarization',
'burkhardt')
493 bhwide.param(
'WeakCorrections',
True)
494 bhwide.param(
'WtMax', 3.0)
497 def add_babayaganlo_generator(
503 generateInECLAcceptance=False,
506 Add the high precision QED generator BabaYaga@NLO to the path.
509 path (basf2.Path): path where the generator should be added.
510 finalstate (str): ee (e+e-) or gg (gammagamma).
511 minenergy (float): minimum particle (leptons for 'ee', photons for 'gg') energy in GeV.
512 minangle (float): angular range from minangle to 180-minangle for primary particles (in degrees).
513 fmax (float): maximum of differential cross section weight. This parameter should be set only by experts.
514 generateInECLAcceptance (bool): if True, the GeneratorPreselection module is used to select only events
515 with both the primary particles within the ECL acceptance.
516 eventType (str) : event type information
519 babayaganlo = path.add_module(
'BabayagaNLOInput')
520 babayaganlo.param(
'eventType', eventType)
521 if not (fmax == -1.0):
522 b2.B2WARNING(f
'The BabayagaNLOInput parameter "FMax" will be set to {fmax} instead to the default value (-1.0). '
523 'Please do not do this, unless you are extremely sure about this choice.')
525 if finalstate ==
'ee':
526 babayaganlo.param(
'FinalState',
'ee')
527 babayaganlo.param(
'ScatteringAngleRange', [minangle, 180.0 - minangle])
528 babayaganlo.param(
'MinEnergy', minenergy)
529 babayaganlo.param(
'FMax', fmax)
531 elif finalstate ==
'gg':
532 babayaganlo.param(
'FinalState',
'gg')
533 babayaganlo.param(
'ScatteringAngleRange', [minangle, 180.0 - minangle])
534 babayaganlo.param(
'MinEnergy', minenergy)
535 babayaganlo.param(
'FMax', fmax)
538 b2.B2FATAL(f
'add_babayaganlo_generator final state not supported: {finalstate}')
540 if generateInECLAcceptance:
541 b2.B2INFO(f
'The final state {finalstate} is preselected requiring both primary particles within the ECL acceptance.')
542 emptypath = b2.Path()
543 add_generator_preselection(path=path,
546 if finalstate ==
'ee':
547 b2.set_module_parameters(path=path,
548 name=
'GeneratorPreselection',
550 MinChargedTheta=12.4,
551 MaxChargedTheta=155.1,)
552 elif finalstate ==
'gg':
553 b2.set_module_parameters(path=path,
554 name=
'GeneratorPreselection',
557 MaxPhotonTheta=155.1)
560 def add_phokhara_generator(path, finalstate='', eventType=''):
562 Add the high precision QED generator PHOKHARA to the path. Almost full
563 acceptance settings for photons and hadrons/muons.
566 path (basf2.Path): path where the generator should be added
567 finalstate (str): One of the following final states: "mu+mu-", "pi+pi-", "pi+pi-pi0", "pi+pi-pi+pi-" (or "2(pi+pi-)"),
568 "pi+pi-pi0pi0" or ("pi+pi-2pi0"), "pi+pi-eta", "K+K-", "K0K0bar", "ppbar", "n0n0bar" or "Lambda0Lambda0bar"
569 eventType (str) : event type information
572 if finalstate ==
'mu+mu-':
577 MinInvMassHadrons=0.,
579 ).set_name(
'PHOKHARA_mumuISR')
581 elif finalstate ==
'pi+pi-':
586 MinInvMassHadrons=0.,
588 ).set_name(
'PHOKHARA_pipiISR')
590 elif finalstate ==
'pi+pi-pi0':
595 MinInvMassHadrons=0.,
597 ).set_name(
'PHOKHARA_pipipi0ISR')
599 elif finalstate ==
'pi+pi-pi+pi-' or finalstate ==
'2(pi+pi-)':
604 MinInvMassHadrons=0.,
606 ).set_name(
'PHOKHARA_pipipipiISR')
608 elif finalstate ==
'pi+pi-pi0pi0' or finalstate ==
'pi+pi-2pi0':
613 MinInvMassHadrons=0.,
615 ).set_name(
'PHOKHARA_pipipi0pi0ISR')
617 elif finalstate ==
'pi+pi-eta':
622 MinInvMassHadrons=0.,
624 ).set_name(
'PHOKHARA_pipietaISR')
626 elif finalstate ==
'K+K-':
631 MinInvMassHadrons=0.,
633 ).set_name(
'PHOKHARA_KKISR')
635 elif finalstate ==
'K0K0bar':
640 MinInvMassHadrons=0.,
642 ).set_name(
'PHOKHARA_K0K0barISR')
644 elif finalstate ==
'ppbar':
649 MinInvMassHadrons=0.,
651 ).set_name(
'PHOKHARA_ppbarISR')
653 elif finalstate ==
'n0n0bar':
658 MinInvMassHadrons=0.,
660 ).set_name(
'PHOKHARA_n0n0barISR')
662 elif finalstate ==
'Lambda0Lambda0bar':
667 MinInvMassHadrons=0.,
669 ).set_name(
'PHOKHARA_Lambda0Lambda0barISR')
672 b2.B2FATAL(f
"add_phokhara_generator final state not supported: {finalstate}")
675 def add_phokhara_evtgen_combination(
676 path, final_state_particles, user_decay_file,
677 beam_energy_spread=True, isr_events=False, min_inv_mass_vpho=0.0,
678 max_inv_mass_vpho=0.0, eventType=''):
680 Add combination of PHOKHARA and EvtGen to the path. Phokhara is
681 acting as ISR generator by generating e+ e- -> mu+ mu-, the muon pair is
682 then replaced by a virtual photon. Finally, the virtual photon is
686 path (basf2.Path): Path where the generator should be added.
687 final_state_particles (list): List of final-state particles of
688 the virtual-photon decay. It is necessary to define the correct
689 mass threshold in PHOKHARA. For example, for the process
690 e+ e- -> J/psi eta_c, the list should be ['J/psi', 'eta_c'];
691 it does not depend on subsequent J/psi or eta_c decays.
692 user_decay_file (str): Name of EvtGen user decay file. The initial
693 particle must be the virtual photon (vpho).
694 beam_energy_spread (bool): Whether beam-energy spread should be
696 isr_events (bool): If true, then PHOKHARA is used with ph0 (LO in
697 basf2) = 0, i.e. generation of processes with one photon.
698 min_inv_mass_hadrons(float): Minimum invariant mass of the virtual
699 photon. This parameter is used only if isr_events is true,
700 otherwise the minimum mass is computed from the masses of
701 the final-state particles.
702 max_inv_mass_hadrons(float): Maximum invariant mass of the virtual
703 photon. This parameter is used only if isr_events is true,
704 otherwise the maximum mass is not restricted.
705 eventType (str) : event type information
710 phokhara = path.add_module(
'PhokharaInput')
711 phokhara.param(
'eventType', eventType)
714 phokhara.param(
'FinalState', 0)
715 phokhara.param(
'ReplaceMuonsByVirtualPhoton',
True)
719 phokhara.param(
'BeamEnergySpread', beam_energy_spread)
722 phokhara.param(
'Epsilon', 0.0001)
725 phokhara.param(
'SearchMax', 5000)
728 phokhara.param(
'nMaxTrials', 25000)
732 phokhara.param(
'LO', 0)
734 phokhara.param(
'LO', 1)
735 phokhara.param(
'NLO', 1)
738 phokhara.param(
'QED', 0)
741 phokhara.param(
'IFSNLO', 0)
744 phokhara.param(
'Alpha', 1)
747 phokhara.param(
'NarrowRes', 0)
750 phokhara.param(
'ScatteringAngleRangePhoton', [0., 180.])
751 phokhara.param(
'ScatteringAngleRangeFinalStates', [0., 180.])
754 phokhara.param(
'MinInvMassHadronsGamma', 0.)
758 phokhara.param(
'MinInvMassHadrons',
759 min_inv_mass_vpho * min_inv_mass_vpho)
761 phokhara.param(
'MaxInvMassHadrons',
762 max_inv_mass_vpho * max_inv_mass_vpho)
767 for particle
in final_state_particles:
769 mass = mass + p.Mass()
770 phokhara.param(
'MinInvMassHadrons', mass * mass)
771 phokhara.param(
'ForceMinInvMassHadronsCut',
True)
774 phokhara.param(
'MaxInvMassHadrons', 200.0)
777 phokhara.param(
'MinEnergyGamma', 0.01)
780 evtgen_decay = path.add_module(
'EvtGenDecay')
781 evtgen_decay.param(
'UserDecFile', user_decay_file)
784 def add_koralw_generator(path, finalstate='', enableTauDecays=True, eventType=''):
786 Add KoralW generator for radiative four fermion final states (only four leptons final states are currently supported).
789 path (basf2.Path): path where the generator should be added
790 finalstate (str): either 'e+e-e+e-', 'e+e-mu+mu-', 'e+e-tau+tau-', 'mu+mu-mu+mu-', 'mu+mu-tau+tau-' or 'tau+tau-tau+tau-'
791 enableTauDecays (bool): if True, allow tau leptons to decay (using EvtGen)
792 eventType (str) : event type information
796 if finalstate ==
'e+e-e+e-':
797 decayFile = b2.find_file(
'data/generators/koralw/KoralW_eeee.data')
798 elif finalstate ==
'e+e-mu+mu-':
799 decayFile = b2.find_file(
'data/generators/koralw/KoralW_eeMuMu.data')
800 elif finalstate ==
'e+e-tau+tau-':
801 decayFile = b2.find_file(
'data/generators/koralw/KoralW_eeTauTau.data')
802 elif finalstate ==
'mu+mu-mu+mu-':
803 decayFile = b2.find_file(
'data/generators/koralw/KoralW_MuMuMuMu.data')
804 elif finalstate ==
'mu+mu-tau+tau-':
805 decayFile = b2.find_file(
'data/generators/koralw/KoralW_MuMuTauTau.data')
806 elif finalstate ==
'tau+tau-tau+tau-':
807 decayFile = b2.find_file(
'data/generators/koralw/KoralW_TauTauTauTau.data')
809 b2.B2FATAL(f
'add_koralw_generator final state not supported: {finalstate}')
811 path.add_module(
'KoralWInput',
812 UserDataFile=decayFile,
815 if 'tau+tau-' in finalstate:
817 path.add_module(
'EvtGenDecay')
819 b2.B2WARNING(
'The tau decays will not be generated.')
822 def add_cosmics_generator(path, components=None,
823 global_box_size=None, accept_box=None, keep_box=None,
824 geometry_xml_file='geometry/Beast2_phase2.xml',
825 cosmics_data_dir='data/generators/modules/cryinput/',
826 setup_file='generators/scripts/cry.setup',
827 data_taking_period='gcr2017', top_in_counter=False):
829 Add the cosmics generator CRY with the default parameters to the path.
832 Please remember to also change the reconstruction accordingly, if you
833 set "special" parameters here!
836 path (basf2.Path): path where the generator should be added
837 components (list(str)): list of geometry components to add in the
838 geometry module, or None for all components.
839 global_box_size (tuple(float, float, float)): sets global length, width
840 and height (in meters) in which to generate.
841 Default is ``[100, 100, 100]``
842 accept_box (tuple(float, float, float)): sets the size of the accept box in meter.
843 As a default it is set to ``[8.0, 8.0, 8.0]`` (the Belle II detector size).
844 keep_box (tuple(float, float, float)): sets the size of the keep box (keep box >= accept box).
845 geometry_xml_file (str): Name of the xml file to use for the geometry.
846 cosmics_data_dir (str): parameter CosmicDataDir for the cry module (absolute or relative to the basf2 repo).
847 setup_file (str): location of the cry.setup file (absolute or relative to the basf2 repo)
848 data_taking_period (str): The cosmics generation will be added using the
849 parameters, that where used in this period of data taking. The
850 periods can be found in ``cdc/cr/__init__.py``.
851 top_in_counter (bool): time of propagation from the hit point to the PMT in the trigger counter is subtracted
852 (assuming PMT is put at -z of the counter).
855 b2.B2FATAL(
'''The function "add_cosmics_generator()" is outdated and it is currently not working: please replace
857 add_cosmics_generator(path=path)
861 path.add_module('CRYInput')
863 in your steering file (the module parameter "acceptance" has to be set, see the module docummentation).''')
865 import cdc.cr
as cosmics_setup
867 if global_box_size
is None:
868 global_box_size = [100, 100, 100]
869 if accept_box
is None:
870 accept_box = [8, 8, 8]
874 cosmics_setup.set_cdc_cr_parameters(data_taking_period)
876 if cosmics_setup.cosmics_period ==
"201607":
877 b2.B2FATAL(
"The data taking period 201607 is very special (geometry setup, PMTs etc). This is not handled "
878 "by this script! Please ask the CDC group, if you want to simulate this.")
880 if 'Gearbox' not in path:
881 override = [(
"/Global/length", str(global_box_size[0]),
"m"),
882 (
"/Global/width", str(global_box_size[1]),
"m"),
883 (
"/Global/height", str(global_box_size[2]),
"m")]
885 if cosmics_setup.globalPhi:
886 override += [(
"/DetectorComponent[@name='CDC']//GlobalPhiRotation", str(cosmics_setup.globalPhi),
"deg")]
888 path.add_module(
'Gearbox', override=override, fileName=geometry_xml_file,)
891 if 'Geometry' not in path:
892 geometry = path.add_module(
'Geometry')
894 geometry.param(
'components', components)
896 cry = path.add_module(
'CRYInput')
899 cry.param(
'CosmicDataDir', b2.find_file(cosmics_data_dir))
902 cry.param(
'SetupFile', b2.find_file(setup_file))
905 cry.param(
'acceptLength', accept_box[0])
906 cry.param(
'acceptWidth', accept_box[1])
907 cry.param(
'acceptHeight', accept_box[2])
908 cry.param(
'maxTrials', 100000)
912 cry.param(
'keepLength', keep_box[0])
913 cry.param(
'keepWidth', keep_box[1])
914 cry.param(
'keepHeight', keep_box[2])
917 cry.param(
'kineticEnergyThreshold', 0.01)
920 if cosmics_setup.cosmics_period
not in [
"normal",
"gcr2017"]:
922 cosmics_selector = b2.register_module(
'CDCCosmicSelector',
923 lOfCounter=cosmics_setup.lengthOfCounter,
924 wOfCounter=cosmics_setup.widthOfCounter,
925 xOfCounter=cosmics_setup.triggerPos[0],
926 yOfCounter=cosmics_setup.triggerPos[1],
927 zOfCounter=cosmics_setup.triggerPos[2],
930 propSpeed=cosmics_setup.lightPropSpeed,
935 path.add_module(cosmics_selector)
937 empty_path = b2.create_path()
938 cosmics_selector.if_false(empty_path)
941 def add_treps_generator(path, finalstate='', useDiscreteAndSortedW=False, eventType=''):
943 Add TREPS generator to produce hadronic two-photon processes.
946 path (basf2.Path): path where the generator should be added
947 finalstate(str): "e+e-pi+pi-", "e+e-K+K-" or "e+e-ppbar"
948 useDiscreteAndSortedW(bool): if True, wListTableFile is used for discrete and sorted W. evtNumList must be set proper value.
949 eventType (str) : event type information
952 if finalstate ==
'e+e-pi+pi-':
953 parameterFile = b2.find_file(
'generators/treps/data/parameterFiles/treps_par_pipi.dat')
954 differentialCrossSectionFile = b2.find_file(
'generators/treps/data/differentialCrossSectionFiles/pipidcs.dat')
955 wListTableFile = b2.find_file(
'generators/treps/data/wListFiles/wlist_table_pipi.dat')
956 elif finalstate ==
'e+e-K+K-':
957 parameterFile = b2.find_file(
'generators/treps/data/parameterFiles/treps_par_kk.dat')
958 differentialCrossSectionFile = b2.find_file(
'generators/treps/data/differentialCrossSectionFiles/kkdcs.dat')
959 wListTableFile = b2.find_file(
'generators/treps/data/wListFiles/wlist_table_kk.dat')
960 elif finalstate ==
'e+e-ppbar':
961 parameterFile = b2.find_file(
'generators/treps/data/parameterFiles/treps_par_ppbar.dat')
962 differentialCrossSectionFile = b2.find_file(
'generators/treps/data/differentialCrossSectionFiles/ppbardcs.dat')
963 wListTableFile = b2.find_file(
'generators/treps/data/wListFiles/wlist_table_ppbar.dat')
965 b2.B2FATAL(
"add_treps_generator final state not supported: {}".format(finalstate))
970 ParameterFile=parameterFile,
971 DifferentialCrossSectionFile=differentialCrossSectionFile,
972 WListTableFile=wListTableFile,
973 UseDiscreteAndSortedW=useDiscreteAndSortedW,
975 MaximalAbsCosTheta=1.01,
976 ApplyCosThetaCutCharged=
True,
977 MinimalTransverseMomentum=0,
978 ApplyTransverseMomentumCutCharged=
True,