diff --git a/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py b/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py index 7baf7477c187c5d30d068823edee58af31c44338..4ae665d458d2930ec211491567fb31b6c338889a 100644 --- a/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py +++ b/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py @@ -8,6 +8,7 @@ from .holography_dataset_definitions import * from .holography_observation import HolographyObservation from .holography_specification import HolographySpecification from numpy import isnan + logger = logging.getLogger(__file__) @@ -37,6 +38,7 @@ def compare_nested_collections(dict1, dict2): return False return result + def bytestring_list_to_string(list): return [item.decode('utf-8') for item in list] @@ -63,54 +65,54 @@ class HolographyDataset(): initialised with an assignment to their respective constructors. ''' # float, HDS version - self.version = HOLOGRAPHY_DATA_SET_VERSION + self._version = HOLOGRAPHY_DATA_SET_VERSION # list of ints - self.rcu_list = list() + self._rcu_list = list() # integer - self.mode = None + self._mode = None # list of strings - self.sas_ids = list() + self._sas_ids = list() # string - self.target_station_name = None + self._target_station_name = None # list of 3 floats - self.target_station_position = None + self._target_station_position = None # name of the source (str) - self.source_name = None + self._source_name = None # position of the source array[ (RA, numpy.float64), (DEC, numpy.float64), (EPOCH, 'S10')] - self.source_position = None + self._source_position = None # date time when the observation started in MJD in seconds (float) - self.start_time = None + self._start_time = None # date time when the observation started in MJD in seconds (float) - self.end_time = None + self._end_time = None # array(3,3), translation matrix for # (RA, DEC) <-> (l, m) conversion - self.rotation_matrix = None + self._rotation_matrix = None # list of beamlet numbers - self.beamlets = list() + self._beamlets = list() # The central beam or beamlet for each frequency - self.central_beamlets = dict() - self.calibration_tables = dict() + self._central_beamlets = dict() + self._calibration_tables = dict() self.derived_calibration_tables = dict() # coordinates of the antenna position in the target - self.antenna_field_position = list() + self._antenna_field_position = list() # list of reference station names - self.reference_stations = list() + self._reference_stations = list() # list of _frequencies - self.frequencies = list() + self._frequencies = list() # dict(frequency: # array that contains the ra_dec of which a beam # points at given a frequency and a beamlet number # numpy.dtype([('RA', numpy.float64), # ('DEC',numpy.float64), # ('EPOCH', 'S10')]) - self.ra_dec = dict() + self._ra_dec = dict() # dict(reference_station_name: # dict(frequency: # dict(beamlet_number: @@ -131,6 +133,70 @@ class HolographyDataset(): # numpy.array() self.derived_data = None + @property + def version(self): + return self._version + + @property + def rcu_list(self): + return self._rcu_list + + @property + def mode(self): + return self._mode + + @property + def sas_ids(self): + return self._sas_ids + + @property + def target_station_name(self): + return self._target_station_name + + @property + def target_station_position(self): + return self._target_station_position + + @property + def source_name(self): + return self._source_name + + @property + def source_position(self): + return self.source_position + + @property + def start_time(self): + return self._start_time + + @property + def end_time(self): + return self._end_time + + def rotation_matrix(self): + return self._rotation_matrix + + def beamlets(self): + return self._beamlets + + def central_beamlets(self): + return self._central_beamlets + + def calibration_tables(self): + return self._calibration_tables + + def antenna_field_position(self): + return self._antenna_field_position + + def reference_stations(self): + return self._reference_stations + + def frequencies(self): + return self._frequencies + + def ra_dec(self): + return self._ra_dec + def __eq__(self, hds=None): ''' This comparison operator compares the values of the relevant members of @@ -173,7 +239,6 @@ class HolographyDataset(): return False return equality - def find_central_beamlets(self, source, ra_dec, frequencies, beamlets): ''' This function finds the central beamlet of a target station for every @@ -233,8 +298,8 @@ class HolographyDataset(): logger.debug('reading data') self.__read_data(station_name, list_of_hbs_ms_tuples) logger.debug('read data') - self.central_beamlets = self.find_central_beamlets(self.source_position, self.ra_dec, - self.frequencies, self.beamlets) + self._central_beamlets = self.find_central_beamlets(self._source_position, self._ra_dec, + self._frequencies, self._beamlets) logger.info("Creation of a holography data set for station \"%s\" done.", station_name) except Exception as e: logger.exception("Error creating dataset for station \"%s\": %s", station_name, e) @@ -298,9 +363,9 @@ class HolographyDataset(): if station_name in hbs.target_station_names: frequency = ho.frequency frequency_string = str(frequency) - for beamlet in self.beamlets: + for beamlet in self._beamlets: beamlet_string = str(beamlet) - if beamlet_string not in self.ra_dec[frequency_string]: + if beamlet_string not in self._ra_dec[frequency_string]: logger.error('missing pointing %s at frequency %s for station %s skipping', beamlet_string, frequency_string, @@ -310,9 +375,9 @@ class HolographyDataset(): ho.ms_for_a_given_beamlet_number[ beamlet].read_cross_correlation_time_flags_lm_per_station_name( station_name, - self.reference_stations, - self.ra_dec[frequency_string][beamlet_string], - self.rotation_matrix) + self._reference_stations, + self._ra_dec[frequency_string][beamlet_string], + self._rotation_matrix) for reference_station_index, reference_station in \ enumerate(reference_station_names): @@ -378,7 +443,7 @@ class HolographyDataset(): sas_ids.add(ho.sas_id) - self.target_station_name = station_name + self._target_station_name = station_name reference_stations.update(hbs.reference_station_names) try: single_beamlet = int(beam_specification.beamlets) @@ -394,20 +459,20 @@ class HolographyDataset(): beam_specification.virtual_pointing['coordinate_system']) else: continue - self.frequencies = sorted(frequencies) - self.beamlets = sorted(beamlets) - self.start_time = start_mjd - self.end_time = end_mjd - self.sas_ids = list(sas_ids) - self.reference_stations = list(reference_stations) - self.rcu_list = list(rcu_list) - - self.ra_dec = dict() - for frequency in self.frequencies: + self._frequencies = sorted(frequencies) + self._beamlets = sorted(beamlets) + self._start_time = start_mjd + self._end_time = end_mjd + self._sas_ids = list(sas_ids) + self._reference_stations = list(reference_stations) + self._rcu_list = list(rcu_list) + + self._ra_dec = dict() + for frequency in self._frequencies: frequency_string = str(frequency) - if frequency not in self.ra_dec: - self.ra_dec[frequency_string] = dict() - for beamlet in self.beamlets: + if frequency not in self._ra_dec: + self._ra_dec[frequency_string] = dict() + for beamlet in self._beamlets: beamlet_string = str(beamlet) ra, dec, _ = virtual_pointing[(frequency, beamlet)] if isnan(ra) or isnan(dec): @@ -416,7 +481,7 @@ class HolographyDataset(): # skip if the pointing is ill specified continue - self.ra_dec[frequency_string][beamlet_string] = numpy.array( + self._ra_dec[frequency_string][beamlet_string] = numpy.array( virtual_pointing[(frequency, beamlet)], dtype=HDS_coordinate_type) @@ -429,11 +494,11 @@ class HolographyDataset(): station_name) logger.debug('selecting used antenna ids %s', used_antennas) - self.antenna_field_position = [list(station_position - antenna_offset) - for antenna_id, antenna_offset in enumerate(tile_offset) - if antenna_id in used_antennas] - self.target_station_position = list(station_position) - self.rotation_matrix = axes_coordinates + self._antenna_field_position = [list(station_position - antenna_offset) + for antenna_id, antenna_offset in enumerate(tile_offset) + if antenna_id in used_antennas] + self._target_station_position = list(station_position) + self._rotation_matrix = axes_coordinates if station_name not in target_stations: logger.error('Station %s was not involved in the observation.' @@ -443,18 +508,18 @@ class HolographyDataset(): % station_name, ) if len(mode) == 1: - self.mode = mode.pop() + self._mode = mode.pop() else: raise ValueError('Multiple RCUs mode are not supported') if len(source_position) == 1: - self.source_position = numpy.array(source_position.pop(), dtype=HDS_coordinate_type) + self._source_position = numpy.array(source_position.pop(), dtype=HDS_coordinate_type) else: logger.error('Multiple source positions are not supported: %s', source_position) raise ValueError('Multiple source positions are not supported') if len(source_name) == 1: - self.source_name = source_name.pop() + self._source_name = source_name.pop() else: raise ValueError('Multiple source name are not supported') @@ -469,23 +534,23 @@ class HolographyDataset(): if text is not None and isinstance(text, str): logger.info("%s", text) if hds is not None and isinstance(hds, HolographyDataset) is True: - logger.info("Version = %s", hds.version) - logger.info("Mode = %s", hds.mode) - logger.info("RCU list = ", hds.rcu_list) - logger.info("SAS IDs = %s", hds.sas_ids) - logger.info("Target station name = %s", hds.target_station_name) - logger.info("Target station position = %s", hds.target_station_position) - logger.info("Source name = %s", hds.source_name) - logger.info("Source position = %s", hds.source_position) - logger.info("Central beamlets = %s", hds.central_beamlets) - logger.info("Start time = %s", hds.start_time) - logger.info("End time = %s", hds.end_time) - logger.info("Rotation matrix = %s", hds.rotation_matrix) - logger.info("Antenna field position = %s", hds.antenna_field_position) - logger.info("Reference stations = %s", hds.reference_stations) - logger.info("Frequencies = %s", hds.frequencies) - logger.info("Beamlets = %s", hds.beamlets) - logger.info("RA DEC = %s", hds.ra_dec) + logger.info("Version = %s", hds._version) + logger.info("Mode = %s", hds._mode) + logger.info("RCU list = ", hds._rcu_list) + logger.info("SAS IDs = %s", hds._sas_ids) + logger.info("Target station name = %s", hds._target_station_name) + logger.info("Target station position = %s", hds._target_station_position) + logger.info("Source name = %s", hds._source_name) + logger.info("Source position = %s", hds._source_position) + logger.info("Central beamlets = %s", hds._central_beamlets) + logger.info("Start time = %s", hds._start_time) + logger.info("End time = %s", hds._end_time) + logger.info("Rotation matrix = %s", hds._rotation_matrix) + logger.info("Antenna field position = %s", hds._antenna_field_position) + logger.info("Reference stations = %s", hds._reference_stations) + logger.info("Frequencies = %s", hds._frequencies) + logger.info("Beamlets = %s", hds._beamlets) + logger.info("RA DEC = %s", hds._ra_dec) logger.info("Data = %s", hds.data) else: logger.warning( @@ -622,42 +687,42 @@ class HolographyDataset(): f = h5py.File(path, "r") result = HolographyDataset() - result.version = f.attrs[HDS_VERSION] - result.mode = f.attrs[HDS_MODE] - result.rcu_list = list(f.attrs[HDS_RCU_LIST]) - result.sas_ids = list(f.attrs[HDS_SAS_ID]) - result.target_station_name = f.attrs[HDS_TARGET_STATION_NAME] - result.target_station_position = list(f.attrs[HDS_TARGET_STATION_POSITION]) - result.source_name = f.attrs[HDS_SOURCE_NAME] - result.source_position = numpy.array(f.attrs[HDS_SOURCE_POSITION]) - (result.start_time, result.end_time) = f.attrs[HDS_OBSERVATION_TIME] - result.rotation_matrix = f.attrs[HDS_ROTATION_MATRIX] - result.beamlets = list(f.attrs[HDS_BEAMLETS]) - result.antenna_field_position = f.attrs[HDS_ANTENNA_FIELD_POSITION].tolist() - result.reference_stations = bytestring_list_to_string(list(f[HDS_REFERENCE_STATION])) - - result.frequencies = list(f[HDS_FREQUENCY]) + result._version = f.attrs[HDS_VERSION] + result._mode = f.attrs[HDS_MODE] + result._rcu_list = list(f.attrs[HDS_RCU_LIST]) + result._sas_ids = list(f.attrs[HDS_SAS_ID]) + result._target_station_name = f.attrs[HDS_TARGET_STATION_NAME] + result._target_station_position = list(f.attrs[HDS_TARGET_STATION_POSITION]) + result._source_name = f.attrs[HDS_SOURCE_NAME] + result._source_position = numpy.array(f.attrs[HDS_SOURCE_POSITION]) + (result._start_time, result._end_time) = f.attrs[HDS_OBSERVATION_TIME] + result._rotation_matrix = f.attrs[HDS_ROTATION_MATRIX] + result._beamlets = list(f.attrs[HDS_BEAMLETS]) + result._antenna_field_position = f.attrs[HDS_ANTENNA_FIELD_POSITION].tolist() + result._reference_stations = bytestring_list_to_string(list(f[HDS_REFERENCE_STATION])) + + result._frequencies = list(f[HDS_FREQUENCY]) if HDS_CALIBRATION_TABLES in f: for mode in f[HDS_CALIBRATION_TABLES]: uri = '/%s/%s' % (HDS_CALIBRATION_TABLES, mode) - result.calibration_tables[mode] = \ + result._calibration_tables[mode] = \ CalibrationTable.load_from_hdf(file_descriptor=f, uri=uri) if HDS_DERIVED_CAL_TABLES in f: for mode in f[HDS_DERIVED_CAL_TABLES]: uri = '/%s/%s' % (HDS_DERIVED_CAL_TABLES, mode) - result.calibration_tables[mode] = \ + result._calibration_tables[mode] = \ CalibrationTable.load_from_hdf(file_descriptor=f, uri=uri) - result.ra_dec = dict() + result._ra_dec = dict() for frequency in f["RA_DEC"].keys(): for beamlet in f["RA_DEC"][frequency].keys(): - if frequency not in result.ra_dec: - result.ra_dec[frequency] = dict() + if frequency not in result._ra_dec: + result._ra_dec[frequency] = dict() - result.ra_dec[frequency][beamlet] = numpy.array(f["RA_DEC"][frequency][beamlet]) + result._ra_dec[frequency][beamlet] = numpy.array(f["RA_DEC"][frequency][beamlet]) beamlets = set() for reference_station in f["CROSSCORRELATION"].keys(): @@ -667,7 +732,7 @@ class HolographyDataset(): result.data = f['CROSSCORRELATION'] - result.central_beamlets = HolographyDataset._read_grouped_data(f, HDS_CENTRAL_BEAMLETS) + result._central_beamlets = HolographyDataset._read_grouped_data(f, HDS_CENTRAL_BEAMLETS) if '/DERIVED_DATA' in f: result.derived_data = f['/DERIVED_DATA'] @@ -683,7 +748,7 @@ class HolographyDataset(): def insert_calibration_table(self, caltable: CalibrationTable): mode = caltable.observation_mode - self.calibration_tables[mode] = caltable + self._calibration_tables[mode] = caltable def store_to_file(self, path): """ @@ -700,33 +765,33 @@ class HolographyDataset(): f.attrs[HDS_VERSION] = HOLOGRAPHY_DATA_SET_VERSION # RCU list - f.attrs[HDS_RCU_LIST] = numpy.array(self.rcu_list, dtype=int) + f.attrs[HDS_RCU_LIST] = numpy.array(self._rcu_list, dtype=int) # RCU mode - f.attrs[HDS_MODE] = self.mode + f.attrs[HDS_MODE] = self._mode # Moan... Again this needs to be stored like that. - f.attrs[HDS_SAS_ID] = numpy.array(self.sas_ids, + f.attrs[HDS_SAS_ID] = numpy.array(self._sas_ids, dtype=h5py.special_dtype(vlen=str)) - f.attrs[HDS_TARGET_STATION_NAME] = self.target_station_name - f.attrs[HDS_TARGET_STATION_POSITION] = self.target_station_position - f.attrs[HDS_SOURCE_NAME] = self.source_name - - f.attrs[HDS_SOURCE_POSITION] = self.source_position - f.attrs[HDS_OBSERVATION_TIME] = numpy.array([self.start_time, self.end_time]) - f.attrs[HDS_ROTATION_MATRIX] = self.rotation_matrix - f.attrs[HDS_ANTENNA_FIELD_POSITION] = self.antenna_field_position - f.attrs[HDS_BEAMLETS] = self.beamlets + f.attrs[HDS_TARGET_STATION_NAME] = self._target_station_name + f.attrs[HDS_TARGET_STATION_POSITION] = self._target_station_position + f.attrs[HDS_SOURCE_NAME] = self._source_name + + f.attrs[HDS_SOURCE_POSITION] = self._source_position + f.attrs[HDS_OBSERVATION_TIME] = numpy.array([self._start_time, self._end_time]) + f.attrs[HDS_ROTATION_MATRIX] = self._rotation_matrix + f.attrs[HDS_ANTENNA_FIELD_POSITION] = self._antenna_field_position + f.attrs[HDS_BEAMLETS] = self._beamlets # Store the list of reference stations and _frequencies. We just # want to keep 'em around for quick reference. - f[HDS_REFERENCE_STATION] = to_numpy_array_string(self.reference_stations) - f[HDS_FREQUENCY] = self.frequencies + f[HDS_REFERENCE_STATION] = to_numpy_array_string(self._reference_stations) + f[HDS_FREQUENCY] = self._frequencies f.create_group(HDS_CALIBRATION_TABLES) - for mode in self.calibration_tables: - self.calibration_tables[mode].store_to_hdf(f, - '/{}/{}'.format( - HDS_CALIBRATION_TABLES, mode)) + for mode in self._calibration_tables: + self._calibration_tables[mode].store_to_hdf(f, + '/{}/{}'.format( + HDS_CALIBRATION_TABLES, mode)) for mode in self.derived_calibration_tables: self.derived_calibration_tables[mode].store_to_hdf(f, '/{}/{}'.format( @@ -734,7 +799,7 @@ class HolographyDataset(): mode)) HolographyDataset._store_grouped_data(h5file=f, uri='/RA_DEC', - data_to_store=self.ra_dec) + data_to_store=self._ra_dec) # We create groups for the reference stations and the _frequencies. # Then we store the data samples [XX, YY, XY, YX, t, l, m, flag] @@ -746,7 +811,7 @@ class HolographyDataset(): HolographyDataset._store_grouped_data(h5file=f, uri=HDS_CENTRAL_BEAMLETS, - data_to_store=self.central_beamlets) + data_to_store=self._central_beamlets) if self.derived_data: self._store_grouped_data(h5file=f, uri='/DERIVED_DATA',