generate_recurrent_inhibition_connectivity.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import numpy as np
  2. from conmorph.connections import RecurrentInhibition
  3. from interneuron_polarity.model.morphology.positions import Uniform, UniformOrientation
  4. from interneuron_polarity.model.morphology.shapes import Ellipsoid
  5. from interneuron_polarity.model.morphology.volume import NeuralVolume
  6. ### Define the neural volume
  7. voxel_size = 10
  8. v_x = 300
  9. v_y = 300
  10. v_z = 300
  11. V = NeuralVolume(v_x, v_y, v_z, voxel_size)
  12. ### Define somata distribution for ex and in and the axon/dendrite shape of the ins
  13. somata_distribution = Uniform(np.array([0,0,0]), np.array([v_x, v_y, v_z]))
  14. polar_long_axis = 200
  15. polar_short_axis = 40
  16. circular_radius = (polar_long_axis*polar_short_axis**2)**(1.0/3)
  17. volume = 4.0/3*np.pi*circular_radius**3
  18. circular_inhibitory_shape = Ellipsoid(circular_radius, circular_radius)
  19. polar_inhibitory_shape = Ellipsoid(polar_long_axis, polar_short_axis) #approximately same volume
  20. inhibitory_orientation = UniformOrientation(0, np.pi / 2.0, 0, 2 * np.pi)
  21. ### Determine the excitatory neurons in one inhibitory cloud
  22. density_ex = 500.0 / (300 ** 3)
  23. density_in = 250.0 / (300 ** 3)
  24. number_of_excitatory_neurons = int(density_ex * v_x * v_y * v_z)
  25. number_of_inhibitory_neurons = int(density_in * v_x * v_y * v_z)
  26. excitatory_somata = somata_distribution.generate(number_of_excitatory_neurons)
  27. inhibitory_somata = somata_distribution.generate(number_of_inhibitory_neurons)
  28. inhibitory_orientations = inhibitory_orientation.generate(number_of_inhibitory_neurons)
  29. connectivity_p = np.zeros((number_of_inhibitory_neurons, number_of_excitatory_neurons))
  30. connectivity_c = np.zeros((number_of_inhibitory_neurons, number_of_excitatory_neurons))
  31. for inhibitory_index, inhibitory_specification in enumerate(zip(inhibitory_somata.T, inhibitory_orientations.T)):
  32. in_pos, in_orientation = inhibitory_specification
  33. contained_indices_p = polar_inhibitory_shape.contains(excitatory_somata, in_pos, in_orientation)
  34. contained_indices_c = circular_inhibitory_shape.contains(excitatory_somata, in_pos, in_orientation)
  35. connectivity_p[inhibitory_index, contained_indices_p] = 1
  36. connectivity_c[inhibitory_index, contained_indices_c] = 1
  37. connectivities = [connectivity_p, connectivity_c]
  38. labels=["polar", "circular"]
  39. for conn, label in zip(connectivities, labels):
  40. ex_ex_conn = RecurrentInhibition(conn, excitatory_somata)
  41. ex_ex_conn.save("../../data/{:s}_recurrent_inhibition.pickle".format(label))