示例#1
0
    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)
示例#2
0
 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)
示例#3
0
 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
示例#4
0
    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)
示例#5
0
# 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)
示例#6
0
            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))
示例#7
0
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)'

示例#9
0
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)
示例#10
0
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),