Skip to content

Commit 1937690

Browse files
ric-evansgithub-actions
andcommitted
Additional SkyDriver Updates (#119)
Co-authored-by: github-actions <[email protected]>
1 parent b720272 commit 1937690

File tree

1 file changed

+61
-32
lines changed

1 file changed

+61
-32
lines changed

skymap_scanner/utils/scan_result.py

Lines changed: 61 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
"""For encapsulating the results of an event scan in a single instance."""
22

3+
# fmt: off
4+
# pylint: skip-file
35

6+
import dataclasses as dc
47
import io
58
import itertools as it
69
import json
@@ -19,6 +22,7 @@
1922
from matplotlib import pyplot as plt
2023
from matplotlib import text
2124

25+
from .event_tools import EventMetadata
2226
from .pixelreco import NSidesDict, PixelReco
2327

2428
###############################################################################
@@ -47,7 +51,6 @@ class InvalidPixelValueError(Exception):
4751
###############################################################################
4852
# MAIN CLASS
4953

50-
# fmt: off
5154
class ScanResult:
5255
"""This class parses a nsides_dict and stores the relevant numeric result
5356
of the scan. Ideally it should serve as the basic data structure for
@@ -217,6 +220,21 @@ def has_metadata(self) -> bool:
217220
return False
218221
return True
219222

223+
def get_event_metadata(self) -> EventMetadata:
224+
"""Get the EventMetadata portion of the result's metadata."""
225+
if self.has_metadata():
226+
first_metadata = self.result[list(self.result.keys())[0]].dtype.metadata
227+
return EventMetadata(
228+
first_metadata['run_id'],
229+
first_metadata['event_id'],
230+
first_metadata['event_type'],
231+
first_metadata['mjd'],
232+
first_metadata.get('is_real', True), # assume real event
233+
)
234+
else:
235+
self.logger.warning("Metadata doesn't seem to exist and will not be used for plotting.")
236+
return EventMetadata(0, 0, '', 0, False)
237+
220238
def is_close(
221239
self,
222240
other: "ScanResult",
@@ -315,12 +333,17 @@ def get_nside_string(self) -> str:
315333
# TODO: possibly better to use integer values as keys in self.result
316334
return "_".join([str(nside) for nside in self.nsides])
317335

318-
def get_filename(self, event_id: str, extension: str, output_dir: Union[str, Path, None] = None) -> Path:
336+
def get_filename(
337+
self,
338+
event_metadata: EventMetadata,
339+
extension: str,
340+
output_dir: Union[str, Path, None] = None
341+
) -> Path:
319342
"""Make a filepath for writing representations of `self` to disk."""
320343
if not extension.startswith('.'):
321344
extension = '.' + extension
322345

323-
filename = Path(f"{event_id}_{self.get_nside_string()}{extension}")
346+
filename = Path(f"{str(event_metadata)}_{self.get_nside_string()}{extension}")
324347
if output_dir is not None:
325348
filename = output_dir / Path(filename)
326349
return filename
@@ -330,13 +353,21 @@ def get_filename(self, event_id: str, extension: str, output_dir: Union[str, Pat
330353
"""
331354

332355
@classmethod
333-
def from_nsides_dict(cls, nsides_dict: NSidesDict, **kwargs) -> "ScanResult":
356+
def from_nsides_dict(
357+
cls,
358+
nsides_dict: NSidesDict,
359+
event_metadata: Optional[EventMetadata] = None
360+
) -> "ScanResult":
334361
"""Factory method for nsides_dict."""
335362
logger = logging.getLogger(__name__)
336363

364+
event_metadata_dict = {}
365+
if event_metadata:
366+
event_metadata_dict = dc.asdict(event_metadata)
367+
337368
result = dict()
338369
for nside, pixel_dict in nsides_dict.items():
339-
_dtype = np.dtype(cls.PIXEL_TYPE, metadata=dict(nside=nside, **kwargs))
370+
_dtype = np.dtype(cls.PIXEL_TYPE, metadata=dict(nside=nside, **event_metadata_dict))
340371
nside_pixel_values = np.zeros(len(pixel_dict), dtype=_dtype)
341372
logger.info(f"nside {nside} has {len(pixel_dict)} pixels / {12 * nside**2} total.")
342373

@@ -384,9 +415,13 @@ def read_npz(cls, filename: Union[str, Path]) -> "ScanResult":
384415
result[key] = np.array(list(npz[key]), dtype=_dtype)
385416
return cls(result=result)
386417

387-
def to_npz(self, event_id: str, output_dir: Union[str, Path, None] = None) -> Path:
418+
def to_npz(
419+
self,
420+
event_metadata: EventMetadata,
421+
output_dir: Union[str, Path, None] = None,
422+
) -> Path:
388423
"""Save to .npz file."""
389-
filename = self.get_filename(event_id, '.npz', output_dir)
424+
filename = self.get_filename(event_metadata, '.npz', output_dir)
390425

391426
try:
392427
metadata_dtype = np.dtype(
@@ -412,9 +447,13 @@ def read_json(cls, filename: Union[str, Path]) -> "ScanResult":
412447
pydict = json.load(f)
413448
return cls.deserialize(pydict)
414449

415-
def to_json(self, event_id: str, output_dir: Union[str, Path, None] = None) -> Path:
450+
def to_json(
451+
self,
452+
event_metadata: EventMetadata,
453+
output_dir: Union[str, Path, None] = None
454+
) -> Path:
416455
"""Save to .json file."""
417-
filename = self.get_filename(event_id, '.json', output_dir)
456+
filename = self.get_filename(event_metadata, '.json', output_dir)
418457
pydict = self.serialize()
419458
with open(filename, 'w') as f:
420459
json.dump(pydict, f, indent=4)
@@ -550,7 +589,6 @@ def create_plot(self,
550589
log_func=None,
551590
upload_func=None,
552591
final_channels=None):
553-
from .icetrayless import create_event_id_string
554592
from .plotting_tools import DecFormatter, RaFormatter
555593

556594
if log_func is None:
@@ -576,15 +614,9 @@ def upload_func(file_buffer, name, title):
576614
if "nside-" not in k:
577615
raise RuntimeError("\"nside\" not in result file..")
578616

579-
if self.has_metadata():
580-
run_id, event_id, event_type, mjd = [
581-
self.result[k].dtype.metadata[_] for _ in "run_id event_id event_type mjd".split()]
582-
else:
583-
self.logger.warn(f"Metadata doesn't seem to exist and will not be used for plotting.")
584-
run_id, event_id, event_type, mjd = [0]*4
585-
unique_id = f'{create_event_id_string(run_id, event_id, event_type)}_{self.get_nside_string()}'
586-
587-
plot_title = f"Run: {run_id} Event {event_id}: Type: {event_type} MJD: {mjd}"
617+
event_metadata = self.get_event_metadata()
618+
unique_id = f'{str(event_metadata)}_{self.get_nside_string()}'
619+
plot_title = f"Run: {event_metadata.run_id} Event {event_metadata.event_id}: Type: {event_metadata.event_type} MJD: {event_metadata.mjd}"
588620

589621
plot_filename = f"{unique_id}.{'plot_zoomed.' if dozoom else ''}pdf"
590622
print(f"saving plot to {plot_filename}")
@@ -814,7 +846,6 @@ def create_plot_zoomed(self,
814846
plot_4fgl=False,
815847
final_channels=None):
816848
"""Uses healpy to plot a map."""
817-
from .icetrayless import create_event_id_string
818849
from .plotting_tools import format_fits_header, hp_ticklabels, plot_catalog
819850

820851
if log_func is None:
@@ -850,15 +881,9 @@ def bounding_box(ra, dec, theta, phi):
850881
if "nside-" not in k:
851882
raise RuntimeError("\"nside\" not in result file..")
852883

853-
if self.has_metadata():
854-
run_id, event_id, event_type, mjd = [
855-
self.result[k].dtype.metadata[_] for _ in "run_id event_id event_type mjd".split()]
856-
else:
857-
self.logger.warn(f"Metadata doesn't seem to exist and will not be used for plotting.")
858-
run_id, event_id, event_type, mjd = [0]*4
859-
unique_id = f'{create_event_id_string(run_id, event_id, event_type)}_{self.get_nside_string()}'
860-
861-
plot_title = f"Run: {run_id} Event {event_id}: Type: {event_type} MJD: {mjd}"
884+
event_metadata = self.get_event_metadata()
885+
unique_id = f'{str(event_metadata)}_{self.get_nside_string()}'
886+
plot_title = f"Run: {event_metadata.run_id} Event {event_metadata.event_id}: Type: {event_metadata.event_type} MJD: {event_metadata.mjd}"
862887

863888
nsides = self.nsides
864889
print(f"available nsides: {nsides}")
@@ -1139,9 +1164,13 @@ def area(vs):
11391164
log_func("Memory Error prevented contours from being written")
11401165

11411166
uncertainty = [(ra_minus, ra_plus), (dec_minus, dec_plus)]
1142-
fits_header = format_fits_header((run_id, event_id, event_type), 0,
1143-
np.degrees(minRA), np.degrees(minDec), uncertainty,
1144-
)
1167+
fits_header = format_fits_header(
1168+
(event_metadata.run_id, event_metadata.event_id, event_metadata.event_type),
1169+
0,
1170+
np.degrees(minRA),
1171+
np.degrees(minDec),
1172+
uncertainty,
1173+
)
11451174
mmap_nside = healpy.get_nside(master_map)
11461175

11471176
# Pixel numbers as is gives a map that is reflected

0 commit comments

Comments
 (0)