def on_draw(self):
        """Draw method for matplotlib.
        """
        self.axes.clear()

        if self.selection_given_manually:
            self.axes.axvline(x=self.selected_tof)

        if self.cut.element:
            self.tof_histogram = TOFCalibrationHistogram(self.cut, self.bin_width, self.use_column)
            self.axes.plot(self.tof_histogram.histogram_x, self.tof_histogram.histogram_y)

            # Get some value between the cut data's both edges.
            # middle = self.tof_histogram.find_middle()
            # params = self.tof_histogram.get_error_function_parameters(middle)
            err_start, err_end = self.tof_histogram.find_leading_edge_borders()
            params = self.tof_histogram.get_error_function_parameters(err_end, err_start)

            # Generate points for the fitted curve to be drawn.
            fit_points_x, fit_points_y = self.tof_histogram.get_curve_fit_points(params, 2000)
            self.axes.plot(fit_points_x, fit_points_y, "-")

            if not self.selection_given_manually:
                # Set the now selected point to the generated one.
                # x0 is the middle point of the rising curve.
                self.selected_tof = params[0]
                self.tof_calibration_point = TOFCalibrationPoint(
                    self.selected_tof, self.cut, self.masses, self.settings
                )
                # Update dialog and draw a vertical line
                self.__update_dialog_values()
                self.axes.axvline(x=self.selected_tof, color="red")

            # TODO: Unnecessary limits?
            x_min, x_max = self.axes.get_xlim()
            y_min, y_max = self.axes.get_ylim()

            # Set limits accordingly
            self.axes.set_ylim([y_min, y_max])
            self.axes.set_xlim([x_min, x_max])

        self.axes.set_ylabel("Intensity [Counts]")
        self.axes.set_xlabel("Time of Flight [Channel]")

        # Remove axis ticks
        self.remove_axes_ticks()

        # Draw magic
        self.canvas.draw()
 def __set_calibration_point(self, tof):
     self.selected_tof = tof
     self.tof_calibration_point = TOFCalibrationPoint(self.selected_tof, self.cut, self.masses, self.settings)
     self.__update_dialog_values()
     self.on_draw()
class MatplotlibCalibrationCurveFittingWidget(MatplotlibWidget):
    """Energy spectrum widget
    """

    def __init__(self, parent, settings, tof_calibration, cut, masses, bin_width=2.0, column=1, dialog=None):
        """Inits Energy Spectrum widget.
        
        Args:
            parent: CalibrationCurveFittingWidget
            settings: Settings class object.
            tof_calibration: TOFCalibration class object.
            cut: CutFile class object.
            masses: Reference to element masses object of main program.
            bin_width: Histograms bin width
            column: Which column of the CutFile's data is used to create a 
                    histogram.
            dialog: parent's parent dialog.
        """
        super().__init__(parent)
        super().fork_toolbar_buttons()
        self.canvas.manager.set_title("ToF-E Calibration - curve fitting")
        self.__fork_toolbar_buttons()
        self.dialog = dialog
        self.settings = settings
        self.cut = cut
        self.masses = masses
        self.cut_standard_mass = 0
        self.cut_standard_scatter_mass = 0
        self.bin_width = bin_width
        self.use_column = column

        self.tof_histogram = None
        self.tof_calibration_point = None
        self.selection_given_manually = False
        self.canvas.mpl_connect("button_press_event", self.onclick)
        self.on_draw()

    def onclick(self, event):
        """ Handles clicks on the graph
        
        Args:
            event: Mouse click event.
        """
        if not self.selection_given_manually:
            return
        if event.button == 1:
            self.__set_calibration_point(event.xdata)

    def __set_calibration_point(self, tof):
        self.selected_tof = tof
        self.tof_calibration_point = TOFCalibrationPoint(self.selected_tof, self.cut, self.masses, self.settings)
        self.__update_dialog_values()
        self.on_draw()

    def set_calibration_point_externally(self, tof):
        """Set calibration point.
        
        Args:
            tof: Integer representing x axis value Time of Flight [Channel].
        """
        state = self.selection_given_manually
        self.selection_given_manually = True
        self.__set_calibration_point(tof)
        self.selection_given_manually = state

    def __update_dialog_values(self):
        """Updates the parent dialog's fields with the calculated values.
        """
        tof_channel = self.tof_calibration_point.get_tof_channel()
        tof_seconds = self.tof_calibration_point.get_tof_seconds()
        self.dialog.ui.acceptPointButton.setEnabled(True)
        if not tof_channel:
            tof_channel = "Invalid cut file parameters."
            self.dialog.ui.acceptPointButton.setEnabled(False)
        if not tof_seconds:
            tof_seconds = "Invalid cut file parameters."
            self.dialog.ui.acceptPointButton.setEnabled(False)
        self.dialog.ui.tofChannelLineEdit.setText(str(tof_channel))
        self.dialog.ui.tofSecondsLineEdit.setText(str(tof_seconds))

    def change_cut(self, cut):
        """Changes the cut file to be drawn and analyzed
        """
        if self.cut != cut:
            self.cut = cut
            self.selectButton.setChecked(False)
            self.selection_given_manually = False
            self.cut_standard_mass = self.masses.get_standard_isotope(self.cut.element.name)
            self.cut_standard_scatter_mass = self.masses.get_standard_isotope(self.cut.element_scatter)
        self.on_draw()

    def change_bin_width(self, bin_width):
        """Change histogram bin width.
        
        Args:
            bin_width: Float representing graph bin width.
        """
        self.bin_width = bin_width

    def on_draw(self):
        """Draw method for matplotlib.
        """
        self.axes.clear()

        if self.selection_given_manually:
            self.axes.axvline(x=self.selected_tof)

        if self.cut.element:
            self.tof_histogram = TOFCalibrationHistogram(self.cut, self.bin_width, self.use_column)
            self.axes.plot(self.tof_histogram.histogram_x, self.tof_histogram.histogram_y)

            # Get some value between the cut data's both edges.
            # middle = self.tof_histogram.find_middle()
            # params = self.tof_histogram.get_error_function_parameters(middle)
            err_start, err_end = self.tof_histogram.find_leading_edge_borders()
            params = self.tof_histogram.get_error_function_parameters(err_end, err_start)

            # Generate points for the fitted curve to be drawn.
            fit_points_x, fit_points_y = self.tof_histogram.get_curve_fit_points(params, 2000)
            self.axes.plot(fit_points_x, fit_points_y, "-")

            if not self.selection_given_manually:
                # Set the now selected point to the generated one.
                # x0 is the middle point of the rising curve.
                self.selected_tof = params[0]
                self.tof_calibration_point = TOFCalibrationPoint(
                    self.selected_tof, self.cut, self.masses, self.settings
                )
                # Update dialog and draw a vertical line
                self.__update_dialog_values()
                self.axes.axvline(x=self.selected_tof, color="red")

            # TODO: Unnecessary limits?
            x_min, x_max = self.axes.get_xlim()
            y_min, y_max = self.axes.get_ylim()

            # Set limits accordingly
            self.axes.set_ylim([y_min, y_max])
            self.axes.set_xlim([x_min, x_max])

        self.axes.set_ylabel("Intensity [Counts]")
        self.axes.set_xlabel("Time of Flight [Channel]")

        # Remove axis ticks
        self.remove_axes_ticks()

        # Draw magic
        self.canvas.draw()

    def toggle_clicks(self):
        """Toggle between manual ToF channel (x axis) selection.
        """
        self.selection_given_manually = not self.selection_given_manually

    def __fork_toolbar_buttons(self):
        """Custom toolbar buttons be here.
        """
        self.selectButton = QtGui.QToolButton(self)
        self.selectButton.clicked.connect(self.toggle_clicks)
        self.selectButton.setCheckable(True)
        self.selectButton.setIcon(QtGui.QIcon("ui_icons/reinhardt/amarok_edit.svg"))  # TODO: Make this the new way
        self.selectButton.setToolTip("Select the point manually.")
        self.mpl_toolbar.addWidget(self.selectButton)