예제 #1
0
파일: analysis.py 프로젝트: odile9999/asan
class AnalysisGUI(QDockWidget):

    """
    classdocs
    """
    parametersRaisedSignal = pyqtSignal(object)
    masstabRaisedSignal = pyqtSignal(object)
    masstabSelectorRaisedSignal = pyqtSignal(object)
    plotTimeRaisedSignal = pyqtSignal(object, object, object)
    plotMassRaisedSignal = pyqtSignal(object, object, object, bool)
    plotCalibRaisedSignal = pyqtSignal(object, object, object, object, object)
    plotPeaksRaisedSignal = pyqtSignal(
        object, object, object, object, object, float, int, float, float)
    plotClearRaisedSignal = pyqtSignal(bool, bool, bool)

    def __init__(self, parent=None):
        """
        Constructor
        """
        super(AnalysisGUI, self).__init__(parent)
        self.ui = Ui_DockWidget_Analysis()
        self.ui.setupUi(self)

    def setup(self, data_selector):
        self.ds = data_selector
        self.__connect_events()
        self.__fill_default_analysis()

    def __connect_events(self):
        self.ds.analysisRaisedSignal.connect(self.new_analysis)
        self.ui.pushButton_UpdatePlots.clicked.connect(self.emit_plot_signals)
        # changes in mass GroupBox
        self.ui.doubleSpinBox_PlotMassX1.valueChanged.connect(self.mass_event)
        self.ui.doubleSpinBox_PlotMassX2.valueChanged.connect(self.mass_event)
        self.ui.checkBox_Hold.stateChanged.connect(self.mass_event)
        # changes in peak GroupBox
        self.ui.doubleSpinBox_PeakHeight.valueChanged.connect(self.peaks_event)
        self.ui.spinBox_PeakDistance.valueChanged.connect(self.peaks_event)
        self.ui.doubleSpinBox_StartMass.valueChanged.connect(self.peaks_event)
        self.ui.doubleSpinBox_EndMass.valueChanged.connect(self.peaks_event)
        self.ui.pushButton_ChangeMassSelector.clicked.connect(self.emit_change_mass_selector)

    def mass_event(self):
        log.debug("event from %s", self.sender())
        self.mass_x1 = float(self.ui.doubleSpinBox_PlotMassX1.value())
        self.mass_x2 = float(self.ui.doubleSpinBox_PlotMassX2.value())
        self.hold = self.ui.checkBox_Hold.isChecked()

    def peaks_event(self):
        log.debug("event from %s", self.sender())
        self.mph = float(self.ui.doubleSpinBox_PeakHeight.value())
        self.mpd = int(self.ui.spinBox_PeakDistance.value())
        self.peaks_x1 = float(self.ui.doubleSpinBox_StartMass.value())
        self.peaks_x2 = float(self.ui.doubleSpinBox_EndMass.value())

    def __fill_default_analysis(self):
        # Plots unavailable if no data
        self.ui.pushButton_UpdatePlots.setEnabled(False)
        # Mass calib
        self.ui.doubleSpinBox_PlotMassX1.setValue(10.0)
        self.ui.doubleSpinBox_PlotMassX2.setValue(1000.0)
        self.ui.doubleSpinBox_RefMass.setValue(300.0)
        self.ui.checkBox_Hold.setChecked(False)
        # peak detection
        self.ui.doubleSpinBox_PeakHeight.setValue(400.0)
        self.ui.spinBox_PeakDistance.setValue(50)
        self.ui.doubleSpinBox_StartMass.setValue(290.0)
        self.ui.doubleSpinBox_EndMass.setValue(310.0)
        self.coefs = None
        self.mass_list = []
        self.time_list = []
        self.calib_name = ""
        self.mmass_name = ""

    def new_analysis(self, spectrum_name):
        log.info("analysis of %s", spectrum_name)
        # Ex : f:\hassan\Aroma\Spectra\XXX.txt
        self.filename = spectrum_name

        self.pip = Pipeline(spectrum_name)

        self.ui.lineEdit_File.setText(self.pip.shortname)

        # Update parameters box
        self.parametersRaisedSignal.emit(self.pip)
        # Update masstab_viewer box
        self.masstabRaisedSignal.emit(self.pip)
        # Update plots with user input values
        self.ui.pushButton_UpdatePlots.setEnabled(True)
        self.mass_event()
        self.peaks_event()
        self.emit_plot_signals()

    def emit_plot_signals(self):
        log.debug("event from %s", self.sender())
        self.emit_plot_time()

        # if calib is there, always use mass columns from file
        if self.pip.data.isCalibAvailable:
            self.plotClearRaisedSignal.emit(False, False, True)
            self.emit_plot_mass_peaks()
        else:
            if self.pip.isCalibFound:
                self.plotClearRaisedSignal.emit(False, False, False)
                self.emit_plot_mass_peaks()
                self.emit_plot_calib()
            else:
                self.plotClearRaisedSignal.emit(True, True, True)

    def emit_plot_time(self):
        # Update plot for time
        x = self.pip.data.time
        y = self.pip.data.spectrum
        self.plotTimeRaisedSignal.emit(self.pip.plot_filename, x, y)

    def emit_plot_mass_peaks(self):

        # Update plot for mass
        x = self.pip.data.mass
        y = self.pip.data.spectrum
        xmask, ymask = self.pip.get_x1_x2_mass(x, y, self.mass_x1, self.mass_x2)
        self.plotMassRaisedSignal.emit(
            self.pip.plot_filename, xmask, ymask, bool(self.hold))
        # Process peaks with last input values
        mph, mpd, x, y, xind, yind = self.pip.process_peaks(x, y, self.mph, self.mpd,
                                                            self.peaks_x1, self.peaks_x2)
        self.ui.spinBox_PeakDistanceFound.setValue(mpd)
        self.ui.doubleSpinBox_PeakHeightFound.setValue(mph)
        # Update plot for peaks
        self.plotPeaksRaisedSignal.emit(
            self.pip.plot_filename, x, y, xind, yind,
            float(self.mph), int(self.mpd), float(self.peaks_x1),
            float(self.peaks_x2))

    def emit_change_mass_selector(self):
        # Update plot for mass
        x = self.pip.data.mass
        y = self.pip.data.spectrum
        mph, mpd, x, y, xind, yind = self.pip.process_peaks(x, y, self.mph, self.mpd,
                                                            self.peaks_x1, self.peaks_x2)
        # Update plot for peaks
        self.masstabSelectorRaisedSignal.emit(xind)

    def emit_plot_calib(self):
        #         log.debug("event from %s", self.sender())
        x = self.pip.data.mass
        y = self.pip.data.time
        self.plotCalibRaisedSignal.emit(
            self.pip.plot_filename, self.mass_list, self.time_list, x, y)