Skip to content

Gaussian

DragGaussianManager

Bases: DragPointCollection

Collection of DragPoints representing a Gaussian function.

Source code in itfit/fit_functions/gaussian/gaussian.py
class DragGaussianManager(DragPointCollection):
    """Collection of DragPoints representing a Gaussian function."""

    @staticmethod
    def function(x,A,m,s):
        """Gaussian function.

        Parameters:
            x (float):
                independent variable.
            A (float):
                value at `x=m`.
            m (float):
                central point.
            s (float):
                sigma.

        Returns:
            (float):
                `f(x) = A*exp(-0.5*(x-m)^2 / s^2)`
        """
        return A*np.exp(- 0.5 * (x - m)**2 / s**2)

    @staticmethod
    def gradient(x,A,m,s):
        """Gaussian gradient.

        Parameters:
            x (float):
                independent variable.
            A (float):
                value at `x=m`.
            m (float):
                central point.
            s (float):
                sigma.

        Returns:
            (np.array):
                ` ( exp( - 0.5*(x-m)^2 / s^2) , A / s^2 * (x-m) * exp(-0.5*(x-m)^2 / s^2), A / s^3 * (x-m)^2 * exp(-0.5*(x-m)^2 / s^2) ) ` 
        """
        dfdA = np.exp(- 0.5 * (x - m)**2 / s**2)
        dfdm = A / s**2 * (x -m) * np.exp(- 0.5 * (x - m)**2 / s**2)
        dfds = A / s**3 * (x -m)**2 * np.exp(- 0.5 * (x - m)**2 / s**2)

        return np.array([[dfdA], [dfdm], [dfds]])

    @staticmethod
    def get_args_length():
        """Gets number of arguments of `function`.

        Returns:
            (int): Number of arguments of `function`.
        """
        return 3

    def __init__(self,dragpoints: list[DragPoint],blit_manager: BlitManager):
        """Gaussian line between 2 DragPoints. Updates with them.

        Args:
            dragpoints (list[DragPoint]): line vertices.
            blit_manager (BlitManager): used for automatic ploting.
        """

        super().__init__(dragpoints,blit_manager)
        # name points based on use
        self.peak = self.dragpoints[0]
        self.side = self.dragpoints[1]
        self.update()

    def update(self,*args,**kargs):
        """Updates line data with DragObjects positions"""

        peak_x, side_x = self.get_xdata()
        A,m,s = self.get_args()

        #create x and y data of gaussian line of a gaussian that moves across two poitns
        dx = abs(peak_x-side_x) * 1.5
        x = np.linspace(min(peak_x,side_x)-dx,max(peak_x,side_x)+dx,250)
        y = self.function(x,A,m,s)

        #from data coordinates to display coordinates
        xy = np.array((x,y)).T.reshape(-1,2)
        x_data, y_data = self.set_xy(xy).T

        #set new data
        self.poly.set_xdata(x_data)
        self.poly.set_ydata(y_data)

    def get_args(self):
        """Gives Gaussian function parameters.

        Returns:
            (Tuple[float, float, float]):
                `A`, `m`, and `s` of `f(x) = A*exp(0.5*(x-m)^2 / s^2)`
        """
        peak_x, peak_y = self.get_xy(*self.peak.patch.get_center())
        side_x, side_y = self.get_xy(*self.side.patch.get_center())

        if (peak_y < side_y and peak_y > 0) or \
           (peak_y >= side_y and peak_y < 0):
                peak_x, peak_y = self.get_xy(*self.side.patch.get_center())
                side_x, side_y = self.get_xy(*self.peak.patch.get_center())

        m = peak_x
        A = peak_y

        #create a case for negative peaks
        s =  abs(side_x-peak_x) * np.sqrt( 0.5 / np.log(abs(peak_y/side_y)) )

        return A,m,s

__init__(dragpoints, blit_manager)

Gaussian line between 2 DragPoints. Updates with them.

Parameters:

Name Type Description Default
dragpoints list[DragPoint]

line vertices.

required
blit_manager BlitManager

used for automatic ploting.

required
Source code in itfit/fit_functions/gaussian/gaussian.py
def __init__(self,dragpoints: list[DragPoint],blit_manager: BlitManager):
    """Gaussian line between 2 DragPoints. Updates with them.

    Args:
        dragpoints (list[DragPoint]): line vertices.
        blit_manager (BlitManager): used for automatic ploting.
    """

    super().__init__(dragpoints,blit_manager)
    # name points based on use
    self.peak = self.dragpoints[0]
    self.side = self.dragpoints[1]
    self.update()

function(x, A, m, s) staticmethod

Gaussian function.

Parameters:

Name Type Description Default
x float

independent variable.

required
A float

value at x=m.

required
m float

central point.

required
s float

sigma.

required

Returns:

Type Description
float

f(x) = A*exp(-0.5*(x-m)^2 / s^2)

Source code in itfit/fit_functions/gaussian/gaussian.py
@staticmethod
def function(x,A,m,s):
    """Gaussian function.

    Parameters:
        x (float):
            independent variable.
        A (float):
            value at `x=m`.
        m (float):
            central point.
        s (float):
            sigma.

    Returns:
        (float):
            `f(x) = A*exp(-0.5*(x-m)^2 / s^2)`
    """
    return A*np.exp(- 0.5 * (x - m)**2 / s**2)

get_args()

Gives Gaussian function parameters.

Returns:

Type Description
Tuple[float, float, float]

A, m, and s of f(x) = A*exp(0.5*(x-m)^2 / s^2)

Source code in itfit/fit_functions/gaussian/gaussian.py
def get_args(self):
    """Gives Gaussian function parameters.

    Returns:
        (Tuple[float, float, float]):
            `A`, `m`, and `s` of `f(x) = A*exp(0.5*(x-m)^2 / s^2)`
    """
    peak_x, peak_y = self.get_xy(*self.peak.patch.get_center())
    side_x, side_y = self.get_xy(*self.side.patch.get_center())

    if (peak_y < side_y and peak_y > 0) or \
       (peak_y >= side_y and peak_y < 0):
            peak_x, peak_y = self.get_xy(*self.side.patch.get_center())
            side_x, side_y = self.get_xy(*self.peak.patch.get_center())

    m = peak_x
    A = peak_y

    #create a case for negative peaks
    s =  abs(side_x-peak_x) * np.sqrt( 0.5 / np.log(abs(peak_y/side_y)) )

    return A,m,s

get_args_length() staticmethod

Gets number of arguments of function.

Returns:

Type Description
int

Number of arguments of function.

Source code in itfit/fit_functions/gaussian/gaussian.py
@staticmethod
def get_args_length():
    """Gets number of arguments of `function`.

    Returns:
        (int): Number of arguments of `function`.
    """
    return 3

gradient(x, A, m, s) staticmethod

Gaussian gradient.

Parameters:

Name Type Description Default
x float

independent variable.

required
A float

value at x=m.

required
m float

central point.

required
s float

sigma.

required

Returns:

Type Description
np.array

( exp( - 0.5*(x-m)^2 / s^2) , A / s^2 * (x-m) * exp(-0.5*(x-m)^2 / s^2), A / s^3 * (x-m)^2 * exp(-0.5*(x-m)^2 / s^2) )

Source code in itfit/fit_functions/gaussian/gaussian.py
@staticmethod
def gradient(x,A,m,s):
    """Gaussian gradient.

    Parameters:
        x (float):
            independent variable.
        A (float):
            value at `x=m`.
        m (float):
            central point.
        s (float):
            sigma.

    Returns:
        (np.array):
            ` ( exp( - 0.5*(x-m)^2 / s^2) , A / s^2 * (x-m) * exp(-0.5*(x-m)^2 / s^2), A / s^3 * (x-m)^2 * exp(-0.5*(x-m)^2 / s^2) ) ` 
    """
    dfdA = np.exp(- 0.5 * (x - m)**2 / s**2)
    dfdm = A / s**2 * (x -m) * np.exp(- 0.5 * (x - m)**2 / s**2)
    dfds = A / s**3 * (x -m)**2 * np.exp(- 0.5 * (x - m)**2 / s**2)

    return np.array([[dfdA], [dfdm], [dfds]])

update(*args, **kargs)

Updates line data with DragObjects positions

Source code in itfit/fit_functions/gaussian/gaussian.py
def update(self,*args,**kargs):
    """Updates line data with DragObjects positions"""

    peak_x, side_x = self.get_xdata()
    A,m,s = self.get_args()

    #create x and y data of gaussian line of a gaussian that moves across two poitns
    dx = abs(peak_x-side_x) * 1.5
    x = np.linspace(min(peak_x,side_x)-dx,max(peak_x,side_x)+dx,250)
    y = self.function(x,A,m,s)

    #from data coordinates to display coordinates
    xy = np.array((x,y)).T.reshape(-1,2)
    x_data, y_data = self.set_xy(xy).T

    #set new data
    self.poly.set_xdata(x_data)
    self.poly.set_ydata(y_data)

GaussianFitter

Bases: GenericFitter

Gaussian function fitter.

Source code in itfit/fit_functions/gaussian/gaussian.py
class GaussianFitter(GenericFitter):
    """Gaussian function fitter."""
    name = 'gaussian'

    def __init__(self,app,data: DataSelection):
        """ Gaussian fitter following function `f(x) = A*exp(0.5*(x-m)^2/s^2)`

        Parameters:
            app (Fitter): 
                Main application.
            data (DataSelection): 
                Data to fit.
        """

        super().__init__(app,data)

        ## Create DragPoints and DragLines needed

        self.drag_points = [DragPoint(*self.ax.transAxes.transform((0.5,0.7)), None),
                            DragPoint(*self.ax.transAxes.transform((0.7,0.3)), None)]
        self.drag_points_managers = [DragPointManager(p,self.app.blit_manager) for p in self.drag_points]
        self.fitter_drag_collection = DragGaussianManager(self.drag_points, self.app.blit_manager)
        self.function = self.fitter_drag_collection.function
        self.gradient = self.fitter_drag_collection.gradient

        ##Connect Gaussian to Points change events
        self.drag_points_cids = [] #Connections ids for change events
        for dp in self.drag_points_managers:
            self.drag_points_cids.append(
                dp.connect(self.fitter_drag_collection.update)
            )

        ## Add created DragPoints and DragLines to BlitManager's artists
        self.app.blit_manager.artists.append(self.fitter_drag_collection)
        for dpm in self.drag_points_managers:
            self.app.blit_manager.artists.append(dpm)

        self.fig.canvas.draw_idle()

__init__(app, data)

Gaussian fitter following function f(x) = A*exp(0.5*(x-m)^2/s^2)

Parameters:

Name Type Description Default
app Fitter

Main application.

required
data DataSelection

Data to fit.

required
Source code in itfit/fit_functions/gaussian/gaussian.py
def __init__(self,app,data: DataSelection):
    """ Gaussian fitter following function `f(x) = A*exp(0.5*(x-m)^2/s^2)`

    Parameters:
        app (Fitter): 
            Main application.
        data (DataSelection): 
            Data to fit.
    """

    super().__init__(app,data)

    ## Create DragPoints and DragLines needed

    self.drag_points = [DragPoint(*self.ax.transAxes.transform((0.5,0.7)), None),
                        DragPoint(*self.ax.transAxes.transform((0.7,0.3)), None)]
    self.drag_points_managers = [DragPointManager(p,self.app.blit_manager) for p in self.drag_points]
    self.fitter_drag_collection = DragGaussianManager(self.drag_points, self.app.blit_manager)
    self.function = self.fitter_drag_collection.function
    self.gradient = self.fitter_drag_collection.gradient

    ##Connect Gaussian to Points change events
    self.drag_points_cids = [] #Connections ids for change events
    for dp in self.drag_points_managers:
        self.drag_points_cids.append(
            dp.connect(self.fitter_drag_collection.update)
        )

    ## Add created DragPoints and DragLines to BlitManager's artists
    self.app.blit_manager.artists.append(self.fitter_drag_collection)
    for dpm in self.drag_points_managers:
        self.app.blit_manager.artists.append(dpm)

    self.fig.canvas.draw_idle()

GaussianTool

Bases: GenericFitterTool

Toggles Gaussian Tool.

Source code in itfit/fit_functions/gaussian/gaussian.py
class GaussianTool(GenericFitterTool):
    """Toggles Gaussian Tool."""

    # default_keymap = ''
    description = 'Gauss me please'

    def enable(self,*args):
        """Triggered when GaussianTool is enabled,
        Uses BlitManager for faster rendering of DragObjects.
        """

        super().enable()
        self.fitter = GaussianFitter(self.app,self.data)

    def disable(self,*args):
        """Triggered when GaussianTool is disabled.
        Removes DragObjects and disables BlitManager.
        """

        super().disable()

disable(*args)

Triggered when GaussianTool is disabled. Removes DragObjects and disables BlitManager.

Source code in itfit/fit_functions/gaussian/gaussian.py
def disable(self,*args):
    """Triggered when GaussianTool is disabled.
    Removes DragObjects and disables BlitManager.
    """

    super().disable()

enable(*args)

Triggered when GaussianTool is enabled, Uses BlitManager for faster rendering of DragObjects.

Source code in itfit/fit_functions/gaussian/gaussian.py
def enable(self,*args):
    """Triggered when GaussianTool is enabled,
    Uses BlitManager for faster rendering of DragObjects.
    """

    super().enable()
    self.fitter = GaussianFitter(self.app,self.data)