def process(sigma, field, name): # output folder folder = 'data/' + name if not os.path.exists(folder): os.makedirs(folder) # tabulated energies, limit to energies where the interaction is possible Emin = getEmin(sigma, field) E = logspace(10, 23, 261) * eV E = E[E > Emin] # ------------------------------------------- # calculate interaction rates # ------------------------------------------- # tabulated values of s_kin = s - mc^2 # Note: integration method (Romberg) requires 2^n + 1 log-spaced tabulation points s_kin = logspace(6, 23, 2049) * eV**2 xs = getTabulatedXS(sigma, s_kin) rate = interactionRate.calc_rate_s(s_kin, xs, E, field) # save fname = folder + '/rate_%s.txt' % field.name data = c_[log10(E / eV), rate] fmt = '%.2f\t%.6g' header = '%s interaction rates\nphoton field: %s\nlog10(E/eV), 1/lambda [1/Mpc]' % (name, field.info) savetxt(fname, data, fmt=fmt, header=header) # ------------------------------------------- # calculate cumulative differential interaction rates for sampling s values # ------------------------------------------- # find minimum value of s_kin skin1 = getSmin(sigma) # s threshold for interaction skin2 = 4 * field.getEmin() * E[0] # minimum achievable s in collision with background photon (at any tabulated E) skin_min = max(skin1, skin2) # tabulated values of s_kin = s - mc^2, limit to relevant range # Note: use higher resolution and then downsample skin = logspace(6.2, 23, 1680+1) * eV**2 skin = skin[skin > skin_min] xs = getTabulatedXS(sigma, skin) rate = interactionRate.calc_diffrate_s(skin, xs, E, field) # downsample skin_save = logspace(6.2, 23, 168+1) * eV**2 skin_save = skin_save[skin_save > skin_min] rate_save = array([interp(skin_save, skin, r) for r in rate]) # save data = c_[log10(E/eV), rate_save] # prepend log10(E/eV) as first column row0 = r_[0, log10(skin_save/eV**2)][newaxis,:] data = r_[row0, data] # prepend log10(s_kin/eV^2) as first row fname = folder + '/cdf_%s.txt' % field.name fmt = '%.2f' + '\t%.6g' * shape(rate_save)[1] header = '%s cumulative differential rate\nphoton field: %s\nlog10(E/eV), d(1/lambda)/ds_kin [1/Mpc/eV^2] for log10(s_kin/eV^2) as given in first row' % (name, field.info) savetxt(fname, data, fmt=fmt, header=header)