Skip to content

Commit

Permalink
Merge pull request #117 from NeuroML/experimental
Browse files Browse the repository at this point in the history
To v1.10.1; Adds support for external morphology/biophysProps in cell element for Neuron/NetPyNE
  • Loading branch information
pgleeson authored Jun 11, 2024
2 parents 9accde5 + 11aabc9 commit c0fe053
Show file tree
Hide file tree
Showing 13 changed files with 172 additions and 69 deletions.
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<groupId>org.neuroml.export</groupId>
<artifactId>org.neuroml.export</artifactId>
<packaging>bundle</packaging>
<version>1.10.0</version>
<version>1.10.1</version>
<name>org.neuroml.export</name>
<url>http://maven.apache.org</url>

Expand All @@ -18,12 +18,12 @@
<dependency>
<groupId>org.neuroml.model</groupId>
<artifactId>org.neuroml.model</artifactId>
<version>1.10.0</version>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.lemsml</groupId>
<artifactId>jlems</artifactId>
<version>0.11.0</version>
<version>0.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
Expand All @@ -49,7 +49,7 @@
&lt;br /&gt;
&lt;br /&gt;
</top>
<bottom>Copyright NeuroML Contributors 2023</bottom>
<bottom>Copyright NeuroML Contributors 2024</bottom>
</configuration>
</plugin>
<plugin>
Expand Down
28 changes: 24 additions & 4 deletions src/main/java/org/lemsml/export/dlems/DLemsWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -673,16 +673,29 @@ private void writeDLemsForComponent(JsonGenerator g, Component comp, HashMap<Str
g.writeObjectFieldStart(DLemsKeywords.PARAMETERS.get());
writeParameters(g, comp);
g.writeEndObject();

Component bpComp = comp.quietGetChild("biophysicalProperties");
if (bpComp==null)
{
try{
Cell cell = (Cell)Utils.convertLemsComponentToNeuroML(comp, true, lems).get(comp.getID());
bpComp = lems.getComponent(cell.getBiophysicalProperties().getId());
}
catch (NeuroMLException ne)
{
throw new ContentError("Unable to parse cell's biophysicalProperties", ne);
}
}

for (Component specie: comp.getChild("biophysicalProperties").getChild("intracellularProperties").getChildrenAL("speciesList")) {
for (Component specie: bpComp.getChild("intracellularProperties").getChildrenAL("speciesList")) {

try{
g.writeStringField(specie.getID()+"_initial_internal_conc", ""+Utils.getMagnitudeInSI(specie.getAttributeValue("initialConcentration")));
g.writeStringField(specie.getID()+"_initial_external_conc", ""+Utils.getMagnitudeInSI(specie.getAttributeValue("initialExtConcentration")));
}
catch (NeuroMLException ne)
{
throw new ContentError("Unabel to parse NeuroML", ne);
throw new ContentError("Unable to parse NeuroML", ne);
}
}

Expand Down Expand Up @@ -894,7 +907,7 @@ private void addNrnSecNameFract(Component comp, int segId, JsonGenerator g) thro

if(!cachedNrnSecNames.get(comp.getID()).containsKey(segId))
{
Cell cell = (Cell)Utils.convertLemsComponentToNeuroML(comp).get(comp.getID());
Cell cell = (Cell)Utils.convertLemsComponentToNeuroML(comp, true, lems).get(comp.getID());

NamingHelper nh = new NamingHelper(cell);
Segment segment = CellUtils.getSegmentWithId(cell, segId);
Expand Down Expand Up @@ -933,7 +946,14 @@ private void extractQuantityInfo(String quantity, JsonGenerator g) throws IOExce
Component comp = popIdsVsComponents.get(lqp.getPopulation());

if (comp.getComponentType().isOrExtends("cell")) {
for (Component seg: comp.getChild("morphology").getChildrenAL("segments")) {
Component morphComp = comp.quietGetChild("morphology");

if (morphComp==null) {
morphComp=lems.getComponent(comp.getTextParam("morphology"));
}


for (Component seg: morphComp.getChildrenAL("segments")) {
if (seg.id.equals(lqp.getSegmentId()+"")) {
g.writeStringField(DLemsKeywords.SEGMENT_ID.get(), lqp.getSegmentId()+"");
g.writeStringField(DLemsKeywords.SEGMENT_NAME.get(), seg.getName());
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/neuroml/export/eden/EDENWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public void setSupportedFeatures()
{
sli.addSupportInfo(format, ModelFeature.ABSTRACT_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.COND_BASED_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.EXT_MORPH_BIOPHYS_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.SINGLE_COMP_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.NETWORK_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.MULTI_CELL_MODEL, SupportLevelInfo.Level.HIGH);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/neuroml/export/info/InfoTreeCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public static InfoNode createInfoTreeFromComponent(final Component component) th
{
InfoNode infoRoot = new InfoNode();

LinkedHashMap<String, Standalone> standalones = Utils.convertLemsComponentToNeuroML(component);
LinkedHashMap<String, Standalone> standalones = Utils.convertLemsComponentToNeuroML(component, true, null);

for(Standalone element : standalones.values())
{
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/org/neuroml/export/netpyne/NetPyNEWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ public void setSupportedFeatures()
{
sli.addSupportInfo(format, ModelFeature.ABSTRACT_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.COND_BASED_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.EXT_MORPH_BIOPHYS_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.SINGLE_COMP_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.NETWORK_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.MULTI_CELL_MODEL, SupportLevelInfo.Level.HIGH);
Expand Down Expand Up @@ -472,6 +473,11 @@ public static void main(String[] args) throws Exception
//lemsFiles.add(new File("../neuroConstruct/osb/olfactorybulb/networks/MiglioreEtAl14_OlfactoryBulb3D/NeuroML2/Channels/test/LEMS_OlfactoryTest_12.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/generic/hodgkin_huxley_tutorial/Tutorial/Source/LEMS_HH_Simulation.xml"));
//lemsFiles.add(new File("../git/multi/temp/LEMS_ISN_net.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/ACnet2/neuroConstruct/generatedNeuroML2/LEMS_ACNet2.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_in_b_in.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_out_b_in.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_out_b_out.xml"));
//lemsFiles.add(new File("../git/morphology_include/LEMS_m_in_b_out.xml"));

for (File lemsFile : lemsFiles)
{
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/neuroml/export/neuron/NamingHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.neuroml.model.Segment;
import org.neuroml.model.SegmentGroup;
import org.neuroml.model.util.CellUtils;
import org.neuroml.model.util.NeuroMLException;

/**
*
Expand All @@ -31,7 +32,7 @@ public NamingHelper(Cell cell)
this.cell = cell;
}

public String getNrnSectionName(Segment seg)
public String getNrnSectionName(Segment seg) throws NeuroMLException
{

String uniqueId = cell.getId() + ":" + seg.getId();
Expand Down
27 changes: 18 additions & 9 deletions src/main/java/org/neuroml/export/neuron/NeuronWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ public void setSupportedFeatures()
{
sli.addSupportInfo(format, ModelFeature.ABSTRACT_CELL_MODEL, SupportLevelInfo.Level.MEDIUM);
sli.addSupportInfo(format, ModelFeature.COND_BASED_CELL_MODEL, SupportLevelInfo.Level.MEDIUM);
sli.addSupportInfo(format, ModelFeature.EXT_MORPH_BIOPHYS_CELL_MODEL, SupportLevelInfo.Level.HIGH);
sli.addSupportInfo(format, ModelFeature.SINGLE_COMP_MODEL, SupportLevelInfo.Level.MEDIUM);
sli.addSupportInfo(format, ModelFeature.NETWORK_MODEL, SupportLevelInfo.Level.LOW);
sli.addSupportInfo(format, ModelFeature.MULTI_CELL_MODEL, SupportLevelInfo.Level.MEDIUM);
Expand Down Expand Up @@ -2071,7 +2072,7 @@ private Cell getCellFromComponent(Component cellComponent) throws LEMSException,
}
else
{
cell = Utils.getCellFromComponent(cellComponent);
cell = Utils.getCellFromComponent(cellComponent, lems);
compIdsVsCells.put(cellComponent.getID(), cell);
}
return cell;
Expand Down Expand Up @@ -2105,7 +2106,11 @@ public IntracellularProperties convertCellWithMorphology(Component cellComponent
{
BiophysicalProperties bp = cell.getBiophysicalProperties();
ip = bp.getIntracellularProperties();
bpComp = cellComponent.getChild("biophysicalProperties");
bpComp = cellComponent.quietGetChild("biophysicalProperties");
if (bpComp==null)
{
bpComp = lems.getComponent(bp.getId());
}
mpComp = bpComp.getChild("membraneProperties");
ipComp = bpComp.getChild("intracellularProperties");
}
Expand Down Expand Up @@ -3936,8 +3941,8 @@ public static void main(String[] args) throws Exception

ArrayList<File> lemsFiles = new ArrayList<File>();

lemsFiles.add(new File("../neuroConstruct/osb/hippocampus/interneurons/WangBuzsaki1996/NeuroML2/LEMS_ComponentType/LEMS_WangBuzsaki.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/generic/HindmarshRose1984/NeuroML2/LEMS_Regular_HindmarshRoseNML.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/hippocampus/interneurons/WangBuzsaki1996/NeuroML2/LEMS_ComponentType/LEMS_WangBuzsaki.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/generic/HindmarshRose1984/NeuroML2/LEMS_Regular_HindmarshRoseNML.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/showcase/StochasticityShowcase/NeuroML2/LEMS_Inputs0.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/invertebrate/celegans/CElegansNeuroML/CElegans/pythonScripts/c302/examples/LEMS_c302_C1_Oscillator.xml"));

Expand All @@ -3947,14 +3952,14 @@ public static void main(String[] args) throws Exception
//lemsFiles.add(new File("../neuroConstruct/osb/cerebellum/networks/VervaekeEtAl-GolgiCellNetwork/NeuroML2/LEMS_Pacemaking.xml"));
//lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex9_FN.xml"));
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex5_DetCell.xml"));
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex15_CaDynamics.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/IzhikevichModel/NeuroML2/LEMS_2007One.xml"));
//lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex15_CaDynamics.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/IzhikevichModel/NeuroML2/LEMS_2007One.xml"));
//lemsFiles.add(new File("../org.neuroml.export/src/test/resources/examples/LEMS_SpikePass2.xml"));
/*
lemsFiles.add(new File("../neuroConstruct/osb/showcase/StochasticityShowcase/NeuroML2/LEMS_NoisyCurrentInput.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/showcase/StochasticityShowcase/NeuroML2/LEMS_OUCurrentInput_test.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/IzhikevichModel/NeuroML2/LEMS_FiveCells.xml"));*/
lemsFiles.add(new File("../git/ca1/NeuroML2/channels/test_Cadynamics/NeuroML2/LEMS_test_Ca.xml"));
//lemsFiles.add(new File("../git/ca1/NeuroML2/channels/test_Cadynamics/NeuroML2/LEMS_test_Ca.xml"));
//lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex20a_AnalogSynapsesHH.xml"));
//lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex20_AnalogSynapses.xml"));
//lemsFiles.add(new File("../NeuroMLlite/neuromllite/LEMS_Sim_ten_cells_spikes_nest.xml"));
Expand All @@ -3976,7 +3981,11 @@ public static void main(String[] args) throws Exception
//
// lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/multiple/PospischilEtAl2008/NeuroML2/channels/Na/LEMS_Na.xml"));
// lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/multiple/PospischilEtAl2008/NeuroML2/channels/Kd/LEMS_Kd.xml"));
// lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/ACnet2/neuroConstruct/generatedNeuroML2/LEMS_MediumNet.xml"));
lemsFiles.add(new File("../neuroConstruct/osb/cerebral_cortex/networks/ACnet2/neuroConstruct/generatedNeuroML2/LEMS_ACNet2.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_in_b_in.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_out_b_in.xml"));
lemsFiles.add(new File("../git/morphology_include/LEMS_m_in_b_out.xml"));

// lemsFiles.add(new File("../OpenCortex/examples/LEMS_ACNet.xml"));
//
//lemsFiles.add(new File("../OpenCortex/examples/LEMS_SpikingNet.xml"));
Expand All @@ -3995,7 +4004,7 @@ public static void main(String[] args) throws Exception
// lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex25_MultiComp.xml"));
// lemsFiles.add(new File("../neuroConstruct/osb/showcase/NetPyNEShowcase/NeuroML2/LEMS_HybridTut.xml"));
// lemsFiles.add(new File("../OpenCortex/examples/LEMS_L23TraubDemo_1cells_0conns.xml"));
lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex0_IaF.xml"));
//lemsFiles.add(new File("../NeuroML2/LEMSexamples/LEMS_NML2_Ex0_IaF.xml"));

//lemsFiles.add(new File("../neuroConstruct/osb/invertebrate/celegans/CElegansNeuroML/CElegans/pythonScripts/c302/examples/LEMS_c302_C1_Muscles.xml"));
//lemsFiles.add(new File("../neuroConstruct/osb/invertebrate/celegans/CElegansNeuroML/CElegans/pythonScripts/c302/examples/LEMS_c302_C1_Syns.xml"));
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/org/neuroml/export/svg/Network3D.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.HashMap;
import java.util.List;
import org.neuroml.model.util.CellUtils;
import org.neuroml.model.util.NeuroMLException;

public class Network3D
{
Expand All @@ -19,13 +20,13 @@ public Network3D(String comment)
lines = new ArrayList<Line3D>(100);
}

public Network3D(Cell cell)
public Network3D(Cell cell) throws NeuroMLException
{
this.comment = "Cell: "+cell.getId();
lines = extractLines(cell, null);
}

public void addCell(Cell cell, float offsetX, float offsetY, float offsetZ, String defaultColor)
public void addCell(Cell cell, float offsetX, float offsetY, float offsetZ, String defaultColor) throws NeuroMLException
{
lines.addAll(extractLines(cell, offsetX, offsetY, offsetZ, defaultColor));
}
Expand Down Expand Up @@ -201,13 +202,13 @@ private Network3D rotate(double degreesAroundZ, double degreesAroundY)
}


private ArrayList<Line3D> extractLines(Cell cell, String defaultColor)
private ArrayList<Line3D> extractLines(Cell cell, String defaultColor) throws NeuroMLException
{
return extractLines(cell, 0, 0, 0, defaultColor);
}


private ArrayList<Line3D> extractLines(Cell cell, float offsetX, float offsetY, float offsetZ, String defaultColor)
private ArrayList<Line3D> extractLines(Cell cell, float offsetX, float offsetY, float offsetZ, String defaultColor) throws NeuroMLException
{
ArrayList<Line3D> result = new ArrayList<Line3D>();

Expand Down
38 changes: 22 additions & 16 deletions src/main/java/org/neuroml/export/svg/SVGWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,21 +82,27 @@ public String getMainScript() throws GenerationException
{
StringBuilder core = new StringBuilder();

Rectangle bounds = render(core, false);

StringBuilder result = new StringBuilder();
//Add header
result.append("<?xml version='1.0' encoding='UTF-8'?>\n");
//addComment(result, "Total bounds: "+bounds.toString());
startElement(result, "svg", "xmlns=" + SVG_NAMESPACE,
"version=" + SVG_VERSION,
"width="+bounds.width,
"height="+bounds.height,
"viewBox=0 0 "+bounds.width+" "+bounds.height);

result.append(core.toString());

endElement(result, "svg");
try {

Rectangle bounds = render(core, false);

//Add header
result.append("<?xml version='1.0' encoding='UTF-8'?>\n");
//addComment(result, "Total bounds: "+bounds.toString());
startElement(result, "svg", "xmlns=" + SVG_NAMESPACE,
"version=" + SVG_VERSION,
"width="+bounds.width,
"height="+bounds.height,
"viewBox=0 0 "+bounds.width+" "+bounds.height);

result.append(core.toString());

endElement(result, "svg");
}
catch (NeuroMLException ne) {
throw new GenerationException("Problem generating SVG", ne);
}

return result.toString();
}
Expand All @@ -107,7 +113,7 @@ public List<Cell> getAllBasedOnCell(NeuroMLDocument nmlDocument) {
return cells;
}

public Rectangle render(StringBuilder result, boolean png) {
public Rectangle render(StringBuilder result, boolean png) throws NeuroMLException {

if (nmlDocument.getNetwork().isEmpty())
{
Expand Down Expand Up @@ -185,7 +191,7 @@ public Rectangle render(StringBuilder result, boolean png) {
}
}

public void convertToPng(File pngFile) {
public void convertToPng(File pngFile) throws NeuroMLException {

// One quick run to get bounds...
Rectangle bounds = render(new StringBuilder(), false);
Expand Down
Loading

0 comments on commit c0fe053

Please sign in to comment.