Source code for neuron_visualization_addon.model.Cell

import bpy
from neuron_visualization_addon.model.Projection import Projection
from neuron_visualization_addon.model.ColorMap import ColorMap

[docs]class Cell(object): """ This class represents a brain cell in the network """ def __init__(self, id, location=(0,0,0)): """The constructor. :param id: The cell ID :type id: String :param location: Cell location :type location: Vector|tuple """ self.id = id # Create some placeholder bpy.ops.mesh.primitive_uv_sphere_add(segments=64, ring_count=32, size=0.05, location=location) # Name the object as the cell bpy.context.object.name = self.id # Save the referrence self.blender_obj = bpy.context.object self.blender_obj.select = False # Initialization self.projectsTo = [] self.receivesFrom = [] @property def location(self): """Location of the cell. :type location: Vector """ return self.blender_obj.location @location.setter def location(self, location): """Location setter :param location: New location :type location: Vector | tuple """ self.blender_obj.location = location for axon in self.receivesFrom: axon.updateDestination(location)
[docs] def drawAxon(self, weight, destinationCell): """Draw an axon between this cell and destination cell. :param weight: The weight of a connection. :type weight: float :param destinationCell: Projection destionation cell. :type destinationCell: Cell :returns: Projection -- Created projection """ # Create projection projection = Projection(self.blender_obj) projection.makeSimpleProjection(weight, destinationCell.location) # Save it self.projectsTo.append(projection) destinationCell.isProjectedTo(projection) return projection
[docs] def isProjectedTo(self, projection): """Add projections from which the input is received. :param projection: Projection to be added :type projection: Projection """ self.receivesFrom.append(projection)
[docs] def setColor(self, color=(0.0,0.0,0.0)): """Set RGB color :param color: RGB color :type color: tuple """ material = bpy.data.materials.new("CellColor") material.diffuse_color = color self.blender_obj.active_material = material
[docs] def setSpike(self, time, intensity, colorMap='jet', animateAxons=True): """Set cell to spike at a time with a specific intensity :param time: Frame of a spike :type time: float :param intensity: Intensity of a spike from 0 to 1 :type intensity: float :param colorMap: Color map for intensities Visualization :type colorMap: string :todo: Neuron swelling without axon """ if self.blender_obj.active_material == None: self.blender_obj.active_material = bpy.data.materials.new("CellColor") material = self.blender_obj.active_material multiplier = 0.0 time_step = 5 if len(self.projectsTo) > 0 and animateAxons: for i in range(len(self.projectsTo)): self.projectsTo[i].spike(time,ColorMap.getColor(0, colorMap), ColorMap.getColor(intensity, colorMap)) for _ in range(5): material.diffuse_color = ColorMap.getColor(intensity * multiplier, colorMap) material.keyframe_insert(data_path="diffuse_color", frame = time - time_step) material.keyframe_insert(data_path="diffuse_color", frame = time + time_step) # ---- Neurons swelling ---- #self.blender_obj.scale = (1. + multiplier/4, 1. + multiplier/4, 1. + multiplier/4) #self.blender_obj.keyframe_insert(data_path="scale", frame = time - time_step) #self.blender_obj.keyframe_insert(data_path="scale", frame = time + time_step) multiplier = multiplier + 0.25 time_step = time_step - 1
[docs] def setSpikes(self, spikes, colorMap='jet', animateAxons=True): """Set cell to spike at specific timse with a specific intensities :param spikes: Array with times is ms and spike intensities :type spikes: array :param colorMap: Color map for intensities Visualization :type colorMap: string """ for [time,intensity] in spikes: self.setSpike(time,intensity,colorMap)