diff --git a/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py b/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py index 392d439de46fdee57944c3fe98dda1de3528c7a6..b6985088b9f7b64cc98eb3e54d93b7a094dbfe28 100644 --- a/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py +++ b/CAL/CalibrationCommon/lib/datacontainers/holography_dataset.py @@ -333,25 +333,28 @@ class HolographyDataset(): result.frequencies = list(f[HDS_FREQUENCY]) result.ra_dec = dict() + for frequency in f["RA_DEC"].keys(): + for beamlet in f["RA_DEC"][frequency].keys(): + if frequency not in result.data: + result.ra_dec[frequency] = dict() + result.ra_dec[frequency][beamlet] = f["RA_DEC"][frequency][beamlet] + + beamlets = set() result.data = dict() - result.beamlets = [i for i in range(f[HDS_DATA].shape[2])] - for reference_station_index, reference_station_name in enumerate(result.reference_stations): - if reference_station_name not in result.data: - result.data[reference_station_name] = dict() - for frequency_index, frequency in enumerate(result.frequencies): - if str(frequency) not in result.ra_dec: - result.ra_dec[str(frequency)] = dict() - if str(frequency) not in result.data[reference_station_name]: - result.data[reference_station_name][str(frequency)] = dict() - for beamlet in result.beamlets: - result.ra_dec[str(frequency)][beamlet] = \ - tuple(f[HDS_RA_DEC][frequency_index, beamlet].tolist()) - - result.data[reference_station_name][str(frequency)][beamlet] = \ - f[HDS_DATA][reference_station_index, frequency_index, beamlet] - #result.ra_dec = list(f[HDS_RA_DEC]) - #result.data = f[HDS_DATA] - + for reference_station in f["CROSSCORRELATION"].keys(): + for frequency in f["CROSSCORRELATION"][reference_station].keys(): + for beamlet in f["CROSSCORRELATION"][reference_station][frequency].keys(): + beamlets.add(int(beamlet)) + if reference_station not in result.data: + result.data[reference_station] = dict() + if frequency not in result.data[reference_station]: + result.data[reference_station][frequency] = dict() + result.data[reference_station][frequency][beamlet] = f["CROSSCORRELATION"][reference_station][frequency][beamlet] + + result.beamlets = list(beamlets) + except Exception as e: + logger.exception("Cannot read the Holography Data Set data from the HDF5 file \"%s\". This is the exception that was thrown: %s", path, e) + raise e finally: if f is not None: f.close() @@ -395,30 +398,34 @@ class HolographyDataset(): f.attrs[HDS_ROTATION_MATRIX] = self.rotation_matrix f.attrs[HDS_ANTENNA_FIELD_POSITION] = self.antenna_field_position - # Data tables - f[HDS_REFERENCE_STATION] = numpy.array(self.reference_stations, - dtype = h5py.special_dtype(vlen = str)) - - f[HDS_FREQUENCY] = numpy.array(self.frequencies, dtype = float) - - f[HDS_RA_DEC] = numpy.empty([len(self.frequencies), - len(self.beamlets)], - dtype = coordinate_type) - ra_dec_dset = f[HDS_RA_DEC] - dataset = f.create_dataset("data", - (len(self.reference_stations), - len(self.frequencies), - len(self.beamlets)), - dtype = h5py.special_dtype(vlen = data_sample_type)) - + # Store the list of reference stations and frequencies. We just + # want to keep 'em around for quick reference. + f[HDS_REFERENCE_STATION] = self.reference_stations + f[HDS_FREQUENCY] = self.frequencies + + # We create groups for the reference stations and the frequencies. + # Then we store the data samples [XX, YY, XY, YX, t, l, m, flag] + # in an array. The reference station name, the frequency and the + # beamlet number (index of the data sample array) allow random + # access of the data. - for reference_station_index, reference_station in enumerate(self.reference_stations): - for frequency_index, frequency in enumerate(self.frequencies): - for beamlet in self.beamlets: - ra_dec_dset [frequency_index, beamlet] = \ - self.ra_dec[frequency][beamlet] - dataset[reference_station_index, frequency_index, beamlet] = \ - self.data[reference_station][frequency][beamlet] + f.create_group("RA_DEC") + for frequency in self.ra_dec.keys(): + f["RA_DEC"].create_group(frequency) + for beamlet in self.ra_dec[frequency].keys(): + f["RA_DEC"][frequency][beamlet] = self.ra_dec[frequency][beamlet] + + f.create_group("CROSSCORRELATION") + for reference_station in self.data.keys(): + f["CROSSCORRELATION"].create_group(reference_station) + for frequency in self.data[reference_station].keys(): + f["CROSSCORRELATION"][reference_station].create_group(frequency) + for beamlet in self.data[reference_station][frequency].keys(): + + f["CROSSCORRELATION"][reference_station][frequency][beamlet] = self.data[reference_station][frequency][beamlet] + except Exception as e: + logger.exception("Cannot write the Holography Data Set data to the HDF5 file \"%s\". This is the exception that was thrown: %s", path, e) + raise e finally: if f is not None: f.close()