def test_place_pwlin_id(self): # Single branch, discontiguous segments. s0p = A.mpoint(0, 0, 0, 10) s0d = A.mpoint(1, 0, 0, 10) s1p = A.mpoint(3, 0, 0, 10) s1d = A.mpoint(4, 0, 0, 10) tree = A.segment_tree() i = tree.append(A.mnpos, s0p, s0d, 1) tree.append(i, s1p, s1d, 2) m = A.morphology(tree) place = A.place_pwlin(m) L0 = place.at(A.location(0, 0)) L0s = place.all_at(A.location(0, 0)) self.assertEqual(s0p, L0) self.assertEqual([s0p], L0s) Lhalf = place.at(A.location(0, 0.5)) Lhalfs = place.all_at(A.location(0, 0.5)) self.assertTrue(s0d == Lhalf or s1p == Lhalf) self.assertTrue([s0d, s1p] == Lhalfs) Chalf = [(s.prox, s.dist) for s in place.segments([A.cable(0, 0., 0.5)])] self.assertEqual([(s0p, s0d)], Chalf) Chalf_all = [(s.prox, s.dist) for s in place.all_segments([A.cable(0, 0., 0.5)])] self.assertEqual([(s0p, s0d), (s1p, s1p)], Chalf_all)
def __init__(self): A.recipe.__init__(self) st = A.segment_tree() i = st.append(A.mnpos, (0, 0, 0, 10), (1, 0, 0, 10), 1) st.append(i, (1, 3, 0, 5), 1) st.append(i, (1, -4, 0, 3), 1) self.the_morphology = A.morphology(st) self.the_cat = A.default_catalogue() self.the_props = A.neuron_cable_properties() self.the_props.register(self.the_cat)
def create_individual(self): fit, swc, ref = self.fns import pandas as pd segment_tree = arb.load_swc_allen(swc, no_gaps=False) self.morphology = arb.morphology(segment_tree) self.labels = arb.label_dict({ 'soma': '(tag 1)', 'axon': '(tag 2)', 'dend': '(tag 3)', 'apic': '(tag 4)', 'center': '(location 0 0.5)' }) self.reference = pd.read_csv(ref)['U/mV'].values * 1000.0 self.defaults, self.regions, self.ions, mechs = load_allen_fit(fit) # randomise mechanisms result = {} for r, m, vs in mechs: for k, _ in vs.items(): result[f"{r}.{m}.{k}"] = rand(-1.0, +1.0) return result
def test_place_pwlin_isometry(self): # Single branch, discontiguous segments. s0p = A.mpoint(0, 0, 0, 10) s0d = A.mpoint(1, 0, 0, 10) s1p = A.mpoint(3, 0, 0, 10) s1d = A.mpoint(4, 0, 0, 10) tree = A.segment_tree() i = tree.append(A.mnpos, s0p, s0d, 1) tree.append(i, s1p, s1d, 2) m = A.morphology(tree) iso = A.isometry.translate(2, 3, 4) place = A.place_pwlin(m, iso) x0p = iso(s0p) x0d = iso(s0d) x1p = iso(s1p) x1d = iso(s1d) L0 = place.at(A.location(0, 0)) L0s = place.all_at(A.location(0, 0)) self.assertEqual(x0p, L0) self.assertEqual([x0p], L0s) Lhalf = place.at(A.location(0, 0.5)) Lhalfs = place.all_at(A.location(0, 0.5)) self.assertTrue(x0d == Lhalf or x1p == Lhalf) self.assertTrue([x0d, x1p] == Lhalfs) Chalf = [(s.prox, s.dist) for s in place.segments([A.cable(0, 0., 0.5)])] self.assertEqual([(x0p, x0d)], Chalf) Chalf_all = [(s.prox, s.dist) for s in place.all_segments([A.cable(0, 0., 0.5)])] self.assertEqual([(x0p, x0d), (x1p, x1p)], Chalf_all)
# The morphology used for all of the region/locset illustrations label_tree = arbor.segment_tree() label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint( 4, 0.0, 0, 2.0), tag=1) label_tree.append(0, mpoint(4, 0.0, 0, 0.8), mpoint( 8, 0.0, 0, 0.8), tag=3) label_tree.append(1, mpoint(8, 0.0, 0, 0.8), mpoint(12, -0.5, 0, 0.8), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.8), mpoint(20, 4.0, 0, 0.4), tag=3) label_tree.append(3, mpoint(20, 4.0, 0, 0.4), mpoint(26, 6.0, 0, 0.2), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.5), mpoint(19, -3.0, 0, 0.5), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(24, -7.0, 0, 0.2), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(23, -1.0, 0, 0.2), tag=3) label_tree.append(7, mpoint(23, -1.0, 0, 0.2), mpoint(26, -2.0, 0, 0.2), tag=3) label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint(-7, 0.0, 0, 0.4), tag=2) label_tree.append(9, mpoint(-7, 0.0, 0, 0.4), mpoint(-10, 0.0, 0, 0.4), tag=2) label_morph = arbor.morphology(label_tree) # The label morphology with some gaps (at start of dendritic tree and remove the axon hillock) label_tree = arbor.segment_tree() label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint( 4, 0.0, 0, 2.0), tag=1) label_tree.append(0, mpoint(5, 0.0, 0, 0.8), mpoint( 8, 0.0, 0, 0.8), tag=3) label_tree.append(1, mpoint(8, 0.0, 0, 0.8), mpoint(12, -0.5, 0, 0.8), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.8), mpoint(20, 4.0, 0, 0.4), tag=3) label_tree.append(3, mpoint(20, 4.0, 0, 0.4), mpoint(26, 6.0, 0, 0.2), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.5), mpoint(19, -3.0, 0, 0.5), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(24, -7.0, 0, 0.2), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(23, -1.0, 0, 0.2), tag=3) label_tree.append(7, mpoint(23, -1.0, 0, 0.2), mpoint(26, -2.0, 0, 0.2), tag=3) label_tree.append(mnpos, mpoint(-2, 0.0, 0, 0.4), mpoint(-10, 0.0, 0, 0.4), tag=2) detached_morph = arbor.morphology(label_tree)
new.append(parent=p, x=s.loc.x, y=s.loc.y, z=s.loc.z, radius=s.loc.radius, tag=s.tag) else: if p_axon is None: p_axon = p x0, y0, z0 = s.loc.x, s.loc.y, s.loc.z x1, y1, z1 = s.loc.x, s.loc.y, s.loc.z axon = new.append(p_axon, x0, y0, z0, 1, 2) new.append(axon, x0 + 60 + tree.samples[0].loc.radius, y0, z0, 1, 2) morph = arbor.morphology(tree, spherical_root=True) # Label regions labels = arbor.label_dict({ 'soma': '(tag 1)', 'axon': '(tag 2)', 'dend': '(tag 3)', 'apic': '(tag 4)', 'center': '(location 0 0.5)' }) # Build cell and attach Clamp and Detector cell = arbor.cable_cell(tree, labels) cell.place('center', arbor.iclamp(200, 1200, i)) cell.place('center', arbor.spike_detector(-40))
def run_arb(fit, swc, current, t_start, t_stop): tree = arbor.load_swc_allen(swc, no_gaps=False) # Load mechanism data with open(fit) as fd: fit = json.load(fd) ## collect parameters in dict mechs = defaultdict(dict) ### Passive parameters ra = float(fit['passive'][0]['ra']) ### Remaining parameters for block in fit['genome']: mech = block['mechanism'] or 'pas' region = block['section'] name = block['name'] if name.endswith('_' + mech): name = name[:-(len(mech) + 1)] mechs[(mech, region)][name] = float(block['value']) # Label regions labels = arbor.label_dict({ 'soma': '(tag 1)', 'axon': '(tag 2)', 'dend': '(tag 3)', 'apic': '(tag 4)', 'center': '(location 0 0.5)' }) properties = fit['conditions'][0] T = properties['celsius'] + 273.15 Vm = properties['v_init'] # Run simulation morph = arbor.morphology(tree) # Build cell and attach Clamp and Detector cell = arbor.cable_cell(morph, labels) cell.place('center', arbor.iclamp(t_start, t_stop - t_start, current)) cell.place('center', arbor.spike_detector(-40)) cell.compartments_length(20) # read json file and proceed to set parameters and mechanisms # set global values print('Setting global parameters') print(f" * T = {T}K = {T - 273.15}C") print(f" * Vm = {Vm}mV") cell.set_properties(tempK=T, Vm=Vm, rL=ra) # Set reversal potentials print("Setting reversal potential for") for kv in properties['erev']: region = kv['section'] for k, v in kv.items(): if k == 'section': continue ion = k[1:] print(f' * region {region:6} species {ion:5}: {v:10}') cell.paint(region, arbor.ion(ion, rev_pot=float(v))) cell.set_ion('ca', int_con=5e-5, ext_con=2.0, method=arbor.mechanism('default_nernst/x=ca')) # Setup mechanisms and parameters print('Setting up mechanisms') ## Now paint the cell using the dict for (mech, region), vs in mechs.items(): print(f" * {region:10} -> {mech:10}: {str(vs):>60}", end=' ') try: if mech != 'pas': m = arbor.mechanism(mech, vs) cell.paint(region, m) else: m = arbor.mechanism('default_pas', { 'e': vs['e'], 'g': vs['g'] }) cell.paint(region, m) cell.paint(region, cm=vs["cm"] / 100, rL=vs["Ra"]) print("OK") except Exception as e: print("ERROR") print("When trying to set", mech, vs) print(" ->", e) exit() # Run the simulation, collecting voltages print('Simulation', end=' ') default = arbor.default_catalogue() catalogue = arbor.allen_catalogue() catalogue.extend(default, 'default_') model = arbor.single_cell_model(cell) model.properties.catalogue = catalogue model.probe('voltage', 'center', frequency=200000) model.run(tfinal=t_start + t_stop, dt=1000 / 200000) print('DONE') for t in model.traces: ts = t.time[:] vs = t.value[:] break spikes = np.array(model.spikes) count = len(spikes) print('Counted spikes', count) return np.array(ts), np.array(vs) + 14
# describe neurite_3 (tag 3) attached to axon # naming of segments neur3_x_y with neur3 = neurite 3, x = number of neurite segment, y = neuroML segment ID neur3_0_22 = tree.append(a14_21, arbor.mpoint(-5.000000e-01, -2.321750e+02, 4.900000e+01, 0.5836462148750231 / 2), arbor.mpoint(-7.000000e-01, -2.325000e+02, 4.910000e+01, 0.5836462148750231 / 2), tag=3) neur3_1_23 = tree.append(neur3_0_22, arbor.mpoint(-7.000000e-01, -2.363500e+02, 5.060000e+01, 0.5836462148750231 / 2), tag=3) neur3_2_24 = tree.append(neur3_1_23, arbor.mpoint(-7.000000e-01, -2.377500e+02, 5.105000e+01, 0.5836462148750231 / 2), tag=3) # describe neurite_4 (tag 4) attached to axon # naming of segments neur4_x_y with neur4 = neurite 4, x = number of neurite segment, y = neuroML segment ID neur4_0_25 = tree.append(a14_21, arbor.mpoint(-5.000000e-01, -2.321750e+02, 4.900000e+01, 0.5747685124121756 / 2), arbor.mpoint(-7.000000e-01, -2.318500e+02, 4.890000e+01, 0.5747685124121756 / 2), tag=4) neur4_1_26 = tree.append(neur4_0_25, arbor.mpoint(-7.000000e-01, -2.107500e+02, 4.070000e+01, 0.5747685124121756 / 2), tag=4) neur4_2_27 = tree.append(neur4_1_26, arbor.mpoint(-7.000000e-01, -2.059500e+02, 3.770000e+01, 0.5747685124121756 / 2), tag=4) neur4_3_28 = tree.append(neur4_2_27, arbor.mpoint(-7.000000e-01, -1.762500e+02, 1.840000e+01, 0.5747685124121756 / 2), tag=4) neur4_4_29 = tree.append(neur4_3_28, arbor.mpoint(-7.000000e-01, -1.740500e+02, 1.700000e+01, 0.5747685124121756 / 2), tag=4) # (1.2) Create cell morphology from segment tree. morph = arbor.morphology(tree) # (2) Create and populate the label dictionary. labels = arbor.label_dict() # Regions labels['soma'] = '(tag 0)' labels['axon'] = '(tag 1)' labels['dend_2'] = '(tag 2)' labels['neur_3'] = '(tag 3)' labels['neur_4'] = '(tag 4)' labels['center'] = '(location 0 0.5)' labels['all'] = '(all)'
import utils, arbor as arb # !\circled{1}! read in geometry segment_tree = arb.load_swc_allen('cell.swc', no_gaps=False) morphology = arb.morphology(segment_tree) # !\circled{2}! assign names to regions defined by SWC and center of soma labels = arb.label_dict({'soma': '(tag 1)', 'axon': '(tag 2)', 'dend': '(tag 3)', 'apic': '(tag 4)', 'center': '(location 0 0.5)'}) cell = arb.cable_cell(morphology, labels) # see !\circled{3}! cell.compartments_length(20) # discretisation strategy: max compartment length # !\circled{4}! load and assign electro-physical parameters defaults, regions, ions, mechanisms = utils.load_allen_fit('fit.json') # set defaults and override by region cell.set_properties(tempK=defaults.tempK, Vm=defaults.Vm, cm=defaults.cm, rL=defaults.rL) for region, vs in regions: cell.paint('"'+region+'"', tempK=vs.tempK, Vm=vs.Vm, cm=vs.cm, rL=vs.rL) # set reversal potentials for region, ion, e in ions: cell.paint('"'+region+'"', ion, rev_pot=e) cell.set_ion('ca', int_con=5e-5, ext_con=2.0, method=arb.mechanism('nernst/x=ca')) # assign ion dynamics for region, mech, values in mechanisms: cell.paint('"'+region+'"', arb.mechanism(mech, values)) print(mech) # !\circled{5}! attach stimulus and spike detector cell.place('"center"', arb.iclamp(200, 1000, 0.15)) cell.place('"center"', arb.spike_detector(-40)) # !\circled{6}! set up runnable simulation model = arb.single_cell_model(cell)
label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint(4, 0.0, 0, 2.0), tag=1) label_tree.append(0, mpoint(4, 0.0, 0, 0.8), mpoint(8, 0.0, 0, 0.8), tag=3) label_tree.append(1, mpoint(8, 0.0, 0, 0.8), mpoint(12, -0.5, 0, 0.8), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.8), mpoint(20, 4.0, 0, 0.4), tag=3) label_tree.append(3, mpoint(20, 4.0, 0, 0.4), mpoint(26, 6.0, 0, 0.2), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.5), mpoint(19, -3.0, 0, 0.5), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(24, -7.0, 0, 0.2), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(23, -1.0, 0, 0.2), tag=3) label_tree.append(7, mpoint(23, -1.0, 0, 0.2), mpoint(26, -2.0, 0, 0.2), tag=3) label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint(-7, 0.0, 0, 0.4), tag=2) label_tree.append(9, mpoint(-7, 0.0, 0, 0.4), mpoint(-10, 0.0, 0, 0.4), tag=2) label_morph = arbor.morphology(label_tree) # The label morphology with some gaps (at start of dendritic tree and remove the axon hillock) label_tree = arbor.segment_tree() label_tree.append(mnpos, mpoint(0, 0.0, 0, 2.0), mpoint(4, 0.0, 0, 2.0), tag=1) label_tree.append(0, mpoint(5, 0.0, 0, 0.8), mpoint(8, 0.0, 0, 0.8), tag=3) label_tree.append(1, mpoint(8, 0.0, 0, 0.8), mpoint(12, -0.5, 0, 0.8), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.8), mpoint(20, 4.0, 0, 0.4), tag=3) label_tree.append(3, mpoint(20, 4.0, 0, 0.4), mpoint(26, 6.0, 0, 0.2), tag=3) label_tree.append(2, mpoint(12, -0.5, 0, 0.5), mpoint(19, -3.0, 0, 0.5), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(24, -7.0, 0, 0.2), tag=3) label_tree.append(5, mpoint(19, -3.0, 0, 0.5), mpoint(23, -1.0, 0, 0.2), tag=3) label_tree.append(7, mpoint(23, -1.0, 0, 0.2), mpoint(26, -2.0, 0, 0.2), tag=3) label_tree.append(mnpos, mpoint(-2, 0.0, 0, 0.4), mpoint(-10, 0.0, 0, 0.4),