darkhistory.spec.spectrum.Spectrum¶
-
class
darkhistory.spec.spectrum.Spectrum(eng, data, rs=-1.0, in_eng=-1.0, spec_type='dNdE')¶ Structure for particle spectra.
Parameters: - eng : ndarray
Abscissa for the spectrum.
- data : ndarray
Spectrum stored as N or dN/dE.
- rs : float, optional
The redshift (1+z) of the spectrum. Default is -1.
- in_eng : float, optional
The injection energy of the primary, if this is a secondary spectrum. Default is -1.
- mode : {‘N’, ‘dNdE’}, optional
Whether the input is N or dN/dE in each bin. Default is ‘dNdE’.
Attributes: - eng : ndarray
Abscissa for the spectrum.
- dNdE : ndarray
dN/dE of the spectrum.
- N : ndarray
N of the spectrum.
- rs : float, optional
The redshift (1+z) of the spectrum. Set to -1 if not specified.
- length : int
The length of the abscissa.
- underflow : dict of str: float
The underflow total number of particles and total energy.
Methods
at_eng(new_eng[, left, right])Interpolates the spectrum at a new abscissa. contract(mat)Performs a dot product with the Spectrum.engloss_rebin(in_eng, out_eng[, …])Converts an energy loss spectrum to a secondary spectrum. rebin(out_eng)Rebins according to a new abscissa. rebin_fast(out_eng)Rebins the Spectrumwith ‘N’ spec_type quickly.redshift(new_rs)Redshifts the Spectrumobject as a photon spectrum.shift_eng(new_eng)Shifts the abscissa while conserving number. switch_spec_type([target])Switches between data being stored as N or dN/dE. totN([bound_type, bound_arr])Returns the total number of particles in part of the spectrum. toteng([bound_type, bound_arr])Returns the total energy of particles in part of the spectrum. -
__init__(eng, data, rs=-1.0, in_eng=-1.0, spec_type='dNdE')¶ Initialize self. See help(type(self)) for accurate signature.
-
__add__(other)¶ Adds two
Spectruminstances together, or an array to the spectrum. TheSpectrumobject is on the left.The returned
Spectrumwill have its underflow reset to zero if other is not aSpectrumobject.Parameters: - other : Spectrum or ndarray
The object to add to the current
Spectrumobject.
Returns: - Spectrum
New
Spectruminstance which has the summed spectrum.
See also
Notes
This special function, together with
Spectrum.__radd__(), allows the use of the symbol+to addSpectrumobjects together.
-
__init__(eng, data, rs=-1.0, in_eng=-1.0, spec_type='dNdE') Initialize self. See help(type(self)) for accurate signature.
-
__mul__(other)¶ Takes the product of the spectrum with a
Spectrumobject, array or number.The
Spectrumobject is on the left.Parameters: - other : Spectrum, ndarray, float or int
The object to multiply to the current
Spectrumobject.
Returns: - Spectrum
New
Spectruminstance which has the multiplied spectrum.
See also
Notes
This special function, together with
Spectrum.__rmul__(), allows the use of the symbol*to multiplySpectrumobjects or an array andSpectrum.The returned
Spectrumobject has underflow set to zero if other is not aSpectrumobject.
-
__neg__()¶ Negates the spectrum.
Returns: - Spectrum
New
Spectruminstance with the spectrum negated.
Notes
The returned
Spectrumobject has underflow set to zero.
-
__radd__(other)¶ Adds two
Spectruminstances together, or an array to the spectrum. TheSpectrumobject is on the right.The returned
Spectrumwill have its underflow reset to zero if other is not aSpectrumobject.Parameters: - other : Spectrum or ndarray
The object to add to the current
Spectrumobject.
Returns: - Spectrum
New
Spectruminstance which has the summed spectrum.
See also
Notes
This special function, together with
Spectrum.__add__(), allows the use of the symbol+to addSpectrumobjects together.
-
__rmul__(other)¶ Takes the product of the spectrum with an array or number.
The
Spectrumobject is on the right.Parameters: See also
Notes
This special function, together with
Spectrum.__mul__(), allows the use of the symbol*to multiplySpectrumobjects or an array and Spectrum.The returned
Spectrumobject has its underflow set to zero.
-
__rsub__(other)¶ Subtracts this
Spectrumfrom another or an array.Parameters: - other : Spectrum or ndarray
The object from which to subtract the current
Spectrumobject.
Returns: - Spectrum
New
Spectruminstance which has the subtracted spectrum.
See also
Notes
This special function, together with
Spectrum.__sub__(), allows the use of the symbol - to subtract or subtract fromSpectrumobjects.
-
__rtruediv__(other)¶ Divides a number or array by the spectrum.
The
Spectrumobject is on the right.Parameters: Notes
This special function, together with
Spectrum.__truediv__(), allows the use of the symbol/to multiplySpectrumobjects or an array andSpectrum.The returned
Spectrumobject underflow is set to zero.
-
__sub__(other)¶ Subtracts a
Spectrumor an array from thisSpectrum.Parameters: - other : Spectrum or ndarray
The object to subtract from the current
Spectrumobject.
Returns: - Spectrum
New
Spectruminstance which has the subtracted spectrum.
See also
Notes
This special function, together with
Spectrum.__rsub__(), allows the use of the symbol-to subtract or subtract fromSpectrumobjects.The returned
Spectrumobject underflow is reset to zero if other is not aSpectrumobject.
-
__truediv__(other)¶ Divides the spectrum by an array or number.
The
Spectrumobject is on the left.Parameters: - other : ndarray, float or int
The object to divide the current
Spectrumobject by.
Returns: - Spectrum
New
Spectruminstance which has the divided spectrum.
See also
Notes
This special function, together with
Spectrum.__rtruediv__(), allows the use of the symbol/to multiplySpectrumobjects or an array and Spectrum.The returned
Spectrumobject underflow is set to zero.
-
__weakref__¶ list of weak references to the object (if defined)
-
at_eng(new_eng, left=-200, right=-200)¶ Interpolates the spectrum at a new abscissa.
Interpolation is logarithmic.
Parameters: - new_eng : ndarray
The new energies to interpolate at.
- left : float, optional
Returns the value if beyond the first bin on the left. Default is to return -200, so that the exponential is small.
- right : float, optional
Returns the value if beyond the last bin on the right. Default is to return -200, so that the exponential is small.
-
contract(mat)¶ Performs a dot product with the
Spectrum.Parameters: - mat : ndarray
The array to take the dot product with.
Returns: - float
The resulting dot product.
-
engloss_rebin(in_eng, out_eng, out_spec_type=None, fast=False)¶ Converts an energy loss spectrum to a secondary spectrum.
An “energy loss spectrum” is a distribution of outgoing particles as a function of energy lost \(\Delta\) saved in self.eng after some interaction for an incoming particle \(E'\) specified by in_eng. The “secondary spectrum” is simply the distribution of outgoing particles as a function of their own energy \(E\) instead, with abscissa out_eng.
Parameters: - in_eng : float
The injection energy of the primary which gives rise to self.dNdE as the energy loss spectrum.
- out_eng : ndarray
The final energy abscissa to bin into. If not specified, it is assumed to be the same as the initial abscissa.
- out_spec_type: {‘N’, ‘dNdE’}, optional
The spec_type of the output spectrum. If not specified, the output spectrum will have the same spec_type.
- fast: bool, optional
If fast, uses
Spectrum.rebin_fast()instead ofSpectrum.rebin()for speed.
See also
Notes
This function is simply a numerical version of the fact that
\[\frac{dN}{d \Delta}(\Delta) = \frac{dN}{dE} (E = E' - \Delta) \]in discretized form, preserving the total number and total energy in the spectrum using
Spectrum.rebin().
-
rebin(out_eng)¶ Rebins according to a new abscissa.
The total number and total energy is conserved.
If a bin in the old abscissa self.eng is below the lowest bin of the new abscissa out_eng, then the total number and energy not assigned to the lowest bin are assigned to the underflow.
If a bin in self.eng is above the highest bin in out_eng, a warning is thrown, the values are simply discarded, and the total number and energy can no longer be conserved.
Parameters: - out_eng : ndarray
The new abscissa to bin into.
Returns: - None
See also
Notes
Total number and energy are conserved by assigning the number of particles \(N\) in a bin of energy \(E\) to two adjacent bins in the new abscissa out_eng, with energies \(E_\text{low}\) and \(E_\text{upp}\) such that \(E_\text{low} < E < E_\text{upp}\). The number of particles \(N_\text{low}\) and \(N_\text{upp}\) assigned to these two bins are given by
\[\begin{split}N_\text{low} &= \frac{E_\text{upp} - E}{E_\text{upp} - E_\text{low}} N \,, \\ N_\text{upp} &= \frac{E - E_\text{low}}{E_\text{upp} - E_\text{low}} N\end{split}\]Rebinning works best when going from a finer binning to a coarser binning. Going the other way can result in spiky features, since the coarser binning simply does not contain enough information to reconstruct the finer binning in this way.
-
rebin_fast(out_eng)¶ Rebins the
Spectrumwith ‘N’ spec_type quickly.Rebinning conserves total number and total energy. No checks are made: use with caution!
Parameters: - out_eng_interp : ndarray
The new abscissa to bin into. If self.eng has values that are smaller than out_eng[0] or larger than out_eng[-1], then the value is discarded without error.
See also
Notes
This implementation is identical to
Spectrum.rebin(), but works only if the spec_type is of type ‘N’, and further dispenses with underflow and other checks.
-
redshift(new_rs)¶ Redshifts the
Spectrumobject as a photon spectrum.Parameters: - new_rs : float
The new redshift (1+z) to redshift to.
Examples
>>> eng = np.array([1, 10, 100, 1000]) >>> spec = Spectrum(eng, np.ones(4), rs=100, spec_type='N') >>> spec.redshift(10) >>> print(spec.N) [1. 1. 1. 0.] >>> print(spec.underflow['N']) 1.0
-
shift_eng(new_eng)¶ Shifts the abscissa while conserving number.
This function can be used to subtract or add some amount of energy from each bin in the spectrum. The dN/dE is adjusted to conserve number in each bin.
Parameters: - new_eng : ndarray
The new energy abscissa.
Returns: - None
-
switch_spec_type(target=None)¶ Switches between data being stored as N or dN/dE.
Parameters: - target : {‘N’, ‘dNdE’}, optional
The target type to switch to. If not specified, performs a switch regardless.
Notes
Although both N and dN/dE can be accessed regardless of which values are stored, performing a switch before repeated computations can speed up the computation.
-
totN(bound_type=None, bound_arr=None)¶ Returns the total number of particles in part of the spectrum.
The part of the spectrum can be specified in two ways, and is specified by bound_type. Multiple totals can be obtained through bound_arr.
Parameters: - bound_type : {‘bin’, ‘eng’, None}
The type of bounds to use. Bound values do not have to be within [0:length] for ‘bin’ or within the abscissa for ‘eng’. None should only be used when computing the total particle number in the spectrum.
Specifying
bound_type='bin'without bound_arr returns self.N.- bound_arr : ndarray of length N, optional
An array of boundaries (bin or energy), between which the total number of particles will be computed. If bound_arr is None, but bound_type is specified, the total number of particles in each bin is computed. If both bound_type and bound_arr are None, then the total number of particles in the spectrum is computed.
For ‘bin’, bounds are specified as the bin boundary, with 0 being the left most boundary, 1 the right-hand of the first bin and so on. This is equivalent to integrating over a histogram. For ‘eng’, bounds are specified by energy values.
These boundaries need not be integer values for ‘bin’: specifying np.array([0.5, 1.5]) for example will include half of the first bin and half of the second.
Returns: - ndarray of length N-1, or float
Total number of particles in the spectrum, or between the specified boundaries.
See also
Examples
>>> eng = np.array([1, 10, 100, 1000]) >>> N = np.array([1, 2, 3, 4]) >>> spec = Spectrum(eng, N, spec_type='N') >>> spec.totN() 10.0 >>> spec.totN('bin', np.array([1, 3])) array([5.]) >>> spec.totN('eng', np.array([10, 1e4])) array([8.])
-
toteng(bound_type=None, bound_arr=None)¶ Returns the total energy of particles in part of the spectrum.
The part of the spectrum can be specified in two ways, and is specified by bound_type. Multiple totals can be obtained through bound_arr.
Parameters: - bound_type : {‘bin’, ‘eng’, None}
The type of bounds to use. Bound values do not have to be within the [0:length] for ‘bin’ or within the abscissa for ‘eng’. None should only be used to obtain the total energy.
Specifying
bound_type='bin'without bound_arr gives the total energy in each bin.- bound_arr : ndarray of length N, optional
An array of boundaries (bin or energy), between which the total number of particles will be computed. If unspecified, the total number of particles in the whole spectrum is computed.
For ‘bin’, bounds are specified as the bin boundary, with 0 being the left most boundary, 1 the right-hand of the first bin and so on. This is equivalent to integrating over a histogram. For ‘eng’, bounds are specified by energy values.
These boundaries need not be integer values for ‘bin’: specifying np.array([0.5, 1.5]) for example will include half of the first bin and half of the second.
Returns: - ndarray of length N-1, or float
Total energy in the spectrum or between the specified boundaries.
See also
Examples
>>> eng = np.array([1, 10, 100, 1000]) >>> N = np.array([1, 2, 3, 4]) >>> spec = Spectrum(eng, N, spec_type='N') >>> spec.toteng() 4321.0 >>> spec.toteng('bin', np.array([1, 3])) array([320.]) >>> spec.toteng('eng', np.array([10, 1e4])) array([4310.])
