Skip to content

Quadratic

DragQuadraticManager

Bases: DragPointCollection

Collection of DragPoints representing a quadratic line.

Source code in itfit/fit_functions/quadratic/quadratic.py
class DragQuadraticManager(DragPointCollection):
    """Collection of DragPoints representing a quadratic line."""

    @staticmethod
    def function(x, a, b, c):
        """Quadratic function.

        Parameters:
            x (float):
                independent variable.
            a (float):
                x^2 coefficient.
            b (float):
                x^1 coefficient.
            c (float):
                constant coefficient.

        Returns:
            (float):
                `f(x)=a*x^2 + b*x + c`
        """
        return a*x*x + b*x + c

    @staticmethod
    def gradient(x, a, b, c):
        """Quadratic function gradient.

        Parameters:
            x (float):
                independent variable.
            a (float):
                x^2 coefficient.
            b (float):
                x^1 coefficient.
            c (float):
                constant coefficient.

        Returns:
            (np.array):
                `( x^2, x, 1)`
        """
        dfda = x**2
        dfdb = x
        dfdc = 1
        return np.array([[dfda], [dfdb], [dfdc]])

    @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):
        """Quadratic line between 2 DragPoints. Updates with them.

        Args:
            dragpoints (list[DragPoint]): line vertices.
            blit_manager (BlitManager): used for automtic ploting.
        """
        super().__init__(dragpoints, blit_manager)
        # name points based on use
        self.center_point = self.dragpoints[0]
        self.lateral_point = self.dragpoints[1]
        self.update()

    def update(self, *args, **kargs):
        """Updates line data with DragObjects positions"""
        cp_x, lp_x = self.get_xdata()
        a,b,c = self.get_args()

        # create x and y data of quadratic line centered in center_point
        dx = abs(lp_x-cp_x)*1.5
        x = np.linspace(cp_x-dx, cp_x+dx, 250)
        y = self.function(x, a, b, c)

        # 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 quadratic function parameters.

        Returns:
            (Tuple[float, float, float]):
                `a`, `b` and `c` of `f(x)=a*x^2 + b*x + c`.
        """
        cp_x, cp_y = self.get_xy(*self.center_point.patch.get_center())
        lp_x, lp_y = self.get_xy(*self.lateral_point.patch.get_center())
        a = (lp_y - cp_y)/np.square(lp_x-cp_x)
        b = -2*a*cp_x
        c = cp_y + a*cp_x*cp_x
        return a,b,c

__init__(dragpoints, blit_manager)

Quadratic line between 2 DragPoints. Updates with them.

Parameters:

Name Type Description Default
dragpoints list[DragPoint]

line vertices.

required
blit_manager BlitManager

used for automtic ploting.

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

    Args:
        dragpoints (list[DragPoint]): line vertices.
        blit_manager (BlitManager): used for automtic ploting.
    """
    super().__init__(dragpoints, blit_manager)
    # name points based on use
    self.center_point = self.dragpoints[0]
    self.lateral_point = self.dragpoints[1]
    self.update()

function(x, a, b, c) staticmethod

Quadratic function.

Parameters:

Name Type Description Default
x float

independent variable.

required
a float

x^2 coefficient.

required
b float

x^1 coefficient.

required
c float

constant coefficient.

required

Returns:

Type Description
float

f(x)=a*x^2 + b*x + c

Source code in itfit/fit_functions/quadratic/quadratic.py
@staticmethod
def function(x, a, b, c):
    """Quadratic function.

    Parameters:
        x (float):
            independent variable.
        a (float):
            x^2 coefficient.
        b (float):
            x^1 coefficient.
        c (float):
            constant coefficient.

    Returns:
        (float):
            `f(x)=a*x^2 + b*x + c`
    """
    return a*x*x + b*x + c

get_args()

Gives quadratic function parameters.

Returns:

Type Description
Tuple[float, float, float]

a, b and c of f(x)=a*x^2 + b*x + c.

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

    Returns:
        (Tuple[float, float, float]):
            `a`, `b` and `c` of `f(x)=a*x^2 + b*x + c`.
    """
    cp_x, cp_y = self.get_xy(*self.center_point.patch.get_center())
    lp_x, lp_y = self.get_xy(*self.lateral_point.patch.get_center())
    a = (lp_y - cp_y)/np.square(lp_x-cp_x)
    b = -2*a*cp_x
    c = cp_y + a*cp_x*cp_x
    return a,b,c

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/quadratic/quadratic.py
@staticmethod
def get_args_length():
    """Gets number of arguments of `function`.

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

gradient(x, a, b, c) staticmethod

Quadratic function gradient.

Parameters:

Name Type Description Default
x float

independent variable.

required
a float

x^2 coefficient.

required
b float

x^1 coefficient.

required
c float

constant coefficient.

required

Returns:

Type Description
np.array

( x^2, x, 1)

Source code in itfit/fit_functions/quadratic/quadratic.py
@staticmethod
def gradient(x, a, b, c):
    """Quadratic function gradient.

    Parameters:
        x (float):
            independent variable.
        a (float):
            x^2 coefficient.
        b (float):
            x^1 coefficient.
        c (float):
            constant coefficient.

    Returns:
        (np.array):
            `( x^2, x, 1)`
    """
    dfda = x**2
    dfdb = x
    dfdc = 1
    return np.array([[dfda], [dfdb], [dfdc]])

update(*args, **kargs)

Updates line data with DragObjects positions

Source code in itfit/fit_functions/quadratic/quadratic.py
def update(self, *args, **kargs):
    """Updates line data with DragObjects positions"""
    cp_x, lp_x = self.get_xdata()
    a,b,c = self.get_args()

    # create x and y data of quadratic line centered in center_point
    dx = abs(lp_x-cp_x)*1.5
    x = np.linspace(cp_x-dx, cp_x+dx, 250)
    y = self.function(x, a, b, c)

    # 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)

QuadraticFitter

Bases: GenericFitter

Quadratic function fitter.

Source code in itfit/fit_functions/quadratic/quadratic.py
class QuadraticFitter(GenericFitter):
    """Quadratic function fitter."""
    name = 'quadratic'

    def __init__(self, app, data: DataSelection):
        """Quadratic fitter following function `f(x)=a*x^2 + b*x + c`

        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.2)), None), 
                            DragPoint(*self.ax.transAxes.transform((0.7,0.5)), None)]
        self.drag_points_managers = [DragPointManager(p, self.app.blit_manager) for p in self.drag_points]
        self.fitter_drag_collection = DragQuadraticManager(self.drag_points, self.app.blit_manager)
        self.function = self.fitter_drag_collection.function
        self.gradient = self.fitter_drag_collection.gradient

        ## Connect Quadratic 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)

Quadratic fitter following function f(x)=a*x^2 + b*x + c

Parameters:

Name Type Description Default
app Fitter

Main application.

required
data DataSelection

Data to fit.

required
Source code in itfit/fit_functions/quadratic/quadratic.py
def __init__(self, app, data: DataSelection):
    """Quadratic fitter following function `f(x)=a*x^2 + b*x + c`

    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.2)), None), 
                        DragPoint(*self.ax.transAxes.transform((0.7,0.5)), None)]
    self.drag_points_managers = [DragPointManager(p, self.app.blit_manager) for p in self.drag_points]
    self.fitter_drag_collection = DragQuadraticManager(self.drag_points, self.app.blit_manager)
    self.function = self.fitter_drag_collection.function
    self.gradient = self.fitter_drag_collection.gradient

    ## Connect Quadratic 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()

QuadraticTool

Bases: GenericFitterTool

Toggles Quadratic Tool.

Source code in itfit/fit_functions/quadratic/quadratic.py
class QuadraticTool(GenericFitterTool):
    """Toggles Quadratic Tool."""

    # default_keymap = ''
    description = 'Quadratic me please'

    def enable(self, *args):
        """Triggered when QuadraticTool is enabled.
        Uses BlitManager for faster rendering of DragObjects.
        """
        super().enable()
        self.fitter = QuadraticFitter(self.app, self.data)

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

disable(*args)

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

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

enable(*args)

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

Source code in itfit/fit_functions/quadratic/quadratic.py
def enable(self, *args):
    """Triggered when QuadraticTool is enabled.
    Uses BlitManager for faster rendering of DragObjects.
    """
    super().enable()
    self.fitter = QuadraticFitter(self.app, self.data)