class NormalizationModule(SingleMethodModule): attribute = 'normalizer' title = 'Normalization' toggle_enabled = True enabled = settings.Setting(False) methods = [ preprocess.PorterStemmer, preprocess.SnowballStemmer, preprocess.WordNetLemmatizer, preprocess.UDPipeLemmatizer, ] SNOWBALL = 1 UDPIPE = 3 snowball_language = settings.Setting('English') udpipe_language = settings.Setting('English') udpipe_tokenizer = settings.Setting(False) def __init__(self, master): super().__init__(master) label = gui.label(self, self, 'Language:') label.setAlignment(Qt.AlignRight) self.method_layout.addWidget(label, self.SNOWBALL, 1) snowball_box = widgets.ComboBox(self, 'snowball_language', items=preprocess.SnowballStemmer.supported_languages) snowball_box.currentIndexChanged.connect(self.change_language) self.method_layout.addWidget(snowball_box, self.SNOWBALL, 2) self.methods[self.SNOWBALL].language = self.snowball_language self.udpipe_tokenizer_box = QCheckBox("UDPipe tokenizer", self, checked=self.udpipe_tokenizer) self.udpipe_tokenizer_box.stateChanged.connect(self.change_tokenizer) self.method_layout.addWidget(self.udpipe_tokenizer_box, self.UDPIPE, 1) self.udpipe_label = gui.label(self, self, 'Language:') self.udpipe_label.setAlignment(Qt.AlignRight) self.method_layout.addWidget(self.udpipe_label, self.UDPIPE, 2) self.udpipe_models = UDPipeModels() self.create_udpipe_box() self.udpipe_online = self.udpipe_models.online self.on_off_button.stateChanged.connect(self.check_udpipe_online) self.check_udpipe_online() self.methods[self.UDPIPE].language = self.udpipe_language self.methods[self.UDPIPE].use_tokenizer = self.udpipe_tokenizer def create_udpipe_box(self): if not self.udpipe_models.supported_languages: self.group.button(self.UDPIPE).setEnabled(False) self.udpipe_tokenizer_box.setEnabled(False) self.udpipe_label.setEnabled(False) self.udpipe_box = widgets.ComboBox(self, 'udpipe_language', items=['']) self.udpipe_box.setEnabled(False) else: self.group.button(self.UDPIPE).setEnabled(True) self.udpipe_tokenizer_box.setEnabled(True) self.udpipe_label.setEnabled(True) self.udpipe_box = widgets.ComboBox(self, 'udpipe_language', items=self.udpipe_models.supported_languages) self.udpipe_box.currentIndexChanged.connect(self.change_language) self.method_layout.addWidget(self.udpipe_box, self.UDPIPE, 3) def check_udpipe_online(self): current_state = self.udpipe_models.online if self.udpipe_online != current_state: self.create_udpipe_box() self.udpipe_online = current_state self.master.Warning.udpipe_offline.clear() self.master.Warning.udpipe_offline_no_models.clear() if not current_state and self.enabled: if self.udpipe_models.supported_languages: self.master.Warning.udpipe_offline() else: self.master.Warning.udpipe_offline_no_models() def change_language(self): if self.methods[self.SNOWBALL].language != self.snowball_language: self.methods[self.SNOWBALL].language = self.snowball_language if self.method_index == self.SNOWBALL: self.change_signal.emit() if self.methods[self.UDPIPE].language != self.udpipe_language: self.methods[self.UDPIPE].language = self.udpipe_language if self.method_index == self.UDPIPE: self.change_signal.emit() def change_tokenizer(self): self.udpipe_tokenizer = self.udpipe_tokenizer_box.isChecked() if self.methods[self.UDPIPE].use_tokenizer != self.udpipe_tokenizer: self.methods[self.UDPIPE].use_tokenizer = self.udpipe_tokenizer if self.method_index == self.UDPIPE: self.change_signal.emit()
class NormalizeEditor(ScBaseEditor): DEFAULT_GROUP_BY = False DEFAULT_GROUP_VAR = None DEFAULT_METHOD = Normalize.CPM def __init__(self, parent=None, master=None, **kwargs): super().__init__(parent, **kwargs) self._group_var = self.DEFAULT_GROUP_VAR self._master = master self._master.input_data_changed.connect(self._set_model) self.setLayout(QVBoxLayout()) form = QFormLayout() cpm_b = QRadioButton("Counts per million", checked=True) med_b = QRadioButton("Median") self.group = QButtonGroup() self.group.buttonClicked.connect(self._on_button_clicked) for i, button in enumerate([cpm_b, med_b]): index = index_to_enum(Normalize.Method, i).value self.group.addButton(button, index - 1) form.addRow(button) self.group_by_check = QCheckBox("Cell Groups: ", enabled=self.DEFAULT_GROUP_BY) self.group_by_check.clicked.connect(self.edited) self.group_by_combo = QComboBox(enabled=self.DEFAULT_GROUP_BY) self.group_by_model = DomainModel(order=(DomainModel.METAS, DomainModel.CLASSES), valid_types=DiscreteVariable, alphabetical=True) self.group_by_combo.setModel(self.group_by_model) self.group_by_combo.currentIndexChanged.connect(self.changed) self.group_by_combo.activated.connect(self.edited) form.addRow(self.group_by_check, self.group_by_combo) self.layout().addLayout(form) self._set_model() def _set_model(self): data = self._master.data self.group_by_model.set_domain(data and data.domain) enable = bool(self.group_by_model) self.group_by_check.setChecked(False) self.group_by_check.setEnabled(enable) self.group_by_combo.setEnabled(enable) if self.group_by_model: self.group_by_combo.setCurrentIndex(0) if self._group_var and self._group_var in data.domain: index = self.group_by_model.indexOf(self._group_var) self.group_by_combo.setCurrentIndex(index) else: self.group_by_combo.setCurrentText(None) def _on_button_clicked(self): self.changed.emit() self.edited.emit() def setParameters(self, params): method = params.get("method", self.DEFAULT_METHOD) index = enum_to_index(Normalize.Method, method) self.group.buttons()[index].setChecked(True) self._group_var = params.get("group_var", self.DEFAULT_GROUP_VAR) group = bool(self._group_var and self.group_by_model) if group: index = self.group_by_model.indexOf(self._group_var) self.group_by_combo.setCurrentIndex(index) group_by = params.get("group_by", self.DEFAULT_GROUP_BY) self.group_by_check.setChecked(group_by and group) def parameters(self): index = self.group_by_combo.currentIndex() group_var = self.group_by_model[index] if index > -1 else None group_by = self.group_by_check.isChecked() method = index_to_enum(Normalize.Method, self.group.checkedId()) return {"group_var": group_var, "group_by": group_by, "method": method} @staticmethod def createinstance(params): group_var = params.get("group_var") group_by = params.get("group_by", NormalizeEditor.DEFAULT_GROUP_BY) method = params.get("method", NormalizeEditor.DEFAULT_METHOD) return NormalizeGroups(group_var, method) \ if group_by and group_var else NormalizeSamples(method) def __repr__(self): method = self.group.button(self.group.checkedId()).text() index = self.group_by_combo.currentIndex() group_var = self.group_by_model[index] if index > -1 else None group_by = self.group_by_check.isChecked() group_text = ", Grouped by: {}".format(group_var) if group_by else "" return "Method: {}".format(method) + group_text