// Diameter distribution
objref diamDistrLeaves, diamDistrStalks
diamStep = 0
nanoDistrLoaded = 0 // Boolean
// Random
objref randomDiameters
randomDiameters = new Random()
// Shows window to select a .TXT file with diameter distribution.
proc loadDiamDistrFile() { local divisions localobj radiiFile, line, neuronLine, radiiDistrPointer
line = new String()
neuronLine = new String()
radiiFile = new File()
radiiFile.chooser("r", "Load", "*.txt", "Load", "Cancel", getcwd())
// File selected
if (radiiFile.chooser()) {
// This procedure is
// looking for "NEURON" word inside the data file that's located before distribution
// TO DO Add some action in case if file doesn't contain NEURON word
// or has wrong distribution structure
while (!radiiFile.eof() && strcmp(neuronLine.s, "NEURON") != 0) {
radiiFile.gets(line.s)
sscanf(line.s, "%[^\n]", neuronLine.s)
}
diamStep = radiiFile.scanvar()
for group = 1, 2 {
// Amount of non-non-zero-probability groups
divisions = radiiFile.scanvar()
print divisions
if (group == 1) {
diamDistrStalks = new Matrix(divisions, 2)
radiiDistrPointer = diamDistrStalks
} else {
diamDistrLeaves = new Matrix(divisions, 2)
radiiDistrPointer = diamDistrLeaves
}
// Leaves and stalks distribution
for row = 0, divisions-1 {
radiiDistrPointer.setval(row, 0, radiiFile.scanvar())
radiiDistrPointer.setval(row, 1, radiiFile.scanvar())
}
}
nanoDistrLoaded = 1
} else {
print "File selection canceled"
}
}
// Returns random diameter from the distribution matrix.
// $o1 - Diameter distribution matrix
// $2 - Diameter step
func getDiameterFromDistr() { local diameter, bottomProbability
diameter = $o1.getval(0, 0)
randomValue = randomDiameters.uniform(0, 1)
if (randomValue > 0) {
for row = 0, $o1.nrow-1 {
if (randomValue <= $o1.getval(row, 1)) {
if (row > 0) {
bottomProbability = $o1.getval(row-1, 1)
} else {
bottomProbability = 0
}
diameter = $o1.getval(row, 0)+$2*(randomValue-bottomProbability)/($o1.getval(row, 1)-bottomProbability)
break
}
}
}
return diameter
}