|
1
|
|
|
""" |
|
2
|
|
|
Basic classes defining Input Config for DL3 files and some functions to |
|
3
|
|
|
retrieve the DL3 files information. |
|
4
|
|
|
|
|
5
|
|
|
Currently supporting files following enrico/fermipy for Fermi-LAT data for 3D |
|
6
|
|
|
Dataset and DL3 files that follow GADF v0.3 and can be directly read by Gammapy, |
|
7
|
|
|
for 1D Dataset. |
|
8
|
|
|
""" |
|
9
|
|
|
|
|
10
|
|
|
import logging |
|
11
|
|
|
|
|
12
|
|
|
from asgardpy.base import BaseConfig, PathType |
|
13
|
|
|
|
|
14
|
|
|
__all__ = ["InputFilePatterns", "InputDL3Config", "DL3Files"] |
|
15
|
|
|
|
|
16
|
|
|
EXPECTED_DL3_RANGE = ["gadf-dl3", "lat", "lat-aux"] |
|
17
|
|
|
|
|
18
|
|
|
|
|
19
|
|
|
# Basic Components for the Input Config |
|
20
|
|
|
class InputFilePatterns(BaseConfig): |
|
21
|
|
|
""" |
|
22
|
|
|
Config section for list of file patterns to use for fetching relevant DL3 |
|
23
|
|
|
files. |
|
24
|
|
|
""" |
|
25
|
|
|
|
|
26
|
|
|
events: str = "*events.fits*" |
|
27
|
|
|
edisp: str = "*DRM.fits*" |
|
28
|
|
|
exposure: str = "*BinnedMap.fits*" |
|
29
|
|
|
xml_model: str = "*out.xml" |
|
30
|
|
|
psf: str = "*psf.fits*" |
|
31
|
|
|
|
|
32
|
|
|
dl3: str = "dl3*fits" |
|
33
|
|
|
|
|
34
|
|
|
gal_diffuse: str = "gll_iem_v*.fits*" |
|
35
|
|
|
iso_diffuse: str = "iso_P8R3_SOURCE_V*_*.txt" |
|
36
|
|
|
|
|
37
|
|
|
|
|
38
|
|
|
class InputDL3Config(BaseConfig): |
|
39
|
|
|
""" |
|
40
|
|
|
Config section for main information on getting the relevant DL3 files. |
|
41
|
|
|
""" |
|
42
|
|
|
|
|
43
|
|
|
type: str = "type" |
|
44
|
|
|
input_dir: PathType = PathType("None") |
|
45
|
|
|
glob_pattern: dict = {} |
|
46
|
|
|
|
|
47
|
|
|
|
|
48
|
|
|
# Main Classes for I/O |
|
49
|
|
|
class DL3Files: |
|
50
|
|
|
""" |
|
51
|
|
|
A general class to retrieve information from given DL3 files, along with |
|
52
|
|
|
other auxiliary files for neighbouring sources, if provided. |
|
53
|
|
|
""" |
|
54
|
|
|
|
|
55
|
|
|
def __init__(self, dir_dict, log=None): |
|
56
|
|
|
if not log: |
|
57
|
|
|
self._set_logging() |
|
58
|
|
|
else: |
|
59
|
|
|
self.log = log |
|
60
|
|
|
|
|
61
|
|
|
self.dl3_path = dir_dict.input_dir |
|
62
|
|
|
|
|
63
|
|
|
self.dl3_type = dir_dict.type |
|
64
|
|
|
self._check_dl3_type() |
|
65
|
|
|
|
|
66
|
|
|
self.glob_dict = dir_dict.glob_pattern |
|
67
|
|
|
|
|
68
|
|
|
self.events_files = None |
|
69
|
|
|
self.edrm_files = None |
|
70
|
|
|
self.xml_files = None |
|
71
|
|
|
self.expmap_files = None |
|
72
|
|
|
self.psf_files = None |
|
73
|
|
|
self.gal_diff_files = None |
|
74
|
|
|
self.iso_diff_files = None |
|
75
|
|
|
|
|
76
|
|
|
self.xml_f = None |
|
77
|
|
|
self.gal_diff_f = None |
|
78
|
|
|
|
|
79
|
|
|
def _set_logging(self): |
|
80
|
|
|
self.log = logging.getLogger(__name__) |
|
81
|
|
|
self.log.setLevel(logging.INFO) |
|
82
|
|
|
|
|
83
|
|
|
def _check_dl3_type(self): |
|
84
|
|
|
if self.dl3_type.lower() not in EXPECTED_DL3_RANGE: |
|
85
|
|
|
self.log.error("%s is not in the expected range for DL3 files", self.dl3_type) |
|
86
|
|
|
|
|
87
|
|
|
def prepare_lat_files(self, key, file_list): |
|
88
|
|
|
""" |
|
89
|
|
|
Prepare a list of LAT files following a particular key. If there are no |
|
90
|
|
|
distinct key types of files, the value is None. |
|
91
|
|
|
""" |
|
92
|
|
|
# Try to combine LAT and LAT-AUX files |
|
93
|
|
|
self.list_dl3_files() |
|
94
|
|
|
file_list = self.select_unique_files(key, file_list) |
|
95
|
|
|
|
|
96
|
|
|
return file_list |
|
97
|
|
|
|
|
98
|
|
|
def list_dl3_files(self): |
|
99
|
|
|
""" |
|
100
|
|
|
From a given DL3 files path, categorize the different types of DL3 |
|
101
|
|
|
files, to be used for further analysis. |
|
102
|
|
|
|
|
103
|
|
|
The dl3_type of 'gadf-dl3' is used for all GADF v0.3 following DL3 |
|
104
|
|
|
files that can be directly read by Gammapy, for 1D Datasets. |
|
105
|
|
|
""" |
|
106
|
|
|
match self.dl3_type.lower(): |
|
107
|
|
|
case "lat": |
|
108
|
|
|
self.events_files = sorted(list(self.dl3_path.glob(self.glob_dict["events"]))) |
|
109
|
|
|
self.edrm_files = sorted(list(self.dl3_path.glob(self.glob_dict["edisp"]))) |
|
110
|
|
|
self.xml_files = sorted(list(self.dl3_path.glob(self.glob_dict["xml_model"]))) |
|
111
|
|
|
self.expmap_files = sorted(list(self.dl3_path.glob(self.glob_dict["exposure"]))) |
|
112
|
|
|
self.psf_files = sorted(list(self.dl3_path.glob(self.glob_dict["psf"]))) |
|
113
|
|
|
|
|
114
|
|
|
case "lat-aux": |
|
115
|
|
|
self.gal_diff_files = sorted(list(self.dl3_path.glob(self.glob_dict["gal_diffuse"]))) |
|
116
|
|
|
self.iso_diff_files = sorted(list(self.dl3_path.glob(self.glob_dict["iso_diffuse"]))) |
|
117
|
|
|
|
|
118
|
|
|
case "gadf-dl3": |
|
119
|
|
|
self.events_files = sorted(list(self.dl3_path.glob(self.glob_dict["dl3"]))) |
|
120
|
|
|
|
|
121
|
|
|
def select_unique_files(self, key, file_list): |
|
122
|
|
|
""" |
|
123
|
|
|
Select Unique files from all of the provided LAT files, as per the |
|
124
|
|
|
given key. If there are no distinct key types of files, the value is None. |
|
125
|
|
|
""" |
|
126
|
|
|
# Have to make more checks or add conditions on selecting only select |
|
127
|
|
|
# files instead from the glob-searched lists. |
|
128
|
|
|
if self.dl3_type.lower() in ["lat"]: |
|
129
|
|
|
var_list = [ |
|
130
|
|
|
"events_files", |
|
131
|
|
|
"edrm_files", |
|
132
|
|
|
"expmap_files", |
|
133
|
|
|
"psf_files", |
|
134
|
|
|
] |
|
135
|
|
|
file_list["xml_file"] = self.xml_files[0] |
|
136
|
|
|
|
|
137
|
|
|
if self.dl3_type.lower() == "lat-aux": |
|
138
|
|
|
var_list = [] |
|
139
|
|
|
if key: |
|
140
|
|
|
if "0" not in key: # For fermipy files, the diffuse files are already unique |
|
141
|
|
|
var_list = [ |
|
142
|
|
|
"iso_diff_files", |
|
143
|
|
|
] |
|
144
|
|
|
if isinstance(self.iso_diff_files, list): |
|
145
|
|
|
self.iso_gal_f = self.iso_diff_files[0] |
|
146
|
|
|
else: |
|
147
|
|
|
self.iso_gal_f = self.iso_diff_files |
|
148
|
|
|
file_list["iso_diff_file"] = self.iso_gal_f |
|
149
|
|
|
|
|
150
|
|
|
if isinstance(self.gal_diff_files, list): |
|
151
|
|
|
self.diff_gal_f = self.gal_diff_files[0] |
|
152
|
|
|
else: |
|
153
|
|
|
self.diff_gal_f = self.gal_diff_files |
|
154
|
|
|
file_list["gal_diff_file"] = self.diff_gal_f |
|
155
|
|
|
|
|
156
|
|
|
if len(var_list) > 0: |
|
157
|
|
|
for _v in var_list: |
|
158
|
|
|
if key is not None: |
|
159
|
|
|
filtered = [K for K in getattr(self, _v) if key in str(K.name)] |
|
160
|
|
|
if len(filtered) == 1: |
|
161
|
|
|
self.log.info("Selecting the file with name containing %s", key) |
|
162
|
|
|
setattr(self, _v.replace("_files", "_f"), filtered[0]) |
|
163
|
|
|
else: |
|
164
|
|
|
raise ValueError( |
|
165
|
|
|
"Variable {%s} does not contain one element after filtering by {%s}", |
|
166
|
|
|
getattr(self, _v), |
|
167
|
|
|
key, |
|
168
|
|
|
) |
|
169
|
|
|
else: |
|
170
|
|
|
self.log.info("No distinct key provided, selecting the first file in the list") |
|
171
|
|
|
setattr(self, _v.replace("_files", "_f"), getattr(self, _v)[0]) |
|
172
|
|
|
|
|
173
|
|
|
file_list[_v.replace("files", "file")] = getattr(self, _v.replace("_files", "_f")) |
|
174
|
|
|
|
|
175
|
|
|
return file_list |
|
176
|
|
|
|