NMDAR & GABAB/KIR Give Bistable Dendrites: Working Memory & Sequence Readout (Sanders et al., 2013)

 Download zip file 
Help downloading and running models
Accession:169985
" ...Here, we show that the voltage dependence of the inwardly rectifying potassium (KIR) conductance activated by GABA(B) receptors adds substantial robustness to network simulations of bistability and the persistent firing that it underlies. The hyperpolarized state is robust because, at hyperpolarized potentials, the GABA(B)/KIR conductance is high and the NMDA conductance is low; the depolarized state is robust because, at depolarized potentials, the NMDA conductance is high and the GABA(B)/KIR conductance is low. Our results suggest that this complementary voltage dependence of GABA(B)/KIR and NMDA conductances makes them a "perfect couple" for producing voltage bistability."
References:
1 . Sanders H, Berends M, Major G, Goldman MS, Lisman JE (2013) NMDA and GABAB (KIR) conductances: the "perfect couple" for bistability. J Neurosci 33:424-9 [PubMed]
2 . Sanders H, Kolterman BE, Shusterman R, Rinberg D, Koulakov A, Lisman J (2014) A network that performs brute-force conversion of a temporal sequence to a spatial pattern: relevance to odor recognition. Front Comput Neurosci 8:108 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Hodgkin-Huxley neuron;
Channel(s): I K; I Na, leak; Kir;
Gap Junctions:
Receptor(s): GabaA; GabaB; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: C or C++ program;
Model Concept(s): Working memory; Dendritic Bistability;
Implementer(s): Sanders, Honi [honi at brandeis.edu];
Search NeuronDB for information about:  GabaA; GabaB; AMPA; NMDA; I K; I Na, leak; Kir; Gaba; Glutamate;
/*
 *  network.h
 *  stnetwork
 *
 *  Created by Honi Sanders on 8/30/12.
 *  Copyright 2012 Brandeis University. All rights reserved.
 *
 */

#ifndef NEWNETWORK_H
#ifndef STNETWORK_H
#ifndef NETWORK_H
#define NETWORK_H

#include <cmath>
#include <valarray>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <string>
#include <cstring>
#include <ctime>
#include <map>
// // if not debugging:
// #define NDEBUG
#include <assert.h>
using namespace std;



class Neuron {
private:
	char celltype[4];	// exc or inh
	double V_s;			// Somatic voltage
	double V_d;			// Dendritic voltage
	int spike;			// did it spike? 1 or 0
	double AMPA;		// postsynaptic activation of AMPA receptors
	double NMDA;		// postsynaptic activation of NMDA receptors
	double GABAA;		// postsynaptic activation of GABAA receptors
	double GABAB;		// postsynaptic activation of GABAB receptors
	double T,R,D,G,B;	// [GABA], activated & desensitized GABABR, [G protein] for GIRK
	double g_refr;		// refractory conductance
	bool inact;			// inactivation of Na+ channels
	char input;				// are input synapses onto dendrite 'd' or soma 's'
	char inhibition;		// are inhibitory synapses onto dendrite 'd' or soma 's'
	double gating[4];	// m, h, n for HH equations and x for synaptic gating
	void spiking();
	double vdepend(double g, char type); // type is 'N' for NMDA or 'G' for GABAB
	double compartmentstep(char compartment, double V, valarray<double> g, 
								  double g_in, double V_coupling, double I_ext, double g_PING);
	void EIFstep(double g_AMPA, double g_NMDA, double g_GABAA, double g_GABAB, 
					 double g_in, double I_ext, double g_PING);
	void HHstep(double g_AMPA, double g_NMDA, double g_GABAA, double g_GABAB, 
					double g_in, double I_ext, double g_PING);
public:
	Neuron();			// default constructor
	Neuron(const char ty[], const char inputset, const char inhibitionset);		// constructor
	void initialize(const char ty[], const char inputset='s', const char inhibitionset='s');
	void fillwstats(double arr[7]);	// fills arr w/ V_s, V_d, spike, AMPA, NMDA, GABAA, GABAB
	void step(double g_AMPA, double g_NMDA, double g_GABAA, double g_GABAB,
				 double g_in, double I_ext=0, double g_PING=0);
};



class Network {
private:
	size_t N;							// # of neurons in network
	size_t N_E;							// # of excitatory neurons
	size_t N_I;							// # of inhibitory neurons
	size_t N_in;						// # of incoming axons		
	valarray<double> w_AMPA;	// weights of local excitatory synapses
	valarray<double> w_NMDA;	// weights of local excitatory synapses
	valarray<double> w_GABAA;	// weights of local inhibitory synapses
	valarray<double> w_GABAB;	// weights of local inhibitory synapses
	valarray<double> w_in;		// weights of input synapses
	valarray<double> w_ffAMPA;	// weights of feedforward (buffer-buffer) synapses
	valarray<double> w_ffNMDA;	// weights of feedforward (buffer-buffer) synapses
public:
	Network();				// default constructor
	Network(const size_t N_A, const size_t N_input, const double connectivity,
			  const char inputset, const char inhibitionset);	// constructor
	Network(const size_t N_A, const valarray<double>& w_input, const double connectivity,
			  const char inputset, const char inhibitionset);	// constructor
	void initialize(const size_t N_A, const size_t N_input, const double connectivity,
						 const char inputset, const char inhibitionset);
	void initialize(const size_t N_A, const valarray<double>& w_input, const double connectivity,
						 const char inputset, const char inhibitionset);
	void fillwsize(size_t arr[]);
	Neuron* allneurons;		// array with all of the neurons in the network
	void step(const valarray<double> syn_in, const double I_exts[]);
	void step(const valarray<double>& syn_in, const valarray<double>& syn_ff, 
				 const double I_exts[], const double g_PING=0);
};

// time in ms, voltage in mV

#define Cm		10 			//Membrane Capacitance 		in nF/mm2
#define g_L		1			//Leak Conductance			in uS/mm2		
#define g_refr_max	50	//Refractory Conductance	     "
#define g_c 1 //changed from 10			//Soma-Dendrite Coupling Conductance "
//#define p	0.5			//directionality of Soma-Dendrite Coupling
#define	g_Na	450  // changed from 450		// Sodium Conductance for HH
#define g_K		180	 // changed from 180	// Potassium Conductance for HH
#define Delta	3.5			//Constant for EIF

#define kf	12			// synaptic opening variable in kHz (AMPA and GABAA)
#define kr	1			// synaptic closing variable in kHz (AMPA)
#define beta 0.1		// synaptic closing variable in kHz (GABAA)

#define E_L	-80				// leak reversal potential in mV
#define E_g_E	0			// excitatory  "			"
#define E_g_I	-70			// inhibitory  "			"
#define E_Na	55			// Sodium		"			"	(for HH)
#define E_K		-90			// Potassium	"			"		"  and refractory reversal for EIF
#define Phi_m	2.5			// Temperature Factors				"
#define Phi_h	2.5			
#define Phi_n	5			


#define tau_AMPA	2		// time constant of AMPA channel closing in ms
#define tau_NMDA	100		//	"	of NMDA				"			"
#define tau_GABAA	10		//	"	of GABAA			"			"
#define tau_GABAB	250		//	"	of GABAB			"			"
#define tau_refrI	1		//	"	of refractory current in I-cells
#define tau_refrE	2		//	"		"	      in E-cells

#define thresh	-55			// spiking threshold
#define reset	-70			// reset potential after spike
#define peak	50			// spike peak potential
#define alpha	0.5			// ratio of unactivated receptors activated by spike
#define alpha_GABAB	0.03	//	"			"	GABAB	"			"		"

#define Mg	0.5			//[Mg2+] in mM



#define V_init -70		// initial voltage
#define s_init	0		// initial synaptic activation



#define dt	0.025			//length of time step in ms



#define w_noise	0.5		// variance of noise over a millisecond (uS/mm2)
#define scale	g_L



#define ratio	4				//ratio:1::excitatory:inhibitory neurons



#define eps	0.000000000000001
#define pi	3.141592653589793



double doubrand(double minimum=0, double maximum=1); 	// random double between minimum and maximum
double normrand(double mean=0, double std=1);	// normally distributed random double
double rectify(double x);								// =x if x>0, =0 if x<0
valarray<double> connect(valarray<double>& w, double connection);	
// changes valarray to a connection matrix with connection probability of "connection"
void outputvalarray(valarray<double> arr, size_t Nrows, size_t Ncols,
						  string filename = "./results/array.dsv");
void outputvalarray(valarray<int> arr, size_t Nrows, size_t Ncols,
						  string filename = "./results/array.dsv");
void outputvalarray(valarray<bool> arr, size_t Nrows, size_t Ncols,
						  string filename = "./results/array.dsv");
valarray<double> loadvalarray(string filename, size_t Nrows, size_t Ncols);
valarray<double> valarraysort(valarray<double> &arr);




#endif
#endif
#endif

Loading data, please wait...