Source code for

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
Created on June 26 2018

@author: kushal

Chatzigeorgiou Group
Sars International Centre for Marine Molecular Biology

GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007


from .tab_page_pytemplate import *
from .row import Row
import pandas as pd
from functools import partial
from typing import Union

[docs]class Page(QtWidgets.QWidget): def __init__(self, parent, stim_type: str): QtWidgets.QWidget.__init__(self) self.ui = Ui_TabPage() self.ui.setupUi(self) self.stim_type = stim_type self.rows = [] #: List of row objects, each row holds one stimulus period. self.ui.btnAddRow.clicked.connect(lambda: self.add_row())
[docs] def set_data(self, dataframe: pd.DataFrame): """ Set the stimulus map :param dataframe: DataFrame with the appropriate rows (see add_row()) """ self.clear() for ix, series in dataframe.iterrows(): self.add_row(series)
[docs] def get_dataframe(self) -> pd.DataFrame: """ Get the stimulus map as a DataFrame """ if len(self.rows) < 1: raise IndexError('No stimuli input for this stimulus type: ' + self.stim_type) l = [] for row in self.rows: l.append(row.get_dict()) return pd.DataFrame(l)
[docs] def set_units(self, units: str): """ Set the time units :param units: One of 'frames' or 'seconds' """ if units not in ['frames', 'seconds']: raise ValueError('Units must be either "frames" or "seconds"') ix = self.ui.comboBoxTimeUnits.findText(units) self.ui.comboBoxTimeUnits.setCurrentIndex(ix)
[docs] def get_units(self) -> str: """ Get the time units """ return self.ui.comboBoxTimeUnits.currentText()
[docs] def add_row(self, pd_series: pd.Series = None): """ Add a row to the stimulus map :param pd_series: pandas series containing the following: stimulus name, start, end, and color :return: """ row = Row(pd_series) self.rows.append(row) row.btn_remove.clicked.connect(partial(self.delete_row, row)) self.ui.verticalLayout.insertLayout(self.ui.verticalLayout.count() - 1, row.hlayout)
[docs] def delete_row(self, row: Union[Row, int]): """ Delete a row from the stimulus map :param row: The Row object to remove or the numerical index of the row """ if isinstance(row, int): row = self.rows[row] if not isinstance(row, Row): raise TypeError("row must be either a Row object or int") self.ui.verticalLayout.removeItem(row.hlayout) self.rows.remove(row) row.delete() row.hlayout.deleteLater() row.deleteLater()
[docs] def clear(self): """Clear the stimulus map""" while len(self.rows) > 0: self.delete_row(self.rows[0])
def set_stim_autocompleter(self, stimulus_list: list): autocompleter = QtWidgets.QCompleter(stimulus_list) for row in self.rows: