From 71ce8485bccffe1a9a1c6f7a6e12f573ad3c085c Mon Sep 17 00:00:00 2001
From: Padraig Gleeson
Date: Tue, 10 Jun 2014 19:00:30 +0100
Subject: [PATCH] Adding option to disable generation of gui elements for
neuron
Addresses part of https://github.com/NeuroML/jNeuroML/issues/11
---
src/main/java/org/neuroml/export/Utils.java | 20 +++
.../neuroml/export/neuron/NeuronWriter.java | 141 ++++++++++++------
2 files changed, 115 insertions(+), 46 deletions(-)
diff --git a/src/main/java/org/neuroml/export/Utils.java b/src/main/java/org/neuroml/export/Utils.java
index f9b0074c0..ca9df3275 100644
--- a/src/main/java/org/neuroml/export/Utils.java
+++ b/src/main/java/org/neuroml/export/Utils.java
@@ -22,6 +22,7 @@
import org.lemsml.jlems.core.type.QuantityReader;
import org.lemsml.jlems.core.type.Unit;
import org.lemsml.jlems.core.xml.XMLException;
+import org.lemsml.jlems.io.IOUtil;
import org.lemsml.jlems.io.reader.JarResourceInclusionReader;
import org.lemsml.jlems.io.util.FileUtil;
import org.lemsml.jlems.io.util.JUtil;
@@ -313,6 +314,25 @@ public static AbstractList reorderAlphabetically(AbstractList list, boolean asce
return list;
}
+ public static void runLemsFile(File f) throws ContentError, ParseError, ParseException, BuildException, XMLException, ConnectionError, RuntimeError {
+ loadLemsFile(f, true);
+ }
+
+ public static void loadLemsFile(File f, boolean run) throws ContentError, ParseError, ParseException, BuildException, XMLException, ConnectionError, RuntimeError {
+
+ Sim sim = Utils.readLemsNeuroMLFile(f);
+ sim.build();
+
+ if (run) {
+ sim.run();
+ IOUtil.saveReportAndTimesFile(sim);
+ E.info("Finished reading, building, running and displaying LEMS model");
+ } else {
+ E.info("Finished reading and building LEMS model");
+ }
+
+ }
+
public static void main(String[] args) throws Exception {
diff --git a/src/main/java/org/neuroml/export/neuron/NeuronWriter.java b/src/main/java/org/neuroml/export/neuron/NeuronWriter.java
index a4f5dafe6..2355ac673 100644
--- a/src/main/java/org/neuroml/export/neuron/NeuronWriter.java
+++ b/src/main/java/org/neuroml/export/neuron/NeuronWriter.java
@@ -18,7 +18,11 @@
import org.lemsml.export.dlems.DLemsWriter;
import org.lemsml.jlems.core.expression.ParseError;
import org.lemsml.jlems.core.logging.E;
+import org.lemsml.jlems.core.run.ConnectionError;
+import org.lemsml.jlems.core.run.RuntimeError;
import org.lemsml.jlems.core.sim.ContentError;
+import org.lemsml.jlems.core.sim.ParseException;
+import org.lemsml.jlems.core.type.BuildException;
import org.lemsml.jlems.core.type.Component;
import org.lemsml.jlems.core.type.Dimension;
import org.lemsml.jlems.core.type.DimensionalQuantity;
@@ -42,6 +46,7 @@
import org.lemsml.jlems.core.type.dynamics.StateVariable;
import org.lemsml.jlems.core.type.dynamics.TimeDerivative;
import org.lemsml.jlems.core.type.dynamics.Transition;
+import org.lemsml.jlems.core.xml.XMLException;
import org.lemsml.jlems.io.util.FileUtil;
import org.neuroml.export.LEMSQuantityPath;
import org.neuroml.export.Utils;
@@ -64,13 +69,31 @@ public class NeuronWriter extends BaseWriter {
private File dirForMods;
ArrayList allGeneratedFiles = new ArrayList();
+ boolean nogui = false;
static boolean debug = false;
+
public enum ChannelConductanceOption {
FIXED_REVERSAL_POTENTIAL, USE_NERNST, USE_GHK;
float erev;
};
+
+
+
+ public static void exportToNeuron(File lemsFile, boolean nogui, boolean run) throws ContentError, ParseError, ConnectionError, BuildException, BuildException, RuntimeError, ParseException, XMLException, GenerationException, NeuroMLException, IOException {
+
+ Lems lems = Utils.readLemsNeuroMLFile(lemsFile).getLems();
+
+ NeuronWriter nw = new NeuronWriter(lems);
+ nw.nogui = nogui;
+ String nrn = nw.getMainScript();
+
+ File nrnFile = new File(lemsFile.getParentFile(), lemsFile.getName().replaceAll(".xml", "_nrn.py"));
+ E.info("Writing to: " + nrnFile.getAbsolutePath());
+
+ FileUtil.writeStringToFile(nrn, nrnFile);
+ }
public NeuronWriter(Lems l) {
super(l, NRNConst.NEURON_FORMAT);
@@ -90,6 +113,16 @@ protected void addComment(StringBuilder sb, String comment) {
private void reset() {
allGeneratedFiles.clear();
}
+
+ public void setNoGui(boolean nogui) {
+ this.nogui = nogui;
+ }
+
+ public boolean isNoGui() {
+ return nogui;
+ }
+
+
public ArrayList generateMainScriptAndMods(File mainFile)
throws ContentError, ParseError, IOException, JAXBException,
@@ -131,7 +164,7 @@ private static String getStateVarName(String sv) {
private static String checkForBinaryOperators(String expr) {
return expr.replace("\\.gt\\.", ">").replace("\\.geq\\.", ">=")
.replace("\\.lt\\.", "<").replace("\\.leq\\.", "<=")
- .replace("\\.and\\.", "&&");
+ .replace("\\.and\\.", "&&").replace("\\.neq\\.", "!=");
}
private static String checkForStateVarsAndNested(String expr,
@@ -151,6 +184,7 @@ private static String checkForStateVarsAndNested(String expr,
newExpr = newExpr.replaceAll("\\.leq\\.", "<=");
newExpr = newExpr.replaceAll("\\.lt\\.", "<=");
newExpr = newExpr.replaceAll("\\.eq\\.", "==");
+ newExpr = newExpr.replaceAll("\\.neq\\.", "!=");
newExpr = newExpr.replaceAll("\\.and.", "&&");
newExpr = newExpr.replaceAll(" ln\\(", " log(");
@@ -196,7 +230,12 @@ public String generate(File pdirForMods) throws NeuroMLException,
main.append("import neuron\n");
main.append("h = neuron.h\n");
- main.append("h.load_file(\"nrngui.hoc\")\n\n");
+ if (nogui) {
+ main.append("h.load_file(\"stdlib.hoc\")\n\n");
+ main.append("h.load_file(\"stdgui.hoc\")\n\n");
+ } else {
+ main.append("h.load_file(\"nrngui.hoc\")\n\n");
+ }
main.append("h(\"objref p\")\n");
main.append("h(\"p = new PythonObject()\")\n\n");
@@ -584,42 +623,44 @@ public String generate(File pdirForMods) throws NeuroMLException,
ArrayList displayGraphs = new ArrayList();
HashMap> plots = new HashMap>();
- for (Component dispComp : simCpt.getAllChildren()) {
- if (dispComp.getName().indexOf("Display") >= 0) {
+ if (!nogui) {
+ for (Component dispComp : simCpt.getAllChildren()) {
+ if (dispComp.getName().indexOf("Display") >= 0) {
- String dispId = dispComp.getID();
- int plotColour = 1;
+ String dispId = dispComp.getID();
+ int plotColour = 1;
- String dispGraph = "display_" + dispId;
- if (!displayGraphs.contains(dispGraph)) {
- displayGraphs.add(dispGraph);
- }
+ String dispGraph = "display_" + dispId;
+ if (!displayGraphs.contains(dispGraph)) {
+ displayGraphs.add(dispGraph);
+ }
- for (Component lineComp : dispComp.getAllChildren()) {
- if (lineComp.getName().indexOf("Line") >= 0) {
+ for (Component lineComp : dispComp.getAllChildren()) {
+ if (lineComp.getName().indexOf("Line") >= 0) {
- String quantity = lineComp.getStringValue("quantity");
- String scale = lineComp.getStringValue("scale");
-
- LEMSQuantityPathNeuron lqp = new LEMSQuantityPathNeuron(quantity, scale, targetComp, compMechNamesHoc, popsOrComponents, compIdsVsCells, lems);
-
- if (plots.get(dispGraph) == null)
- plots.put(dispGraph, new ArrayList());
+ String quantity = lineComp.getStringValue("quantity");
+ String scale = lineComp.getStringValue("scale");
- plots.get(dispGraph).add("# Line, plotting: " + lqp.getQuantity());
- //plots.get(dispGraph).add("# compMechNamesHoc: " + compMechNamesHoc);
- //plots.get(dispGraph).add("# " + lqp.toString().replaceAll("\n", "\n# "));
+ LEMSQuantityPathNeuron lqp = new LEMSQuantityPathNeuron(quantity, scale, targetComp, compMechNamesHoc, popsOrComponents, compIdsVsCells, lems);
- plots.get(dispGraph).add(dispGraph + ".addexpr(\"" + lqp.getNeuronVariableReference() + "\", \"" + lqp.getNeuronVariableReference() + "\", " + plotColour + ", 1, 0.8, 0.9, 2)");
- plotColour++;
- if (plotColour > 10) {
- plotColour = 1;
- }
+ if (plots.get(dispGraph) == null)
+ plots.put(dispGraph, new ArrayList());
- }
- }
- }
- }
+ plots.get(dispGraph).add("# Line, plotting: " + lqp.getQuantity());
+ //plots.get(dispGraph).add("# compMechNamesHoc: " + compMechNamesHoc);
+ //plots.get(dispGraph).add("# " + lqp.toString().replaceAll("\n", "\n# "));
+
+ plots.get(dispGraph).add(dispGraph + ".addexpr(\"" + lqp.getNeuronVariableReference() + "\", \"" + lqp.getNeuronVariableReference() + "\", " + plotColour + ", 1, 0.8, 0.9, 2)");
+ plotColour++;
+ if (plotColour > 10) {
+ plotColour = 1;
+ }
+
+ }
+ }
+ }
+ }
+ }
main.append(toRec);
String len = simCpt.getStringValue("length");
@@ -640,18 +681,20 @@ public String generate(File pdirForMods) throws NeuroMLException,
main.append("h.dt = " + dt + "\n\n");
main.append("h.steps_per_ms = " + (float) (1d / Double.parseDouble(dt)) + "\n\n");
- // main.append("objref SampleGraph\n");
- for (String dg : displayGraphs) {
- addComment(main, "Display: " + dg);
- main.append(dg + " = h.Graph(0)\n");
- main.append(dg + ".size(0,h.tstop,-80.0,50.0)\n");
- main.append(dg + ".view(0, -80.0, h.tstop, 130.0, 80, 330, 330, 250)\n");
- main.append("h.graphList[0].append(" + dg + ")\n");
- for (String plot : plots.get(dg)) {
- main.append(plot + "\n");
- }
- main.append("\n");
- }
+
+ if (!nogui) {
+ for (String dg : displayGraphs) {
+ addComment(main, "Display: " + dg);
+ main.append(dg + " = h.Graph(0)\n");
+ main.append(dg + ".size(0,h.tstop,-80.0,50.0)\n");
+ main.append(dg + ".view(0, -80.0, h.tstop, 130.0, 80, 330, 330, 250)\n");
+ main.append("h.graphList[0].append(" + dg + ")\n");
+ for (String plot : plots.get(dg)) {
+ main.append(plot + "\n");
+ }
+ main.append("\n");
+ }
+ }
main.append("\n\n");
@@ -734,7 +777,7 @@ public String generate(File pdirForMods) throws NeuroMLException,
main.append("\n\n");
- main.append("h.nrncontrolmenu()\n");
+ if (!nogui) main.append("h.nrncontrolmenu()\n");
main.append("h.run()\n\n");
@@ -764,6 +807,9 @@ public String generate(File pdirForMods) throws NeuroMLException,
}
main.append("print \"Done\"\n\n");
+ if (nogui) {
+ main.append("quit()\n");
+ }
return main.toString();
}
@@ -2101,6 +2147,7 @@ public static void main(String[] args) throws Exception {
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex0_IaF.xml"));
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex5_DetCell.xml"));
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex9_FN.xml"));
+ /*
lemsFiles.add(new File("../neuroConstruct/osb/cerebellum/cerebellar_granule_cell/GranuleCell/neuroConstruct/generatedNeuroML2/LEMS_GranuleCell.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/invertebrate/lobster/PyloricNetwork/neuroConstruct/generatedNeuroML2/LEMS_PyloricPacemakerNetwork.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/invertebrate/celegans/CElegansNeuroML/CElegans/pythonScripts/c302/LEMS_c302_A_Syns.xml"));
@@ -2109,7 +2156,7 @@ public static void main(String[] args) throws Exception {
lemsFiles.add(new File("src/test/resources/BIOMD0000000185_LEMS.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/ACnet2/neuroConstruct/generatedNeuroML2/LEMS_ACnet2.xml"));
- //lemsFiles.add(new File("../neuroConstruct/osb/hippocampus/networks/nc_superdeep/neuroConstruct/generatedNeuroML2/LEMS_nc_superdeep.xml"));
+ //lemsFiles.add(new File("../neuroConstruct/osb/hippocampus/networks/nc_superdeep/neuroConstruct/generatedNeuroML2/LEMS_nc_superdeep.xml"));*/
NeuronWriter nw = null;
String testScript = "";
@@ -2119,6 +2166,7 @@ public static void main(String[] args) throws Exception {
File mainFile = new File(lemsFile.getParentFile(), lemsFile.getName().replaceAll(".xml", "_nrn.py"));
nw = new NeuronWriter(lems);
+ nw.setNoGui(true);
ArrayList ff = nw.generateMainScriptAndMods(mainFile);
for (File f : ff) {
System.out.println("Generated: " + f.getAbsolutePath());
@@ -2128,7 +2176,8 @@ public static void main(String[] args) throws Exception {
testScript += "echo\n";
testScript += "cd "+lemsFile.getParentFile().getCanonicalPath()+"\n";
testScript += "nrnivmodl\n";
- testScript += "nrngui -python "+lemsFile.getName().replaceAll(".xml", "_nrn.py")+" \n";
+ String nrn = nw.isNoGui() ? "nrniv" : "nrngui";
+ testScript += nrn+" -python "+lemsFile.getName().replaceAll(".xml", "_nrn.py")+" \n";
testScript += "\n";
}
File t = new File("test.sh");