def run_once(self, job_dir, ** kwargs): from neuromllite.utils import print_v from neuromllite.utils import load_simulation_json,load_network_json from neuromllite.NetworkGenerator import generate_and_run from pyneuroml.pynml import get_value_in_si print_v('Running NeuroMLlite simulation in dir: %s...'%job_dir) sim = load_simulation_json(self.nmllite_sim) import random sim.id = '%s%s'%(sim.id, '_%s'%kwargs['reference'] if 'reference' in kwargs else '') network = load_network_json(self.base_dir+'/'+sim.network) for a in kwargs: if a in network.parameters: print_v(' Setting %s to %s in network...'%(a, kwargs[a])) network.parameters[a] = kwargs[a] elif a in sim.fields: print_v(' Setting %s to %s in simulator...'%(a, kwargs[a])) setattr(sim,a,kwargs[a]) else: print_v(' Cannot set parameter %s to %s in network or simulator...'%(a, kwargs[a])) traces, events = generate_and_run(sim, simulator = self.simulator, network = network, return_results = True, base_dir = self.base_dir, target_dir = job_dir) print_v("Returned traces: %s, events: %s"%(traces.keys(), events.keys())) return traces, events
def __init__(self, runner, vary, fixed={}, verbose=False, num_parallel_runs=1, plot_all=False, save_plot_all_to=None, heatmap_all=False, save_heatmap_to=None, heatmap_lims=None, show_plot_already=False, peak_threshold=0): self.sim = load_simulation_json(runner.nmllite_sim) self.colormap = 'jet' ps_id = 'ParamSweep_%s_%s' % (self.sim.id, time.ctime().replace( ' ', '_').replace(':', '.')) print_v( "Initialising ParameterSweep %s with %s, %s (%i parallel runs)" % (ps_id, vary, fixed, num_parallel_runs)) os.mkdir(ps_id) self.result_dir = os.path.abspath(ps_id) self.runner = runner self.fixed = fixed self.vary = vary self.verbose = verbose self.num_parallel_runs = num_parallel_runs self.plot_all = plot_all self.save_plot_all_to = save_plot_all_to self.heatmap_all = heatmap_all self.save_heatmap_to = save_heatmap_to self.heatmap_lims = heatmap_lims self.show_plot_already = show_plot_already self.index = 0 self.total_todo = 1 self.report = OrderedDict() self.report['Varied parameters'] = vary self.report['Fixed parameters'] = fixed self.report['Simulations'] = OrderedDict() for v in vary: self.total_todo *= len(vary[v]) self.analysis_var = { 'peak_delta': 0, 'baseline': 0, 'dvdt_threshold': 0, 'peak_threshold': peak_threshold } if self.plot_all: self.ax = pynml.generate_plot( [], [], # Add 2 sets of y values "Traces generated from %s" % self.sim.id, # Title labels=[], xaxis='Time (ms)', # x axis legend yaxis='Membrane potential (mV)', # y axis legend title_above_plot=True, show_plot_already=False) # Save figure if self.heatmap_all: if len(self.vary) != 1: raise Exception( 'Heatmap can only be used when only one parameter is varied...' ) self.hm_x = None self.hm_y = [] self.hm_z = []
def __init__(self, nml_sim_file, parent=None): """Constructor for the GUI""" super(NMLliteUI, self).__init__(parent) self.SPIKES_RASTERPLOT = "Rasterplot" self.SPIKES_POP_RATE_AVE = "Pop rate averages" #print('Styles available: %s'%QStyleFactory.keys()) QApplication.setStyle(QStyleFactory.create('Fusion')) header_font = QFont() header_font.setBold(True) self.backup_colors = {} # to ensure consistent random colors for traces... self.simulation = load_simulation_json(nml_sim_file) self.sim_base_dir = dirname(nml_sim_file) if len(self.sim_base_dir) == 0: self.sim_base_dir = '.' self.network = load_network_json('%s/%s' % (self.sim_base_dir, self.simulation.network)) nameLabel = QLabel("NMLlite file: %s" % realpath(nml_sim_file)) nameLabel.setFont(header_font) paramLayout = QGridLayout() topLayout = QGridLayout() midLayout = QGridLayout() self.tabs = QTabWidget() self.nmlliteTab = QWidget() self.nml2Tab = QWidget() self.matrixTab = QWidget() self.tabs.resize(300, 200) # Add tabs self.simTab = QWidget() self.tabs.addTab(self.simTab, "Simulation") self.simTabLayout = QGridLayout() self.simTab.setLayout(self.simTabLayout) self.plotTabs = QTabWidget() self.tracesTab = QWidget() self.plotTabs.addTab(self.tracesTab, "Traces") self.heatmapTab = QWidget() self.plotTabs.addTab(self.heatmapTab, "Heatmap") if self.simulation.plots2D is not None: self.plot2DTab = QTabWidget() self.plotTabs.addTab(self.plot2DTab, "2D plots") self.plot2DTabLayout = QGridLayout() self.plot2DTab.setLayout(self.plot2DTabLayout) for plot2D in self.simulation.plots2D: info = self.simulation.plots2D[plot2D] pLayout = self.add_tab(plot2D, self.plot2DTab, figure=True, toolbar=True, options=True) if self.simulation.plots3D is not None: self.plot3DTab = QTabWidget() self.plotTabs.addTab(self.plot3DTab, "3D plots") self.plot3DTabLayout = QGridLayout() self.plot3DTab.setLayout(self.plot3DTabLayout) for plot3D in self.simulation.plots3D: info = self.simulation.plots3D[plot3D] pLayout = self.add_tab(plot3D, self.plot3DTab, figure=True, toolbar=False, options=True) offset_opt = 1 rasterOptionsLayout = self.add_tab(self.SPIKES_RASTERPLOT,self.plotTabs, figure=True, toolbar=True, options=True) self.rasterLegend = QCheckBox("Show legend") self.rasterLegend.setChecked(True) rasterOptionsLayout.addWidget(self.rasterLegend, 0, 0+offset_opt) self.rasterLegend.toggled.connect(self.replotSimResults) self.rasterInPops = QCheckBox("Include input pops") self.rasterInPops.setChecked(True) rasterOptionsLayout.addWidget(self.rasterInPops, 0, 1+offset_opt) self.rasterInPops.toggled.connect(self.replotSimResults) spikeStatOptionsLayout = self.add_tab(self.SPIKES_POP_RATE_AVE,self.plotTabs, figure=True, toolbar=True, options=True) self.spikeStatInPops = QCheckBox("Include input pops") self.spikeStatInPops.setChecked(True) spikeStatOptionsLayout.addWidget(self.spikeStatInPops, 0, 0+offset_opt) self.spikeStatInPops.toggled.connect(self.replotSimResults) self.simTabLayout.addWidget(self.plotTabs) self.tracesTabTopLayout = QGridLayout() self.tracesTab.setLayout(self.tracesTabTopLayout) self.tracesTabOptionsLayout = QGridLayout() self.tracesTabTopLayout.addLayout(self.tracesTabOptionsLayout, 0, 0) self.showTracesLegend = QCheckBox("Legend") self.tracesTabOptionsLayout.addWidget(self.showTracesLegend, 0, 0) self.traceSelectButton = QPushButton("Select traces...") self.traceSelectButton.show() self.traceSelectButton.setEnabled(False) self.traceSelectButton.clicked.connect(self.traceSelect) self.tracesTabOptionsLayout.addWidget(self.traceSelectButton, 0, 1) self.tracesTabLayout = QGridLayout() self.tracesTabTopLayout.addLayout(self.tracesTabLayout, 1, 0) self.heatmapLayout = QGridLayout() self.heatmapTab.setLayout(self.heatmapLayout) self.heatmapColorbar = None self.tracesFigure = Figure() self.tracesCanvas = FigureCanvas(self.tracesFigure) self.tracesToolbar = NavigationToolbar(self.tracesCanvas, self) self.tracesTabLayout.addWidget(self.tracesCanvas) self.tracesTabLayout.addWidget(self.tracesToolbar) self.heatmapFigure = Figure() self.heatmapCanvas = FigureCanvas(self.heatmapFigure) self.heatmapLayout.addWidget(self.heatmapCanvas) self.add_tab(self.GRAPH_TAB, self.tabs, image=True, options = True) graphTabOptionsLayout = self.all_options_layouts[self.GRAPH_TAB] offset_opt = 4 graphTabOptionsLayout.addWidget(QLabel("Graph level:"), 0, offset_opt+0) self.graphLevelComboBox = QComboBox(self) self.graphLevelComboBox.addItem('-3') self.graphLevelComboBox.addItem('-2') self.graphLevelComboBox.addItem('-1') self.graphLevelComboBox.addItem('0') self.graphLevelComboBox.addItem('1') self.graphLevelComboBox.addItem('2') self.graphLevelComboBox.addItem('3') self.graphLevelComboBox.addItem('4') self.graphLevelComboBox.addItem('5') self.graphLevelComboBox.addItem('6') self.graphLevelComboBox.setCurrentIndex(6) graphTabOptionsLayout.addWidget(self.graphLevelComboBox, 0, offset_opt+1) self.graphLevelComboBox.currentIndexChanged.connect(self.showGraph) self.graphTypeComboBox = QComboBox(self) self.graphTypeComboBox.addItem('d - dot') self.graphTypeComboBox.addItem('c - circo') self.graphTypeComboBox.addItem('n - neato') self.graphTypeComboBox.addItem('f - fdp') self.graphTypeComboBox.setCurrentIndex(0) graphTabOptionsLayout.addWidget(QLabel("GraphViz engine:"), 0, offset_opt+2) graphTabOptionsLayout.addWidget(self.graphTypeComboBox, 0, offset_opt+3) self.graphTypeComboBox.currentIndexChanged.connect(self.showGraph) self.graphShowExtInputs = QCheckBox("Show ext inputs") self.graphShowExtInputs.setChecked(True) graphTabOptionsLayout.addWidget(self.graphShowExtInputs, 0, offset_opt+4) self.graphShowExtInputs.toggled.connect(self.showGraph) self.graphShowInputPops = QCheckBox("Show input pops") self.graphShowInputPops.setChecked(True) graphTabOptionsLayout.addWidget(self.graphShowInputPops, 0, offset_opt+5) self.graphShowInputPops.toggled.connect(self.showGraph) self.add_tab(self.LEMS_VIEW_TAB, self.tabs, image=True, options = True) self.add_tab(self.IMAGE_3D_TAB, self.tabs, image=True, options = True) self.tabs.addTab(self.matrixTab, "Matrix") self.matrixTabLayout = QGridLayout() self.matrixTab.setLayout(self.matrixTabLayout) # Add tabs self.tabs.addTab(self.nmlliteTab, "NeuroMLlite") self.nmlliteTabLayout = QGridLayout() self.nmlliteTab.setLayout(self.nmlliteTabLayout) self.nmlliteTabs = QTabWidget() self.nmlliteTabLayout.addWidget(self.nmlliteTabs) self.nmlliteSimTab = QWidget() self.nmlliteTabs.addTab(self.nmlliteSimTab, "Simulation") self.nmlliteSimTabLayout = QGridLayout() self.nmlliteSimTab.setLayout(self.nmlliteSimTabLayout) self.nmlliteSimText = QPlainTextEdit() self.nmlliteSimTabLayout.addWidget(self.nmlliteSimText,0,0) self.nmlliteNetTab = QWidget() self.nmlliteTabs.addTab(self.nmlliteNetTab, "Network") self.nmlliteNetTabLayout = QGridLayout() self.nmlliteNetTab.setLayout(self.nmlliteNetTabLayout) self.nmlliteNetText = QPlainTextEdit() self.nmlliteNetTabLayout.addWidget(self.nmlliteNetText,0,0) self.tabs.addTab(self.nml2Tab, "NeuroML 2") self.nml2Layout = QGridLayout() self.nml2Tab.setLayout(self.nml2Layout) self.nml2Text = QPlainTextEdit() self.nml2Text.insertPlainText("\n Generate an instance of the populations and projections in this network in NeuroML 2"+ "\n format by pressing the Generate NeuroML 2 button on the left"+ "\n\n\n WARNING: depending on the size of the generated network, text may take some time to load!") self.nml2Layout.addWidget(self.nml2Text,0,0) # Add tabs to widget midLayout.addWidget(self.tabs, 0, 0) mainLayout = QGridLayout() topLayout.addWidget(nameLabel, 0, 0) #topLayout.addWidget(self.nameLine, 0, 1) rows = 0 l = QLabel("Network parameters") l.setFont(header_font) paramLayout.addWidget(l, rows, 0) self.param_entries = {} if self.network.parameters is not None and len(self.network.parameters) > 0: for p in sorted(self.network.parameters.keys()): rows += 1 pval = self.network.parameters[p] label = QLabel("%s" % p) paramLayout.addWidget(label, rows, 0) entry = self.get_value_entry(p, pval, self.param_entries) paramLayout.addWidget(entry, rows, 1) if self.network.seed is not None: rows += 1 pval = self.network.seed label = QLabel('Net generation seed') paramLayout.addWidget(label, rows, 0) entry = self.get_value_entry('seed', pval, self.param_entries) paramLayout.addWidget(entry, rows, 1) if self.network.temperature is not None: rows += 1 pval = self.network.temperature label = QLabel('Temperature') paramLayout.addWidget(label, rows, 0) entry = self.get_value_entry('temperature', pval, self.param_entries) paramLayout.addWidget(entry, rows, 1) self.graphButton = QPushButton("Generate graph") self.graphButton.show() self.graphButton.clicked.connect(self.showGraph) rows += 1 paramLayout.addWidget(self.graphButton, rows, 0) self.lemsViewButton = QPushButton("Generate LEMS View") self.lemsViewButton.show() self.lemsViewButton.clicked.connect(self.showLemsView) rows += 1 paramLayout.addWidget(self.lemsViewButton, rows, 0) self.image3DButton = QPushButton("Generate 3D image") self.image3DButton.show() self.image3DButton.clicked.connect(self.show3Dimage) rows += 1 paramLayout.addWidget(self.image3DButton, rows, 0) self.matrixButton = QPushButton("Generate matrix") self.matrixButton.show() self.matrixButton.clicked.connect(self.showMatrix) rows += 1 paramLayout.addWidget(self.matrixButton, rows, 0) self.nml2Button = QPushButton("Generate NeuroML 2") self.nml2Button.show() self.nml2Button.clicked.connect(self.generateNeuroML2) rows += 1 paramLayout.addWidget(self.nml2Button, rows, 0) rows += 1 l = QLabel("Simulation parameters") l.setFont(header_font) paramLayout.addWidget(l, rows, 0) self.sim_entries = {} svars = ['dt', 'duration', 'seed'] for s in svars: rows += 1 sval = self.simulation.__getattr__(s) if sval is not None: label = QLabel("%s" % s) paramLayout.addWidget(label, rows, 0) entry = self.get_value_entry(s, sval, self.sim_entries) paramLayout.addWidget(entry, rows, 1) rows += 1 paramLayout.addWidget(QLabel("Simulator:"), rows, 0) self.simulatorComboBox = QComboBox(self) for sim in self.simulators: self.simulatorComboBox.addItem(sim) paramLayout.addWidget(self.simulatorComboBox, rows, 1) rows += 1 self.runButton = QPushButton("Run simulation") self.runButton.show() self.runButton.clicked.connect(self.runSimulation) self.autoRunCheckBox = QCheckBox("Auto run") rows += 1 paramLayout.addWidget(self.runButton, rows, 0) paramLayout.addWidget(self.autoRunCheckBox, rows, 1) mainLayout.addLayout(topLayout, 0, 1) mainLayout.addLayout(paramLayout, 1, 0) mainLayout.addLayout(midLayout, 1, 1) #self.setLayout(paramLayout) self.setLayout(mainLayout) self.setWindowTitle("NeuroMLlite GUI") self.update_network_json() self.update_simulation_json()