/*
* Copyright (c) 2005–2012 Goethe Center for Scientific Computing - Simulation and Modelling (G-CSC Frankfurt)
* Copyright (c) 2012-2015 Goethe Center for Scientific Computing - Computational Neuroscience (G-CSC Frankfurt)
*
* This file is part of NeuGen.
*
* NeuGen is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* as published by the Free Software Foundation.
*
* see: http://opensource.org/licenses/LGPL-3.0
* file://path/to/NeuGen/LICENSE
*
* NeuGen is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* This version of NeuGen includes copyright notice and attribution requirements.
* According to the LGPL this information must be displayed even if you modify
* the source code of NeuGen. The copyright statement/attribution may not be removed.
*
* Attribution Requirements:
*
* If you create derived work you must do the following regarding copyright
* notice and author attribution.
*
* Add an additional notice, stating that you modified NeuGen. In addition
* you must cite the publications listed below. A suitable notice might read
* "NeuGen source code modified by YourName 2012".
*
* Note, that these requirements are in full accordance with the LGPL v3
* (see 7. Additional Terms, b).
*
* Publications:
*
* S. Wolf, S. Grein, G. Queisser. NeuGen 2.0 -
* Employing NeuGen 2.0 to automatically generate realistic
* morphologies of hippocapal neurons and neural networks in 3D.
* Neuroinformatics, 2013, 11(2), pp. 137-148, doi: 10.1007/s12021-012-9170-1
*
*
* J. P. Eberhard, A. Wanner, G. Wittum. NeuGen -
* A tool for the generation of realistic morphology
* of cortical neurons and neural networks in 3D.
* Neurocomputing, 70(1-3), pp. 327-343, doi: 10.1016/j.neucom.2006.01.028
*
*/
/*
* File: NeuGenLib.java
* Created on 05.08.2009, 10:17:08
*
*/
package org.neugen.gui;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.neugen.parsers.ConfigParser;
import org.neugen.parsers.ConfigParserContainer;
import org.neugen.datastructures.neuron.NeuronCA1Pyramidal;
import org.neugen.datastructures.neuron.NeuronCalbindin;
import org.neugen.datastructures.neuron.NeuronCalretinin;
import org.neugen.datastructures.neuron.NeuronCholecystokinin;
import org.neugen.datastructures.NetHippocampus;
import org.neugen.datastructures.neuron.NeuronL23Pyramidal;
import org.neugen.datastructures.neuron.NeuronL4stellate;
import org.neugen.datastructures.neuron.NeuronL5APyramidal;
import org.neugen.datastructures.neuron.NeuronL5BPyramidal;
import org.neugen.datastructures.NetNeocortex;
import org.neugen.datastructures.Net;
import org.neugen.datastructures.Region;
import org.neugen.datastructures.neuron.NeuronParvalbumin;
import org.neugen.datastructures.neuron.NeuronPyramidal;
import org.neugen.datastructures.neuron.NeuronSomatostatin;
import org.neugen.datastructures.neuron.NeuronStarpyramidal;
import org.neugen.datastructures.xml.XMLObject;
import org.neugen.datastructures.parameter.NetParam;
import org.neugen.datastructures.parameter.NeuronParam;
/**
* @author Alexander Wanner
* @author Simone Eberhard
* @author Sergei Wolf
*/
public final class NeuGenLib implements Serializable {
static final long serialVersionUID = -8689337816399140143L;
/** use to log messages */
private static final Logger logger = Logger.getLogger(NeuGenLib.class.getName());
private Net net;
private final NeuGenView ngView;
private final NeuGenLibTask task;
public NeuGenLib() {
ngView = NeuGenView.getInstance();
task = NeuGenLibTask.getInstance();
}
public Net getNet() {
return net;
}
public void destroy() {
NeuGenLibTask.setInstance(null);
}
public static void clearOldParamData() {
NetParam.setInstance(null);
Region.setInstance(null);
Region.Param.setInstance(null);
NeuronParam.setInstance(null);
NeuronL4stellate.Param.setInstance(null);
NeuronPyramidal.PyramidalParam.setInstance(null);
NeuronStarpyramidal.Param.setInstance(null);
NeuronL23Pyramidal.Param.setInstance(null);
NeuronL5APyramidal.Param.setInstance(null);
NeuronL5BPyramidal.Param.setInstance(null);
NeuronCA1Pyramidal.Param.setInstance(null);
NeuronCalbindin.Param.setInstance(null);
NeuronCalretinin.Param.setInstance(null);
NeuronCholecystokinin.Param.setInstance(null);
NeuronParvalbumin.Param.setInstance(null);
NeuronSomatostatin.Param.setInstance(null);
if (ConfigParserContainer.getInternaParser() != null) {
ConfigParserContainer.getInternaParser().getResult().clear();
ConfigParserContainer.setInternaParser(null);
}
if (ConfigParserContainer.getParamParser() != null) {
ConfigParserContainer.getParamParser().getResult().clear();
ConfigParserContainer.setParamParser(null);
}
//Axon.setDrawNumber(null);
//Dendrite.setDrawNumber(null);
//NeuronBase.setDrawNumber(null);
//NetBase.setDrawNumber(null);
System.gc();
}
public static Map<String, XMLObject> initParamTable() {
String paramPath = NeuGenView.getParamPath();
String internaPath = NeuGenView.getInternaPath();
String outputPath = NeuGenView.getOutputOptionsPath();
XMLObject param = NeuGenView.getInstance().getParamTrees().get(NeuGenConstants.PARAM);
XMLObject interna = NeuGenView.getInstance().getParamTrees().get(NeuGenConstants.INTERNA);
XMLObject outputOptions = NeuGenView.getInstance().getParamTrees().get(NeuGenConstants.OUTPUT);
Map<String, XMLObject> allParam = new HashMap<String, XMLObject>();
allParam.put(paramPath, param);
allParam.put(internaPath, interna);
allParam.put(outputPath, outputOptions);
return allParam;
}
public static void initParamData(Map<String, XMLObject> allParam, String project) {
clearOldParamData();
for (Map.Entry<String, XMLObject> e : allParam.entrySet()) {
if (e.getKey().contains(NeuGenConstants.PARAM_FNAME)) {
ConfigParserContainer.setParamParser(new ConfigParser(e.getKey(), e.getValue()));
} else if (e.getKey().contains(NeuGenConstants.INTERNA_FNAME)) {
ConfigParserContainer.setInternaParser(new ConfigParser(e.getKey(), e.getValue()));
}
}
//NeuronParam.getInstance();
//Axon.setDrawNumber(new Vrand(nParam.getAxonParam().getSeedValue()));
//Dendrite.setDrawNumber(new Vrand(nParam.getDendriteParam().getSeedValue()));
//NeuronBase.setDrawNumber(new Vrand(nParam.getSeedValue()));
}
public void run(String projectType) {
if (task != null) {
task.setMyProgress(0.05f);
}
long timeStart = 0;
long timeEnd = 0;
float diffTime = 0.0f;
if (projectType.equals(NeuGenConstants.NEOCORTEX_PROJECT)) {
net = new NetNeocortex();
//generate neural net
timeStart = System.currentTimeMillis();
net.generate();
ngView.outPrintln("End generate net.");
timeEnd = System.currentTimeMillis();
diffTime = (float) (timeEnd - timeStart) / (1000f);
ngView.outPrintln("Time to generate net: " + diffTime + " seconds.\n");
runInterconnect(NetNeocortex.cellTypesNumber);
/*
//interconnect cells of neuronal net
timeStart = System.currentTimeMillis();
net.interconnect();
timeEnd = System.currentTimeMillis();
diffTime = (float) (timeEnd - timeStart) / (1000f);
ngView.outPrintln("Time to interconnect neurons: " + diffTime + " seconds.\n");
System.gc();
//create synapses
net.createNonFunSynapses();
System.gc();
String synMes = "\n";
synMes += " number of synapses: " + net.getNumSynapse() + "\n";
long nbilSyn = net.getNumSynapse() - net.getNumNonFunSynapses();
synMes += " number of bilateral synapses: " + nbilSyn + "\n";
synMes += " nonfunctional synapses: " + net.getNumNonFunSynapses() + "\n";
synMes += " connectivity of cell types: " + "\n";
for (int i = 0; i < NetNeocortex.cellTypesNumber; ++i) {
for (int j = 0; j < NetNeocortex.cellTypesNumber; j++) {
//logger.info(net.typeNames.get(i));
float val = ((float) net.getNumOfSynapses(i, j)) / nbilSyn;
if (val > 0) {
synMes += "\t" + net.getTypeCellNames().get(i) + "->" + net.getTypeCellNames().get(j) + " " + val + "\n";
//logger.info("i: " + i + ", type: " + net.typeNames.get(i));
//logger.info("j: " + j + ", type: " + net.typeNames.get(j));
}
}
}
ngView.outPrintln(synMes);
Map<String, Float> presynapticConv = net.computeAPSN();
logger.info("presynapticConv: " + presynapticConv.size());
String preSynMes = "\n";
preSynMes += "numbers of presynaptics converging on average postsynaptic cell: \n";
for (Map.Entry<String, Float> elem : presynapticConv.entrySet()) {
if (elem.getValue() > 0) {
preSynMes += "\t" + elem.getKey() + " " + elem.getValue() + "\n";
}
}
presynapticConv.clear();
ngView.outPrintln(preSynMes);
*
*/
/*
CSVWriter csvW = new CSVWriter(net, "outputData.csv");
csvW.writeAverageNeuronInfo();
ngView.outPrintln("write average neuron info to outputData.csv");
ngView.outPrintln("end");
*/
} else if (projectType.equals(NeuGenConstants.HIPPOCAMPUS_PROJECT)) {
net = new NetHippocampus();
//generate neural net
timeStart = System.currentTimeMillis();
net.generate();
ngView.outPrintln("End generate net.");
timeEnd = System.currentTimeMillis();
diffTime = (float) (timeEnd - timeStart) / (1000f);
ngView.outPrintln("Time to generate net: " + diffTime + " seconds.\n");
runInterconnect(NetHippocampus.cellTypesNumber);
}
ngView.setNet(net);
if (task != null) {
task.setMyProgress(1.0f);
}
//System.gc();
}
private void runInterconnect(int cellTypesNumber) {
long timeStart = 0;
long timeEnd = 0;
float diffTime = 0.0f;
//interconnect cells of neuronal net
timeStart = System.currentTimeMillis();
net.interconnect();
timeEnd = System.currentTimeMillis();
diffTime = (float) (timeEnd - timeStart) / (1000f);
ngView.outPrintln("Time to interconnect neurons: " + diffTime + " seconds.\n");
System.gc();
//create synapses
net.createNonFunSynapses();
System.gc();
String synMes = "\n";
synMes += " number of synapses: " + net.getNumSynapse() + "\n";
long nbilSyn = net.getNumSynapse() - net.getNumNonFunSynapses();
synMes += " number of bilateral synapses: " + nbilSyn + "\n";
synMes += " nonfunctional synapses: " + net.getNumNonFunSynapses() + "\n";
synMes += " connectivity of cell types: " + "\n";
for (int i = 0; i < cellTypesNumber; ++i) {
for (int j = 0; j < cellTypesNumber; j++) {
//logger.info(net.typeNames.get(i));
float val = ((float) net.getNumOfSynapses(i, j)) / nbilSyn;
if (val > 0) {
synMes += "\t" + net.getTypeCellNames().get(i) + "->" + net.getTypeCellNames().get(j) + " " + val + "\n";
//logger.info("i: " + i + ", type: " + net.typeNames.get(i));
//logger.info("j: " + j + ", type: " + net.typeNames.get(j));
}
}
}
ngView.outPrintln(synMes);
Map<String, Float> presynapticConv = net.computeAPSN();
logger.info("presynapticConv: " + presynapticConv.size());
String preSynMes = "\n";
preSynMes += "numbers of presynaptics converging on average postsynaptic cell: \n";
for (Map.Entry<String, Float> elem : presynapticConv.entrySet()) {
if (elem.getValue() > 0) {
preSynMes += "\t" + elem.getKey() + " " + elem.getValue() + "\n";
}
}
presynapticConv.clear();
ngView.outPrintln(preSynMes);
}
}