52 using namespace details;
53 using namespace common;
57 using namespace meshing;
68 {ReportType::spike,
"spike"},
69 {ReportType::soma,
"soma"},
70 {ReportType::compartment,
"compartment"},
71 {ReportType::synapse_efficacy,
"synapse efficacy"}};
88 _buildModel(callback);
126 void Neurons::_logRealismParams()
128 PLUGIN_INFO(1,
"----------------------------------------------------");
142 PLUGIN_INFO(1,
"----------------------------------------------------");
145 void Neurons::_buildContours(ThreadSafeContainer& container,
const NeuronSomaMap& somas)
149 uint64_t progress = 0;
150 size_t materialId = 0;
152 for (
const auto soma : somas)
158 pointCloud[materialId].push_back({position.x, position.y, position.z, _details.
radiusMultiplier});
161 PointCloudMesher pcm;
162 pcm.toConvexHull(container, pointCloud);
164 PLUGIN_THROW(
"The BioExplorer was not compiled with the CGAL library")
172 uint64_t progress = 0;
173 size_t materialId = 0;
175 for (
const auto soma : somas)
181 pointCloud[materialId].push_back({position.x, position.y, position.z, _details.
radiusMultiplier});
184 SurfaceMesher sm(
_uuid);
190 PLUGIN_THROW(
"The BioExplorer was not compiled with the CGAL library")
201 float* voltages =
nullptr;
204 if (_neuronsReportParameters.
reportId != -1)
206 _simulationReport = connector.getSimulationReport(_details.
populationName, _neuronsReportParameters.
reportId);
207 _attachSimulationReport(*model);
208 voltages =
static_cast<float*
>(
213 const auto somas = connector.getNeurons(_details.
populationName, sqlNodeFilter);
218 PLUGIN_INFO(1,
"Building " << somas.size() <<
" neurons");
221 size_t previousMaterialId = std::numeric_limits<size_t>::max();
224 const bool somasOnly =
236 _buildOrientations(container, somas);
241 _buildContours(container, somas);
246 _buildSurface(somas);
252 _buildSomasOnly(*model, container, somas);
256 containers.push_back(container);
262 uint64_t neuronIndex;
263 volatile bool flag =
false;
264 std::string flagMessage;
265 #pragma omp parallel for shared(flag, flagMessage) num_threads(nbDBConnections)
266 for (neuronIndex = 0; neuronIndex < somas.size(); ++neuronIndex)
273 if (omp_get_thread_num() == 0)
275 PLUGIN_PROGRESS(
"Loading neurons...", neuronIndex, somas.size() / nbDBConnections);
280 ((
float)neuronIndex / ((
float)(somas.size() / nbDBConnections))));
289 auto it = somas.begin();
290 std::advance(it, neuronIndex);
291 const auto&
soma = it->second;
293 _buildMorphology(container, it->first, soma, neuronIndex, voltages);
296 containers.push_back(container);
298 catch (
const std::runtime_error& e)
301 flagMessage = e.what();
308 flagMessage =
"Loading was canceled";
315 for (uint64_t i = 0; i < containers.size(); ++i)
318 callback.
updateProgress(
"Compiling 3D geometry...", 0.5f + 0.5f * (
float)(1 + i) / (
float)containers.size());
319 auto& container = containers[i];
320 container.commitToModel();
322 model->applyDefaultColormap();
323 if (_neuronsReportParameters.
reportId != -1)
326 ModelMetadata metadata = {{
"Number of Neurons", std::to_string(somas.size())},
327 {
"Number of Spines", std::to_string(_nbSpines)},
330 {
"Max distance to soma", std::to_string(_maxDistanceToSoma)},
331 {
"Min soma radius", std::to_string(_minMaxSomaRadius.x)},
332 {
"Max soma radius", std::to_string(_minMaxSomaRadius.y)}};
343 void Neurons::_buildSomasOnly(
Model& model, ThreadSafeContainer& container,
const NeuronSomaMap& somas)
345 uint64_t progress = 0;
349 float* voltages =
nullptr;
350 if (_neuronsReportParameters.
reportId != -1)
351 voltages =
static_cast<float*
>(
354 for (
const auto soma : somas)
361 const auto baseMaterialId =
366 const auto neuronId =
soma.first;
367 switch (_simulationReport.
type)
369 case ReportType::spike:
370 case ReportType::soma:
372 if (_simulationReport.
guids.empty())
373 somaUserData = neuronId;
376 const auto it = _simulationReport.
guids.find(neuronId);
379 somaUserData = (*it).second;
388 std::max(0.0, voltages[somaUserData] - _neuronsReportParameters.
valueRange.x);
391 container.addSphere(position, radius, baseMaterialId, useSdf, somaUserData, {},
397 const double mitochondriaDensity =
409 void Neurons::_buildOrientations(ThreadSafeContainer& container,
const NeuronSomaMap& somas)
413 for (
const auto soma : somas)
416 const auto baseMaterialId =
418 _addArrow(container,
soma.first,
soma.second.position,
soma.second.rotation,
Vector4d(0, 0, 0, radius * 0.2),
419 Vector4d(radius, 0, 0, radius * 0.2), NeuronSectionType::soma, baseMaterialId, 0.0);
427 for (
const auto& section : sections)
434 double sectionLength = 0.0;
436 for (
size_t i = 0; i < points.size() - 1; ++i)
438 const double segmentLength = length(points[i + 1] - points[i]);
439 sectionLength += segmentLength;
440 segmentEnds.push_back(sectionLength);
442 const size_t potentialNumberOfSynapses =
444 size_t effectiveNumberOfSynapses = potentialNumberOfSynapses * (0.5 + 0.5 *
rnd0());
446 for (
size_t i = 0; i < effectiveNumberOfSynapses; ++i)
448 const double distance =
rnd0() * sectionLength;
449 size_t segmentId = 0;
450 while (distance > segmentEnds[segmentId] && segmentId < segmentEnds.size())
453 const auto preSynapticSectionId =
section.first;
454 const auto preSynapticSegmentId = segmentId;
457 synapse.preSynapticSegmentDistance = distance - (segmentId > 0 ? segmentEnds[segmentId - 1] : 0.f);
458 synapse.postSynapticNeuronId = neuronId;
459 synapse.postSynapticSectionId = 0;
460 synapse.postSynapticSegmentId = 0;
461 synapse.postSynapticSegmentDistance = 0.0;
462 synapses[preSynapticSectionId][preSynapticSegmentId].push_back(synapse);
468 void Neurons::_buildMorphology(ThreadSafeContainer& container,
const uint64_t neuronId,
const NeuronSoma& soma,
469 const uint64_t neuronIndex,
const float* voltages)
473 const auto& somaRotation =
soma.rotation;
474 const auto layer =
soma.layer;
489 for (
const auto& section : sections)
493 somaRadius += 0.5 * length(point);
498 _minMaxSomaRadius.x = std::min(_minMaxSomaRadius.x, somaRadius);
499 _minMaxSomaRadius.y = std::max(_minMaxSomaRadius.y, somaRadius);
504 size_t baseMaterialId;
515 size_t somaMaterialId;
519 somaMaterialId = baseMaterialId;
534 switch (_simulationReport.
type)
536 case ReportType::compartment:
538 const auto compartments =
539 connector.getNeuronSectionCompartments(_details.
populationName, _neuronsReportParameters.
reportId, neuronId,
541 if (!compartments.empty())
542 somaUserData = compartments[0];
545 case ReportType::spike:
546 case ReportType::soma:
548 if (_simulationReport.
guids.empty())
549 somaUserData = neuronId + 1;
552 const auto it = _simulationReport.
guids.find(neuronId);
555 somaUserData = (*it).second + 1;
560 float voltageScaling = 1.f;
562 voltageScaling = _neuronsReportParameters.
scalingRange.x *
563 std::max(0.0, voltages[somaUserData] - _neuronsReportParameters.
valueRange.x);
571 synapses = connector.getNeuronAfferentSynapses(_details.
populationName, neuronId);
576 synapses = _buildDebugSynapses(neuronId, sections);
583 double correctedSomaRadius = 0.f;
584 for (
const auto& section : sections)
588 const auto& points =
section.second.points;
589 bool useSdf =
andCheck(
static_cast<uint32_t
>(_details.
realismLevel),
static_cast<uint32_t
>(sectionType));
591 double distanceToSoma = 0.0;
596 if (sectionType == NeuronSectionType::axon && !_details.
loadAxon)
605 _addArrow(container, neuronIndex, somaPosition, somaRotation,
section.second.points[0],
606 section.second.points[
section.second.points.size() - 1], sectionType, baseMaterialId,
611 uint64_t count = 0.0;
615 auto points =
section.second.points;
616 for (uint64_t i = 0; i < points.size(); ++i)
618 auto&
point = points[i];
619 point.x *= voltageScaling;
620 point.y *= voltageScaling;
621 point.z *= voltageScaling;
624 const auto& firstPoint = points[0];
625 const auto& lastPoint = points[points.size() - 1];
626 auto point = firstPoint;
627 if (length(lastPoint) < length(firstPoint))
637 const bool loadSection =
638 (sectionType == NeuronSectionType::axon && _details.
loadAxon) ||
652 if (voltageScaling == 1.f)
654 const Vector3d segmentDirection = normalize(lastPoint - firstPoint);
655 const double halfDistanceToSoma = length(
Vector3d(point)) * 0.5;
656 const Vector3d p1 =
Vector3d(point) - halfDistanceToSoma * segmentDirection;
657 p2 = p1 * dstRadius / somaRadius * 0.95;
661 correctedSomaRadius = std::max(correctedSomaRadius, length(p2)) * 2.0;
662 const uint64_t geometryIndex = container.addCone(src, srcRadius, dst, dstRadius, somaMaterialId, useSdf,
663 somaUserData, {}, displacement);
664 somaNeighbours.insert(geometryIndex);
665 sectionNeighbours.insert(geometryIndex);
667 container.addSphere(dst, dstRadius, somaMaterialId, useSdf, somaUserData);
670 correctedSomaRadius = count == 0 ? somaRadius : correctedSomaRadius / count;
672 float parentRadius =
section.second.points[0].w;
673 if (sections.find(
section.second.parentId) != sections.end())
675 const auto& parentSection = sections[
section.second.parentId];
676 const auto& parentSectionPoints = parentSection.points;
677 parentRadius = parentSection.points[parentSection.points.size() - 1].w;
681 _addSection(container, neuronId,
soma.morphologyId,
section.first,
section.second, somaPosition,
682 somaRotation, parentRadius, baseMaterialId, mitochondriaDensity, somaUserData, synapses,
683 distanceToSoma, sectionNeighbours, voltageScaling);
692 somaNeighbours.insert(
693 container.addSphere(somaPosition, correctedSomaRadius, somaMaterialId, useSdf, somaUserData, {},
698 for (
const auto index : somaNeighbours)
699 container.setSDFGeometryNeighbours(index, somaNeighbours);
705 _addSomaInternals(container, baseMaterialId, somaPosition, correctedSomaRadius, mitochondriaDensity, useSdf,
712 void Neurons::_addVaricosity(
Vector4fs& points)
717 const uint64_t middlePointIndex = points.size() / 2;
718 const auto& startPoint = points[middlePointIndex];
719 const auto& endPoint = points[middlePointIndex + 1];
720 const double radius = std::min(startPoint.w, startPoint.w);
722 const auto sp =
Vector3d(startPoint);
729 radius *
Vector3d((rand() % 100 - 50) / 100.0, (rand() % 100 - 50) / 100.0, (rand() % 100 - 50) / 100.0);
732 auto idx = points.begin() + middlePointIndex + 1;
733 idx = points.insert(idx, {p2.x, p2.y, p2.z, startPoint.w});
734 idx = points.insert(idx, {p1.x, p1.y, p1.z,
radius * 2.0});
735 points.insert(idx, {p0.x, p0.y, p0.z, endPoint.w});
738 void Neurons::_addArrow(ThreadSafeContainer& container,
const uint64_t neuronId,
const Vector3d& somaPosition,
740 const NeuronSectionType sectionType,
const size_t baseMaterialId,
const double distanceToSoma)
742 size_t sectionMaterialId;
746 sectionMaterialId = sectionMaterialId = baseMaterialId;
749 sectionMaterialId = baseMaterialId +
static_cast<size_t>(sectionType);
762 if (sectionType != NeuronSectionType::axon)
769 const auto userData = neuronId;
770 auto direction = dst - src;
776 const auto d1 = normalize(direction) * (length(direction) / 2.0 -
radius);
777 const auto d2 = normalize(direction) * (length(direction) / 2.0 +
radius);
779 const bool useSdf =
false;
781 container.addSphere(src, radius * 0.2, sectionMaterialId, useSdf, userData);
782 container.addCone(src, radius * 0.2,
Vector3f(src + d1 * 0.99),
radius * 0.2, sectionMaterialId, useSdf, userData);
787 container.addCone(
Vector3f(src + d2),
radius * 0.2, dst,
radius * 0.2, sectionMaterialId, useSdf, userData);
792 void Neurons::_addSection(ThreadSafeContainer& container,
const uint64_t neuronId,
const uint64_t morphologyId,
793 const uint64_t sectionId,
const Section& section,
const Vector3d& somaPosition,
794 const Quaterniond& somaRotation,
const double parentRadius,
const size_t baseMaterialId,
795 const double mitochondriaDensity,
const uint64_t somaUserData,
797 const float voltageScaling)
804 case NeuronSectionType::axon:
808 case NeuronSectionType::apical_dendrite:
809 case NeuronSectionType::basal_dendrite:
818 for (
auto& point : points)
820 point.x *= voltageScaling;
821 point.y *= voltageScaling;
822 point.z *= voltageScaling;
825 points[0].w = parentRadius;
827 size_t sectionMaterialId;
831 sectionMaterialId = baseMaterialId;
834 sectionMaterialId = baseMaterialId +
section.type;
845 const auto middlePointIndex = localPoints.size() / 2;
846 const bool addVaricosity = _details.
generateVaricosities && sectionType == NeuronSectionType::axon &&
849 _addVaricosity(localPoints);
852 double sectionLength = 0.0;
853 double sectionVolume = 0.0;
855 switch (_simulationReport.
type)
857 case ReportType::undefined:
860 case ReportType::spike:
861 case ReportType::soma:
863 userData = somaUserData;
866 case ReportType::compartment:
868 compartments = connector.getNeuronSectionCompartments(_details.
populationName,
869 _neuronsReportParameters.
reportId, neuronId, sectionId);
876 const auto it = synapses.find(sectionId);
877 if (it != synapses.end())
878 segmentSynapses = (*it).second;
882 uint64_t previousGeometryIndex = 0;
883 for (uint64_t i = 0; i < localPoints.size() - 1; ++i)
885 if (!compartments.empty())
887 const uint64_t compartmentIndex = i * compartments.size() / localPoints.size();
888 userData = compartments[compartmentIndex];
891 const auto& srcPoint = localPoints[i];
892 const auto& dstPoint = localPoints[i + 1];
894 if (srcPoint == dstPoint)
905 const double sampleLength = length(dstPoint - srcPoint);
906 sectionLength += sampleLength;
910 Vector3f displacement{std::min(std::min(srcRadius, dstRadius) * 0.5f,
922 if (i > middlePointIndex && i < middlePointIndex + 3)
931 if (i == middlePointIndex + 1 || i == middlePointIndex + 3)
932 sectionNeighbours = {};
933 if (i == middlePointIndex + 1)
934 _varicosities[neuronId].push_back(dst);
938 const auto it = segmentSynapses.find(i);
939 if (it != segmentSynapses.end())
941 const auto synapses = (*it).second;
943 "Adding " << synapses.size() <<
" spines to segment " << i <<
" of section " << sectionId);
944 for (
const auto& synapse : synapses)
946 const size_t spineMaterialId =
952 const Vector3d segmentDirection = dst - src;
953 const double radiusInSegment =
954 srcRadius + ((1.0 / length(segmentDirection)) * synapse.preSynapticSegmentDistance) *
955 (dstRadius - srcRadius);
957 src + normalize(segmentDirection) * synapse.preSynapticSegmentDistance;
958 _addSpine(container, neuronId, morphologyId, sectionId, synapse, spineMaterialId, positionInSegment,
964 container.addSphere(dst, dstRadius, materialId, useSdf, userData);
966 const uint64_t geometryIndex =
967 container.addCone(src, srcRadius, dst, dstRadius, materialId, useSdf, userData, {}, displacement);
969 previousGeometryIndex = geometryIndex;
970 sectionNeighbours = {geometryIndex};
973 _maxDistanceToSoma = std::max(_maxDistanceToSoma, distanceToSoma + sectionLength);
977 sectionVolume +=
coneVolume(sampleLength, srcRadius, dstRadius);
983 if (sectionType == NeuronSectionType::axon)
986 _addSectionInternals(container, neuronId, somaPosition, somaRotation, sectionLength, sectionVolume,
987 localPoints, mitochondriaDensity, baseMaterialId);
990 _addAxonMyelinSheath(container, neuronId, somaPosition, somaRotation, sectionLength, localPoints,
991 mitochondriaDensity, baseMaterialId);
995 void Neurons::_addSectionInternals(ThreadSafeContainer& container,
const uint64_t neuronId,
997 const double sectionLength,
const double sectionVolume,
const Vector4fs& points,
998 const double mitochondriaDensity,
const size_t baseMaterialId)
1000 if (mitochondriaDensity == 0.0)
1008 const double indexRatio = double(points.size()) / double(nbMaxMitochondrionSegments);
1010 double mitochondriaVolume = 0.0;
1014 int64_t mitochondrionSegment = -(rand() % (1 + nbMaxMitochondrionSegments / 10));
1015 double previousRadius;
1018 uint64_t geometryIndex = 0;
1019 Vector3d randomPosition{points[0].w * (rand() % 100 - 50) / 200.0, points[0].w * (rand() % 100 - 50) / 200.0,
1020 points[0].w * (rand() % 100 - 50) / 200.0};
1021 for (
size_t step = 0; step < nbMaxMitochondrionSegments; ++step)
1023 if (mitochondriaVolume < sectionVolume * mitochondriaDensity && mitochondrionSegment >= 0 &&
1024 mitochondrionSegment < nbSegments)
1026 const uint64_t srcIndex = uint64_t(step * indexRatio);
1027 const uint64_t dstIndex = uint64_t(step * indexRatio) + 1;
1028 if (dstIndex < points.size())
1033 const Vector3d srcPosition{srcSample.x + srcRadius * (rand() % 100 - 50) / 500.0,
1034 srcSample.y + srcRadius * (rand() % 100 - 50) / 500.0,
1035 srcSample.z + srcRadius * (rand() % 100 - 50) / 500.0};
1037 const Vector3d dstPosition{dstSample.x + dstRadius * (rand() % 100 - 50) / 500.0,
1038 dstSample.y + dstRadius * (rand() % 100 - 50) / 500.0,
1039 dstSample.z + dstRadius * (rand() % 100 - 50) / 500.0};
1041 const Vector3d direction = dstPosition - srcPosition;
1042 const Vector3d position = srcPosition + randomPosition + direction * (step * indexRatio - srcIndex);
1047 if (mitochondrionSegment != 0)
1048 neighbours = {geometryIndex};
1051 container.addSphere(somaPosition + somaRotation * position, radius, mitochondrionMaterialId,
1054 if (mitochondrionSegment > 0)
1057 if (mitochondrionSegment > 1)
1058 neighbours = {geometryIndex};
1059 const auto srcPosition =
1061 const auto dstPosition =
1064 geometryIndex = container.addCone(
1065 srcPosition, radius, dstPosition, previousRadius, mitochondrionMaterialId, useSdf,
NO_USER_DATA,
1074 mitochondriaVolume +=
coneVolume(length(position - previousPosition), radius, previousRadius);
1077 previousPosition = position;
1081 ++mitochondrionSegment;
1083 if (mitochondrionSegment == nbSegments)
1085 mitochondrionSegment = -(rand() % (1 + nbMaxMitochondrionSegments / 10));
1087 const auto index = uint64_t(step * indexRatio);
1089 Vector3d(points[index].w * (rand() % 100 - 50) / 200.0, points[index].w * (rand() % 100 - 50) / 200.0,
1090 points[index].w * (rand() % 100 - 50) / 200.0);
1095 void Neurons::_addAxonMyelinSheath(ThreadSafeContainer& container,
const uint64_t neuronId,
1097 const double sectionLength,
const Vector4fs& points,
1098 const double mitochondriaDensity,
const size_t baseMaterialId)
1100 if (sectionLength == 0 || points.empty())
1111 const uint64_t nbPoints = points.size();
1117 double srcRadius = 0.0;
1118 for (
const auto& point : points)
1120 srcRadius /= points.size();
1126 const auto& srcPoint = points[i];
1127 const auto srcPosition =
1131 container.addSphere(srcPosition, srcRadius, myelinSteathMaterialId,
NO_USER_DATA);
1133 double currentLength = 0;
1134 auto previousPosition = srcPosition;
1135 auto previousRadius = srcRadius;
1136 const Vector3f displacement{srcRadius *
1145 const auto& dstPoint = points[i];
1146 const auto dstRadius = srcRadius;
1147 const auto dstPosition =
1150 currentLength += length(dstPosition - previousPosition);
1152 container.addSphere(dstPosition, srcRadius, myelinSteathMaterialId,
NO_USER_DATA);
1154 const auto geometryIndex =
1155 container.addCone(dstPosition, dstRadius, previousPosition, previousRadius, myelinSteathMaterialId,
1157 neighbours.insert(geometryIndex);
1158 previousPosition = dstPosition;
1159 previousRadius = dstRadius;
1166 void Neurons::_addSpine(ThreadSafeContainer& container,
const uint64_t neuronId,
const uint64_t morphologyId,
1167 const uint64_t sectionId,
const Synapse& synapse,
const size_t SpineMaterialId,
1168 const Vector3d& preSynapticSurfacePosition,
const double radiusAtSurfacePosition)
1171 const double spineScale = 0.25;
1172 const double spineLength = 0.4 + 0.2 *
rnd1();
1174 const auto spineDisplacement =
1178 const auto spineSmallRadius = std::max(spineDisplacement.x, radius *
spineRadiusRatio * 0.5 * spineScale);
1179 const auto spineBaseRadius = std::max(spineDisplacement.x, radius *
spineRadiusRatio * 0.75 * spineScale);
1180 const auto spineLargeRadius = std::max(spineDisplacement.x, radius *
spineRadiusRatio * 2.5 * spineScale);
1184 const auto origin = preSynapticSurfacePosition +
1185 normalize(direction) * std::max(0.0, radiusAtSurfacePosition - sectionDisplacementAmplitude);
1186 const auto target = preSynapticSurfacePosition + normalize(direction) * (radiusAtSurfacePosition + spineLength);
1189 auto middle = (target + origin) / 2.0;
1190 const double d = length(target - origin) / 2.0;
1192 const float spineMiddleRadius = spineSmallRadius + d * 0.1 *
rnd1();
1200 container.addSphere(target, spineLargeRadius, SpineMaterialId, neuronId);
1201 neighbours.insert(container.addSphere(middle, spineMiddleRadius, SpineMaterialId, useSdf, neuronId, neighbours,
1202 spineDisplacement));
1203 if (middle != origin)
1204 container.addCone(origin, spineSmallRadius, middle, spineMiddleRadius, SpineMaterialId, useSdf, neuronId,
1205 neighbours, spineDisplacement);
1206 if (middle != target)
1207 container.addCone(middle, spineMiddleRadius, target, spineLargeRadius, SpineMaterialId, useSdf, neuronId,
1208 neighbours, spineDisplacement);
1216 const auto neurons = connector.getNeurons(_details.
populationName,
"guid=" + std::to_string(neuronId));
1218 if (neurons.empty())
1219 PLUGIN_THROW(
"Neuron " + std::to_string(neuronId) +
" does not exist");
1220 const auto&
neuron = neurons.begin()->second;
1221 const auto sections = connector.getNeuronSections(_details.
populationName, neuronId);
1223 if (sections.empty())
1224 PLUGIN_THROW(
"Section " + std::to_string(sectionId) +
" does not exist for neuron " + std::to_string(neuronId));
1225 const auto section = sections.begin()->second;
1231 points.push_back({position.x, position.y, position.z,
radius});
1238 if (_varicosities.find(neuronId) == _varicosities.end())
1239 PLUGIN_THROW(
"Neuron " + std::to_string(neuronId) +
" does not exist");
1240 return _varicosities[neuronId];
1243 void Neurons::_attachSimulationReport(
Model& model)
1248 switch (_simulationReport.
type)
1250 case ReportType::undefined:
1253 case ReportType::spike:
1256 "Initialize spike simulation handler and restrain "
1257 "guids to the simulated ones");
1263 case ReportType::soma:
1266 "Initialize soma simulation handler and restrain guids "
1267 "to the simulated ones");
1273 case ReportType::compartment:
1276 "Initialize compartment simulation handler and restrain "
1277 "guids to the simulated ones");
1279 std::make_shared<CompartmentSimulationHandler>(_details.
populationName, _neuronsReportParameters.
reportId);
core::ModelDescriptorPtr _modelDescriptor
double _getCorrectedRadius(const double radius, const double radiusMultiplier) const
core::Quaterniond _rotation
details::CellAnimationDetails _animationDetails
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 MemoryCache * getInstance()
Get the Instance object.
const morphology::SectionMap & getNeuronSections(const db::DBConnector &connector, const uint64_t neuronId, const details::NeuronsDetails &details)
Get morphology sections from cache.
static DBConnector & getInstance()
Get the Instance object.
size_t getNbConnections() const
Get the number of connections to the database.
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
size_t _getNbMitochondrionSegments() const
double _getDistanceToSoma(const SectionMap §ions, const Section §ion)
Vector3ds getNeuronVaricosities(const uint64_t neuronId)
Get the neuron varicosities location in space.
Vector4ds getNeuronSectionPoints(const uint64_t neuronId, const uint64_t sectionId)
Get the neuron section 3D points for a given section Id.
void merge(const Box< T > &aabb)
void updateProgress(const std::string &message, const float fraction) const
The ModelDescriptor struct defines the metadata attached to a model.Model descriptor are exposed via ...
The abstract Model class holds the geometry attached to an asset of the scene (mesh,...
PLATFORM_API AbstractSimulationHandlerPtr getSimulationHandler() const
Returns the simulation handler.
PLATFORM_API void setSimulationHandler(AbstractSimulationHandlerPtr handler)
Sets the simulation handler.
Scene object This object contains collections of geometries, materials and light sources that are use...
virtual PLATFORM_API ModelPtr createModel() const =0
Factory method to create an engine-specific model.
double rnd1()
Return a random double between -0.5 and 0.5.
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.
double coneVolume(const double height, const double r1, const double r2)
std::set< size_t > Neighbours
double rnd0()
Return a random double between 0 and 1.
void setDefaultTransferFunction(Model &model, const Vector2d range, const double alpha)
Set the default transfer function (Unipolar) to a given model.
size_t getMaterialIdFromOrientation(const Vector3d &orientation)
std::vector< ThreadSafeContainer > ThreadSafeContainers
std::string boolAsString(const bool value)
Return a Yes/No string representation of a boolean.
Vector3d doublesToVector3d(const doubles &value)
Converts a vector of doubles into a 3D vector.
NeuronsReportParameters doublesToNeuronsReportParametersDetails(const doubles &values)
Converts a vector of doubles into neurons report parameters details.
bool andCheck(const uint32_t value, const uint32_t test)
Check is test is part of value using the AND operator.
CellAnimationDetails doublesToCellAnimationDetails(const doubles &values)
Converts a vector of doubles into cell animation details.
std::map< size_t, Vector4ds > PointCloud
const double myelinSteathRadiusRatio
const double MAX_SOMA_RADIUS
const uint64_t DEFAULT_DEBUG_SYNAPSE_DENSITY_RATIO
const double mitochondrionSegmentSize
const double DEFAULT_ARROW_RADIUS_RATIO
std::map< uint64_t, std::vector< Synapse > > SegmentSynapseMap
const doubles MITOCHONDRIA_DENSITY
const size_t MATERIAL_OFFSET_MITOCHONDRION
const double spineRadiusRatio
const size_t NB_MATERIALS_PER_MORPHOLOGY
const double DEFAULT_SPINE_RADIUS
std::map< uint64_t, NeuronSoma > NeuronSomaMap
const size_t MATERIAL_OFFSET_EFFERENT_SYNAPSE
const size_t MATERIAL_OFFSET_VARICOSITY
const uint64_t NB_MYELIN_FREE_SEGMENTS
const size_t MATERIAL_OFFSET_SOMA
const size_t MATERIAL_OFFSET_AFFERENT_SYNAPSE
const double myelinSteathLength
const uint64_t nbMinSegmentsForVaricosity
const size_t MATERIAL_OFFSET_MYELIN_SHEATH
const int64_t SOMA_AS_PARENT
std::map< uint64_t, SegmentSynapseMap > SectionSynapseMap
std::map< uint64_t, Section > SectionMap
std::map< ReportType, std::string > reportTypeAsString
const double mitochondrionRadius
const double DEFAULT_MORPHOLOGY_SECTION_STRENGTH
const double DEFAULT_MORPHOLOGY_MITOCHONDRION_STRENGTH
const double DEFAULT_MORPHOLOGY_SOMA_STRENGTH
const double DEFAULT_MORPHOLOGY_SECTION_FREQUENCY
const double DEFAULT_MORPHOLOGY_MITOCHONDRION_FREQUENCY
const double DEFAULT_MORPHOLOGY_MYELIN_STEATH_STRENGTH
const double DEFAULT_MORPHOLOGY_SPINE_FREQUENCY
const double DEFAULT_MORPHOLOGY_MYELIN_STEATH_FREQUENCY
const double DEFAULT_MORPHOLOGY_SOMA_FREQUENCY
const double DEFAULT_MORPHOLOGY_NUCLEUS_STRENGTH
const double DEFAULT_MORPHOLOGY_NUCLEUS_FREQUENCY
const double DEFAULT_MORPHOLOGY_SPINE_STRENGTH
@ morphology_soma_strength
@ morphology_soma_frequency
@ morphology_nucleus_frequency
@ morphology_section_strength
@ morphology_spine_strength
@ morphology_nucleus_strength
@ morphology_myelin_steath_strength
@ morphology_spine_frequency
@ morphology_myelin_steath_frequency
@ morphology_mitochondrion_frequency
@ morphology_section_frequency
@ morphology_mitochondrion_strength
std::map< std::string, std::string > ModelMetadata
glm::vec< 3, uint32_t > Vector3ui
glm::vec< 3, double > Vector3d
glm::vec< 2, double > Vector2d
std::vector< Vector4f > Vector4fs
glm::tquat< double, glm::highp > Quaterniond
Double quaternion.
glm::vec< 4, double > Vector4d
morphology::MorphologyColorScheme morphologyColorScheme
morphology::MorphologyRepresentation morphologyRepresentation
std::string populationName
morphology::MorphologySynapseType synapsesType
morphology::PopulationColorScheme populationColorScheme
std::string sqlNodeFilter
bool generateVaricosities
std::string sqlSectionFilter
doubles displacementParams
bool loadNonSimulatedNodes
core::Vector2d valueRange
core::Vector2d scalingRange
uint64_t initialSimulationFrame