13 #include "../utility/Vec.h"
27 #include "../utility/numutil.h"
28 #include "../utility/strutil.h"
29 #include "../shell/Wildcard.h"
37 "Request SpineMesh to construct self based on list of electrical "
38 "compartments that this NeuroMesh has determined are spine shaft "
39 "and spine head respectively. Also passes in the info about where "
40 "each spine is connected to the NeuroMesh. "
41 "Arguments: shaft compartment Ids, head compartment Ids,"
42 "index of matching parent voxels for each spine"
51 vector< Id >, vector< unsigned int > >
54 "Tells PsdMesh to build a mesh. "
55 "Arguments: (Cell Id, Coordinates of each psd, "
56 "Id of electrical compartment mapped to each voxel, "
57 "index of matching parent voxels for each spine.) "
58 "The coordinates each have 8 entries:"
59 "xyz of centre of psd, xyz of vector perpendicular to psd, "
61 " diffusion distance from parent compartment to PSD"
73 "Set of compartments in which to embed chemical reaction "
74 "systems. If the compartments happen to be contiguous"
75 "then also set up diffusion between them. Can also"
76 "handle cases where the same cell is divided into multiple"
77 "non-diffusively-coupled compartments",
83 "Set of compartments to model, defined as a path string. "
84 "If they happen to be contiguous "
85 "then also set up diffusion between the compartments. Can also"
86 "handle cases where the same cell is divided into multiple"
87 "non-diffusively-coupled compartments",
93 "Flag: when separateSpines is true, the traversal separates "
94 "any compartment with the strings "
95 "'spine', 'head', 'shaft' or 'neck' in its name,"
96 "Allows to set up separate mesh for spines, based on the "
97 "same cell model. Requires for the spineListOut message to"
98 "be sent to the target SpineMesh object.",
104 "Number of cylindrical/spherical segments in model",
109 "Number of diffusive compartments in model",
114 "Vector of indices of parents of each voxel.",
119 "Vector of Ids of electrical compartments that map to each "
120 "voxel. This is necessary because the order of the IDs may "
121 "differ from the ordering of the voxels. Additionally, there "
122 "are typically many more voxels than there are electrical "
123 "compartments. So many voxels point to the same elecCompt.",
128 "Vector of Ids of all electrical compartments in this "
129 "NeuroMesh. Ordering is as per the tree structure built in "
130 "the NeuroMesh, and may differ from Id order. Ordering "
131 "matches that used for startVoxelInCompt and endVoxelInCompt",
136 "Index of first voxel that maps to each electrical "
137 "compartment. Each elecCompt has one or more voxels. "
138 "The voxels in a compartment are numbered sequentially.",
143 "Index of end voxel that maps to each electrical "
144 "compartment. In keeping with C and Python convention, this "
145 "is one more than the last voxel. "
146 "Each elecCompt has one or more voxels. "
147 "The voxels in a compartment are numbered sequentially.",
152 "spineVoxelOnDendVoxel",
153 "Voxel index of spine voxel on each dend voxel. Assume that "
154 "there is never more than one spine per dend voxel. If no "
155 "spine present, the entry is -1. Note that the "
156 "same index is used both for spine head and PSDs.",
161 vector< unsigned int > > dendVoxelsOnCompartment(
162 "dendVoxelsOnCompartment",
163 "Returns vector of all chem voxels on specified electrical "
164 "compartment of the dendrite. Returns empty vec if none "
165 "found, or if the compartment isn't on the dendrite.",
170 vector< unsigned int > > spineVoxelsOnCompartment(
171 "spineVoxelsOnCompartment",
172 "Returns vector of all chem voxels on specified electrical "
173 "compartment, which should be a spine head or shaft . "
174 "Returns empty vec if no chem voxels "
175 "found, or if the compartment isn't on the dendrite. "
176 "Note that spine and PSD voxel indices are the same for a "
183 "Diffusive length constant to use for subdivisions. "
185 "attempt to subdivide cell using diffusive compartments of"
186 "the specified diffusion lengths as a maximum."
187 "In order to get integral numbers"
188 "of compartments in each segment, it may subdivide more "
190 "Uses default of 0.5 microns, that is, half typical lambda."
191 "For default, consider a tau of about 1 second for most"
192 "reactions, and a diffusion const of about 1e-12 um^2/sec."
193 "This gives lambda of 1 micron",
200 "Policy for how to interpret electrical model geometry (which "
201 "is a branching 1-dimensional tree) in terms of 3-D constructs"
202 "like spheres, cylinders, and cones."
203 "There are three options, default, trousers, and cylinder:"
205 " - Use frustrums of cones. Distal diameter is always from compt dia."
206 " - For linear dendrites (no branching), proximal diameter is "
207 " diameter of the parent compartment"
208 " - For branching dendrites and dendrites emerging from soma,"
209 " proximal diameter is from compt dia. Don't worry about overlap."
210 " - Place somatic dendrites on surface of spherical soma, or at ends"
211 " of cylindrical soma"
212 " - Place dendritic spines on surface of cylindrical dendrites, not"
213 " emerging from their middle."
215 " - Use frustrums of cones. Distal diameter is always from compt dia."
216 " - For linear dendrites (no branching), proximal diameter is "
217 " diameter of the parent compartment"
218 " - For branching dendrites, use a trouser function. Avoid overlap."
219 " - For soma, use some variant of trousers. Here we must avoid overlap"
220 " - For spines, use a way to smoothly merge into parent dend. Radius of"
221 " curvature should be similar to that of the spine neck."
222 " - Place somatic dendrites on surface of spherical soma, or at ends"
223 " of cylindrical soma"
224 " - Place dendritic spines on surface of cylindrical dendrites, not"
225 " emerging from their middle."
227 " - Use cylinders. Diameter is just compartment dia."
228 " - Place somatic dendrites on surface of spherical soma, or at ends"
229 " of cylindrical soma"
230 " - Place dendritic spines on surface of cylindrical dendrites, not"
231 " emerging from their middle."
232 " - Ignore spatial overlap.",
245 static Finfo* neuroMeshFinfos[] =
257 &spineVoxelOnDendVoxel,
258 &dendVoxelsOnCompartment,
259 &spineVoxelsOnCompartment,
271 sizeof( neuroMeshFinfos ) /
sizeof (
Finfo* ),
290 subTreePath_(
"Undefined" ),
294 length_( 1, 1.0e-6 ),
295 diffLength_( 1.0e-6 ),
296 separateSpines_( false ),
297 geometryPolicy_(
"default" ),
298 surfaceGranularity_( 0.1 ),
303 nodes_[0].setNumDivs( 1 );
308 diffLength_( other.diffLength_ ),
309 separateSpines_( other.separateSpines_ ),
310 geometryPolicy_( other.geometryPolicy_ ),
311 surfaceGranularity_( other.surfaceGranularity_ )
345 unsigned int startFid = 0;
351 for ( vector< NeuroNode >::iterator i =
nodes_.begin();
354 if ( !i->isDummyNode() )
356 double len = i->getLength();
357 unsigned int numDivs = floor( 0.5 + len /
diffLength_ );
360 i->setNumDivs( numDivs );
361 i->setStartFid( startFid );
366 for (
unsigned int i = 0; i <
nodes_.size(); ++i )
368 if ( !
nodes_[i].isDummyNode() )
370 unsigned int end =
nodes_[i].startFid() +
nodes_[i].getNumDivs();
371 assert( end <= startFid );
372 assert(
nodes_[i].getNumDivs() > 0 );
373 for (
unsigned int j =
nodes_[i].startFid(); j < end; ++j )
378 vs_.resize( startFid );
379 area_.resize( startFid );
381 for (
unsigned int i = 0; i <
nodes_.size(); ++i )
388 for (
unsigned int j = 0; j < nn.
getNumDivs(); ++j )
416 for( string::iterator i = v.begin(); i != v.end(); ++i )
419 if ( !( v ==
"cylinder" || v ==
"trousers" || v ==
"default" ) )
421 cout <<
"Warning: NeuroMesh::setGeometryPolicy( " << v <<
422 " ):\n Mode must be one of cylinder, trousers, or default."
430 bool isCylinder = ( v ==
"cylinder" );
431 for ( vector< NeuroNode >::iterator
433 i->setIsCylinder( isCylinder );
448 const Finfo* finfo =
id.element()->cinfo()->findFinfo( msgName );
452 id.element()->getNeighbors( ret, finfo );
453 assert( ret.size() <= 1 );
454 if ( ret.size() == 1 )
461 if (
id.element()->cinfo()->isA(
"Compartment" ) )
463 if (
id.element()->cinfo()->isA(
"SymCompartment" ) )
471 if (
nodes_[maxDiaIndex].elecCompt() == soma )
475 else if ( soma ==
Id() )
477 soma =
nodes_[maxDiaIndex].elecCompt();
481 string name =
nodes_[ maxDiaIndex ].elecCompt().element()->getName();
485 soma =
nodes_[maxDiaIndex].elecCompt();
489 cout <<
"Warning: NeuroMesh::putSomaAtStart: named 'soma' compartment isn't biggest\n";
490 soma =
nodes_[maxDiaIndex].elecCompt();
494 if ( maxDiaIndex != 0 )
498 nodes_[maxDiaIndex] = temp;
504 unsigned int parent,
unsigned int self,
505 double x,
double y,
double z )
507 static const double EPSILON = 1e-8;
523 double length =
nodes_[
self].getLength();
524 dummy.
setX( x - length );
525 assert(
doubleEq(
nodes_[
self].calculateLength( dummy ), length) );
527 nodes_.push_back( dummy );
533 unsigned int num =
nodes_.size();
534 for (
unsigned int i = 0; i < num; ++i )
536 if (
nodes_[i].parent() == ~0U )
551 for (
unsigned int i = 0; i <
nodes_.size(); ++i )
553 vector< unsigned int > kids =
nodes_[i].children();
554 if ( (!
nodes_[i].isDummyNode()) && kids.size() > 1 )
556 for(
unsigned int j = 0; j < kids.size(); ++j )
558 double x =
nodes_[i].getX();
559 double y =
nodes_[i].getY();
560 double z =
nodes_[i].getZ();
563 kids[j] =
nodes_.size() - 1;
566 nodes_[i].clearChildren();
567 for(
unsigned int j = 0; j < kids.size(); ++j )
568 nodes_[i].addChild( kids[j] );
575 if ( compt.
element()->
getName().find(
"shaft" ) != string::npos ||
578 shaft_.push_back( compt );
581 if ( compt.
element()->
getName().find(
"spine" ) != string::npos ||
584 head_.push_back( compt );
595 vector< double > ret;
596 vector< double > psdCoords;
597 vector< unsigned int > index(
head_.size(), 0 );
601 for (
unsigned int i = 0; i <
head_.size(); ++i )
606 assert( ret.size() == 8 );
607 psdCoords.insert( psdCoords.end(), ret.begin(), ret.end() );
623 vector< unsigned int > pa =
parent_;
624 for (
unsigned int i = 0; i <
shaft_.size(); ++i )
631 unsigned int index = 0;
632 double r = nn.
nearest( x0, y0, z0, pn, index );
639 cout <<
"Warning: NeuroMesh::updateShaftParents: may be"
640 " misaligned on " << i <<
", r=" << r <<
641 "\n pt=(" << x0 <<
"," << y0 <<
"," << z0 <<
")" <<
642 "pa=(" << nn.
getX() <<
"," << nn.
getY() <<
"," << nn.
getZ() <<
")" <<
652 sort( compts.begin(), compts.end() );
667 subTreePath_ =
"Undefined: subTree set as a compartment list";
673 vector< ObjId > ret( temp.size() );
674 for (
unsigned int i = 0; i < ret.size(); ++i )
682 vector< ObjId > compts;
709 unsigned int ret = 0;
710 for ( vector< NeuroNode >::const_iterator i =
nodes_.begin();
712 ret += !i->isDummyNode();
729 for (
unsigned int i = 0; i <
nodeIndex_.size(); ++i )
741 for ( vector< NeuroNode >::const_iterator
744 if ( !i->isDummyNode() )
745 ret.push_back( i->elecCompt() );
752 vector< unsigned int > ret;
753 for ( vector< NeuroNode >::const_iterator
756 if ( !i->isDummyNode() )
757 ret.push_back( i->startFid() );
764 vector< unsigned int > ret;
765 for ( vector< NeuroNode >::const_iterator
768 if ( !i->isDummyNode() )
769 ret.push_back( i->startFid() + i->getNumDivs() );
777 for (
unsigned int i = 0; i <
parent_.size(); ++i )
779 assert(
parent_[i] < ret.size() );
787 vector< unsigned int > ret;
788 for ( vector< NeuroNode >::const_iterator
791 if ( !i->isDummyNode() && i->elecCompt() == compt.
id )
793 for (
unsigned int j = 0; j < i->getNumDivs(); ++j )
795 ret.push_back( j + i->startFid() );
804 vector< unsigned int > ret;
806 for (
unsigned int i = 0; i <
shaft_.size(); ++i )
821 static vector< double > midpoint;
822 unsigned int num =
vs_.size();
823 midpoint.resize( num * 3 );
824 vector< double >::iterator k = midpoint.begin();
825 for (
unsigned int i = 0; i <
nodes_.size(); ++i )
832 for (
unsigned int j = 0; j < nn.
getNumDivs(); ++j )
835 *k = ( coords[0] + coords[3] ) / 2.0;
836 *(k + num ) = ( coords[1] + coords[4] ) / 2.0;
837 *(k + 2 * num ) = ( coords[2] + coords[5] ) / 2.0;
858 for ( vector< double >::const_iterator i =
859 vs_.begin(); i !=
vs_.end(); ++i )
868 assert(
vs_.size() == 1 );
873 double scale = pow( volume / oldvol, 1.0/3.0 );
876 vs_[0] *= volume / oldvol;
877 area_[0] *= scale * scale;
913 assert( fid >= node.startFid() );
914 if ( node.parent() == ~0U )
915 return node.voxelVolume( node, fid - node.startFid() );
916 assert ( node.parent() <
nodes_.size() );
918 return node.voxelVolume( parent, fid - node.startFid() );
928 assert( fid >= node.startFid() );
929 assert ( node.parent() <
nodes_.size() );
932 return node.getCoordinates( parent, fid - node.startFid() );
941 assert( fid >= node.startFid() );
942 assert ( node.parent() <
nodes_.size() );
944 vector< double > ret;
946 for (
unsigned int i = 0; i < neighbors.size(); ++i )
948 ret.push_back( node.getDiffusionArea( parent, neighbors[ i ] ) );
966 return vector< double >( 2, 1.0 );
993 const SrcFinfo2<
unsigned int, vector< double > >* meshStatsFinfo
997 meshStatsFinfo->send( e, 1, ret );
1003 unsigned int numNodes,
unsigned int numThreads )
1042 static const unsigned int WayTooLarge = 1000000;
1043 if ( n == 0 || n > WayTooLarge )
1045 cout <<
"Warning: NeuroMesh::innerSetNumEntries( " << n <<
1046 " ): out of range\n";
1049 double totalLength = 0;
1050 for ( vector< NeuroNode >::iterator i =
nodes_.begin();
1053 if ( !i->isDummyNode() )
1055 if ( i->isSphere() )
1056 totalLength += i->getDia();
1058 totalLength += i->getLength();
1061 assert( totalLength > 0 );
1084 cout <<
"Warning: attempt to build a neuron of dendritic length " <<
1085 size <<
" metres.\n Seems improbable.\n" <<
1086 "Using default of 0.001 m\n";
1092 vector< unsigned int > noChildren( 0 );
1093 vector< unsigned int > oneChild( 1, 2 );
1097 CylBase cb( 0, 0, 0, size, 0, numEntries );
1098 NeuroNode soma( cb, 0, noChildren, 0,
Id(),
true );
1099 nodes_.resize( 1, soma );
1104 CylBase cb( 0, 0, 0, 20e-6, 0, 1 );
1106 nodes_.resize( 1, soma );
1109 CylBase cbDummy( 0, 0, 10e-6, 4e-6, 0, 0 );
1111 nodes_.push_back( dummy );
1113 CylBase cbDend( 0, 0, size, 2e-6, size - 10e-6, numEntries - 1);
1114 NeuroNode dend( cbDend, 1, noChildren, 2,
Id(),
false );
1115 nodes_.push_back( dend );
1116 for (
unsigned int i = 1; i <
numEntries; ++i )
1141 if ( pa->
parent() == ~0U )
1147 realParent = &
nodes_[ realParent->parent() ];
1148 if ( realParent->isDummyNode() )
1155 parentFid = realParent->
startFid() +
1158 assert( parentFid < nodeIndex_.size() );
1159 double length = 0.5 * (L1 + L2 );
1171 vector< vector< double > > paEntry(
nodeIndex_.size() );
1172 vector< vector< unsigned int > > paColIndex(
nodeIndex_.size() );
1175 for (
unsigned int i = 0; i <
nodeIndex_.size(); ++i )
1177 unsigned int parentFid;
1178 double adx =
getAdx( i, parentFid );
1208 paEntry[ i ].push_back( adx );
1209 paColIndex[ i ].push_back( parentFid );
1211 paEntry[ parentFid ].push_back( adx );
1212 paColIndex[ parentFid ].push_back( i );
1219 for (
unsigned int i = 0; i <
nodeIndex_.size(); ++i )
1221 unsigned int num = paColIndex[i].size();
1222 vector< Ecol > e( num );
1223 vector< double > entry( num );
1224 vector< unsigned int > colIndex( num );
1225 for (
unsigned int j = 0; j < num; ++j )
1227 e[j] =
Ecol( paEntry[i][j], paColIndex[i][j] );
1229 sort( e.begin(), e.end() );
1231 for (
unsigned int j = 0; j < num; ++j )
1234 colIndex[j] = e[j].col_;
1236 addRow( i, entry, colIndex );
1252 vector< VoxelJunction >& ret )
const
1280 cout <<
"Warning: NeuroMesh::matchMeshEntries: unknown class\n";
1284 double& x,
double& y,
double& z )
const
1300 unsigned int& index )
const
1304 for(
unsigned int i = 0; i <
nodes_.size(); ++i )
1313 double near = nn.
nearest( x, y, z, pa, linePos, r );
1314 if ( linePos >= 0 && linePos < 1.0 )
1330 vector< VoxelJunction >& ret )
const
1332 for(
unsigned int i = 0; i <
nodes_.size(); ++i )
1346 vector< VoxelJunction >& ret )
const
static const Cinfo * initCinfo()
int wildcardFind(const string &path, vector< ObjId > &ret)
vector< double > getDiffusionScaling(unsigned int fid) const
Virtual function to return scale factor for diffusion. 1 here.
const vector< double > & vGetVoxelVolume() const
Virtual func so that derived classes can pass voxel volume back.
vector< Id > head_
Id of shaft compartment.
double getMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry.
void setNumDivs(unsigned int v)
void setDiffLength(double v)
static void buildSpinyTree(vector< ObjId > &elist, vector< NeuroNode > &nodes, vector< Id > &shaftId, vector< Id > &headId, vector< unsigned int > &spineParent)
void innerResetStencil()
virtual func implemented here.
vector< int > getSpineVoxelOnDendVoxel() const
void setParent(unsigned int parent)
Element * element() const
Synonym for Id::operator()()
vector< unsigned int > getNeighbors(unsigned int fid) const
Looks up stencil to return vector of indices of coupled voxels.
void matchCubeMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
bool separateSpines_
Max permitted length constant for diffusion.
Id getParentFromMsg(Id id)
void addRow(unsigned int index, const vector< double > &entry, const vector< unsigned int > &colIndex)
static DestFinfo dummy("dummy","This Finfo is a dummy. If you are reading this you have used an invalid index", 0)
void indexToSpace(unsigned int index, double &x, double &y, double &z) const
Id tryParent(Id id, const string &msgName)
static void buildTree(vector< NeuroNode > &nodes, vector< ObjId > elist)
void setGeometryPolicy(string v)
int strncasecmp(const string &a, const string &b, size_t n)
Compares the two strings a and b for first n characters, ignoring the case of the characters...
double getDiffLength() const
double extendedMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry, including.
vector< unsigned int > getEndVoxelInCompt() const
vector< double > getCoordinates(unsigned int fid) const
Virtual function to return coords of mesh Entry.
unsigned int getMeshType(unsigned int fid) const
Virtual function to return MeshType of specified entry.
double voxelVolume(const CylBase &parent, unsigned int fid) const
vector< Id > getElecComptMap() const
unsigned int getMeshDimensions(unsigned int fid) const
Virtual function to return dimensions of specified entry.
unsigned int getNumDiffCompts() const
vector< unsigned int > getStartVoxelInCompt() const
unsigned int innerGetDimensions() const
double getDiffusionArea(const CylBase &parent, unsigned int index) const
Element * element() const
unsigned int startFid() const
double volume(const CylBase &parent) const
Returns vol of current node. Usually needs to refer to parent.
const vector< double > & getVoxelArea() const
vector< unsigned int > getSpineVoxelsOnCompartment(ObjId compt) const
vector< double > getDiffusionArea(unsigned int fid) const
Virtual function to return diffusion X-section area.
vector< double > getCoordinates(const CylBase &parent, unsigned int entry) const
double nearest(double x, double y, double z, const CylBase &parent, double &linePos, double &r) const
void transmitSpineInfo(const Eref &e)
vector< unsigned int > getDendVoxelsOnCompartment(ObjId compt) const
vector< Id > getElecComptList() const
string getSubTreePath(const Eref &e) const
vector< ObjId > getSubTree(const Eref &e) const
const vector< double > & getVoxelLength() const
bool doubleEq(double x, double y)
const vector< double > & vGetVoxelMidpoint() const
Virtual func so that derived classes can return voxel midpoint.
bool hasMsgs(BindIndex b) const
void innerHandleNodeInfo(const Eref &e, unsigned int numNodes, unsigned int numThreads)
vector< double > psdCoords() const
NeuroMesh & operator=(const NeuroMesh &other)
vector< unsigned int > getParentVoxel() const
void setSeparateSpines(bool v)
void matchCubeMeshEntries(const ChemCompt *other, const CylBase &parent, unsigned int startIndex, double granularity, vector< VoxelJunction > &ret, bool useCylinderCurve, bool useCylinderCap) const
vector< double > length_
Pre-calculation of length of each MeshEntry.
static SrcFinfo3< vector< Id >, vector< Id >, vector< unsigned int > > * spineListOut()
double getMiddleArea(const CylBase &parent, unsigned int index) const
Return cross-section area of middle of specified voxel.
void innerHandleRequestMeshStats(const Eref &e, const SrcFinfo2< unsigned int, vector< double > > *meshStatsFinfo)
bool vSetVolumeNotRates(double volume)
void insertSingleDummy(unsigned int parent, unsigned int self, double x, double y, double z)
double extendedMeshEntryVolume(unsigned int fid) const
Vol of all mesh Entries including abutting diff-coupled voxels.
static const Cinfo * neuroMeshCinfo
void updateShaftParents()
void setIsCylinder(bool v)
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
unsigned int getNumSegments() const
void innerBuildDefaultMesh(const Eref &e, double size, unsigned int numEntries)
Virtual func to make a mesh with specified size and numEntries.
static unsigned int numNodes
void setSubTree(const Eref &e, vector< ObjId > compartments)
void matchNeuroMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
vector< unsigned int > parentVoxel_
Index of parent voxel of spines.
const vector< NeuroNode > & getNodes() const
double vGetEntireVolume() const
unsigned int parent() const
vector< unsigned int > parent_
Id of head compartment.
unsigned int innerGetNumEntries() const
double nearest(double x, double y, double z, unsigned int &index) const
void setSubTreePath(const Eref &e, string path)
double surfaceGranularity_
static A get(const ObjId &dest, const string &field)
void setStencilSize(unsigned int numRows, unsigned int numCols)
unsigned int getNumDivs() const
Id putSomaAtStart(Id origSoma, unsigned int maxDiaIndex)
This shuffles the nodes_ vector to put soma node at the start.
void flipRet(vector< VoxelJunction > &ret) const
Utility function for swapping first and second in VoxelJunctions.
void buildStencil()
Utility function to set up Stencil for diffusion in NeuroMesh.
void matchNeuroMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
static const Cinfo * initCinfo()
const string & getName() const
string getGeometryPolicy() const
static SrcFinfo3< vector< double >, vector< Id >, vector< unsigned int > > * psdListOut()
double getVoxelLength() const
Return length of voxel. All are equal.
bool filterSpines(Id compt)
vector< NeuroNode > nodes_
void innerSetNumEntries(unsigned int n)
Inherited virtual func.
double getAdx(unsigned int curr, unsigned int &parentFid) const
bool getSeparateSpines() const
vector< unsigned int > nodeIndex_
Vec pointOnLine(const Vec &end, double k)
void addChild(unsigned int child)