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
47import io
58import itertools as it
69import json
1922from matplotlib import pyplot as plt
2023from matplotlib import text
2124
25+ from .event_tools import EventMetadata
2226from .pixelreco import NSidesDict , PixelReco
2327
2428###############################################################################
@@ -47,7 +51,6 @@ class InvalidPixelValueError(Exception):
4751###############################################################################
4852# MAIN CLASS
4953
50- # fmt: off
5154class 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