Blue Brain BioExplorer
Astrocytes.cpp
Go to the documentation of this file.
1 /*
2  *
3  * The Blue Brain BioExplorer is a tool for scientists to extract and analyse
4  * scientific data from visualization
5  *
6  * This file is part of Blue Brain BioExplorer <https://github.com/BlueBrain/BioExplorer>
7  *
8  * Copyright 2020-2024 Blue BrainProject / EPFL
9  *
10  * This program is free software: you can redistribute it and/or modify it under
11  * the terms of the GNU General Public License as published by the Free Software
12  * Foundation, either version 3 of the License, or (at your option) any later
13  * version.
14  *
15  * This program is distributed in the hope that it will be useful, but WITHOUT
16  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License along with
21  * this program. If not, see <https://www.gnu.org/licenses/>.
22  */
23 
24 #include "Astrocytes.h"
25 
26 #include <science/common/Logs.h>
28 #include <science/common/Utils.h>
29 
31 
33 
38 
39 #include <omp.h>
40 
41 using namespace core;
42 
43 namespace bioexplorer
44 {
45 using namespace common;
46 using namespace details;
47 using namespace io;
48 using namespace db;
49 using namespace meshing;
50 namespace morphology
51 {
52 const double DEFAULT_MITOCHONDRIA_DENSITY = 0.0459;
53 const double DEFAULT_ENDFOOT_RADIUS_RATIO = 1.1;
55 
56 Astrocytes::Astrocytes(Scene& scene, const AstrocytesDetails& details, const Vector3d& assemblyPosition,
57  const Quaterniond& assemblyRotation, const core::LoaderProgress& callback)
58  : Morphologies(details.alignToGrid, assemblyPosition, assemblyRotation, doublesToVector3d(details.scale))
59  , _details(details)
60  , _scene(scene)
61 {
63  Timer chrono;
64  _buildModel(callback);
65  PLUGIN_TIMER(chrono.elapsed(), "Astrocytes loaded");
66 }
67 
68 double Astrocytes::_getDisplacementValue(const DisplacementElement& element)
69 {
70  const auto params = _details.displacementParams;
71  switch (element)
72  {
93  default:
94  PLUGIN_THROW("Invalid displacement element");
95  }
96 }
97 
98 void Astrocytes::_logRealismParams()
99 {
100  PLUGIN_INFO(1, "----------------------------------------------------");
101  PLUGIN_INFO(1, "Realism level (" << static_cast<uint32_t>(_details.realismLevel) << ")");
102  PLUGIN_INFO(1, "- Soma : " << boolAsString(andCheck(static_cast<uint32_t>(_details.realismLevel),
103  static_cast<uint32_t>(MorphologyRealismLevel::soma))));
104  PLUGIN_INFO(1, "- Dendrite : " << boolAsString(andCheck(static_cast<uint32_t>(_details.realismLevel),
105  static_cast<uint32_t>(MorphologyRealismLevel::dendrite))));
106  PLUGIN_INFO(1, "- Internals: " << boolAsString(andCheck(static_cast<uint32_t>(_details.realismLevel),
107  static_cast<uint32_t>(MorphologyRealismLevel::internals))));
108  PLUGIN_INFO(1, "----------------------------------------------------");
109 }
110 
111 void Astrocytes::_buildModel(const LoaderProgress& callback, const doubles& radii)
112 {
113  const auto animationParams = doublesToMolecularSystemAnimationDetails(_details.animationParams);
114  srand(animationParams.seed);
115 
116  if (_modelDescriptor)
117  _scene.removeModel(_modelDescriptor->getModelID());
118 
119  auto& connector = DBConnector::getInstance();
120 
121  auto model = _scene.createModel();
122  const auto realismLevel = _details.realismLevel;
123  const auto somas = connector.getAstrocytes(_details.populationName, _details.sqlFilter);
124  const auto loadEndFeet = !_details.vasculaturePopulationName.empty();
125  const auto loadMicroDomains = _details.loadMicroDomains;
126 
127  // Micro domain mesh per thread
128  std::map<size_t, std::map<size_t, TriangleMesh>> microDomainMeshes;
129 
130  PLUGIN_INFO(1, "Building " << somas.size() << " astrocytes");
131  _logRealismParams();
132 
133  // Astrocytes
134  size_t baseMaterialId = 0;
135  const uint64_t userData = 0;
136 
137  ThreadSafeContainers containers;
138  const auto nbDBConnections = DBConnector::getInstance().getNbConnections();
139  uint64_t index;
140  volatile bool flag = false;
141  std::string flagMessage;
142 #pragma omp parallel for shared(flag, flagMessage) num_threads(nbDBConnections)
143  for (index = 0; index < somas.size(); ++index)
144  {
145  try
146  {
147  if (flag)
148  continue;
149 
150  if (omp_get_thread_num() == 0)
151  {
152  PLUGIN_PROGRESS("Loading astrocytes...", index, somas.size() / nbDBConnections);
153  callback.updateProgress("Loading astrocytes...",
154  0.5f * ((float)index / ((float)(somas.size() / nbDBConnections))));
155  }
156 
157  auto it = somas.begin();
158  std::advance(it, index);
159  const auto& soma = it->second;
160  const auto somaId = it->first;
161 
162  ThreadSafeContainer container(*model, _alignToGrid, _position, _rotation, _scale);
163 
164  // Load data from DB
165  double somaRadius = 0.0;
166  SectionMap sections;
167  if (_details.loadSomas || _details.loadDendrites)
168  sections = connector.getAstrocyteSections(_details.populationName, somaId, !_details.loadDendrites);
169 
170  // End feet
171  EndFootMap endFeet;
172  if (loadEndFeet)
173  endFeet = connector.getAstrocyteEndFeet(_details.vasculaturePopulationName, somaId);
174 
175  // Soma radius
176  uint64_t count = 1;
177  for (const auto& section : sections)
178  if (section.second.parentId == SOMA_AS_PARENT)
179  {
180  const auto& point = section.second.points[0];
181  somaRadius += 0.75 * length(Vector3d(point));
182  ++count;
183  }
184  somaRadius = _getCorrectedRadius(somaRadius, _details.radiusMultiplier) / count;
185  const auto somaPosition = _animatedPosition(Vector4d(soma.center, somaRadius), somaId);
186 
187  // Color scheme
188  switch (_details.populationColorScheme)
189  {
191  baseMaterialId = somaId * NB_MATERIALS_PER_MORPHOLOGY;
192  break;
193  default:
194  baseMaterialId = 0;
195  }
196 
197  const auto somaMaterialId =
198  baseMaterialId +
200 
201  uint64_t somaGeometryIndex = 0;
202  if (_details.loadSomas)
203  {
204  const bool useSdf = andCheck(static_cast<uint32_t>(_details.realismLevel),
205  static_cast<uint32_t>(MorphologyRealismLevel::soma));
206  somaGeometryIndex = container.addSphere(
207  somaPosition, somaRadius, somaMaterialId, useSdf, NO_USER_DATA, {},
208  Vector3f(somaRadius * _getDisplacementValue(DisplacementElement::morphology_soma_strength),
209  somaRadius * _getDisplacementValue(DisplacementElement::morphology_soma_frequency), 0.f));
210  if (_details.generateInternals)
211  {
212  const auto useSdf = andCheck(static_cast<uint32_t>(_details.realismLevel),
213  static_cast<uint32_t>(MorphologyRealismLevel::internals));
214  _addSomaInternals(container, baseMaterialId, somaPosition, somaRadius, DEFAULT_MITOCHONDRIA_DENSITY,
215  useSdf, _details.radiusMultiplier);
216  }
217  }
218 
219  Neighbours neighbours;
220  neighbours.insert(somaGeometryIndex);
221  for (const auto& section : sections)
222  {
223  uint64_t geometryIndex = 0;
224  const auto& points = section.second.points;
225 
226  size_t sectionMaterialId = baseMaterialId;
227  const auto sectionId = section.first;
228  switch (_details.morphologyColorScheme)
229  {
231  sectionMaterialId = baseMaterialId + section.second.type;
232  break;
234  {
235  sectionMaterialId =
236  getMaterialIdFromOrientation(Vector3d(points[points.size() - 1]) - Vector3d(points[0]));
237  break;
238  }
239  default:
240  break;
241  }
242  size_t step = 1;
243  switch (_details.morphologyRepresentation)
244  {
246  step = points.size() - 2;
247  break;
248  default:
249  break;
250  }
251 
252  if (_details.loadDendrites)
253  {
254  const bool useSdf = andCheck(static_cast<uint32_t>(_details.realismLevel),
255  static_cast<uint32_t>(MorphologyRealismLevel::dendrite));
256  uint64_t geometryIndex = 0;
257  if (section.second.parentId == SOMA_AS_PARENT)
258  {
259  // Section connected to the soma
260  const auto& point = points[0];
261  const float srcRadius = _getCorrectedRadius(somaRadius * 0.75f, _details.radiusMultiplier);
262  const float dstRadius = _getCorrectedRadius(point.w * 0.5f, _details.radiusMultiplier);
263  const auto dstPosition =
264  _animatedPosition(Vector4d(somaPosition + Vector3d(point), dstRadius), somaId);
265  geometryIndex = container.addCone(
266  somaPosition, srcRadius, dstPosition, dstRadius, somaMaterialId, useSdf, userData,
267  neighbours,
268  Vector3f(srcRadius * _getDisplacementValue(DisplacementElement::morphology_soma_strength),
269  srcRadius * _getDisplacementValue(DisplacementElement::morphology_soma_frequency),
270  0.f));
271  neighbours.insert(geometryIndex);
272  }
273 
274  // If maxDistanceToSoma != 0, then compute actual distance from
275  // soma
276  double distanceToSoma = 0.0;
277  if (_details.maxDistanceToSoma > 0.0)
278  distanceToSoma = _getDistanceToSoma(sections, section.second);
279  if (distanceToSoma > _details.maxDistanceToSoma)
280  continue;
281 
282  // Process section points according to representation
283  const auto localPoints = _getProcessedSectionPoints(_details.morphologyRepresentation, points);
284 
285  double sectionLength = 0.0;
286  for (uint64_t i = 0; i < localPoints.size() - 1; i += step)
287  {
288  const auto srcPoint = localPoints[i];
289  const float srcRadius = _getCorrectedRadius(srcPoint.w * 0.5, _details.radiusMultiplier);
290  const auto src =
291  _animatedPosition(Vector4d(somaPosition + Vector3d(srcPoint), srcRadius), somaId);
292 
293  // Ignore points that are too close the previous one
294  // (according to respective radii)
295  Vector4f dstPoint;
296  float dstRadius;
297  do
298  {
299  dstPoint = localPoints[i + step];
300  dstRadius = _getCorrectedRadius(dstPoint.w * 0.5, _details.radiusMultiplier);
301  ++i;
302  } while (length(Vector3f(dstPoint) - Vector3f(srcPoint)) < (srcRadius + dstRadius) &&
303  (i + step) < localPoints.size() - 1);
304  --i;
305 
306  // Distance to soma
307  sectionLength += length(dstPoint - srcPoint);
308  _maxDistanceToSoma = std::max(_maxDistanceToSoma, distanceToSoma + sectionLength);
309 
310  const size_t materialId =
312  ? _getMaterialFromDistanceToSoma(_details.maxDistanceToSoma, distanceToSoma)
313 
314  : sectionMaterialId;
315 
316  const auto dst =
317  _animatedPosition(Vector4d(somaPosition + Vector3d(dstPoint), dstRadius), somaId);
318  if (!useSdf)
319  geometryIndex = container.addSphere(dst, dstRadius, materialId, useSdf, NO_USER_DATA);
320 
321  geometryIndex = container.addCone(
322  src, srcRadius, dst, dstRadius, materialId, useSdf, userData, {geometryIndex},
323  Vector3f(srcRadius *
325  _getDisplacementValue(DisplacementElement::morphology_section_frequency), 0.f));
326 
327  _bounds.merge(srcPoint);
328 
329  if (_details.maxDistanceToSoma > 0.0 &&
330  distanceToSoma + sectionLength >= _details.maxDistanceToSoma)
331  break;
332  }
333  }
334  }
335 
336  if (loadEndFeet)
337  _addEndFoot(container, soma.center, endFeet, radii, baseMaterialId);
338 
339  if (loadMicroDomains)
340  {
341  const auto materialId = (_details.morphologyColorScheme == MorphologyColorScheme::section_type)
342  ? baseMaterialId + MATERIAL_OFFSET_MICRO_DOMAIN
343  : baseMaterialId;
344 
345  switch (_details.microDomainRepresentation)
346  {
348  {
349  _buildMicroDomain(container, somaId, materialId);
350  break;
351  }
352  default:
353  {
354  auto& mesh = microDomainMeshes[index][materialId];
355  _addMicroDomain(mesh, somaId);
356  break;
357  }
358  }
359  }
360 #pragma omp critical
361  containers.push_back(container);
362  }
363  catch (const std::runtime_error& e)
364  {
365 #pragma omp critical
366  flagMessage = e.what();
367 #pragma omp critical
368  flag = true;
369  }
370  catch (...)
371  {
372 #pragma omp critical
373  flagMessage = "Loading was canceled";
374 #pragma omp critical
375  flag = true;
376  }
377  }
378 
379  if (flag)
380  PLUGIN_THROW(flagMessage);
381 
382  for (uint64_t i = 0; i < containers.size(); ++i)
383  {
384  PLUGIN_PROGRESS("- Compiling 3D geometry...", i, containers.size());
385  callback.updateProgress("Compiling 3D geometry...", 0.5f + 0.5f * (float)(1 + i) / (float)containers.size());
386  auto& container = containers[i];
388  for (const auto& mesh : microDomainMeshes[i])
389  container.addMesh(mesh.first, mesh.second);
390  container.commitToModel();
391  }
392  model->applyDefaultColormap();
393 
394  const ModelMetadata metadata = {{"Number of astrocytes", std::to_string(somas.size())},
395  {"SQL filter", _details.sqlFilter},
396  {"Max distance to soma", std::to_string(_maxDistanceToSoma)}};
397 
398  _modelDescriptor.reset(new core::ModelDescriptor(std::move(model), _details.assemblyName, metadata));
399  if (!_modelDescriptor)
400  PLUGIN_THROW("Astrocytes model could not be created");
401 }
402 
403 void Astrocytes::_addEndFoot(ThreadSafeContainer& container, const Vector3d& somaCenter, const EndFootMap& endFeet,
404  const doubles& radii, const size_t baseMaterialId)
405 {
406  const Vector3d displacement{_getDisplacementValue(DisplacementElement::vasculature_segment_strength),
407  _getDisplacementValue(DisplacementElement::vasculature_segment_frequency), 0.0};
408  const auto useSdf =
409  andCheck(static_cast<uint32_t>(_details.realismLevel), static_cast<uint32_t>(MorphologyRealismLevel::end_foot));
410 
411  const auto materialId = (_details.morphologyColorScheme == MorphologyColorScheme::section_type)
412  ? baseMaterialId + MATERIAL_OFFSET_END_FOOT
413  : baseMaterialId;
414 
415  for (const auto& endFoot : endFeet)
416  {
417  for (const auto& node : endFoot.second.nodes)
418  {
419  const auto& connector = DBConnector::getInstance();
420  const auto vasculatureNodes =
421  connector.getVasculatureNodes(_details.vasculaturePopulationName,
422  "section_guid=" + std::to_string(endFoot.second.vasculatureSectionId));
423 
424  uint64_t startIndex = 0;
425  uint64_t endIndex = 1;
426  const auto halfLength = endFoot.second.length / 2.0;
427  auto it = vasculatureNodes.begin();
428  std::advance(it, endFoot.second.vasculatureSegmentId);
429  const auto centerPosition = it->second.position;
430 
431  double length = 0.0;
432  int64_t i = -1;
433  // Find start segment making the assumption that the segment Id
434  // is in the middle of the end-foot
435  while (length < halfLength && endFoot.second.vasculatureSegmentId + i >= 0)
436  {
437  const int64_t segmentId = endFoot.second.vasculatureSegmentId + i;
438  if (segmentId < 0)
439  break;
440  auto it = vasculatureNodes.begin();
441  std::advance(it, segmentId);
442  length = glm::length(centerPosition - it->second.position);
443  startIndex = segmentId;
444  --i;
445  }
446 
447  length = 0.0;
448  i = 1;
449  // Now find the end segment
450  while (length < halfLength && endFoot.second.vasculatureSegmentId + i < vasculatureNodes.size())
451  {
452  const int64_t segmentId = endFoot.second.vasculatureSegmentId + i;
453  auto it = vasculatureNodes.begin();
454  std::advance(it, segmentId);
455  length = glm::length(centerPosition - it->second.position);
456  endIndex = segmentId;
457  ++i;
458  }
459 
460  // Build the segment using spheres and cones
461  uint64_t geometryIndex = 0;
462  uint64_t endFootSegmentIndex = 0;
463  Neighbours neighbours;
464  for (uint64_t i = startIndex; i < endIndex - 1; ++i)
465  {
466  auto it = vasculatureNodes.begin();
467  std::advance(it, i);
468  const auto& srcNode = it->second;
469  const auto srcUserData = it->first;
470  const auto srcVasculatureRadius =
471  _getCorrectedRadius((srcUserData < radii.size() ? radii[srcUserData] : srcNode.radius),
472  _details.radiusMultiplier);
473  const float srcEndFootRadius = DEFAULT_ENDFOOT_RADIUS_RATIO * srcVasculatureRadius;
474 
475  ++it;
476  const auto& dstNode = it->second;
477  const auto dstUserData = it->first;
478  const auto dstVasculatureRadius =
479  _getCorrectedRadius((dstUserData < radii.size() ? radii[dstUserData] : dstNode.radius),
480  _details.radiusMultiplier);
481  const float dstEndFootRadius = DEFAULT_ENDFOOT_RADIUS_RATIO * dstVasculatureRadius;
482 
483  // Shift position in direction of astrocyte soma, so that
484  // only half of the end-feet appears outside of the
485  // vasculature
486  const Vector3d& shift = normalize(srcNode.position - somaCenter) * srcVasculatureRadius *
487  DEFAULT_ENDFOOT_RADIUS_SHIFTING_RATIO * (1.0 + rnd2(endFootSegmentIndex));
488 
489  const auto srcPosition = _animatedPosition(Vector4d(srcNode.position - shift, srcVasculatureRadius));
490  const auto dstPosition = _animatedPosition(Vector4d(dstNode.position - shift, dstVasculatureRadius));
491 
492  if (!useSdf)
493  container.addSphere(srcPosition, srcEndFootRadius, materialId, useSdf, srcUserData);
494  geometryIndex = container.addCone(srcPosition, srcEndFootRadius, dstPosition, dstEndFootRadius,
495  materialId, useSdf, srcUserData, neighbours, displacement);
496  neighbours = {geometryIndex};
497  ++endFootSegmentIndex;
498  }
499  }
500  }
501 }
502 
503 void Astrocytes::_addMicroDomain(TriangleMesh& dstMesh, const uint64_t astrocyteId)
504 {
505  auto& connector = DBConnector::getInstance();
506  const auto srcMesh = connector.getAstrocyteMicroDomain(_details.populationName, astrocyteId);
507  auto vertexOffset = dstMesh.vertices.size();
508  dstMesh.vertices.insert(dstMesh.vertices.end(), srcMesh.vertices.begin(), srcMesh.vertices.end());
509 
510  auto indexOffset = dstMesh.indices.size();
511  dstMesh.indices.insert(dstMesh.indices.end(), srcMesh.indices.begin(), srcMesh.indices.end());
512  for (uint64_t i = 0; i < srcMesh.indices.size(); ++i)
513  dstMesh.indices[indexOffset + i] += vertexOffset;
514  dstMesh.normals.insert(dstMesh.normals.end(), srcMesh.normals.begin(), srcMesh.normals.end());
515  dstMesh.colors.insert(dstMesh.colors.end(), srcMesh.colors.begin(), srcMesh.colors.end());
516 }
517 
518 void Astrocytes::_buildMicroDomain(ThreadSafeContainer& container, const uint64_t astrocyteId, const size_t materialId)
519 {
520  auto& connector = DBConnector::getInstance();
521  const auto mesh = connector.getAstrocyteMicroDomain(_details.populationName, astrocyteId);
522 
523  PointCloud cloud;
524  for (const auto& v : mesh.vertices)
525  cloud[materialId].push_back(Vector4d(v.x, v.y, v.z, 0.5));
526 
527  PointCloudMesher pcm;
528  if (!pcm.toConvexHull(container, cloud))
529  PLUGIN_THROW("Failed to generate convex hull from micro domain information");
530 }
531 
533 {
534  auto& connector = DBConnector::getInstance();
535  const auto simulationReport = connector.getSimulationReport(details.populationName, details.simulationReportId);
536 
537  const size_t nbFrames = (simulationReport.endTime - simulationReport.startTime) / simulationReport.timeStep;
538  if (nbFrames == 0)
539  PLUGIN_THROW("Report does not contain any simulation data: " + simulationReport.description);
540 
541  if (details.frame >= nbFrames)
542  PLUGIN_THROW("Invalid frame specified for report: " + simulationReport.description);
543  const floats radii =
544  connector.getVasculatureSimulationTimeSeries(details.populationName, details.simulationReportId, details.frame);
545  doubles series;
546  for (const double radius : radii)
547  series.push_back(details.amplitude * radius);
548  _buildModel(LoaderProgress(), series);
549 }
550 
551 } // namespace morphology
552 } // namespace bioexplorer
core::Boxd _bounds
Definition: Node.h:68
core::Vector3d _scale
Definition: Node.h:70
core::ModelDescriptorPtr _modelDescriptor
Definition: Node.h:67
double _getCorrectedRadius(const double radius, const double radiusMultiplier) const
details::CellAnimationDetails _animationDetails
Definition: SDFGeometries.h:73
core::Vector3d _animatedPosition(const core::Vector4d &position, const uint64_t index=0) const
core::Vector4fs _getProcessedSectionPoints(const morphology::MorphologyRepresentation &representation, const core::Vector4fs &points)
static DBConnector & getInstance()
Get the Instance object.
Definition: DBConnector.h:54
size_t getNbConnections() const
Get the number of connections to the database.
Definition: DBConnector.h:74
void setVasculatureRadiusReport(const details::VasculatureRadiusReportDetails &details)
Apply a vasculature radius report to the astrocyte. This modifies the end-feet of the astrocytes acco...
Definition: Astrocytes.cpp:532
void _addSomaInternals(common::ThreadSafeContainer &container, const size_t materialId, const core::Vector3d &somaPosition, const double somaRadius, const double mitochondriaDensity, const bool useSdf, const double radiusMultiplier)
size_t _getMaterialFromDistanceToSoma(const double maxDistanceToSoma, const double distanceToSoma) const
double _getDistanceToSoma(const SectionMap &sections, const Section &section)
void merge(const Box< T > &aabb)
Definition: MathTypes.h:64
void updateProgress(const std::string &message, const float fraction) const
Definition: Loader.h:58
The ModelDescriptor struct defines the metadata attached to a model.Model descriptor are exposed via ...
Definition: Model.h:285
Scene object This object contains collections of geometries, materials and light sources that are use...
Definition: Scene.h:43
virtual PLATFORM_API ModelPtr createModel() const =0
Factory method to create an engine-specific model.
PLATFORM_API bool removeModel(const size_t id)
Removes a model from the scene.
Definition: Scene.cpp:147
double elapsed() const
Definition: Timer.cpp:39
double valueFromDoubles(const doubles &array, const size_t index, const double defaultValue)
Returns the value of an array of double at a given index. Default value if index is out of bounds.
Definition: Utils.cpp:610
std::set< size_t > Neighbours
Definition: Types.h:81
size_t getMaterialIdFromOrientation(const Vector3d &orientation)
Definition: Utils.cpp:546
std::vector< ThreadSafeContainer > ThreadSafeContainers
Definition: Types.h:116
double rnd2(const uint64_t index)
Return a predefined random double between -0.5 and 0.5.
Definition: Utils.cpp:563
std::string boolAsString(const bool value)
Return a Yes/No string representation of a boolean.
Definition: Utils.cpp:605
Vector3d doublesToVector3d(const doubles &value)
Converts a vector of doubles into a 3D vector.
Definition: Utils.cpp:258
bool andCheck(const uint32_t value, const uint32_t test)
Check is test is part of value using the AND operator.
Definition: Utils.cpp:600
MolecularSystemAnimationDetails doublesToMolecularSystemAnimationDetails(const doubles &values)
Converts a vector of doubles into molecular system animation details.
Definition: Utils.cpp:303
CellAnimationDetails doublesToCellAnimationDetails(const doubles &values)
Converts a vector of doubles into cell animation details.
Definition: Utils.cpp:315
std::map< size_t, Vector4ds > PointCloud
const double DEFAULT_MITOCHONDRIA_DENSITY
Definition: Astrocytes.cpp:52
const size_t MATERIAL_OFFSET_MICRO_DOMAIN
Definition: Morphologies.h:46
std::map< uint64_t, EndFoot > EndFootMap
Definition: Types.h:396
const double DEFAULT_ENDFOOT_RADIUS_RATIO
Definition: Astrocytes.cpp:53
const size_t MATERIAL_OFFSET_END_FOOT
Definition: Morphologies.h:45
const double DEFAULT_ENDFOOT_RADIUS_SHIFTING_RATIO
Definition: Astrocytes.cpp:54
const size_t NB_MATERIALS_PER_MORPHOLOGY
Definition: Morphologies.h:34
const size_t MATERIAL_OFFSET_SOMA
Definition: Morphologies.h:36
const int64_t SOMA_AS_PARENT
Definition: Morphologies.h:48
std::map< uint64_t, Section > SectionMap
Definition: Types.h:386
const double DEFAULT_MORPHOLOGY_SECTION_STRENGTH
Definition: Displacement.h:51
const double DEFAULT_MORPHOLOGY_MITOCHONDRION_STRENGTH
Definition: Displacement.h:55
const double DEFAULT_MORPHOLOGY_SOMA_STRENGTH
Definition: Displacement.h:49
const double DEFAULT_MORPHOLOGY_SECTION_FREQUENCY
Definition: Displacement.h:52
const double DEFAULT_MORPHOLOGY_MITOCHONDRION_FREQUENCY
Definition: Displacement.h:56
const double DEFAULT_MORPHOLOGY_SOMA_FREQUENCY
Definition: Displacement.h:50
const double DEFAULT_MORPHOLOGY_NUCLEUS_STRENGTH
Definition: Displacement.h:53
const double DEFAULT_VASCULATURE_SEGMENT_STRENGTH
Definition: Displacement.h:46
const double DEFAULT_MORPHOLOGY_NUCLEUS_FREQUENCY
Definition: Displacement.h:54
const double DEFAULT_VASCULATURE_SEGMENT_FREQUENCY
Definition: Displacement.h:47
std::map< std::string, std::string > ModelMetadata
Definition: Types.h:104
glm::vec3 Vector3f
Definition: MathTypes.h:137
glm::vec< 3, double > Vector3d
Definition: MathTypes.h:143
glm::vec4 Vector4f
Definition: MathTypes.h:138
glm::tquat< double, glm::highp > Quaterniond
Double quaternion.
Definition: MathTypes.h:153
glm::vec< 4, double > Vector4d
Definition: MathTypes.h:144
_LINK_LIBRARIES PUBLIC Core uv if(PLATFORM_NETWORKING_ENABLED) list(APPEND $
Definition: CMakeLists.txt:35
@ point
Definition: CommonTypes.h:67
#define NO_USER_DATA
Definition: CommonTypes.h:26
std::vector< double > doubles
Definition: Types.h:62
std::vector< float > floats
Definition: Types.h:45
#define PLUGIN_INFO(message)
Definition: Logs.h:34
#define PLUGIN_PROGRESS(__msg, __progress, __maxValue)
Definition: Logs.h:50
#define PLUGIN_THROW(message)
Definition: Logs.h:45
#define PLUGIN_TIMER(__time, __msg)
Definition: Logs.h:42
morphology::MorphologyRepresentation morphologyRepresentation
Definition: Types.h:1486
morphology::PopulationColorScheme populationColorScheme
Definition: Types.h:1492
morphology::MicroDomainRepresentation microDomainRepresentation
Definition: Types.h:1488
morphology::MorphologyColorScheme morphologyColorScheme
Definition: Types.h:1490
Vector3fs vertices
Definition: TriangleMesh.h:31
std::vector< Vector3ui > indices
Definition: TriangleMesh.h:34