def ev(self, time): ''' set odors stimulation intensity ''' model = getmodel() for gid, cell in model.mitrals.items(): if gidfunc.ismitral(gid): g_e_baseline = params.orn_g_mc_baseline std_e = params.orn_g_mc_std g_e_max = params.orn_g_mc_max else: g_e_baseline = params.orn_g_mt_baseline std_e = params.orn_g_mt_std g_e_max = params.orn_g_mt_max if h.section_exists("tuftden", 0, cell): for i in range(int(cell.ornsyn.count())): cell.ornsyn.o(i).cc_peak = self.w_odor[mgid2glom(gid)] cell.ornsyn.o(i).g_e_baseline = g_e_baseline cell.ornsyn.o(i).g_e_max = g_e_max cell.ornsyn.o(i).std_e = std_e for nc in self.netcons.values(): nc.event(h.t) if self.verbose and rank == 0: print 'activation of %s at %g (ms)\tinterval %g' % ( self.odorname, time, self.next_invl) # set up for next sniff self.next_invl = self.rng_act.repick() if (time + self.next_invl) < (self.start + self.dur): h.cvode.event(time + self.next_invl, (self.ev, (time + self.next_invl, )))
def mkmitral(gid): if ismitral(gid): nrn = genMitral(gid) m = h.Mitral(gid) else: nrn = genMTufted(gid) m = h.mTufted(gid) m.createsec(len(nrn.dend), len(nrn.tuft)) for i, d in enumerate(nrn.dend): if d.parent == nrn.soma[0]: m.secden[i].connect(m.soma(.5)) else: index = nrn.dend.index(d.parent) m.secden[i].connect(m.secden[index](1)) m.geometry() # again to get the hillock stylized shape fillall(nrn, m) m.subsets() m.topol() # need to connect secondary dendrites explicitly m.segments( ) # again to get the proper number of segments for tuft and secden m.memb() m.setup_orns(gid, params.stream_orn_w) if ismitral(gid): orn_g_std = params.orn_g_mc_std orn_g_baseline = params.orn_g_mc_baseline orn_g_max = params.orn_g_mc_max elif ismtufted(gid): orn_g_std = params.orn_g_mt_std orn_g_baseline = params.orn_g_mt_baseline orn_g_max = params.orn_g_mt_max for i in range(int(m.ntuft)): m.ornsyn.o(i).g_e_baseline = orn_g_baseline m.ornsyn.o(i).std_e = orn_g_std m.ornsyn.o(i).g_e_max = orn_g_max if mgid2glom(gid) in params.vclamp: m.vcinit() return m
def __init__(self, mgid, blanesgid, w=None): self.mgid = mgid self.blanes_gid = blanesgid self.blanes_cell = getmodel().blanes[blanesgid] rng = params.ranstream(blanesgid, params.stream_blanes + gidfunc.mgid2glom(mgid)) ibranch = int(rng.discunif(0, self.blanes_cell.nden0 - 1)) idend = int(rng.discunif(0, self.blanes_cell.nden1 - 1)) x = rng.uniform(0, 1) self.syn = h.Exp2Syn(self.blanes_cell.dend[ibranch][idend](x)) self.syn.e = 0 self.syn.tau1 = 1 self.syn.tau2 = 250 self.nc = pc.gid_connect(mgid, self.syn) if w: self.nc.weight[0] = w else: self.nc.weight[0] = params.mt2bc_exc_gmax self.nc.delay = 1 self.gid = gidfunc.mbs_gid(mgid, blanesgid)
def init(): data = {} for uid in range(nhost): data.update({ uid:(getmodel().mitrals.keys()) }) data = a2a.all2all(data) mgids = [] for _mgids in data.values(): mgids += _mgids mgids = set(mgids) # initialize source for mgid in getmodel().mitrals.keys(): mpriden = split.mpriden(mgid) if not mpriden: continue rgj = params.ranstream(mgid, params.stream_gap_junction) mpriden.push() secref = h.SectionRef() h.pop_section() h.mk_gj_src(pc, mgid, secref) glomid = mgid2glom(mgid) sistergids = [] # no longer all to all, only a chain if not (ismtufted(mgid) and (mgid - nmi) % nmt == (nmt - 1)): if ismitral(mgid) and mgid % nmxg == (nmxg - 1): sistergids += [glomid * nmt + nmi] else: sistergids += [mgid + 1] if not (ismitral(mgid) and mgid % nmxg == 0): if ismtufted(mgid) and (mgid - nmi) % nmt == 0: sistergids += [(glomid + 1) * nmxg - 1] else: sistergids += [mgid - 1] sistergids = mgids.intersection(range(glomid * nmxg, glomid * nmxg + nmxg) + range(glomid * nmt + nmi, glomid * nmt + nmt + nmi)).difference([ mgid ]) for sistermgid in sistergids: gap = h.Gap(mpriden(0.99)) if ismitral(mgid) and ismitral(sistermgid): gap.g = rgj.uniform(gj_min_g1, gj_max_g1) elif ismtufted(mgid) and ismtufted(sistermgid): gap.g = rgj.uniform(gj_min_g3, gj_max_g3) else: gap.g = rgj.uniform(gj_min_g2, gj_max_g2) getmodel().gj[(mgid, sistermgid)] = gap pc.barrier() # initialize targets for key, gap in getmodel().gj.items(): mgid, sistermgid = key pc.target_var(gap, gap._ref_vgap, sistermgid) util.elapsed('Gap junctions built')
def __init__(self, odorname, start, dur, conc): ''' Specifies the odor for an OdorStim. Note that the OdorStim is activated with setup which can only be called after the mitrals dict exists (usually from determine_connections.py). ''' if rank == 0: print("OdorStim %s start=%g dur=%g conc=%g" % (odorname, start, dur, conc)) self.odorname = odorname self.start = start self.dur = dur self.conc = conc self.verbose = True self.next_invl = 0 if params.glomerular_layer == 0: self.w_odor = odors.odors[odorname].getORNs(conc) # odor vector elif params.glomerular_layer == 1: self.w_odor = odors.odors[odorname].afterPG_1(conc) # odor vector elif params.glomerular_layer == 2: self.w_odor = odors.odors[odorname].afterPG_2(conc) # odor vector # set up the netcons to stimulate the ORNs self.netcons = {} if not use_OdorStimHelper: self.rng_act = params.ranstream(0, params.stream_orn_act) self.rng_act.uniform(params.sniff_invl_min, params.sniff_invl_max) model = getmodel() self.src = None if use_OdorStimHelper or allow_prcellstate_debug: src = h.OdorStimHelper() src.start = start src.dur = dur src.invl_min = params.sniff_invl_min src.invl_max = params.sniff_invl_max src.noiseFromRandom123(0, params.stream_orn_act, 0) self.src = src for gid, cell in model.mitrals.items(): peak = self.w_odor[mgid2glom(gid)] if gidfunc.ismitral(gid): g_e_baseline = params.orn_g_mc_baseline std_e = params.orn_g_mc_std g_e_max = params.orn_g_mc_max else: g_e_baseline = params.orn_g_mt_baseline std_e = params.orn_g_mt_std g_e_max = params.orn_g_mt_max if h.section_exists("tuftden", 0, cell): for i in range(int(cell.ornsyn.count())): nc = h.NetCon(self.src, cell.ornsyn.o(i)) self.netcons[(gid, i)] = nc # NetCon weights are peak, base, gemax, stde nc.weight[0] = peak nc.weight[1] = g_e_baseline nc.weight[2] = g_e_max nc.weight[3] = std_e nc.delay = 0.0 if use_OdorStimHelper: pass else: self.fih = h.FInitializeHandler(0, (self.init_ev, (start, )))