File indexing completed on 2025-07-01 07:56:14
0001 import os
0002 from pyHepMC3 import HepMC3 as hm
0003 import numpy as np
0004 import argparse
0005
0006
0007 PARTICLES = [
0008
0009 (211, 0.13957018),
0010
0011
0012 (321, 0.493677),
0013
0014 (2212, 0.938272),
0015
0016
0017
0018 ]
0019
0020
0021
0022 def gen_event(prange=(8, 100), arange=(0, 20)):
0023 evt = hm.GenEvent(hm.Units.MomentumUnit.GEV, hm.Units.LengthUnit.MM)
0024 pid, mass = PARTICLES[np.random.randint(len(PARTICLES))]
0025
0026
0027 state = 1
0028
0029
0030 p = np.random.uniform(*prange)
0031 theta = np.random.uniform(*arange)*np.pi/180.
0032 phi = np.random.uniform(0., 2.*np.pi)
0033 e0 = np.sqrt(p*p + mass*mass)
0034
0035 px = np.cos(phi)*np.sin(theta)
0036 py = np.sin(phi)*np.sin(theta)
0037 pz = np.cos(theta)
0038
0039
0040 pbeam = hm.GenParticle(hm.FourVector(0, 0, 0, 0.938272), 2212, 4)
0041 ebeam = hm.GenParticle(hm.FourVector(0, 0, e0, np.sqrt(e0*e0 + 0.511e-3*0.511e-3)), -11, 4)
0042
0043 hout = hm.GenParticle(hm.FourVector(px*p, py*p, pz*p, e0), pid, state)
0044
0045 vert = hm.GenVertex()
0046 vert.add_particle_in(ebeam)
0047 vert.add_particle_in(pbeam)
0048 vert.add_particle_out(hout)
0049 evt.add_vertex(vert)
0050 return evt
0051
0052
0053 if __name__ == "__main__":
0054 parser = argparse.ArgumentParser('RICH dataset generator')
0055
0056 parser.add_argument('output', help='path to the output file')
0057 parser.add_argument('-n', type=int, default=1000, dest='nev', help='number of events to generate')
0058 parser.add_argument('--pmin', type=float, default=8.0, dest='pmin', help='minimum momentum in GeV')
0059 parser.add_argument('--pmax', type=float, default=100.0, dest='pmax', help='maximum momentum in GeV')
0060 parser.add_argument('--angmin', type=float, default=0.0, dest='angmin', help='minimum angle in degree')
0061 parser.add_argument('--angmax', type=float, default=20.0, dest='angmax', help='maximum angle in degree')
0062 parser.add_argument('-s', type=int, default=-1, dest='seed', help='seed for random generator')
0063
0064 args = parser.parse_args()
0065
0066
0067 if args.seed < 0:
0068 args.seed = os.environ.get('SEED', int.from_bytes(os.urandom(4), byteorder='big', signed=False))
0069 np.random.seed(args.seed)
0070
0071 output = hm.WriterAscii(args.output);
0072 if output.failed():
0073 print("Cannot open file \"{}\"".format(args.output))
0074 sys.exit(2)
0075
0076 count = 0
0077 while count < args.nev:
0078 if (count % 1000 == 0):
0079 print("Generated {} events".format(count), end='\r')
0080 evt = gen_event((args.pmin, args.pmax), (args.angmin, args.angmax))
0081 output.write_event(evt)
0082 evt.clear()
0083 count += 1
0084
0085 print("Generated {} events".format(args.nev))
0086 output.close()
0087