From 15711929d1baedff187afea1046e48a246a0eef8 Mon Sep 17 00:00:00 2001 From: Carl Gwilliam <gwilliam@hep.ph.liv.ac.uk> Date: Fri, 3 Feb 2023 14:36:57 +0000 Subject: [PATCH] Allow generating particles over an annulus between two radii --- .../Generation/python/faser_parser.py | 4 ++-- .../Generation/scripts/faser_particlegun.py | 4 ++++ .../FaserParticleGun/python/RadialPosSampler.py | 15 ++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Control/CalypsoExample/Generation/python/faser_parser.py b/Control/CalypsoExample/Generation/python/faser_parser.py index c98d348a..055dd720 100644 --- a/Control/CalypsoExample/Generation/python/faser_parser.py +++ b/Control/CalypsoExample/Generation/python/faser_parser.py @@ -40,7 +40,7 @@ def faser_pgparser(): help="Specify PDG ID of particle (note plus/minus different) or list (e.g.: --pid -13 13)") parser.add_argument("--mass", default=105.66, type=float, help="Specify particle mass (in MeV)") - parser.add_argument("--radius", default=100., type=float, + parser.add_argument("--radius", default=100., type=float, nargs="*", help="Specify radius (in mm)") parser.add_argument("--angle", default=0.005, type=float_or_none, help="Specify angular width (in Rad)") @@ -55,7 +55,7 @@ def faser_pgparser(): parser.add_argument("--sampler", default="log", help="Specify energy sampling (log, lin, const, hist, hist2D)") - parser.add_argument("--hist_name", default="log", + parser.add_argument("--hist_name", default="", help="Specify energy sampling name for hist sampler file.root:hist") parser.add_argument("--minE", default=10., type=float, diff --git a/Control/CalypsoExample/Generation/scripts/faser_particlegun.py b/Control/CalypsoExample/Generation/scripts/faser_particlegun.py index d23e879d..169badec 100755 --- a/Control/CalypsoExample/Generation/scripts/faser_particlegun.py +++ b/Control/CalypsoExample/Generation/scripts/faser_particlegun.py @@ -112,6 +112,10 @@ if __name__ == '__main__': print(f"Using pid: {args.pid} => {pidarg}") + if isinstance(args.radius, list) and len(args.radius) == 1: + args.radius = args.radius[0] + + # Create the simgun dictionary # Negative radius gives uniform sampling # Positive radius gives Gaussian sampling diff --git a/Generators/FaserParticleGun/python/RadialPosSampler.py b/Generators/FaserParticleGun/python/RadialPosSampler.py index 6fcd6829..19b1db11 100644 --- a/Generators/FaserParticleGun/python/RadialPosSampler.py +++ b/Generators/FaserParticleGun/python/RadialPosSampler.py @@ -35,12 +35,17 @@ class RadialPosSampler(Sampler): def r(self): "r position sampler" - fwhm = 2*self.radius - sig = fwhm/(2 * sqrt(2 * log(2))) - - if self.radius < 0: - return sqrt(random.uniform(0, abs(self.radius**2))) + #fwhm = 2*self.radius + #sig = fwhm/(2 * sqrt(2 * log(2))) + + if isinstance(self.radius, list) and len(self.radius) == 2: + # If a list of length 2, generate uniformally over an annulus from r[0] to r[1] + return sqrt(random.uniform(abs(self.radius[0]**2), abs(self.radius[1]**2))) + elif self.radius < 0: + # Generate uniformally up to |r| if r is < 0 + return sqrt(random.uniform(0, abs(self.radius**2))) else: + # Else generate as a Gaussian with widht r x = random.gauss(0, self.radius) y = random.gauss(0, self.radius) return sqrt(x**2 + y**2) -- GitLab