コード例 #1
0
    def _generator(self):
        """
        Stereo event generator. Yields DataContainer instances, filled
        with the read event data.

        Returns
        -------

        """
        counter = 0
        data = DataContainer()
        data.meta['origin'] = "MAGIC"
        data.meta['input_url'] = self.input_url
        data.meta['is_simulation'] = True
        data.mcheader = self._mc_header

        if self.calib_M1 is not None and self.calib_M2 is not None:
            #Reading data from root file for Events table
            eventid_M1 = np.asarray(
                self.calib_M1["MRawEvtHeader.fStereoEvtNumber"].array())
            eventid_M2 = np.asarray(
                self.calib_M2["MRawEvtHeader.fStereoEvtNumber"].array())
            zenith = np.asarray(self.calib_M1["MMcEvt.fTheta"].array())
            pointing_altitude = np.asarray(
                self.calib_M1["MPointingPos.fZd"].array())
            azimuth = np.asarray(self.calib_M1["MMcEvt.fPhi"].array())
            pointing_azimuth = np.asarray(
                self.calib_M1["MPointingPos.fAz"].array())
            core_x = np.asarray(self.calib_M1["MMcEvt.fCoreX"].array())
            core_y = np.asarray(self.calib_M1["MMcEvt.fCoreY"].array())
            mc_energy = np.asarray(
                self.calib_M1["MMcEvt.fEnergy"].array()) / 1000.0
            h_first_int = np.asarray(
                self.calib_M1["MMcEvt.fZFirstInteraction"].array())

            #Reading data from root file for Image table
            charge_M1 = np.asarray(
                self.calib_M1["MCerPhotEvt.fPixels.fPhot"].array())
            peak_time_M1 = np.asarray(
                self.calib_M1["MArrivalTime.fData"].array())
            charge_M2 = np.asarray(
                self.calib_M2["MCerPhotEvt.fPixels.fPhot"].array())
            peak_time_M2 = np.asarray(
                self.calib_M2["MArrivalTime.fData"].array())

        if self.superstar is not None:
            #Reading data from root file for Events table
            eventid_M1 = np.asarray(
                self.superstar["MRawEvtHeader_1.fStereoEvtNumber"].array())
            eventid_M2 = np.asarray(
                self.superstar["MRawEvtHeader_2.fStereoEvtNumber"].array())
            zenith = np.asarray(self.superstar["MMcEvt_1.fTheta"].array())
            pointing_altitude = np.asarray(
                self.superstar["MPointingPos_1.fZd"].array())
            azimuth = np.asarray(self.superstar["MMcEvt_1.fPhi"].array())
            pointing_azimuth = np.asarray(
                self.superstar["MPointingPos_1.fAz"].array())
            core_x = np.asarray(self.superstar["MMcEvt_1.fCoreX"].array())
            core_y = np.asarray(self.superstar["MMcEvt_1.fCoreY"].array())
            mc_energy = np.asarray(
                self.superstar["MMcEvt_1.fEnergy"].array()) / 1000.0
            h_first_int = np.asarray(
                self.superstar["MMcEvt_1.fZFirstInteraction"].array())

            #Reading data from root file for Parameter table
            hillas_intensity_M1 = np.asarray(
                self.superstar["MHillas_1.fSize"].array())
            hillas_intensity_M2 = np.asarray(
                self.superstar["MHillas_2.fSize"].array())
            hillas_x_M1 = np.asarray(
                self.superstar["MHillas_1.fMeanX"].array())
            hillas_x_M2 = np.asarray(
                self.superstar["MHillas_2.fMeanX"].array())
            hillas_y_M1 = np.asarray(
                self.superstar["MHillas_1.fMeanY"].array())
            hillas_y_M2 = np.asarray(
                self.superstar["MHillas_2.fMeanY"].array())
            hillas_r_M1 = np.sqrt(
                np.power(hillas_x_M1, 2) + np.power(hillas_y_M1, 2))
            hillas_r_M2 = np.sqrt(
                np.power(hillas_x_M2, 2) + np.power(hillas_y_M2, 2))
            hillas_phi_M1 = np.arctan2(hillas_y_M1, hillas_x_M1)
            hillas_phi_M2 = np.arctan2(hillas_y_M2, hillas_x_M2)
            hillas_length_M1 = np.asarray(
                self.superstar["MHillas_1.fLength"].array())
            hillas_length_M2 = np.asarray(
                self.superstar["MHillas_2.fLength"].array())
            hillas_width_M1 = np.asarray(
                self.superstar["MHillas_1.fWidth"].array())
            hillas_width_M2 = np.asarray(
                self.superstar["MHillas_2.fWidth"].array())
            hillas_psi_M1 = np.asarray(
                self.superstar["MHillas_1.fDelta"].array())
            hillas_psi_M2 = np.asarray(
                self.superstar["MHillas_2.fDelta"].array())
            hillas_skewness_M1 = np.asarray(
                self.superstar["MHillasExt_1.fM3Long"].array())
            hillas_skewness_M2 = np.asarray(
                self.superstar["MHillasExt_2.fM3Long"].array())

            leakage_intensity_1_M1 = np.asarray(
                self.superstar["MNewImagePar_1.fLeakage1"].array())
            leakage_intensity_1_M2 = np.asarray(
                self.superstar["MNewImagePar_2.fLeakage1"].array())
            leakage_intensity_2_M1 = np.asarray(
                self.superstar["MNewImagePar_1.fLeakage2"].array())
            leakage_intensity_2_M2 = np.asarray(
                self.superstar["MNewImagePar_2.fLeakage2"].array())

            num_islands_M1 = np.asarray(
                self.superstar["MCerPhotEvt_1.fNumIslands"].array())
            num_islands_M2 = np.asarray(
                self.superstar["MCerPhotEvt_2.fNumIslands"].array())

            #Reading data from root file for Image table (peak time and image mask not )
            charge_M1 = np.asarray(
                self.superstar["MCerPhotEvt_1.fPixels.fPhot"].array())
            peak_time_M1 = np.zeros((charge_M1.shape[0], 1039))
            image_mask_M1 = np.zeros((charge_M1.shape[0], 1039), dtype=bool)
            charge_M2 = np.asarray(
                self.superstar["MCerPhotEvt_2.fPixels.fPhot"].array())
            peak_time_M2 = np.zeros((charge_M2.shape[0], 1039))
            image_mask_M2 = np.zeros((charge_M2.shape[0], 1039), dtype=bool)

        # Get the shower primary id
        shower_primary_id = 1
        if self.file_list[0].split("/")[-1].startswith("GA"):
            shower_primary_id = 1

        #Iterating over all events, and saving only stereo ones
        total_events = min(len(charge_M1), len(charge_M2))
        tels_with_data = {1, 2}
        for i in range(0, total_events):
            if eventid_M1[i] != 0:
                obs_id = self.run_number
                event_id = eventid_M1[i]
                i2 = np.where(eventid_M2 == eventid_M1[i])
                i2 = i2[0].astype(int)
                data.count = counter

                # Setting up the Data container
                data.index.obs_id = obs_id
                data.index.event_id = event_id
                data.r0.tel.clear()
                data.r1.tel.clear()
                data.dl0.tel.clear()

                # Adding the array pointing in the pointing container
                data.pointing.array_altitude = u.Quantity(
                    np.deg2rad(90.0 - pointing_altitude[i]), u.rad)
                data.pointing.array_azimuth = u.Quantity(
                    np.deg2rad(pointing_azimuth[i]), u.rad)

                # Filling the DL1 container with the event data
                for tel_id in tels_with_data:
                    #Adding telescope pointing container
                    data.pointing.tel[tel_id].azimuth = u.Quantity(
                        np.deg2rad(pointing_azimuth[i]), u.rad)
                    data.pointing.tel[tel_id].altitude = u.Quantity(
                        np.deg2rad(90.0 - pointing_altitude[i]), u.rad)

                    #Adding MC data
                    data.mc.alt = Angle(np.pi / 2.0 - zenith[i], u.rad)
                    data.mc.az = Angle(
                        np.deg2rad(180.0 - 7.0) - azimuth[i], u.rad)
                    data.mc.x_max = u.Quantity(0, X_MAX_UNIT)
                    data.mc.h_first_int = u.Quantity(h_first_int[i], u.m)
                    data.mc.core_x = u.Quantity(core_x[i], u.m)
                    data.mc.core_y = u.Quantity(core_y[i], u.m)
                    data.mc.energy = u.Quantity(mc_energy[i], u.TeV)
                    data.mc.shower_primary_id = shower_primary_id

                    if self.superstar is not None:
                        leakage_values = LeakageContainer()
                        hillas_parameters_values = HillasParametersContainer()
                        concentration_values = ConcentrationContainer()
                        timing_values = TimingParametersContainer()
                        morphology_values = MorphologyContainer()

                    # Adding charge, peak time and parameters
                    if tel_id == 1:
                        data.dl1.tel[tel_id].image = charge_M1[i][:1039]
                        data.dl1.tel[tel_id].peak_time = peak_time_M1[i][:1039]
                        if self.superstar is not None:
                            data.dl1.tel[tel_id].image_mask = image_mask_M1[
                                i][:1039]

                            hillas_parameters_values[
                                "intensity"] = hillas_intensity_M1[i]
                            hillas_parameters_values["x"] = u.Quantity(
                                hillas_x_M1[i], unit=u.mm)
                            hillas_parameters_values["y"] = u.Quantity(
                                hillas_y_M1[i], unit=u.mm)
                            hillas_parameters_values["r"] = u.Quantity(
                                hillas_r_M1[i], unit=u.mm)
                            hillas_parameters_values["phi"] = u.Quantity(
                                hillas_phi_M1[i], unit=u.rad)
                            hillas_parameters_values["length"] = u.Quantity(
                                hillas_length_M1[i], unit=u.mm)
                            hillas_parameters_values["width"] = u.Quantity(
                                hillas_width_M1[i], unit=u.mm)
                            hillas_parameters_values["psi"] = u.Quantity(
                                hillas_psi_M1[i], unit=u.rad)
                            hillas_parameters_values[
                                "skewness"] = hillas_skewness_M1[i]

                            leakage_values[
                                "intensity_width_1"] = leakage_intensity_1_M1[
                                    i]
                            leakage_values[
                                "intensity_width_2"] = leakage_intensity_2_M1[
                                    i]

                            morphology_values["num_pixels"] = 1039
                            morphology_values["num_islands"] = num_islands_M1[
                                i]

                    else:
                        data.dl1.tel[tel_id].image = charge_M2[i][:1039]
                        data.dl1.tel[tel_id].peak_time = peak_time_M2[i][:1039]
                        if self.superstar is not None:
                            data.dl1.tel[tel_id].image_mask = image_mask_M2[
                                i][:1039]

                            hillas_parameters_values[
                                "intensity"] = hillas_intensity_M2[i]
                            hillas_parameters_values["x"] = u.Quantity(
                                hillas_x_M2[i], unit=u.mm)
                            hillas_parameters_values["y"] = u.Quantity(
                                hillas_y_M2[i], unit=u.mm)
                            hillas_parameters_values["r"] = u.Quantity(
                                hillas_r_M2[i], unit=u.mm)
                            hillas_parameters_values["phi"] = u.Quantity(
                                hillas_phi_M2[i], unit=u.rad)
                            hillas_parameters_values["length"] = u.Quantity(
                                hillas_length_M2[i], unit=u.mm)
                            hillas_parameters_values["width"] = u.Quantity(
                                hillas_width_M2[i], unit=u.mm)
                            hillas_parameters_values["psi"] = u.Quantity(
                                hillas_psi_M2[i], unit=u.rad)
                            hillas_parameters_values[
                                "skewness"] = hillas_skewness_M2[i]

                            leakage_values[
                                "intensity_width_1"] = leakage_intensity_1_M2[
                                    i]
                            leakage_values[
                                "intensity_width_2"] = leakage_intensity_2_M2[
                                    i]

                            morphology_values["num_pixels"] = 1039
                            morphology_values["num_islands"] = num_islands_M2[
                                i]

                    if self.superstar is not None:
                        data.dl1.tel[
                            tel_id].parameters.leakage = leakage_values
                        data.dl1.tel[
                            tel_id].parameters.hillas = hillas_parameters_values
                        data.dl1.tel[
                            tel_id].parameters.concentration = concentration_values
                        data.dl1.tel[tel_id].parameters.timing = timing_values
                        data.dl1.tel[
                            tel_id].parameters.morphology = morphology_values

                # Setting the telescopes with data
                data.r0.tels_with_data = tels_with_data
                data.r1.tels_with_data = tels_with_data
                data.dl0.tels_with_data = tels_with_data

                yield data
                counter += 1
        return
コード例 #2
0
    def _generator(self):
        """
        Stereo event generator. Yields DataContainer instances, filled
        with the read event data.
        
        Returns
        -------
        
        """
        counter = 0
        data = DataContainer()
        data.meta['origin'] = "MAGIC"
        data.meta['input_url'] = self.input_url
        data.meta['is_simulation'] = True
        data.mcheader = self._mc_header
        #Reading data from root file for Events table
        eventid_M1 = np.asarray(
            self.event_M1["MRawEvtHeader.fStereoEvtNumber"].array())
        eventid_M2 = np.asarray(
            self.event_M2["MRawEvtHeader.fStereoEvtNumber"].array())

        src_pos_cam_Y = np.asarray(self.event_M1["MSrcPosCam.fY"].array())

        pointing_altitude = np.asarray(
            self.event_M1["MPointingPos.fZd"].array())

        src_pos_cam_X = np.asarray(self.event_M1["MSrcPosCam.fX"].array())

        pointing_azimuth = np.asarray(
            self.event_M1["MPointingPos.fAz"].array())

        core_x = np.asarray(self.event_M1["MMcEvt.fCoreX"].array())
        core_y = np.asarray(self.event_M1["MMcEvt.fCoreY"].array())

        mc_energy = np.asarray(
            self.event_M1["MMcEvt.fEnergy"].array()) / 1000.0
        h_first_int = np.asarray(
            self.event_M1["MMcEvt.fZFirstInteraction"].array())

        mask = r".([A-Z]+)_M\d_za\d+to\d+_\d_\d+_Y_.*"
        primary_id = re.findall(mask, self.file_list[0])[0]
        if primary_id == 'GA':
            shower_primary_id = 1

        stereo_total = np.max(eventid_M1)
        #Reading data from root file for Image table

        charge_M1 = self.event_M1["MCerPhotEvt.fPixels.fPhot"].array()
        peak_time_M1 = self.event_M1["MArrivalTime.fData"].array()
        charge_M1 = np.asarray(charge_M1)
        peak_time_M1 = np.asarray(peak_time_M1)

        charge_M2 = self.event_M2["MCerPhotEvt.fPixels.fPhot"].array()
        peak_time_M2 = self.event_M2["MArrivalTime.fData"].array()
        charge_M2 = np.asarray(charge_M2)
        peak_time_M2 = np.asarray(peak_time_M2)

        total_events = min(
            len(self.event_M1["MCerPhotEvt.fPixels.fPhot"].array()),
            len(self.event_M2["MCerPhotEvt.fPixels.fPhot"].array()))
        #Iterating over all events, and saving only stereo ones
        tels_in_file = ["m1", "m2"]
        tels_with_data = {1, 2}
        for i in range(0, total_events):
            if eventid_M1[i] != 0:
                obs_id = self.run_number
                event_id = eventid_M1[i]
                i2 = np.where(eventid_M2 == eventid_M1[i])
                i2 = i2[0].astype(int)
                data.count = counter

                # Setting up the Data container
                data.index.obs_id = obs_id
                data.index.event_id = event_id
                data.r0.tel.clear()
                data.r1.tel.clear()
                data.dl0.tel.clear()

                # Filling the DL1 container with the event data
                for tel_i, tel_id in enumerate(tels_in_file):

                    #Adding telescope pointing container

                    data.pointing.tel[tel_i + 1].azimuth = u.Quantity(
                        np.deg2rad(pointing_azimuth[i]), u.rad)
                    data.pointing.tel[tel_i + 1].altitude = u.Quantity(
                        np.deg2rad(90.0 - pointing_altitude[i]), u.rad)

                    #Adding MC data
                    #The src_pos_cam_X/src_pos_cam_Y values are stored as alt/az to follow the generic data format.
                    data.mc.alt = Angle(np.deg2rad(src_pos_cam_Y[i] * 0.00337),
                                        u.rad)
                    data.mc.az = Angle(np.deg2rad(src_pos_cam_X[i] * 0.00337),
                                       u.rad)
                    data.mc.x_max = u.Quantity(0, X_MAX_UNIT)
                    data.mc.h_first_int = u.Quantity(h_first_int[i], u.m)
                    data.mc.core_x = u.Quantity(core_x[i], u.m)
                    data.mc.core_y = u.Quantity(core_y[i], u.m)
                    data.mc.energy = u.Quantity(mc_energy[i], u.TeV)
                    data.mc.shower_primary_id = shower_primary_id
                    # Adding event charge and peak positions per pixel
                    if tel_i == 0:
                        data.dl1.tel[tel_i + 1].image = charge_M1[i][:1039]
                        data.dl1.tel[tel_i +
                                     1].peak_time = peak_time_M1[i][:1039]
                    else:
                        data.dl1.tel[tel_i + 1].image = charge_M2[i][:1039]
                        data.dl1.tel[tel_i +
                                     1].peak_time = peak_time_M2[i][:1039]

                # Setting the telescopes with data
                data.r0.tels_with_data = tels_with_data
                data.r1.tels_with_data = tels_with_data
                data.dl0.tels_with_data = tels_with_data

                yield data
                counter += 1
        return
コード例 #3
0
    def _generator(self):
        """
        Stereo event generator. Yields DataContainer instances, filled
        with the read event data.

        Returns
        -------

        """
        counter = 0
        data = DataContainer()
        data.meta["origin"] = "MAGIC"
        data.meta["input_url"] = self.input_url
        data.meta["is_simulation"] = self.mc
        data.mcheader = self._header

        if self.calib_M1 is not None and self.calib_M2 is not None:
            # Reading data from root file for Events table
            shower_primary_id = self.magic_to_cta_shower_primary_id[int(
                self.superstar["MMcEvt_1.fPartId"].array()[0])]
            eventid_M1 = np.asarray(
                self.calib_M1["MRawEvtHeader.fStereoEvtNumber"].array())
            eventid_M2 = np.asarray(
                self.calib_M2["MRawEvtHeader.fStereoEvtNumber"].array())
            zenith = np.asarray(self.calib_M1["MMcEvt.fTheta"].array())
            pointing_altitude = np.asarray(
                self.calib_M1["MPointingPos.fZd"].array())
            azimuth = np.asarray(self.calib_M1["MMcEvt.fPhi"].array())
            pointing_azimuth = np.asarray(
                self.calib_M1["MPointingPos.fAz"].array())
            core_x = np.asarray(self.calib_M1["MMcEvt.fCoreX"].array())
            core_y = np.asarray(self.calib_M1["MMcEvt.fCoreY"].array())
            mc_energy = np.asarray(
                self.calib_M1["MMcEvt.fEnergy"].array()) / 1000.0
            h_first_int = np.asarray(
                self.calib_M1["MMcEvt.fZFirstInteraction"].array())

            # Reading data from root file for Image table
            charge_M1 = np.asarray(
                self.calib_M1["MCerPhotEvt.fPixels.fPhot"].array())
            peak_time_M1 = np.asarray(
                self.calib_M1["MArrivalTime.fData"].array())
            image_mask_M1 = np.asarray(self.calib_M1["CleanCharge"].array())
            for i, mask in enumerate(image_mask_M1):
                image_mask_M1[i] = np.array(mask) != 0

            charge_M2 = np.asarray(
                self.calib_M2["MCerPhotEvt.fPixels.fPhot"].array())
            peak_time_M2 = np.asarray(
                self.calib_M2["MArrivalTime.fData"].array())
            image_mask_M2 = np.asarray(self.calib_M2["CleanCharge"].array())
            for i, mask in enumerate(image_mask_M2):
                image_mask_M2[i] = np.array(mask) != 0

        if self.superstar is not None:
            # Reading data from root file for Events table
            # only read MC information if it exists
            if self.is_simulation:
                shower_primary_id = self.magic_to_cta_shower_primary_id[int(
                    self.superstar["MMcEvt_1.fPartId"].array()[0])]
                src_pos_cam_Y = np.asarray(
                    self.superstar["MSrcPosCam_1.fY"].array())
                src_pos_cam_X = np.asarray(
                    self.superstar["MSrcPosCam_1.fX"].array())
                core_x = np.asarray(self.superstar["MMcEvt_1.fCoreX"].array())
                core_y = np.asarray(self.superstar["MMcEvt_1.fCoreY"].array())
                mc_energy = (
                    np.asarray(self.superstar["MMcEvt_1.fEnergy"].array()) /
                    1000.0)
                h_first_int = np.asarray(
                    self.superstar["MMcEvt_1.fZFirstInteraction"].array())

            eventid_M1 = np.asarray(
                self.superstar["MRawEvtHeader_1.fStereoEvtNumber"].array())
            eventid_M2 = np.asarray(
                self.superstar["MRawEvtHeader_2.fStereoEvtNumber"].array())
            pointing_altitude = np.asarray(
                self.superstar["MPointingPos_1.fZd"].array())
            pointing_azimuth = np.asarray(
                self.superstar["MPointingPos_1.fAz"].array())

            # Reading data from root file for Parameter table
            hillas_intensity_M1 = np.asarray(
                self.superstar["MHillas_1.fSize"].array())
            hillas_intensity_M2 = np.asarray(
                self.superstar["MHillas_2.fSize"].array())
            hillas_x_M1 = np.asarray(
                self.superstar["MHillas_1.fMeanX"].array())
            hillas_x_M2 = np.asarray(
                self.superstar["MHillas_2.fMeanX"].array())
            hillas_y_M1 = np.asarray(
                self.superstar["MHillas_1.fMeanY"].array())
            hillas_y_M2 = np.asarray(
                self.superstar["MHillas_2.fMeanY"].array())
            hillas_r_M1 = np.sqrt(
                np.power(hillas_x_M1, 2) + np.power(hillas_y_M1, 2))
            hillas_r_M2 = np.sqrt(
                np.power(hillas_x_M2, 2) + np.power(hillas_y_M2, 2))
            hillas_phi_M1 = np.arctan2(hillas_y_M1, hillas_x_M1)
            hillas_phi_M2 = np.arctan2(hillas_y_M2, hillas_x_M2)
            hillas_length_M1 = np.asarray(
                self.superstar["MHillas_1.fLength"].array())
            hillas_length_M2 = np.asarray(
                self.superstar["MHillas_2.fLength"].array())
            hillas_width_M1 = np.asarray(
                self.superstar["MHillas_1.fWidth"].array())
            hillas_width_M2 = np.asarray(
                self.superstar["MHillas_2.fWidth"].array())
            hillas_psi_M1 = np.asarray(
                self.superstar["MHillas_1.fDelta"].array())
            hillas_psi_M2 = np.asarray(
                self.superstar["MHillas_2.fDelta"].array())
            hillas_skewness_M1 = np.asarray(
                self.superstar["MHillasExt_1.fM3Long"].array())
            hillas_skewness_M2 = np.asarray(
                self.superstar["MHillasExt_2.fM3Long"].array())

            leakage_intensity_1_M1 = np.asarray(
                self.superstar["MNewImagePar_1.fLeakage1"].array())
            leakage_intensity_1_M2 = np.asarray(
                self.superstar["MNewImagePar_2.fLeakage1"].array())
            leakage_intensity_2_M1 = np.asarray(
                self.superstar["MNewImagePar_1.fLeakage2"].array())
            leakage_intensity_2_M2 = np.asarray(
                self.superstar["MNewImagePar_2.fLeakage2"].array())

            num_islands_M1 = np.asarray(
                self.superstar["MImagePar_1.fNumIslands"].array())
            num_islands_M2 = np.asarray(
                self.superstar["MImagePar_2.fNumIslands"].array())
            x_max = np.asarray(self.superstar["MStereoPar.fXMax"].array())

            # Reading data from root file for Image table (charge, peak time and image mask)
            charge_M1 = np.asarray(self.superstar["UprootImageOrig_1"].array())
            for i, charge in enumerate(charge_M1):
                charge_M1[i] = np.array(charge)
            peak_time_M1 = np.asarray(
                self.superstar["MArrivalTime_1.fData"].array())
            image_mask_M1 = np.asarray(
                self.superstar["UprootImageOrigClean_1"].array())
            for i, mask in enumerate(image_mask_M1):
                image_mask_M1[i] = np.array(mask) != 0

            charge_M2 = np.asarray(self.superstar["UprootImageOrig_2"].array())
            for i, charge in enumerate(charge_M2):
                charge_M2[i] = np.array(charge)

            charge_M2 = np.asarray(
                self.superstar["MCerPhotEvt_2.fPixels.fPhot"].array())
            peak_time_M2 = np.asarray(
                self.superstar["MArrivalTime_2.fData"].array())
            image_mask_M2 = np.asarray(
                self.superstar["UprootImageOrigClean_2"].array())
            for i, mask in enumerate(image_mask_M2):
                image_mask_M2[i] = np.array(mask) != 0

        # Iterating over all events, and saving only stereo ones
        total_events = min(len(charge_M1), len(charge_M2))
        tels_with_data = {1, 2}
        for i in range(0, total_events):
            if eventid_M1[i] != 0:
                obs_id = self.run_number
                event_id = eventid_M1[i]
                i2 = np.where(eventid_M2 == eventid_M1[i])
                i2 = i2[0].astype(int)
                data.count = counter

                # Setting up the Data container
                data.index.obs_id = obs_id
                data.index.event_id = event_id
                data.r0.tel.clear()
                data.r1.tel.clear()
                data.dl0.tel.clear()

                # Adding the array pointing in the pointing container
                data.pointing.array_altitude = u.Quantity(
                    np.deg2rad(90.0 - pointing_altitude[i]), u.rad)
                data.pointing.array_azimuth = u.Quantity(
                    np.deg2rad(pointing_azimuth[i]), u.rad)

                # Filling the DL1 container with the event data
                for tel_id in tels_with_data:
                    # Adding telescope pointing container
                    data.pointing.tel[tel_id].azimuth = u.Quantity(
                        np.deg2rad(pointing_azimuth[i]), u.rad)
                    data.pointing.tel[tel_id].altitude = u.Quantity(
                        np.deg2rad(90.0 - pointing_altitude[i]), u.rad)

                    # Adding MC data
                    if self.is_simulation:
                        data.mc.alt = Angle(
                            np.deg2rad(src_pos_cam_Y[i] * 0.00337), u.rad)
                        data.mc.az = Angle(
                            np.deg2rad(src_pos_cam_X[i] * 0.00337), u.rad)
                        data.mc.x_max = u.Quantity(x_max[i], X_MAX_UNIT)
                        data.mc.h_first_int = u.Quantity(h_first_int[i], u.m)
                        data.mc.core_x = u.Quantity(core_x[i], u.m)
                        data.mc.core_y = u.Quantity(core_y[i], u.m)
                        data.mc.energy = u.Quantity(mc_energy[i], u.TeV)
                        data.mc.shower_primary_id = shower_primary_id

                    if self.superstar is not None:
                        leakage_values = LeakageContainer()
                        hillas_parameters_values = HillasParametersContainer()
                        concentration_values = ConcentrationContainer()
                        timing_values = TimingParametersContainer()
                        morphology_values = MorphologyContainer()

                    # Adding charge, peak time and parameters
                    if tel_id == 1:
                        data.dl1.tel[tel_id].image = charge_M1[i][:1039]
                        data.dl1.tel[tel_id].peak_time = peak_time_M1[i][:1039]
                        data.dl1.tel[tel_id].image_mask = image_mask_M1[
                            i][:1039]

                        if self.superstar is not None:
                            hillas_parameters_values[
                                "intensity"] = hillas_intensity_M1[i]
                            hillas_parameters_values["x"] = u.Quantity(
                                hillas_x_M1[i], unit=u.mm)
                            hillas_parameters_values["y"] = u.Quantity(
                                hillas_y_M1[i], unit=u.mm)
                            hillas_parameters_values["r"] = u.Quantity(
                                hillas_r_M1[i], unit=u.mm)
                            hillas_parameters_values["phi"] = u.Quantity(
                                hillas_phi_M1[i], unit=u.rad)
                            hillas_parameters_values["length"] = u.Quantity(
                                hillas_length_M1[i], unit=u.mm)
                            hillas_parameters_values["width"] = u.Quantity(
                                hillas_width_M1[i], unit=u.mm)
                            hillas_parameters_values["psi"] = u.Quantity(
                                hillas_psi_M1[i], unit=u.rad)
                            hillas_parameters_values[
                                "skewness"] = hillas_skewness_M1[i]

                            leakage_values[
                                "intensity_width_1"] = leakage_intensity_1_M1[
                                    i]
                            leakage_values[
                                "intensity_width_2"] = leakage_intensity_2_M1[
                                    i]

                            morphology_values["num_islands"] = num_islands_M1[
                                i]

                    else:
                        data.dl1.tel[tel_id].image = charge_M2[i][:1039]
                        data.dl1.tel[tel_id].peak_time = peak_time_M2[i][:1039]
                        data.dl1.tel[tel_id].image_mask = image_mask_M2[
                            i][:1039]

                        if self.superstar is not None:
                            hillas_parameters_values[
                                "intensity"] = hillas_intensity_M2[i]
                            hillas_parameters_values["x"] = u.Quantity(
                                hillas_x_M2[i], unit=u.mm)
                            hillas_parameters_values["y"] = u.Quantity(
                                hillas_y_M2[i], unit=u.mm)
                            hillas_parameters_values["r"] = u.Quantity(
                                hillas_r_M2[i], unit=u.mm)
                            hillas_parameters_values["phi"] = u.Quantity(
                                hillas_phi_M2[i], unit=u.rad)
                            hillas_parameters_values["length"] = u.Quantity(
                                hillas_length_M2[i], unit=u.mm)
                            hillas_parameters_values["width"] = u.Quantity(
                                hillas_width_M2[i], unit=u.mm)
                            hillas_parameters_values["psi"] = u.Quantity(
                                hillas_psi_M2[i], unit=u.rad)
                            hillas_parameters_values[
                                "skewness"] = hillas_skewness_M2[i]

                            leakage_values[
                                "intensity_width_1"] = leakage_intensity_1_M2[
                                    i]
                            leakage_values[
                                "intensity_width_2"] = leakage_intensity_2_M2[
                                    i]

                            morphology_values["num_islands"] = num_islands_M2[
                                i]

                    if self.superstar is not None:
                        data.dl1.tel[
                            tel_id].parameters.leakage = leakage_values
                        data.dl1.tel[
                            tel_id].parameters.hillas = hillas_parameters_values
                        data.dl1.tel[
                            tel_id].parameters.concentration = concentration_values
                        data.dl1.tel[tel_id].parameters.timing = timing_values
                        data.dl1.tel[
                            tel_id].parameters.morphology = morphology_values

                # Setting the telescopes with data
                data.r0.tels_with_data = tels_with_data
                data.r1.tels_with_data = tels_with_data
                data.dl0.tels_with_data = tels_with_data

                yield data
                counter += 1
        return
コード例 #4
0
    def _generator(self):
        with self.pyhessio.open_hessio(self.input_url) as file:
            # the container is initialized once, and data is replaced within
            # it after each yield
            counter = 0
            eventstream = file.move_to_next_event()
            data = DataContainer()
            data.meta['origin'] = "hessio"

            # some hessio_event_source specific parameters
            data.meta['input_url'] = self.input_url
            data.meta['max_events'] = self.max_events

            for event_id in eventstream:

                if counter == 0:
                    # subarray info is only available when an event is loaded,
                    # so load it on the first event.
                    data.inst.subarray = self._build_subarray_info(file)

                obs_id = file.get_run_number()
                tels_with_data = set(file.get_teldata_list())
                data.count = counter
                data.r0.obs_id = obs_id
                data.r0.event_id = event_id
                data.r0.tels_with_data = tels_with_data
                data.r1.obs_id = obs_id
                data.r1.event_id = event_id
                data.r1.tels_with_data = tels_with_data
                data.dl0.obs_id = obs_id
                data.dl0.event_id = event_id
                data.dl0.tels_with_data = tels_with_data

                # handle telescope filtering by taking the intersection of
                # tels_with_data and allowed_tels
                if len(self.allowed_tels) > 0:
                    selected = tels_with_data & self.allowed_tels
                    if len(selected) == 0:
                        continue  # skip event
                    data.r0.tels_with_data = selected
                    data.r1.tels_with_data = selected
                    data.dl0.tels_with_data = selected

                data.trig.tels_with_trigger = (
                    file.get_central_event_teltrg_list())
                time_s, time_ns = file.get_central_event_gps_time()
                data.trig.gps_time = Time(time_s * u.s,
                                          time_ns * u.ns,
                                          format='unix',
                                          scale='utc')
                data.mc.energy = file.get_mc_shower_energy() * u.TeV
                data.mc.alt = Angle(file.get_mc_shower_altitude(), u.rad)
                data.mc.az = Angle(file.get_mc_shower_azimuth(), u.rad)
                data.mc.core_x = file.get_mc_event_xcore() * u.m
                data.mc.core_y = file.get_mc_event_ycore() * u.m
                first_int = file.get_mc_shower_h_first_int() * u.m
                data.mc.h_first_int = first_int
                data.mc.x_max = file.get_mc_shower_xmax() * u.g / (u.cm**2)
                data.mc.shower_primary_id = file.get_mc_shower_primary_id()

                # mc run header data
                data.mcheader.run_array_direction = Angle(
                    file.get_mc_run_array_direction() * u.rad)

                # this should be done in a nicer way to not re-allocate the
                # data each time (right now it's just deleted and garbage
                # collected)

                data.r0.tel.clear()
                data.r1.tel.clear()
                data.dl0.tel.clear()
                data.dl1.tel.clear()
                data.mc.tel.clear()  # clear the previous telescopes

                for tel_id in tels_with_data:

                    mc = data.mc.tel[tel_id]
                    r0 = data.r0.tel[tel_id]
                    r1 = data.r1.tel[tel_id]
                    pointing = data.pointing[tel_id]

                    adc_samples = file.get_adc_sample(tel_id)
                    if adc_samples.size == 0:
                        adc_samples = file.get_adc_sum(tel_id)[..., None]
                    dc_to_pe = file.get_calibration(tel_id)
                    pedestal = file.get_pedestal(tel_id)
                    r0.waveform = adc_samples
                    r1.waveform, r1.selected_gain_channel = apply_simtel_r1_calibration(
                        adc_samples, pedestal, dc_to_pe, self.gain_selector)

                    mc.dc_to_pe = dc_to_pe
                    mc.pedestal = pedestal
                    r0.num_trig_pix = file.get_num_trig_pixels(tel_id)
                    r0.trig_pix_id = file.get_trig_pixels(tel_id)

                    # load the data per telescope/pixel
                    hessio_mc_npe = file.get_mc_number_photon_electron(tel_id)
                    mc.photo_electron_image = hessio_mc_npe
                    mc.azimuth_raw = file.get_azimuth_raw(tel_id)
                    mc.altitude_raw = file.get_altitude_raw(tel_id)
                    azimuth_cor = file.get_azimuth_cor(tel_id)
                    altitude_cor = file.get_altitude_cor(tel_id)

                    # hessioeventsource pass 0 if there is no altitude/azimuth correction
                    if azimuth_cor == 0 and mc.azimuth_raw != 0:
                        mc.azimuth_cor = np.nan
                        pointing.azimuth = u.Quantity(mc.azimuth_raw, u.rad)
                    else:
                        mc.azimuth_cor = azimuth_cor
                        pointing.azimuth = u.Quantity(azimuth_cor, u.rad)

                    if altitude_cor == 0 and mc.altitude_raw != 0:
                        mc.altitude_cor = np.nan
                        pointing.altitude = u.Quantity(mc.altitude_raw, u.rad)
                    else:
                        mc.altitude_cor = altitude_cor
                        pointing.altitude = u.Quantity(mc.altitude_cor, u.rad)

                yield data
                counter += 1

        return