def init_window(self): """ Method to initialize the main window. """ # First set some meta information self.setApplicationName(self._application_name) self.setOrganizationName(self._organisation_name) self.setApplicationVersion(self._version) # Get the user interface description from capsul resources ui_file = os.path.join(os.path.dirname(__file__), "activation_inspector.ui") #ui_file = os.path.join(resources.__path__[0], "activation_inspector.ui") # Create and show the activation/pipeline/controller windows self.pipeline_window = PipelineDeveloperView(self.pipeline, show_sub_pipelines=True) self.controller_window = ScrollControllerWidget(self.pipeline, live=True) self.activation_window = ActivationInspector( self.pipeline, ui_file, self.record_file, developper_view=self.pipeline_window) self.pipeline_window.show() self.activation_window.show() self.controller_window.show() return True
class ActivationInspectorApp(Application): """ ActivationInspector Application. While developing a pipeline, nodes are connected through links. Nodes will be automatically activated or disabled depending on their connections (a mandatory link to a disabled node will disable the current one). You will often wonder why a node will not be activated. This tool helps to determine when and why by "playing" activation rules sequences step-by-step and displaying nodes which activate or deactivate at each step. """ # Load some meta information from capsul.info import __version__ as _version from capsul.info import NAME as _application_name from capsul.info import ORGANISATION as _organisation_name def __init__(self, pipeline_path, record_file=None, *args, **kwargs): """ Method to initialize the ActivationInspectorApp class. Parameters ---------- pipeline_path: str (mandatory) the name of the pipeline we want to load. record_file: str (optional) a file where the pipeline activation steps are stored. """ # Inhetritance super(ActivationInspectorApp, self).__init__(*args, **kwargs) # Load the pipeline self.pipeline = get_process_instance(pipeline_path) # Initialize the application self.record_file = record_file self.window = None self.init_window() def init_window(self): """ Method to initialize the main window. """ # First set some meta information self.setApplicationName(self._application_name) self.setOrganizationName(self._organisation_name) self.setApplicationVersion(self._version) # Get the user interface description from capsul resources ui_file = os.path.join(os.path.dirname(__file__), "activation_inspector.ui") #ui_file = os.path.join(resources.__path__[0], "activation_inspector.ui") # Create and show the activation/pipeline/controller windows self.pipeline_window = PipelineDeveloperView(self.pipeline, show_sub_pipelines=True) self.controller_window = ScrollControllerWidget(self.pipeline, live=True) self.activation_window = ActivationInspector( self.pipeline, ui_file, self.record_file, developper_view=self.pipeline_window) self.pipeline_window.show() self.activation_window.show() self.controller_window.show() return True
def run_pipeline_io(self, filename): pipeline = MyPipeline() from capsul.pipeline import pipeline_tools pipeline_tools.save_pipeline(pipeline, filename) pipeline2 = get_process_instance(filename) pipeline2.workflow_ordered_nodes() if self.debug: from soma.qt_gui.qt_backend import QtGui from capsul.qt_gui.widgets import PipelineDeveloperView import sys app = QtGui.QApplication.instance() if not app: app = QtGui.QApplication(sys.argv) view1 = PipelineDeveloperView(pipeline, allow_open_controller=True, enable_edition=True, show_sub_pipelines=True) view2 = PipelineDeveloperView(pipeline2, allow_open_controller=True, enable_edition=True, show_sub_pipelines=True) view1.show() view2.show() app.exec_() self.assertTrue( pipeline2.workflow_repr in ("constant->node1->node2", "node1->constant->node2"), '%s not in ("constant->node1->node2", "node1->constant->node2")' % pipeline2.workflow_repr) d1 = pipeline_tools.dump_pipeline_state_as_dict(pipeline) d2 = pipeline_tools.dump_pipeline_state_as_dict(pipeline2) self.assertEqual(d1, d2)
def onChangeViewClicked(self): """ Event to switch between simple and full pipeline views. """ # Check if a pipeline has been loaded if self._is_active_pipeline_valid(): # Check the current display mode # Case PipelineDeveloperView if isinstance(self.ui.display.currentWidget(), PipelineDeveloperView): # Switch to PipelineUserView display mode widget = PipelineUserView(self.pipeline) self._insert_widget_in_tab(widget) # Case PipelineUserView else: # Switch to PipelineDeveloperView display mode widget = PipelineDeveloperView(self.pipeline) self._insert_widget_in_tab(widget) # No pipeline loaded error else: logger.error("No active pipeline selected. " "Have you forgotten to click the load pipeline " "button?")
def onLoadSubPipelineClicked(self, name, sub_pipeline, modifiers): """ Event to load and display a sub pipeline. """ # Store the pipeline instance in class parameters self.pipeline = self.pipeline.nodes[name].process # Create the controller widget associated to the sub pipeline # controller: if the sub pipeline is a ProcessIteration, disable # the correspondind controller widget since this pipeline is generated # on the fly an is not directly synchronized with the rest of the # pipeline. is_iterative_pipeline = False if isinstance(self.pipeline, ProcessIteration): is_iterative_pipeline = True pipeline_widget = ScrollControllerWidget( self.pipeline, live=True, select_controls="inputs", disable_controller_widget=is_iterative_pipeline) self.ui.dockWidgetParameters.setWidget(pipeline_widget) # Store the sub pipeline instance self.pipelines[self.pipeline.name] = ( self.pipeline, pipeline_widget) # Create the widget widget = PipelineDeveloperView(self.pipeline) self._insert_widget_in_tab(widget) # Connect the subpipeline clicked signal to the # onLoadSubPipelineClicked slot widget.subpipeline_clicked.connect(self.onLoadSubPipelineClicked)
def onLoadClicked(self): """ Event to load and display a pipeline. """ # Get the pipeline instance from its string description item = self.ui.menu_treectrl.currentItem() description_list = [str(x) for x in [item.text(1), item.text(0)] if x != ""] process_description = ".".join(description_list) self.pipeline = get_process_instance(process_description) # Create the controller widget associated to the pipeline # controller pipeline_widget = ScrollControllerWidget( self.pipeline, live=True, select_controls="inputs") self.ui.dockWidgetParameters.setWidget(pipeline_widget) # Add observer to refresh the run button controller_widget = pipeline_widget.controller_widget for control_name, control \ in six.iteritems(controller_widget._controls): # Unpack the control item trait, control_class, control_instance, control_label = control # Add the new callback control_class.add_callback(self.onRunStatus, control_instance) # Refresh manually the run button status the first time self.onRunStatus() # Store the pipeline documentation root path self.path_to_pipeline_doc[self.pipeline.id] = item.text(2) # Store the pipeline instance self.pipelines[self.pipeline.name] = ( self.pipeline, pipeline_widget) # Create the widget widget = PipelineDeveloperView(self.pipeline) self._insert_widget_in_tab(widget) # Connect the subpipeline clicked signal to the # onLoadSubPipelineClicked slot widget.subpipeline_clicked.connect(self.onLoadSubPipelineClicked)
self.run_pipeline_io(filename) def test(): """ Function to execute unitest """ if '-d' in sys.argv[1:]: TestPipeline.debug = True suite = unittest.TestLoader().loadTestsFromTestCase(TestPipeline) runtime = unittest.TextTestRunner(verbosity=2).run(suite) return runtime.wasSuccessful() if __name__ == "__main__": print("RETURNCODE: ", test()) if '-v' in sys.argv[1:]: import sys from soma.qt_gui.qt_backend import QtGui from capsul.qt_gui.widgets import PipelineDeveloperView app = QtGui.QApplication.instance() if not app: app = QtGui.QApplication(sys.argv) pipeline = MyPipeline() #setattr(pipeline.nodes_activation, "node2", False) view1 = PipelineDeveloperView(pipeline) view1.show() app.exec_() del view1
if verbose: import sys from soma.qt_gui import qt_backend # qt_backend.set_qt_backend('PyQt4') from soma.qt_gui.qt_backend import QtGui from capsul.qt_gui.widgets import PipelineDeveloperView app = QtGui.QApplication.instance() if not app: app = QtGui.QApplication(sys.argv) pipeline = DummyPipeline() pipeline.input = '/tmp/file_in.nii' pipeline.output1 = '/tmp/file_out1.nii' pipeline.output2 = '/tmp/file_out2.nii' pipeline.output3 = '/tmp/file_out3.nii' view1 = PipelineDeveloperView(pipeline, show_sub_pipelines=True, allow_open_controller=True) view1.show() pipeline2 = DummyPipelineIterSimple() pipeline2.input = ['/tmp/file_in1.nii', '/tmp/file_in2.nii'] pipeline2.output = '/tmp/file_out.nii' pipeline2.intermediate = ['/tmp/file_out1', '/tmp/file_out2'] view2 = PipelineDeveloperView(pipeline2, show_sub_pipelines=True, allow_open_controller=True) view2.show() pipeline3 = DummyPipelineIter() pipeline3.input = ['/tmp/file_in1.nii', '/tmp/file_in2.nii'] pipeline3.output1 = '/tmp/file_out1.nii' pipeline3.output2 = '/tmp/file_out2.nii'
from capsul.qt_gui.widgets import PipelineDeveloperView app = QtGui.QApplication.instance() if not app: app = QtGui.QApplication(sys.argv) pipeline = MySmallPipeline() pipeline.files_to_create = ["toto", "tutu", "titi"] pipeline.output_image = ['toto_out', 'tutu_out', 'tata_out'] pipeline.dynamic_parameter = [3, 1, 4] pipeline.other_output = [0, 0, 0] pipeline.other_input = 0 pipeline2 = pipeline.nodes["iterative"].process pipeline2.scene_scale_factor = 0.5 view1 = PipelineDeveloperView(pipeline, show_sub_pipelines=True, allow_open_controller=True) view1.add_embedded_subpipeline('iterative') view1.auto_dot_node_positions() view1.show() pipeline2 = MyBigPipeline() view2 = PipelineDeveloperView(pipeline2, show_sub_pipelines=True, allow_open_controller=True) view2.add_embedded_subpipeline('iterative') view2.auto_dot_node_positions() view2.show() app.exec_() del view1
app = QtGui.QApplication(sys.argv) #pipeline = Pipeline1() #pipeline.main_inputs = [os.path.join(self.temp_dir, 'file%d' % i #for i in range(4)]) #pipeline.test = pipeline.main_inputs[2] #pipeline.subject = 'subject2' #pipeline.output_directory = os.path.join(self.temp_dir, 'out_dir') #view1 = PipelineDeveloperView(pipeline, allow_open_controller=True, #show_sub_pipelines=True, #enable_edition=True) #view1.show() pipeline2 = PipelineLOO() pipeline2.main_inputs = ['/tmp/file%d' % i for i in range(4)] pipeline2.test = pipeline2.main_inputs[2] pipeline2.subjects = ['subject%d' % i for i in range(4)] pipeline2.output_directory = '/tmp/out_dir' pipeline2.nfolds = 4 pipeline2.fold = list(range(pipeline2.nfolds)) #wf = pipeline_workflow.workflow_from_pipeline(pipeline2, #create_directories=False) view2 = PipelineDeveloperView(pipeline2, allow_open_controller=True, show_sub_pipelines=True, enable_edition=True) view2.show() app.exec_() #del view1 del view2
def write_state(): state_file_name = '/tmp/state.json' with open(state_file_name, 'w') as f: json.dump(pipeline.pipeline_state(), f) print('Wrote', state_file_name) import sys from soma.qt_gui import qt_backend qt_backend.set_qt_backend(compatible_qt5=True) from soma.qt_gui.qt_backend import Qt from capsul.qt_gui.widgets import PipelineDeveloperView #from capsul.qt_gui.widgets import PipelineUserView from capsul.api import capsul_engine app = Qt.QApplication(sys.argv) # pipeline = capsul_engine().get_process_instance(MainTestPipeline) pipeline = MainTestPipeline() pipeline.on_trait_change(write_state, 'selection_changed') view1 = PipelineDeveloperView(pipeline, show_sub_pipelines=True, allow_open_controller=True) view1.add_embedded_subpipeline('switch_pipeline', scale=0.7) view1.add_embedded_subpipeline('way1_1', scale=0.4) view1.add_embedded_subpipeline('way2_1', scale=0.4) view1.show() #view2 = PipelineUserView(pipeline) #view2.show() app.exec_() del view1 #del view2
def test(): """ Function to execute unitest """ suite = unittest.TestLoader().loadTestsFromTestCase(TestComplexPipeline) runtime = unittest.TextTestRunner(verbosity=2).run(suite) return runtime.wasSuccessful() if __name__ == '__main__': print('Test return code:', test()) if '-v' in sys.argv[1:]: from pprint import pprint pipeline = get_process_instance(ComplexPipeline) from soma.qt_gui.qt_backend import QtGui from capsul.qt_gui.widgets import PipelineDeveloperView #from capsul.qt_gui.widgets.activation_inspector import ActivationInspectorApp #app = ActivationInspectorApp(ComplexPipeline) app = QtGui.QApplication(sys.argv) view = PipelineDeveloperView(pipeline, allow_open_controller=True, show_sub_pipelines=True) view.show() app.exec_() del view
if len(sys.argv) > 1 and '-v' in sys.argv[1:] \ or '--verbose' in sys.argv[1:]: import sys #from soma.qt_gui import qt_backend #qt_backend.set_qt_backend('PyQt4') from soma.qt_gui.qt_backend import QtGui from capsul.qt_gui.widgets import PipelineDeveloperView #app = QtGui.QApplication(sys.argv) #pipeline = MyCompositePipeline() #view1 = PipelineDeveloperView(pipeline, show_sub_pipelines=True) #view1.show() #app.exec_() #del view1 from capsul.qt_gui.widgets import PipelineUserView if QtGui.QApplication.instance() is not None: has_qapp = True app = QtGui.QApplication.instance() else: has_qapp = False app = QtGui.QApplication(sys.argv) pipeline = MyCompositePipeline() view1 = PipelineDeveloperView(pipeline, show_sub_pipelines=True) view1.show() view2 = PipelineUserView(pipeline) view2.show() if not has_qapp: app.exec_() del view1