Source code for threeML.utils.spectrum.share_spectrum

import numpy as np

from threeML.plugins.DispersionSpectrumLike import DispersionSpectrumLike
from threeML.plugins.SpectrumLike import SpectrumLike
from threeML.io.logging import setup_logger
log = setup_logger(__name__)


[docs] class ShareSpectrum(object): def __init__(self, datalist): """ Object to check which plugins in datalist can share their spectrum calculation, because they have the same input energy bins and integration method. Can save a lot of time if the calculation of the spectrum is slow. """ # List with different Ebin edges of the plugins self._data_ein_edges = [] self._base_plugin_key = [] # List with the information which plugins have the same spectrum integration # with same input energy bins self._data_ebin_connect = [] #TODO add check if same integration method is set for j, (key, d) in enumerate(zip(list(datalist.keys()), list(datalist.values()))): if isinstance(d, DispersionSpectrumLike): e = d.response.monte_carlo_energies share_spec_possible = True elif isinstance(d, SpectrumLike): e = d.observed_spectrum.edges share_spec_possible = True else: log.debug(f"Plugin {j} can not share spectrum calculation (Not SpectrumLike or DispersionSpectrumLike)") self._data_ein_edges.append( None ) self._base_plugin_key.append(key) self._data_ebin_connect.append(j) share_spec_possible = False if share_spec_possible: found = False log.debug(f"Plugin {j} can share spectrum calculation") # Check if these Ein_bins are already used by an earlier plugin for i in range(len(self._data_ein_edges)): if self._data_ein_edges[i] is not None: if len(e) == len(self._data_ein_edges[i]): if np.all(np.equal(e, self._data_ein_edges[i])): log.debug(f"Plugin {j} shares the spectrum calculation with plugin {i}") self._data_ebin_connect.append(i) found = True break # If not save these Ein_bins and add an entry to the connection array if not found: self._data_ebin_connect.append(len(self._data_ein_edges)) self._data_ein_edges.append(e) self._base_plugin_key.append(key) @property def data_ein_edges(self): return self._data_ein_edges @property def data_ebin_connect(self): return self._data_ebin_connect @property def base_plugin_key(self): return self._base_plugin_key