Hello,
actually your problem is two-fold. You want a volumetric source and you want different energies. Your search already pointed you to a possible solution. There are basically 2 options:
1.) You can program a source routine where you sample the energy and the position. For a cylindrical spatial distribution you could sample within a box surrounding your cylinder and accept only coordinates that fall within. The test for such points is relatively simple. Assuming that the height is in Z direction, you could check if the sampled X and Y coordinates fulfill the condition X^2 + Y^2 <= R^2 and if Z is within the Zmin and Zmax of your cylinder. Another option is to analytically sample this distribution. To do this you need two uniform samples (s1, s2, s3) in the interval [0,1). Then you can calculate:
phi = 2pi * s1
r = Rmax * sqrt(s2)
x = r * cos(phi)
y = r * sin(phi)
z = s3
2.) Take a look at the following post below. The routines there allow you to define the shape and position of your beam via the input cards and the energy spectrum. If you need quasi-monoergetic lines with uniform probability you just need to define for each line a very small energy bin, the energy and an arbitrary fluence that must be the same for each entry. For example:
Emin, Emax, fluence_per_bin
0.00042787 0.000427871 1
For the other photon energies you would add similar lines, changing only the energy bin data. However, please note that you must not have holes in the spectrum. This means that for example if you have a line at 1 GeV and another one at 3 GeV you should define the spectrum like this:
1.00000 1.000001 1
1.000001 3.00000 0
3.000000 3.000001 1
Sampling from energy spectra - Advanced Features and User Routines - FLUKA User Forum (cern.ch)
Hope that helps
Chris