bmtool 0.4.2__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. bmtool-0.5.1/PKG-INFO +519 -0
  2. bmtool-0.5.1/README.md +488 -0
  3. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/bmplot.py +274 -100
  4. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/connectors.py +45 -51
  5. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/util/util.py +65 -8
  6. bmtool-0.5.1/bmtool.egg-info/PKG-INFO +519 -0
  7. {bmtool-0.4.2 → bmtool-0.5.1}/setup.py +2 -2
  8. bmtool-0.4.2/PKG-INFO +0 -550
  9. bmtool-0.4.2/README.md +0 -519
  10. bmtool-0.4.2/bmtool.egg-info/PKG-INFO +0 -550
  11. {bmtool-0.4.2 → bmtool-0.5.1}/LICENSE +0 -0
  12. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/__init__.py +0 -0
  13. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/__main__.py +0 -0
  14. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/debug/__init__.py +0 -0
  15. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/debug/commands.py +0 -0
  16. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/debug/debug.py +0 -0
  17. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/manage.py +0 -0
  18. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/plot_commands.py +0 -0
  19. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/singlecell.py +0 -0
  20. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/util/__init__.py +0 -0
  21. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/util/commands.py +0 -0
  22. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/util/neuron/__init__.py +0 -0
  23. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool/util/neuron/celltuner.py +0 -0
  24. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool.egg-info/SOURCES.txt +0 -0
  25. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool.egg-info/dependency_links.txt +0 -0
  26. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool.egg-info/entry_points.txt +0 -0
  27. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool.egg-info/requires.txt +0 -0
  28. {bmtool-0.4.2 → bmtool-0.5.1}/bmtool.egg-info/top_level.txt +0 -0
  29. {bmtool-0.4.2 → bmtool-0.5.1}/setup.cfg +0 -0
bmtool-0.5.1/PKG-INFO ADDED
@@ -0,0 +1,519 @@
1
+ Metadata-Version: 2.1
2
+ Name: bmtool
3
+ Version: 0.5.1
4
+ Summary: BMTool
5
+ Home-page: https://github.com/cyneuro/bmtool
6
+ Download-URL:
7
+ Author: Tyler Banks
8
+ Author-email: tbanks@mail.missouri.edu
9
+ License: MIT
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Intended Audience :: Education
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.6
16
+ Classifier: Topic :: Software Development :: Libraries
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Classifier: Operating System :: OS Independent
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Requires-Dist: bmtk
22
+ Requires-Dist: click
23
+ Requires-Dist: clint
24
+ Requires-Dist: h5py
25
+ Requires-Dist: matplotlib
26
+ Requires-Dist: networkx
27
+ Requires-Dist: numpy
28
+ Requires-Dist: pandas
29
+ Requires-Dist: questionary
30
+ Requires-Dist: pynmodlt
31
+
32
+ # bmtool
33
+ A collection of modules to make developing [Neuron](https://www.neuron.yale.edu/neuron/) and [BMTK](https://alleninstitute.github.io/bmtk/) models easier.
34
+
35
+ [![license](https://img.shields.io/github/license/mashape/apistatus.svg?maxAge=2592000)](https://github.com/cyneuro/bmtool/blob/master/LICENSE)
36
+
37
+ ## Table of Contents
38
+ - [Getting Started](#Getting-Started)
39
+ - [CLI](#CLI)
40
+ - [Single Cell](#Single-Cell-Module)
41
+ - [Connectors](#Connectors-Module)
42
+ - [Bmplot](#bmplot-Module)
43
+
44
+ ## Getting Started
45
+
46
+ **Installation**
47
+ ```bash
48
+ pip install bmtool
49
+ ```
50
+ For developers who will be pulling down additional updates to this repository regularly use the following instead.
51
+ ```bash
52
+ git clone https://github.com/cyneuro/bmtool.git
53
+ cd bmtool
54
+ python setup.py develop
55
+ ```
56
+ Then download updates (from this directory) with
57
+ ```bash
58
+ git pull
59
+ ```
60
+
61
+ ## CLI
62
+ #### Many of modules available can be accesed using the command line
63
+ ```bash
64
+ > cd your_bmtk_model_directory
65
+ > bmtool
66
+ Usage: bmtool [OPTIONS] COMMAND [ARGS]...
67
+
68
+ Options:
69
+ --verbose Verbose printing
70
+ --help Show this message and exit.
71
+
72
+ Commands:
73
+ debug
74
+ plot
75
+ util
76
+
77
+ >
78
+ > bmtool plot
79
+ Usage: bmtool plot [OPTIONS] COMMAND [ARGS]...
80
+
81
+ Options:
82
+ --config PATH Configuration file to use, default: "simulation_config.json"
83
+ --no-display When set there will be no plot displayed, useful for saving
84
+ plots
85
+ --help Show this message and exit.
86
+
87
+ Commands:
88
+ connection Display information related to neuron connections
89
+ positions Plot cell positions for a given set of populations
90
+ raster Plot the spike raster for a given population
91
+ report Plot the specified report using BMTK's default report plotter
92
+ >
93
+ ```
94
+
95
+ ## Single Cell Module
96
+ - [Passive properties](#passive-properties)
97
+ - [Current injection](#current-clamp)
98
+ - [FI curve](#fi-curve)
99
+ - [ZAP](#zap)
100
+ - [Tuner](#single-cell-tuning)
101
+ - [VHalf Segregation](#vhalf-segregation-module)
102
+ #### The single cell module can take any neuron HOC object and calculate passive properties, run a current clamp, calculate FI curve, or run a ZAP. The module is designed to work with HOC template files and can also turn Allen database SWC and json files into HOC objects and use those. The examples below uses "Cell_Cf" which is the name of a HOC templated loaded by the profiler.
103
+
104
+ #### First step is it initialize the profiler.
105
+
106
+
107
+ ```python
108
+ from bmtool.singlecell import Profiler
109
+ profiler = Profiler(template_dir='templates', mechanism_dir = 'mechanisms', dt=0.1)
110
+ ```
111
+
112
+ #### Can provide any single cell module with either name of Hoc template or a HOC object. If you are wanted to use Allen database SWC and json files you can use the following function
113
+
114
+
115
+ ```python
116
+ from bmtool.singlecell import load_allen_database_cells
117
+ cell = load_allen_database_cells(path_to_SWC_file,path_to_json_file)
118
+ ```
119
+
120
+ ### Passive properties
121
+ #### Calculates the passive properties(V-rest, Rin and tau) of a HOC object
122
+
123
+
124
+ ```python
125
+ from bmtool.singlecell import Passive,run_and_plot
126
+ import matplotlib.pyplot as plt
127
+ sim = Passive('Cell_Cf', inj_amp=-100., inj_delay=1500., inj_dur=1000., tstop=2500., method='exp2')
128
+ title = 'Passive Cell Current Injection'
129
+ xlabel = 'Time (ms)'
130
+ ylabel = 'Membrane Potential (mV)'
131
+ X, Y = run_and_plot(sim, title, xlabel, ylabel, plot_injection_only=True)
132
+ plt.gca().plot(*sim.double_exponential_fit(), 'r:', label='double exponential fit')
133
+ plt.legend()
134
+ plt.show()
135
+ ```
136
+
137
+ Injection location: Cell_Cf[0].soma[0](0.5)
138
+ Recording: Cell_Cf[0].soma[0](0.5)._ref_v
139
+ Running simulation for passive properties...
140
+
141
+ V Rest: -70.21 (mV)
142
+ Resistance: 128.67 (MOhms)
143
+ Membrane time constant: 55.29 (ms)
144
+
145
+ V_rest Calculation: Voltage taken at time 1500.0 (ms) is
146
+ -70.21 (mV)
147
+
148
+ R_in Calculation: dV/dI = (v_final-v_rest)/(i_final-i_start)
149
+ (-83.08 - (-70.21)) / (-0.1 - 0)
150
+ 12.87 (mV) / 0.1 (nA) = 128.67 (MOhms)
151
+
152
+ Tau Calculation: Fit a double exponential curve to the membrane potential response
153
+ f(t) = a0 + a1*exp(-t/tau1) + a2*exp(-t/tau2)
154
+ Constained by initial value: f(0) = a0 + a1 + a2 = v_rest
155
+ Fit parameters: (a0, a1, a2, tau1, tau2) = (-83.06, -3306.48, 3319.33, 55.29, 55.15)
156
+ Membrane time constant is determined from the slowest exponential term: 55.29 (ms)
157
+
158
+ Sag potential: v_sag = v_peak - v_final = -0.66 (mV)
159
+ Normalized sag potential: v_sag / (v_peak - v_rest) = 0.049
160
+
161
+
162
+
163
+
164
+
165
+ ![png](readme_figures/output_8_1.png)
166
+
167
+
168
+
169
+ ### Current clamp
170
+ #### Runs a current clamp on a HOC object
171
+
172
+
173
+ ```python
174
+ from bmtool.singlecell import CurrentClamp
175
+ sim = CurrentClamp('Cell_Cf', inj_amp=350., inj_delay=1500., inj_dur=1000., tstop=3000., threshold=-15.)
176
+ X, Y = run_and_plot(sim, title='Current Injection', xlabel='Time (ms)',
177
+ ylabel='Membrane Potential (mV)', plot_injection_only=True)
178
+ plt.show()
179
+ ```
180
+
181
+ Injection location: Cell_Cf[1].soma[0](0.5)
182
+ Recording: Cell_Cf[1].soma[0](0.5)._ref_v
183
+ Current clamp simulation running...
184
+
185
+ Number of spikes: 19
186
+
187
+
188
+
189
+
190
+
191
+ ![png](readme_figures/output_10_1.png)
192
+
193
+
194
+
195
+ ### FI curve
196
+ #### Calculates the frequency vs current injection plot for a HOC object
197
+
198
+
199
+ ```python
200
+ from bmtool.singlecell import FI
201
+ sim = FI('Cell_Cf', i_start=0., i_stop=1000., i_increment=50., tstart=1500.,threshold=-15.)
202
+ X, Y = run_and_plot(sim, title='FI Curve', xlabel='Injection (nA)', ylabel='# Spikes')
203
+ plt.show()
204
+ ```
205
+
206
+ Injection location: Cell_Cf[21].soma[0](0.5)
207
+ Recording: Cell_Cf[21].soma[0](0.5)._ref_v
208
+ Running simulations for FI curve...
209
+
210
+ Results
211
+ Injection (nA): 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95
212
+ Number of spikes: 0, 1, 10, 12, 15, 16, 17, 19, 20, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27
213
+
214
+
215
+
216
+
217
+
218
+ ![png](readme_figures/output_12_1.png)
219
+
220
+
221
+
222
+ ### ZAP
223
+ #### Runs a ZAP on a HOC object
224
+
225
+
226
+ ```python
227
+ from bmtool.singlecell import ZAP
228
+ sim = ZAP('Cell_Cf')
229
+ X, Y = run_and_plot(sim)
230
+ plt.show()
231
+ ```
232
+
233
+ Injection location: Cell_Cf[23].soma[0](0.5)
234
+ Recording: Cell_Cf[23].soma[0](0.5)._ref_v
235
+ ZAP current simulation running...
236
+
237
+ Chirp current injection with frequency changing from 0 to 15 Hz over 15 seconds
238
+ Impedance is calculated as the ratio of FFT amplitude of membrane voltage to FFT amplitude of chirp current
239
+
240
+
241
+
242
+
243
+
244
+ ![png](readme_figures/output_14_1.png)
245
+
246
+
247
+
248
+ ### Single Cell Tuning
249
+
250
+ #### From a BMTK Model directory containing a `simulation_config.json` file:
251
+ ```bash
252
+ bmtool util cell tune --builder
253
+ ```
254
+
255
+ #### For non-BMTK cell tuning:
256
+ ```bash
257
+ bmtool util cell --template TemplateFile.hoc --mod-folder ./ tune --builder
258
+ ```
259
+ ![bmtool](./figures/figure2.png "Tuning Figure")
260
+
261
+ ### VHalf Segregation Module
262
+
263
+ #### Based on the Alturki et al. (2016) paper.
264
+
265
+ #### Segregate your channel activation for an easier time tuning your cells.
266
+
267
+
268
+ ```bash
269
+ > bmtool util cell vhseg --help
270
+
271
+ Usage: bmtool util cell vhseg [OPTIONS]
272
+
273
+ Alturki et al. (2016) V1/2 Automated Segregation Interface, simplify
274
+ tuning by separating channel activation
275
+
276
+ Options:
277
+ --title TEXT
278
+ --tstop INTEGER
279
+ --outhoc TEXT Specify the file you want the modified cell template
280
+ written to
281
+ --outfolder TEXT Specify the directory you want the modified cell
282
+ template and mod files written to (default: _seg)
283
+ --outappend Append out instead of overwriting (default: False)
284
+ --debug Print all debug statements
285
+ --fminpa INTEGER Starting FI Curve amps (default: 0)
286
+ --fmaxpa INTEGER Ending FI Curve amps (default: 1000)
287
+ --fincrement INTEGER Increment the FI Curve amps by supplied pA (default:
288
+ 100)
289
+ --infvars TEXT Specify the inf variables to plot, skips the wizard.
290
+ (Comma separated, eg: inf_mech,minf_mech2,ninf_mech2)
291
+ --segvars TEXT Specify the segregation variables to globally set,
292
+ skips the wizard. (Comma separated, eg:
293
+ mseg_mech,nseg_mech2)
294
+ --eleak TEXT Specify the eleak var manually
295
+ --gleak TEXT Specify the gleak var manually
296
+ --othersec TEXT Specify other sections that a window should be
297
+ generated for (Comma separated, eg: dend[0],dend[1])
298
+ --help Show this message and exit.
299
+
300
+ ```
301
+
302
+ ### Examples
303
+
304
+ #### Wizard Mode (Interactive)
305
+
306
+ ```bash
307
+ > bmtool util cell vhseg
308
+
309
+ ? Select a cell: CA3PyramidalCell
310
+ Using section dend[0]
311
+ ? Show other sections? (default: No) Yes
312
+ ? Select other sections (space bar to select): done (2 selections)
313
+ ? Select inf variables to plot (space bar to select): done (5 selections)
314
+ ? Select segregation variables [OR VARIABLES YOU WANT TO CHANGE ON ALL SEGMENTS at the same time] (space bar to select): done (2 selections)
315
+ ```
316
+
317
+ #### Command Mode (Non-interactive)
318
+
319
+ ```bash
320
+ bmtool util cell --template CA3PyramidalCell vhseg --othersec dend[0],dend[1] --infvars inf_im --segvars gbar_im --gleak gl_ichan2CA3 --eleak el_ichan2CA3
321
+ ```
322
+
323
+ Example:
324
+
325
+ ![bmtool](./figures/figure4.png "Seg Figure")
326
+
327
+ #### Simple models can utilize
328
+ ``` bash
329
+ bmtool util cell --hoc cell_template.hoc vhsegbuild --build
330
+ bmtool util cell --hoc segmented_template.hoc vhsegbuild
331
+ ```
332
+ ex: [https://github.com/tjbanks/two-cell-hco](https://github.com/tjbanks/two-cell-hco)
333
+
334
+ ### Connectors Module
335
+ - [UnidirectionConnector](#unidirectional-connector---unidirectional-connections-in-bmtk-network-model-with-given-probability-within-a-single-population-or-between-two-populations)
336
+ - [ReciprocalConnector](#recipical-connector---buiilding-connections-in-bmtk-network-model-with-reciprocal-probability-within-a-single-population-or-between-two-populations)
337
+ - [CorrelatedGapJunction](#correlatedgapjunction)
338
+ - [OneToOneSequentialConnector](#onetoonesequentialconnector)
339
+
340
+ #### This module contains helper functions and classes that work with BMTK's NetworkBuilder module in building networks. It facilitates building reciprocal connections, distance dependent connections, afferent connections, etc. See documentation inside the script `connectors.py` for more notes on usage.
341
+
342
+ #### All connector example below use the following network node structure
343
+ ```python
344
+ from bmtk.builder import NetworkBuilder
345
+ net = NetworkBuilder('example_net')
346
+ net.add_nodes(N=100, pop_name='PopA',model_type = 'biophysical')
347
+ net.add_nodes(N=100, pop_name='PopB',model_type = 'biophysical')
348
+
349
+ background = NetworkBuilder('background')
350
+ background.add_nodes(N=300,pop_name='tON',potential='exc',model_type='virtual')
351
+ ```
352
+
353
+ #### Unidirectional connector - unidirectional connections in bmtk network model with given probability within a single population (or between two populations)
354
+ ```python
355
+ from bmtool.connectors import UnidirectionConnector
356
+ connector = UnidirectionConnector(p=0.15, n_syn=1)
357
+ connector.setup_nodes(source=net.nodes(pop_name = 'PopA'), target=net.nodes(pop_name = 'PopB'))
358
+ net.add_edges(**connector.edge_params())
359
+ ```
360
+ #### Recipical connector - buiilding connections in bmtk network model with reciprocal probability within a single population (or between two populations
361
+ ```python
362
+ from bmtool.connectors import ReciprocalConnector
363
+ connector = ReciprocalConnector(p0=0.15, pr=0.06767705087, n_syn0=1, n_syn1=1,estimate_rho=False)
364
+ connector.setup_nodes(source=net.nodes(pop_name = 'PopA'), target=net.nodes(pop_name = 'PopA'))
365
+ net.add_edges(**connector.edge_params())
366
+ ```
367
+ #### CorrelatedGapJunction
368
+ ```python
369
+ from bmtool.connectors import ReciprocalConnector, CorrelatedGapJunction
370
+ connector = ReciprocalConnector(p0=0.15, pr=0.06, n_syn0=1, n_syn1=1, estimate_rho=False)
371
+ connector.setup_nodes(source=net.nodes(pop_name='PopA'), target=net.nodes(pop_name='PopA'))
372
+ net.add_edges(**connector.edge_params())
373
+ gap_junc = CorrelatedGapJunction(p_non=0.1228,p_uni=0.56,p_rec=1,connector=connector)
374
+ gap_junc.setup_nodes(source=net.nodes(pop_name='PopA'), target=net.nodes(pop_name='PopA'))
375
+ conn = net.add_edges(is_gap_junction=True, syn_weight=0.0000495, target_sections=None,afferent_section_id=0, afferent_section_pos=0.5,
376
+ **gap_junc.edge_params())
377
+ ```
378
+
379
+ #### OneToOneSequentialConnector
380
+ ```python
381
+ from bmtool.connectors import OneToOneSequentialConnector
382
+ connector = OneToOneSequentialConnector()
383
+ connector.setup_nodes(source=background.nodes(), target=net.nodes(pop_name = 'PopA'))
384
+ net.add_edges(**connector.edge_params())
385
+ connector.setup_nodes(target=net.nodes(pop_name = 'PopB'))
386
+ net.add_edges(**connector.edge_params())
387
+ ```
388
+
389
+ ## Bmplot Module
390
+ - [Total connections](#Total-connection-plot)
391
+ - [Percent connections](#Percent-connection-plot)
392
+ - [Convergence connnections](#convergence-plot)
393
+ - [Divergence connections](#divergence-plot)
394
+ - [connection histogram](#connection-histogram)
395
+ - [probability connection](#probability-of-connection-plot)
396
+ - [3D location](#3d-position-plot)
397
+ - [3D rotation](#cell-rotations)
398
+
399
+ ### Total connection plot
400
+ #### Generates a table of total number of connections each neuron population recieves
401
+
402
+
403
+ ```python
404
+ from bmtool import bmplot
405
+ bmplot.total_connection_matrix(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name',no_prepend_pop=True)
406
+ ```
407
+
408
+
409
+
410
+ ![png](readme_figures/output_19_0.png)
411
+
412
+
413
+
414
+ ### Percent connection plot
415
+ #### Generates a table of the percent connectivity of neuron populations.Method can change if you want the table to be total percent connectivity or only unidirectional connectivity or only bi directional connectvity
416
+
417
+
418
+ ```python
419
+ bmplot.percent_connection_matrix(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name',no_prepend_pop=True,method='total')
420
+ ```
421
+
422
+
423
+
424
+ ![png](readme_figures/output_21_0.png)
425
+
426
+
427
+
428
+ ### Convergence plot
429
+ #### Generates a table of the mean convergence of neuron populations. Method can be changed to show max,and min convergence a cell recieves and also changed to show standard deviation of convergence
430
+
431
+
432
+ ```python
433
+ bmplot.convergence_connection_matrix(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name',no_prepend_pop=True)
434
+ ```
435
+
436
+
437
+
438
+ ![png](readme_figures/output_23_0.png)
439
+
440
+
441
+
442
+ ### Divergence plot
443
+ #### Generates a table of the mean divergence of neuron populations. Method can be changed to show max,and min divergence a cell recieves and also changed to show standard deviation of divergence
444
+
445
+
446
+ ```python
447
+ bmplot.divergence_connection_matrix(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name')
448
+ ```
449
+
450
+
451
+
452
+ ![png]readme_figures/(output_25_0.png)
453
+
454
+
455
+
456
+ ### Connection histogram
457
+ #### Generates a histogram of the distribution of connections a population of cells give to individual cells of another population
458
+
459
+
460
+ ```python
461
+ bmplot.connection_histogram(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name',source_cell='PNa',target_cell='PV')
462
+ ```
463
+
464
+
465
+
466
+ ![png](readme_figures/output_27_0.png)
467
+
468
+
469
+
470
+ ### probability of connection plot
471
+ #### this function needs some work
472
+
473
+
474
+ ```python
475
+ bmplot.probability_connection_matrix(config='config.json',sources='LA',targets='LA',tids='pop_name',sids='pop_name',no_prepend_pop=True,line_plot=True)
476
+ ```
477
+
478
+
479
+
480
+
481
+
482
+
483
+ ![png](readme_figures/output_29_1.png)
484
+
485
+
486
+
487
+
488
+
489
+ ![png](readme_figures/output_29_2.png)
490
+
491
+
492
+
493
+ ### 3D position plot
494
+ #### Generates a plot of cells positions in 3D space
495
+
496
+
497
+ ```python
498
+ bmplot.plot_3d_positions(config='config.json',populations_list='LA',group_by='pop_name',save_file=False)
499
+ ```
500
+
501
+
502
+
503
+ ![png](readme_figures/output_31_0.png)
504
+
505
+
506
+
507
+ ### cell rotations
508
+ #### Generates a plot of cells location in 3D plot and also the cells rotation
509
+
510
+
511
+ ```python
512
+ bmplot.cell_rotation_3d(config='config2.json',populations_list='all',group_by='pop_name',save_file=False,quiver_length=20,arrow_length_ratio=0.25,max_cells=100)
513
+ ```
514
+
515
+
516
+
517
+ ![png](readme_figures/output_33_0.png)
518
+
519
+