Exemplo n.º 1
0
    def fit_muon(self, centre_x, centre_y, radius, pixel_x, pixel_y, image):
        """

        Parameters
        ----------
        centre_x: float
            Centre of muon ring in the field of view from circle fitting
        centre_y: float
            Centre of muon ring in the field of view from circle fitting
        radius: float
            Radius of muon ring from circle fitting
        pixel_x: ndarray
            X position of pixels in image from circle fitting
        pixel_y: ndarray
            Y position of pixel in image from circle fitting
        image: ndarray
            Amplitude of image pixels

        Returns
        -------
        MuonIntensityParameters
        """

        # First store these parameters in the class so we can use them in minimisation
        self.image = image
        self.pixel_x = pixel_x.to(u.deg)
        self.pixel_y = pixel_y.to(u.deg)
        self.unit = pixel_x.unit

        radius.to(u.deg)
        centre_x.to(u.deg)
        centre_y.to(u.deg)

        # Return interesting stuff
        fitoutput = MuonIntensityParameter()

        init_params = {}
        init_errs = {}
        init_constrain = {}
        init_params['impact_parameter'] = 4.
        init_params['phi'] = 0.
        init_params['radius'] = radius.value
        init_params['centre_x'] = centre_x.value
        init_params['centre_y'] = centre_y.value
        init_params['ring_width'] = 0.1
        init_params['optical_efficiency_muon'] = 0.1
        init_errs['error_impact_parameter'] = 2.
        init_constrain['limit_impact_parameter'] = (0.,25.)
        init_errs['error_phi'] = 0.1
        init_errs['error_ring_width'] = 0.001 * radius.value
        init_errs['error_optical_efficiency_muon'] = 0.05
        init_constrain['limit_phi'] = (-np.pi,np.pi)
        init_constrain['fix_radius'] = True
        init_constrain['fix_centre_x'] = True
        init_constrain['fix_centre_y'] = True
        init_constrain['limit_ring_width'] = (0.,1.)
        init_constrain['limit_optical_efficiency_muon'] = (0.,1.)

        print("radius =",radius," pre migrad")

        parameter_names = init_params.keys()

        # Create Minuit object with first guesses at parameters
        # strip away the units as Minuit doesnt like them
        minuit = Minuit(
            self.likelihood,
            #forced_parameters=parameter_names,
            **init_params,
            **init_errs,
            **init_constrain,
            errordef=1.,
            print_level=1
            #pedantic=False
        )

        # Perform minimisation
        minuit.migrad()
            
        # Get fitted values
        fit_params = minuit.values
        fitoutput.impact_parameter = fit_params['impact_parameter']*u.m
        #fitoutput.phi = fit_params['phi']*u.rad
        fitoutput.impact_parameter_pos_x = fit_params['impact_parameter'] * np.cos(fit_params['phi'] * u.rad) * u.m
        fitoutput.impact_parameter_pos_y = fit_params['impact_parameter'] * np.sin(fit_params['phi'] * u.rad) * u.m
        fitoutput.ring_width = fit_params['ring_width']*self.unit
        fitoutput.optical_efficiency_muon = fit_params['optical_efficiency_muon']

        fitoutput.prediction = self.prediction

        return fitoutput
Exemplo n.º 2
0
    def fit_muon(self, centre_x, centre_y, radius, pixel_x, pixel_y, image):
        """

        Parameters
        ----------
        centre_x: float
            Centre of muon ring in the field of view from circle fitting
        centre_y: float
            Centre of muon ring in the field of view from circle fitting
        radius: float
            Radius of muon ring from circle fitting
        pixel_x: ndarray
            X position of pixels in image from circle fitting
        pixel_y: ndarray
            Y position of pixel in image from circle fitting
        image: ndarray
            Amplitude of image pixels

        Returns
        -------
        MuonIntensityParameters
        """

        # First store these parameters in the class so we can use them in minimisation
        self.image = image
        self.pixel_x = pixel_x.to(u.deg)
        self.pixel_y = pixel_y.to(u.deg)
        self.unit = pixel_x.unit

        radius.to(u.deg)
        centre_x.to(u.deg)
        centre_y.to(u.deg)

        # Return interesting stuff
        fitoutput = MuonIntensityParameter()

        init_params = {}
        init_errs = {}
        init_constrain = {}
        init_params['impact_parameter'] = 4.
        init_params['phi'] = 0.
        init_params['radius'] = radius.value
        init_params['centre_x'] = centre_x.value
        init_params['centre_y'] = centre_y.value
        init_params['ring_width'] = 0.1
        init_params['optical_efficiency_muon'] = 0.1
        init_errs['error_impact_parameter'] = 2.
        init_constrain['limit_impact_parameter'] = (0., 25.)
        init_errs['error_phi'] = 0.1
        init_errs['error_ring_width'] = 0.001 * radius.value
        init_errs['error_optical_efficiency_muon'] = 0.05
        init_constrain['limit_phi'] = (-np.pi, np.pi)
        init_constrain['fix_radius'] = True
        init_constrain['fix_centre_x'] = True
        init_constrain['fix_centre_y'] = True
        init_constrain['limit_ring_width'] = (0., 1.)
        #init_constrain['limit_optical_efficiency_muon'] = (0., 1.) # Unneeded constraint - and misleading in case of changes leading to >1 values!

        logger.debug("radius = %3.3f pre migrad", radius)

        # Create Minuit object with first guesses at parameters
        # strip away the units as Minuit doesnt like them

        minuit = Minuit(
            self.likelihood,
            # forced_parameters=parameter_names,
            **init_params,
            **init_errs,
            **init_constrain,
            errordef=0.1,
            print_level=0,
            pedantic=False
        )

        # Perform minimisation
        minuit.migrad()

        # Get fitted values
        fit_params = minuit.values

        fitoutput.impact_parameter = fit_params['impact_parameter'] * u.m
        # fitoutput.phi = fit_params['phi']*u.rad
        fitoutput.impact_parameter_pos_x = fit_params['impact_parameter'] * np.cos(
            fit_params['phi'] * u.rad) * u.m
        fitoutput.impact_parameter_pos_y = fit_params['impact_parameter'] * np.sin(
            fit_params['phi'] * u.rad) * u.m
        fitoutput.ring_width = fit_params['ring_width'] * self.unit
        fitoutput.optical_efficiency_muon = fit_params['optical_efficiency_muon']

        fitoutput.prediction = self.prediction

        return fitoutput
Exemplo n.º 3
0
    def fit_muon(self, centre_x, centre_y, radius, pixel_x, pixel_y, image):
        """

        Parameters
        ----------
        centre_x: float
            Centre of muon ring in the field of view from circle fitting
        centre_y: float
            Centre of muon ring in the field of view from circle fitting
        radius: float
            Radius of muon ring from circle fitting
        pixel_x: ndarray
            X position of pixels in image from circle fitting
        pixel_y: ndarray
            Y position of pixel in image from circle fitting
        image: ndarray
            Amplitude of image pixels

        Returns
        -------
        MuonIntensityParameters
        """

        # First store these parameters in the class so we can use them in minimisation
        self.image = image
        self.pixel_x = pixel_x.to(u.deg)
        self.pixel_y = pixel_y.to(u.deg)
        self.unit = pixel_x.unit

        radius.to(u.deg)
        centre_x.to(u.deg)
        centre_y.to(u.deg)

        # Return interesting stuff
        fitoutput = MuonIntensityParameter()



        # Create Minuit object with first guesses at parameters
        # strip away the units as Minuit doesnt like them
        minuit = Minuit(
            self.likelihood,
            impact_parameter=4,
            limit_impact_parameter=(0, 25),
            error_impact_parameter=5,
            phi=0,
            limit_phi=(-np.pi, np.pi),
            error_phi=0.1,
            radius=radius.value,
            fix_radius=True,
            error_radius=0.,
            centre_x=centre_x.value,
            fix_centre_x=True,
            error_centre_x=0.,
            centre_y=centre_y.value,
            fix_centre_y=True,
            error_centre_y=0.,
            ring_width=0.1,
            error_ring_width=0.001*radius.value,
            limit_ring_width=(0, 1),
            optical_efficiency_muon=0.1,
            error_optical_efficiency_muon=0.05,
            limit_optical_efficiency_muon=(0, 1),
            throw_nan=False,
            print_level=0,
            pedantic=False,
            errordef=1,
        )

        # Perform minimisation
        minuit.migrad()
            
        # Get fitted values
        fit_params = minuit.values
        fitoutput.impact_parameter = fit_params['impact_parameter']*u.m
        #fitoutput.phi = fit_params['phi']*u.rad
        fitoutput.ring_width = fit_params['ring_width']*self.unit
        fitoutput.optical_efficiency_muon = fit_params['optical_efficiency_muon']

        #embed()
        #
        fitoutput.prediction = self.prediction

        return fitoutput
Exemplo n.º 4
0
    def fit_muon(self, centre_x, centre_y, radius, pixel_x, pixel_y, image):
        """

        Parameters
        ----------
        centre_x: float
            Centre of muon ring in the field of view from circle fitting
        centre_y: float
            Centre of muon ring in the field of view from circle fitting
        radius: float
            Radius of muon ring from circle fitting
        pixel_x: ndarray
            X position of pixels in image from circle fitting
        pixel_y: ndarray
            Y position of pixel in image from circle fitting
        image: ndarray
            Amplitude of image pixels

        Returns
        -------
        MuonIntensityParameters
        """

        # First store these parameters in the class so we can use them in minimisation
        self.image = image
        self.pixel_x = pixel_x.to(u.deg)
        self.pixel_y = pixel_y.to(u.deg)
        self.unit = pixel_x.unit

        radius.to(u.deg)
        centre_x.to(u.deg)
        centre_y.to(u.deg)

        # Return interesting stuff
        fitoutput = MuonIntensityParameter()

        # Create Minuit object with first guesses at parameters
        # strip away the units as Minuit doesnt like them
        minuit = Minuit(
            self.likelihood,
            impact_parameter=4,
            limit_impact_parameter=(0, 25),
            error_impact_parameter=5,
            phi=0,
            limit_phi=(-np.pi, np.pi),
            error_phi=0.1,
            radius=radius.value,
            fix_radius=True,
            error_radius=0.,
            centre_x=centre_x.value,
            fix_centre_x=True,
            error_centre_x=0.,
            centre_y=centre_y.value,
            fix_centre_y=True,
            error_centre_y=0.,
            ring_width=0.1,
            error_ring_width=0.001 * radius.value,
            limit_ring_width=(0, 1),
            optical_efficiency_muon=0.1,
            error_optical_efficiency_muon=0.05,
            limit_optical_efficiency_muon=(0, 1),
            throw_nan=False,
            print_level=0,
            pedantic=False,
            errordef=1,
        )

        # Perform minimisation
        minuit.migrad()

        # Get fitted values
        fit_params = minuit.values
        fitoutput.impact_parameter = fit_params['impact_parameter'] * u.m
        #fitoutput.phi = fit_params['phi']*u.rad
        fitoutput.ring_width = fit_params['ring_width'] * self.unit
        fitoutput.optical_efficiency_muon = fit_params[
            'optical_efficiency_muon']

        #embed()
        #
        fitoutput.prediction = self.prediction

        return fitoutput