Dynamic dopamine modulation in the basal ganglia: Learning in Parkinson (Frank et al 2004,2005)

 Download zip file 
Help downloading and running models
See README file for all info on how to run models under different tasks and simulated Parkinson's and medication conditions.
1 . Frank MJ (2005) Dynamic dopamine modulation in the basal ganglia: a neurocomputational account of cognitive deficits in medicated and nonmedicated Parkinsonism. J Cogn Neurosci 17:51-72 [PubMed]
2 . Frank MJ, Seeberger LC, O'reilly RC (2004) By carrot or by stick: cognitive reinforcement learning in parkinsonism. Science 306:1940-3 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Basal ganglia;
Cell Type(s): Neostriatum medium spiny direct pathway neuron;
Channel(s): I Na,t; I K,leak; I Cl,Ca;
Gap Junctions:
Receptor(s): D1; D2; Glutamate; Gaba;
Transmitter(s): Dopamine; Gaba; Glutamate;
Simulation Environment: Emergent/PDP++;
Model Concept(s): Simplified Models; Synaptic Plasticity; Pathophysiology; Rate-coding model neurons; Parkinson's; Reinforcement Learning; Action Selection/Decision Making; Hebbian plasticity;
Implementer(s): Frank, Michael [mfrank at u.arizona.edu];
Search NeuronDB for information about:  Neostriatum medium spiny direct pathway neuron; D1; D2; Glutamate; Gaba; I Na,t; I K,leak; I Cl,Ca; Dopamine; Gaba; Glutamate;

int snc_size = .layers.SNc.units.size;
float k = 1.0*.processes.Train_Prob.init_procs[3].s_args[0]/.layers.SNc.n_units;
UnitSpec* us = .specs.FixedBiasUnitSpec.LearnBiasUnitSpec.matrisom_unitspec;

int max_monval = .processes.Cycle_Prob.final_stats.size;
int j;
for (j=0;j<max_monval;j++) .processes.Cycle_Prob.final_stats[j].mod.flag=0;

if ((k>0)&&(owner[0].se.val<0.5)) {
  int i; 
  for (i=0;i<snc_size;i++) {
//DA on Rew
   .layers.SNc.units[i].ext=100.0; // ext of 100 just ensures that SNc units get maximally active during DA bursts

  us.act.gain=k*10000; // bigger gain (for D1 contrast effect)
  //  us.act.thr=0.25+k*.01;


else {

int i;
 for (i=0;i<snc_size;i++) {
   owner.owner.cur_event.patterns[2].value[i]=0; //No DA

 us.act.gain=600-k*300; // smaller gain (contrast)


.processes.Settle_Prob.cycle.max=30; // burst/dip shouldn't last that long!

float act0 = .layers."Motor Cortex".units[0].act_m;
float act1 = .layers."Motor Cortex".units[1].act_m;

// check to see which motor resp was most active in minus phase and clamp on in plus phase

if (act0 > act1) {
  owner.owner.cur_event.patterns[3].value[0] = 1.0;
  owner.owner.cur_event.patterns[3].value[1] = 0;
  owner.owner.cur_event.patterns[3].value[2] = 1.0;
  owner.owner.cur_event.patterns[3].value[3] = 0;

if (act1 > act0) {
  owner.owner.cur_event.patterns[3].value[0] = 0;
  owner.owner.cur_event.patterns[3].value[1] = 1.0;
  owner.owner.cur_event.patterns[3].value[2] = 0;
  owner.owner.cur_event.patterns[3].value[3] = 1.0;


Loading data, please wait...