def setBioMartConfiguration(self, configuration): assert QThread.currentThread() is self.thread() self.setEnabled(True) # parse the xml in the main thread (a long time ago this step was # done in a thread but would frequently cause `expat` to segfault. doc = biomart.parseXML(io.BytesIO(configuration)) config = list(doc.elements("DatasetConfig"))[0] configuration = biomart.DatasetConfig(self.registry, config.tag, config.attributes, config.children) self.clearConfiguration() self.configuration = configuration def hidden(tree): return getattr(tree, "hidden", "false") != "false" or getattr(tree, "hideDisplay", "false") != "false" self.attributePagesTabWidget = tabs = gui.tabWidget(self.attributesConfigurationBox) for page in configuration.elements("AttributePage"): if not hidden(page): page_widget = PageWidget(page, self.dataset, self) gui.createTabPage(tabs, getattr(page, "displayName", ""), widgetToAdd=page_widget, canScroll=True) if self.SHOW_FILTERS: self.filterPagesTabWidget = tabs = gui.tabWidget(self.filtersConfigurationBox) for page in configuration.elements("FilterPage"): if not hidden(page): page_widget = PageWidget(page, self.dataset, self) gui.createTabPage(tabs, getattr(page, "displayName", ""), widgetToAdd=page_widget, canScroll=True) self.afterInit() self.commitButton.setEnabled(True)
def __init__(self, parent=None): super().__init__(parent) self.inputs = OrderedDict() self.dist_color = QtGui.QColor(*self.dist_color_RGB) info_box = gui.widgetBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel(info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) gui.separator(info_box) gui.button(info_box, self, "Restore Original Order", callback=self.restore_order, tooltip="Show rows in the original order", autoDefault=False) info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.widgetBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self._on_show_variable_labels_changed) gui.checkBox(box, self, "show_distributions", 'Visualize continuous values', callback=self._on_distribution_color_changed) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self._on_distribution_color_changed) gui.button(box, self, "Set colors", self.set_colors, autoDefault=False, tooltip="Set the background color and color palette") box = gui.widgetBox(self.controlArea, "Selection") gui.checkBox(box, self, "select_rows", "Select full rows", callback=self._on_select_rows_changed) gui.rubber(self.controlArea) gui.auto_commit(self.controlArea, self, "auto_commit", "Send Selected Rows", "Auto send is on") dlg = self.create_color_dialog() self.discPalette = dlg.getDiscretePalette("discPalette") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.currentChanged.connect(self._on_current_tab_changed) copy = QtGui.QAction("Copy", self, shortcut=QtGui.QKeySequence.Copy, triggered=self.copy) self.addAction(copy)
def __init__(self): super().__init__() self.data = {} # key: id, value: ExampleTable self.dist_color = QtGui.QColor(*self.dist_color_RGB) self.locale = QtCore.QLocale() info_box = gui.widgetBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel(info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) gui.separator(info_box) gui.button(info_box, self, "Restore Original Order", callback=self.reset_sort_clicked, tooltip="Show rows in the original order") info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.widgetBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self.c_show_attribute_labels_clicked) self.c_show_attribute_labels.setEnabled(True) gui.checkBox(box, self, "show_distributions", 'Visualize continuous values', callback=self.cb_show_distributions) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self.cb_show_distributions) gui.button(box, self, "Set colors", self.set_colors, tooltip="Set the background color and color palette") gui.separator(self.controlArea) selection_box = gui.widgetBox(self.controlArea, "Selection") self.send_button = gui.button(selection_box, self, "Send selections", self.commit, default=True) cb = gui.checkBox(selection_box, self, "auto_commit", "Commit on any change", callback=self.commit_if) gui.setStopper(self, self.send_button, cb, "selectionChangedFlag", self.commit) gui.rubber(self.controlArea) dlg = self.create_color_dialog() self.discPalette = dlg.getDiscretePalette("discPalette") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.sizeHint = lambda: QtCore.QSize(600,500) self.id2table = {} # key: widget id, value: table self.table2id = {} # key: table, value: widget id self.tabs.currentChanged.connect(self.tab_clicked) self.selectionChangedFlag = False
def tabWidget(cls, widget, height=None, width=None): tabWidget = gui.tabWidget(widget) if not height is None: tabWidget.setFixedHeight(height) if not width is None: tabWidget.setFixedWidth(width) return tabWidget
def __init__(self): super().__init__() self._inputs = OrderedDict() self.__pending_selected_rows = self.selected_rows self.selected_rows = None self.__pending_selected_cols = self.selected_cols self.selected_cols = None self.dist_color = QColor(*self.dist_color_RGB) info_box = gui.vBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel(info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.vBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self._on_show_variable_labels_changed) gui.checkBox(box, self, "show_distributions", 'Visualize numeric values', callback=self._on_distribution_color_changed) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self._on_distribution_color_changed) box = gui.vBox(self.controlArea, "Selection") gui.checkBox(box, self, "select_rows", "Select full rows", callback=self._on_select_rows_changed) gui.rubber(self.controlArea) reset = gui.button( None, self, "Restore Original Order", callback=self.restore_order, tooltip="Show rows in the original order", autoDefault=False) self.buttonsArea.layout().insertWidget(0, reset) gui.auto_commit(self.buttonsArea, self, "auto_commit", "Send Selected Rows", "Send Automatically") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.currentChanged.connect(self._on_current_tab_changed)
def create_control_panel(self): self.control_tabs = gui.tabWidget(self.controlArea) self.general_tab = gui.createTabPage(self.control_tabs, "Main") self.settings_tab = gui.createTabPage(self.control_tabs, "Settings") self.add_attribute_selection_area(self.general_tab) self.add_zoom_select_toolbar(self.general_tab) self.add_visual_settings(self.settings_tab) self.add_annotation_settings(self.settings_tab) self.add_color_settings(self.settings_tab) self.settings_tab.layout().addStretch(100) self.icons = attributeIconDict
def __init__(self, show_automatic_box=True): super().__init__(show_automatic_box) view_box = ShadowGui.widgetBox(self.mainArea, "Plotting Style", addSpace=False, orientation="horizontal") view_box_1 = ShadowGui.widgetBox(view_box, "", addSpace=False, orientation="vertical", width=350) self.view_type_combo = gui.comboBox(view_box_1, self, "view_type", label="Select level of Plotting", labelWidth=220, items=["Detailed Plot", "Preview", "None"], callback=self.set_PlotQuality, sendSelectedValue=False, orientation="horizontal") self.tabs = gui.tabWidget(self.mainArea) self.initializeTabs() self.shadow_output = QtGui.QTextEdit() self.shadow_output.setReadOnly(True) out_box = gui.widgetBox(self.mainArea, "System Output", addSpace=True, orientation="horizontal") out_box.layout().addWidget(self.shadow_output) self.shadow_output.setFixedHeight(150) self.shadow_output.setFixedWidth(850)
def __init__(self): super().__init__() self.output_corpus = None self.pubmed_api = None self.progress = None self.record_count = 0 self.download_running = False # API key self.email_dlg = self.EmailCredentialsDialog(self) gui.button(self.controlArea, self, 'Email', callback=self.email_dlg.exec_, focusPolicy=Qt.NoFocus) gui.separator(self.controlArea) # To hold all the controls. Makes access easier. self.pubmed_controls = [] # RECORD SEARCH self.search_tabs = gui.tabWidget(self.controlArea) # --- Regular search --- regular_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Author self.author_input = gui.lineEdit(regular_search_box, self, 'author', 'Author:', orientation=Qt.Horizontal) self.pubmed_controls.append(self.author_input) h_box = gui.hBox(regular_search_box) year_box = gui.widgetBox(h_box, orientation=Qt.Horizontal) min_date = QDate.fromString( self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT) if not self.pub_date_from: self.pub_date_from = self.MIN_DATE.strftime(self.PY_DATE_FORMAT) if not self.pub_date_to: self.pub_date_to = date.today().strftime(self.PY_DATE_FORMAT) self.date_from = QDateEdit(QDate.fromString(self.pub_date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True) self.date_to = QDateEdit(QDate.fromString(self.pub_date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True) self.date_from.dateChanged.connect(lambda date: setattr( self, 'pub_date_from', date.toString(self.QT_DATE_FORMAT))) self.date_to.dateChanged.connect(lambda date: setattr( self, 'pub_date_to', date.toString(self.QT_DATE_FORMAT))) self.pubmed_controls.append(self.date_from) self.pubmed_controls.append(self.date_to) gui.label(year_box, self, 'From:') year_box.layout().addWidget(self.date_from) gui.label(year_box, self, 'to:') year_box.layout().addWidget(self.date_to) # Keywords. h_box = gui.hBox(regular_search_box) label = gui.label(h_box, self, 'Query:') label.setMaximumSize(label.sizeHint()) self.keyword_combo = QComboBox(h_box) self.keyword_combo.setMinimumWidth(150) self.keyword_combo.setEditable(True) h_box.layout().addWidget(self.keyword_combo) self.keyword_combo.activated[int].connect(self.select_keywords) self.pubmed_controls.append(self.keyword_combo) tab_height = regular_search_box.sizeHint() regular_search_box.setMaximumSize(tab_height) # --- Advanced search --- advanced_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Advanced search query. h_box = gui.hBox(advanced_search_box) self.advanced_query_input = QTextEdit(h_box) h_box.layout().addWidget(self.advanced_query_input) self.advanced_query_input.setMaximumSize(tab_height) self.pubmed_controls.append(self.advanced_query_input) gui.createTabPage(self.search_tabs, 'Regular search', regular_search_box) gui.createTabPage(self.search_tabs, 'Advanced search', advanced_search_box) # Search info label. self.search_info_label = gui.label(self.controlArea, self, 'Number of records found: /') # Search for records button. self.run_search_button = gui.button( self.controlArea, self, 'Find records', callback=self.run_search, tooltip='Performs a search for articles that fit the ' 'specified parameters.') self.pubmed_controls.append(self.run_search_button) h_line = QFrame() h_line.setFrameShape(QFrame.HLine) h_line.setFrameShadow(QFrame.Sunken) self.controlArea.layout().addWidget(h_line) # RECORD RETRIEVAL # Text includes box. text_includes_box = gui.widgetBox(self.controlArea, 'Text includes', addSpace=True) self.authors_checkbox = gui.checkBox(text_includes_box, self, 'includes_authors', 'Authors') self.title_checkbox = gui.checkBox(text_includes_box, self, 'includes_title', 'Article title') self.mesh_checkbox = gui.checkBox(text_includes_box, self, 'includes_mesh', 'Mesh headings') self.abstract_checkbox = gui.checkBox(text_includes_box, self, 'includes_abstract', 'Abstract') self.url_checkbox = gui.checkBox(text_includes_box, self, 'includes_url', 'URL') self.pubmed_controls.append(self.authors_checkbox) self.pubmed_controls.append(self.title_checkbox) self.pubmed_controls.append(self.mesh_checkbox) self.pubmed_controls.append(self.abstract_checkbox) self.pubmed_controls.append(self.url_checkbox) # Num. records. h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Retrieve') label.setMaximumSize(label.sizeHint()) self.num_records_input = gui.spin(h_box, self, 'num_records', minv=1, maxv=10000) self.max_records_label = gui.label(h_box, self, 'records from /.') self.max_records_label.setMaximumSize( self.max_records_label.sizeHint()) self.pubmed_controls.append(self.num_records_input) # Download articles. # Search for records button. self.retrieve_records_button = gui.button( self.controlArea, self, 'Retrieve records', callback=self.retrieve_records, tooltip='Retrieves the specified documents.') self.pubmed_controls.append(self.retrieve_records_button) # Num. retrieved records info label. self.retrieval_info_label = gui.label( self.controlArea, self, 'Number of records retrieved: /') # Load the most recent queries. self.set_keyword_list()
def __init__(self, parent=None): super().__init__(self, parent) self.input_data = None self.ref_data = None self.ontology = None self.annotations = None self.loaded_annotation_code = None self.treeStructRootKey = None self.probFunctions = [statistics.Binomial(), statistics.Hypergeometric()] self.selectedTerms = [] self.selectionChanging = 0 self.__state = State.Ready self.__scheduletimer = QTimer(self, singleShot=True) self.__scheduletimer.timeout.connect(self.__update) ############# # GUI ############# self.tabs = gui.tabWidget(self.controlArea) # Input tab self.inputTab = gui.createTabPage(self.tabs, "Input") box = gui.widgetBox(self.inputTab, "Info") self.infoLabel = gui.widgetLabel(box, "No data on input\n") gui.button(box, self, "Ontology/Annotation Info", callback=self.ShowInfo, tooltip="Show information on loaded ontology and annotations") self.referenceRadioBox = gui.radioButtonsInBox( self.inputTab, self, "useReferenceDataset", ["Entire genome", "Reference set (input)"], tooltips=["Use entire genome for reference", "Use genes from Referece Examples input signal as reference"], box="Reference", callback=self.__invalidate) self.referenceRadioBox.buttons[1].setDisabled(True) gui.radioButtonsInBox( self.inputTab, self, "aspectIndex", ["Biological process", "Cellular component", "Molecular function"], box="Aspect", callback=self.__invalidate) # Filter tab self.filterTab = gui.createTabPage(self.tabs, "Filter") box = gui.widgetBox(self.filterTab, "Filter GO Term Nodes") gui.checkBox(box, self, "filterByNumOfInstances", "Genes", callback=self.FilterAndDisplayGraph, tooltip="Filter by number of input genes mapped to a term") ibox = gui.indentedBox(box) gui.spin(ibox, self, 'minNumOfInstances', 1, 100, step=1, label='#:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Min. number of input genes mapped to a term") gui.checkBox(box, self, "filterByPValue_nofdr", "p-value", callback=self.FilterAndDisplayGraph, tooltip="Filter by term p-value") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue_nofdr', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") # use filterByPValue for FDR, as it was the default in prior versions gui.checkBox(box, self, "filterByPValue", "FDR", callback=self.FilterAndDisplayGraph, tooltip="Filter by term FDR") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") box = gui.widgetBox(box, "Significance test") gui.radioButtonsInBox(box, self, "probFunc", ["Binomial", "Hypergeometric"], tooltips=["Use binomial distribution test", "Use hypergeometric distribution test"], callback=self.__invalidate) # TODO: only update the p values box = gui.widgetBox(self.filterTab, "Evidence codes in annotation", addSpace=True) self.evidenceCheckBoxDict = {} for etype in go.evidenceTypesOrdered: ecb = QCheckBox( etype, toolTip=go.evidenceTypes[etype], checked=self.useEvidenceType[etype]) ecb.toggled.connect(self.__on_evidenceChanged) box.layout().addWidget(ecb) self.evidenceCheckBoxDict[etype] = ecb # Select tab self.selectTab = gui.createTabPage(self.tabs, "Select") box = gui.radioButtonsInBox( self.selectTab, self, "selectionDirectAnnotation", ["Directly or Indirectly", "Directly"], box="Annotated genes", callback=self.ExampleSelection) box = gui.widgetBox(self.selectTab, "Output", addSpace=True) gui.radioButtonsInBox( box, self, "selectionDisjoint", btnLabels=["All selected genes", "Term-specific genes", "Common term genes"], tooltips=["Outputs genes annotated to all selected GO terms", "Outputs genes that appear in only one of selected GO terms", "Outputs genes common to all selected GO terms"], callback=self.ExampleSelection) # ListView for DAG, and table for significant GOIDs self.DAGcolumns = ['GO term', 'Cluster', 'Reference', 'p-value', 'FDR', 'Genes', 'Enrichment'] self.splitter = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitter) # list view self.listView = GOTreeWidget(self.splitter) self.listView.setSelectionMode(QTreeView.ExtendedSelection) self.listView.setAllColumnsShowFocus(1) self.listView.setColumnCount(len(self.DAGcolumns)) self.listView.setHeaderLabels(self.DAGcolumns) self.listView.header().setSectionsClickable(True) self.listView.header().setSortIndicatorShown(True) self.listView.header().setSortIndicator(self.DAGcolumns.index('p-value'), Qt.AscendingOrder) self.listView.setSortingEnabled(True) self.listView.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.listView.setRootIsDecorated(True) self.listView.itemSelectionChanged.connect(self.ViewSelectionChanged) # table of significant GO terms self.sigTerms = QTreeWidget(self.splitter) self.sigTerms.setColumnCount(len(self.DAGcolumns)) self.sigTerms.setHeaderLabels(self.DAGcolumns) self.sigTerms.setSortingEnabled(True) self.sigTerms.setSelectionMode(QTreeView.ExtendedSelection) self.sigTerms.header().setSortIndicator(self.DAGcolumns.index('p-value'), Qt.AscendingOrder) self.sigTerms.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.sigTerms.itemSelectionChanged.connect(self.TableSelectionChanged) self.sigTableTermsSorted = [] self.graph = {} self.originalGraph = None self.inputTab.layout().addStretch(1) self.filterTab.layout().addStretch(1) self.selectTab.layout().addStretch(1) class AnnotationSlot(SimpleNamespace): taxid = ... # type: str name = ... # type: str filename = ... # type:str @staticmethod def parse_tax_id(f_name): return f_name.split('.')[1] try: remote_files = serverfiles.ServerFiles().listfiles(DOMAIN) except (ConnectTimeout, RequestException, ConnectionError): # TODO: Warn user about failed connection to the remote server remote_files = [] self.available_annotations = [ AnnotationSlot( taxid=AnnotationSlot.parse_tax_id(annotation_file), name=taxonomy.common_taxid_to_name(AnnotationSlot.parse_tax_id(annotation_file)), filename=FILENAME_ANNOTATION.format(AnnotationSlot.parse_tax_id(annotation_file)) ) for _, annotation_file in set(remote_files + serverfiles.listfiles(DOMAIN)) if annotation_file != FILENAME_ONTOLOGY ] self._executor = ThreadExecutor()
def __init__(self): super().__init__() self.methods = [ ("number_of_nodes", True, "Number of nodes", GRAPHLEVEL, lambda G: G.number_of_nodes()), ("number_of_edges", True, "Number of edges", GRAPHLEVEL, lambda G: G.number_of_edges()), ("average_degree", True, "Average degree", GRAPHLEVEL, lambda G: np.average(list(G.degree().values()))), ("diameter", False, "Diameter", GRAPHLEVEL, nx.diameter), ("radius", False, "Radius", GRAPHLEVEL, nx.radius), ("average_shortest_path_length", False, "Average shortest path length", GRAPHLEVEL, nx.average_shortest_path_length), ("density", True, "Density", GRAPHLEVEL, nx.density), ("degree_assortativity_coefficient", False, \ "Degree assortativity coefficient", GRAPHLEVEL, \ nx.degree_assortativity_coefficient if \ hasattr(nx, "degree_assortativity_coefficient") else None), # additional attr needed #("attribute_assortativity_coefficient", False, "Attribute assortativity coefficient", GRAPHLEVEL, nx.attribute_assortativity_coefficient), #("numeric_assortativity_coefficient", False, "Numeric assortativity coefficient", GRAPHLEVEL, nx.numeric_assortativity_coefficient), ("degree_pearson_correlation_coefficient", False, \ "Degree pearson correlation coefficient", GRAPHLEVEL, \ nx.degree_pearson_correlation_coefficient if\ hasattr(nx, "degree_pearson_correlation_coefficient") else None), ("estrada_index", False, "Estrada index", GRAPHLEVEL, \ nx.estrada_index if hasattr(nx, "estrada_index") else None), ("graph_clique_number", False, "Graph clique number", GRAPHLEVEL, nx.graph_clique_number), ("graph_number_of_cliques", False, "Graph number of cliques", GRAPHLEVEL, nx.graph_number_of_cliques), ("transitivity", False, "Graph transitivity", GRAPHLEVEL, nx.transitivity), ("average_clustering", False, "Average clustering coefficient", GRAPHLEVEL, nx.average_clustering), ("number_connected_components", False, "Number of connected components", GRAPHLEVEL, nx.number_connected_components), ("number_strongly_connected_components", False, "Number of strongly connected components", GRAPHLEVEL, nx.number_strongly_connected_components), ("number_weakly_connected_components", False, "Number of weakly connected components", GRAPHLEVEL, nx.number_weakly_connected_components), ("number_attracting_components", False, "Number of attracting components", GRAPHLEVEL, nx.number_attracting_components), # TODO: input parameters #("max_flow", False, "Maximum flow", GRAPHLEVEL, nx.max_flow), #("min_cut", False, "Minimum cut", GRAPHLEVEL, nx.min_cut), #("ford_fulkerson", False, "Maximum single-commodity flow (Ford-Fulkerson)", GRAPHLEVEL, nx.ford_fulkerson), #("min_cost_flow_cost", False, "min_cost_flow_cost", GRAPHLEVEL, nx.min_cost_flow_cost), # returns dict of dict #("shortest_path_length", False, "Shortest path length", GRAPHLEVEL, nx.shortest_path_length), ("degree", False, "Degree", NODELEVEL, nx.degree), ("in_degree", False, "In-degree", NODELEVEL, lambda G: G.in_degree()), ("out_degree", False, "Out-degree", NODELEVEL, lambda G: G.out_degree()), ("average_neighbor_degree", False, "Average neighbor degree", NODELEVEL, nx.average_neighbor_degree), ("clustering", False, "Clustering coefficient", NODELEVEL, nx.clustering), ("triangles", False, "Number of triangles", NODELEVEL, nx.triangles), ("square_clustering", False, "Squares clustering coefficient", NODELEVEL, nx.square_clustering), ("number_of_cliques", False, "Number of cliques", NODELEVEL, nx.number_of_cliques), ("degree_centrality", False, "Degree centrality", NODELEVEL, nx.degree_centrality), ("in_degree_centrality", False, "In-egree centrality", NODELEVEL, nx.in_degree_centrality), ("out_degree_centrality", False, "Out-degree centrality", NODELEVEL, nx.out_degree_centrality), ("closeness_centrality", False, "Closeness centrality", NODELEVEL, nx.closeness_centrality), ("betweenness_centrality", False, "Betweenness centrality", NODELEVEL, nx.betweenness_centrality), ("current_flow_closeness_centrality", False, "Information centrality", NODELEVEL, nx.current_flow_closeness_centrality), ("current_flow_betweenness_centrality", False, "Random-walk betweenness centrality", NODELEVEL, nx.current_flow_betweenness_centrality), ("approximate_current_flow_betweenness_centrality", False, \ "Approx. random-walk betweenness centrality", NODELEVEL, \ nx.approximate_current_flow_betweenness_centrality if \ hasattr(nx, "approximate_current_flow_betweenness_centrality") \ else None), ("eigenvector_centrality", False, "Eigenvector centrality", NODELEVEL, nx.eigenvector_centrality), ("eigenvector_centrality_numpy", False, "Eigenvector centrality (NumPy)", NODELEVEL, nx.eigenvector_centrality_numpy), ("load_centrality", False, "Load centrality", NODELEVEL, nx.load_centrality), ("core_number", False, "Core number", NODELEVEL, nx.core_number), ("eccentricity", False, "Eccentricity", NODELEVEL, nx.eccentricity), ("closeness_vitality", False, "Closeness vitality", NODELEVEL, nx.closeness_vitality), ] """ TODO: add average-degree_connectivity is_bipartite is_chordal katz_centrality katz_centrality_numpy communicability communicability_exp communicability_centrality communicability_centrality_exp communicability_betweenness_centrality average_node_connectivity is_directed_acyclic_graph center ?? """ self.methods = [ method for method in self.methods if method[-1] is not None ] self.auto_commit = False self.tab_index = 0 self.mutex = QtCore.QMutex() self.graph = None self.items = None # items set by Items signal self.items_graph = None # items set by graph.items by Network signal self.items_analysis = None # items to output and merge with analysis result self.job_queue = [] self.job_working = [] self.analfeatures = [] self.analdata = {} for method in self.methods: setattr(self, method[0], method[1]) setattr(self, "lbl_" + method[0], "") self.tabs = gui.tabWidget(self.controlArea) self.tabs.setMinimumWidth(450) self.graphIndices = gui.createTabPage(self.tabs, "Graph-level indices") self.nodeIndices = gui.createTabPage(self.tabs, "Node-level indices") self.tabs.setCurrentIndex(self.tab_index) self.tabs.currentChanged.connect( lambda index: setattr(self, 'tab_index', index)) for name, default, label, type, algorithm in self.methods: if type == NODELEVEL: box = gui.widgetBox(self.nodeIndices, orientation="horizontal") elif type == GRAPHLEVEL: box = gui.widgetBox(self.graphIndices, orientation="horizontal") gui.checkBox(box, self, name, label=label, callback=lambda n=name: self.method_clicked(n)) box.layout().addStretch(1) lbl = gui.label(box, self, "%(lbl_" + name + ")s") setattr(self, "tool_" + name, lbl) self.graphIndices.layout().addStretch(1) self.nodeIndices.layout().addStretch(1) gui.checkBox(self.controlArea, self, "auto_commit", label="Commit automatically") hb = gui.widgetBox(self.controlArea, None, orientation='horizontal') self.btnCommit = gui.button(hb, self, "Commit", callback=self.analyze, toggleButton=1) self.btnStopA = gui.button( hb, self, "Cancel", callback=lambda: self.stop_job(current=False)) self.btnStopA.setEnabled(False)
def __init__(self): super().__init__() # self.resetSettings() ################################# # FIX A WEIRD BEHAVIOUR AFTER DISPLAY # THE WIDGET: PROBABLY ON SIGNAL MANAGER self.dumpSettings() self.controlArea.setFixedWidth(self.CONTROL_AREA_WIDTH) tabs_setting = gui.tabWidget(self.controlArea) tabs_setting.setFixedWidth(495) tabs_setting.setFixedHeight(750) tab_bas = ShadowGui.createTabPage(tabs_setting, "Basic Setting") tab_adv = ShadowGui.createTabPage(tabs_setting, "Advanced Setting") ShadowGui.lineEdit(tab_bas, self, "p", "Distance Source - DCM center (P) [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "q", "Distance DCM center - Image plane (Q) [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "separation", "Separation between the Crystals [cm]\n(from center of 1st C. to center of 2nd C.) ", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "photon_energy_ev", "Photon Eneergy [eV]", labelWidth=350, valueType=float, orientation="horizontal") self.le_reflectivity_file = ShadowGui.lineEdit(tab_bas, self, "reflectivity_file", "Reflectivity File", labelWidth=150, valueType=str, orientation="horizontal") gui.separator(tab_bas, height=10) self.tab_crystals = gui.tabWidget(tab_bas) tab_first_crystal = ShadowGui.createTabPage(self.tab_crystals, "First Crystal") tab_second_crystal = ShadowGui.createTabPage(self.tab_crystals, "Second Crystal") self.crystal_1_box = CrystalBox(dcm=self, parent=tab_first_crystal, has_finite_dimensions=self.has_finite_dimensions[0], dimensions=self.dimensions[0]) self.crystal_2_box = CrystalBox(dcm=self, parent=tab_second_crystal, has_finite_dimensions=self.has_finite_dimensions[1], dimensions=self.dimensions[1]) adv_other_box = ShadowGui.widgetBox(tab_adv, "Optional file output", addSpace=False, orientation="vertical") gui.comboBox(adv_other_box, self, "file_to_write_out", label="Files to write out", labelWidth=310, items=["All", "Mirror", "Image", "None"], sendSelectedValue=False, orientation="horizontal") button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Run Shadow/trace", callback=self.traceOpticalElement) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button = gui.button(button_box, self, "Reset Fields", callback=self.callResetSettings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(100)
def __init__(self): super().__init__() self.controlArea = QWidget(self.controlArea) self.layout().addWidget(self.controlArea) layout = QGridLayout() self.controlArea.setLayout(layout) layout.setContentsMargins(4, 4, 4, 4) self.methods = [method for method in METHODS if method[-1] is not None] self.tab_index = 0 self.mutex = QMutex() self.graph = None self.items = None # items set by Items signal self.items_graph = None # items set by graph.items by Network signal self.items_analysis = None # items to output and merge with analysis result self.job_queue = [] self.job_working = [] self.analfeatures = [] self.analdata = {} for method in self.methods: setattr(self, method[0], method[0] in self.enabled_methods) setattr(self, "lbl_" + method[0], "") self.tabs = gui.tabWidget(self.controlArea) self.tabs.setMinimumWidth(450) self.graphIndices = gui.createTabPage(self.tabs, "Graph-level indices") self.nodeIndices = gui.createTabPage(self.tabs, "Node-level indices") self.tabs.setCurrentIndex(self.tab_index) self.tabs.currentChanged.connect( lambda index: setattr(self, 'tab_index', index)) a = {NODELEVEL: self.nodeIndices, GRAPHLEVEL: self.graphIndices} for name, _, label, type, algorithm in self.methods: box = gui.widgetBox(a[type], orientation="horizontal") gui.checkBox(box, self, name, label=label, callback=lambda n=name: self.method_clicked(n)) box.layout().addStretch(1) lbl = gui.label(box, self, "%(lbl_" + name + ")s") setattr(self, "tool_" + name, lbl) self.graphIndices.layout().addStretch(1) self.nodeIndices.layout().addStretch(1) autobox = gui.auto_commit(None, self, "auto_commit", "Commit", commit=self.analyze) layout.addWidget(autobox, 3, 0, 1, 1) cancel = gui.button(None, self, "Cancel", callback=lambda: self.stop_job(current=False)) autobox.layout().insertWidget(3, cancel) autobox.layout().insertSpacing(2, 10) cancel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
def __init__(self): super().__init__() # self.resetSettings() ################################# # FIX A WEIRD BEHAVIOUR AFTER DISPLAY # THE WIDGET: PROBABLY ON SIGNAL MANAGER self.dumpSettings() self.controlArea.setFixedWidth(self.CONTROL_AREA_WIDTH) tabs_setting = gui.tabWidget(self.controlArea) tabs_setting.setFixedWidth(495) tabs_setting.setFixedHeight(750) tab_bas = ShadowGui.createTabPage(tabs_setting, "Basic Setting") tab_adv = ShadowGui.createTabPage(tabs_setting, "Advanced Setting") ShadowGui.lineEdit(tab_bas, self, "p", "Distance Source - KB center (P) [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "q", "Distance KB center - Image plane (Q) [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "separation", "Separation between the Mirrors [cm]\n(from center of V.F.M. to center of H.F.M.) ", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(tab_bas, self, "mirror_orientation_angle", "Mirror orientation angle [deg]\n(with respect to the previous o.e. for the first mirror)", labelWidth=350, valueType=float, orientation="horizontal") gui.comboBox(tab_bas, self, "use_different_focal_positions", label="Different Focal Positions", labelWidth=350, items=["No", "Yes"], sendSelectedValue=False, orientation="horizontal", callback=self.set_use_different_focal_positions) self.focal_positions_box = ShadowGui.widgetBox(tab_bas, "", addSpace=False, orientation="vertical", height=45) self.focal_positions_empty = ShadowGui.widgetBox(tab_bas, "", addSpace=False, orientation="vertical", height=45) ShadowGui.lineEdit(self.focal_positions_box, self, "focal_positions_p", "Focal Position P [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.focal_positions_box, self, "focal_positions_q", "Focal Position Q [cm]", labelWidth=350, valueType=float, orientation="horizontal") self.set_use_different_focal_positions() gui.separator(tab_bas, height=10) self.tab_mirrors = gui.tabWidget(tab_bas) tab_vertical = ShadowGui.createTabPage(self.tab_mirrors, "Vertical Focusing Mirror") tab_horizontal = ShadowGui.createTabPage(self.tab_mirrors, "Horizontal Focusing Mirror") self.v_box = MirrorBox(kb=self, parent=tab_vertical, grazing_angles_mrad=self.grazing_angles_mrad[0], shape=self.shape[0], has_finite_dimensions=self.has_finite_dimensions[0], dimensions=self.dimensions[0], reflectivity_kind=self.reflectivity_kind[0], reflectivity_files=self.reflectivity_files[0], has_surface_error=self.has_surface_error[0], surface_error_files=self.surface_error_files[0]) self.h_box = MirrorBox(kb=self, parent=tab_horizontal, grazing_angles_mrad=self.grazing_angles_mrad[1], shape=self.shape[1], has_finite_dimensions=self.has_finite_dimensions[1], dimensions=self.dimensions[1], reflectivity_kind=self.reflectivity_kind[1], reflectivity_files=self.reflectivity_files[1], has_surface_error=self.has_surface_error[1], surface_error_files=self.surface_error_files[1]) adv_other_box = ShadowGui.widgetBox(tab_adv, "Optional file output", addSpace=False, orientation="vertical") gui.comboBox(adv_other_box, self, "file_to_write_out", label="Files to write out", labelWidth=310, items=["All", "Mirror", "Image", "None"], sendSelectedValue=False, orientation="horizontal") button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Run Shadow/trace", callback=self.traceOpticalElement) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button = gui.button(button_box, self, "Reset Fields", callback=self.callResetSettings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(100)
def __init__(self, show_automatic_box=True): super().__init__() geom = QApplication.desktop().availableGeometry() self.setGeometry(QRect(round(geom.width()*0.05), round(geom.height()*0.05), round(min(geom.width()*0.98, self.WIDGET_WIDTH)), round(min(geom.height()*0.95, self.WIDGET_HEIGHT)))) gen_box = gui.widgetBox(self.mainArea, "Beamline Info", addSpace=True, orientation="horizontal") tabs_setting = gui.tabWidget(gen_box) tabs_setting.setFixedHeight(self.WIDGET_HEIGHT-60) tabs_setting.setFixedWidth(self.WIDGET_WIDTH-60) tab_sys = ShadowGui.createTabPage(tabs_setting, "Sys Info") tab_mir = ShadowGui.createTabPage(tabs_setting, "OE Info") tab_sou = ShadowGui.createTabPage(tabs_setting, "Source Info") tab_scr = ShadowGui.createTabPage(tabs_setting, "Python Script") tab_out = ShadowGui.createTabPage(tabs_setting, "System Output") self.sysInfo = QtGui.QTextEdit() self.sysInfo.setReadOnly(True) self.sysInfo.setMaximumHeight(self.WIDGET_HEIGHT-100) self.mirInfo = QtGui.QTextEdit() self.mirInfo.setReadOnly(True) self.mirInfo.setMaximumHeight(self.WIDGET_HEIGHT-100) self.sourceInfo = QtGui.QTextEdit() self.sourceInfo.setReadOnly(True) self.sourceInfo.setMaximumHeight(self.WIDGET_HEIGHT-100) self.pythonScript = QtGui.QTextEdit() self.pythonScript.setReadOnly(False) # asked by Manolo self.pythonScript.setMaximumHeight(self.WIDGET_HEIGHT - 300) sys_box = ShadowGui.widgetBox(tab_sys, "", addSpace=True, orientation="horizontal", height = self.WIDGET_HEIGHT-80, width = self.WIDGET_WIDTH-80) sys_box.layout().addWidget(self.sysInfo) mir_box = ShadowGui.widgetBox(tab_mir, "", addSpace=True, orientation="horizontal", height = self.WIDGET_HEIGHT-80, width = self.WIDGET_WIDTH-80) mir_box.layout().addWidget(self.mirInfo) source_box = ShadowGui.widgetBox(tab_sou, "", addSpace=True, orientation="horizontal", height = self.WIDGET_HEIGHT-80, width = self.WIDGET_WIDTH-80) source_box.layout().addWidget(self.sourceInfo) script_box = ShadowGui.widgetBox(tab_scr, "", addSpace=True, orientation="vertical", height=self.WIDGET_HEIGHT - 80, width=self.WIDGET_WIDTH - 80) script_box.layout().addWidget(self.pythonScript) console_box = ShadowGui.widgetBox(script_box, "", addSpace=True, orientation="vertical", height=150, width=self.WIDGET_WIDTH - 80) self.console = PythonConsole(self.__dict__, self) console_box.layout().addWidget(self.console) self.shadow_output = QtGui.QTextEdit() self.shadow_output.setReadOnly(True) out_box = ShadowGui.widgetBox(tab_out, "System Output", addSpace=True, orientation="horizontal", height=self.WIDGET_HEIGHT - 80) out_box.layout().addWidget(self.shadow_output) ############################# button_box = ShadowGui.widgetBox(tab_scr, "", addSpace=True, orientation="horizontal") gui.button(button_box, self, "Run Script", callback=self.execute_script, height=40) gui.button(button_box, self, "Save Script to File", callback=self.save_script, height=40)
def __init__(self, parent=None): super().__init__(self, parent) self.clusterDataset = None self.referenceDataset = None self.ontology = None self.annotations = None self.loadedAnnotationCode = "---" self.treeStructRootKey = None self.probFunctions = [stats.Binomial(), stats.Hypergeometric()] self.selectedTerms = [] self.selectionChanging = 0 self.__state = OWGOEnrichmentAnalysis.Initializing self.annotationCodes = [] ############# ## GUI ############# self.tabs = gui.tabWidget(self.controlArea) ## Input tab self.inputTab = gui.createTabPage(self.tabs, "Input") box = gui.widgetBox(self.inputTab, "Info") self.infoLabel = gui.widgetLabel(box, "No data on input\n") gui.button(box, self, "Ontology/Annotation Info", callback=self.ShowInfo, tooltip="Show information on loaded ontology and annotations") box = gui.widgetBox(self.inputTab, "Organism") self.annotationComboBox = gui.comboBox( box, self, "annotationIndex", items=self.annotationCodes, callback=self._updateEnrichment, tooltip="Select organism") genebox = gui.widgetBox(self.inputTab, "Gene Names") self.geneAttrIndexCombo = gui.comboBox( genebox, self, "geneAttrIndex", callback=self._updateEnrichment, tooltip="Use this attribute to extract gene names from input data") self.geneAttrIndexCombo.setDisabled(self.useAttrNames) cb = gui.checkBox(genebox, self, "useAttrNames", "Use column names", tooltip="Use column names for gene names", callback=self._updateEnrichment) cb.toggled[bool].connect(self.geneAttrIndexCombo.setDisabled) gui.button(genebox, self, "Gene matcher settings", callback=self.UpdateGeneMatcher, tooltip="Open gene matching settings dialog") self.referenceRadioBox = gui.radioButtonsInBox( self.inputTab, self, "useReferenceDataset", ["Entire genome", "Reference set (input)"], tooltips=["Use entire genome for reference", "Use genes from Referece Examples input signal as reference"], box="Reference", callback=self._updateEnrichment) self.referenceRadioBox.buttons[1].setDisabled(True) gui.radioButtonsInBox( self.inputTab, self, "aspectIndex", ["Biological process", "Cellular component", "Molecular function"], box="Aspect", callback=self._updateEnrichment) ## Filter tab self.filterTab = gui.createTabPage(self.tabs, "Filter") box = gui.widgetBox(self.filterTab, "Filter GO Term Nodes") gui.checkBox(box, self, "filterByNumOfInstances", "Genes", callback=self.FilterAndDisplayGraph, tooltip="Filter by number of input genes mapped to a term") ibox = gui.indentedBox(box) gui.spin(ibox, self, 'minNumOfInstances', 1, 100, step=1, label='#:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Min. number of input genes mapped to a term") gui.checkBox(box, self, "filterByPValue_nofdr", "p-value", callback=self.FilterAndDisplayGraph, tooltip="Filter by term p-value") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue_nofdr', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") #use filterByPValue for FDR, as it was the default in prior versions gui.checkBox(box, self, "filterByPValue", "FDR", callback=self.FilterAndDisplayGraph, tooltip="Filter by term FDR") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") box = gui.widgetBox(box, "Significance test") gui.radioButtonsInBox(box, self, "probFunc", ["Binomial", "Hypergeometric"], tooltips=["Use binomial distribution test", "Use hypergeometric distribution test"], callback=self._updateEnrichment) box = gui.widgetBox(self.filterTab, "Evidence codes in annotation", addSpace=True) self.evidenceCheckBoxDict = {} for etype in go.evidenceTypesOrdered: ecb = QCheckBox( etype, toolTip=go.evidenceTypes[etype], checked=self.useEvidenceType[etype]) ecb.toggled.connect(self.__on_evidenceChanged) box.layout().addWidget(ecb) self.evidenceCheckBoxDict[etype] = ecb ## Select tab self.selectTab = gui.createTabPage(self.tabs, "Select") box = gui.radioButtonsInBox( self.selectTab, self, "selectionDirectAnnotation", ["Directly or Indirectly", "Directly"], box="Annotated genes", callback=self.ExampleSelection) box = gui.widgetBox(self.selectTab, "Output", addSpace=True) gui.radioButtonsInBox( box, self, "selectionDisjoint", btnLabels=["All selected genes", "Term-specific genes", "Common term genes"], tooltips=["Outputs genes annotated to all selected GO terms", "Outputs genes that appear in only one of selected GO terms", "Outputs genes common to all selected GO terms"], callback=[self.ExampleSelection, self.UpdateAddClassButton]) self.addClassCB = gui.checkBox( box, self, "selectionAddTermAsClass", "Add GO Term as class", callback=self.ExampleSelection) # ListView for DAG, and table for significant GOIDs self.DAGcolumns = ['GO term', 'Cluster', 'Reference', 'p-value', 'FDR', 'Genes', 'Enrichment'] self.splitter = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitter) # list view self.listView = GOTreeWidget(self.splitter) self.listView.setSelectionMode(QTreeView.ExtendedSelection) self.listView.setAllColumnsShowFocus(1) self.listView.setColumnCount(len(self.DAGcolumns)) self.listView.setHeaderLabels(self.DAGcolumns) self.listView.header().setSectionsClickable(True) self.listView.header().setSortIndicatorShown(True) self.listView.setSortingEnabled(True) self.listView.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.listView.setRootIsDecorated(True) self.listView.itemSelectionChanged.connect(self.ViewSelectionChanged) # table of significant GO terms self.sigTerms = QTreeWidget(self.splitter) self.sigTerms.setColumnCount(len(self.DAGcolumns)) self.sigTerms.setHeaderLabels(self.DAGcolumns) self.sigTerms.setSortingEnabled(True) self.sigTerms.setSelectionMode(QTreeView.ExtendedSelection) self.sigTerms.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.sigTerms.itemSelectionChanged.connect(self.TableSelectionChanged) self.sigTableTermsSorted = [] self.graph = {} self.inputTab.layout().addStretch(1) self.filterTab.layout().addStretch(1) self.selectTab.layout().addStretch(1) self.setBlocking(True) self._executor = ThreadExecutor() self._init = EnsureDownloaded( [(taxonomy.Taxonomy.DOMAIN, taxonomy.Taxonomy.FILENAME), ("GO", "taxonomy.pickle")] ) self._init.finished.connect(self.__initialize_finish) self._executor.submit(self._init)
def __init__(self): super().__init__() self.inputs = OrderedDict() self.dist_color = QtGui.QColor(*self.dist_color_RGB) info_box = gui.widgetBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel( info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) gui.separator(info_box) gui.button(info_box, self, "Restore Original Order", callback=self.restore_order, tooltip="Show rows in the original order", autoDefault=False) info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.widgetBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self._on_show_variable_labels_changed) gui.checkBox(box, self, "show_distributions", 'Visualize continuous values', callback=self._on_distribution_color_changed) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self._on_distribution_color_changed) gui.button(box, self, "Set colors", self.set_colors, autoDefault=False, tooltip="Set the background color and color palette") box = gui.widgetBox(self.controlArea, "Selection") gui.checkBox(box, self, "select_rows", "Select full rows", callback=self._on_select_rows_changed) gui.rubber(self.controlArea) gui.auto_commit(self.controlArea, self, "auto_commit", "Send Selected Rows", "Auto send is on") dlg = self.create_color_dialog() self.discPalette = dlg.getDiscretePalette("discPalette") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.currentChanged.connect(self._on_current_tab_changed) copy = QtGui.QAction("Copy", self, shortcut=QtGui.QKeySequence.Copy, triggered=self.copy) self.addAction(copy)
def __init__(self): super().__init__() #self.contextHandlers = {"": DomainContextHandler("", [ContextField("attributes", selected="node_label_attrs"), ContextField("attributes", selected="tooltipAttributes"), "color"])} self.view = GraphView(self) self.mainArea.layout().addWidget(self.view) self.graph_attrs = [] self.acceptingEnterKeypress = False self.node_label_attrs = [] self.tooltipAttributes = [] self.searchStringTimer = QTimer(self) self.markInputItems = None self.node_color_attr = 0 self.node_size_attr = 0 self.nHighlighted = 0 self.nSelected = 0 self.verticesPerEdge = 0 self.edgesPerVertex = 0 self.lastVertexSizeColumn = '' self.lastColorColumn = '' self.lastLabelColumns = set() self.lastTooltipColumns = set() self.items_matrix = None self.number_of_nodes_label = 0 self.number_of_edges_label = 0 self.graph = None self.setMinimumWidth(600) self.tabs = gui.tabWidget(self.controlArea) self.displayTab = gui.createTabPage(self.tabs, "Display") self.markTab = gui.createTabPage(self.tabs, "Marking") def on_tab_changed(index): self.tabIndex = index self.set_selection_mode() self.tabs.currentChanged.connect(on_tab_changed) self.tabs.setCurrentIndex(self.tabIndex) ib = gui.widgetBox(self.displayTab, "Info") gui.label( ib, self, "Nodes: %(number_of_nodes_label)i (%(verticesPerEdge).2f per edge)" ) gui.label( ib, self, "Edges: %(number_of_edges_label)i (%(edgesPerVertex).2f per node)") box = gui.widgetBox(self.displayTab, "Nodes") self.relayout_button = gui.button(box, self, 'Re-layout', callback=self.relayout, autoDefault=False) self.view.positionsChanged.connect( lambda _: self.progressbar.advance()) def animationFinished(): self.relayout_button.setEnabled(True) self.progressbar.finish() self.view.animationFinished.connect(animationFinished) self.colorCombo = gui.comboBox(box, self, "node_color_attr", label='Color:', orientation='horizontal', callback=self.set_node_colors) self.invertNodeSizeCheck = self.maxNodeSizeSpin = QWidget( ) # Forward declaration self.nodeSizeCombo = gui.comboBox(box, self, "node_size_attr", label='Size:', orientation='horizontal', callback=self.set_node_sizes) hb = gui.widgetBox(box, orientation="horizontal") hb.layout().addStretch(1) self.minNodeSizeSpin = gui.spin(hb, self, "minNodeSize", 1, 50, step=1, label="Min:", callback=self.set_node_sizes) self.minNodeSizeSpin.setValue(8) gui.separator(hb) self.maxNodeSizeSpin = gui.spin(hb, self, "maxNodeSize", 10, 200, step=5, label="Max:", callback=self.set_node_sizes) self.maxNodeSizeSpin.setValue(50) gui.separator(hb) self.invertNodeSizeCheck = gui.checkBox(hb, self, "invertNodeSize", "Invert", callback=self.set_node_sizes) hb = gui.widgetBox(self.displayTab, box="Node labels | tooltips", orientation="horizontal", addSpace=False) self.attListBox = gui.listBox( hb, self, "node_label_attrs", "graph_attrs", selectionMode=QListWidget.MultiSelection, sizeHint=QSize(100, 100), callback=self._on_node_label_attrs_changed) self.tooltipListBox = gui.listBox( hb, self, "tooltipAttributes", "graph_attrs", selectionMode=QListWidget.MultiSelection, sizeHint=QSize(100, 100), callback=self._clicked_tooltip_lstbox) eb = gui.widgetBox(self.displayTab, "Edges", orientation="vertical") self.checkbox_relative_edges = gui.checkBox( eb, self, 'relativeEdgeWidths', 'Relative edge widths', callback=self.set_edge_sizes) self.checkbox_show_weights = gui.checkBox( eb, self, 'showEdgeWeights', 'Show edge weights', callback=self.set_edge_labels) ib = gui.widgetBox(self.markTab, "Info", orientation="vertical") gui.label(ib, self, "Nodes: %(number_of_nodes_label)i") gui.label(ib, self, "Selected: %(nSelected)i") gui.label(ib, self, "Highlighted: %(nHighlighted)i") def on_selection_change(): self.nSelected = len(self.view.getSelected()) self.nHighlighted = len(self.view.getHighlighted()) self.set_selection_mode() self.commit() self.view.selectionChanged.connect(on_selection_change) ib = gui.widgetBox(self.markTab, "Highlight nodes ...") ribg = gui.radioButtonsInBox(ib, self, "selectionMode", callback=self.set_selection_mode) gui.appendRadioButton(ribg, "None") gui.appendRadioButton(ribg, "... whose attributes contain:") self.ctrlMarkSearchString = gui.lineEdit( gui.indentedBox(ribg), self, "markSearchString", callback=self._set_search_string_timer, callbackOnType=True) self.searchStringTimer.timeout.connect(self.set_selection_mode) gui.appendRadioButton(ribg, "... neighbours of selected, ≤ N hops away") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkDistance = gui.spin( ib, self, "markDistance", 1, 100, 1, label="Hops:", callback=lambda: self.set_selection_mode(SelectionMode.NEIGHBORS)) ib.layout().addStretch(1) gui.appendRadioButton(ribg, "... with at least N connections") gui.appendRadioButton(ribg, "... with at most N connections") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkNConnections = gui.spin( ib, self, "markNConnections", 0, 1000000, 1, label="Connections:", callback=lambda: self.set_selection_mode( SelectionMode.AT_MOST_N if self.selectionMode == SelectionMode. AT_MOST_N else SelectionMode.AT_LEAST_N)) ib.layout().addStretch(1) gui.appendRadioButton(ribg, "... with more connections than any neighbor") gui.appendRadioButton( ribg, "... with more connections than average neighbor") gui.appendRadioButton(ribg, "... with most connections") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkNumber = gui.spin( ib, self, "markNBest", 1, 1000000, 1, label="Number of nodes:", callback=lambda: self.set_selection_mode(SelectionMode.MOST_CONN)) ib.layout().addStretch(1) self.markInputRadioButton = gui.appendRadioButton( ribg, "... from Node Subset input signal") self.markInputRadioButton.setEnabled(True) gui.auto_commit(ribg, self, 'do_auto_commit', 'Output changes') self.markTab.layout().addStretch(1) self.set_graph(None) self.set_selection_mode()
def __init__(self): super().__init__() self.controlArea.setFixedWidth(self.CONTROL_AREA_WIDTH) tabs_setting = gui.tabWidget(self.controlArea) tab_bas = ShadowGui.createTabPage(tabs_setting, "Basic Setting") tab_adv = ShadowGui.createTabPage(tabs_setting, "Advanced Setting") crl_box = ShadowGui.widgetBox(tab_bas, "C.R.L. Input Parameters", addSpace=False, orientation="vertical", height=100, width=450) ShadowGui.lineEdit(crl_box, self, "nlenses", "Number of lenses", labelWidth=350, valueType=int, orientation="horizontal") ShadowGui.lineEdit(crl_box, self, "slots_empty", "Number of empty slots", labelWidth=350, valueType=int, orientation="horizontal") ShadowGui.lineEdit(crl_box, self, "thickness", "Piling thickness [cm]", labelWidth=350, valueType=float, orientation="horizontal") lens_box = ShadowGui.widgetBox(tab_bas, "Single Lens Input Parameters", addSpace=False, orientation="vertical", height=500, width=450) ShadowGui.lineEdit(lens_box, self, "p", "Distance Source-First lens interface (P) [cm]", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(lens_box, self, "q", "Distance Last lens interface-Image plane (Q) [cm]", labelWidth=350, valueType=float, orientation="horizontal") gui.separator(lens_box) gui.comboBox(lens_box, self, "has_finite_diameter", label="Lens Diameter", labelWidth=350, items=["Finite", "Infinite"], callback=self.set_diameter, sendSelectedValue=False, orientation="horizontal") self.diameter_box = ShadowGui.widgetBox(lens_box, "", addSpace=False, orientation="vertical", height=20) self.diameter_box_empty = ShadowGui.widgetBox(lens_box, "", addSpace=False, orientation="vertical", height=20) ShadowGui.lineEdit(self.diameter_box, self, "diameter", "Lens Diameter Value [cm]", labelWidth=350, valueType=float, orientation="horizontal") self.set_diameter() gui.separator(lens_box) gui.comboBox(lens_box, self, "surface_shape", label="Surface Shape", labelWidth=350, items=["Sphere", "Paraboloid", "Plane"], callback=self.set_surface_shape, sendSelectedValue=False, orientation="horizontal") self.surface_shape_box = ShadowGui.widgetBox(lens_box, "", addSpace=False, orientation="vertical", height=20) self.surface_shape_box_empty = ShadowGui.widgetBox(lens_box, "", addSpace=False, orientation="vertical", height=20) ShadowGui.lineEdit(self.surface_shape_box, self, "radius", "Curvature Radius [cm]", labelWidth=350, valueType=float, orientation="horizontal") self.set_surface_shape() ShadowGui.lineEdit(lens_box, self, "interthickness", "Lens Thickness [cm]", labelWidth=350, valueType=float, orientation="horizontal") gui.comboBox(lens_box, self, "use_ccc", label="Use C.C.C.", labelWidth=350, items=["No", "Yes"], sendSelectedValue=False, orientation="horizontal") gui.comboBox(lens_box, self, "convex_to_the_beam", label="Convexity of the first interface exposed to the beam\n(the second interface has opposite convexity)", labelWidth=350, items=["No", "Yes"], sendSelectedValue=False, orientation="horizontal") gui.separator(lens_box) gui.comboBox(lens_box, self, "is_cylinder", label="Cylindrical", labelWidth=350, items=["No", "Yes"], callback=self.set_cylindrical, sendSelectedValue=False, orientation="horizontal") self.box_cyl = ShadowGui.widgetBox(lens_box, "", addSpace=True, orientation="vertical", height=25) self.box_cyl_empty = ShadowGui.widgetBox(lens_box, "", addSpace=True, orientation="vertical", height=25) gui.comboBox(self.box_cyl, self, "cylinder_angle", label="Cylinder Angle (deg)", labelWidth=350, items=["0 (Meridional)", "90 (Sagittal)"], sendSelectedValue=False, orientation="horizontal") self.set_cylindrical() gui.separator(lens_box) gui.comboBox(lens_box, self, "ri_calculation_mode", label="Refraction Index calculation mode", labelWidth=350, items=["User Parameters", "Prerefl File"], callback=self.set_ri_calculation_mode, sendSelectedValue=False, orientation="horizontal") self.calculation_mode_1 = ShadowGui.widgetBox(lens_box, "", addSpace=True, orientation="vertical", height=50) ShadowGui.lineEdit(self.calculation_mode_1, self, "refraction_index", "Refraction index", labelWidth=350, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.calculation_mode_1, self, "attenuation_coefficient", "Attenuation coefficient [cm-1]", labelWidth=350, valueType=float, orientation="horizontal") self.calculation_mode_2 = ShadowGui.widgetBox(lens_box, "", addSpace=True, orientation="vertical", height=50) ShadowGui.lineEdit(self.calculation_mode_2, self, "prerefl_file", "File Prerefl", labelWidth=150, valueType=str, orientation="horizontal") self.set_ri_calculation_mode() adv_other_box = ShadowGui.widgetBox(tab_adv, "Optional file output", addSpace=False, orientation="vertical") gui.comboBox(adv_other_box, self, "file_to_write_out", label="Files to write out", labelWidth=310, items=["All", "Mirror", "Image", "None"], sendSelectedValue=False, orientation="horizontal") gui.separator(self.controlArea, height=80) button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Run Shadow/trace", callback=self.traceOpticalElement) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button = gui.button(button_box, self, "Reset Fields", callback=self.callResetSettings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(100)
def __init__(self): super().__init__() self.output_corpus = None self.pubmed_api = None self.progress = None self.email_is_valid = False self.record_count = 0 self.download_running = False # To hold all the controls. Makes access easier. self.pubmed_controls = [] h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Email:') label.setMaximumSize(label.sizeHint()) # Drop-down for recent emails. self.email_combo = QComboBox(h_box) self.email_combo.setMinimumWidth(150) self.email_combo.setEditable(True) self.email_combo.lineEdit().textChanged.connect(self.sync_email) h_box.layout().addWidget(self.email_combo) self.email_combo.activated[int].connect(self.select_email) # RECORD SEARCH self.search_tabs = gui.tabWidget(self.controlArea) # --- Regular search --- regular_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Author self.author_input = gui.lineEdit(regular_search_box, self, 'author', 'Author:', orientation=Qt.Horizontal) self.pubmed_controls.append(self.author_input) h_box = gui.hBox(regular_search_box) year_box = gui.widgetBox(h_box, orientation=Qt.Horizontal) min_date = QDate.fromString( self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT ) if not self.pub_date_from: self.pub_date_from = self.MIN_DATE.strftime(self.PY_DATE_FORMAT) if not self.pub_date_to: self.pub_date_to = date.today().strftime(self.PY_DATE_FORMAT) self.date_from = QDateEdit( QDate.fromString(self.pub_date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True ) self.date_to = QDateEdit( QDate.fromString(self.pub_date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True ) self.date_from.dateChanged.connect( lambda date: setattr(self, 'pub_date_from', date.toString(self.QT_DATE_FORMAT))) self.date_to.dateChanged.connect( lambda date: setattr(self, 'pub_date_to', date.toString(self.QT_DATE_FORMAT))) self.pubmed_controls.append(self.date_from) self.pubmed_controls.append(self.date_to) gui.label(year_box, self, 'From:') year_box.layout().addWidget(self.date_from) gui.label(year_box, self, 'to:') year_box.layout().addWidget(self.date_to) # Keywords. h_box = gui.hBox(regular_search_box) label = gui.label(h_box, self, 'Query:') label.setMaximumSize(label.sizeHint()) self.keyword_combo = QComboBox(h_box) self.keyword_combo.setMinimumWidth(150) self.keyword_combo.setEditable(True) h_box.layout().addWidget(self.keyword_combo) self.keyword_combo.activated[int].connect(self.select_keywords) self.pubmed_controls.append(self.keyword_combo) tab_height = regular_search_box.sizeHint() regular_search_box.setMaximumSize(tab_height) # --- Advanced search --- advanced_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Advanced search query. h_box = gui.hBox(advanced_search_box) self.advanced_query_input = QTextEdit(h_box) h_box.layout().addWidget(self.advanced_query_input) self.advanced_query_input.setMaximumSize(tab_height) self.pubmed_controls.append(self.advanced_query_input) gui.createTabPage(self.search_tabs, 'Regular search', regular_search_box) gui.createTabPage(self.search_tabs, 'Advanced search', advanced_search_box) # Search info label. self.search_info_label = gui.label( self.controlArea, self, 'Number of records found: /') # Search for records button. self.run_search_button = gui.button( self.controlArea, self, 'Find records', callback=self.run_search, tooltip='Performs a search for articles that fit the ' 'specified parameters.') self.pubmed_controls.append(self.run_search_button) h_line = QFrame() h_line.setFrameShape(QFrame.HLine) h_line.setFrameShadow(QFrame.Sunken) self.controlArea.layout().addWidget(h_line) # RECORD RETRIEVAL # Text includes box. text_includes_box = gui.widgetBox(self.controlArea, 'Text includes', addSpace=True) self.authors_checkbox = gui.checkBox(text_includes_box, self, 'includes_authors', 'Authors') self.title_checkbox = gui.checkBox(text_includes_box, self, 'includes_title', 'Article title') self.mesh_checkbox = gui.checkBox(text_includes_box, self, 'includes_mesh', 'Mesh headings') self.abstract_checkbox = gui.checkBox(text_includes_box, self, 'includes_abstract', 'Abstract') self.url_checkbox = gui.checkBox(text_includes_box, self, 'includes_url', 'URL') self.pubmed_controls.append(self.authors_checkbox) self.pubmed_controls.append(self.title_checkbox) self.pubmed_controls.append(self.mesh_checkbox) self.pubmed_controls.append(self.abstract_checkbox) self.pubmed_controls.append(self.url_checkbox) # Num. records. h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Retrieve') label.setMaximumSize(label.sizeHint()) self.num_records_input = gui.spin(h_box, self, 'num_records', minv=1, maxv=100000) self.max_records_label = gui.label(h_box, self, 'records from /.') self.max_records_label.setMaximumSize(self.max_records_label .sizeHint()) self.pubmed_controls.append(self.num_records_input) # Download articles. # Search for records button. self.retrieve_records_button = gui.button( self.controlArea, self, 'Retrieve records', callback=self.retrieve_records, tooltip='Retrieves the specified documents.') self.pubmed_controls.append(self.retrieve_records_button) # Num. retrieved records info label. self.retrieval_info_label = gui.label( self.controlArea, self, 'Number of records retrieved: /') # Load the most recent emails. self.set_email_list() # Load the most recent queries. self.set_keyword_list() # Check the email and enable controls accordingly. if self.recent_emails: email = self.recent_emails[0] self.email_is_valid = validate_email(email) self.enable_controls()
def __init__(self): super().__init__() geom = QApplication.desktop().availableGeometry() self.setGeometry(QRect(round(geom.width() * 0.05), round(geom.height() * 0.05), round(min(geom.width() * 0.98, self.WIDGET_WIDTH)), round(min(geom.height() * 0.95, self.WIDGET_HEIGHT)))) gen_box = ShadowGui.widgetBox(self.controlArea, "Waviness Parameters", addSpace=True, orientation="horizontal", width=500) tabs_setting = gui.tabWidget(gen_box) tab_input = ShadowGui.createTabPage(tabs_setting, "Input Parameter") tab_harmonics = ShadowGui.createTabPage(tabs_setting, "Harmonics") tab_out = ShadowGui.createTabPage(tabs_setting, "Output") self.input_box = ShadowGui.widgetBox(tab_input, "Inputs", addSpace=True, orientation="vertical", width=470) gui.button(self.input_box, self, "Load xsh_waviness input file ...", callback=self.load_inp_file) gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "number_of_points_x", "Number of Points (<201) X (width)", labelWidth=300, valueType=int, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "number_of_points_y", " Y (length)", labelWidth=300, valueType=int, orientation="horizontal") gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "dimension_x", "Dimensions [cm] X (width)", labelWidth=300, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "dimension_y", " Y (length)", labelWidth=300, valueType=float, orientation="horizontal") gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "estimated_slope_error", "Estimated slope error [arcsec]", labelWidth=300, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "montecarlo_seed", "Monte Carlo initial seed", labelWidth=300, valueType=int, orientation="horizontal") self.output_box = ShadowGui.widgetBox(tab_input, "Outputs", addSpace=True, orientation="vertical", width=470) self.select_file_box = ShadowGui.widgetBox(self.output_box, "", addSpace=True, orientation="horizontal") gui.separator(self.output_box) gui.button(self.output_box, self, "Write xsh_waviness input file (optional) ...", callback=self.write_inp_file) ShadowGui.lineEdit(self.select_file_box, self, "waviness_file_name", "Output File Name", labelWidth=120, valueType=str, orientation="horizontal") self.harmonics_box = ShadowGui.widgetBox(tab_harmonics, "Harmonics", addSpace=True, orientation="vertical", width=470, height=690) ShadowGui.lineEdit(self.harmonics_box, self, "harmonic_maximum_index", "Harmonic Maximum Index", labelWidth=300, valueType=int, orientation="horizontal", callback=self.set_harmonics) gui.separator(self.harmonics_box) self.scrollarea = QScrollArea() self.scrollarea.setMaximumWidth(400) self.harmonics_box.layout().addWidget(self.scrollarea, alignment=Qt.AlignHCenter) self.shadow_output = QTextEdit() self.shadow_output.setReadOnly(True) out_box = ShadowGui.widgetBox(tab_out, "System Output", addSpace=True, orientation="horizontal", height=600) out_box.layout().addWidget(self.shadow_output) button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Calculate Waviness", callback=self.calculate_waviness) button.setFixedHeight(45) button.setFixedWidth(170) button = gui.button(button_box, self, "Generate Waviness File", callback=self.generate_waviness_file) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(200) button = gui.button(button_box, self, "Reset Fields", callback=self.call_reset_settings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(120) gui.rubber(self.controlArea) self.figure = Figure(figsize=(600, 600)) self.figure.patch.set_facecolor('white') self.axis = self.figure.add_subplot(111, projection='3d') self.axis.set_xlabel("X (cm)") self.axis.set_ylabel("Y (cm)") self.axis.set_zlabel("Z (µm)") self.figure_canvas = FigureCanvasQTAgg(self.figure) self.mainArea.layout().addWidget(self.figure_canvas) gui.rubber(self.mainArea)
def __init__(self): super().__init__() self._inputs = OrderedDict() self.dist_color = QColor(*self.dist_color_RGB) info_box = gui.vBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel( info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.vBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self._on_show_variable_labels_changed) gui.checkBox(box, self, "show_distributions", 'Visualize numeric values', callback=self._on_distribution_color_changed) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self._on_distribution_color_changed) box = gui.vBox(self.controlArea, "Selection") gui.checkBox(box, self, "select_rows", "Select full rows", callback=self._on_select_rows_changed) gui.rubber(self.controlArea) reset = gui.button(None, self, "Restore Original Order", callback=self.restore_order, tooltip="Show rows in the original order", autoDefault=False) self.buttonsArea.layout().insertWidget(0, reset) gui.auto_commit(self.buttonsArea, self, "auto_commit", "Send Selected Rows", "Send Automatically") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.currentChanged.connect(self._on_current_tab_changed)
def __init__(self): super().__init__() #self.contextHandlers = {"": DomainContextHandler("", [ContextField("attributes", selected="node_label_attrs"), ContextField("attributes", selected="tooltipAttributes"), "color"])} self.view = GraphView(self) self.mainArea.layout().addWidget(self.view) self.graph_attrs = [] self.acceptingEnterKeypress = False self.node_label_attrs = [] self.tooltipAttributes = [] self.searchStringTimer = QTimer(self) self.markInputItems = None self.node_color_attr = 0 self.node_size_attr = 0 self.nHighlighted = 0 self.nSelected = 0 self.verticesPerEdge = 0 self.edgesPerVertex = 0 self.lastVertexSizeColumn = '' self.lastColorColumn = '' self.lastLabelColumns = set() self.lastTooltipColumns = set() self.items_matrix = None self.number_of_nodes_label = 0 self.number_of_edges_label = 0 self.graph = None self.setMinimumWidth(600) self.tabs = gui.tabWidget(self.controlArea) self.displayTab = gui.createTabPage(self.tabs, "Display") self.markTab = gui.createTabPage(self.tabs, "Marking") def on_tab_changed(index): self.tabIndex = index self.set_selection_mode() self.tabs.currentChanged.connect(on_tab_changed) self.tabs.setCurrentIndex(self.tabIndex) ib = gui.widgetBox(self.displayTab, "Info") gui.label(ib, self, "Nodes: %(number_of_nodes_label)i (%(verticesPerEdge).2f per edge)") gui.label(ib, self, "Edges: %(number_of_edges_label)i (%(edgesPerVertex).2f per node)") box = gui.widgetBox(self.displayTab, "Nodes") self.relayout_button = gui.button(box, self, 'Re-layout', callback=self.relayout, autoDefault=False) self.view.positionsChanged.connect(lambda _: self.progressbar.advance()) def animationFinished(): self.relayout_button.setEnabled(True) self.progressbar.finish() self.view.animationFinished.connect(animationFinished) self.colorCombo = gui.comboBox( box, self, "node_color_attr", label='Color:', orientation='horizontal', callback=self.set_node_colors) self.invertNodeSizeCheck = self.maxNodeSizeSpin = QWidget() # Forward declaration self.nodeSizeCombo = gui.comboBox( box, self, "node_size_attr", label='Size:', orientation='horizontal', callback=self.set_node_sizes) hb = gui.widgetBox(box, orientation="horizontal") hb.layout().addStretch(1) self.minNodeSizeSpin = gui.spin( hb, self, "minNodeSize", 1, 50, step=1, label="Min:", callback=self.set_node_sizes) self.minNodeSizeSpin.setValue(8) gui.separator(hb) self.maxNodeSizeSpin = gui.spin( hb, self, "maxNodeSize", 10, 200, step=5, label="Max:", callback=self.set_node_sizes) self.maxNodeSizeSpin.setValue(50) gui.separator(hb) self.invertNodeSizeCheck = gui.checkBox( hb, self, "invertNodeSize", "Invert", callback=self.set_node_sizes) hb = gui.widgetBox(self.displayTab, box="Node labels | tooltips", orientation="horizontal", addSpace=False) self.attListBox = gui.listBox( hb, self, "node_label_attrs", "graph_attrs", selectionMode=QListWidget.MultiSelection, sizeHint=QSize(100, 100), callback=self._on_node_label_attrs_changed) self.tooltipListBox = gui.listBox( hb, self, "tooltipAttributes", "graph_attrs", selectionMode=QListWidget.MultiSelection, sizeHint=QSize(100, 100), callback=self._clicked_tooltip_lstbox) eb = gui.widgetBox(self.displayTab, "Edges", orientation="vertical") self.checkbox_relative_edges = gui.checkBox( eb, self, 'relativeEdgeWidths', 'Relative edge widths', callback=self.set_edge_sizes) self.checkbox_show_weights = gui.checkBox( eb, self, 'showEdgeWeights', 'Show edge weights', callback=self.set_edge_labels) ib = gui.widgetBox(self.markTab, "Info", orientation="vertical") gui.label(ib, self, "Nodes: %(number_of_nodes_label)i") gui.label(ib, self, "Selected: %(nSelected)i") gui.label(ib, self, "Highlighted: %(nHighlighted)i") def on_selection_change(): self.nSelected = len(self.view.getSelected()) self.nHighlighted = len(self.view.getHighlighted()) self.set_selection_mode() self.commit() self.view.selectionChanged.connect(on_selection_change) ib = gui.widgetBox(self.markTab, "Highlight nodes ...") ribg = gui.radioButtonsInBox(ib, self, "selectionMode", callback=self.set_selection_mode) gui.appendRadioButton(ribg, "None") gui.appendRadioButton(ribg, "... whose attributes contain:") self.ctrlMarkSearchString = gui.lineEdit(gui.indentedBox(ribg), self, "markSearchString", callback=self._set_search_string_timer, callbackOnType=True) self.searchStringTimer.timeout.connect(self.set_selection_mode) gui.appendRadioButton(ribg, "... neighbours of selected, ≤ N hops away") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkDistance = gui.spin(ib, self, "markDistance", 1, 100, 1, label="Hops:", callback=lambda: self.set_selection_mode(SelectionMode.NEIGHBORS)) ib.layout().addStretch(1) gui.appendRadioButton(ribg, "... with at least N connections") gui.appendRadioButton(ribg, "... with at most N connections") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkNConnections = gui.spin(ib, self, "markNConnections", 0, 1000000, 1, label="Connections:", callback=lambda: self.set_selection_mode(SelectionMode.AT_MOST_N if self.selectionMode == SelectionMode.AT_MOST_N else SelectionMode.AT_LEAST_N)) ib.layout().addStretch(1) gui.appendRadioButton(ribg, "... with more connections than any neighbor") gui.appendRadioButton(ribg, "... with more connections than average neighbor") gui.appendRadioButton(ribg, "... with most connections") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkNumber = gui.spin(ib, self, "markNBest", 1, 1000000, 1, label="Number of nodes:", callback=lambda: self.set_selection_mode(SelectionMode.MOST_CONN)) ib.layout().addStretch(1) self.markInputRadioButton = gui.appendRadioButton(ribg, "... given in the ItemSubset input signal") self.markInput = 0 ib = gui.indentedBox(ribg) self.markInputCombo = gui.comboBox(ib, self, 'markInput', callback=lambda: self.set_selection_mode(SelectionMode.FROM_INPUT)) self.markInputRadioButton.setEnabled(False) gui.auto_commit(ribg, self, 'do_auto_commit', 'Output changes') self.markTab.layout().addStretch(1) self.set_graph(None) self.set_selection_mode()
def __init__(self): super().__init__() tabs_setting = gui.tabWidget(self.controlArea) tabs_setting.setFixedWidth(450) gui.button(self.controlArea, self, "Refresh", callback=self.plot_results) # graph tab tab_gen = ShadowGui.createTabPage(tabs_setting, "Histogram") incremental_box = ShadowGui.widgetBox(tab_gen, "Incremental Result", addSpace=True, orientation="horizontal", height=80) gui.checkBox(incremental_box, self, "keep_result", "Keep Result") gui.button(incremental_box, self, "Clear", callback=self.clearResults) general_box = ShadowGui.widgetBox(tab_gen, "General Settings", addSpace=True, orientation="vertical", height=250) self.image_plane_combo = gui.comboBox(general_box, self, "image_plane", label="Position of the Image", items=["On Image Plane", "Retraced"], callback=self.set_ImagePlane, sendSelectedValue=False, orientation="horizontal") self.image_plane_box = ShadowGui.widgetBox(general_box, "", addSpace=True, orientation="vertical", height=110) self.image_plane_box_empty = ShadowGui.widgetBox(general_box, "", addSpace=True, orientation="vertical", height=110) ShadowGui.lineEdit(self.image_plane_box, self, "image_plane_new_position", "Image Plane new Position", labelWidth=220, valueType=float, orientation="horizontal") gui.comboBox(self.image_plane_box, self, "image_plane_rel_abs_position", label="Position Type", labelWidth=250, items=["Absolute", "Relative"], sendSelectedValue=False, orientation="horizontal") self.set_ImagePlane() self.x_column = gui.comboBox(general_box, self, "x_column_index", label="Column", labelWidth=80, items=["1: X", "2: Y", "3: Z", "4: X'", "5: Y'", "6: Z'", "7: Es X", "8: Es Y", "9: Es Z", "10: Ray Flag", "11: Energy", "12: Ray Index", "13: Optical Path", "14: Phase s", "15: Phase p", "16: Ep X", "17: Ep Y", "18: Ep Z", "19: Wavelength", "20: R = sqrt(X^2 + Y^2 + Z^2)", "21: Theta (angle from Y axis)", "22: Magnitude = |Es| + |Ep|", "23: Total Intensity = |Es|^2 + |Ep|^2", "24: S Intensity = |Es|^2", "25: P Intensity = |Ep|^2", "26: |K|", "27: K X", "28: K Y", "29: K Z", "30: S0-stokes = |Es|^2 + |Ep|^2", "31: S1-stokes = |Es|^2 - |Ep|^2", "32: S2-stokes = 2|Es||Ep|cos(Phase s-Phase p)", "33: S3-stokes = 2|Es||Ep|sin(Phase s-Phase p)", ], sendSelectedValue=False, orientation="horizontal") histograms_box = ShadowGui.widgetBox(tab_gen, "Histograms settings", addSpace=True, orientation="vertical", height=70) ShadowGui.lineEdit(histograms_box, self, "number_of_bins", "Number of Bins", labelWidth=250, valueType=int, orientation="horizontal") self.image_box = gui.widgetBox(self.mainArea, "Plot Result", addSpace=True, orientation="vertical") self.image_box.setFixedHeight(self.IMAGE_HEIGHT) self.image_box.setFixedWidth(self.IMAGE_WIDTH) self.shadow_output = QtGui.QTextEdit() self.shadow_output.setReadOnly(True) out_box = gui.widgetBox(self.mainArea, "System Output", addSpace=True, orientation="horizontal") out_box.layout().addWidget(self.shadow_output) out_box.setFixedWidth(self.IMAGE_WIDTH) self.shadow_output.setFixedHeight(100) self.shadow_output.setFixedWidth(self.IMAGE_WIDTH-50)
def __init__(self, parent=None): super().__init__(self, parent) self.clusterDataset = None self.referenceDataset = None self.ontology = None self.annotations = None self.loadedAnnotationCode = "---" self.treeStructRootKey = None self.probFunctions = [stats.Binomial(), stats.Hypergeometric()] self.selectedTerms = [] self.selectionChanging = 0 self.__state = OWGOEnrichmentAnalysis.Initializing self.annotationCodes = [] ############# ## GUI ############# self.tabs = gui.tabWidget(self.controlArea) ## Input tab self.inputTab = gui.createTabPage(self.tabs, "Input") box = gui.widgetBox(self.inputTab, "Info") self.infoLabel = gui.widgetLabel(box, "No data on input\n") gui.button( box, self, "Ontology/Annotation Info", callback=self.ShowInfo, tooltip="Show information on loaded ontology and annotations") box = gui.widgetBox(self.inputTab, "Organism") self.annotationComboBox = gui.comboBox(box, self, "annotationIndex", items=self.annotationCodes, callback=self._updateEnrichment, tooltip="Select organism") genebox = gui.widgetBox(self.inputTab, "Gene Names") self.geneAttrIndexCombo = gui.comboBox( genebox, self, "geneAttrIndex", callback=self._updateEnrichment, tooltip="Use this attribute to extract gene names from input data") self.geneAttrIndexCombo.setDisabled(self.useAttrNames) cb = gui.checkBox(genebox, self, "useAttrNames", "Use column names", tooltip="Use column names for gene names", callback=self._updateEnrichment) cb.toggled[bool].connect(self.geneAttrIndexCombo.setDisabled) gui.button(genebox, self, "Gene matcher settings", callback=self.UpdateGeneMatcher, tooltip="Open gene matching settings dialog") self.referenceRadioBox = gui.radioButtonsInBox( self.inputTab, self, "useReferenceDataset", ["Entire genome", "Reference set (input)"], tooltips=[ "Use entire genome for reference", "Use genes from Referece Examples input signal as reference" ], box="Reference", callback=self._updateEnrichment) self.referenceRadioBox.buttons[1].setDisabled(True) gui.radioButtonsInBox( self.inputTab, self, "aspectIndex", ["Biological process", "Cellular component", "Molecular function"], box="Aspect", callback=self._updateEnrichment) ## Filter tab self.filterTab = gui.createTabPage(self.tabs, "Filter") box = gui.widgetBox(self.filterTab, "Filter GO Term Nodes") gui.checkBox( box, self, "filterByNumOfInstances", "Genes", callback=self.FilterAndDisplayGraph, tooltip="Filter by number of input genes mapped to a term") ibox = gui.indentedBox(box) gui.spin(ibox, self, 'minNumOfInstances', 1, 100, step=1, label='#:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Min. number of input genes mapped to a term") gui.checkBox(box, self, "filterByPValue_nofdr", "p-value", callback=self.FilterAndDisplayGraph, tooltip="Filter by term p-value") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue_nofdr', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") #use filterByPValue for FDR, as it was the default in prior versions gui.checkBox(box, self, "filterByPValue", "FDR", callback=self.FilterAndDisplayGraph, tooltip="Filter by term FDR") gui.doubleSpin(gui.indentedBox(box), self, 'maxPValue', 1e-8, 1, step=1e-8, label='p:', labelWidth=15, callback=self.FilterAndDisplayGraph, callbackOnReturn=True, tooltip="Max term p-value") box = gui.widgetBox(box, "Significance test") gui.radioButtonsInBox(box, self, "probFunc", ["Binomial", "Hypergeometric"], tooltips=[ "Use binomial distribution test", "Use hypergeometric distribution test" ], callback=self._updateEnrichment) box = gui.widgetBox(self.filterTab, "Evidence codes in annotation", addSpace=True) self.evidenceCheckBoxDict = {} for etype in go.evidenceTypesOrdered: ecb = QCheckBox(etype, toolTip=go.evidenceTypes[etype], checked=self.useEvidenceType[etype]) ecb.toggled.connect(self.__on_evidenceChanged) box.layout().addWidget(ecb) self.evidenceCheckBoxDict[etype] = ecb ## Select tab self.selectTab = gui.createTabPage(self.tabs, "Select") box = gui.radioButtonsInBox(self.selectTab, self, "selectionDirectAnnotation", ["Directly or Indirectly", "Directly"], box="Annotated genes", callback=self.ExampleSelection) box = gui.widgetBox(self.selectTab, "Output", addSpace=True) gui.radioButtonsInBox( box, self, "selectionDisjoint", btnLabels=[ "All selected genes", "Term-specific genes", "Common term genes" ], tooltips=[ "Outputs genes annotated to all selected GO terms", "Outputs genes that appear in only one of selected GO terms", "Outputs genes common to all selected GO terms" ], callback=[self.ExampleSelection, self.UpdateAddClassButton]) self.addClassCB = gui.checkBox(box, self, "selectionAddTermAsClass", "Add GO Term as class", callback=self.ExampleSelection) # ListView for DAG, and table for significant GOIDs self.DAGcolumns = [ 'GO term', 'Cluster', 'Reference', 'p-value', 'FDR', 'Genes', 'Enrichment' ] self.splitter = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(self.splitter) # list view self.listView = GOTreeWidget(self.splitter) self.listView.setSelectionMode(QTreeView.ExtendedSelection) self.listView.setAllColumnsShowFocus(1) self.listView.setColumnCount(len(self.DAGcolumns)) self.listView.setHeaderLabels(self.DAGcolumns) self.listView.header().setSectionsClickable(True) self.listView.header().setSortIndicatorShown(True) self.listView.setSortingEnabled(True) self.listView.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.listView.setRootIsDecorated(True) self.listView.itemSelectionChanged.connect(self.ViewSelectionChanged) # table of significant GO terms self.sigTerms = QTreeWidget(self.splitter) self.sigTerms.setColumnCount(len(self.DAGcolumns)) self.sigTerms.setHeaderLabels(self.DAGcolumns) self.sigTerms.setSortingEnabled(True) self.sigTerms.setSelectionMode(QTreeView.ExtendedSelection) self.sigTerms.setItemDelegateForColumn( 6, EnrichmentColumnItemDelegate(self)) self.sigTerms.itemSelectionChanged.connect(self.TableSelectionChanged) self.sigTableTermsSorted = [] self.graph = {} self.inputTab.layout().addStretch(1) self.filterTab.layout().addStretch(1) self.selectTab.layout().addStretch(1) self.setBlocking(True) self._executor = ThreadExecutor() self._init = EnsureDownloaded([(taxonomy.Taxonomy.DOMAIN, taxonomy.Taxonomy.FILENAME), ("GO", "taxonomy.pickle")]) self._init.finished.connect(self.__initialize_finish) self._executor.submit(self._init)
def __init__(self): super().__init__() self._inputs = OrderedDict() self.__pending_selected_rows = self.selected_rows self.selected_rows = None self.__pending_selected_cols = self.selected_cols self.selected_cols = None self.dist_color = QColor(*self.dist_color_RGB) info_box = gui.vBox(self.controlArea, "信息") self.info_ex = gui.widgetLabel( info_box, '没有输入数据。', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.vBox(self.controlArea, "变量") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "显示变量标签(如果存在)", callback=self._on_show_variable_labels_changed) gui.checkBox(box, self, "show_distributions", '可视化数值', callback=self._on_distribution_color_changed) gui.checkBox(box, self, "color_by_class", '按实例类着色', callback=self._on_distribution_color_changed) box = gui.vBox(self.controlArea, "选择") gui.checkBox(box, self, "select_rows", "选择整行", callback=self._on_select_rows_changed) gui.rubber(self.controlArea) reset = gui.button(None, self, "恢复原始顺序", callback=self.restore_order, tooltip="按原始顺序显示行", autoDefault=False) self.buttonsArea.layout().insertWidget(0, reset) gui.auto_commit(self.buttonsArea, self, "auto_commit", "发送所选行", "自动发送") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.currentChanged.connect(self._on_current_tab_changed)
def __init__(self): super().__init__() self.methods = [ ("number_of_nodes", True, "Number of nodes", GRAPHLEVEL, lambda G: G.number_of_nodes()), ("number_of_edges", True, "Number of edges", GRAPHLEVEL, lambda G: G.number_of_edges()), ("average_degree", True, "Average degree", GRAPHLEVEL, lambda G: np.average(list(G.degree().values()))), ("diameter", False, "Diameter", GRAPHLEVEL, nx.diameter), ("radius", False, "Radius", GRAPHLEVEL, nx.radius), ("average_shortest_path_length", False, "Average shortest path length", GRAPHLEVEL, nx.average_shortest_path_length), ("density", True, "Density", GRAPHLEVEL, nx.density), ("degree_assortativity_coefficient", False, \ "Degree assortativity coefficient", GRAPHLEVEL, \ nx.degree_assortativity_coefficient if \ hasattr(nx, "degree_assortativity_coefficient") else None), # additional attr needed #("attribute_assortativity_coefficient", False, "Attribute assortativity coefficient", GRAPHLEVEL, nx.attribute_assortativity_coefficient), #("numeric_assortativity_coefficient", False, "Numeric assortativity coefficient", GRAPHLEVEL, nx.numeric_assortativity_coefficient), ("degree_pearson_correlation_coefficient", False, \ "Degree pearson correlation coefficient", GRAPHLEVEL, \ nx.degree_pearson_correlation_coefficient if\ hasattr(nx, "degree_pearson_correlation_coefficient") else None), ("estrada_index", False, "Estrada index", GRAPHLEVEL, \ nx.estrada_index if hasattr(nx, "estrada_index") else None), ("graph_clique_number", False, "Graph clique number", GRAPHLEVEL, nx.graph_clique_number), ("graph_number_of_cliques", False, "Graph number of cliques", GRAPHLEVEL, nx.graph_number_of_cliques), ("transitivity", False, "Graph transitivity", GRAPHLEVEL, nx.transitivity), ("average_clustering", False, "Average clustering coefficient", GRAPHLEVEL, nx.average_clustering), ("number_connected_components", False, "Number of connected components", GRAPHLEVEL, nx.number_connected_components), ("number_strongly_connected_components", False, "Number of strongly connected components", GRAPHLEVEL, nx.number_strongly_connected_components), ("number_weakly_connected_components", False, "Number of weakly connected components", GRAPHLEVEL, nx.number_weakly_connected_components), ("number_attracting_components", False, "Number of attracting components", GRAPHLEVEL, nx.number_attracting_components), # TODO: input parameters #("max_flow", False, "Maximum flow", GRAPHLEVEL, nx.max_flow), #("min_cut", False, "Minimum cut", GRAPHLEVEL, nx.min_cut), #("ford_fulkerson", False, "Maximum single-commodity flow (Ford-Fulkerson)", GRAPHLEVEL, nx.ford_fulkerson), #("min_cost_flow_cost", False, "min_cost_flow_cost", GRAPHLEVEL, nx.min_cost_flow_cost), # returns dict of dict #("shortest_path_length", False, "Shortest path length", GRAPHLEVEL, nx.shortest_path_length), ("degree", False, "Degree", NODELEVEL, nx.degree), ("in_degree", False, "In-degree", NODELEVEL, lambda G: G.in_degree()), ("out_degree", False, "Out-degree", NODELEVEL, lambda G: G.out_degree()), ("average_neighbor_degree", False, "Average neighbor degree", NODELEVEL, nx.average_neighbor_degree), ("clustering", False, "Clustering coefficient", NODELEVEL, nx.clustering), ("triangles", False, "Number of triangles", NODELEVEL, nx.triangles), ("square_clustering", False, "Squares clustering coefficient", NODELEVEL, nx.square_clustering), ("number_of_cliques", False, "Number of cliques", NODELEVEL, nx.number_of_cliques), ("degree_centrality", False, "Degree centrality", NODELEVEL, nx.degree_centrality), ("in_degree_centrality", False, "In-egree centrality", NODELEVEL, nx.in_degree_centrality), ("out_degree_centrality", False, "Out-degree centrality", NODELEVEL, nx.out_degree_centrality), ("closeness_centrality", False, "Closeness centrality", NODELEVEL, nx.closeness_centrality), ("betweenness_centrality", False, "Betweenness centrality", NODELEVEL, nx.betweenness_centrality), ("current_flow_closeness_centrality", False, "Information centrality", NODELEVEL, nx.current_flow_closeness_centrality), ("current_flow_betweenness_centrality", False, "Random-walk betweenness centrality", NODELEVEL, nx.current_flow_betweenness_centrality), ("approximate_current_flow_betweenness_centrality", False, \ "Approx. random-walk betweenness centrality", NODELEVEL, \ nx.approximate_current_flow_betweenness_centrality if \ hasattr(nx, "approximate_current_flow_betweenness_centrality") \ else None), ("eigenvector_centrality", False, "Eigenvector centrality", NODELEVEL, nx.eigenvector_centrality), ("eigenvector_centrality_numpy", False, "Eigenvector centrality (NumPy)", NODELEVEL, nx.eigenvector_centrality_numpy), ("load_centrality", False, "Load centrality", NODELEVEL, nx.load_centrality), ("core_number", False, "Core number", NODELEVEL, nx.core_number), ("eccentricity", False, "Eccentricity", NODELEVEL, nx.eccentricity), ("closeness_vitality", False, "Closeness vitality", NODELEVEL, nx.closeness_vitality), ] """ TODO: add average-degree_connectivity is_bipartite is_chordal katz_centrality katz_centrality_numpy communicability communicability_exp communicability_centrality communicability_centrality_exp communicability_betweenness_centrality average_node_connectivity is_directed_acyclic_graph center ?? """ self.methods = [method for method in self.methods if method[-1] is not None] self.auto_commit = False self.tab_index = 0 self.mutex = QtCore.QMutex() self.graph = None self.items = None # items set by Items signal self.items_graph = None # items set by graph.items by Network signal self.items_analysis = None # items to output and merge with analysis result self.job_queue = [] self.job_working = [] self.analfeatures = [] self.analdata = {} for method in self.methods: setattr(self, method[0], method[1]) setattr(self, "lbl_" + method[0], "") self.tabs = gui.tabWidget(self.controlArea) self.tabs.setMinimumWidth(450) self.graphIndices = gui.createTabPage(self.tabs, "Graph-level indices") self.nodeIndices = gui.createTabPage(self.tabs, "Node-level indices") self.tabs.setCurrentIndex(self.tab_index) self.tabs.currentChanged.connect(lambda index: setattr(self, 'tab_index', index)) for name, default, label, type, algorithm in self.methods: if type == NODELEVEL: box = gui.widgetBox(self.nodeIndices, orientation="horizontal") elif type == GRAPHLEVEL: box = gui.widgetBox(self.graphIndices, orientation="horizontal") gui.checkBox(box, self, name, label=label, callback=lambda n=name: self.method_clicked(n)) box.layout().addStretch(1) lbl = gui.label(box, self, "%(lbl_" + name + ")s") setattr(self, "tool_" + name, lbl) self.graphIndices.layout().addStretch(1) self.nodeIndices.layout().addStretch(1) gui.checkBox(self.controlArea, self, "auto_commit", label="Commit automatically") hb = gui.widgetBox(self.controlArea, None, orientation='horizontal') self.btnCommit = gui.button(hb, self, "Commit", callback=self.analyze, toggleButton=1) self.btnStopA = gui.button(hb, self, "Cancel", callback=lambda: self.stop_job(current=False)) self.btnStopA.setEnabled(False)
def __init__(self): super().__init__() self.data = {} # key: id, value: ExampleTable self.dist_color = QtGui.QColor(*self.dist_color_RGB) self.locale = QtCore.QLocale() info_box = gui.widgetBox(self.controlArea, "Info") self.info_ex = gui.widgetLabel( info_box, 'No data on input.', ) self.info_ex.setWordWrap(True) self.info_attr = gui.widgetLabel(info_box, ' ') self.info_attr.setWordWrap(True) self.info_class = gui.widgetLabel(info_box, ' ') self.info_class.setWordWrap(True) self.info_meta = gui.widgetLabel(info_box, ' ') self.info_meta.setWordWrap(True) gui.separator(info_box) gui.button(info_box, self, "Restore Original Order", callback=self.reset_sort_clicked, tooltip="Show rows in the original order") info_box.setMinimumWidth(200) gui.separator(self.controlArea) box = gui.widgetBox(self.controlArea, "Variables") self.c_show_attribute_labels = gui.checkBox( box, self, "show_attribute_labels", "Show variable labels (if present)", callback=self.c_show_attribute_labels_clicked) self.c_show_attribute_labels.setEnabled(True) gui.checkBox(box, self, "show_distributions", 'Visualize continuous values', callback=self.cb_show_distributions) gui.checkBox(box, self, "color_by_class", 'Color by instance classes', callback=self.cb_show_distributions) gui.button(box, self, "Set colors", self.set_colors, tooltip="Set the background color and color palette") gui.separator(self.controlArea) selection_box = gui.widgetBox(self.controlArea, "Selection") self.send_button = gui.button(selection_box, self, "Send selections", self.commit, default=True) cb = gui.checkBox(selection_box, self, "auto_commit", "Commit on any change", callback=self.commit_if) gui.setStopper(self, self.send_button, cb, "selectionChangedFlag", self.commit) gui.rubber(self.controlArea) dlg = self.create_color_dialog() self.discPalette = dlg.getDiscretePalette("discPalette") # GUI with tabs self.tabs = gui.tabWidget(self.mainArea) self.tabs.sizeHint = lambda: QtCore.QSize(600, 500) self.id2table = {} # key: widget id, value: table self.table2id = {} # key: table, value: widget id self.tabs.currentChanged.connect(self.tab_clicked) self.selectionChangedFlag = False
def __init__(self): super().__init__() # self.resetSettings() ################################# # FIX A WEIRD BEHAVIOUR AFTER DISPLAY # THE WIDGET: PROBABLY ON SIGNAL MANAGER self.dumpSettings() self.controlArea.setFixedWidth(self.CONTROL_AREA_WIDTH) tabs_setting = gui.tabWidget(self.controlArea) tabs_setting.setFixedWidth(495) tabs_setting.setFixedHeight(750) tab_bas = ShadowGui.createTabPage(tabs_setting, "Basic Setting") tab_adv = ShadowGui.createTabPage(tabs_setting, "Advanced Setting") tabs_button_box = ShadowGui.widgetBox(tab_bas, "", addSpace=False, orientation="horizontal") gui.separator(tabs_button_box) gui.button(tabs_button_box, self, "Insert C.R.L. Before", callback=self.crl_insert_before) gui.button(tabs_button_box, self, "Insert C.R.L. After", callback=self.crl_insert_after) gui.button(tabs_button_box, self, "Remove C.R.L.", callback=self.crl_remove) gui.separator(tabs_button_box) self.tab_crls = gui.tabWidget(tab_bas) self.crl_box_array = [] for index in range(len(self.p)): tab_crl = ShadowGui.createTabPage(self.tab_crls, "C.R.L. " + str(index + 1)) crl_box = CRLBox(transfocator=self, parent=tab_crl, nlenses=self.nlenses[index], slots_empty=self.slots_empty[index], thickness=self.thickness[index], p=self.p[index], q=self.q[index], surface_shape=self.surface_shape[index], convex_to_the_beam=self.convex_to_the_beam[index], has_finite_diameter=self.has_finite_diameter[index], diameter=self.diameter[index], is_cylinder=self.is_cylinder[index], cylinder_angle=self.cylinder_angle[index], ri_calculation_mode=self.ri_calculation_mode[index], prerefl_file=self.prerefl_file[index], refraction_index=self.refraction_index[index], attenuation_coefficient=self.attenuation_coefficient[index], radius=self.radius[index], interthickness=self.interthickness[index], use_ccc=self.use_ccc[index]) self.crl_box_array.append(crl_box) adv_other_box = ShadowGui.widgetBox(tab_adv, "Optional file output", addSpace=False, orientation="vertical") gui.comboBox(adv_other_box, self, "file_to_write_out", label="Files to write out", labelWidth=310, items=["All", "Mirror", "Image", "None"], sendSelectedValue=False, orientation="horizontal") button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Run Shadow/trace", callback=self.traceOpticalElement) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button = gui.button(button_box, self, "Reset Fields", callback=self.callResetSettings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(100)
def __init__(self): super().__init__() #self.contextHandlers = {"": DomainContextHandler("", [ContextField("attributes", selected="node_label_attrs"), ContextField("attributes", selected="tooltipAttributes"), "color"])} self.networkCanvas = networkCanvas = OWNxCanvas(self) self.graph_attrs = [] self.edges_attrs = [] self.node_label_attrs = [] self.tooltipAttributes = [] self.edgeLabelAttributes = [] self.autoSendSelection = False self.graphShowGrid = 1 # show gridlines in the graph self.markNConnections = 2 self.markNumber = 0 self.markProportion = 0 self.markSearchString = "" self.markDistance = 2 self.frSteps = 1 self.hubs = 0 self.node_color_attr = 0 self.edgeColor = 0 self.node_size_attr = 0 self.nShown = self.nHidden = self.nHighlighted = self.nSelected = self.verticesPerEdge = self.edgesPerVertex = 0 self.optimizeWhat = 1 self.maxNodeSize = 50 self.labelsOnMarkedOnly = 0 self.invertNodeSize = 0 self.optMethod = 0 self.lastVertexSizeColumn = '' self.lastColorColumn = '' self.lastLabelColumns = set() self.lastTooltipColumns = set() self.showWeights = 0 self.selectedEdgeSchemaIndex = 0 self.items_matrix = None self.showDistances = 0 self.showMissingValues = 0 self.fontSize = 12 self.fontWeight = 1 self.mdsTorgerson = 0 self.mdsAvgLinkage = 1 self.mdsSteps = 10000 self.mdsRefresh = 50 self.mdsStressDelta = 0.0000001 self.showTextMiningInfo = 0 self.toolbarSelection = 0 self.minComponentEdgeWidth = 10 self.maxComponentEdgeWidth = 70 self.mdsFromCurrentPos = 0 self.tabIndex = 0 self.number_of_nodes_label = -1 self.number_of_edges_label = -1 self.opt_from_curr = False self.checkSendMarkedNodes = True self.checkSendSelectedNodes = True self.marked_nodes = [] self._network_view = None self.graph = None self.graph_base = None self.networkCanvas.showMissingValues = self.showMissingValues class ViewBox(pg.ViewBox): def __init__(self): super().__init__() def mouseDragEvent(self, ev): if not ev.isFinish(): return super().mouseDragEvent(ev) if self.state['mouseMode'] != self.RectMode: return # Tap into pg.ViewBox's rbScaleBox ... it'll be fine. self.rbScaleBox.hide() ax = QRectF(pg.Point(ev.buttonDownPos(ev.button())), pg.Point(ev.pos())) ax = self.childGroup.mapRectFromParent(ax) networkCanvas.selectNodesInRect(ax) self.setMouseMode(self.PanMode) ev.accept() def mouseClickEvent(self, ev): if ev.button() == Qt.LeftButton: if networkCanvas.is_animating: networkCanvas.is_animating = False ev.accept() else: networkCanvas.mouseClickEvent(ev) super().mouseClickEvent(ev) class PlotItem(pg.PlotItem): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for axis in ('bottom', 'left'): self.hideAxis(axis) def _path(filename): return os.path.join(os.path.dirname(__file__), 'icons', filename + '.png') self.rectBtn = pg.ButtonItem(_path('button_rect'), parentItem=self) self.rectBtn.clicked.connect(self.rectBtnClicked) self._qtBaseClass.setParentItem(self.autoBtn, None) self.autoBtn.hide() self.autoBtn = pg.ButtonItem(_path('button_autoscale'), parentItem=self) self.autoBtn.mode = 'auto' self.autoBtn.clicked.connect(self.autoBtnClicked) self.textEnterToSelect = pg.TextItem( html='<div style="background-color:#f0f0f0; padding:5px;">' '<font color="#444444"><b>Press <tt>Enter</tt> to add ' '<i><font color="{}">highlighted</font></i> nodes to ' '<i><font color="{}">selection</font></i> ...</font></b></div>' .format(NodePenColor.HIGHLIGHTED, NodePenColor.SELECTED)) self.textEnterToSelect.setParentItem(self) self.textEnterToSelect.hide() def rectBtnClicked(self, ev): self.vb.setMouseMode(self.vb.RectMode) def updateButtons(self): self.autoBtn.show() def resizeEvent(self, ev): super().resizeEvent(ev) btnRect = self.mapRectFromItem(self.rectBtn, self.rectBtn.boundingRect()) LEFT_OFFSET, BOTTOM_OFFSET = 3, 5 y = self.size().height() - btnRect.height() - BOTTOM_OFFSET self.autoBtn.setPos(LEFT_OFFSET, y) self.rectBtn.setPos(2*LEFT_OFFSET + btnRect.width(), y) self.textEnterToSelect.setPos(LEFT_OFFSET, BOTTOM_OFFSET) class PlotWidget(pg.PlotWidget): def __init__(self, *args, **kwargs): pg.GraphicsView.__init__(self, *args, **kwargs) plot = PlotWidget(self, background='w') plot.plotItem = PlotItem(enableAutoRange=True, viewBox=ViewBox()) plot.setCentralItem(plot.plotItem) # Required, copied from pg.PlotWidget constructor for m in ['addItem', 'removeItem', 'autoRange', 'clear', 'setXRange', 'setYRange', 'setRange', 'setAspectLocked', 'setMouseEnabled', 'setXLink', 'setYLink', 'enableAutoRange', 'disableAutoRange', 'setLimits', 'register', 'unregister', 'viewRect']: setattr(plot, m, getattr(plot.plotItem, m)) plot.plotItem.sigRangeChanged.connect(plot.viewRangeChanged) self.textEnterToSelect = plot.plotItem.textEnterToSelect plot.setFrameStyle(QFrame.StyledPanel) plot.setMinimumSize(500, 500) plot.setAspectLocked(True) plot.addItem(self.networkCanvas) self.mainArea.layout().addWidget(plot) self.tabs = gui.tabWidget(self.controlArea) self.displayTab = gui.createTabPage(self.tabs, "Display") self.markTab = gui.createTabPage(self.tabs, "Marking") def showTextOnMarkingTab(index): if self.tabs.widget(index) == self.markTab: self.set_mark_mode() else: self.acceptingEnterKeypress = False self.tabs.currentChanged.connect(showTextOnMarkingTab) self.tabs.setCurrentIndex(self.tabIndex) self.connect(self.tabs, SIGNAL("currentChanged(int)"), lambda index: setattr(self, 'tabIndex', index)) ib = gui.widgetBox(self.displayTab, "Info") gui.label(ib, self, "Nodes: %(number_of_nodes_label)i (%(verticesPerEdge).2f per edge)") gui.label(ib, self, "Edges: %(number_of_edges_label)i (%(edgesPerVertex).2f per node)") box = gui.widgetBox(self.displayTab, "Nodes") self.optCombo = gui.comboBox( box, self, "optMethod", label='Layout:', orientation='horizontal', callback=self.graph_layout_method) for layout in Layout.all: self.optCombo.addItem(layout) self.optMethod = Layout.all.index(Layout.FHR) self.optCombo.setCurrentIndex(self.optMethod) self.colorCombo = gui.comboBox( box, self, "node_color_attr", label='Color by:', orientation='horizontal', callback=self.set_node_colors) hb = gui.widgetBox(box, orientation="horizontal", addSpace=False) hb.layout().addWidget(QLabel('Size by:', hb)) self.nodeSizeCombo = gui.comboBox( hb, self, "node_size_attr", callback=self.set_node_sizes) self.maxNodeSizeSpin = gui.spin( hb, self, "maxNodeSize", 5, 200, step=10, label="Max:", callback=self.set_node_sizes) self.maxNodeSizeSpin.setValue(50) self.invertNodeSizeCheck = gui.checkBox( hb, self, "invertNodeSize", "Invert", callback=self.set_node_sizes) lb = gui.widgetBox(box, "Node labels | tooltips", orientation="vertical", addSpace=False) hb = gui.widgetBox(lb, orientation="horizontal", addSpace=False) self.attListBox = gui.listBox( hb, self, "node_label_attrs", "graph_attrs", selectionMode=QListWidget.MultiSelection, callback=self._on_node_label_attrs_changed) self.tooltipListBox = gui.listBox( hb, self, "tooltipAttributes", "graph_attrs", selectionMode=QListWidget.MultiSelection, callback=self._clicked_tooltip_lstbox) eb = gui.widgetBox(self.displayTab, "Edges", orientation="vertical") self.checkbox_relative_edges = gui.checkBox( eb, self, 'networkCanvas.relative_edge_widths', 'Relative edge widths', callback=self.networkCanvas.set_edge_sizes) self.checkbox_show_weights = gui.checkBox( eb, self, 'networkCanvas.show_edge_weights', 'Show edge weights', callback=self.networkCanvas.set_edge_labels) self.edgeColorCombo = gui.comboBox( eb, self, "edgeColor", label='Color by:', orientation='horizontal', callback=self.set_edge_colors) elb = gui.widgetBox(eb, "Edge labels", addSpace=False) self.edgeLabelListBox = gui.listBox( elb, self, "edgeLabelAttributes", "edges_attrs", selectionMode=QListWidget.MultiSelection, callback=self._clicked_edge_label_listbox) elb.setEnabled(False) ib = gui.widgetBox(self.markTab, "Info", orientation="vertical") gui.label(ib, self, "Nodes: %(number_of_nodes_label)i") gui.label(ib, self, "Selected: %(nSelected)i") gui.label(ib, self, "Highlighted: %(nHighlighted)i") ib = gui.widgetBox(self.markTab, "Highlight nodes ...") ribg = gui.radioButtonsInBox(ib, self, "hubs", [], "Mark", callback=self.set_mark_mode) gui.appendRadioButton(ribg, "None") gui.appendRadioButton(ribg, "... whose attributes contain:") self.ctrlMarkSearchString = gui.lineEdit(gui.indentedBox(ribg), self, "markSearchString", callback=self._set_search_string_timer, callbackOnType=True) self.searchStringTimer = QTimer(self) self.connect(self.searchStringTimer, SIGNAL("timeout()"), self.set_mark_mode) gui.appendRadioButton(ribg, "... neighbours of selected, ≤ N hops away") ib = gui.indentedBox(ribg, orientation=0) self.ctrlMarkDistance = gui.spin(ib, self, "markDistance", 1, 100, 1, label="Distance:", callback=lambda: self.set_mark_mode(SelectionMode.NEIGHBORS)) #self.ctrlMarkFreeze = gui.button(ib, self, "&Freeze", value="graph.freezeNeighbours", toggleButton = True) gui.appendRadioButton(ribg, "... with at least N connections") gui.appendRadioButton(ribg, "... with at most N connections") self.ctrlMarkNConnections = gui.spin(gui.indentedBox(ribg), self, "markNConnections", 0, 1000000, 1, label="N:", callback=lambda: self.set_mark_mode(SelectionMode.AT_MOST_N if self.hubs == SelectionMode.AT_MOST_N else SelectionMode.AT_LEAST_N)) gui.appendRadioButton(ribg, "... with more connections than any neighbor") gui.appendRadioButton(ribg, "... with more connections than average neighbor") gui.appendRadioButton(ribg, "... with most connections") ib = gui.indentedBox(ribg) #~ self.ctrlMarkNumber = gui.spin(ib, self, "markNumber", 1, 1000000, 1, label="Number of nodes:", callback=(lambda h=7: self.set_mark_mode(h))) self.ctrlMarkNumber = gui.spin(ib, self, "markNumber", 1, 1000000, 1, label="Number of nodes:", callback=lambda: self.set_mark_mode(SelectionMode.MOST_CONN)) gui.auto_commit(ribg, self, 'do_auto_commit', 'Output changes') #ib = gui.widgetBox(self.markTab, "General", orientation="vertical") #self.checkSendMarkedNodes = True self.toolbar = gui.widgetBox(self.controlArea, orientation='horizontal') #~ G = self.networkCanvas.gui #~ self.zoomSelectToolbar = G.zoom_select_toolbar(self.toolbar, nomargin=True, buttons= #~ G.default_zoom_select_buttons + #~ [ #~ G.Spacing, #~ ("buttonM2S", "Marked to selection", None, None, "marked_to_selected", 'Dlg_Mark2Sel'), #~ ("buttonS2M", "Selection to marked", None, None, "selected_to_marked", 'Dlg_Sel2Mark'), #~ ("buttonHSEL", "Hide selection", None, None, "hide_selection", 'Dlg_HideSelection'), #~ ("buttonSSEL", "Show all nodes", None, None, "show_selection", 'Dlg_ShowSelection'), #~ #("buttonUN", "Hide unselected", None, None, "hideUnSelectedVertices", 'Dlg_SelectedNodes'), #~ #("buttonSW", "Show all nodes", None, None, "showAllVertices", 'Dlg_clear'), #~ ]) #~ self.zoomSelectToolbar.buttons[G.SendSelection].clicked.connect(self.send_data) #~ self.zoomSelectToolbar.buttons[G.SendSelection].clicked.connect(self.send_marked_nodes) #~ self.zoomSelectToolbar.buttons[("buttonHSEL", "Hide selection", None, None, "hide_selection", 'Dlg_HideSelection')].clicked.connect(self.hide_selection) #~ self.zoomSelectToolbar.buttons[("buttonSSEL", "Show all nodes", None, None, "show_selection", 'Dlg_ShowSelection')].clicked.connect(self.show_selection) #self.zoomSelectToolbar.buttons[G.SendSelection].hide() self.set_mark_mode() self.displayTab.layout().addStretch(1) self.markTab.layout().addStretch(1) self.graph_layout_method() self.set_graph(None) self.setMinimumWidth(900)