Skip to content

Commit

Permalink
Fixes to Neuron and Netpyne to handle case where cell has external mo…
Browse files Browse the repository at this point in the history
…rphology/biophysicalProperties
  • Loading branch information
pgleeson committed May 31, 2024
1 parent faf1311 commit 528e08a
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 62 deletions.
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
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
5 changes: 5 additions & 0 deletions src/main/java/org/neuroml/export/netpyne/NetPyNEWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,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
26 changes: 17 additions & 9 deletions src/main/java/org/neuroml/export/neuron/NeuronWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -2071,7 +2071,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 +2105,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 +3940,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 +3951,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 +3980,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 +4003,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
39 changes: 36 additions & 3 deletions src/main/java/org/neuroml/export/utils/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.neuroml.export.utils.support.SupportLevelInfo;
import org.neuroml.model.Cell;
import org.neuroml.model.Cell2CaPools;
import org.neuroml.model.Morphology;
import org.neuroml.model.BiophysicalProperties;
import org.neuroml.model.NeuroMLDocument;
import org.neuroml.model.Standalone;
import org.neuroml.model.util.NeuroML2Validator;
Expand Down Expand Up @@ -401,11 +403,42 @@ public static NeuroMLDocument convertLemsComponentToNeuroMLDocument(Component co
return nmlDocument;
}

public static LinkedHashMap<String, Standalone> convertLemsComponentToNeuroML(Component comp) throws LEMSException, NeuroMLException
public static LinkedHashMap<String, Standalone> convertLemsComponentToNeuroML(Component comp, boolean fixExternalMorphsBiophys, Lems lems) throws LEMSException, NeuroMLException
{
NeuroMLDocument nmlDocument = convertLemsComponentToNeuroMLDocument(comp);

LinkedHashMap<String, Standalone> els = NeuroMLConverter.getAllStandaloneElements(nmlDocument);

if (fixExternalMorphsBiophys)
{
for (Map.Entry<String, Standalone> entry : els.entrySet())
{
String id = entry.getKey();
Standalone e = entry.getValue();
if (e instanceof Cell) {
Cell cell = (Cell)e;

if (cell.getMorphologyAttr() != null)
{
Component morphComp = lems.getComponent(cell.getMorphologyAttr());
NeuroMLDocument nmlDocumentMorph = convertLemsComponentToNeuroMLDocument(morphComp);
Morphology m = nmlDocumentMorph.getMorphology().get(0);
cell.setMorphology(m);
cell.setMorphologyAttr(null);
els.put(id, cell);
}
if (cell.getBiophysicalPropertiesAttr() != null)
{
Component bpComp = lems.getComponent(cell.getBiophysicalPropertiesAttr());
NeuroMLDocument nmlDocumentBp = convertLemsComponentToNeuroMLDocument(bpComp);
BiophysicalProperties bp = nmlDocumentBp.getBiophysicalProperties().get(0);
cell.setBiophysicalProperties(bp);
cell.setBiophysicalPropertiesAttr(null);
els.put(id, cell);
}
}
}
}
return els;
}

Expand All @@ -423,9 +456,9 @@ public static Component convertNeuroMLToComponent(Standalone nmlElement) throws
}
}

public static Cell getCellFromComponent(Component comp) throws LEMSException, NeuroMLException
public static Cell getCellFromComponent(Component comp, Lems lems) throws LEMSException, NeuroMLException
{
LinkedHashMap<String, Standalone> els = Utils.convertLemsComponentToNeuroML(comp);
LinkedHashMap<String, Standalone> els = Utils.convertLemsComponentToNeuroML(comp, true, lems);
Cell cell = (Cell) els.values().iterator().next();
if (cell == null)
{
Expand Down
Loading

0 comments on commit 528e08a

Please sign in to comment.