Module firesong.input_output
Classed to handle the writing of simulation results to files
Expand source code
#!/usr/bin/python
"""Classed to handle the writing of simulation results to files"""
import re
import os
import gzip
import numpy as np
class output_writer(object):
"""
Class for handling the output of FIRESONG simulations and writing
to files
Args:
outputdir (str): Path for saving results
filename (str): Desired output filename
zNEAR (float, optional, default=0): Only consider nearby sources
out to redshift=zNEAR if zNEAR is not 0
Attributes:
output (file): File being written
z_near (float): Only consider nearby sources
out to redshift=zNEAR if zNEAR is not 0
"""
def __init__(self, outputdir, filename, zNEAR=0):
"""
"""
self.output = self.open_file(outputdir, filename)
self.z_near = zNEAR
if (self.z_near > 0):
self.near_output = self.open_file(outputdir, "Near_" + filename)
def open_file(self, outputdir, filename):
"""
Open file and prepare for writing
Args:
outputdir (str): Path for saving results
filename (str): Desired output filename
Returns:
file: File being written to
"""
if re.search('.gz$', filename):
output = gzip.open(outputdir+str(filename), 'wb')
else:
output = open(outputdir+str(filename), "w")
return output
def write_header(self, LF, Transient, timescale, fluxnorm,
delta_gamma, luminosity):
"""
Record relevant simulation parameters in the top of file
Args:
LF (str): Luminosity function
Transient (bool): Transient or steady sources
timescale (float): Timescale for transient sources
fluxnorm (float): Normalization on total astrophysical
diffuse flux
delta_gamma (float): Spectral index - 2.
luminosity (float): Luminosity of sources, 0 if just saturating
diffuse flux
"""
temp = "# FIRESONG Output description\n"
if LF == "SC":
temp += "# Standard candle sources\n"
if LF == "LG":
temp += "# Lognormal distributed sources\n"
if LF == "PL":
temp += "# PowerLaw distributed sources\n"
if Transient:
temp += "# Transient Sources, time scale = {timescale}s \n"
temp += "# Desired neutrino diffuse flux:\n"
temp += "# E^2 dN_diffuse/dE = {fluxnorm} (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s.sr]\n"
temp += "# Neutrino point source fluxes listed below are of \'A\' where the flux is:\n"
temp += "# E^2 dN_PS/dE = A * (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s]\n"
temp += "# Standard Candle Luminosity: {luminosity:.4e} erg/yr \n"
temp += "# Note that using 4 years, IceCube sensitivity in the northern hemisphere\n"
temp += "# is approximately 10^-9 in the units used for A\n"
temp += "# Dec(deg) Redshift A\n"
self.output.write(temp.format(**locals()))
def write(self, declin, redshift, flux):
"""
Write the sources to the output file
Args:
declin (array or float): source declination(s)
redshift (array or float): source redshift(s)
flux (array or float): source flux(es)
"""
for d, z, f in zip(np.atleast_1d(declin),
np.atleast_1d(redshift),
np.atleast_1d(flux)):
self.output.write('{:.4f} {:.4f} {:.6e}\n'.format(d, z, f))
# CHECK why different order
if z < self.z_near:
self.near_output.write('{:.4e} {:.4f} {:.4f}\n'.format(f, d, z))
def finish(self, tot_flux=None):
"""
Calculate total flux per steradian and close file
"""
if tot_flux is not None:
self.output.write("# E^2 dNdE = {tot_flux}\n".format(**locals()))
self.output.close()
if (self.z_near > 0):
self.near_output.close()
class output_writer_CDF(output_writer):
"""
Write the results of calculating the neutrino CDF instead of
the general firesong_simulation
"""
def write(self, z, flux, nuCDF):
self.output.write('{:.4f} {:.6e} {:.6e}\n'.format(float(z), flux, nuCDF))
class output_writer_PDF(output_writer):
"""
Write the results of calculating the neutrino flux PDF instead of
the general firesong_simulation
"""
def write(self, x, y):
np.savetxt(self.output, np.array([x, y]).T)
def get_outputdir():
"""
Check that the Firesong environmental variable is set
This is needed for output and to read exposures, effective areas, etc
Returns:
str: path to result folder
"""
try:
firesongdir = os.environ['FIRESONG']
except:
print("Enviromental variable FIRESONG not set")
print("set to ./")
firesongdir = "./"
return os.path.join(firesongdir, "Results/")
def print_config(LF, Transient, timescale, Evolution, density,
N_sample, luminosity_default, fluxnorm, delta_gamma,
zmax, luminosity, mode="", **kwargs):
"""
Prints the configuration to the screen.
"""
str = "##############################################################################\n"
str += "##### FIRESONG initializing {mode}#####\n"
if LF == "SC":
str += "Standard candle sources+\n"
if LF == "LG":
str += "Lognormal distributed sources\n"
if LF == "PL":
str += "PowerLaw distributed sources\n"
if Transient:
str += "Transient Sources, time scale = {timescale}s\n"
str += "Source evolution assumed: {Evolution}\n"
str += "Local density of neutrino sources: {density}/Mpc^3\n"
str += "Total number of neutrinos sources in the Universe: {N_sample}\n"
if luminosity_default == 0.0:
str += "Desired neutrino diffuse flux: E^2 dN/dE = {fluxnorm} (E/100 TeV)^({delta_gamma}) GeV/cm^2.s.sr\n"
str += "Redshift range: 0 - {zmax}\n"
str += "Standard Candle Luminosity: {luminosity:.4e} erg/yr\n"
str += "##### FIRESONG initialization done #####\n"
print((str.format(**locals())))
def print_config_LEGEND(L_Evolution, lmin, lmax, N_sample):
"""
Prints the configuration to the screen for the luminosity evolution model.
"""
str = "##############################################################################\n"
str += "##### LEGEND initializing #####\n"
str += "Luminosity Evolution model = {L_Evolution}\n"
str += "Source Luminosity Limit = {lmin} - {lmax} erg/s \n"
str += "Total number of sources in the universe: {N_sample} \n"
str += "##### LEGEND initialization done #####"
print((str.format(**locals())))
Functions
def get_outputdir()
-
Check that the Firesong environmental variable is set This is needed for output and to read exposures, effective areas, etc
Returns
str
- path to result folder
Expand source code
def get_outputdir(): """ Check that the Firesong environmental variable is set This is needed for output and to read exposures, effective areas, etc Returns: str: path to result folder """ try: firesongdir = os.environ['FIRESONG'] except: print("Enviromental variable FIRESONG not set") print("set to ./") firesongdir = "./" return os.path.join(firesongdir, "Results/")
def print_config(LF, Transient, timescale, Evolution, density, N_sample, luminosity_default, fluxnorm, delta_gamma, zmax, luminosity, mode='', **kwargs)
-
Prints the configuration to the screen.
Expand source code
def print_config(LF, Transient, timescale, Evolution, density, N_sample, luminosity_default, fluxnorm, delta_gamma, zmax, luminosity, mode="", **kwargs): """ Prints the configuration to the screen. """ str = "##############################################################################\n" str += "##### FIRESONG initializing {mode}#####\n" if LF == "SC": str += "Standard candle sources+\n" if LF == "LG": str += "Lognormal distributed sources\n" if LF == "PL": str += "PowerLaw distributed sources\n" if Transient: str += "Transient Sources, time scale = {timescale}s\n" str += "Source evolution assumed: {Evolution}\n" str += "Local density of neutrino sources: {density}/Mpc^3\n" str += "Total number of neutrinos sources in the Universe: {N_sample}\n" if luminosity_default == 0.0: str += "Desired neutrino diffuse flux: E^2 dN/dE = {fluxnorm} (E/100 TeV)^({delta_gamma}) GeV/cm^2.s.sr\n" str += "Redshift range: 0 - {zmax}\n" str += "Standard Candle Luminosity: {luminosity:.4e} erg/yr\n" str += "##### FIRESONG initialization done #####\n" print((str.format(**locals())))
def print_config_LEGEND(L_Evolution, lmin, lmax, N_sample)
-
Prints the configuration to the screen for the luminosity evolution model.
Expand source code
def print_config_LEGEND(L_Evolution, lmin, lmax, N_sample): """ Prints the configuration to the screen for the luminosity evolution model. """ str = "##############################################################################\n" str += "##### LEGEND initializing #####\n" str += "Luminosity Evolution model = {L_Evolution}\n" str += "Source Luminosity Limit = {lmin} - {lmax} erg/s \n" str += "Total number of sources in the universe: {N_sample} \n" str += "##### LEGEND initialization done #####" print((str.format(**locals())))
Classes
class output_writer (outputdir, filename, zNEAR=0)
-
Class for handling the output of FIRESONG simulations and writing to files
Args
outputdir
:str
- Path for saving results
filename
:str
- Desired output filename
zNEAR
:float
, optional, default=0
- Only consider nearby sources out to redshift=zNEAR if zNEAR is not 0
Attributes
output
:file
- File being written
z_near
:float
- Only consider nearby sources out to redshift=zNEAR if zNEAR is not 0
Expand source code
class output_writer(object): """ Class for handling the output of FIRESONG simulations and writing to files Args: outputdir (str): Path for saving results filename (str): Desired output filename zNEAR (float, optional, default=0): Only consider nearby sources out to redshift=zNEAR if zNEAR is not 0 Attributes: output (file): File being written z_near (float): Only consider nearby sources out to redshift=zNEAR if zNEAR is not 0 """ def __init__(self, outputdir, filename, zNEAR=0): """ """ self.output = self.open_file(outputdir, filename) self.z_near = zNEAR if (self.z_near > 0): self.near_output = self.open_file(outputdir, "Near_" + filename) def open_file(self, outputdir, filename): """ Open file and prepare for writing Args: outputdir (str): Path for saving results filename (str): Desired output filename Returns: file: File being written to """ if re.search('.gz$', filename): output = gzip.open(outputdir+str(filename), 'wb') else: output = open(outputdir+str(filename), "w") return output def write_header(self, LF, Transient, timescale, fluxnorm, delta_gamma, luminosity): """ Record relevant simulation parameters in the top of file Args: LF (str): Luminosity function Transient (bool): Transient or steady sources timescale (float): Timescale for transient sources fluxnorm (float): Normalization on total astrophysical diffuse flux delta_gamma (float): Spectral index - 2. luminosity (float): Luminosity of sources, 0 if just saturating diffuse flux """ temp = "# FIRESONG Output description\n" if LF == "SC": temp += "# Standard candle sources\n" if LF == "LG": temp += "# Lognormal distributed sources\n" if LF == "PL": temp += "# PowerLaw distributed sources\n" if Transient: temp += "# Transient Sources, time scale = {timescale}s \n" temp += "# Desired neutrino diffuse flux:\n" temp += "# E^2 dN_diffuse/dE = {fluxnorm} (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s.sr]\n" temp += "# Neutrino point source fluxes listed below are of \'A\' where the flux is:\n" temp += "# E^2 dN_PS/dE = A * (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s]\n" temp += "# Standard Candle Luminosity: {luminosity:.4e} erg/yr \n" temp += "# Note that using 4 years, IceCube sensitivity in the northern hemisphere\n" temp += "# is approximately 10^-9 in the units used for A\n" temp += "# Dec(deg) Redshift A\n" self.output.write(temp.format(**locals())) def write(self, declin, redshift, flux): """ Write the sources to the output file Args: declin (array or float): source declination(s) redshift (array or float): source redshift(s) flux (array or float): source flux(es) """ for d, z, f in zip(np.atleast_1d(declin), np.atleast_1d(redshift), np.atleast_1d(flux)): self.output.write('{:.4f} {:.4f} {:.6e}\n'.format(d, z, f)) # CHECK why different order if z < self.z_near: self.near_output.write('{:.4e} {:.4f} {:.4f}\n'.format(f, d, z)) def finish(self, tot_flux=None): """ Calculate total flux per steradian and close file """ if tot_flux is not None: self.output.write("# E^2 dNdE = {tot_flux}\n".format(**locals())) self.output.close() if (self.z_near > 0): self.near_output.close()
Subclasses
Methods
def finish(self, tot_flux=None)
-
Calculate total flux per steradian and close file
Expand source code
def finish(self, tot_flux=None): """ Calculate total flux per steradian and close file """ if tot_flux is not None: self.output.write("# E^2 dNdE = {tot_flux}\n".format(**locals())) self.output.close() if (self.z_near > 0): self.near_output.close()
def open_file(self, outputdir, filename)
-
Open file and prepare for writing
Args
outputdir
:str
- Path for saving results
filename
:str
- Desired output filename
Returns
file
- File being written to
Expand source code
def open_file(self, outputdir, filename): """ Open file and prepare for writing Args: outputdir (str): Path for saving results filename (str): Desired output filename Returns: file: File being written to """ if re.search('.gz$', filename): output = gzip.open(outputdir+str(filename), 'wb') else: output = open(outputdir+str(filename), "w") return output
def write(self, declin, redshift, flux)
-
Write the sources to the output file
Args
declin
:array
orfloat
- source declination(s)
redshift
:array
orfloat
- source redshift(s)
flux
:array
orfloat
- source flux(es)
Expand source code
def write(self, declin, redshift, flux): """ Write the sources to the output file Args: declin (array or float): source declination(s) redshift (array or float): source redshift(s) flux (array or float): source flux(es) """ for d, z, f in zip(np.atleast_1d(declin), np.atleast_1d(redshift), np.atleast_1d(flux)): self.output.write('{:.4f} {:.4f} {:.6e}\n'.format(d, z, f)) # CHECK why different order if z < self.z_near: self.near_output.write('{:.4e} {:.4f} {:.4f}\n'.format(f, d, z))
def write_header(self, LF, Transient, timescale, fluxnorm, delta_gamma, luminosity)
-
Record relevant simulation parameters in the top of file
Args
LF
:str
- Luminosity function
Transient
:bool
- Transient or steady sources
timescale
:float
- Timescale for transient sources
fluxnorm
:float
- Normalization on total astrophysical diffuse flux
delta_gamma
:float
- Spectral index - 2.
luminosity
:float
- Luminosity of sources, 0 if just saturating diffuse flux
Expand source code
def write_header(self, LF, Transient, timescale, fluxnorm, delta_gamma, luminosity): """ Record relevant simulation parameters in the top of file Args: LF (str): Luminosity function Transient (bool): Transient or steady sources timescale (float): Timescale for transient sources fluxnorm (float): Normalization on total astrophysical diffuse flux delta_gamma (float): Spectral index - 2. luminosity (float): Luminosity of sources, 0 if just saturating diffuse flux """ temp = "# FIRESONG Output description\n" if LF == "SC": temp += "# Standard candle sources\n" if LF == "LG": temp += "# Lognormal distributed sources\n" if LF == "PL": temp += "# PowerLaw distributed sources\n" if Transient: temp += "# Transient Sources, time scale = {timescale}s \n" temp += "# Desired neutrino diffuse flux:\n" temp += "# E^2 dN_diffuse/dE = {fluxnorm} (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s.sr]\n" temp += "# Neutrino point source fluxes listed below are of \'A\' where the flux is:\n" temp += "# E^2 dN_PS/dE = A * (E/100 TeV)^({delta_gamma}) [GeV/cm^2.s]\n" temp += "# Standard Candle Luminosity: {luminosity:.4e} erg/yr \n" temp += "# Note that using 4 years, IceCube sensitivity in the northern hemisphere\n" temp += "# is approximately 10^-9 in the units used for A\n" temp += "# Dec(deg) Redshift A\n" self.output.write(temp.format(**locals()))
class output_writer_CDF (outputdir, filename, zNEAR=0)
-
Write the results of calculating the neutrino CDF instead of the general firesong_simulation
Expand source code
class output_writer_CDF(output_writer): """ Write the results of calculating the neutrino CDF instead of the general firesong_simulation """ def write(self, z, flux, nuCDF): self.output.write('{:.4f} {:.6e} {:.6e}\n'.format(float(z), flux, nuCDF))
Ancestors
Inherited members
class output_writer_PDF (outputdir, filename, zNEAR=0)
-
Write the results of calculating the neutrino flux PDF instead of the general firesong_simulation
Expand source code
class output_writer_PDF(output_writer): """ Write the results of calculating the neutrino flux PDF instead of the general firesong_simulation """ def write(self, x, y): np.savetxt(self.output, np.array([x, y]).T)
Ancestors
Inherited members