diff --git a/cosipy/image_deconvolution/RichardsonLucy.py b/cosipy/image_deconvolution/RichardsonLucy.py index 21e76cde..62bd0fcb 100644 --- a/cosipy/image_deconvolution/RichardsonLucy.py +++ b/cosipy/image_deconvolution/RichardsonLucy.py @@ -1,14 +1,16 @@ import copy import numpy as np -import astropy.units as u from tqdm.autonotebook import tqdm -import gc from histpy import Histogram from .deconvolution_algorithm_base import DeconvolutionAlgorithmBase class RichardsonLucy(DeconvolutionAlgorithmBase): + """ + A class for the RichardsonLucy algorithm. + The algorithm here is based on Knoedlseder+99, Knoedlseder+05, Siegert+20. + """ def __init__(self, initial_model_map, data, parameter): DeconvolutionAlgorithmBase.__init__(self, initial_model_map, data, parameter) @@ -43,37 +45,61 @@ def __init__(self, initial_model_map, data, parameter): self.smoothing_sigma = parameter['smoothing_FWHM'] / 2.354820 # degree - self.smoothing_max_sigma = parameter.get('smoothing_max_sigma', default = 5.0) - self.gaussian_filter = self.calc_gaussian_filter(self.smoothing_sigma, self.smoothing_max_sigma) + self.gaussian_filter = self.calc_gaussian_filter(self.smoothing_sigma) def pre_processing(self): pass def Estep(self): -# self.expectation = self.calc_expectation(self.model_map, self.data, self.use_sparse) + """ + Notes + ----- + Expect count histogram is calculated in the post processing. + """ print("... skip E-step ...") def Mstep(self): + """ + M-step in RL algorithm. + + Notes + ----- + Background normalization is also optimized based on a generalized RL algirithm. + Currenly we use a signle normalization parameter. + In the future, the normalization will be optimized for each background group defined in some file. + """ + # Currenly (2024-01-12) this method can work for both local coordinate CDS and in galactic coordinate CDS. + # This is just because in DC2 the rotate response for galactic coordinate CDS does not have an axis for time/scatt binning. + # However it is likely that it will have such an axis in the future in order to consider background variability depending on time and pointign direction etc. + # Then, the implementation here will not work. Thus, keep in mind that we need to modify it once the response format is fixed. + diff = self.data.event_dense / self.expectation - 1 delta_map_part1 = self.model_map / self.data.image_response_dense_projected delta_map_part2 = Histogram(self.model_map.axes, unit = self.data.image_response_dense_projected.unit) if self.data.response_on_memory == True: - diff_x_response_this_pix = np.tensordot(diff.contents, self.data.image_response_dense.contents, axes = ([1,2,3], [2,3,4])) + diff_x_response = np.tensordot(diff.contents, self.data.image_response_dense.contents, axes = ([1,2,3], [2,3,4])) # [Time/ScAtt, Em, Phi, PsiChi] x [NuLambda, Ei, Em, Phi, PsiChi] -> [Time/ScAtt, NuLambda, Ei] - delta_map_part2[:] = np.tensordot(self.data.coordsys_conv_matrix.contents, diff_x_response_this_pix, axes = ([1,2], [0,1])) * diff_x_response_this_pix.unit * self.data.coordsys_conv_matrix.unit #lb, Ei - # [lb, Time/ScAtt, NuLambda] x [Time/ScAtt, NuLambda, Ei] -> [lb, Ei] + delta_map_part2[:] = np.tensordot(self.data.coordsys_conv_matrix.contents, diff_x_response, axes = ([0,2], [0,1])) \ + * diff_x_response.unit * self.data.coordsys_conv_matrix.unit + # [Time/ScAtt, lb, NuLambda] x [Time/ScAtt, NuLambda, Ei] -> [lb, Ei] # note that coordsys_conv_matrix is the sparse, so the unit should be recovered. else: for ipix in tqdm(range(self.npix_local)): - response_this_pix = np.sum(self.data.full_detector_response[ipix].to_dense(), axis = (4,5)) # may not work with the DC2 response format + if self.data.is_miniDC2_format == True: + response_this_pix = np.sum(self.data.full_detector_response[ipix].to_dense(), axis = (4,5)) # [Ei, Em, Phi, PsiChi] + else: + response_this_pix = self.data.full_detector_response[ipix].to_dense() # [Ei, Em, Phi, PsiChi] - diff_x_response_this_pix = np.tensordot(diff.contents, response_this_pix, axes = ([1,2,3], [1,2,3])) # Ti, Ei + diff_x_response_this_pix = np.tensordot(diff.contents, response_this_pix, axes = ([1,2,3], [1,2,3])) + # [Time/ScAtt, Em, Phi, PsiChi] x [Ei, Em, Phi, PsiChi] -> [Time/ScAtt, Ei] - delta_map_part2 += np.tensordot(self.data.coordsys_conv_matrix[:,:,ipix], diff_x_response_this_pix, axes = ([1],[0])) * diff_x_response_this_pix.unit * self.data.coordsys_conv_matrix.unit #lb, Ei + delta_map_part2 += np.tensordot(self.data.coordsys_conv_matrix[:,:,ipix], diff_x_response_this_pix, axes = ([0],[0])) \ + * diff_x_response_this_pix.unit * self.data.coordsys_conv_matrix.unit #lb, Ei + # [Time/ScAtt, lb] x [Time/ScAtt, Ei] -> [lb, Ei] self.delta_map = delta_map_part1 * delta_map_part2 @@ -86,6 +112,12 @@ def Mstep(self): self.bkg_norm = self.bkg_norm_range[1] def post_processing(self): + """ + Here three processes will be performed. + - response weighting filter: the delta map is renormalized as pixels with large exposure times will have more feedback. + - gaussian smoothing filter: the delta map is blurred with a Gaussian function. + - acceleration of RL algirithm: the normalization of delta map is increased as long as the updated image has no non-negative components. + """ if self.do_response_weighting: self.delta_map[:,:] *= self.response_weighting_filter @@ -103,11 +135,28 @@ def post_processing(self): self.expectation = self.calc_expectation(self.model_map, self.data) def check_stopping_criteria(self, i_iteration): + """ + If i_iteration is smaller than iteration_max, the iterative process will continue. + + Returns + ------- + bool + """ if i_iteration < self.iteration_max: return False return True def register_result(self, i_iteration): + """ + The values below are stored at the end of each iteration. + - iteration: iteration number + - model_map: updated image + - delta_map: delta map after M-step + - processed_delta_map: delta map after post-processing + - alpha: acceleration parameter in RL algirithm + - background_normalization: optimized background normalization + - loglikelihood: log-likelihood + """ loglikelihood = self.calc_loglikelihood(self.data, self.model_map, self.expectation) this_result = {"iteration": i_iteration, @@ -136,6 +185,14 @@ def show_result(self, i_iteration): print(f' background_normalization: {self.result["background_normalization"]}') def calc_alpha(self, delta, model_map, almost_zero = 1e-5): #almost_zero is needed to prevent producing a flux below zero + """ + Calculate the acceleration parameter in RL algorithm. + + Returns + ------- + float + Acceleration parameter + """ alpha = -1.0 / np.min( delta / model_map ) * (1 - almost_zero) alpha = min(alpha, self.alpha_max) if alpha < 1.0: diff --git a/cosipy/image_deconvolution/coordsys_conversion_matrix.py b/cosipy/image_deconvolution/coordsys_conversion_matrix.py index c275b945..c6afa6d8 100644 --- a/cosipy/image_deconvolution/coordsys_conversion_matrix.py +++ b/cosipy/image_deconvolution/coordsys_conversion_matrix.py @@ -1,16 +1,18 @@ -import astropy.units as u -from astropy.time import Time -from astropy.coordinates import SkyCoord, cartesian_to_spherical, Galactic import numpy as np import healpy as hp from tqdm.autonotebook import tqdm +import sparse +import astropy.units as u +from astropy.time import Time +from astropy.coordinates import SkyCoord, cartesian_to_spherical, Galactic from scoords import Attitude, SpacecraftFrame from histpy import Histogram, Axes, Axis, HealpixAxis -import sparse - class CoordsysConversionMatrix(Histogram): + """ + A class for coordinate conversion matrix (ccm). + """ def __init__(self, edges, contents = None, sumw2 = None, labels=None, axis_scale = None, sparse = None, unit = None, @@ -24,40 +26,50 @@ def __init__(self, edges, contents = None, sumw2 = None, @classmethod def time_binning_ccm(cls, full_detector_response, orientation, time_intervals, nside_model = None, is_nest_model = False): """ + Calculate a ccm from a given orientation. + Parameters ---------- - full_detector_response: - orientation: - time_intervals: 2d np.array. it is the same format of binned_data.axes['Time'].edges - nside_model: If it is None, it will be the same as the NSIDE in the response. + full_detector_response : :py:class:`cosipy.response.FullDetectorResponse` + Response + orientation : :py:class:`cosipy.spacecraftfile.SpacecraftFile` + Orientation + time_intervals : :py:class:`np.array` + The same format of binned_data.axes['Time'].edges + nside_model : int or None, default None + If it is None, it will be the same as the NSIDE in the response. + is_nest_model : bool, default False + If scheme of the model map is nested, it should be False while it is rare. Returns ------- - coordsys_conv_matrix: Axes [ "lb", "Time", "NuLambda" ] + :py:class:`cosipy.image_deconvolution.CoordsysConversionMatrix` + Its axes are [ "Time", "lb", "NuLambda" ]. """ if nside_model is None: nside_model = full_detector_response.nside - axis_model_map = HealpixAxis(nside = nside_model, coordsys = "galactic", label = "lb") axis_time = Axis(edges = time_intervals, label = "Time") + axis_model_map = HealpixAxis(nside = nside_model, coordsys = "galactic", label = "lb") axis_local_map = full_detector_response.axes["NuLambda"] - axis_coordsys_conv_matrix = [ axis_model_map, axis_time, axis_local_map ] #lb, Time, NuLambda + axis_coordsys_conv_matrix = [ axis_time, axis_model_map, axis_local_map ] #Time, lb, NuLambda contents = [] - for ipix in tqdm(range(hp.nside2npix(nside_model))): - l, b = hp.pix2ang(nside_model, ipix, nest=is_nest_model, lonlat=True) - pixel_coord = SkyCoord(l, b, unit = "deg", frame = 'galactic') - - ccm_thispix = np.zeros((axis_time.nbins, axis_local_map.nbins)) # without unit + for i_time, [init_time, end_time] in tqdm(enumerate(axis_time.bounds), total = len(axis_time.bounds)): + ccm_thispix = np.zeros((axis_model_map.nbins, axis_local_map.nbins)) # without unit - for i_time, [init_time, end_time] in enumerate(axis_time.bounds): - init_time = Time(init_time, format = 'unix') - end_time = Time(end_time, format = 'unix') + init_time = Time(init_time, format = 'unix') + end_time = Time(end_time, format = 'unix') - filtered_orientation = orientation.source_interval(init_time, end_time) + filtered_orientation = orientation.source_interval(init_time, end_time) + + for ipix in range(hp.nside2npix(nside_model)): + l, b = hp.pix2ang(nside_model, ipix, nest=is_nest_model, lonlat=True) + pixel_coord = SkyCoord(l, b, unit = "deg", frame = 'galactic') + pixel_movement = filtered_orientation.get_target_in_sc_frame(target_name = f"pixel_{ipix}_{i_time}", target_coord = pixel_coord, quiet = True, @@ -70,10 +82,10 @@ def time_binning_ccm(cls, full_detector_response, orientation, time_intervals, n src_path = pixel_movement, save = False) - ccm_thispix[i_time] = dwell_time_map.data + ccm_thispix[ipix] = dwell_time_map.data # (HealpixMap).data returns the numpy array without its unit. dwell_time_map.unit is u.s. - ccm_thispix_sparse = sparse.COO.from_numpy( ccm_thispix.reshape((1, axis_time.nbins, axis_local_map.nbins)) ) + ccm_thispix_sparse = sparse.COO.from_numpy( ccm_thispix.reshape((1, axis_model_map.nbins, axis_local_map.nbins)) ) contents.append(ccm_thispix_sparse) @@ -86,15 +98,28 @@ def time_binning_ccm(cls, full_detector_response, orientation, time_intervals, n @classmethod def spacecraft_attitude_binning_ccm(cls, full_detector_response, exposure_table, nside_model = None, use_averaged_pointing = False): """ + Calculate a ccm from a given exposure_table. + Parameters ---------- - full_detector_response: - exposure_table: - use_averaged_pointing: if this is True, the ccm loses accuracy but the calculatiion gets much faster. + full_detector_response : :py:class:`cosipy.response.FullDetectorResponse` + Response + exposure_table : :py:class:`cosipy.image_deconvolution.SpacecraftAttitudeExposureTable` + Scatt exposure table + nside_model : int or None, default None + If it is None, it will be the same as the NSIDE in the response. + use_averaged_pointing : bool, default False + If it is True, first the averaged Z- and X-pointings are calculated. + Then the dwell time map is calculated once for ach model pixel and each scatt_binning_index. + If it is False, the dwell time map is calculated for each attitude in zpointing and xpointing in the exposure table. + Then the calculated dwell time maps are summed up. + In the former case, the computation is fast but may lose the angular resolution. + In the latter case, the conversion matrix is more accurate but it takes a long time to calculate it. Returns ------- - coordsys_conv_matrix: Axes [ "lb", "ScAtt", "NuLambda" ] + :py:class:`cosipy.image_deconvolution.CoordsysConversionMatrix' + Its axes are [ "ScAtt", "lb", "NuLambda" ]. """ if nside_model is None: @@ -104,41 +129,41 @@ def spacecraft_attitude_binning_ccm(cls, full_detector_response, exposure_table, n_scatt_bins = len(exposure_table) - axis_model_map = HealpixAxis(nside = nside_model, coordsys = "galactic", scheme = exposure_table.scheme, label = "lb") axis_scatt = Axis(edges = np.arange(n_scatt_bins+1), label = "ScAtt") + axis_model_map = HealpixAxis(nside = nside_model, coordsys = "galactic", scheme = exposure_table.scheme, label = "lb") axis_local_map = full_detector_response.axes["NuLambda"] - axis_coordsys_conv_matrix = [ axis_model_map, axis_scatt, axis_local_map ] #lb, ScAtt, NuLambda + axis_coordsys_conv_matrix = [ axis_scatt, axis_model_map, axis_local_map ] #lb, ScAtt, NuLambda contents = [] - for ipix in tqdm(range(hp.nside2npix(nside_model))): - l, b = hp.pix2ang(nside_model, ipix, nest=is_nest_model, lonlat=True) - pixel_coord = SkyCoord(l, b, unit = "deg", frame = 'galactic') - - ccm_thispix = np.zeros((axis_scatt.nbins, axis_local_map.nbins)) # without unit + for i_scatt_bin in tqdm(range(n_scatt_bins)): + ccm_thispix = np.zeros((axis_model_map.nbins, axis_local_map.nbins)) # without unit - for idx in range(n_scatt_bins): - row = exposure_table.iloc[idx] - - scatt_binning_index = row['scatt_binning_index'] - num_pointings = row['num_pointings'] - #healpix_index = row['healpix_index'] - zpointing = row['zpointing'] - xpointing = row['xpointing'] - zpointing_averaged = row['zpointing_averaged'] - xpointing_averaged = row['xpointing_averaged'] - delta_time = row['delta_time'] - exposure = row['exposure'] - - if use_averaged_pointing: - z = SkyCoord([zpointing_averaged[0]], [zpointing_averaged[1]], frame="galactic", unit="deg") - x = SkyCoord([xpointing_averaged[0]], [xpointing_averaged[1]], frame="galactic", unit="deg") - else: - z = SkyCoord(zpointing.T[0], zpointing.T[1], frame="galactic", unit="deg") - x = SkyCoord(xpointing.T[0], xpointing.T[1], frame="galactic", unit="deg") + row = exposure_table.iloc[i_scatt_bin] + + scatt_binning_index = row['scatt_binning_index'] + num_pointings = row['num_pointings'] + #healpix_index = row['healpix_index'] + zpointing = row['zpointing'] + xpointing = row['xpointing'] + zpointing_averaged = row['zpointing_averaged'] + xpointing_averaged = row['xpointing_averaged'] + delta_time = row['delta_time'] + exposure = row['exposure'] - attitude = Attitude.from_axes(x = x, z = z, frame = 'galactic') + if use_averaged_pointing: + z = SkyCoord([zpointing_averaged[0]], [zpointing_averaged[1]], frame="galactic", unit="deg") + x = SkyCoord([xpointing_averaged[0]], [xpointing_averaged[1]], frame="galactic", unit="deg") + else: + z = SkyCoord(zpointing.T[0], zpointing.T[1], frame="galactic", unit="deg") + x = SkyCoord(xpointing.T[0], xpointing.T[1], frame="galactic", unit="deg") + + attitude = Attitude.from_axes(x = x, z = z, frame = 'galactic') + + for ipix in range(hp.nside2npix(nside_model)): + l, b = hp.pix2ang(nside_model, ipix, nest=is_nest_model, lonlat=True) + pixel_coord = SkyCoord(l, b, unit = "deg", frame = 'galactic') src_path_cartesian = SkyCoord(np.dot(attitude.rot.inv().as_matrix(), pixel_coord.cartesian.xyz.value), representation_type = 'cartesian', frame = SpacecraftFrame()) @@ -159,9 +184,9 @@ def spacecraft_attitude_binning_ccm(cls, full_detector_response, exposure_table, hist, bins = np.histogram(pixels, bins = axis_local_map.edges, weights = weights) - ccm_thispix[idx] = hist + ccm_thispix[ipix] = hist - ccm_thispix_sparse = sparse.COO.from_numpy( ccm_thispix.reshape((1, axis_scatt.nbins, axis_local_map.nbins)) ) + ccm_thispix_sparse = sparse.COO.from_numpy( ccm_thispix.reshape((1, axis_model_map.nbins, axis_local_map.nbins)) ) contents.append(ccm_thispix_sparse) @@ -173,12 +198,27 @@ def spacecraft_attitude_binning_ccm(cls, full_detector_response, exposure_table, @classmethod def open(cls, filename, name = 'hist'): + """ + Open a ccm from a file. + + Parameters + ---------- + filename : str + Path to file. + name : str, default 'hist' + Name of group where the histogram was saved. + + Returns + ------- + :py:class:`cosipy.image_deconvolution.CoordsysConversionMatrix' + Its axes are [ "lb", "Time" or "ScAtt", "NuLambda" ]. + """ new = super().open(filename, name) new = cls(new.axes, contents = new.contents, sumw2 = new.contents, unit = new.unit) - new.binning_method = new.axes.labels[1] # 'Time' or 'ScAtt' + new.binning_method = new.axes.labels[0] # 'Time' or 'ScAtt' return new diff --git a/cosipy/image_deconvolution/data_loader.py b/cosipy/image_deconvolution/data_loader.py index 5a0cc9a4..7c1dbe1b 100644 --- a/cosipy/image_deconvolution/data_loader.py +++ b/cosipy/image_deconvolution/data_loader.py @@ -1,20 +1,23 @@ +import warnings import numpy as np from tqdm.autonotebook import tqdm import astropy.units as u -from astropy.time import Time -from astropy.coordinates import SkyCoord -import healpy as hp -from histpy import Histogram, Axes, HealpixAxis -from mhealpy import HealpixMap +from histpy import Histogram, Axes from cosipy.response import FullDetectorResponse -from scoords import SpacecraftFrame, Attitude -from cosipy.spacecraftfile import SpacecraftFile from cosipy.data_io import BinnedData from .coordsys_conversion_matrix import CoordsysConversionMatrix class DataLoader(object): + """ + A class to manage data for image analysis, + namely event data, background model, response, coordsys conversion matrix. + Ideally, these data should be input directly to ImageDeconvolution class, + but considering their data formats are not fixed, this class is introduced. + The purpose of this class is to check the consistency between input data and calculate intermediate files etc. + In the future, this class may be removed or hidden in ImageDeconvolution class. + """ def __init__(self): self.event_dense = None @@ -26,8 +29,31 @@ def __init__(self): self.response_on_memory = False + self.image_response_dense_projected = None + @classmethod def load(cls, event_binned_data, bkg_binned_data, rsp, coordsys_conv_matrix, is_miniDC2_format = False): + """ + Load data + + Parameters + ---------- + event_binned_data : :py:class:`histpy.Histogram` + Event histogram + bkg_binned_data : :py:class:`histpy.Histogram` + Background model + rsp : :py:class:`histpy.Histogram` or :py:class:`cosipy.response.FullDetectorResponse` + Response + coordsys_conv_matrix : :py:class:`cosipy.image_deconvolution.CoordsysConversionMatrix` + Coordsys conversion matrix + is_miniDC2_format : bool, default False + Whether the file format is for mini-DC2. It will be removed in the future. + + Returns + ------- + :py:class:`cosipy.image_deconvolution.DataLoader` + DataLoader instance containing the input data set + """ new = cls() @@ -48,6 +74,31 @@ def load_from_filepath(cls, event_hdf5_filepath = None, event_yaml_filepath = No bkg_hdf5_filepath = None, bkg_yaml_filepath = None, rsp_filepath = None, ccm_filepath = None, is_miniDC2_format = False): + """ + Load data from file pathes + + Parameters + ---------- + event_hdf5_filepath : str or None, default None + File path of HDF5 file for event histogram. + event_yaml_filepath : str or None, default None + File path of yaml file to read the HDF5 file. + bkg_hdf5_filepath : str or None, default None + File path of HDF5 file for background model. + bkg_yaml_filepath : str or None, default None + File path of yaml file to read the HDF5 file. + rsp_filepath : str or None, default None + File path of the response matrix. + ccm_filepath : str or None, default None + File path of the coordsys conversion matrix. + is_miniDC2_format : bool, default False + Whether the file format is for mini-DC2. should be removed in the future. + + Returns + ------- + :py:class:`cosipy.image_deconvolution.DataLoader` + DataLoader instance containing the input data set + """ new = cls() @@ -64,6 +115,16 @@ def load_from_filepath(cls, event_hdf5_filepath = None, event_yaml_filepath = No return new def set_event_from_filepath(self, hdf5_filepath, yaml_filepath): + """ + Load event data from file pathes + + Parameters + ---------- + hdf5_filepath : str + File path of HDF5 file for event histogram. + yaml_filepath : str + File path of yaml file to read the HDF5 file. + """ self._event_hdf5_filepath = hdf5_filepath self._event_yaml_filepath = yaml_filepath @@ -78,6 +139,16 @@ def set_event_from_filepath(self, hdf5_filepath, yaml_filepath): print("... Done ...") def set_bkg_from_filepath(self, hdf5_filepath, yaml_filepath): + """ + Load background model from file pathes + + Parameters + ---------- + hdf5_filepath : str + File path of HDF5 file for background model. + yaml_filepath : str + File path of yaml file to read the HDF5 file. + """ self._bkg_hdf5_filepath = hdf5_filepath self._bkg_yaml_filepath = yaml_filepath @@ -92,6 +163,14 @@ def set_bkg_from_filepath(self, hdf5_filepath, yaml_filepath): print("... Done ...") def set_rsp_from_filepath(self, filepath): + """ + Load response matrix from file pathes + + Parameters + ---------- + filepath : str + File path of the response matrix. + """ self._rsp_filepath = filepath @@ -102,6 +181,14 @@ def set_rsp_from_filepath(self, filepath): print("... Done ...") def set_ccm_from_filepath(self, filepath): + """ + Load coordsys conversion matrix from file pathes + + Parameters + ---------- + filepath : str + File path of the coordsys conversion matrix. + """ self._ccm_filepath = filepath @@ -112,6 +199,14 @@ def set_ccm_from_filepath(self, filepath): print("... Done ...") def _check_file_registration(self): + """ + Check whether files are loaded. + + Returns + ------- + bool + True if all required files are loaded. + """ print(f"... checking the file registration ...") @@ -124,6 +219,14 @@ def _check_file_registration(self): return False def _check_axis_consistency(self): + """ + Check whether the axes of event/background/response are consistent with each other. + + Returns + ------- + bool + True if their axes are consistent. + """ print(f"... checking the axis consistency ...") @@ -150,10 +253,13 @@ def _check_axis_consistency(self): print(f" --> pass") return True - def _modify_axes(self): # this is a tentetive function + def _modify_axes(self): + """ + Modify the axes of data. This method will be removed in the future. + """ - print(f"Note that this function is tentetive. It should be removed in the future!") - print(f"Please run this function only once!") + warnings.warn("Note that _modify_axes() in DataLoader was implemented for a temporary use. It will be removed in the future.", FutureWarning) + warnings.warn("Make sure to perform _modify_axes() only once after the data are loaded.") if self.coordsys_conv_matrix.binning_method == 'Time': axis_name = ['Time', 'Em', 'Phi', 'PsiChi'] @@ -243,6 +349,9 @@ def _check_sc_orientation_coverage(self): ''' def load_full_detector_response_on_memory(self): + """ + Load a response file on the computer memory. + """ axes_image_response = [self.full_detector_response.axes["NuLambda"], self.full_detector_response.axes["Ei"], self.full_detector_response.axes["Em"], self.full_detector_response.axes["Phi"], self.full_detector_response.axes["PsiChi"]] @@ -374,7 +483,9 @@ def load_coordsys_conv_matrix_from_filepath(self, filepath): ''' def calc_image_response_projected(self): - # calculate the image_response_dense_projected + """ + Calculate image_response_dense_projected, which is an intermidiate matrix used in RL algorithm. + """ print("... (DataLoader) calculating a projected image response ...") @@ -383,9 +494,12 @@ def calc_image_response_projected(self): if self.response_on_memory: - self.image_response_dense_projected[:] = np.tensordot( np.sum(self.coordsys_conv_matrix, axis = (1)), - np.sum(self.image_response_dense, axis = (2,3,4)), - axes = ([1], [0]) ) * self.full_detector_response.unit * self.coordsys_conv_matrix.unit #lb, Ei + self.image_response_dense_projected[:] = np.tensordot( np.sum(self.coordsys_conv_matrix, axis = (0)), + np.sum(self.image_response_dense, axis = (2,3,4)), + axes = ([1], [0]) ) * self.full_detector_response.unit * self.coordsys_conv_matrix.unit + # [Time/ScAtt, lb, NuLambda] -> [lb, NuLambda] + # [NuLambda, Ei, Em, Phi, PsiChi] -> [NuLambda, Ei] + # [lb, NuLambda] x [NuLambda, Ei] -> [lb, Ei] else: npix = self.full_detector_response.axes["NuLambda"].npix @@ -397,6 +511,6 @@ def calc_image_response_projected(self): else: full_detector_response_projected_Ei = np.sum(self.full_detector_response[ipix].to_dense(), axis = (1,2,3)) #Ei - coordsys_conv_matrix_projected_lb = np.sum(self.coordsys_conv_matrix[:,:,ipix], axis = (1)).todense() * self.coordsys_conv_matrix.unit #lb + coordsys_conv_matrix_projected_lb = np.sum(self.coordsys_conv_matrix[:,:,ipix], axis = (0)).todense() * self.coordsys_conv_matrix.unit #lb self.image_response_dense_projected += np.outer(coordsys_conv_matrix_projected_lb, full_detector_response_projected_Ei) diff --git a/cosipy/image_deconvolution/deconvolution_algorithm_base.py b/cosipy/image_deconvolution/deconvolution_algorithm_base.py index ef53c0c8..8f98b7a8 100644 --- a/cosipy/image_deconvolution/deconvolution_algorithm_base.py +++ b/cosipy/image_deconvolution/deconvolution_algorithm_base.py @@ -1,13 +1,38 @@ import gc -import numpy as np -import astropy.units as u from tqdm.autonotebook import tqdm +import numpy as np import healpy as hp +import astropy.units as u from astropy.coordinates import angular_separation from histpy import Histogram, Axes, Axis class DeconvolutionAlgorithmBase(object): + """ + A base class for image deconvolution algorithms. + A subclass should override these methods: + + - pre_processing + - Estep + - Mstep + - post_processing + - check_stopping_criteria + - register_result + - save_result + - show_result + + When the method run_deconvolution is called in ImageDeconvolution class, + the iteration method in this class is called for each iteration. + + Attributes + ---------- + initial_model_map : :py:class:`cosipy.image_deconvolution.ModelMap` + Initial values for reconstructed images + data : :py:class:`cosipy.image_deconvolution.DataLoader` + COSI data set + parameter : py:class:`cosipy.config.Configurator` + Parameters for a deconvolution algorithm + """ def __init__(self, initial_model_map, data, parameter): @@ -51,36 +76,61 @@ def __init__(self, initial_model_map, data, parameter): self.save_result = parameter.get("save_results_each_iteration", False) def pre_processing(self): + """ + pre-processing for each iteration + """ pass def Estep(self): - # calculate expected events + """ + E-step. Basically expected counts are calculated here (or at the end of iteration in some cases). + """ pass def Mstep(self): - # calculate delta map + """ + M-step. Basically a first feedback to a model map (delta map) is calculated here. + """ pass def post_processing(self): - # applying filters to the delta map + """ + Post-processing. For example, filters like gaussian smoothing are applied to the delta map in this step. + """ pass def check_stopping_criteria(self, i_iteration): + """ + Check whether iteration process should be continued or stopped. + """ if i_iteration < 0: return False return True def register_result(self, i_iteration): + """ + Register results at the end of each iteration. Users can define what kinds of values will be stored in this method. + """ this_result = {"iteration": self.i_iteration + 1} self.result = this_result def save_result(self, i_iteration): + """ + Save some results at the end of each iteration. + """ pass def show_result(self, i_iteration): + """ + Show some results at the end of each iteration. + """ pass def iteration(self): + """ + Perform one iteration of image deconvolution. + This method should not be overrided in subclasses. + """ self.model_map = self.initial_model_map stop_iteration = False @@ -124,12 +174,38 @@ def iteration(self): yield self.result - #replaced with a function in other COSIpy libaray in the future? - def calc_expectation(self, model_map, data, almost_zero = 1e-12): ### test with separating the dwell time map + def calc_expectation(self, model_map, data, almost_zero = 1e-12): + """ + Calculate expected counts from a given model map. + + Parameters + ---------- + model_map : :py:class:`cosipy.image_deconvolution.ModelMap` + Model map + data : :py:class:`cosipy.image_deconvolution.DataLoader` + COSI data set + almost_zero : float, default 1e-12 + In order to avoid zero components in extended count histogram, a tiny offset is introduced. + It should be small enough not to effect statistics. + + Returns + ------- + :py:class:`histpy.Histogram` + Expected count histogram + + Notes + ----- + This method should be implemented in a more general class, for example, extended source response class in the future. + """ + # Currenly (2024-01-12) this method can work for both local coordinate CDS and in galactic coordinate CDS. + # This is just because in DC2 the rotate response for galactic coordinate CDS does not have an axis for time/scatt binning. + # However it is likely that it will have such an axis in the future in order to consider background variability depending on time and pointign direction etc. + # Then, the implementation here will not work. Thus, keep in mind that we need to modify it once the response format is fixed. expectation = Histogram(data.event_dense.axes) - map_rotated = np.tensordot(data.coordsys_conv_matrix.contents, model_map.contents, axes = ([0], [0])) # ['lb', 'Time/ScAtt', 'NuLambda'] x ['lb', 'Ei'] -> [Time/ScAtt, NuLambda, Ei] + map_rotated = np.tensordot(data.coordsys_conv_matrix.contents, model_map.contents, axes = ([1], [0])) + # ['Time/ScAtt', 'lb', 'NuLambda'] x ['lb', 'Ei'] -> [Time/ScAtt, NuLambda, Ei] map_rotated *= data.coordsys_conv_matrix.unit * model_map.unit map_rotated *= self.pixelarea_model # data.coordsys_conv_matrix.contents is sparse, so the unit should be restored. @@ -147,7 +223,29 @@ def calc_expectation(self, model_map, data, almost_zero = 1e-12): ### test with return expectation - def calc_loglikelihood(self, data, model_map, expectation = None): # expectation will be a mandatory parameter in the future. + def calc_loglikelihood(self, data, model_map, expectation = None): + """ + Calculate log-likelihood from given data and model/expectation. + + Parameters + ---------- + data : :py:class:`cosipy.image_deconvolution.DataLoader` + COSI data set + model_map : :py:class:`cosipy.image_deconvolution.ModelMap` + Model map + expectation : :py:class:`histpy.Histogram` or None, default None + Expected count histogram. + If it is not given, expected counts will be calculated in this method. + + Returns + ------- + float + Log-likelood + + Notes + ----- + The parameter expectation may be a mandatory parameter in the future. + """ if expectation is None: expectation = self.calc_expectation(model_map, data) @@ -155,7 +253,20 @@ def calc_loglikelihood(self, data, model_map, expectation = None): # expectation return loglikelood - def calc_gaussian_filter(self, sigma, max_sigma): + def calc_gaussian_filter(self, sigma): + """ + Calculate a gaussian filter for post-processing. + + Parameters + ---------- + sigma: float + Sigma for Gaussian function. It should be in degrees, but unitless. + + Returns + ------- + :py:class:`histpy.Histogram` + Gaussian filter. 2-dimensional histogram. + """ gaussian_filter = Histogram( Axes( [Axis(edges = np.arange(self.npix_model+1)), Axis(edges = np.arange(self.npix_model+1))] ), sparse = False) diff --git a/cosipy/image_deconvolution/exposure_table.py b/cosipy/image_deconvolution/exposure_table.py index c1cba4d1..a9d344b8 100644 --- a/cosipy/image_deconvolution/exposure_table.py +++ b/cosipy/image_deconvolution/exposure_table.py @@ -1,28 +1,37 @@ -from histpy import Histogram, HealpixAxis, Axis, Axes - +import warnings +import pandas as pd +from tqdm.autonotebook import tqdm import numpy as np import healpy as hp -import pandas as pd from astropy.io import fits import astropy.units as u -from tqdm.autonotebook import tqdm from cosipy.spacecraftfile import SpacecraftAttitudeMap class SpacecraftAttitudeExposureTable(pd.DataFrame): """ - scatt_binning_index : - healpix_index : list of tuple, (healpix_index_zpointing, healpix_index_xpointing) - zpointing : np.array, [[l, b]] in degrees - xpointing : np.array, [[l, b]] in degrees - zpointing_averaged : np.array, [l, b] in degrees - xpointing_averaged : np.array, [l, b] in degrees - delta_time : - exposure : - num_pointings : - bkg_group : - nside : nside for the model map - scheme : healpix scheme (ring or nested) + A class to analyze exposure time per each spacecraft attitude + + Table columns are: + - scatt_binning_index: int + - healpix_index: list of tuple. Each tuple is (healpix_index_zpointing, healpix_index_xpointing). + - zpointing: np.array of [l, b] in degrees. Array of z-pointings assigned to each scatt bin. + - xpointing: np.array of [l, b] in degrees. Array of x-pointings assigned to each scatt bin. + - zpointing_averaged: [l, b] in degrees. Averaged z-pointing in each scatt bin. + - xpointing_averaged: [l, b] in degrees. Averaged x-pointing in each scatt bin. + - delta_time: np.array of float in second. Exposure times for pointings assigned to each scatt bin. + - exposure: float in second. total exposure for each scatt bin. + - num_pointings: number of pointings assigned to each scatt bin. + - bkg_group: index of the backgroud group. will be used in the data analysis. + + Attributes + ---------- + df : :py:class:`pd.DataFrame` + pandas dataframe with the above columns + nside : int + Healpix NSIDE parameter. + scheme : str, default 'ring' + Healpix scheme. Either 'ring', 'nested'. """ def __init__(self, df, nside, scheme = 'ring'): @@ -34,7 +43,7 @@ def __init__(self, df, nside, scheme = 'ring'): if scheme == 'ring' or scheme == 'nested': self.scheme = scheme else: - print('Warning: the scheme should be "ring" or "nested". It was set to "ring".') + warnings.warn('The scheme should be "ring" or "nested" in SpacecraftAttitudeExposureTable. It will be set to "ring".') self.scheme = 'ring' def __eq__(self, other): @@ -51,6 +60,22 @@ def __eq__(self, other): @classmethod def from_pickle(cls, filename, nside, scheme = 'ring'): + """ + Read exposure table from pickle. + + Parameters + ---------- + filename : str + Path to file + nside : int + Healpix NSIDE parameter. + scheme : str, default 'ring' + Healpix scheme. Either 'ring', 'nested'. + + Returns + ------- + :py:class:`cosipy.spacecraftfile.SpacecraftAttitudeExposureTable` + """ df = pd.read_pickle(filename) @@ -60,6 +85,30 @@ def from_pickle(cls, filename, nside, scheme = 'ring'): @classmethod def from_orientation(cls, orientation, nside, scheme = 'ring', start = None, stop = None, min_exposure = None, min_num_pointings = None): + """ + Produce exposure table from orientation. + + Parameters + ---------- + orientation : :py:class:`cosipy.spacecraftfile.SpacecraftFile` + Orientation + nside : int + Healpix NSIDE parameter. + scheme : str, default 'ring' + Healpix scheme. Either 'ring', 'nested'. + start : :py:class:`astropy.time.Time` or None, default None + Start time to analyze the orientation + stop : :py:class:`astropy.time.Time` or None, default None + Stop time to analyze the orientation + min_exposure : float or None, default None + Minimum exposure time required for each scatt bin + min_num_pointings : int or None, default None + Minimum number of pointings required for each scatt bin + + Returns + ------- + :py:class:`cosipy.spacecraftfile.SpacecraftAttitudeExposureTable` + """ df = cls.analyze_orientation(orientation, nside, scheme, start, stop, min_exposure, min_num_pointings) @@ -70,6 +119,30 @@ def from_orientation(cls, orientation, nside, scheme = 'ring', start = None, sto # GTI should be a mandary parameter @classmethod def analyze_orientation(cls, orientation, nside, scheme = 'ring', start = None, stop = None, min_exposure = None, min_num_pointings = None): + """ + Produce pd.DataFrame from orientation. + + Parameters + ---------- + orientation : :py:class:`cosipy.spacecraftfile.SpacecraftFile` + Orientation + nside : int + Healpix NSIDE parameter. + scheme : str, default 'ring' + Healpix scheme. Either 'ring', 'nested'. + start : :py:class:`astropy.time.Time` or None, default None + Start time to analyze the orientation + stop : :py:class:`astropy.time.Time` or None, default None + Stop time to analyze the orientation + min_exposure : float or None, default None + Minimum exposure time required for each scatt bin + min_num_pointings : int or None, default None + Minimum number of pointings required for each scatt bin + + Returns + ------- + :py:class:`pd.DataFrame` + """ print("angular resolution: ", hp.nside2resol(nside) * 180 / np.pi, "deg.") @@ -164,6 +237,19 @@ def analyze_orientation(cls, orientation, nside, scheme = 'ring', start = None, @classmethod def from_fits(cls, filename): + """ + Read exposure table from a fits file. + + Parameters + ---------- + filename : str + Path to file + + Returns + ------- + :py:class:`cosipy.image_deconvolution.SpacecraftAttitudeExposureTable` + """ + infile = fits.open(filename) hdu = infile[1] @@ -209,7 +295,17 @@ def from_fits(cls, filename): return new - def save_as_fits(self, filename, overwrite = True): + def save_as_fits(self, filename, overwrite = False): + """ + Save exposure table as a fits file. + + Parameters + ---------- + filename : str + Path to file + overwrite : bool, default False + """ + # primary HDU primary_hdu = fits.PrimaryHDU() @@ -277,6 +373,21 @@ def save_as_fits(self, filename, overwrite = True): @classmethod def _get_averaged_pointing(cls, pointing, delta_time): + """ + Calculate an averaged pointing from given lists of pointings and exposure time on each pointing + + Parameters + ---------- + pointing : list of np.array + List of pointings in degrees, e.g., [ np.array([l, b]), np.array([l, b]), ...] + delta_time : list of float + List of exposure time in seconds for each pointing, e.g, [ 1.0, 1.0, ...] + + Returns + ------- + :py:class:`np.array` + Averaged pointing in degrees, as np.array([l, b]) + """ averaged_vector = np.sum(hp.ang2vec(pointing.T[0], pointing.T[1], lonlat = True).T * delta_time, axis = (1)) averaged_vector /= np.linalg.norm(averaged_vector) @@ -289,6 +400,18 @@ def _get_averaged_pointing(cls, pointing, delta_time): return averaged_pointing def calc_pointing_trajectory_map(self): + """ + Calculate a 2-dimensional map showing exposure time for each spacecraft attitude. + + Returns + ------- + :py:class:`cosipy.spacecraft.SpacecraftAttitudeMap` + + Notes + ----- + The default axes in SpacecraftAttitudeMap is x- and y-pointings, + but here the spacecraft attitude is described with z- and x-pointings. + """ map_pointing_zx = SpacecraftAttitudeMap(nside = self.nside, scheme = self.scheme, coordsys = 'galactic', labels = ['z', 'x']) diff --git a/cosipy/image_deconvolution/image_deconvolution.py b/cosipy/image_deconvolution/image_deconvolution.py index 3fef56a2..fb2d1279 100644 --- a/cosipy/image_deconvolution/image_deconvolution.py +++ b/cosipy/image_deconvolution/image_deconvolution.py @@ -1,29 +1,48 @@ +import warnings import astropy.units as u -import numpy as np -from histpy import Histogram, Axes -from mhealpy import HealpixMap - -from astropy.coordinates import SkyCoord -from scoords import SpacecraftFrame, Attitude -from cosipy.response import FullDetectorResponse from cosipy.config import Configurator from .modelmap import ModelMap -from .RichardsonLucy import RichardsonLucy +# import image deconvolution algorithms +from .RichardsonLucy import RichardsonLucy class ImageDeconvolution: + """ + A class to reconstruct all-sky images from COSI data based on image deconvolution methods. + """ def __init__(self): self._initial_model_map = None def set_data(self, data): + """ + Set COSI dataset - self._data = data + Parameters + ---------- + data : :py:class:`cosipy.image_deconvolution.DataLoader` + Data loader contaning an event histogram, a background model, a response matrix, and a coordsys_conversion_matrix. + Notes + ----- + cosipy.image_deconvolution.DataLoader may be removed in the future once the formats of event/background/response are fixed. + In this case, this method will be also modified in the future. + """ + + self._data = data + print("data for image deconvolution was set -> ", data) def read_parameterfile(self, parameter_filepath): + """ + Read parameters from a yaml file. + + Parameters + ---------- + parameter_filepath : str or pathlib.Path + Path of parameter file. + """ self._parameter = Configurator.open(parameter_filepath) @@ -31,23 +50,56 @@ def read_parameterfile(self, parameter_filepath): @property def data(self): + """ + Return the set data. + """ return self._data @property def parameter(self): + """ + Return the set parameter. + """ return self._parameter def override_parameter(self, *args): + """ + Override parameter + + Parameters + ---------- + *args + new parameter + + Examples + -------- + >>> image_deconvolution.override_parameter("deconvolution:parameter_RL:iteration = 30") + """ self._parameter.override(args) @property def initial_model_map(self): + """ + Return the initial model map. + """ if self._initial_model_map is None: - print("warining: need the initialization") + warnings.warn("Need to initialize model map in the image_deconvolution instance") return self._initial_model_map def _check_model_response_consistency(self): + """ + Check whether the axes of model map are consistent with those of the response matrix. + + Returns + ------- + bool + If True, their axes are consistent with each other. + + Notes + ----- + It will be implemented in the future. Currently it always returns true. + """ #self._initial_model_map.axes["Ei"].axis_scale = self._data.image_response_dense_projected.axes["Ei"].axis_scale #return self._initial_model_map.axes["lb"] == self._data.image_response_dense_projected.axes["lb"] \ @@ -55,7 +107,28 @@ def _check_model_response_consistency(self): return True def initialize(self): + """ + Initialize an image_deconvolution instance. It is mandatory to execute this method before running the image deconvolution. + + This method has three steps: + 1. generate a model map with properties (nside, energy bins, etc.) given in the parameter file. + 2. initialize a model map following an initial condition given in the parameter file + 3. load parameters for the image deconvolution + """ + print("#### Initialization ####") + + ### check self._data ### + ### this part will be removed in the future ### + if self._data.response_on_memory == False: + + warnings.warn("In the image deconvolution, the option to not load the response on memory is currently not supported. Performing DataLoader.load_full_detector_response_on_memory().") + self._data.load_full_detector_response_on_memory() + + if self._data.image_response_dense_projected is None: + + warnings.warn("The image_response_dense_projected has not been calculated. Performing DataLoader.calc_image_response_projected().") + self._data.calc_image_response_projected() print("1. generating a model map") parameter_model_property = Configurator(self._parameter['model_property']) @@ -81,9 +154,9 @@ def initialize(self): print("---- parameters ----") print(parameter_model_initialization.dump()) - print("3. resistering the deconvolution algorithm ...") + print("3. registering the deconvolution algorithm ...") parameter_deconvolution = Configurator(self._parameter['deconvolution']) - self._deconvolution = self.resister_deconvolution_algorithm(parameter_deconvolution) + self._deconvolution = self.register_deconvolution_algorithm(parameter_deconvolution) print("---- parameters ----") print(parameter_deconvolution.dump()) @@ -91,7 +164,45 @@ def initialize(self): print("#### Done ####") print("") - def resister_deconvolution_algorithm(self, parameter_deconvolution): + def register_deconvolution_algorithm(self, parameter_deconvolution): + """ + Register parameters for image deconvolution on a deconvolution instance. + + Parameters + ---------- + parameter_deconvolution : :py:class:`cosipy.config.Configurator` + Parameters for the image deconvolution methods. + + Notes + ----- + Currently only RichardsonLucy algorithm is implemented. + + ***An example of parameters for RL algorithm*** + algorithm: "RL" + parameter_RL: + iteration: 10 + # number of iterations + acceleration: True + # whether the accelerated ML-EM algorithm (Knoedlseder+99) is used + alpha_max: 10.0 + # the maximum value for the acceleration alpha parameter + save_results_each_iteration: False + # whether a updated model map, detal map, likelihood etc. are save at the end of each iteration + response_weighting: True + # whether a factor $w_j = (\sum_{i} R_{ij})^{\beta}$ for weighting the delta image is introduced + # see Knoedlseder+05, Siegert+20 + response_weighting_index: 0.5 + # $\beta$ in the above equation + smoothing: True + # whether a Gaussian filter is used (see Knoedlseder+05, Siegert+20) + smoothing_FWHM: 2.0 #deg + # the FWHM of the Gaussian in the filter + background_normalization_fitting: False + # whether the background normalization is optimized at each iteration. + # As for now, the same single background normalization factor is used in all of the time bins + background_normalization_range: [0.01, 10.0] + # the range of the normalization factor. it should be positive. + """ algorithm_name = parameter_deconvolution['algorithm'] @@ -105,6 +216,14 @@ def resister_deconvolution_algorithm(self, parameter_deconvolution): return _deconvolution def run_deconvolution(self): + """ + Perform the image deconvolution. Make sure that the initialize method has been conducted. + + Returns + ------- + list + List containing results (reconstructed image, likelihood etc) at each iteration. + """ print("#### Deconvolution Starts ####") all_result = [] @@ -118,5 +237,5 @@ def run_deconvolution(self): print("") return all_result - def analyze_result(self): - pass +# def analyze_result(self): +# pass diff --git a/cosipy/image_deconvolution/modelmap.py b/cosipy/image_deconvolution/modelmap.py index b67530cc..d540b215 100644 --- a/cosipy/image_deconvolution/modelmap.py +++ b/cosipy/image_deconvolution/modelmap.py @@ -1,12 +1,30 @@ +import warnings import astropy.units as u import numpy as np from histpy import Histogram, Axes, Axis, HealpixAxis -import astropy.units as u from cosipy.threeml.custom_functions import get_integrated_spectral_model class ModelMap(Histogram): + """ + Photon flux maps in given energy bands. 2-dimensional histogram. + + Attributes + ---------- + nside : int + Healpix NSIDE parameter. + energy_edges : :py:class:`np.array` + Bin edges for energies. We recommend to use a Quantity array with the unit of keV. + scheme : str, default 'ring' + Healpix scheme. Either 'ring', 'nested'. + coordsys : str or :py:class:`astropy.coordinates.BaseRepresentation`, default is 'galactic' + Instrinsic coordinates of the map. The default is 'galactic'. + label_image : str, default 'lb' + The label name of the healpix axis. + label_energy : str, default 'Ei' + The label name of the energy axis. The default is 'Ei'. + """ def __init__(self, nside, @@ -18,7 +36,9 @@ def __init__(self, ): if energy_edges.unit != u.keV: - print("Warning (ModelMap): the unit of energy_edges is not keV!") + + warnings.warn(f"The unit of the given energy_edges is {energy_edges.unit}. It is converted to keV.") + energy_edges = energy_edges.to('keV') self.image_axis = HealpixAxis(nside = nside, scheme = scheme, @@ -32,6 +52,21 @@ def __init__(self, super().__init__(axes, sparse = False, unit = 1 / u.s / u.cm**2 / u.sr) # unit might be specified in the input parameter. def set_values_from_parameters(self, algorithm_name, parameter): + """ + Set the values of this model map accordinng to the specified algorithm. + + Parameters + ---------- + algorithm_name : str + Algorithm name to fill the values. + parameter : py:class:`cosipy.config.Configurator` + Parameters for the specified algorithm. + + Notes + ----- + Currently algorithm_name can be only 'flat'. All of the pixel values in each energy bins will set to the given value. + parameter should be {'values': [ flux value at 1st energy bin (without unit), flux value at 2nd energy bin, ...]}. + """ if algorithm_name == "flat": for idx, value in enumerate(parameter['values']): @@ -40,6 +75,14 @@ def set_values_from_parameters(self, algorithm_name, parameter): # ... def set_values_from_extendedmodel(self, extendedmodel): + """ + Set the values of this model map accordinng to the given astromodels.ExtendedSource. + + Parameters + ---------- + extendedmodel : :py:class:`astromodels.ExtendedSource` + Extended source model + """ integrated_flux = get_integrated_spectral_model(spectrum = extendedmodel.spectrum.main.shape, eaxis = self.energy_axis) diff --git a/docs/tutorials/image_deconvolution/511keV/GalacticCDS/511keV-DC2-Galactic-ImageDeconvolution.ipynb b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/511keV-DC2-Galactic-ImageDeconvolution.ipynb new file mode 100644 index 00000000..49fead0c --- /dev/null +++ b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/511keV-DC2-Galactic-ImageDeconvolution.ipynb @@ -0,0 +1,2359 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3edcfe0b-24d7-4321-b355-a6dc730c155d", + "metadata": { + "tags": [] + }, + "source": [ + "# DC2 Image Analysis, 511 keV, Image Deconvolution using CDS in the Galactic coordinate system\n", + "\n", + "updated on 2024-01-30 (the commit 26cfdeacb25335bd511a91c4f8a29bdeb36408f2)\n", + "\n", + "This notebook focuses on the image deconvolution with the Compton data space (CDS) in the Galactic coordinate system.\n", + "An example of the image analysis will be presented using the 511keV thin disk 3-month simulation data created for DC2.\n", + "\n", + "In DC2, we have two options on the coordinate system to describe the Compton scattering direction ($\\chi\\psi$) in the image deconvolution. Please also check the notes written in 511keV-DC2-ScAtt-DataReduction.ipynb." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e751bbd5", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from histpy import Histogram, HealpixAxis, Axis, Axes\n", + "from mhealpy import HealpixMap\n", + "from astropy.coordinates import SkyCoord, cartesian_to_spherical, Galactic\n", + "\n", + "from cosipy.response import FullDetectorResponse\n", + "from cosipy.spacecraftfile import SpacecraftFile\n", + "from cosipy.ts_map.TSMap import TSMap\n", + "from cosipy.data_io import UnBinnedData, BinnedData\n", + "from cosipy.image_deconvolution import SpacecraftAttitudeExposureTable, CoordsysConversionMatrix, DataLoader, ImageDeconvolution\n", + "\n", + "# cosipy uses astropy units\n", + "import astropy.units as u\n", + "from astropy.units import Quantity\n", + "from astropy.coordinates import SkyCoord\n", + "from astropy.time import Time\n", + "from astropy.table import Table\n", + "from astropy.io import fits\n", + "from scoords import Attitude, SpacecraftFrame\n", + "\n", + "#3ML is needed for spectral modeling\n", + "from threeML import *\n", + "from astromodels import Band\n", + "\n", + "#Other standard libraries\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.gridspec import GridSpec \n", + "\n", + "import healpy as hp\n", + "from tqdm.autonotebook import tqdm\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "id": "00f20cda-81f8-4685-b9c4-f9423e5ebcf7", + "metadata": { + "tags": [] + }, + "source": [ + "# 0. Files needed for this notebook\n", + "\n", + "From wasabi\n", + "- cosi-pipeline-public/COSI-SMEX/DC2/Responses/PointSourceReponse/psr_gal_511_DC2.h5.gz (please gunzip it)\n", + " - a pre-computed 511 keV line response file converted into the Galactic coordinate system\n", + "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months_unbinned_data.fits.gz\n", + "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Backgrounds/albedo_photons_3months_unbinned_data.fits.gz\n", + " - In this notebook, only the albedo gamma-ray background is considered for a tutorial.\n", + " - If you want to consider all of the background components, please replace it with cosi-pipeline-public/COSI-SMEX/DC2/Data/Backgrounds/total_bg_3months_unbinned_data.fits.gz\n", + " - Note that total_bg_3months_unbinned_data.fits.gz is 14.15 GB.\n", + "\n", + "From docs/tutorials/image_deconvolution/511keV/GalacticCDS\n", + "- inputs_511keV_DC2.yaml\n", + "- imagedeconvolution_parfile_gal_511keV.yml" + ] + }, + { + "cell_type": "markdown", + "id": "cbb84ad7-5fcb-4a56-abc3-6acac81c0879", + "metadata": {}, + "source": [ + "You can download the data and detector response from wasabi. You can skip this cell if you already have downloaded the files." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305c7466-c6ef-4f0d-8b93-3234a1802668", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "header = \"AWS_ACCESS_KEY_ID=GBAL6XATQZNRV3GFH9Y4 AWS_SECRET_ACCESS_KEY=GToOczY5hGX3sketNO2fUwiq4DJoewzIgvTCHoOv aws s3api get-object\"\n", + "\n", + "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Responses/PointSourceReponse/psr_gal_511_DC2.h5.gz --endpoint-url=https://s3.us-west-1.wasabisys.com psr_gal_511_DC2.h5.gz\")\n", + "\n", + "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months_unbinned_data.fits.gz --endpoint-url=https://s3.us-west-1.wasabisys.com 511_thin_disk_3months_unbinned_data.fits.gz\")\n", + "\n", + "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Data/Backgrounds/albedo_photons_3months_unbinned_data.fits.gz --endpoint-url=https://s3.us-west-1.wasabisys.com albedo_photons_3months_unbinned_data.fits.gz\")\n", + "\n", + "os.system('gunzip psr_gal_511_DC2.h5.gz')" + ] + }, + { + "cell_type": "markdown", + "id": "26d6eb3a", + "metadata": {}, + "source": [ + "# 1. Create binned event/background files in the Galactic coordinate system\n", + "\n", + " please modify \"path_data\" corresponding to your environment." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fada24bc", + "metadata": {}, + "outputs": [], + "source": [ + "path_data = \"path/to/data/\"" + ] + }, + { + "cell_type": "markdown", + "id": "90fec91e-8209-4f03-bbe3-b9acb78682b8", + "metadata": {}, + "source": [ + "**Source**" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9cae1835-e54b-4720-b3a6-196c42cbd1ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "binning data...\n", + "Time unit: s\n", + "Em unit: keV\n", + "Phi unit: deg\n", + "PsiChi unit: None\n", + "CPU times: user 7.75 s, sys: 255 ms, total: 8 s\n", + "Wall time: 8.06 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "signal_filepath = path_data + \"511_thin_disk_3months_unbinned_data.fits.gz\"\n", + "\n", + "binned_signal = BinnedData(input_yaml = \"inputs_511keV_DC2.yaml\")\n", + "\n", + "binned_signal.get_binned_data(unbinned_data = signal_filepath, psichi_binning=\"galactic\")" + ] + }, + { + "cell_type": "markdown", + "id": "3544076d-3475-48d6-9aec-55dab18567c2", + "metadata": {}, + "source": [ + "**Background**" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "801ba251-96e0-4243-8f55-1678823f1d58", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "binning data...\n", + "Time unit: s\n", + "Em unit: keV\n", + "Phi unit: deg\n", + "PsiChi unit: None\n", + "CPU times: user 1min 51s, sys: 3.96 s, total: 1min 55s\n", + "Wall time: 1min 55s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "bkg_filepath = path_data + \"albedo_photons_3months_unbinned_data.fits.gz\"\n", + "\n", + "binned_bkg = BinnedData(input_yaml = \"inputs_511keV_DC2.yaml\")\n", + "\n", + "binned_bkg.get_binned_data(unbinned_data = bkg_filepath, psichi_binning=\"galactic\")" + ] + }, + { + "cell_type": "markdown", + "id": "4eb8577f-d394-49b9-a13f-a527d4512f77", + "metadata": {}, + "source": [ + "Convert the data into sparse matrices & add the signal to the background" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f224b957-d0df-4b4b-98dd-90d3a5bda3fb", + "metadata": {}, + "outputs": [], + "source": [ + "signal = binned_signal.binned_data.to_dense()\n", + "bkg = binned_bkg.binned_data.to_dense()\n", + "event = signal + bkg" + ] + }, + { + "cell_type": "markdown", + "id": "217e40dd-5587-4c43-bb77-44ddba2a8dbb", + "metadata": {}, + "source": [ + "Save the binned histograms" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "24289425-380b-4d26-a7c0-cbbd5c58e7b2", + "metadata": {}, + "outputs": [], + "source": [ + "signal.write(\"511keV_dc2_galactic_signal.hdf5\", overwrite = True)\n", + "bkg.write(\"511keV_dc2_galactic_bkg.hdf5\", overwrite = True)\n", + "event.write(\"511keV_dc2_galactic_event.hdf5\", overwrite = True)" + ] + }, + { + "cell_type": "markdown", + "id": "badfd194-59f0-46d4-90b3-73cce60207c8", + "metadata": {}, + "source": [ + "Load the saved files" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e0f3dcae-5d3c-45af-931d-057d5681859c", + "metadata": {}, + "outputs": [], + "source": [ + "signal = Histogram.open(\"511keV_dc2_galactic_signal.hdf5\")\n", + "bkg = Histogram.open(\"511keV_dc2_galactic_bkg.hdf5\")\n", + "event = Histogram.open(\"511keV_dc2_galactic_event.hdf5\")" + ] + }, + { + "cell_type": "markdown", + "id": "0e7bb933-0ec0-47af-a18c-ac241abfea82", + "metadata": {}, + "source": [ + "In DC2, the number of time bins should be 1 when you perform the image deconvolution using the galactic CDS.\n", + "It is because the pre-computed response files in the galactic coordinate have no time axis, and all of the events are assumed to be projected into a single galactic CDS.\n", + "In the future, we plan to introduce more flexible binning." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "88efdbfa-aa5e-40b3-bdd6-2635946318e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[1.8354873 \\times 10^{9},~1.8434673 \\times 10^{9}] \\; \\mathrm{s}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bkg.axes['Time'].edges" + ] + }, + { + "cell_type": "markdown", + "id": "6c259412", + "metadata": {}, + "source": [ + "# 2. Load the response matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b5b295cf-0a96-4501-aa4e-4182a21dfe63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3.61 s, sys: 25.7 s, total: 29.3 s\n", + "Wall time: 47.9 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "response_path = path_data + \"psr_gal_511_DC2.h5\"\n", + "\n", + "image_response = Histogram.open(response_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "fbdbd818-8a58-4d25-a657-d43fc7f88ea4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['NuLambda', 'Ei', 'Em', 'Phi', 'PsiChi'], dtype='FormatcooData Typefloat64Shape(1, 3072, 3072)nnz3072Density0.0003255208333333333Read-onlyTrueSize96.0KStorage ratio0.0" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ccm.contents" + ] + }, + { + "cell_type": "markdown", + "id": "31ec05ad-90b7-4fad-9ad0-98cfd6483d41", + "metadata": {}, + "source": [ + "# 4. Imaging deconvolution" + ] + }, + { + "cell_type": "markdown", + "id": "6e88ca7f", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Brief overview of the image deconvolution\n", + "\n", + "Basically, we have to maximize the following likelihood function\n", + "\n", + "$$\n", + "\\log L = \\sum_i X_i \\log \\epsilon_i - \\sum_i \\epsilon_i\n", + "$$\n", + "\n", + "$X_i$: detected counts at $i$-th bin ( $i$ : index of the Compton Data Space)\n", + "\n", + "$\\epsilon_i = \\sum_j R_{ij} \\lambda_j + b_i$ : expected counts ( $j$ : index of the model space)\n", + "\n", + "$\\lambda_j$ : the model map (basically gamma-ray flux at $j$-th pixel)\n", + "\n", + "$b_i$ : the background at $i$-th bin\n", + "\n", + "$R_{ij}$ : the response matrix\n", + "\n", + "Since we have to optimize the flux in each pixel, and the number of parameters is large, we adopt an iterative approach to find a solution of the above equation. The simplest one is the ML-EM (Maximum Likelihood Expectation Maximization) algorithm. It is also known as the Richardson-Lucy algorithm.\n", + "\n", + "$$\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\delta \\lambda_{j}^{k}\n", + "$$\n", + "$$\n", + "\\delta \\lambda_{j}^{k} = \\frac{\\lambda_{j}^{k}}{\\sum_{i} R_{ij}} \\sum_{i} \\left(\\frac{ X_{i} }{\\epsilon_{i}} - 1 \\right) R_{ij} \n", + "$$\n", + "\n", + "We refer to $\\delta \\lambda_{j}^{k}$ as the delta map.\n", + "\n", + "As for now, the two improved algorithms are implemented in COSIpy.\n", + "\n", + "- Accelerated ML-EM algorithm (Knoedlseder+99)\n", + "\n", + "$$\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\delta \\lambda_{j}^{k}\n", + "$$\n", + "$$\n", + "\\alpha^{k} < \\mathrm{max}(- \\lambda_{j}^{k} / \\delta \\lambda_{j}^{k})\n", + "$$\n", + "\n", + "Practically, in order not to accelerate the algorithm excessively, we set the maximum value of $\\alpha$ ($\\alpha_{\\mathrm{max}}$). Then, $\\alpha$ is calculated as:\n", + "\n", + "$$\n", + "\\alpha^{k} = \\mathrm{min}(\\mathrm{max}(- \\lambda_{j}^{k} / \\delta \\lambda_{j}^{k}), \\alpha_{\\mathrm{max}})\n", + "$$\n", + "\n", + "- Noise damping using gaussian smoothing (Knoedlseder+05, Siegert+20)\n", + "\n", + "$$\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\left[ w_j \\delta \\lambda_{j}^{k} \\right]_{\\mathrm{gauss}}\n", + "$$\n", + "$$\n", + "w_j = \\left(\\sum_{i} R_{ij}\\right)^\\beta\n", + "$$\n", + "\n", + "$\\left[ ... \\right]_{\\mathrm{gauss}}$ means that the differential image is smoothed by a gaussian filter." + ] + }, + { + "cell_type": "markdown", + "id": "e0a2582e", + "metadata": {}, + "source": [ + "## 4-1. Prepare DataLoader containing all neccesary datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "de8055f7-4aab-4a17-8751-42493f9e88d6", + "metadata": {}, + "outputs": [], + "source": [ + "dataloader = DataLoader()\n", + "\n", + "dataloader.event_dense = event\n", + "dataloader.bkg_dense = bkg\n", + "\n", + "# the loaded response matrix should be assigned to both full_detector_response/image_response_dense in the Galactic CDS method.\n", + "dataloader.full_detector_response = image_response\n", + "dataloader.image_response_dense = image_response \n", + "\n", + "dataloader.response_on_memory = True\n", + "dataloader.coordsys_conv_matrix = ccm" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "59d48019", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "... checking the axis Time of the event and background files...\n", + " --> pass (edges)\n", + " --> pass (unit)\n", + "... checking the axis Em of the event and background files...\n", + " --> pass (edges)\n", + " --> pass (unit)\n", + "... checking the axis Phi of the event and background files...\n", + " --> pass (edges)\n", + " --> pass (unit)\n", + "... checking the axis PsiChi of the event and background files...\n", + " --> pass (edges)\n", + " --> pass (unit)\n", + "...checking the axis Em of the event and response files...\n", + " --> pass (edges)\n", + "...checking the axis Phi of the event and response files...\n", + " --> pass (edges)\n", + "...checking the axis PsiChi of the event and response files...\n", + " --> pass (edges)\n", + "The axes in the event and background files are redefined. Now they are consistent with those of the response file.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "WARNING FutureWarning: Note that _modify_axes() in DataLoader was implemented for a temporary use. It will be removed in the future.\n", + "\n", + "\n", + "WARNING UserWarning: Make sure to perform _modify_axes() only once after the data are loaded.\n", + "\n" + ] + } + ], + "source": [ + "dataloader._modify_axes()" + ] + }, + { + "cell_type": "markdown", + "id": "241505ad", + "metadata": {}, + "source": [ + "(In the future, we plan to remove the method \"_modify_axes.\")" + ] + }, + { + "cell_type": "markdown", + "id": "5bc6a570", + "metadata": {}, + "source": [ + "Here, we calculate an auxiliary matrix for the deconvolution. Basically, it is a response matrix projected into the model space ($\\sum_{i} R_{ij}$). Currently, it is mandatory to run this command for the image deconvolution." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0a5c9a02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "... (DataLoader) calculating a projected image response ...\n", + "CPU times: user 395 ms, sys: 340 ms, total: 735 ms\n", + "Wall time: 735 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "dataloader.calc_image_response_projected()" + ] + }, + { + "cell_type": "markdown", + "id": "b1a0269e", + "metadata": {}, + "source": [ + "## 4-3. Initialize the instance of the image deconvolution class\n", + "\n", + "First, we prepare an instance of the ImageDeconvolution class and then register the dataset and parameters for the deconvolution. After that, you can start the calculation." + ] + }, + { + "cell_type": "markdown", + "id": "79eb910c", + "metadata": {}, + "source": [ + " please modify this parameter_filepath corresponding to your environment." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "5fa73486", + "metadata": {}, + "outputs": [], + "source": [ + "parameter_filepath = \"imagedeconvolution_parfile_gal_511keV.yml\"" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a4b47308-3e13-400d-bebc-b5d1e093201d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data for image deconvolution was set -> \n", + "parameter file for image deconvolution was set -> imagedeconvolution_parfile_gal_511keV.yml\n" + ] + } + ], + "source": [ + "image_deconvolution = ImageDeconvolution()\n", + "\n", + "# set dataloader to image_deconvolution\n", + "image_deconvolution.set_data(dataloader)\n", + "\n", + "# set a parameter file for the image deconvolution\n", + "image_deconvolution.read_parameterfile(parameter_filepath)" + ] + }, + { + "cell_type": "markdown", + "id": "a2345d9d", + "metadata": {}, + "source": [ + "### Initialize image_deconvolution\n", + "\n", + "In this process, a model map is defined following the input parameters, and it is initialized. Also, it prepares ancillary data for the image deconvolution, e.g., the expected counts with the initial model map, gaussian smoothing filter etc.\n", + "\n", + "I describe parameters in the parameter file.\n", + "\n", + "#### model_property\n", + "\n", + "| Name | Unit | Description | Notes |\n", + "| :---: | :---: | :---: | :---: |\n", + "| coordinate | str | the coordinate system of the model map | As for now, it must be 'galactic' |\n", + "| nside | int | NSIDE of the model map | it must be the same as NSIDE of 'lb' axis of the coordinate conversion matrix|\n", + "| scheme | str | SCHEME of the model map | As for now, it must be 'ring' |\n", + "| energy_edges | list of float [keV] | The definition of the energy bins of the model map | As for now, it must be the same as that of the response matrix |\n", + "\n", + "#### model_initialization\n", + "\n", + "| Name | Unit | Description | Notes |\n", + "| :---: | :---: | :---: | :---: |\n", + "| algorithm | str | the method name to initialize the model map | As for now, only 'flat' can be used |\n", + "| parameter_flat:values | list of float [cm-2 s-1 sr-1] | the list of photon fluxes for each energy band | the length of the list should be the same as the length of \"energy_edges\" - 1 |\n", + "\n", + "#### deconvolution\n", + "\n", + "| Name | Unit | Description | Notes |\n", + "| :---: | :---: | :---: | :---: |\n", + "|algorithm | str | the name of the image deconvolution algorithm| As for now, only 'RL' is supported |\n", + "|||||\n", + "|parameter_RL:iteration | int | The maximum number of the iteration | |\n", + "|parameter_RL:acceleration | bool | whether the accelerated ML-EM algorithm (Knoedlseder+99) is used | |\n", + "|parameter_RL:alpha_max | float | the maximum value for the acceleration parameter | |\n", + "|parameter_RL:save_results_each_iteration | bool | whether an updated model map, detal map, likelihood etc. are saved at the end of each iteration | |\n", + "|parameter_RL:response_weighting | bool | whether a delta map is renormalized based on the exposure time on each pixel, namely $w_j = (\\sum_{i} R_{ij})^{\\beta}$ (see Knoedlseder+05, Siegert+20) | |\n", + "|parameter_RL:response_weighting_index | float | $\\beta$ in the above equation | |\n", + "|parameter_RL:smoothing | bool | whether a Gaussian filter is used (see Knoedlseder+05, Siegert+20) | |\n", + "|parameter_RL:smoothing_FWHM | float, degree | the FWHM of the Gaussian in the filter | |\n", + "|parameter_RL:background_normalization_fitting | bool | whether the background normalization factor is optimized at each iteration | As for now, the single background normalization factor is used in all of the bins |\n", + "|parameter_RL:background_normalization_range | list of float | the range of the normalization factor | should be positive |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "879053e3-ac7b-4a0a-ad58-24e3fb137065", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#### Initialization ####\n", + "1. generating a model map\n", + "---- parameters ----\n", + "coordinate: galactic\n", + "energy_edges:\n", + "- 509.0\n", + "- 513.0\n", + "nside: 16\n", + "scheme: ring\n", + "\n", + "2. initializing the model map ...\n", + "---- parameters ----\n", + "algorithm: flat\n", + "parameter_flat:\n", + " values:\n", + " - 1e-4\n", + "\n", + "3. registering the deconvolution algorithm ...\n", + "... calculating the expected events with the initial model map ...\n", + "... calculating the response weighting filter...\n", + "... calculating the gaussian filter...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f867026503df4ec38a7742788ff48203", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3072 [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---- parameters ----\n", + "algorithm: RL\n", + "parameter_RL:\n", + " acceleration: true\n", + " alpha_max: 10.0\n", + " background_normalization_fitting: false\n", + " background_normalization_range:\n", + " - 0.01\n", + " - 10.0\n", + " iteration: 10\n", + " response_weighting: true\n", + " response_weighting_index: 0.5\n", + " save_results_each_iteration: false\n", + " smoothing: true\n", + " smoothing_FWHM: 2.0\n", + " smoothing_max_sigma: 10.0\n", + "\n", + "#### Done ####\n", + "\n" + ] + } + ], + "source": [ + "image_deconvolution.initialize()" + ] + }, + { + "cell_type": "markdown", + "id": "5fa48a9c", + "metadata": {}, + "source": [ + "### (You can change the parameters as follows)\n", + "\n", + "Note that when you modify the parameters, do not forget to run \"initialize\" again!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "1a658d2a-4dee-4d05-83ae-d7ac06317c73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#### Initialization ####\n", + "1. generating a model map\n", + "---- parameters ----\n", + "coordinate: galactic\n", + "energy_edges:\n", + "- 509.0\n", + "- 513.0\n", + "nside: 16\n", + "scheme: ring\n", + "\n", + "2. initializing the model map ...\n", + "---- parameters ----\n", + "algorithm: flat\n", + "parameter_flat:\n", + " values:\n", + " - 1e-4\n", + "\n", + "3. registering the deconvolution algorithm ...\n", + "... calculating the expected events with the initial model map ...\n", + "... calculating the gaussian filter...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7c032f939ff743e3aed4c0687771765b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3072 [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---- parameters ----\n", + "algorithm: RL\n", + "parameter_RL:\n", + " acceleration: true\n", + " alpha_max: 5.0\n", + " background_normalization_fitting: true\n", + " background_normalization_range:\n", + " - 0.01\n", + " - 10.0\n", + " iteration: 50\n", + " response_weighting: false\n", + " response_weighting_index: 0.5\n", + " save_results_each_iteration: false\n", + " smoothing: true\n", + " smoothing_FWHM: 3.0\n", + " smoothing_max_sigma: 10.0\n", + "\n", + "#### Done ####\n", + "\n" + ] + } + ], + "source": [ + "image_deconvolution.override_parameter(\"deconvolution:parameter_RL:iteration = 50\")\n", + "image_deconvolution.override_parameter(\"deconvolution:parameter_RL:background_normalization_fitting = True\")\n", + "image_deconvolution.override_parameter(\"deconvolution:parameter_RL:alpha_max = 5.0\")\n", + "image_deconvolution.override_parameter(\"deconvolution:parameter_RL:smoothing_FWHM = 3.0\")\n", + "image_deconvolution.override_parameter(\"deconvolution:parameter_RL:response_weighting = False\")\n", + "\n", + "image_deconvolution.initialize()" + ] + }, + { + "cell_type": "markdown", + "id": "f764066e", + "metadata": {}, + "source": [ + "## 4-5. Start the image deconvolution\n", + "\n", + "**With MacBook Pro with M1 Max and 64 GB memory, it takes about 1.5 minutes for 50 iterations.**" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a57fbf71-2fcc-48c4-9ac7-4c545dca67c9", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#### Deconvolution Starts ####\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "123a41b5298c4d5eba8c9cf62c8c5b76", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/50 [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Iteration 1/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "WARNING RuntimeWarning: invalid value encountered in divide\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 386050.327946638\n", + " background_normalization: 1.1900860583584663\n", + " Iteration 2/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 400418.0610733818\n", + " background_normalization: 1.1604351059838505\n", + " Iteration 3/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 411089.6070768463\n", + " background_normalization: 1.0528532374315778\n", + " Iteration 4/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 412844.82476469607\n", + " background_normalization: 1.0586383806179276\n", + " Iteration 5/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 405718.57862391905\n", + " background_normalization: 0.9646219744282969\n", + " Iteration 6/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 415983.925941571\n", + " background_normalization: 1.1066673898750912\n", + " Iteration 7/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 416858.4161653833\n", + " background_normalization: 1.0806318578055656\n", + " Iteration 8/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 414257.0394215712\n", + " background_normalization: 1.0102344432919617\n", + " Iteration 9/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 417764.7103005161\n", + " background_normalization: 1.0821152684078852\n", + " Iteration 10/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 418085.83036392974\n", + " background_normalization: 1.0628439330942752\n", + " Iteration 11/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 416671.5483449631\n", + " background_normalization: 1.01071378053145\n", + " Iteration 12/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 418586.7202159421\n", + " background_normalization: 1.06125861498167\n", + " Iteration 13/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 418748.2154258507\n", + " background_normalization: 1.046438809261912\n", + " Iteration 14/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 417929.9387790803\n", + " background_normalization: 1.0064089218442853\n", + " Iteration 15/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419053.901413677\n", + " background_normalization: 1.044315278190893\n", + " Iteration 16/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419142.6261917602\n", + " background_normalization: 1.032928348339306\n", + " Iteration 17/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 418668.7303367079\n", + " background_normalization: 1.0022726458324056\n", + " Iteration 18/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419331.81249085104\n", + " background_normalization: 1.0310819169451524\n", + " Iteration 19/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419384.6657808487\n", + " background_normalization: 1.022400747988371\n", + " Iteration 20/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419117.17787774315\n", + " background_normalization: 0.9990969032872745\n", + " Iteration 21/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419503.1781891738\n", + " background_normalization: 1.020903831468017\n", + " Iteration 22/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419537.4338580138\n", + " background_normalization: 1.0143336117743598\n", + " Iteration 23/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419391.0999065008\n", + " background_normalization: 0.996731360121657\n", + " Iteration 24/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419612.81397406233\n", + " background_normalization: 1.0131337570188672\n", + " Iteration 25/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419636.6847504409\n", + " background_normalization: 1.0081895689199645\n", + " Iteration 26/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419559.4179241776\n", + " background_normalization: 0.9949613976847363\n", + " Iteration 27/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419685.6098920044\n", + " background_normalization: 1.007241126899907\n", + " Iteration 28/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419703.1797833361\n", + " background_normalization: 1.0035377514781483\n", + " Iteration 29/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419664.32482954196\n", + " background_normalization: 0.9936399908743172\n", + " Iteration 30/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419487.46208422736\n", + " background_normalization: 1.0028055191196619\n", + " Iteration 31/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 418669.1558819624\n", + " background_normalization: 0.9799331479447816\n", + " Iteration 32/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419634.10911400197\n", + " background_normalization: 1.0211029605768254\n", + " Iteration 33/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419659.03221757046\n", + " background_normalization: 1.0136432733397405\n", + " Iteration 34/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419411.490253184\n", + " background_normalization: 0.9943973775742112\n", + " Iteration 35/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419725.5587795917\n", + " background_normalization: 1.015325684269482\n", + " Iteration 36/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419738.1626685151\n", + " background_normalization: 1.0099456346378402\n", + " Iteration 37/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419626.3826360004\n", + " background_normalization: 0.9957165764734817\n", + " Iteration 38/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419778.6108548996\n", + " background_normalization: 1.009612147376651\n", + " Iteration 39/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419787.8858903183\n", + " background_normalization: 1.0056281285483295\n", + " Iteration 40/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419731.6003448446\n", + " background_normalization: 0.9950185424057802\n", + " Iteration 41/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419813.53259433387\n", + " background_normalization: 1.0050135239487987\n", + " Iteration 42/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419820.6780524987\n", + " background_normalization: 1.002046819706305\n", + " Iteration 43/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419792.0089048097\n", + " background_normalization: 0.9941334048497183\n", + " Iteration 44/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419672.64219748904\n", + " background_normalization: 1.001496431493074\n", + " Iteration 45/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419151.89420566417\n", + " background_normalization: 0.9830572014967464\n", + " Iteration 46/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419768.8962983411\n", + " background_normalization: 1.0159118239103546\n", + " Iteration 47/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419781.17991715414\n", + " background_normalization: 1.0099829791967136\n", + " Iteration 48/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419623.7705518758\n", + " background_normalization: 0.994708877170725\n", + " Iteration 49/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> continue\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 1.0\n", + " loglikelihood: 419821.7835588583\n", + " background_normalization: 1.0112793627463252\n", + " Iteration 50/50 \n", + "--> pre-processing\n", + "--> E-step\n", + "... skip E-step ...\n", + "--> M-step\n", + "--> post-processing\n", + "... calculating the expected events with the updated model map ...\n", + "--> checking stopping criteria\n", + "--> --> stop\n", + "--> registering results\n", + "--> showing results\n", + " alpha: 5.0\n", + " loglikelihood: 419827.8357267488\n", + " background_normalization: 1.0070105323513425\n", + "#### Done ####\n", + "\n", + "CPU times: user 3min 26s, sys: 2min 3s, total: 5min 30s\n", + "Wall time: 1min 25s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "all_results = image_deconvolution.run_deconvolution()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cc64ea8d", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'alpha': 1.0,\n", + " 'background_normalization': 1.1900860583584663,\n", + " 'delta_map': ,\n", + " 'iteration': 1,\n", + " 'loglikelihood': 386050.327946638,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.1604351059838505,\n", + " 'delta_map': ,\n", + " 'iteration': 2,\n", + " 'loglikelihood': 400418.0610733818,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0528532374315778,\n", + " 'delta_map': ,\n", + " 'iteration': 3,\n", + " 'loglikelihood': 411089.6070768463,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0586383806179276,\n", + " 'delta_map': ,\n", + " 'iteration': 4,\n", + " 'loglikelihood': 412844.82476469607,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9646219744282969,\n", + " 'delta_map': ,\n", + " 'iteration': 5,\n", + " 'loglikelihood': 405718.57862391905,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.1066673898750912,\n", + " 'delta_map': ,\n", + " 'iteration': 6,\n", + " 'loglikelihood': 415983.925941571,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0806318578055656,\n", + " 'delta_map': ,\n", + " 'iteration': 7,\n", + " 'loglikelihood': 416858.4161653833,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0102344432919617,\n", + " 'delta_map': ,\n", + " 'iteration': 8,\n", + " 'loglikelihood': 414257.0394215712,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0821152684078852,\n", + " 'delta_map': ,\n", + " 'iteration': 9,\n", + " 'loglikelihood': 417764.7103005161,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0628439330942752,\n", + " 'delta_map': ,\n", + " 'iteration': 10,\n", + " 'loglikelihood': 418085.83036392974,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.01071378053145,\n", + " 'delta_map': ,\n", + " 'iteration': 11,\n", + " 'loglikelihood': 416671.5483449631,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.06125861498167,\n", + " 'delta_map': ,\n", + " 'iteration': 12,\n", + " 'loglikelihood': 418586.7202159421,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.046438809261912,\n", + " 'delta_map': ,\n", + " 'iteration': 13,\n", + " 'loglikelihood': 418748.2154258507,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0064089218442853,\n", + " 'delta_map': ,\n", + " 'iteration': 14,\n", + " 'loglikelihood': 417929.9387790803,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.044315278190893,\n", + " 'delta_map': ,\n", + " 'iteration': 15,\n", + " 'loglikelihood': 419053.901413677,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.032928348339306,\n", + " 'delta_map': ,\n", + " 'iteration': 16,\n", + " 'loglikelihood': 419142.6261917602,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0022726458324056,\n", + " 'delta_map': ,\n", + " 'iteration': 17,\n", + " 'loglikelihood': 418668.7303367079,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0310819169451524,\n", + " 'delta_map': ,\n", + " 'iteration': 18,\n", + " 'loglikelihood': 419331.81249085104,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.022400747988371,\n", + " 'delta_map': ,\n", + " 'iteration': 19,\n", + " 'loglikelihood': 419384.6657808487,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9990969032872745,\n", + " 'delta_map': ,\n", + " 'iteration': 20,\n", + " 'loglikelihood': 419117.17787774315,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.020903831468017,\n", + " 'delta_map': ,\n", + " 'iteration': 21,\n", + " 'loglikelihood': 419503.1781891738,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0143336117743598,\n", + " 'delta_map': ,\n", + " 'iteration': 22,\n", + " 'loglikelihood': 419537.4338580138,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.996731360121657,\n", + " 'delta_map': ,\n", + " 'iteration': 23,\n", + " 'loglikelihood': 419391.0999065008,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0131337570188672,\n", + " 'delta_map': ,\n", + " 'iteration': 24,\n", + " 'loglikelihood': 419612.81397406233,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0081895689199645,\n", + " 'delta_map': ,\n", + " 'iteration': 25,\n", + " 'loglikelihood': 419636.6847504409,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9949613976847363,\n", + " 'delta_map': ,\n", + " 'iteration': 26,\n", + " 'loglikelihood': 419559.4179241776,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.007241126899907,\n", + " 'delta_map': ,\n", + " 'iteration': 27,\n", + " 'loglikelihood': 419685.6098920044,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0035377514781483,\n", + " 'delta_map': ,\n", + " 'iteration': 28,\n", + " 'loglikelihood': 419703.1797833361,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9936399908743172,\n", + " 'delta_map': ,\n", + " 'iteration': 29,\n", + " 'loglikelihood': 419664.32482954196,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0028055191196619,\n", + " 'delta_map': ,\n", + " 'iteration': 30,\n", + " 'loglikelihood': 419487.46208422736,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9799331479447816,\n", + " 'delta_map': ,\n", + " 'iteration': 31,\n", + " 'loglikelihood': 418669.1558819624,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0211029605768254,\n", + " 'delta_map': ,\n", + " 'iteration': 32,\n", + " 'loglikelihood': 419634.10911400197,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0136432733397405,\n", + " 'delta_map': ,\n", + " 'iteration': 33,\n", + " 'loglikelihood': 419659.03221757046,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9943973775742112,\n", + " 'delta_map': ,\n", + " 'iteration': 34,\n", + " 'loglikelihood': 419411.490253184,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.015325684269482,\n", + " 'delta_map': ,\n", + " 'iteration': 35,\n", + " 'loglikelihood': 419725.5587795917,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0099456346378402,\n", + " 'delta_map': ,\n", + " 'iteration': 36,\n", + " 'loglikelihood': 419738.1626685151,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9957165764734817,\n", + " 'delta_map': ,\n", + " 'iteration': 37,\n", + " 'loglikelihood': 419626.3826360004,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.009612147376651,\n", + " 'delta_map': ,\n", + " 'iteration': 38,\n", + " 'loglikelihood': 419778.6108548996,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0056281285483295,\n", + " 'delta_map': ,\n", + " 'iteration': 39,\n", + " 'loglikelihood': 419787.8858903183,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9950185424057802,\n", + " 'delta_map': ,\n", + " 'iteration': 40,\n", + " 'loglikelihood': 419731.6003448446,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0050135239487987,\n", + " 'delta_map': ,\n", + " 'iteration': 41,\n", + " 'loglikelihood': 419813.53259433387,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.002046819706305,\n", + " 'delta_map': ,\n", + " 'iteration': 42,\n", + " 'loglikelihood': 419820.6780524987,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9941334048497183,\n", + " 'delta_map': ,\n", + " 'iteration': 43,\n", + " 'loglikelihood': 419792.0089048097,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.001496431493074,\n", + " 'delta_map': ,\n", + " 'iteration': 44,\n", + " 'loglikelihood': 419672.64219748904,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.9830572014967464,\n", + " 'delta_map': ,\n", + " 'iteration': 45,\n", + " 'loglikelihood': 419151.89420566417,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0159118239103546,\n", + " 'delta_map': ,\n", + " 'iteration': 46,\n", + " 'loglikelihood': 419768.8962983411,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0099829791967136,\n", + " 'delta_map': ,\n", + " 'iteration': 47,\n", + " 'loglikelihood': 419781.17991715414,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 0.994708877170725,\n", + " 'delta_map': ,\n", + " 'iteration': 48,\n", + " 'loglikelihood': 419623.7705518758,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 1.0,\n", + " 'background_normalization': 1.0112793627463252,\n", + " 'delta_map': ,\n", + " 'iteration': 49,\n", + " 'loglikelihood': 419821.7835588583,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", + " {'alpha': 5.0,\n", + " 'background_normalization': 1.0070105323513425,\n", + " 'delta_map': ,\n", + " 'iteration': 50,\n", + " 'loglikelihood': 419827.8357267488,\n", + " 'model_map': ,\n", + " 'processed_delta_map': }]\n" + ] + } + ], + "source": [ + "import pprint\n", + "\n", + "pprint.pprint(all_results)" + ] + }, + { + "cell_type": "markdown", + "id": "1a69308c-c13b-4162-820a-7ac3a514e0ba", + "metadata": {}, + "source": [ + "**(If you want, you can save the results in the directory \"./results\" as follows)**" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "44d94156-fc95-43f0-ac56-3e784bbad1eb", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.mkdir(\"./results\")\n", + "\n", + "for result in all_results:\n", + " iteration = result['iteration']\n", + " result['model_map'].write(f'./results/model_map_itr{iteration}.hdf5')\n", + "\n", + " with open(f'./results/result_itr{iteration}.txt', 'w') as f:\n", + " paramlist = ['alpha', 'loglikelihood', 'background_normalization']\n", + "\n", + " for param in paramlist:\n", + " value = result[param]\n", + " f.write(f'{param}: {value}\\n')" + ] + }, + { + "cell_type": "markdown", + "id": "9d32d0a8", + "metadata": {}, + "source": [ + "# 5. Analyze the results\n", + "Examples to see/analyze the results are shown below." + ] + }, + { + "cell_type": "markdown", + "id": "f577c7ac", + "metadata": {}, + "source": [ + "## Log-likelihood\n", + "\n", + "Plotting the log-likelihood vs the number of iterations" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "445ee3d5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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RORQnBREVmv+5KUvn7wkIiJyKJt6ylpTUFCAwsJCKJVKTJkyxVHVkgdpvkYZl8MgIiJyLLtD2cmTJ/HPf/4T586dE46ZQllWVhb+9re/4aWXXkJycrK9lyI3UzTvKePwJRERkUPZNXyZn5+PJ554AsXFxZg1axaGDx9udn7QoEEIDg7G3r177bkMeYjmWyzx6UsiIiLHsiuUffzxxwCAtWvXYuHChejbt6/ZeZFIhH79+uHUqVP2XIY8hPkWSwxlREREjmRXKMvKysK4ceMQGRl5zTIRERGorKy05zLkIcyevgzm8CUREZEj2RXKFAoFunTp0moZlUoFvV5vz2XIQ5hW8wf49CUREZGj2RXKwsLCzCb4t+T06dPo0aOHPZchD2GaUyaWiuDl67AHd4mIiAh2hrJRo0bht99+w+HDh1s8/+OPPyInJwdjxoyx5zLkIUzDl75BMu7sQERE5GB2dXf85S9/wd69e7FkyRJMnToVVVVVAIAtW7YgOzsbu3fvRrdu3XDPPfc45GbJfQx6A/e9JCIiciK7QplcLsf777+PpUuX4ttvvxWO/+tf/wIAJCUl4R//+AcCAgLsuklyP1WjBga9AQAn+RMRETmD3RODevTogVWrViEvLw85OTmoq6uDn58fkpKSkJiY6Ih7JA/ASf5ERETOZVco++mnnzB27FgAQO/evdG7d+8Wy73//vtIS0uz51LkZgouHEtERORUdk30f+2113Ds2LFWy7z//vv4+uuv7bkMeYDmq/lz4VgiIiLHsyuU9ejRA88999w1l8VYsWIFvvrqK+572QGYr+bPOWVERESOZlco++c//wk/Pz/87W9/Q2lpqdm5VatW4csvv0RycjJeeeUVu26S3E/ZbDNyH84pIyIicji7Qll4eDiWLVsGlUqFv/71r6itrQVgDGSbNm3CqFGj8Morr0AikTjkZsl9zHrKGMqIiIgczq5QBgC9evXCW2+9hfLycvztb3/DihUrsGnTJowcORKvvfYapFKu/N4RmO17yeFLIiIih7M7lAFAv3798PLLL+PMmTP46quvMGLECCxdupSBrANRNB++5ER/IiIih7MpNe3cubPV80OHDkVOTg5Gjx6NH374wezc1KlTbb878hjKy8OX3n5SSKQOyfJERETUjE2h7I033mhxz0ODwQCRSASDwbji+7vvvmt2TCQSMZS1c8K+l1zNn4iIyClsCmXPPvuss+6DPJhWrYNGoQXASf5ERETOYlMomzZtmrPugzyYkqv5ExEROZ3Hz8T/7LPPkJGRgZiYGHz66adm506cOIEPPvgAp0+fhr+/P8aPH48FCxbAz8/PrJxarcZHH32E7777DvX19YiLi8NDDz2EoUOHWlzPnXV6Kj55SURE5HwePWO7rKwM69evh6+vr8W5vLw8PPnkk1AqlVi0aBGmT5+Obdu24aWXXrIo+8Ybb2Dz5s245ZZbsHjxYojFYixZsgTHjx/3qDo9lar+SiiTBXi58U6IiIg6Lpt6ysaNGwexWIzPPvsMUVFRGDduXIsT/68mEomwZ88em29u1apVSEpKgl6vFxamNfnwww8RGBiI5cuXw9/fHwDQvXt3vP322zh06BCGDRsGAMjJycHu3bvx2GOP4d577wUATJkyBfPnz8fq1auxevVqj6jTk6matML3Mn+GMiIiImewqads0KBBGDhwIGQymfDamj8DBw60+caysrKwb98+pKWlWZxrbGzE4cOHMXnyZCHoAMZg5OvraxYA9+3bB4lEgtTUVOGYTCbD9OnTkZ2dLWwP5e46PZm6USN8z1BGRETkHDb1lC1fvrzV146i0+mQnp6O6dOnIy4uzuL8uXPnoNPpkJCQYHbcy8sLvXv3Rl5ennAsLy8PkZGRZqEIABITEwEAZ86cQUREhNvrvFpFRQUqKyuF14WFhdcs62zqpiuhzNvf46chEhERtUse+Qm7detWlJaW4r333mvxvCmshISEWJwLCQnBsWPHzMpeqxxgDD+eUOfVMjMzsW7dOovj+fn50Ol013xfSxoaGpCTk2PTe5q7WFgtfF9cfglNOVVtrqszsLe9yTZsb9die7sW29u1nNXeSUlJVpXzuFBWW1uLjz/+GHPnzoVcLm+xjEpl3PLHy8tyKM3b2xtqtdqs7LXKNa/L3XVeLTU1FaNHjxZeFxYWYunSpYiJibHoebuenJwcq38hWlL1yx+4hDoAQJ+keIT0CmpzXZ2Bve1NtmF7uxbb27XY3q7l7va2KZS11HNjDZFIhHnz5llVNiMjA4GBgbj77ruvWcY0p02j0VicU6vVQjgylb1WueZ1ubvOq4WGhiI0NPSa511J1dh8+JJzyoiIiJzBplD2ySeftOki1oayoqIibNu2DWlpacIQIGAMMFqtFsXFxfD39xeGA5vPuTKprKw0CzMhISEoLy9vsRwAoay76/RkzeeUyTinjIiIyCls+oRNT0931n0AMM7F0uv1SE9Pb/Fas2fPxsyZM/HAAw9AIpEgNzcXEyZMEM5rNBrk5eVh/PjxwrH4+HgcPXoUjY2NZhPzTWPG8fHxAICYmBi31unJVI3GJTFEIsDLh6GMiIjIGWz6hB08eLCTbsMoJiYGr7/+usXxjIwMNDU1YfHixejRowcCAgIwZMgQfPfdd5g3b56wMv6uXbugUCjMwk5KSgo2btyIzMxMYU0xtVqN7du3IykpCREREQDg9jo9mWlJDG8/L4jE11+XjoiIiGznUd0ecrkcY8aMsTj+5ZdfAoDZuYceeggLFy5EWloaUlNTUVZWhk2bNmHo0KEYPny4UC4pKQnjx4/Hhx9+iJqaGvTs2RM7d+5ESUkJnnnmGbPruLNOT2aaU8blMIiIiJzHrk9Z0yKprRGJRPD397dY08teCQkJePfdd/HBBx/g/fffh5+fH6ZPn45HHnnEouzzzz+PiIgI7Nq1Cw0NDYiNjcVbb71l0fPn7jo9kcFggPryiv7efpzkT0RE5Cwig8FgaOubrd1mCTD2go0dOxbz589H165d23rJTis3NxcLFizA2rVrXbokhlqhxWcPfg8A6NEvBLf+3fO3hXI3dz9S3dmwvV2L7e1abG/Xcnd727Uh+ZQpUzBw4EAYDAYEBARg8ODBmDBhAgYPHozAwEAYDAYMGjQII0aMgLe3N7Zu3YoFCxaYPVlJno2r+RMREbmGXZ+y9957LxYuXIh58+bhvvvug4+Pj3BOpVLhiy++wFdffYWVK1fihhtuwPr16/HRRx/hs88+w1NPPWX3zZPzqRuvbEbO4UsiIiLnsaunbPXq1UhKSsIDDzxgFsgA48Kp999/P5KSkvDBBx9ALBZj7ty56Nu3Lw4ePGjXTZPrqLgZORERkUvYFcr++OOP685v6tOnD44fPy68TkpKQlUV905sLzh8SURE5Bp2hTK9Xo+LFy+2WubChQto/iyBRCJpdXsh8izsKSMiInINu0LZgAEDsG/fPuzevbvF83v27MFPP/2E/v37C8cuXLggbD9Eno9zyoiIiFzDrvGoRx99FAsXLsRrr72GL774AgMGDECXLl1QXV2NP/74A2fOnIGPjw8effRRAEBtbS0OHz6M6dOnO+TmyfnYU0ZEROQadoWyuLg4rFixAv/6179w4sQJnDlzxuz8gAED8PjjjyMuLg6Acduhb775xuKhAPJcZnPK/DinjIiIyFns/pSNj4/HihUrUFpaijNnzgibdMfHxwt7QJpIJBIEBATYe0lyoebDl+wpIyIich6HdX1ERERYhDBq/1RmT18ylBERETmLw0JZeXm5RU9ZWFiYo6onN1E3cviSiIjIFez+lL1w4QLeffdd/P777xbnbrrpJjz11FOIjIy09zLkJqrLw5cSLzGk3hI33w0REVHHZVcoKy0txaJFi1BdXY0bbrgBgwYNQkhICKqqqnDs2DEcOXIEixYtwpo1azi02U6Zeso4n4yIiMi57Apl69atQ3V1NZ566imkpqZCJBKZnd+6dSveffddfPrpp1iyZIldN0ruYXr6kqv5ExEROZddn7SHDh3CqFGjcMcdd7R4/o477sDBgwfx66+/2nMZchO9Vg+NUgeAk/yJiIicza4V/WtqahAbG9tqmdjYWNTU1NhzGXITdVOz5TC4mj8REZFT2RXK5HI5CgoKWi1TUFAAuVxuz2XITZqv5s+eMiIiIueyK5QNHToUBw4cwH//+98Wz3/77bf45ZdfMGzYMHsuQ27SfDV/GZfDICIiciq7Pmnvv/9+/PLLL1i2bBm+/PJLDB48GF27dhWeviwoKEBwcDDmz5/voNslV2JPGRERkevYFcoiIiKwcuVKLFu2DFlZWRZDmTfeeCP++te/cjmMdqr5nDKGMiIiIueye0wqKioK6enpVu19Se1L854yGZfEICIicirufUnXZL7FEnvKiIiInMmmUPbmm2+2+ULPPvtsm99L7mHaYgngiv5ERETOZlMo27FjR5suIhKJGMraoeZPX3JFfyIiIuey6ZN206ZNzroP8kDmc8rYU0ZERORMNoWybt26Oes+yAOpmw1fck4ZERGRc9m1eCx1bMJEfxHg7cvhSyIiImdiKKNrUl2eU+btK4VILHLz3RAREXVsDGV0TaaeMi4cS0RE5HwMZdQig8EA1eUV/TnJn4iIyPkYyqhFWpUOBp0BAODNzciJiIicjqGMWqTmchhEREQuxVBGLVJxM3IiIiKXYiijFrGnjIiIyLUYyqhFKrPNyDmnjIiIyNkYyqhFam5GTkRE5FIe1wWSn5+PTz75BLm5uaiqqoKPjw+io6Nx7733YvTo0WZlv/76a2zZsgXFxcUIDg7GhAkT8OCDD8LX11coU1xcjNmzZ7d4rZdeegkTJ040O1ZQUIAVK1bgxIkTkEqlGDlyJBYtWgS5XG5WTq/XY+PGjfjmm29QVVWFyMhIzJkzB5MmTbK4jrV1ehJVE3vKiIiIXMnjPm1LSkrQ1NSEqVOnIjQ0FEqlEvv27cNzzz2Hp59+GqmpqQCA1atXY8OGDUhJScGsWbNQUFCAr7/+Gvn5+XjnnXcs6p00aRJGjBhhdqxfv35mr8vKypCWloaAgAAsWLAACoUCGzduxLlz57BmzRp4eV3pMVq7di0+//xz3H777ejbty/279+PV199FSKRyCzo2VKnJ+GcMiIiItfyuFA2cuRIjBw50uzYXXfdhQULFmDz5s1ITU1FRUUFNm/ejClTpuDvf/+7UC4yMhLp6ek4cOCARa9a7969MXny5FavvX79eiiVSmRkZCAiIgIAkJiYiKeeego7duwQAmF5eTk2bdqEGTNm4MknnwQA3HbbbUhLS8OqVauQkpICiURiU52eRs2nL4mIiFyqXcwpk0gkCA8PR0NDAwAgOzsbOp0OEyZMMCtn6qHavXt3i/UoFApoNJoWzwHAvn37MGrUKCE8AcCQIUMQFRWFPXv2CMf2798PrVaLGTNmCMdEIhHuvPNOlJeXIzs72+Y6PY3ZRH+GMiIiIqfzuJ4yE4VCAZVKhcbGRhw4cAC//vorxo8fDwBCsJLJZGbv8fHxAQCcPn3aor5169Zh9erVEIlESEhIwEMPPYRhw4YJ58vLy1FdXY2EhASL9yYmJuLgwYPC67y8PPj6+iI6OtqinOn8wIEDbarzahUVFaisrBReFxYWXrOsM5gNX3JOGRERkdN57KftypUrkZmZCQAQi8UYO3asMFQYFRUFADhx4gRuuukm4T3Hjx8HYAxYJmKxGEOHDsXYsWMRGhqKS5cuYfPmzViyZAneeOMNYajUFIBCQkIs7iUkJAR1dXVQq9Xw9vZGZWUlunTpApFIZFEOMAYqW+u8WmZmJtatW2dxPD8/HzqdzuJ4axoaGpCTk2PTe6rLa4XvzxWdhbhY1Eppaq4t7U1tx/Z2Lba3a7G9XctZ7Z2UlGRVOY8NZbNmzUJKSgoqKiqwZ88e6HQ6oYcsISEBSUlJ+OKLLxAWFoYbb7wRhYWFePfddyGVSqFWq4V6IiIiLCb+T5kyBXPnzsXKlSuFUKZSqQCgxYn3ptCkUqng7e0NlUp13XK21nm11NRUs3lxhYWFWLp0KWJiYlrseWtNTk6O1b8QJqdQBUAFiZcY/Qf2u255uqIt7U1tx/Z2Lba3a7G9Xcvd7e2xoSw6OloYHpw6dSqeeuopPPvss1izZg1EIhFee+01vPzyy3jzzTcBGOed3XPPPcjKykJRUVGrdQcFBWHatGn4/PPPUVZWhvDwcGEotKU5Z6aQZyojk8msLmdtnVcLDQ1FaGhoqz+HM5nmlHE+GRERkWt4bCi7WkpKCpYtW4aioiLccMMNCAsLw8qVK1FUVCSsExYSEoIZM2YgMjLyuvWFh4cDAOrr6xEeHi4MMTafx2VSWVmJoKAgoUcrJCQER48ehcFgMBvCNL3XFKZsqdPTqC+vU8Y1yoiIiFyjXTx9CVwZCjQ9gWkSFRWFQYMGISQkBAUFBaisrMSQIUOuW9+lS5cAAMHBwQCAsLAwyOVy5ObmWpQ9efIk4uPjhdfx8fFQKpUWk+9N49CmsrbU6Un0Oj00CuO8Na5RRkRE5BoeF8qqq6stjmm1WuzatQsymQy9evVq8X16vR6rV6+Gj48P7rjjDuF4TU2NRdny8nJs374dcXFxZkOE48aNwy+//ILS0lLh2JEjR1BUVCQ8+QkAycnJkEql2LJli3DMYDBg69atCAsLQ//+/W2u05OYrVHmx1BGRETkCh43NrVs2TI0NjZi0KBBCAsLQ2VlJb7//nucP38eCxcuhJ+fHwAgPT0darUavXv3hlarxQ8//ICTJ0/i+eefN1sTbPXq1bh48SJuvvlmhIaGoqSkBJmZmVAqlVi8eLHZtefMmYO9e/fiiSeewMyZM6FQKLBhwwbExsZi2rRpQrnw8HDMmjULGzZsgFarRWJiIn7++WccP34cL774orBwrC11ehKV2Wr+HvcrQkRE1CF53CfuhAkT8O2332Lr1q2ora2Fn58fEhIS8OijjyI5OVko16dPH3z55Zf44YcfIBKJkJiYiPfee89siQwAGDp0KC5duoQtW7agvr4eAQEBGDhwIObOnWvxFGNERASWL1+OFStWYM2aNcI+lQsXLrSY+/XII48gMDAQmZmZ2LlzJyIjI/HCCy/glltuaXOdnoKr+RMREbmex4WyiRMnWmwS3pJp06ZZ1dM0adKkFjcJv5aYmJgW9868mlgsxpw5czBnzhyH1ekpVNz3koiIyOU8bk4ZuV/z1fz59CUREZFrMJSRBTV7yoiIiFyOoYwsqDinjIiIyOUYysgChy+JiIhcj6GMLHCiPxERkesxlJEFdSMXjyUiInI1hjKyYNr3EmBPGRERkaswlJGF5sOXXpxTRkRE5BIMZWTBtKK/t58UYrHIzXdDRETUOTCUkQVTTxnnkxEREbkOQxmZMRgMwpIY3IyciIjIdRjKyIxWpYNeZwDAhWOJiIhciaGMzKi5mj8REZFbMJSRGbPlMPjkJRERkcswlJEZVUOzLZbYU0ZEROQyDGVkpvnwpYxPXxIREbkMQxmZab5wLHvKiIiIXIehjMw0n1PmzSUxiIiIXIahjMw07ynjvpdERESuw1BGZtSNzZbE4JwyIiIil2EoIzPmPWUcviQiInIVhjIyw8VjiYiI3IOhjMxwThkREZF7MJSRGdPTl2KpCBIv/noQERG5Cj91yYz6ck+ZzN8LIpHIzXdDRETUeTCUkRnV5acv+eQlERGRazGUkUCvN0CjMIYyzicjIiJyLYYyEnA1fyIiIvdhKCOBuvm+lxy+JCIicimGMhI0X82fw5dERESuxVBGApVZTxmHL4mIiFyJoYwEzeeUsaeMiIjItRjKSKBq5BZLRERE7sJQRgI1NyMnIiJyG4YyEqj49CUREZHbMJSRQN3Epy+JiIjcxePGqPLz8/HJJ58gNzcXVVVV8PHxQXR0NO69916MHj3arOzXX3+NLVu2oLi4GMHBwZgwYQIefPBB+Pr6mpXT6/XYuHEjvvnmG1RVVSEyMhJz5szBpEmTLK5fUFCAFStW4MSJE5BKpRg5ciQWLVoEuVzu9DrdzaynjMOXRERELuVxn7wlJSVoamrC1KlTERoaCqVSiX379uG5557D008/jdTUVADA6tWrsWHDBqSkpGDWrFkoKCjA119/jfz8fLzzzjtmda5duxaff/45br/9dvTt2xf79+/Hq6++CpFIhIkTJwrlysrKkJaWhoCAACxYsAAKhQIbN27EuXPnsGbNGnh5eTm1TnczX9Hfc+6LiIioM/C4UDZy5EiMHDnS7Nhdd92FBQsWYPPmzUhNTUVFRQU2b96MKVOm4O9//7tQLjIyEunp6Thw4IDQq1ZeXo5NmzZhxowZePLJJwEAt912G9LS0rBq1SqkpKRAIpEAANavXw+lUomMjAxEREQAABITE/HUU09hx44dQiB0Rp2egHPKiIiI3KddzCmTSCQIDw9HQ0MDACA7Oxs6nQ4TJkwwK2fqodq9e7dwbP/+/dBqtZgxY4ZwTCQS4c4770R5eTmys7OF4/v27cOoUaOE8AQAQ4YMQVRUFPbs2ePUOj2BaUV/L18pxGKRm++GiIioc/G4njIThUIBlUqFxsZGHDhwAL/++ivGjx8PANBojD06MpnM7D0+Pj4AgNOnTwvH8vLy4Ovri+joaLOyiYmJwvmBAweivLwc1dXVSEhIsLiXxMREHDx40Kl1Xq2iogKVlZXC68LCwmuWdRRTTxmXwyAiInI9j/30XblyJTIzMwEAYrEYY8eOFYYKo6KiAAAnTpzATTfdJLzn+PHjAIzDiyaVlZXo0qULRCLznp+QkBAAxvBjKtf8+NVl6+rqoFar4e3t7ZQ6r5aZmYl169ZZHM/Pz4dOp7M43pqGhgbk5OS0WsZgMEDVqAYA6CW665ana7Omvclx2N6uxfZ2Lba3azmrvZOSkqwq57GhbNasWUhJSUFFRQX27NkDnU4n9JAlJCQgKSkJX3zxBcLCwnDjjTeisLAQ7777LqRSKdRqtVCPSqVqcTK9KQipVCqzr9cr6+3t7ZQ6r5aammr2tGlhYSGWLl2KmJiYFnveWpOTk3PdXwitSof/6c4DAIK6Blr9C0SWrGlvchy2t2uxvV2L7e1a7m5vjw1l0dHRwvDg1KlT8dRTT+HZZ5/FmjVrIBKJ8Nprr+Hll1/Gm2++CcA47+yee+5BVlYWioqKhHpkMpkQ5pozBTfTEKjpq7VlHV3n1UJDQxEaGtriOWdQcd9LIiIit/LYUHa1lJQULFu2DEVFRbjhhhsQFhaGlStXoqioSFgnLCQkBDNmzEBkZKTwvpCQEBw9ehQGg8FsuNE0tGgKPqYhxubzuJqXDQoKEnq0nFGnu6nNnrxsN78WREREHUa7ePoSuDIUaHoC0yQqKgqDBg1CSEgICgoKUFlZiSFDhgjn4+PjoVQqLSbKm8aM4+PjAQBhYWGQy+XIzc21uPbJkyeFcs6q092ab0bOnjIiIiLX87hQVl1dbXFMq9Vi165dkMlk6NWrV4vv0+v1WL16NXx8fHDHHXcIx5OTkyGVSrFlyxbhmMFgwNatWxEWFob+/fsLx8eNG4dffvkFpaWlwrEjR46gqKhIePLTWXW6m/nCsewpIyIicjWP+/RdtmwZGhsbMWjQIISFhaGyshLff/89zp8/j4ULF8LPzw8AkJ6eDrVajd69e0Or1eKHH37AyZMn8fzzz5utCRYeHo5Zs2Zhw4YN0Gq1SExMxM8//4zjx4/jxRdfFBZ5BYA5c+Zg7969eOKJJzBz5kwoFAps2LABsbGxmDZtmlPrdLfmC8eyp4yIiMj1PC6UTZgwAd9++y22bt2K2tpa+Pn5ISEhAY8++iiSk5OFcn369MGXX36JH374ASKRCImJiXjvvffMlsgweeSRRxAYGIjMzEzs3LkTkZGReOGFF3DLLbeYlYuIiMDy5cuxYsUKrFmzRtincuHChRZzv5xRpzupmw1fcjV/IiIi1/O4UDZx4kSzvSOvZdq0aVb3NInFYsyZMwdz5sy5btmYmBiLvTNdVac7qdlTRkRE5FYeN6eM3KP5khh8+pKIiMj1GMoIwFU9ZQHsKSMiInI1hjICAKiaOKeMiIjInRjKCAAXjyUiInI3hjICcCWUiSUiSGWS65QmIiIiR2MoIwBXVvT39vcy2zqKiIiIXIOhjABcWdGfy2EQERG5B0MZQa83QH15oj/nkxEREbkHQxlB08TNyImIiNyNoYzM9r3kchhERETuwVBGwnwyAPD25/AlERGROzCUkVlPGYcviYiI3IOhjIRJ/oBxSQwiIiJyPYYyMu8p49OXREREbsFQRuZbLLGnjIiIyC0YykhYzR9gKCMiInIXhjIye/qSE/2JiIjcg6GMzIcvOaeMiIjILRjKyGz4kj1lRERE7sFQRuwpIyIi8gAMZQTV5TllXr4SiCX8lSAiInIHfgKT0FPGfS+JiIjch6GMhBX9OZ+MiIjIfRjKOjmtWgedRg+A88mIiIjciaGsk1NzM3IiIiKPwFDWyam4GTkREZFHYCjr5NhTRkRE5BkYyjo5rlFGRETkGRjKOjmVWShjTxkREZG7MJR1cuombrFERETkCRjKOjmznjJ/Dl8SERG5Cz+FO7n45B4IjQmGukmD0Nhgd98OERFRp8VQ1skFhvkhMMzP3bdBRETU6XH4koiIiMgDMJQREREReQCPG77Mz8/HJ598gtzcXFRVVcHHxwfR0dG49957MXr0aLOyP/74IzZv3ozz589DLBYjJiYG9913H0aOHCmUKS4uxuzZs1u81ksvvYSJEyeaHSsoKMCKFStw4sQJSKVSjBw5EosWLYJcLjcrp9frsXHjRnzzzTeoqqpCZGQk5syZg0mTJllcx9o6iYiIqPPyuFBWUlKCpqYmTJ06FaGhoVAqldi3bx+ee+45PP3000hNTQUAfP3110hPT8fIkSPxyCOPQKVSYefOnXjmmWfw2muvYdy4cWb1Tpo0CSNGjDA71q9fP7PXZWVlSEtLQ0BAABYsWACFQoGNGzfi3LlzWLNmDby8riwZsXbtWnz++ee4/fbb0bdvX+zfvx+vvvoqRCKRWdCzpU4iIiLqvDwulI0cOdKspwsA7rrrLixYsACbN282C2V9+/bFm2++CZFIBACYPn067rrrLuzcudMilPXu3RuTJ09u9drr16+HUqlERkYGIiIiAACJiYl46qmnsGPHDuHa5eXl2LRpE2bMmIEnn3wSAHDbbbchLS0Nq1atQkpKCiQSiU11EhERUefWLuaUSSQShIeHo6GhQTjW1NSELl26CIEMAPz9/eHr6wuZTNZiPQqFAhqNpsVzALBv3z6MGjVKCE8AMGTIEERFRWHPnj3Csf3790Or1WLGjBnCMZFIhDvvvBPl5eXIzs62uU4iIiLq3Dyup8xEoVBApVKhsbERBw4cwK+//orx48cL5wcPHox9+/bh66+/xqhRo6BWq/H111+jsbERM2fOtKhv3bp1WL16NUQiERISEvDQQw9h2LBhwvny8nJUV1cjISHB4r2JiYk4ePCg8DovLw++vr6Ijo62KGc6P3DgQJvqvFpFRQUqKyuF14WFhdcsS0RERO2fx4aylStXIjMzEwAgFosxduxYYagQAB5//HHU1tYiPT0d6enpAIDg4GC899576N+/v1BOLBZj6NChGDt2LEJDQ3Hp0iVs3rwZS5YswRtvvCEMlZoCUEhIiMW9hISEoK6uDmq1Gt7e3qisrLTopWv+3oqKCpvrvFpmZibWrVtncTw/Px86ne4ardayhoYG5OTk2PQeaju2t2uxvV2L7e1abG/XclZ7JyUlWVXOY0PZrFmzkJKSgoqKCuzZswc6nc5s6FEmkyEqKgphYWEYNWoUmpqasHnzZrzwwgtYsWIFIiMjAQARERF45513zOqeMmUK5s6di5UrVwqhTKVSAUCLE+9NoUmlUsHb2xsqleq65Wyt82qpqalmT5sWFhZi6dKliImJabHnrTU5OTlW/0KQ/djersX2di22t2uxvV3L3e3tsXPKoqOjMWTIEEydOhVvvfUWFAoFnn32WRgMBgDG5SzKysrw/PPPIyUlBbfeeiuWL18OrVaLtWvXtlp3UFAQpk2bhvPnz6OsrAwAhHloLc05U6vVZmVkMpnV5ayt82qhoaFISEgQ/lw9VEpEREQdi8eGsqulpKTg1KlTKCoqwqVLl/Drr79arFsWFBSEAQMG4I8//rhufeHh4QCA+vp6AFeGGJvP4zKprKxEUFCQ0KMVEhKCqqoqISA2LwcYA5WtdRIREVHn1m5CmWkosKGhAVVVVQCMC7heTavVWjXn6tKlSwCM89AAICwsDHK5HLm5uRZlT548ifj4eOF1fHw8lEqlxeR70zi0qawtdRIREVHn5nGhrLq62uKYVqvFrl27IJPJ0KtXL0RGRkIsFuPHH380660qKyvD8ePH0bt3b+FYTU2NRX3l5eXYvn074uLihF4tABg3bhx++eUXlJaWCseOHDmCoqIisyc/k5OTIZVKsWXLFuGYwWDA1q1bERYWZvaggbV1EhERUefmcRP9ly1bhsbGRgwaNAhhYWGorKzE999/j/Pnz2PhwoXw8/ODn58fbr31Vvz3v//FE088gbFjx0KhUGDLli1Qq9X485//LNS3evVqXLx4ETfffDNCQ0NRUlKCzMxMKJVKLF682Ozac+bMwd69e/HEE09g5syZUCgU2LBhA2JjYzFt2jShXHh4OGbNmoUNGzZAq9UiMTERP//8M44fP44XX3xRWDjWljqvx9RT2JalMc6fP292T+RcbG/XYnu7FtvbtdjeruXM9o6OjoaPj0+rZUSGqydGudnu3bvx7bff4ty5c6itrYWfnx8SEhJw1113ITk5WSin1WqxdetWbN++HRcuXAAA9O3bF/PmzcNNN90klPvhhx+wdetWFBYWor6+HgEBARg4cCDmzp3b4lOM+fn5FvtULly4EF27djUrp9fr8cUXXyAzMxOVlZWIjIzEn//85xZ3DbC2ztZ89913WLp0qdXliYiIyHOsXbv2uqsneFwoo5bV1NTg0KFD6N69u00PB5iW0njhhRf4BKcLsL1di+3tWmxv12J7u5az29uanjKPG76klsnl8uvu3dma6Ohom9c3o7Zje7sW29u12N6uxfZ2LXe2t8dN9CciIiLqjBjKiIiIiDwAQ1kHFxISgvnz57e4/yY5HtvbtdjersX2di22t2t5Qntzoj8RERGRB2BPGREREZEHYCgjIiIi8gAMZUREREQegKGMiIiIyANw8dgOSq1W46OPPsJ3332H+vp6xMXF4aGHHsLQoUPdfWvtWlNTEzZu3IicnBycPHkS9fX1eO6551rcx7SgoMBie61FixZBLpe7/sbboZMnT2Lnzp04evQoSkpKEBQUhH79+uGhhx5CVFSUWVm2tWPk5+fjk08+QW5uLqqqquDj44Po6Gjce++9GD16tFlZtrnjffbZZ8jIyEBMTAw+/fRTs3MnTpzABx98gNOnT8Pf3x/jx4/HggUL4Ofn56a7bX+OHj2Kxx9/vMVzq1evRr9+/YTX7mpvhrIO6o033sDevXsxa9YsREZGYseOHViyZAnS09MxcOBAd99eu1VbW4t169YhIiIC8fHxOHr0aIvlysrKkJaWhoCAACxYsAAKhQIbN27EuXPnsGbNGnh5ebn4ztufL774AidOnMD48eMRFxeHyspKbNmyBQ899BBWr16N2NhYAGxrRyopKUFTUxOmTp2K0NBQKJVK7Nu3D8899xyefvpppKamAmCbO0NZWRnWr18PX19fi3N5eXl48sknER0djUWLFqGsrAybNm3ChQsX8M9//tMNd9u+3X333UhMTDQ71rNnT+F7t7a3gTqc7Oxsw5gxYwxffPGFcEypVBr+9Kc/GR599FE33ln7p1KpDBUVFQaDwWA4efKkYcyYMYbt27dblHvnnXcMkyZNMpSUlAjHfvvtN8OYMWMMW7duddn9tmfHjx83qNVqs2Pnz583TJw40fDqq68Kx9jWzqXVag3333+/4c9//rNwjG3ueC+99JLh8ccfN6SlpRnmzp1rdu7pp5823HnnnYaGhgbh2LZt2wxjxowx/Prrr66+1Xbr999/N4wZM8awZ8+eVsu5s705p6wD2rdvHyQSifD/agFAJpNh+vTpyM7ORmlpqRvvrn3z9va2amHBffv2YdSoUYiIiBCODRkyBFFRUdizZ48zb7HDGDBggEWPS1RUFHr16oXCwkLhGNvauSQSCcLDw9HQ0CAcY5s7VlZWFvbt24e0tDSLc42NjTh8+DAmT54Mf39/4fiUKVPg6+vL9m6jpqYmaLVai+Pubm8OX3ZAeXl5iIyMNPuFAiB01545c8bsH1NyrPLyclRXV7e4oW1iYiIOHjzohrvqGAwGA6qrq9GrVy8AbGtnUSgUUKlUaGxsxIEDB/Drr79i/PjxANjmjqbT6ZCeno7p06cjLi7O4vy5c+eg0+ks2tvLywu9e/dGXl6eq261w3jjjTegUCggkUgwcOBAPPbYY+jbty8A97c3Q1kHVFlZ2WJvjulYRUWFq2+pU6msrASAa/4d1NXVQa1Ww9vb29W31u59//33KC8vxwMPPACAbe0sK1euRGZmJgBALBZj7NixePLJJwGwzR1t69atKC0txXvvvdfi+eu197Fjx5x6fx2JVCrFuHHjMGLECAQHB6OgoACbNm3CokWLsGrVKvTp08ft7c1Q1gGpVKoWJ9qa/pFUqVSuvqVOxdS+1/s74IeWbQoLC/Hee++hX79+mDp1KgC2tbPMmjULKSkpqKiowJ49e6DT6aDRaACwzR2ptrYWH3/8MebOnXvNp1av195qtdqZt9ihDBgwAAMGDBBeJycnIyUlBffffz8+/PBDLFu2zO3tzTllHZBMJhP+AW3O9Mskk8lcfUudiql9+XfgOJWVlXjmmWfg7++P1157DRKJBADb2lmio6MxZMgQTJ06FW+99RYUCgWeffZZGAwGtrkDZWRkIDAwEHffffc1y1yvvRl+7RMZGYnk5GQcPXoUOp3O7e3NUNYBhYSECF2wzZmOhYaGuvqWOhVTt/e1/g6CgoL4D6kNGhoasGTJEjQ0NGDZsmVmv79sa9dISUnBqVOnUFRUxDZ3kKKiImzbtg0zZ85ERUUFiouLUVxcDLVaDa1Wi+LiYtTV1V23vfnvuf3Cw8Oh0WigVCrd3t4MZR1QfHw8Lly4gMbGRrPjOTk5wnlynrCwMMjlcuTm5lqcO3nyJNvfBiqVCs8++yyKiorw5ptvChP8TdjWrmEa0mloaGCbO0hFRQX0ej3S09Mxe/Zs4U9OTg6Kioowe/ZsrFu3DjExMZBIJBbtrdFokJeXx/Z2gEuXLsHb2xu+vr5ub2+Gsg4oJSUFOp1OmKgLGLtdt2/fjqSkJD556QLjxo3DL7/8Yrb8yJEjR1BUVCQ8xUat0+l0ePnll5GdnY1XXnkF/fv3b7Ec29pxqqurLY5ptVrs2rULMplMCMVsc/vFxMTg9ddft/gTExODiIgIvP7665g+fToCAgIwZMgQfPfdd2hqahLev2vXLigUCra3DWpqaiyOnTlzBgcOHMDQoUMhFovd3t4ig8FgcOoVyC1eeukl/PTTT7jnnnvQs2dP7Ny5EydPnsR7772HwYMHu/v22rWvv/4aDQ0NqKysxDfffIOxY8eid+/eAIwrRQcEBKC0tBQPPfQQAgICMHPmTCgUCmzYsAFhYWH48MMPObxjheXLl+Orr77CqFGjMGHCBIvzkydPBgC2tQP9/e9/R2NjIwYNGoSwsDBUVlbi+++/x/nz57Fw4ULMnj0bANvcmRYvXoza2lqzbZZyc3OxcOFCREdHIzU1VVhhftCgQXjnnXfceLfty+OPPw6ZTIb+/fujS5cuKCgowLZt2yCVSrFq1Srh/3S4s70ZyjoolUol7H3Z0NCA2NhYPPTQQxg2bJi7b63du+eee1BSUtLiuU2bNqF79+4AjPsIXr034MKFC9G1a1dX3m67tXjxYmRlZV3z/E8//SR8z7Z2jN27d+Pbb7/FuXPnUFtbCz8/PyQkJOCuu+5CcnKyWVm2uXO0FMoA4Pjx48JejH5+fhg/fjweeeQR7n1pg6+++grff/89Ll68iMbGRsjlctx8882YP38+IiMjzcq6q70ZyoiIiIg8AOeUEREREXkAhjIiIiIiD8BQRkREROQBGMqIiIiIPABDGREREZEHYCgjIiIi8gAMZUREREQegKGMiIiIyAMwlBERERF5AIYyIuo0iouLMXbsWPzf//2fu2/FIXbs2IGxY8dix44d7r4VInIAhjIi6tQWL16MsWPHuvs2WtTRQiQRtU7q7hsgInKVsLAw/Pvf/4a/v7+7b8UhxowZg6SkJISEhLj7VojIARjKiKjTkEqliI6OdvdtOExAQAACAgLcfRtE5CAig8FgcPdNEBG5QnFxMWbPno2pU6fi+eefv+awpem8ydmzZ/Hvf/8bWVlZqKurQ0hICEaPHo37778fwcHBLdZ/3333Ye3atTh27Bjq6uqwadMmdO/eHT/99BP27NmDU6dOoaKiAlKpFHFxcZg5cyZSUlKEunbs2IE33nijxftLT0/HjTfeKJR57rnnMG3aNLMyJ06cwL///W9kZ2dDpVKhW7dumDBhAu677z74+PiYlR07diwGDx6Ml19+GatXr8bBgwehUCgQHx+PRx55BDfeeKOtTU1EbcCeMiLqtObPn4+dO3eipKQE8+fPF4737t1b+H7//v14+eWXIRKJkJycjPDwcBQUFOA///kPDh06hDVr1iAwMNCs3osXL+Kxxx5DbGwspk6dirq6Onh5eQEAPvzwQ0ilUgwYMAAhISGoqanBgQMH8I9//AOPP/447r77bgBAfHw8Zs6cia+++grx8fFITk4W6u/WrVurP9eePXvw6quvwsvLCxMmTIBcLsdvv/2GdevW4dChQ0hPT4dMJjN7T0NDAxYuXIiAgABMnjwZ1dXV2LNnD55++mmsXbsWsbGxbWpjIrIeQxkRdVoPPPAAsrKyUFJSggceeMDifG1tLV5//XUEBwdj5cqVZmFo9+7deOWVV/DRRx/hiSeeMHvfiRMnMH/+/BbrfPvtt9GjRw+zY01NTfh//+//4aOPPsL06dPh4+OD3r17IyAgQAhlLdXVksbGRvzzn/+ERCLB6tWrERcXBwB4+OGH8eqrr+LHH3/Exo0bMW/ePLP3nTlzBnfeeSeeeOIJiMXGZ8BuuukmvP322/jPf/6Dp59+2qrrE1Hb8elLIqJr2LVrFxobG/Hwww9b9E5NnDgRffr0we7duy3e17VrV/zlL39psc6rAxkA+Pn5Ydq0aWhoaMCpU6fsuuf9+/ejoaEBt956qxDIAEAsFuOxxx6DRCJpcQkNX19fPProo0IgA4zDuBKJxO57IiLrsKeMiOgasrOzAQA5OTm4ePGixXm1Wo3a2lrU1NRALpcLx+Pj44XhyqtVV1fj888/x8GDB1FaWgqVSmV2vqKiwq57zsvLAwAMHjzY4lxERAR69OiBoqIiNDU1wc/PTzgXGRlp9howPhjRtWtXNDQ02HVPRGQdhjIiomuor68HAGzZsqXVckql0ux1ly5dWixXV1eHhx9+GKWlpRgwYACGDBmCgIAAiMVinDlzBvv374dGo7HrnhsbGwEYe+taEhISgqKiIjQ2NpqFsGstEyKRSKDX6+26JyKyDkMZEdE1mELLunXrbJroLhKJWjz+7bfforS0FA8++KDFnK7169dj//79bb/Zy0zhqqqqqsXzpuMdZa02oo6Ec8qIqFMzzaHS6XQW55KSkgBcGca0l2kItPmTlCbHjx+/5r3Z0lNlenI0KyvL4lxpaSkuXryIHj16WAxVEpH7MZQRUacWFBQEACgrK7M4d+utt8LPzw9r165Ffn6+xXmlUmlTYDM9LHDixAmz499//z0OHjxoUT4wMBAikajFe7uW5ORkBAQEYPv27Wb3bDAYsGbNGuh0Oos1zYjIM3D4kog6tZtuugl79+7Fiy++iOHDh8Pb2xvx8fEYPXo05HI5XnrpJfzjH//AAw88gGHDhuGGG26ARqNBSUkJsrKy0L9/fyxbtsyqa02ePBlffPEF0tPTcfToUURERODMmTP4/fffMXbsWPz0009m5f38/NC3b18cO3YMS5cuRWRkJEQiEaZMmXLNtcr8/f3xt7/9Da+++ioeffRRjB8/HnK5HEeOHEFubi4SExPxpz/9ye52IyLHYygjok7ttttuQ3FxMX788Ud88cUX0Ol0mDp1KkaPHg0AGDlyJD766CNs2LABR44cweHDh+Hj44OwsDBMmzYNkydPtvpa4eHhWL58OVavXo3Dhw9Dp9OhT58+eOedd1BWVmYRygDghRdewPvvv49ffvkFjY2NMBgMGDhwYKsLyI4fPx5du3bF+vXr8dNPPwkr+s+bNw/33XefxcKxROQZuM0SERERkQfgnDIiIiIiD8BQRkREROQBGMqIiIiIPABDGREREZEHYCgjIiIi8gAMZUREREQegKGMiIiIyAMwlBERERF5AIYyIiIiIg/AUEZERETkARjKiIiIiDwAQxkRERGRB/j/L4ecM76I4oMAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, y = [], []\n", + "\n", + "for result in all_results:\n", + " x.append(result['iteration'])\n", + " y.append(result['loglikelihood'])\n", + " \n", + "plt.plot(x, y)\n", + "plt.grid()\n", + "plt.xlabel(\"iteration\")\n", + "plt.ylabel(\"loglikelihood\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "3f085706", + "metadata": {}, + "source": [ + "## Alpha (the factor used for the acceleration)\n", + "\n", + "Plotting $\\alpha$ vs the number of iterations. $\\alpha$ is a parameter to accelerate the EM algorithm (see the beginning of Section 4). If it is too large, reconstructed images may have artifacts." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "1695af05", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jJtvvhmlpaW46qqrMDAwgP/8z//E+PHj8dRTT8kQgUE88sgjePnll3HhhRdi6dKlSd9feumlACD7mxH+1//6X+jr68NZZ52F8ePHo62tDe+88w6OHDmCO+64A9dccw0A2d88cdddd6GrqytuK4y6ujrccccdqK6uxvLly6OVic866yz88pe/dFBad2HVqlUoLCzEGWecgXHjxuHw4cN44403kJeXh8ceeyyq4DvZ31IBYoBAIBDdC6y3txfTp0/HzTffjPPOO89p0VyPb37zm2hqakr53YYNGzBx4kQA4X2VEvdKuuOOO1BeXk4prqtx1113YceOHWm/37JlS/Sz7G/7ePfdd/GHP/wBhw4dQldXF4qLi1FbW4srrrgCF110Udy5sr/5IJUCBABffPFFdG+q4uJiLFmyBN///vflXmAm8PLLL+Odd97BsWPH0NfXh7KyMnz5y1/GihUrMHny5LhznepvqQBJSEhISEhIjDhIDpCEhISEhITEiINUgCQkJCQkJCRGHKQCJCEhISEhITHiIBUgCQkJCQkJiREHqQBJSEhISEhIjDhIBUhCQkJCQkJixEEqQBISEhISEhIjDlIBkpCQkJCQkBhxkAqQhISEhISExIiDVIAkJCS44MSJE1i0aBH+9//+306LwgRvvfUWFi1ahLfeestpUSQkJBhAKkASEhJkuOuuu7Bo0SKnxUiJXFPYJCQkMiPPaQEkJCRyE+PHj8fzzz+PkpISp0VhgoULF8Ln86GiosJpUSQkJBhAKkASEhJckJeXh+rqaqfFYIbS0lKUlpY6LYaEhAQjyN3gJSQkuODEiRO45pprsGzZMqxduzZt6CvyfQQHDx7E888/jx07dqC7uxsVFRVYsGABbrzxRowdOzbl/a+77jo8/fTT+Pzzz9Hd3Y0NGzZg4sSJ2LJlCzZt2oS9e/eitbUVeXl5mDFjBq666iosXrw4eq+33noLDzzwQEr51q1bh3POOSd6zpo1a3DZZZfFnbNz5048//zz2L17NwKBAE477TQsXboU1113HYqKiuLOXbRoEc4++2z89Kc/xeOPP46PPvoIAwMDmDlzJr7//e/jnHPOMdvVEhISFiA9QBISEiRYsWIF3n77bTQ1NWHFihXR47NmzYp+fv/99/HTn/4UiqLgoosuQlVVFQ4fPoz/+q//wieffIInn3wSo0ePjrvvsWPHcNttt2H69OlYtmwZuru7kZ+fDwB46qmnkJeXh/nz56OiogKdnZ344IMP8OMf/xirVq3ClVdeCQCYOXMmrrrqKrz88suYOXMmLrroouj9TzvttIzPtWnTJtx7773Iz8/H0qVLUVZWhq1bt2L9+vX45JNPsG7dOhQWFsZd09vbizvuuAOlpaW49NJL0dHRgU2bNuHuu+/G008/jenTp1vqYwkJCeOQCpCEhAQJbrrpJuzYsQNNTU246aabkr7v6urC/fffj7Fjx+LRRx+NUzzeffdd/OxnP8Ovf/1r/OAHP4i7bufOnVixYkXKez744IOYNGlS3LH+/n7cfvvt+PWvf43LL78cRUVFmDVrFkpLS6MKUKp7pUJfXx9+8YtfwOv14vHHH8eMGTMAAN/73vdw77334i9/+QtefPFF3HDDDXHXHThwAP/4j/+IH/zgB/B4wrkoX/rSl/Dggw/iv/7rv3D33Xcbal9CQsI6ZBaYhISEEPjjH/+Ivr4+fO9730vyulxyySWYPXs23n333aTrysvL8Z3vfCflPROVHwAoLi7GZZddht7eXuzdu9eWzO+//z56e3vxta99Lar8AIDH48Ftt90Gr9ebMm1+1KhRuPXWW6PKDxAOBXq9XtsySUhIGIP0AElISAiB3bt3AwD8fj+OHTuW9P3Q0BC6urrQ2dmJsrKy6PGZM2dGQ16J6OjowH/8x3/go48+QnNzMwKBQNz3ra2ttmTev38/AODss89O+m7ChAmYNGkSGhsb0d/fj+Li4uh3kydPjvsbCJPGy8vL0dvba0smCQkJY5AKkISEhBDo6ekBALz66qsZzxscHIz7e9y4cSnP6+7uxve+9z00Nzdj/vz5+MpXvoLS0lJ4PB4cOHAA77//PoaHh23J3NfXByDshUqFiooKNDY2oq+vL07hSVcawOv1QlVVWzJJSEgYg1SAJCQkhEBEQVi/fr0pErCiKCmP/+EPf0BzczO++93vJnFwfve73+H999+3LuwpRBSZ9vb2lN9HjudKLSQJiVyC5ABJSEiQIcJ5CYVCSd/5fD4AsVCYXUTCaPqMrgi++OKLtLKZ8cBEMth27NiR9F1zczOOHTuGSZMmJYW7JCQknIdUgCQkJMgwZswYAEBLS0vSd1/72tdQXFyMp59+GvX19UnfDw4OmlKOIkTqnTt3xh1/55138NFHHyWdP3r0aCiKklK2dLjoootQWlqKN998M05mTdPw5JNPIhQKJdUMkpCQEAMyBCYhIUGGL33pS3jvvffwr//6rzj//PNRUFCAmTNnYsGCBSgrK8NPfvIT/PjHP8ZNN92E8847D1OnTsXw8DCampqwY8cOnHHGGXjooYcMtXXppZfihRdewLp167B9+3ZMmDABBw4cwGeffYZFixZhy5YtcecXFxdjzpw5+Pzzz3Hfffdh8uTJUBQFf/d3f5e2FlBJSQn+5//8n7j33ntx6623YsmSJSgrK8O2bdtQV1eHuXPn4tprr7XdbxISEuwhFSAJCQky/P3f/z1OnDiBv/zlL3jhhRcQCoWwbNkyLFiwAABwwQUX4Ne//jX+8z//E9u2bcOnn36KoqIijB8/HpdddhkuvfRSw21VVVXhkUceweOPP45PP/0UoVAIs2fPxi9/+Uu0tLQkKUAA8C//8i/493//d3z44Yfo6+uDpmk488wzMxZDXLJkCcrLy/G73/0OW7ZsiVaCvuGGG3DdddclFUGUkJAQA3IrDAkJCQkJCYkRB8kBkpCQkJCQkBhxkAqQhISEhISExIiDVIAkJCQkJCQkRhykAiQhISEhISEx4iAVIAkJCQkJCYkRB6kASUhISEhISIw4SAVIQkJCQkJCYsRBKkASEhISEhISIw5SAZKQkJCQkJAYcZAKkISEhISEhMSIg1SAJCQkJCQkJEYcpAIkISEhISEhMeLw/wEafYCr5WWvbwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, y = [], []\n", + "\n", + "for result in all_results:\n", + " x.append(result['iteration'])\n", + " y.append(result['alpha'])\n", + " \n", + "plt.plot(x, y)\n", + "plt.grid()\n", + "plt.xlabel(\"iteration\")\n", + "plt.ylabel(\"alpha\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b3298aa5", + "metadata": {}, + "source": [ + "## Background normalization\n", + "\n", + "Plotting the background nomalization factor vs the number of iterations. If the backgroud model is accurate and the image is reconstructed perfectly, this factor should be close to 1." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "71ad8d7a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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olAqkDQotquHQUREFFKcUyEiIiLygAETERERkQcMmIiIiIg8YMBERERE5AEDJiIiIiIPGDARERERecCAiYiIiMgDBkxEREREHjBgIiIiIvKAARMRERGRBwyYiIiIiDxgwERERETkAQMmIiIiIg/UXT2A3sBkMgEAioqKfH7v2bNnoVKpAj0k6gDvd2jxfocW73do8X6HVjDv94ABA6DX6zs9hgFTAJSVlQEAli1b1sUjISIiIl+9/fbbGDJkSKfHKARBEEI0nl6rrq4Ou3btQp8+faDVar1+X1FREZYtW4YnnngCAwYMCOIICeD9DjXe79Di/Q4t3u/QCvb9ZoYpRGJjYzF79my/3z9gwACPkS0FDu93aPF+hxbvd2jxfodWV95vFn0TERERecCAiYiIiMgDBkxdKCEhAYsWLUJCQkJXD+WiwPsdWrzfocX7HVq836HVHe43i76JiIiIPGCGiYiIiMgDBkxEREREHjBgIiIiIvKAARMRERGRB2xcGWJmsxnvvPMOvv/+ezQ2NmLQoEG44447MGHChK4eWo/X3NyMVatWIS8vD8eOHUNjYyOWLFmCefPmtTu2sLAQ//jHP3D48GGo1WpcdtlluP/++xEbGxv6gfdAx44dw7p167B//36UlZUhOjoaI0aMwB133IH09HTJsbzX8hUUFODdd9/FiRMnUFNTA71ejwEDBuB//ud/MHnyZMmxvN/B8f777+Nf//oXMjIy8N5770leO3z4MFasWIGTJ08iIiICM2fOxJ133onw8PAuGm3Psn//fjz44INuX3vjjTcwYsQI8XFX3msGTCH23HPPYdOmTfjlL3+Jfv36Ye3atXj00UexfPlyjB49uquH16PV19dj5cqVSElJQVZWFvbv3+/2uIqKCjzwwAOIjIzEnXfeiZaWFqxatQpnzpzBm2++CY1GE+KR9zwffvghDh8+jJkzZ2LQoEGorq7G559/jjvuuANvvPEGMjMzAfBeB0pZWRmam5sxd+5cJCYmwmg0YvPmzViyZAkeeeQRLFiwAADvd7BUVFTg3//+N8LCwtq9lp+fj9///vcYMGAA7r//flRUVGD16tU4d+4cXnrppS4Ybc91/fXXY9iwYZLn+vbtK37c5fdaoJA5evSoMHXqVOHDDz8UnzMajcJNN90k3HPPPV04st7BZDIJVVVVgiAIwrFjx4SpU6cK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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, y = [], []\n", + "\n", + "for result in all_results:\n", + " x.append(result['iteration'])\n", + " y.append(result['background_normalization'])\n", + " \n", + "plt.plot(x, y)\n", + "plt.grid()\n", + "plt.xlabel(\"iteration\")\n", + "plt.ylabel(\"background_normalization\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "58e0d3a6", + "metadata": {}, + "source": [ + "## The reconstructed images" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "94ab604d-12d9-4f81-b8d1-7dcbe793b6e8", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "def plot_reconstructed_image(result, source_position = None): # source_position should be (l,b) in degrees\n", + " iteration = result['iteration']\n", + " image = result['model_map']\n", + "\n", + " for energy_index in range(image.axes['Ei'].nbins):\n", + " map_healpxmap = HealpixMap(data = image[:,energy_index], unit = image.unit)\n", + "\n", + " _, ax = map_healpxmap.plot('mollview') \n", + " \n", + " _.colorbar.set_label(str(image.unit))\n", + " \n", + " if source_position is not None:\n", + " ax.scatter(source_position[0]*u.deg, source_position[1]*u.deg, transform=ax.get_transform('world'), color = 'red')\n", + "\n", + " plt.title(label = f\"iteration = {iteration}, energy_index = {energy_index} ({image.axes['Ei'].bounds[energy_index][0]}-{image.axes['Ei'].bounds[energy_index][1]})\")" + ] + }, + { + "cell_type": "markdown", + "id": "4b8cdf58", + "metadata": {}, + "source": [ + "Plotting the reconstructed images in all of the energy bands at the 50th iteration" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "2769b6e5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7MGqVavw6aeforS0FB9++CHy8vLwyiuvhKznjjvuwMiRI/Haa69pyfydd96JOJvZvn17qdcw2NVXX42JEycCANLS0jB27FicfPLJcDqdWLx4McaPH4/i4mJ8/vnnKCwsxNSpU01b3IqKijBixAisW7cOF154Ic4++2w0btwYmzdvxltvvYXt27dj27ZtGDNmTJ0/u6znsccew65du7Br1y6kpKSgRYsWOOmkk3DZZZfhvPPOM33tVq5cqf19wgknmK7H4XCgb9+++PXXX6GqKtasWaN1U6kJlZWVGDZsGH777TcA/q4Xo0aNwlFHHQW3242NGzfio48+wvr16/H9999j5MiRmD59OhwO40bzZcuW4cUXX4QQAjfddBMGDhyI1NRULF68GG+//TZKS0sxffp0PPvss3jqqad0lzF58mSMGjUKPp8PbrcbF1xwAYYOHYoWLVqgqKgIv/zyCz7//HMUFxfjoosuwvTp0y0HZV911VWYO3cujj32WFxxxRXo2LEjioqKsHz5cq3M6tWrcd5552mtYH379sVVV12Ftm3bYt++fZg0aRLmzZuHUaNGGbYWORwO3HDDDXj44Ydx6NAhTJ48WTtTpufLL7/UWpevu+4609e2Jtnxvt1xxx1ai39KSgrGjh2LwYMHw+FwYNGiRRg/fjweeOABjBw50rI+CxYswLBhw1BWVgZFUXDWWWfhzDPPRJs2bVBeXo4FCxbg448/RllZGW6++WakpqZGtC7ccMMNmDZtGiZPnowFCxbgySefjKj7+PHj8eWXXwIATjrppHpxyZVo9jn9+vXTfVy05s2bp31uot1nJcv+VcTYrcjn82H16tUhr6WsaOrfrFkzdOjQAdu2bcOBAwewf/9+y8lOYvHZZ59h7NixqKqqQrNmzfDDDz9EPDe7jr2uueYavPzyywD83cYCvZWMmE2mEKs333wTzz//vNbdtlmzZujfvz9GjhyJUaNG2TLZjZ0OHDiABx98UPv/L3/5S8zLSsbjk19++QUjR45EUVERMjIy8OWXX+Kcc84JKVNQUICBAwdi06ZNAPytXX/5y1/QtWtXOBwOrFy5EhMmTMCuXbswfvx4eL1e3W6xV155Je699154PB5MnjwZb7zxBrKysgzrFk132d69eyMrKwslJSWYNm2a/AtgxY5UZ/e09z6fTxx//PECgEhNTRWff/65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t27VtoG2bdti2LBhUS0zMNGUoijo06ePLfWstUAW3Bxu1SVo7Nix2t+BMym1JdAdY/PmzYYhyufz4bnnnrNcVjTP2UrHjh21bnp//vmnaShbvHgxfv75ZwD+5J4MYykCsyza8VMbrWObNm0KOXt37rnnRpRRFAWXXnopAH/gfv311w2X99prr2l/1/Tg4csvv1w7iP7nP/8Z97ZnB6fTidGjRwPwd434z3/+U2vrDg5Gb7zxhmmoePXVV6Na9k033QTAP2HFXXfdpX3pjR071raze4mUmpqqbfv79u3Df//7X8OyU6dOtZwRM7BvLysr0wZax8rn82H06NHal/trr72Gbt26YfDgwXj44YcBALt27cL1118f13oA/yyLdu2/Ym0dA/zdagKf7c8++0ybPCbcypUrte+Ali1bhpykiVbwZBsLFy6MeTnBknX/unbtWm09eXl5cW07WVlZ2vMqKioy/N4SQuDf//639r/d3w+BUDZ48GAA/kkyjEJZTR57BbdATJgwIeT1iLZ1Il4FBQUh+3q97S9Rli5dqrVoud3umLvMJsvxicvlwsSJE3HJJZcA8Ieys88+WzeUjRkzRvv7ySeftHV+hvDtL7i77NixY6Ma2uHz+bQeCD179rRv8ig75s6XuQ7ZHXfcoZX59ddfTZfn8/lCrhNx5513isrKSsPyZWVl4oMPPhCfffZZxH3B14+Ruf5L8LVDXn755Yj7PR5PyEUMYXINjpdfflkr8+GHH1qu2+pabZMmTdLub9WqlVizZk1EmW3btoVcU8HoopaB+82u7xNL2WT3zTffiC+++ML0uiPh18kZOnSoYdldu3aJjIwMAUC4XC4xY8aMiDLB14Zp166d1PVd4nXPPfdo6zzttNPEnj17DMv6fD4xffp03QucG13oUY9V2R07doi8vDztuiFWn4l9+/aJp556SvfCndFc11AIIQYPHqyVv/XWW3UvJB1+rSmjz3Www4cPa+9/8I/RBaPtEs11yOJ93+bMmaPd36hRI92Leq9fv160atUq5DXQuw5ZSUmJdg0fRVHECy+8YHpR78OHD4tXX31V9zpOjz76qLauSy65JOS+qqoq7RpJAMQ777xj+hrUJYFr9QAQ55xzTsT+pKCgQPTt29fyO0BWRUWFyMzMFADEKaecYlo2mfev+/btE6tXrzZc15IlS0S7du20ZZld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yT7W5sJRmJroahEREZHN1LxKZAwSKCwsROPGjfHMM8+gd+/eia4WUVwYyKhe2L9/P/7+979j3bp1gKgeV7aD48qIiIjqAwEBX7tSqB3LIIRAjx498Mwzz6BFixaJrhpR3BjIqN6orKzEa6+9hm+//RYAoBxKgXtdLhQvx5URERHVVcKloqpHIUQjDwDgggsuwO23347UVPaGofqBgYzqnalTp+Lll19GZWUlUOGAe10ur1dGRERUB6lZVajqeRhIU5Gamop77rmH48Wo3mEgo3pp06ZNePTRR7Fz505ABZzbsuDclcEujERERHWAgICvTRnQtRw+nw9t27bF008/jS5duiS6akS2YyCjequ0tBQvvPACfvnlFwDVXRg35EDxcBZGIiKiZCVSfKjqXgSR5++iOHToUNx///3IyspKcM2IagYDGdVrQgh8++23eP311/1dGKsUuDbkwFmQluiqERERURhf4wpkDgQKCwuRlpaGO+64AyNGjICisIcL1V8MZNQgbNu2DU899RQ2bNgAAHDsSYdrSzYUlTt4IiKiRBMOAW/HYqitywEA3bp1w+OPP4727dsnuGZENY+BjBoMj8eD//znP5g4cSIAQClzwrUhhxN+EBERJZCa7YG3exFEug8AMGrUKNxwww1ISeH3MzUMDGTU4CxevBjPPvssDh486L9m2a4MOLdlQRFsLSMiIqotQhHwdSiB2q4cQgg0a9YMDzzwAAYMGJDoqhHVKgYyapCKi4vx2muvYdq0aQCqW8vW58JR4k5wzYiIiOo/NasK3u6FEBn+VrGzzz4bt99+O7KzsxNcM6Lax0BGDdrcuXPx0ksvoaCgwN9atjMDzu1sLSMiIqoJwiHga1cC0aECqqqicePGuPfeezF48OBEV40oYRjIqMErKirCq6++iunTpwOobi3blANHIfuuExER2UXNrURV12KgeqzYsGHDcOeddyI3NzfBNSNKLAYyompz5szByy+/7B9bBsCxL80/E6PXkeCaERER1V3CpcLbqRhqiwoAQNOmTXHXXXfh1FNPTXDNiJIDAxlRkJKSErz77rv4+uuvIYTwX7dsSzYc+9OggN0YiYiIZAkIqM0q4O1cDLgFFEXByJEjceONNyIzMzPR1SNKGgxkRDpWrlyJF198EVu2bAEAKIdT4NqUDUe5K8E1IyIiSn5quhfeLsUQeR4A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AQQyAAAAALAJgQwAAAAAbEIgAwAAAACbEMgAAAAAwCYEMgAAAACwCYEMAAAAAGxCIAMAAAAAmxDIAAAAAMAmBDIAAAAAsAmBDAAAAABsQiADAAAAAJsQyAAAAADAJgQyAECA119/XUOGDNEjjzxid1dgs+zsbN10000aMmSIvv32W7u7AwANUiO7OwAADcWFCxd08OBB7du3T/v379f+/ft16tQpmaYpSfroo48UGxtbK9c2TVMTJ05UamqqpkyZovvvvz+odg4ePKjly5dLku67774a7KG9jhw5oi1btmj37t06cuSI0tPTVVRUpCZNmuiqq67SwIEDNXr0aEVFRdnd1XolKipKkyZN0qJFi/TGG29owIABaty4sd3dAoAGhUAGADVk2rRpOnjwoC3X3rdvn1JTUyVJ8fHxQbezcOFCFRUVacCAAerevXtNdc9W06ZN044dO8osy8jIUEZGhrZu3ar33ntPiYmJ6t+/f912sJ6bOHGili1bppSUFH388ceaMmWK3V0CgAaFRxYBoIb47oRJ3jsLvXr1UosWLerk2t99950kKSYmRt26dQuqjV27dmnbtm2S1KA+dPuCapMmTTRmzBglJiZqwYIFWrRokWbNmqWBAwdK8oazxMRE7dy5087u1jsul0sTJkyQJC1dulQ5OTk29wgAGhbukAFADRkzZoyio6PVtWtXxcXFyTAMTZs2TRkZGbV+bV8gGzRokAzDCKqNDz74QJIUGxur3/3udzXWN7vFxcXpjjvu0IgRIxQeHh5Q1rVrVw0dOlTvv/++3nzzTRUUFOjVV1/VO++8Y1Nv66eEhAQtXrxY58+f1+eff67bbrvN7i4BQIPBHTIAqCETJ07UyJEj1a5du6BDUTB++eUXHT9+XFLwjyumpqZq48aNkqRRo0bVaf9r27x583TjjTeWCmP+pkyZos6dO0uSjh07psOHD9dV90JCbGysevToIUn67LPPbO4NADQs3CEDgBDnm/3O95hkMFatWiWPxyNJGj58eJXquN1uffPNN1q/fr327dunzMxMFRUVKTo6Wh07dlTfvn01cuRItWzZMqDekCFDJEmjR49WYmKiTpw4oY8//lhbt25VWlqaLrvsMnXp0kV//OMf1bNnT6tefn6+vvzySyUlJenkyZPKy8tT27ZtdcMNN+i222675MkmevfubX0H8JdfftFV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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "iteration = 49\n", + "\n", + "plot_reconstructed_image(all_results[iteration])" + ] + }, + { + "cell_type": "markdown", + "id": "9955eb5c-5c49-4c20-bbe5-32d2d547527a", + "metadata": {}, + "source": [ + "An example to plot the image in the log scale" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "2e91030b-0ae0-4d77-8bf8-e51bb636536c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9zm8+MUvxvLyMn70R38U1113Hb797W/j7rvvxgte8ALntn7yk5/Ej/7oj6JareIlL3kJDh48iBMnTuD//J//g3/8x3/Epz/9aTzjGc+IfuaJiQn80i/9Ep7znOfgRS96EUZHR3H69Gn8wz/8A+677z782Z/9GX7u534OQKNz++Y3vxl/8Ad/AABtZZ2uEjgf3/jGN/AHf/AHWFhYwM6dO3H33Xdj165dq9o98cQTOHbsGG644Qbs379/1eP33nsvPv/5z+Nf//Vfcffdd+P222/Hm9/8Zrz1rW/F3r172yTNHlN09OhRPOtZz8KBAwfw0z/905iYmMCHPvQhvPSlL8U///M/4+6772Z/HpM3vOEN+Lu/+zt89rOfxc/8zM84x1pJjwPiS1/6Et7+9rfjzjvvxGte8xpcuHAB+XweAPCOd7wDjzzyCJ7znOfgB37gB7CwsIAvfvGLeMtb3oLPfOYz+Od//ufm+YOzjT5+4zd+A29/+9sxMjKCV73qVejp6cEnPvEJ/MZv/AY+9alP4f/+3//b3CaiWq3i+77v+3Dq1Cnce++9yGaz+Lu/+zv8+q//OhYWFvDmN7+Z/wUrinL1kiiKoqywd+/eBMCqf/bv35985jOfiT7/zW9+cwIg+bM/+zP2ez7vec9LACSPP/64eHvp/T796U8nSZIk//RP/5T09fUl4+PjyTe+8Y22tj/zMz+TAEje8Y53tP19fn4++b7v+74klUolX//619see9azntX2+ia33XZbAiB54IEHWNv66U9/OgGQvPnNb277O33+Zz7zmcmlS5eaf3/iiSeSXC6XDAwMJPv27UtOnDjRfOzSpUvJ8PBwMjIyklSr1bbXO3To0Kr3XlxcTF7wghck2Wy27XWWl5eTgwcPJgCSj3/8423P+e///b83f3/z809MTCQDAwPJ8PBw8tBDD7U959vf/nZSqVSSpz/96azvZGFhITl+/Piqv09OTia33HJLMjg4mMzNzbU9tnfv3mTv3r2s1zd5z3ve49y3M5lM8vM///PJ/Px8W/uPfexjCYDkB3/wB52v97d/+7cJgOQVr3hF298BJM973vOczzl8+HDzfd/ylre0PfbJT34yAZDce++97M/kei/7mLCRHge03wJI3v3udztf84knnkjq9fqqv7/pTW9KACQf/OAHO9rGw4cPN/92//33JwCS3bt3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fl6zmdr9CmoeZz+/H3pc5fHOtoH1Xjj2xfH6ZrcfOJ6ruk/V5w2s7VXvr3yqNc9rPrnqfvn246xt2t8E+/sIAF5QfXy4bfg2Lwgqz+t51u2e/f6av4Pqaw2s7XvVx9h/193mV1+ffVu1bXUna2+r/u3Vv5ia2+xDR+gwAq/2g6l+0NYXy7O/ZGZfaj4s6wtrjgk1j6m/v/b5rfsrX0jXY0L3V7brV7dZud+v/yF5XrWtb73Imv2zbvPC++K7t2W1C+zb/ND2a/YptH9zzxvU3G893vFcCD3Xjh0HQAhpPhQiQppMuVxGT08PXv/61y72rjSA6bgVrdsKi7EjNQSh/y1HNSTEEKD6hSFkCdHT04NymUdBQpoJhYiQJuP7PorFIm644QYcffTRi707hBBClgg7duzA5z//efi+n9yYECKGQkRIizj66KNxwgknLPZuEEIIIYSQGHiJgRBCCCGEENK1UIgIIYQQQgghXQuFiJAms3btWvzhH/4h1q5du9i7QgghZAnB8wshrcELgoDz8BBCCCGEEEK6EiZEhBBCCCGEkK6FQkQIIQQAcO+998LzPPz7v//7Yu/KkuRHP/oRPM/D/fffv9i7QgghxIJCRAghbcBdd92FD33oQzjjjDPQ398Pz/Nw5513zmub11xzDXp7ezE+Pp7YtlAo4LrrrsPb3vY2nHnmmfN63mawefNmXHvttfit3/otrF27FgMDA3j961+P66+/XvR62pHzzjsPZ511Fq677jqUSqXF3h1CCCFzcAwRIYS0Accccwx27NiBdevWYfny5dixYwe+853v4A//8A8b3uZRRx2F173udfjRj36U2PaOO+7ABz7wATz00EN461vf2vBzNosNGzZgeHgYZ511Fk477TR4noeHH34YTz31FI477jj8+7//Ow499NDF3k01//f//l+8853vxF133YU/+IM/WOzdIYQQAiZEhBDSFnz729/G9u3bceDAAVx11VXz3t6TTz6JXbt24eKLLxa1//rXv44jjzwS55xzzryfuxl87GMfw86dO/Hwww/jtttuw6233oonnngCV199NbZu3YrPfvazi72LDXHhhRdi3bp1+MY3vrHYu0IIIWQOChHpatLpNO644w78j//xP3DRRRdh06ZNeOCBB1ryXAcOHMCNN96It7/97bjwwgvxZ3/2Z9izZ09du02bNjn/u+uuu1qyX6Q9OO+883D00Uc3bXs/+MEPAADvfOc7E9s+++yz+OUvf4nLLrsMnuc52zzyyCO45JJLcOihh6K/vx9HHnkkLr30UmzevLnS5jOf+UwlyfnOd76DN7zhDVi2bBmOPfZY/MVf/AUAIAgCfPnLX8YJJ5yAgYEBvPa1r8Xf/M3f1D3f9ddfj8MPP7zmNs/z8D//5/8EAPz0pz+VvRGYlcPf//3fx1FHHYX+/n4ccsgheOMb34ibbrpJ9PiJiQl8+tOfxkknnYQVK1Zg1apVOP744/H+978fO3bscL7+O++8E6effjoGBwdx9tlnV9r09vbikksuwebNm/Hyyy+LXwNZHPL5PL7+9a/jXe96F8477zx86EMfwi9+8QvRYyXH/Fwuhy984Qt4//vfj9/93d/F2972NvzX//pf8Y//+I8oFoux2//iF7+ITZs24frrr6+7L5fL4a677sKVV16J888/H5deeik+/elPY9u2bTXtnnjiCXzhC1/Ae9/7Xpx//vl497vfjVtuuQXDw8M17fbu3Rt5btq0aRO++MUvit4TQtqVnsXeAUIWk4mJCdx555049NBDcfzxx+Opp55qyfOk02l89KMfxczMDN73vvehp6cH3/3ud/HhD38Yd9xxB1avXl3T/owzzsCFF15Yc9trX/valuwbWZrce++9OPXUU0WS9dBDDwEA3vKWtzjvv/322/Gxj30My5Ytw7ve9S4cddRR2L17NzZv3ozvfe97OOuss2raf+UrX8HDDz+Miy++GG9961vx/e9/Hx/96EcxODiIp556Ct///vfxjne8A+eeey7uvvtuvP/978cxxxyDTZs2Je5rb28vAKCnR3b6evrpp3HmmWcilUrh4osvxtFHH43x8XFs2bIF3/rWt/CpT30q9vFBEOBtb3sbHn/8cfz2b/82LrzwQvi+jx07duC+++7DlVdeWfcef+lLX8JPfvITXHzxxbjggguQSqVq7v9P/+k/4dvf/jZ+/OMf4/jjjxe9DrI43HzzzXj44Ydx+eWX44gjjsADDzyA6667DrfffjtOOeWUyMdJj/m5XA7bt2/HW97yFmzYsAG+7+PZZ5/FV7/6VTz//PP49Kc/7dz+Cy+8gAceeAB9fX3O+z/3uc/h0Ucfxe/93u/hda97HYaHh/F//s//wdVXX40777wTGzZsAAB84xvfwOTkJM4++2wceeSR2LNnD/7pn/4JP/vZz/BXf/VXlfWO1qxZgxtuuKHueR5//HE8+OCDeOMb36h6XwlpOwJCuphcLhcMDw8HQRAEzz//fLBx48bg/vvvb/rz/N3f/V2wcePGYMuWLZXbtm/fHpx99tnBN7/5zZq2GzduDG699dam7wPpHG6++eYAQPCd73ynocdv27YtABB85jOfEbW//PLLAwDBSy+9VHff008/Hfi+Hxx++OHBtm3bau4rl8vB7t27K/++8cYbAwDBwQcfHLzyyiuV23fu3Bn09fUFq1evDl73utcF+/fvr9z32GOPBQCC3/u93xPt6y233BIACD7xiU+I2n/84x8PAAT33ntv3X3mtx/HM888EwAILrnkkrr7stlsMDU1Vfm3ef3Lly8Pnnnmmcht/upXvwoABP/lv/wX0Wsgi8Nzzz0XbNy4Mfj7v//7ym3ZbDZ4z3veE1x11VWxj9Uc813cdtttwcaNG53f0XK5HFx11VXBzTffHFx++eXBddddV3P//v37g40bNwb/63/9r5rbn3jiiWDjxo3BPffcU7ntqaeeCkqlUk27p556Kti4cWPwrW99K3E///RP/zS48MILg2w2m9iWkHaGJXOkq+nr6xOv+P3YY4/hmmuuwQUXXIC3ve1tuO666+rKD6J4+OGH8frXvx4nnnhi5bajjz4ap59+On7yk584H5PL5ZDL5UTbJ8TGlMtJxw+9+uqrAOCcpOCb3/wmyuUyPv/5z+OYY46puc/zvLqyNgD46Ec/iuOOO67y7yOPPBJnnXUWJiYm8KlPfQqHHHJI5b43v/nNOO644/CrX/0qcT+ffvpp/Pmf/znWr1+P6667TvTaDMuWLau7Tfrbj3p8f38/VqxYUXf7f/tv/w1veMMbIrdl3mfzvpP25Kc//SlSqVRN2Wl/fz8uuugiPPfccxgaGop8bCPHfBuT4ExPT9fd98Mf/hDbtm3DH//xHzsfm06nAQAHHXRQze3m+97f31+57dRTT4Xv13YFTz31VKxataqmHNTF8PAwnnrqKWzatKlmm4R0IhQiQgT88Ic/xPXXX49ly5bhQx/6EN7//vdj+/bt+JM/+RPs3bs39rHlchlbt27F61//+rr7TjzxROzevbtyAjP867/+Ky644AKcf/75uPLKK/Hggw829fWQpc0PfvADHHXUUTj11FNF7UdGRpBKpbBy5cq6+37+858DAC644ALx87ue97DDDou9zzWezmbr1q246KKLUCqVcPfdd2PdunWifbniiivg+z7e9a534Y/+6I/wD//wD9i9e7foscDsb/SUU07BP/zDP2DTpk249dZb8eSTT6JcLkc+5k1velPsNg8++GAAqBunQdqLl156CUcccQSWL19ec7uRnKgxYI0c8wuFAsbHxzE0NIRHHnkEd999NzZs2IDXvOY1Ne3S6TS+8Y1v4H3ve1+k0L/mNa/BIYccgnvuuQePPvoo9u/fjy1btuDLX/4yDjvssMRZJNPpNDKZTF0pd5gf//jHKJfLOP/882PbEdIJUIgISSCdTuP222/HO97xDnzpS1/CZZddhve+972VWaKSJjuYnJxEPp93nrzMbXbH6OSTT8YHP/hB3HTTTbj22mvh+z4+97nP4d57723eiyJLltHRUfzbv/2bOB0CZtOPUqmEQqFQd9/ExAQ8z6sIjYRVq1bV3WbG/ETdFzeAfNu2bTjnnHMwPDyM733ve6qZ8N785jfj4YcfxqZNm/D3f//3eO9734sjjjgCb3rTm0RX6nt6evDjH/8Y11xzDV5++eXK2kgbNmzAZz/7Wed6QknTgWcyGQDA4OCg+HWQhWdkZER83LbRHvOB2UlL3vnOd+Lyyy/HDTfcgPXr1+Pmm2+uGyt35513or+/H1dccUXkfvf09OBzn/scli1bhj/7sz/D7//+7+Oqq65CJpPB1772NeeFD5t//Md/RKFQSBSnBx98EGvXrsXpp58e246QToBCREgCv/zlLzE9PY1zzz0X4+Pjlf9838eJJ56IJ598MvbxpuzNDAa3MQNi7dK4r33ta7j88stx1lln4eKLL8a3v/1tHHvssfjWt77FEjqSyL/8y7+gWCzikksuET/GlLCNjo7W3bdmzRoEQZCYhLaKrVu34uyzz8bevXvx3e9+F+94xzvU29i4cSMeeOABjI2N4Sc/+Qk+/vGP49e//jUuuugibN26NfHxa9euxV/+5V9i9+7d2LJlC7761a/i4IMPxo033uicXStqpj6DeZ/t0kHSfuRyOfFxO/w4QH7MB4DTTjsNt956Kz772c/i4osvRiqVQjabrWmza9cufO9738PVV18dOZmCYeXKlTj++OPxB3/wB7jpppvw3//7f8e+fftw4403xp5Hnn76adx55504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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "iteration_idx = 49\n", + "\n", + "result = all_results[iteration_idx]\n", + "\n", + "iteration = result['iteration']\n", + "image = result['model_map']\n", + "\n", + "data = image[:,0]\n", + "data[data <= 0 * data.unit] = 1e-12 * data.unit\n", + "\n", + "hp.mollview(data, min = 1e-5, norm ='log', unit = str(data.unit), title = f'511 keV image at {iteration}th iteration', cmap = 'magma')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96731b2a-be51-4b40-b8b7-34ed55d004ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/tutorials/image_deconvolution/511keV/GalacticCDS/imagedeconvolution_parfile_gal_511keV.yml b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/imagedeconvolution_parfile_gal_511keV.yml new file mode 100644 index 00000000..194db705 --- /dev/null +++ b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/imagedeconvolution_parfile_gal_511keV.yml @@ -0,0 +1,25 @@ +author: Hiroki Yoneda +date: 2024-01-23 +model_property: + coordinate: "galactic" + nside: 16 + scheme: "ring" + energy_edges: [509.0, 513.0] +model_initialization: + algorithm: "flat" # more methods, e.g., simple-backprojection, user-defined, would be implemented. + parameter_flat: + values: [ 1e-4 ] #cm-2 s-1 sr-1, the number of these values should be the same as "the number of energy_edges - 1". +deconvolution: + algorithm: "RL" + parameter_RL: + iteration: 10 + acceleration: True + alpha_max: 10.0 + save_results_each_iteration: False + response_weighting: True + response_weighting_index: 0.5 + smoothing: True + smoothing_FWHM: 2.0 #deg + # stopping_criterion: "TBD" + background_normalization_fitting: False + background_normalization_range: [0.01, 10.0] diff --git a/docs/tutorials/image_deconvolution/511keV/GalacticCDS/inputs_511keV_DC2.yaml b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/inputs_511keV_DC2.yaml new file mode 100644 index 00000000..5a71e89e --- /dev/null +++ b/docs/tutorials/image_deconvolution/511keV/GalacticCDS/inputs_511keV_DC2.yaml @@ -0,0 +1,14 @@ +#----------# +# Data I/O: + +data_file: +ori_file: "/Users/yoneda/Work/Exp/COSI/cosipy-2/data_challenge/DC2/prework/data/orientation/20280301_3_month.ori" +unbinned_output: 'fits' # 'fits' or 'hdf5' +time_bins: 7979955 # time bin size in seconds. Takes int or list of bin edges. +tmin: 1835487300.0 +tmax: 1843467255.0 +energy_bins: [509.0, 513.0] +phi_pix_size: 3 # binning of Compton scattering anlge [deg] +nside: 16 # healpix binning of psi chi local +scheme: 'ring' # healpix binning of psi chi local +#----------# diff --git a/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-DataReduction.ipynb b/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-DataReduction.ipynb index 0b399873..d04fed39 100644 --- a/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-DataReduction.ipynb +++ b/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-DataReduction.ipynb @@ -7,23 +7,363 @@ "source": [ "# DC2 Image Analysis, 511 keV, Data Reduction\n", "\n", - "updated on 2023-12-01 (the commit b55ffd07153ce28296837cd6bfd37a88540d33d4)\n", + "updated on 2024-01-30 (the commit 26cfdeacb25335bd511a91c4f8a29bdeb36408f2)\n", "\n", "This notebook focuses on how to produce the binned datasets with the spacecraft attitude (scatt) binning method for DC2.\n", - "Using the 511keV thin disk 3month simulation data created for DC2, an example of the image analysis will be presented.\n", - "After running through this notebook, you can go to the next notebook, namely 511keV-DC2-ScAtt-ImageDeconvolution.ipynb.\n", + "Using the 511keV thin disk 3-month simulation data created for DC2, an example of the image analysis will be presented.\n", + "After running through this notebook, you can go to the next notebook, 511keV-DC2-ScAtt-ImageDeconvolution.ipynb.\n", + "\n", + "### Notes on the coordinate system of Compton data space in the image deconvolution ###\n", + "\n", + "We have two options on the coordinate system to describe the Compton scattering direction ($\\chi\\psi$) with, namely the Galactic coordinate or the detector coordinate.\n", + "\n", + "Using the Galactic coordinate is intuitive, and the spectral fitting adopts this coordinate. Thus, we suppose that Galactic coordinate should be adopted also for image deconvolution eventually. However, in this case, we need to convert the detector response into the Galactic coordinate for each pixel in the sky because the response matrix is described in the detector coordinate. As for now, it takes a long time to compute it. Thus, the pre-computed converted response are provided in DC2 for several main sources (511 keV, Al-26, Ti-44, continuum). The pre-computed responses assume that we analyze 3-month data without extracting some time intervals, and the pixel resolution of the model map is already fixed in them. While there is less flexibility in binning/modeling, it is relatively fast to perform the image deconvolution in DC2 since the most computationally heavy part, the coordinate conversion of the response, can be skipped.\n", + "\n", + "Using the detector coordinates for Compton data space may not be so intuitive. However, the advantage is that we do not have to convert the response matrix. Instead, we will convert the model map into the detector coordinate. Because the model map generally has a much smaller data size than the response, we can compute this coordinate conversion quickly. \n", + "\n", + "The disadvantage of this method is that we need more bins due to continuous pointing changes of the COSI satellite. Since COSI is an all-sky monitoring satellite with ∼90-minute orbits, it changes its pointing by ∼4 degrees every minute. Thus, in this case, we need to divide the data into several bins so that astronomical sources can be considered at rest in the detector coordinate for each bin within the COSI's angular resolution. The straightforward way could be to divide the data every $\\sim$15 seconds, considering that the COSI's angular resolution is an order of degrees. However, we need $5\\times10^5$ time bins for 3-month observations, which makes the event histogram very huge. To avoid this issue, the spacecraft attitude (scatt) binning method is introduced. Instead of binning data over time, we first analyze the satellite attitude and find the time intervals when the satellite has almost the same attitude within the angular resolution. Then, we assign the events in such intervals into the same CDS. In the DC2 simulation, the orbit inclination is assumed to be 0 degrees. In this case, the number of the scatt bins becomes 100-1000, which makes the computation more executable. With this method, at least in DC2, we can perform the image deconvolution using the original response matrix and have flexibilities to change binning/modeling, e.g., the pixel resolution can be changed in a relatively easy way.\n", + "\n", + "While both methods have pros and cons, our baseline is to eventually use the Galactic coordinate. But we still need to carefully investigate how they will be scaled with longer exposure, finer pixel resolution, etc. Thus, we provide the notebooks of both methods for the image deconvolution in DC2.\n", + "\n", + "For the Crab image analysis, the following notebooks are based on the scatt binning method\n", + "- ScAttBinning/511keV-DC2-ScAtt-DataReduction.ipynb\n", + "- ScAttBinning/511keV-DC2-ScAtt-ImageDeconvolution.ipynb\n", + "- ScAttBinning/511keV-DC2-ScAtt-Upsampling.ipynb\n", + "\n", + "GalacticCDS/511keV-DC2-Galactic-ImageDeconvolution.ipynb uses the galactic coordinate.\n", "\n", "If you want to know about the other analysis, e.g., the spectral analysis, you can see the notebooks in docs/tutorials/spectral_fits." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "e3bb550f", "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "WARNING: version mismatch between CFITSIO header (v4) and linked library (v4.01).\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Welcome to JupyROOT 6.24/06\n" + ] + }, + { + "data": { + "text/html": [ + "19:20:46 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", + " available \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m19:20:46\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=518556;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=432132;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#48\u001b\\\u001b[2m48\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it functions.py:69\n", + " will not be available. \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=939162;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=355833;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#69\u001b\\\u001b[2m69\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mwill not be available. \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", + " available \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=308712;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=22241;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=83673;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=460396;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=995428;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=345043;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=50649;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=543256;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=623963;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=255917;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of F to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of F to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=297750;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=750103;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=778822;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=550651;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "19:20:46 INFO Starting 3ML! __init__.py:35\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m19:20:46\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=817706;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=462540;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#35\u001b\\\u001b[2m35\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING WARNINGs here are NOT errors __init__.py:36\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m WARNINGs here are \u001b[0m\u001b[1;31mNOT\u001b[0m\u001b[1;38;5;251m errors \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=110554;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=181768;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING but are inform you about optional packages that can be installed __init__.py:37\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m but are inform you about optional packages that can be installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=937249;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=240882;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#37\u001b\\\u001b[2m37\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING to disable these messages, turn off start_warning in your config file __init__.py:40\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m \u001b[0m\u001b[1;31m to disable these messages, turn off start_warning in your config file\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=499879;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=954925;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#40\u001b\\\u001b[2m40\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING Multinest minimizer not available minimization.py:1357\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Multinest minimizer not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=994938;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=826345;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1357\u001b\\\u001b[2m1357\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING PyGMO is not available minimization.py:1369\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m PyGMO is not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=908323;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=649699;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1369\u001b\\\u001b[2m1369\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING The cthreeML package is not installed. You will not be able to use plugins which __init__.py:94\n", + " require the C/C++ interface (currently HAWC) \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The cthreeML package is not installed. You will not be able to use plugins which \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=274794;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=755381;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#94\u001b\\\u001b[2m94\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mrequire the C/C++ interface \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;38;5;251mcurrently HAWC\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING Could not import plugin HAWCLike.py. Do you have the relative instrument __init__.py:144\n", + " software installed and configured? \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin HAWCLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=66075;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=234119;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING Could not import plugin FermiLATLike.py. Do you have the relative instrument __init__.py:144\n", + " software installed and configured? \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin FermiLATLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=853268;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=42144;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "19:20:47 WARNING No fermitools installed lat_transient_builder.py:44\n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m19:20:47\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m No fermitools installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=101997;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py\u001b\\\u001b[2mlat_transient_builder.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=446047;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py#44\u001b\\\u001b[2m44\u001b[0m\u001b]8;;\u001b\\\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "19:20:47 WARNING Env. variable OMP_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m19:20:47\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable OMP_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=214647;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=568431;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING Env. variable MKL_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable MKL_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=300189;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=417455;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " WARNING Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "\n" + ], + "text/plain": [ + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=449369;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=312418;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "from histpy import Histogram, HealpixAxis, Axis, Axes\n", "from mhealpy import HealpixMap\n", @@ -53,7 +393,9 @@ "import matplotlib.pyplot as plt\n", "\n", "import healpy as hp\n", - "from tqdm.autonotebook import tqdm" + "from tqdm.autonotebook import tqdm\n", + "\n", + "%matplotlib inline" ] }, { @@ -64,16 +406,19 @@ "# 0. Prepare the data\n", "Before running the cells, please download the files needed for this notebook. You can get them from wasabi. \n", "\n", - "Actually, the data reduction is not optimized and takes hours depending on your environments. So I skip this process.\n", + "Basically, the data reduction from raw tra files may take hours depending on your environments. So we can skip this process.\n", "Please download the following data files and then run the following cells.\n", "\n", "From wasabi\n", "- cosi-pipeline-public/COSI-SMEX/DC2/Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\n", - "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months.fits.gz\n", + "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months_unbinned_data.fits.gz\n", "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Backgrounds/albedo_photons_3months_unbinned_data.fits.gz\n", + " - In this notebook, only the albedo gamma-ray background is considered for a tutorial.\n", + " - If you want to consider all of the background components, please replace it with cosi-pipeline-public/COSI-SMEX/DC2/Data/Backgrounds/total_bg_3months_unbinned_data.fits.gz\n", + " - Note that total_bg_3months_unbinned_data.fits.gz is 14.15 GB.\n", "- cosi-pipeline-public/COSI-SMEX/DC2/Data/Orientation/20280301_3_month.ori\n", "\n", - "From docs/tutorials/image_deconvolution/511keV\n", + "From docs/tutorials/image_deconvolution/511keV/ScAttBinning\n", "- inputs_511keV_DC2.yaml" ] }, @@ -82,8 +427,7 @@ "id": "8462d0dc", "metadata": {}, "source": [ - "You can download the data and detector response from wasabi. You can skip this cell if you already have downloaded the files.\n", - "Note that the response is not public yet (2023-11-21)." + "You can download the data and detector response from wasabi. You can skip this cell if you already have downloaded the files." ] }, { @@ -117,7 +461,7 @@ "\n", "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5 --endpoint-url=https://s3.us-west-1.wasabisys.com SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\")\n", "\n", - "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months.fits.gz --endpoint-url=https://s3.us-west-1.wasabisys.com 511_thin_disk_3months.fits.gz\")\n", + "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Data/Sources/511_thin_disk_3months_unbinned_data.fits.gz --endpoint-url=https://s3.us-west-1.wasabisys.com 511_thin_disk_3months_unbinned_data.fits.gz\")\n", "\n", "os.system(header + \" --bucket cosi-pipeline-public --key COSI-SMEX/DC2/Data/Backgrounds/albedo_photons_3months_unbinned_data.fits.gz --endpoint-url=https://s3.us-west-1.wasabisys.com albedo_photons_3months_unbinned_data.fits.gz\")\n", "\n", @@ -136,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "f648e175", "metadata": {}, "outputs": [], @@ -146,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "66a8b44d", "metadata": {}, "outputs": [ @@ -154,21 +498,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 15.8 s, sys: 1.16 s, total: 17 s\n", - "Wall time: 16.7 s\n" + "CPU times: user 16 s, sys: 1.16 s, total: 17.2 s\n", + "Wall time: 16.9 s\n" ] } ], "source": [ "%%time\n", "\n", - "ori_filepath = path_data + \"Data/Orientation/20280301_3_month.ori\"\n", + "ori_filepath = path_data + \"20280301_3_month.ori\"\n", "ori = SpacecraftFile.parse_from_file(ori_filepath)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "id": "4709061c", "metadata": {}, "outputs": [ @@ -178,13 +522,13 @@ "(16, 3072)" ] }, - "execution_count": 8, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "full_detector_response_filename = path_data + \"Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\"\n", + "full_detector_response_filename = path_data + \"SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\"\n", "full_detector_response = FullDetectorResponse.open(full_detector_response_filename)\n", "\n", "nside_local = full_detector_response.nside\n", @@ -195,14 +539,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "id": "328808b4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "FILENAME: '/Users/yoneda/Work/Exp/COSI/cosipy-2/data_challenge/DC2/prework/data/response/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5'\n", + "FILENAME: '/Users/yoneda/Work/Exp/COSI/cosipy-2/data_challenge/DC2/prework/data/Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5'\n", "AXES:\n", " NuLambda:\n", " DESCRIPTION: 'Location of the simulated source in the spacecraft coordinates'\n", @@ -236,7 +580,7 @@ " SCHEME: 'RING'\n" ] }, - "execution_count": 9, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -257,7 +601,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "id": "6c61a321", "metadata": {}, "outputs": [ @@ -296,7 +640,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "49c50fea45d3464ab8cfd6c39d3e1514", + "model_id": "182c9f53f9ac483e8244d24e2a887e58", "version_major": 2, "version_minor": 0 }, @@ -311,8 +655,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 44.6 s, sys: 1.84 s, total: 46.4 s\n", - "Wall time: 46.3 s\n" + "CPU times: user 44.7 s, sys: 1.88 s, total: 46.6 s\n", + "Wall time: 46.5 s\n" ] }, { @@ -592,7 +936,7 @@ "[278 rows x 10 columns]" ] }, - "execution_count": 10, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -616,7 +960,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "id": "640e422c", "metadata": {}, "outputs": [], @@ -634,7 +978,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "id": "af522267", "metadata": {}, "outputs": [ @@ -644,7 +988,7 @@ "True" ] }, - "execution_count": 12, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -664,7 +1008,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 9, "id": "0f073766", "metadata": {}, "outputs": [ @@ -677,7 +1021,7 @@ "" ] }, - "execution_count": 13, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -691,12 +1035,12 @@ "id": "e9306cf5", "metadata": {}, "source": [ - "SpacecraftAttitudeExposureTable can produce SpacecraftAttitudeMap that has an exposure time in each Z- and X-poiting pixels." + "SpacecraftAttitudeExposureTable can produce SpacecraftAttitudeMap that has an exposure time in each Z- and X-pointing pixels." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "id": "b24d8dc3", "metadata": {}, "outputs": [], @@ -707,9 +1051,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "id": "b75a6097", - "metadata": {}, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, "outputs": [ { "data": { @@ -744,9 +1093,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 12, "id": "cd627fef", - "metadata": {}, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, "outputs": [ { "data": { @@ -786,33 +1140,32 @@ "source": [ "# 2. Calculate the coordinate conversion matrix\n", "\n", - "\n", "CoordsysConversionMatrix.spacecraft_attitude_binning_ccm can produce the coordinate conversion matrix for the spacecraft attitude binning.\n", "\n", - "In this calculation, the dwell time map is calculated for each model pixel and each scatt_binning_index.\n", + "In this calculation, we calculate the exposure time map in the detector coordinate for each model pixel and each scatt_binning_index. We refer to it as the dwell time map.\n", "\n", - "If use_averaged_pointing is True, first the averaged Z- and X-pointings are calculated (the average of zpointing or xpointing in the exposure table), and then the dwell time map is calculated once for ach model pixel and each scatt_binning_index.\n", + "If use_averaged_pointing is True, first the averaged Z- and X-pointings are calculated (the average of zpointing or xpointing in the exposure table) for each scatt_binning_index, and then the dwell time map is calculated assuming the averaged pointings for each model pixel and each scatt_binning_index.\n", "\n", - "If use_averaged_pointing is False, the dwell time map is calculated for each attitude in zpointing and xpointing in the exposure table, and then the calculated dwell time maps are summed up. \n", + "If use_averaged_pointing is False, the dwell time map is calculated for each attitude in zpointing and xpointing (basically every 1 second), and then the calculated dwell time maps are summed up for each model pixel and each scatt_binning_index. \n", "\n", - "In the former case, the computation is fast but may lose the angular resolution. In the latter case, the conversion matrix is more accurate but it takes a long time to calculate it." + "In the former case, the computation is fast but may lose the angular resolution. In the latter case, the conversion matrix is more accurate, but it takes a very long time to calculate it." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 13, "id": "5a6488b4", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "58e8e643b02d4b8a8db5575455cd27e0", + "model_id": "510e833d4aff4beb85f205288b492d01", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/3072 [00:00, ?it/s]" + " 0%| | 0/278 [00:00, ?it/s]" ] }, "metadata": {}, @@ -822,8 +1175,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 18min 9s, sys: 6.08 s, total: 18min 16s\n", - "Wall time: 18min 12s\n" + "CPU times: user 11min 16s, sys: 5.89 s, total: 11min 21s\n", + "Wall time: 11min 20s\n" ] } ], @@ -845,7 +1198,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "id": "dea7c0f6", "metadata": {}, "outputs": [], @@ -863,7 +1216,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 15, "id": "60f38738", "metadata": {}, "outputs": [], @@ -878,12 +1231,12 @@ "source": [ "# 3. produce the binned data\n", "\n", - "Using the exposure table, we can produce the binned data." + "Using the exposure table, we can produce the binned data. Note that here we generate the binned histogram manually. We consider implementing this functionality in the DataIO class in the future." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "id": "1d2f6e1b", "metadata": {}, "outputs": [], @@ -945,7 +1298,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "id": "f5a8f6fb", "metadata": {}, "outputs": [ @@ -953,15 +1306,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 5.05 s, sys: 263 ms, total: 5.31 s\n", - "Wall time: 5.31 s\n" + "CPU times: user 7.22 s, sys: 334 ms, total: 7.55 s\n", + "Wall time: 7.56 s\n" ] } ], "source": [ "%%time\n", "\n", - "signal_filepath = path_data + \"Data/Sources/511_thin_disk_3months.fits.gz\"\n", + "signal_filepath = path_data + \"511_thin_disk_3months_unbinned_data.fits.gz\"\n", "\n", "unbinned_signal = UnBinnedData(input_yaml = \"inputs_511keV_DC2.yaml\")\n", "\n", @@ -980,7 +1333,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "id": "1f59ec16", "metadata": {}, "outputs": [ @@ -988,15 +1341,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1min 32s, sys: 4.3 s, total: 1min 36s\n", - "Wall time: 1min 36s\n" + "CPU times: user 1min 34s, sys: 4.3 s, total: 1min 39s\n", + "Wall time: 1min 39s\n" ] } ], "source": [ "%%time\n", "\n", - "bkg_filepath = path_data + \"Data/Backgrounds/albedo_photons_3months_unbinned_data.fits.gz\"\n", + "bkg_filepath = path_data + \"albedo_photons_3months_unbinned_data.fits.gz\"\n", "\n", "unbinned_bkg = UnBinnedData(input_yaml = \"inputs_511keV_DC2.yaml\")\n", "\n", @@ -1015,7 +1368,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 19, "id": "24b90890", "metadata": {}, "outputs": [], @@ -1033,7 +1386,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 20, "id": "93cb9a01", "metadata": {}, "outputs": [], @@ -1042,10 +1395,18 @@ "binned_bkg.write(\"511keV_scatt_binning_DC2_bkg.hdf5\")" ] }, + { + "cell_type": "markdown", + "id": "aa3e61c2-976a-4b08-befb-b607ed510442", + "metadata": {}, + "source": [ + "**You can move on the next notebook (511keV-DC2-ScAtt-ImageDeconvolution.ipynb).**" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "3c1a10b5", + "id": "00723a19-9304-4625-94e1-998247098e0c", "metadata": {}, "outputs": [], "source": [] diff --git a/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-ImageDeconvolution.ipynb b/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-ImageDeconvolution.ipynb index bfaf923b..f64799e5 100644 --- a/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-ImageDeconvolution.ipynb +++ b/docs/tutorials/image_deconvolution/511keV/ScAttBinning/511keV-DC2-ScAtt-ImageDeconvolution.ipynb @@ -9,10 +9,10 @@ "source": [ "# DC2 Image Analysis, 511 keV, Image Deconvolution\n", "\n", - "updated on 2023-12-01 (the commit b55ffd07153ce28296837cd6bfd37a88540d33d4)\n", + "updated on 2024-01-30 (the commit 26cfdeacb25335bd511a91c4f8a29bdeb36408f2)\n", "\n", "This notebook focuses on the image deconvolution with the spacecraft attitude (scatt) binning method for DC2.\n", - "Using the 511 keV thin disk 3month simulation data created for DC2, an example of the image analysis will be presented.\n", + "Using the 511 keV thin disk 3-month simulation data created for DC2, an example of the image analysis will be presented.\n", "If you have not run through 511keV-DC2-ScAtt-DataReduction.ipynb, please see it first." ] }, @@ -43,12 +43,12 @@ { "data": { "text/html": [ - "11:59:37 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", + "19:41:37 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", " available \n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=588248;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=426015;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#48\u001b\\\u001b[2m48\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m19:41:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=868719;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=430612;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#48\u001b\\\u001b[2m48\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -63,7 +63,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=578858;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=957660;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#69\u001b\\\u001b[2m69\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=1266;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=828377;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#69\u001b\\\u001b[2m69\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mwill not be available. \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -73,12 +73,12 @@ { "data": { "text/html": [ - "11:59:38 WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", + "19:41:38 WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", " available \n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=115202;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=639135;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m19:41:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=592615;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=487884;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -92,7 +92,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=723948;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=620047;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=715098;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=629258;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -105,7 +105,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=44321;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=122280;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=356515;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=502226;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -118,7 +118,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=415866;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=673221;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=565497;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=461713;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -131,7 +131,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=124228;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=907241;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=84453;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=437410;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -144,7 +144,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of F to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=562767;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=584747;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of F to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=15358;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=521689;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -157,7 +157,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=244012;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=739560;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m We have set the min_value of K to \u001b[0m\u001b[1;37m1e-99\u001b[0m\u001b[1;38;5;251m because there was a postive transform \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=256986;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=884611;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/core/parameter.py#704\u001b\\\u001b[2m704\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -166,11 +166,11 @@ { "data": { "text/html": [ - "11:59:38 INFO Starting 3ML! __init__.py:35\n", + "19:41:38 INFO Starting 3ML! __init__.py:35\n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=341591;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=570852;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#35\u001b\\\u001b[2m35\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m19:41:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=535446;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=741506;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#35\u001b\\\u001b[2m35\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -183,7 +183,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m WARNINGs here are \u001b[0m\u001b[1;31mNOT\u001b[0m\u001b[1;38;5;251m errors \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=903000;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=509504;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m WARNINGs here are \u001b[0m\u001b[1;31mNOT\u001b[0m\u001b[1;38;5;251m errors \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=94178;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=451499;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -196,7 +196,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m but are inform you about optional packages that can be installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=658925;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=380953;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#37\u001b\\\u001b[2m37\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m but are inform you about optional packages that can be installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=751666;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=226228;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#37\u001b\\\u001b[2m37\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -209,7 +209,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m \u001b[0m\u001b[1;31m to disable these messages, turn off start_warning in your config file\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=235592;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=344685;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#40\u001b\\\u001b[2m40\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m \u001b[0m\u001b[1;31m to disable these messages, turn off start_warning in your config file\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=85570;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=612756;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#40\u001b\\\u001b[2m40\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -222,7 +222,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Multinest minimizer not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=615349;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=841070;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1357\u001b\\\u001b[2m1357\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Multinest minimizer not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=50968;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=509890;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1357\u001b\\\u001b[2m1357\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -235,7 +235,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m PyGMO is not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=626312;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=127276;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1369\u001b\\\u001b[2m1369\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m PyGMO is not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=146921;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=794948;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/minimizer/minimization.py#1369\u001b\\\u001b[2m1369\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -249,7 +249,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The cthreeML package is not installed. You will not be able to use plugins which \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=289972;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=607990;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#94\u001b\\\u001b[2m94\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The cthreeML package is not installed. You will not be able to use plugins which \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=646350;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=265558;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#94\u001b\\\u001b[2m94\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mrequire the C/C++ interface \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;38;5;251mcurrently HAWC\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -264,7 +264,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin HAWCLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=420101;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=85221;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin HAWCLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=35839;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=46082;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -279,7 +279,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin FermiLATLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=390508;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=146188;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin FermiLATLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=913803;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=135607;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#144\u001b\\\u001b[2m144\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -293,7 +293,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m No fermitools installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=537159;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py\u001b\\\u001b[2mlat_transient_builder.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=274495;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py#44\u001b\\\u001b[2m44\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m No fermitools installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=370360;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py\u001b\\\u001b[2mlat_transient_builder.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=80289;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py#44\u001b\\\u001b[2m44\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -307,7 +307,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable OMP_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=672492;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=783377;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable OMP_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=219211;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=844281;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -322,7 +322,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable MKL_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=59967;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=644243;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable MKL_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=267452;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=556886;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -337,7 +337,7 @@ "\n" ], "text/plain": [ - "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=287385;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=454630;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=28294;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=519854;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#387\u001b\\\u001b[2m387\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -375,7 +375,9 @@ "from matplotlib.gridspec import GridSpec \n", "\n", "import healpy as hp\n", - "from tqdm.autonotebook import tqdm" + "from tqdm.autonotebook import tqdm\n", + "\n", + "%matplotlib inline" ] }, { @@ -390,7 +392,7 @@ "From wasabi\n", "- cosi-pipeline-public/COSI-SMEX/DC2/Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\n", "\n", - "From docs/tutorials/image_deconvolution/511keV\n", + "From docs/tutorials/image_deconvolution/511keV/ScAttBinning\n", "- inputs_511keV_DC2.yaml\n", "- imagedeconvolution_parfile_scatt_511keV.yml\n", "\n", @@ -433,7 +435,7 @@ "metadata": {}, "outputs": [], "source": [ - "response_path = path_data + \"Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\"\n", + "response_path = path_data + \"SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5\"\n", "\n", "response = FullDetectorResponse.open(response_path)" ] @@ -447,7 +449,7 @@ { "data": { "text/plain": [ - "FILENAME: '/Users/yoneda/Work/Exp/COSI/cosipy-2/data_challenge/DC2/prework/data/response/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5'\n", + "FILENAME: '/Users/yoneda/Work/Exp/COSI/cosipy-2/data_challenge/DC2/prework/data/Responses/SMEXv12.511keV.HEALPixO4.binnedimaging.imagingresponse.nonsparse_nside16.area.h5'\n", "AXES:\n", " NuLambda:\n", " DESCRIPTION: 'Location of the simulated source in the spacecraft coordinates'\n", @@ -508,8 +510,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 145 ms, sys: 722 ms, total: 867 ms\n", - "Wall time: 865 ms\n" + "CPU times: user 149 ms, sys: 806 ms, total: 955 ms\n", + "Wall time: 958 ms\n" ] } ], @@ -545,7 +547,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.65 s, sys: 74 ms, total: 1.72 s\n", + "CPU times: user 1.63 s, sys: 77.8 ms, total: 1.71 s\n", "Wall time: 1.72 s\n" ] } @@ -577,44 +579,50 @@ "\\log L = \\sum_i X_i \\log \\epsilon_i - \\sum_i \\epsilon_i\n", "$$\n", "\n", - "$X_i$: detected counts ( $i$ : index of the Compton Data Space)\n", + "$X_i$: detected counts at $i$-th bin ( $i$ : index of the Compton Data Space)\n", "\n", "$\\epsilon_i = \\sum_j R_{ij} \\lambda_j + b_i$ : expected counts ( $j$ : index of the model space)\n", "\n", - "$\\lambda_j$ : the model map\n", + "$\\lambda_j$ : the model map (basically gamma-ray flux at $j$-th pixel)\n", "\n", - "$b_i$ : the background at the index $i$\n", + "$b_i$ : the background at $i$-th bin\n", "\n", "$R_{ij}$ : the response matrix\n", "\n", - "Since we have to optimize the flux in each pixel, and the number of parameters are large, we adopt an iterative approach to find a solution of the above equation. The simplest one is ML-EM (maximum likelihood expectation maximazation) algorithm.\n", + "Since we have to optimize the flux in each pixel, and the number of parameters is large, we adopt an iterative approach to find a solution of the above equation. The simplest one is the ML-EM (Maximum Likelihood Expectation Maximization) algorithm. It is also known as the Richardson-Lucy algorithm.\n", "\n", "$$\n", - "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\delta \\lambda_{j}^{k} \\\\\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\delta \\lambda_{j}^{k}\n", + "$$\n", + "$$\n", "\\delta \\lambda_{j}^{k} = \\frac{\\lambda_{j}^{k}}{\\sum_{i} R_{ij}} \\sum_{i} \\left(\\frac{ X_{i} }{\\epsilon_{i}} - 1 \\right) R_{ij} \n", "$$\n", "\n", "We refer to $\\delta \\lambda_{j}^{k}$ as the delta map.\n", "\n", - "As for now, the two improved algorithms are implemented.\n", + "As for now, the two improved algorithms are implemented in COSIpy.\n", "\n", "- Accelerated ML-EM algorithm (Knoedlseder+99)\n", "\n", "$$\n", - "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\delta \\lambda_{j}^{k} \\\\\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\delta \\lambda_{j}^{k}\n", + "$$\n", + "$$\n", "\\alpha^{k} < \\mathrm{max}(- \\lambda_{j}^{k} / \\delta \\lambda_{j}^{k})\n", "$$\n", "\n", - "Paractically, in order not to accelerate the algorithm excessively, we set the maximu value of $\\alpha$. Thus, $\\alpha$ can be determined as:\n", + "Practically, in order not to accelerate the algorithm excessively, we set the maximum value of $\\alpha$ ($\\alpha_{\\mathrm{max}}$). Then, $\\alpha$ is calculated as:\n", "\n", "$$\n", - "\\alpha^{k} = \\mathrm{min}(\\mathrm{max}(- \\lambda_{j}^{k} / \\delta \\lambda_{j}^{k}), \\alpha_{max})\n", + "\\alpha^{k} = \\mathrm{min}(\\mathrm{max}(- \\lambda_{j}^{k} / \\delta \\lambda_{j}^{k}), \\alpha_{\\mathrm{max}})\n", "$$\n", "\n", "- Noise damping using gaussian smoothing (Knoedlseder+05, Siegert+20)\n", "\n", "$$\n", - "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\left[ w_j \\delta \\lambda_{j}^{k} \\right]_{\\mathrm{gauss}} \\\\\n", + "\\lambda_{j}^{k+1} = \\lambda_{j}^{k} + \\alpha^{k} \\left[ w_j \\delta \\lambda_{j}^{k} \\right]_{\\mathrm{gauss}}\n", + "$$\n", + "$$\n", "w_j = \\left(\\sum_{i} R_{ij}\\right)^\\beta\n", "$$\n", "\n", @@ -649,12 +657,22 @@ "id": "59d48019", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "WARNING FutureWarning: Note that _modify_axes() in DataLoader was implemented for a temporary use. It will be removed in the future.\n", + "\n", + "\n", + "WARNING UserWarning: Make sure to perform _modify_axes() only once after the data are loaded.\n", + "\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Note that this function is tentetive. It should be removed in the future!\n", - "Please run this function only once!\n", "... checking the axis ScAtt of the event and background files...\n", " --> pass (edges)\n", " --> pass (unit)\n", @@ -686,7 +704,7 @@ "id": "241505ad", "metadata": {}, "source": [ - "(the following function is tentetive. It will be removed in the future.)" + "(In the future, we plan to remove the method \"_modify_axes.\")" ] }, { @@ -696,9 +714,9 @@ "source": [ "### 4-2. Load the response file\n", "\n", - "The response file will be loaded on the CPU memory. It requires a few GB. In the actuall analysis, the response will be much larger, ~TB. \n", + "The response file will be loaded on the CPU memory. It requires a few GB. In the actual COSI satellite analysis, the response could be much larger, perhaps ~1TB wiht finer bin size. \n", "\n", - "So loading it on the memory might be unrealistic. The optimized (lazy) loading would be a next work." + "So loading it on the memory might be unrealistic in the future. The optimized (lazy) loading would be a next work." ] }, { @@ -711,8 +729,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 13.4 s, sys: 1.26 s, total: 14.6 s\n", - "Wall time: 14.6 s\n" + "CPU times: user 13.5 s, sys: 1.48 s, total: 15 s\n", + "Wall time: 15 s\n" ] } ], @@ -727,7 +745,7 @@ "id": "5bc6a570", "metadata": {}, "source": [ - "Calculate an auxiliary matrix for the deconvolution (mandatory)" + "Here, we calculate an auxiliary matrix for the deconvolution. Basically, it is a response matrix projected into the model space ($\\sum_{i} R_{ij}$). Currently, it is mandatory to run this command for the image deconvolution." ] }, { @@ -755,7 +773,7 @@ "source": [ "### 4-3. Initialize the instance of the image deconvolution class\n", "\n", - "First we prepare an instance of ImageDeconvolution class, and then, resister the dataset, parameters for the deconvolution. After that, you can start the calculation." + "First, we prepare an instance of the ImageDeconvolution class and then register the dataset and parameters for the deconvolution. After that, you can start the calculation." ] }, { @@ -786,7 +804,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "data for image deconvolution was set -> \n", + "data for image deconvolution was set -> \n", "parameter file for image deconvolution was set -> imagedeconvolution_parfile_scatt_511keV.yml\n" ] } @@ -808,43 +826,42 @@ "source": [ "### Initialize image_deconvolution\n", "\n", - "In this process, a model map is defined following the input parameters, and it is initialized. Also, it prepares ancillary data for the image deconvolution\n", + "In this process, a model map is defined following the input parameters, and it is initialized. Also, it prepares ancillary data for the image deconvolution, e.g., the expected counts with the initial model map, gaussian smoothing filter etc.\n", "\n", - "I describe the parameters in the parameter file.\n", + "I describe parameters in the parameter file.\n", "\n", - "#### The description of parameters: model_property\n", + "#### model_property\n", "\n", "| Name | Unit | Description | Notes |\n", "| :---: | :---: | :---: | :---: |\n", "| coordinate | str | the coordinate system of the model map | As for now, it must be 'galactic' |\n", - "| nside | int | NSIDE of the model map | As for now, it must be the same as that of the response matrix |\n", + "| nside | int | NSIDE of the model map | it must be the same as NSIDE of 'lb' axis of the coordinate conversion matrix|\n", "| scheme | str | SCHEME of the model map | As for now, it must be 'ring' |\n", "| energy_edges | list of float [keV] | The definition of the energy bins of the model map | As for now, it must be the same as that of the response matrix |\n", "\n", - "#### The description of parameters: model_initialization\n", + "#### model_initialization\n", "\n", "| Name | Unit | Description | Notes |\n", "| :---: | :---: | :---: | :---: |\n", "| algorithm | str | the method name to initialize the model map | As for now, only 'flat' can be used |\n", - "| parameter_flat:values | list of float [cm-2 s-1 sr-1] | the list of photon fluxes for each energy band | the length of the list should be the same as \"the number of energy_edges - 1\" |\n", + "| parameter_flat:values | list of float [cm-2 s-1 sr-1] | the list of photon fluxes for each energy band | the length of the list should be the same as the length of \"energy_edges\" - 1 |\n", "\n", - "#### The description of parameters: deconvolution\n", + "#### deconvolution\n", "\n", "| Name | Unit | Description | Notes |\n", "| :---: | :---: | :---: | :---: |\n", - "|algorithm | str | the name of the image deconvolution algorithm| As for now, only 'RL_memsave' is supported |\n", + "|algorithm | str | the name of the image deconvolution algorithm| As for now, only 'RL' is supported |\n", "|||||\n", - "|parameter_RL_memsave:iteration | int | The maximum number of the iteration | |\n", - "|parameter_RL_memsave:acceleration | bool | whether the accelerated ML-EM algorithm (Knoedlseder+99) is used | |\n", - "|parameter_RL_memsave:alpha_max | float | the maximum value for the acceleration | |\n", - "|parameter_RL_memsave:save_results_each_iteration | bool | whether a updated model map, detal map, likelihood etc. are save at the end of each iteration | |\n", - "|parameter_RL_memsave:response_weighting | bool | whether a factor $w_j = (\\sum_{i} R_{ij})^{\\beta}$ for weighting the delta image is introduced (see Knoedlseder+05, Siegert+20) | |\n", - "|parameter_RL_memsave:response_weighting_index | float | $\\beta$ in the above equation | |\n", - "|parameter_RL_memsave:smoothing | bool | whether a Gaussian filter is used (see Knoedlseder+05, Siegert+20) | |\n", - "|parameter_RL_memsave:smoothing_FWHM | float, degree | the FWHM of the Gaussian in the filter | |\n", - "|parameter_RL_memsave:smoothing_max_sigma | float | a threshold for the Gaussian fileter calculation | should be larger than ~5 |\n", - "|parameter_RL_memsave:background_normalization_fitting | bool | whether the background normalization is optimized at each iteration | As for now, the same single background normalization factor is used in all of the time bins |\n", - "|parameter_RL_memsave:background_normalization_range | list of float | the range of the normalization factor | should be positive |" + "|parameter_RL:iteration | int | The maximum number of the iteration | |\n", + "|parameter_RL:acceleration | bool | whether the accelerated ML-EM algorithm (Knoedlseder+99) is used | |\n", + "|parameter_RL:alpha_max | float | the maximum value for the acceleration parameter | |\n", + "|parameter_RL:save_results_each_iteration | bool | whether an updated model map, detal map, likelihood etc. are saved at the end of each iteration | |\n", + "|parameter_RL:response_weighting | bool | whether a delta map is renormalized based on the exposure time on each pixel, namely $w_j = (\\sum_{i} R_{ij})^{\\beta}$ (see Knoedlseder+05, Siegert+20) | |\n", + "|parameter_RL:response_weighting_index | float | $\\beta$ in the above equation | |\n", + "|parameter_RL:smoothing | bool | whether a Gaussian filter is used (see Knoedlseder+05, Siegert+20) | |\n", + "|parameter_RL:smoothing_FWHM | float, degree | the FWHM of the Gaussian in the filter | |\n", + "|parameter_RL:background_normalization_fitting | bool | whether the background normalization factor is optimized at each iteration | As for now, the single background normalization factor is used in all of the bins |\n", + "|parameter_RL:background_normalization_range | list of float | the range of the normalization factor | should be positive |" ] }, { @@ -874,7 +891,7 @@ " values:\n", " - 1e-4\n", "\n", - "3. resistering the deconvolution algorithm ...\n", + "3. registering the deconvolution algorithm ...\n", "... calculating the expected events with the initial model map ...\n", "... calculating the response weighting filter...\n", "... calculating the gaussian filter...\n" @@ -883,7 +900,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "770c935b849c447aade9a8eb7cf1f651", + "model_id": "787a76408f87451687d9cad617f808c7", "version_major": 2, "version_minor": 0 }, @@ -936,7 +953,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 14, "id": "1a658d2a-4dee-4d05-83ae-d7ac06317c73", "metadata": {}, "outputs": [ @@ -961,7 +978,7 @@ " values:\n", " - 1e-4\n", "\n", - "3. resistering the deconvolution algorithm ...\n", + "3. registering the deconvolution algorithm ...\n", "... calculating the expected events with the initial model map ...\n", "... calculating the response weighting filter...\n", "... calculating the gaussian filter...\n" @@ -970,7 +987,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "26641acaf46c4d90874e6504efb0b912", + "model_id": "7588d06581354a01a7524559604db3ae", "version_major": 2, "version_minor": 0 }, @@ -1021,18 +1038,21 @@ "id": "f764066e", "metadata": {}, "source": [ - "### 4-5. Start the image deconvolution" + "## 4-5. Start the image deconvolution\n", + "\n", + "**With MacBook Pro with M1 Max and 64 GB memory, it takes about 6 minutes for 30 iterations.**" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 15, "id": "a57fbf71-2fcc-48c4-9ac7-4c545dca67c9", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true - } + }, + "scrolled": true }, "outputs": [ { @@ -1045,7 +1065,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c623d62f4903498ca2d5466c0a246658", + "model_id": "3f9e0f566265430b83a796729b4f80d3", "version_major": 2, "version_minor": 0 }, @@ -1086,8 +1106,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 2.503946029353811\n", - " loglikelihood: -1563364.027752656\n", + " alpha: 2.5039460293538105\n", + " loglikelihood: -1563364.0277526558\n", " background_normalization: 1.0048700233481955\n", " Iteration 2/30 \n", "--> pre-processing\n", @@ -1142,8 +1162,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 4.5462072036961505\n", - " loglikelihood: -1490909.3204384341\n", + " alpha: 4.546207203696152\n", + " loglikelihood: -1490909.3204384344\n", " background_normalization: 0.9998689870447892\n", " Iteration 6/30 \n", "--> pre-processing\n", @@ -1170,7 +1190,7 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 2.854692362839585\n", + " alpha: 2.854692362839457\n", " loglikelihood: -1489307.7214813665\n", " background_normalization: 0.9997388449308033\n", " Iteration 8/30 \n", @@ -1185,7 +1205,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1489058.4877618838\n", + " loglikelihood: -1489058.487761884\n", " background_normalization: 0.9998124108372027\n", " Iteration 9/30 \n", "--> pre-processing\n", @@ -1198,8 +1218,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 2.228381206217167\n", - " loglikelihood: -1488593.3846111514\n", + " alpha: 2.2283812062183777\n", + " loglikelihood: -1488593.384611151\n", " background_normalization: 0.9997745302553334\n", " Iteration 10/30 \n", "--> pre-processing\n", @@ -1226,7 +1246,7 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 1.270569125079065\n", + " alpha: 1.2705691250781777\n", " loglikelihood: -1488249.8944230902\n", " background_normalization: 0.9997686118565604\n", " Iteration 12/30 \n", @@ -1268,8 +1288,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 1.2230022900252306\n", - " loglikelihood: -1487888.5786615433\n", + " alpha: 1.2230022900243092\n", + " loglikelihood: -1487888.5786615435\n", " background_normalization: 0.9997700189565418\n", " Iteration 15/30 \n", "--> pre-processing\n", @@ -1296,8 +1316,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 1.8098974214523587\n", - " loglikelihood: -1487652.4673017934\n", + " alpha: 1.8098974214440344\n", + " loglikelihood: -1487652.4673017936\n", " background_normalization: 0.999770562358397\n", " Iteration 17/30 \n", "--> pre-processing\n", @@ -1311,7 +1331,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1487583.1765680613\n", + " loglikelihood: -1487583.1765680623\n", " background_normalization: 0.999771015377049\n", " Iteration 18/30 \n", "--> pre-processing\n", @@ -1324,8 +1344,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 5.6184481286951495\n", - " loglikelihood: -1487253.9933618852\n", + " alpha: 5.618448128695514\n", + " loglikelihood: -1487253.9933618857\n", " background_normalization: 0.9997712604348642\n", " Iteration 19/30 \n", "--> pre-processing\n", @@ -1352,8 +1372,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 4.541756790046982\n", - " loglikelihood: -1487060.310352311\n", + " alpha: 4.541756790045432\n", + " loglikelihood: -1487060.3103523117\n", " background_normalization: 0.999772909371205\n", " Iteration 21/30 \n", "--> pre-processing\n", @@ -1367,7 +1387,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1487034.142226235\n", + " loglikelihood: -1487034.1422262355\n", " background_normalization: 0.9997739086816684\n", " Iteration 22/30 \n", "--> pre-processing\n", @@ -1381,7 +1401,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1487009.4576823679\n", + " loglikelihood: -1487009.4576823683\n", " background_normalization: 0.9997741100024176\n", " Iteration 23/30 \n", "--> pre-processing\n", @@ -1392,13 +1412,7 @@ "... calculating the expected events with the updated model map ...\n", "--> checking stopping criteria\n", "--> --> continue\n", - "--> registering results\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", " loglikelihood: -1486986.1429297891\n", @@ -1415,7 +1429,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1486964.0949290702\n", + " loglikelihood: -1486964.0949290707\n", " background_normalization: 0.9997744737637747\n", " Iteration 25/30 \n", "--> pre-processing\n", @@ -1428,8 +1442,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 4.967042011340186\n", - " loglikelihood: -1486864.615230223\n", + " alpha: 4.967042011343623\n", + " loglikelihood: -1486864.6152302232\n", " background_normalization: 0.9997746469610125\n", " Iteration 26/30 \n", "--> pre-processing\n", @@ -1443,7 +1457,7 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1486848.799003657\n", + " loglikelihood: -1486848.7990036565\n", " background_normalization: 0.9997754874062363\n", " Iteration 27/30 \n", "--> pre-processing\n", @@ -1456,8 +1470,8 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 1.633071314216421\n", - " loglikelihood: -1486824.311789931\n", + " alpha: 1.6330713142086324\n", + " loglikelihood: -1486824.3117899313\n", " background_normalization: 0.9997756319817698\n", " Iteration 28/30 \n", "--> pre-processing\n", @@ -1484,9 +1498,9 @@ "--> --> continue\n", "--> registering results\n", "--> showing results\n", - " alpha: 1.1820824055242158\n", + " alpha: 1.1820824055223498\n", " loglikelihood: -1486794.6074471278\n", - " background_normalization: 0.9997759950994235\n", + " background_normalization: 0.9997759950994234\n", " Iteration 30/30 \n", "--> pre-processing\n", "--> E-step\n", @@ -1499,12 +1513,12 @@ "--> registering results\n", "--> showing results\n", " alpha: 1.0\n", - " loglikelihood: -1486781.9555685543\n", + " loglikelihood: -1486781.9555685548\n", " background_normalization: 0.9997761488793757\n", "#### Done ####\n", "\n", - "CPU times: user 33min 32s, sys: 2min 55s, total: 36min 28s\n", - "Wall time: 5min 34s\n" + "CPU times: user 33min 1s, sys: 3min 35s, total: 36min 37s\n", + "Wall time: 5min 41s\n" ] } ], @@ -1516,7 +1530,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 16, "id": "cc64ea8d", "metadata": { "collapsed": true, @@ -1531,214 +1545,214 @@ "text": [ "[{'alpha': ,\n", " 'background_normalization': 1.0048700233481955,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 1,\n", - " 'loglikelihood': -1563364.027752656,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'loglikelihood': -1563364.0277526558,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9944142064277177,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 2,\n", " 'loglikelihood': -1519357.4702937151,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.999275691887223,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 3,\n", " 'loglikelihood': -1499867.5506138196,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 1.0004892236020582,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 4,\n", " 'loglikelihood': -1496920.474980764,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.9998689870447892,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 5,\n", - " 'loglikelihood': -1490909.3204384341,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'loglikelihood': -1490909.3204384344,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9995258381190871,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 6,\n", " 'loglikelihood': -1490365.0435509903,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.9997388449308033,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 7,\n", " 'loglikelihood': -1489307.7214813665,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9998124108372027,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 8,\n", - " 'loglikelihood': -1489058.4877618838,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'loglikelihood': -1489058.487761884,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.9997745302553334,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 9,\n", - " 'loglikelihood': -1488593.3846111514,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'loglikelihood': -1488593.384611151,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.999764145247152,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 10,\n", " 'loglikelihood': -1488431.7662045578,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.9997686118565604,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 11,\n", " 'loglikelihood': -1488249.8944230902,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9997696073518008,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 12,\n", " 'loglikelihood': -1488124.8362333952,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9997697876916849,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 13,\n", " 'loglikelihood': -1488012.3045336306,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': ,\n", " 'background_normalization': 0.9997700189565418,\n", - " 'delta_map': ,\n", + " 'delta_map': ,\n", " 'iteration': 14,\n", - " 'loglikelihood': -1487888.5786615433,\n", - " 'model_map': ,\n", - " 'processed_delta_map': },\n", + " 'loglikelihood': -1487888.5786615435,\n", + " 'model_map': ,\n", + " 'processed_delta_map': },\n", " {'alpha': 1.0,\n", " 'background_normalization': 0.9997703163980328,\n", - " 'delta_map': ,\n", + " 'delta_map':
19:20:46 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", + " available \n", + "
WARNING The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it functions.py:69\n", + " will not be available. \n", + "
WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", + " available \n", + "
WARNING We have set the min_value of K to 1e-99 because there was a postive transform parameter.py:704\n", + "
WARNING We have set the min_value of F to 1e-99 because there was a postive transform parameter.py:704\n", + "
19:20:46 INFO Starting 3ML! __init__.py:35\n", + "
WARNING WARNINGs here are NOT errors __init__.py:36\n", + "
WARNING but are inform you about optional packages that can be installed __init__.py:37\n", + "
WARNING to disable these messages, turn off start_warning in your config file __init__.py:40\n", + "
WARNING Multinest minimizer not available minimization.py:1357\n", + "
WARNING PyGMO is not available minimization.py:1369\n", + "
WARNING The cthreeML package is not installed. You will not be able to use plugins which __init__.py:94\n", + " require the C/C++ interface (currently HAWC) \n", + "
WARNING Could not import plugin HAWCLike.py. Do you have the relative instrument __init__.py:144\n", + " software installed and configured? \n", + "
WARNING Could not import plugin FermiLATLike.py. Do you have the relative instrument __init__.py:144\n", + " software installed and configured? \n", + "
19:20:47 WARNING No fermitools installed lat_transient_builder.py:44\n", + "
19:20:47 WARNING Env. variable OMP_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "
WARNING Env. variable MKL_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "
WARNING Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to 1 for optimal __init__.py:387\n", + " performances in 3ML \n", + "
11:59:37 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", + "19:41:37 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", " available \n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=588248;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=426015;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#48\u001b\\\u001b[2m48\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m19:41:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=868719;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=430612;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/functions.py#48\u001b\\\u001b[2m48\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -63,7 +63,7 @@ "
19:41:37 WARNING The naima package is not available. Models that depend on it will not be functions.py:48\n", " available \n", "
11:59:38 WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", + "19:41:38 WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", " available \n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=115202;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=639135;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n", + "\u001b[38;5;46m19:41:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=592615;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=487884;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/astromodels/functions/functions_1D/absorption.py#36\u001b\\\u001b[2m36\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, @@ -92,7 +92,7 @@ "
19:41:38 WARNING The ebltable package is not available. Models that depend on it will not be absorption.py:36\n", " available \n", "
11:59:38 INFO Starting 3ML! __init__.py:35\n", + "19:41:38 INFO Starting 3ML! __init__.py:35\n", "\n" ], "text/plain": [ - "\u001b[38;5;46m11:59:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=341591;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=570852;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#35\u001b\\\u001b[2m35\u001b[0m\u001b]8;;\u001b\\\n" + "\u001b[38;5;46m19:41:38\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=535446;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=741506;file:///Users/yoneda/Work/Exp/COSI/cosipy-2/cosipy-2-venv/lib/python3.10/site-packages/threeML/__init__.py#35\u001b\\\u001b[2m35\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, @@ -183,7 +183,7 @@ "
19:41:38 INFO Starting 3ML! __init__.py:35\n", "