A computational model of oxytocin modulation of olfactory recognition memory (Linster & Kelsch 2019)

 Download zip file 
Help downloading and running models
Accession:257940
Model of olfactory bulb (OB) and anterior olfactory nucleus (AON) pyramidal cells. Includes olfactory sensory neurons, mitral cells, periglomerular, external tufted and granule interneurons and pyramidal cells. Can be built to include a feedback loop between OB and AON. Output consists of voltage and spikes over time in all neurons. Model can be stimulated with simulated odorants. The code submitted here has served for a number of modeling explorations of olfactory bulb and cortex. The model architecture is defined in "bulb.dat" with synapses defined in "channels.dat". The main function to run the model can be found in "neuron.c". Model architecture is constructed in "set.c" from types defined in "sim.c". A make file to create an executable is located in "neuron.mak".
Reference:
1 . Linster C, Kelsch W (2019) A computational model of oxytocin modulation of olfactory recognition memory. eNeuro [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main interneuron granule TC GABA cell; Olfactory bulb main tufted cell external;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program;
Model Concept(s):
Implementer(s): Linster, Christiane [cl243 at cornell.edu];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main interneuron granule TC GABA cell;
#include "cell.init"


/**** this file contains functions to run the network *****/
                                                            

/** null all sets to zero all signals on synapses and neurons ****/

void NULL_ALL ()
{
int 	s, u, sig, hel, o;  
LINK	*help;
printf ("in null all N_STEPS %d N_UNITS %d \n", N_STEPS, N_UNITS);
	for (u = 0; u < N_UNITS; u++)
		{ 
		for (s = 0; s < N_STEPS; s++)
			{
			units[u].output[s] = 0.0;
			units[u].state[s] = 0.0;
			}                   
		units[u].old_state = 0.0;
		help = units[u].links_to_unit;  
		while (help)
		      {
		      for (sig = 0; sig < help->delay; sig++)
			  {
			  help->signal[sig] = 0.0; 
			  }
		      for (sig = 0; sig < 10; sig++)
			  {
			  help->spikes[sig] = 0; 
			  help->amps[sig] = 0.0;
			  }
		      	help = help->next;                 
			}
		} 
	for (s = 0; s < N_STEPS; s++)
		{
		AVSM[s] = 0.0;
		AVSG[s] = 0.0;
		AVSP[s] = 0.0;

		} 
	

}



		
/** propagate link signal propagates the signal in the synapse delays **/		

void PROPAGATE_LINK_SIGNAL (link, step)
LINK	*link;
{
float	signa;  
int	dell, sp;   
	if (units[link->from_unit].output[step] > 0.0)
		{
		for (sp = 9; sp > 0; sp--)
			{
			link->spikes[sp] = link->spikes[sp-1];
			link->amps[sp] = link->amps[sp-1]; 
			}
		link->spikes[0] = step; 
		link->amps[0] = units[link->from_unit].output[step]; 
		}
	for (dell= link->delay - 1; dell > 0; dell--)
		link->signal[dell] =  link->signal[dell-1]; 
	signa = 0.0;
	for (sp = 0; sp < 10; sp++)
		signa += link->amps[sp]*link->gmax*link->weight*link->mod*DEXP(link->tau1, link->tau2, (float)(step-link->spikes[sp]));  
	link->signal[0] = signa;                       
}                            

/** update neuron computes the input, potential and output of one neuron **/

void UPDATE_NEURON (unit,step)
int	unit,step;
{
float in, sta, out; 

	in = (*units[unit].input_function) (unit, step, units[unit].inpar1, units[unit].inpar2, 0.0);
	
	sta = (*units[unit].state_function) (&in, &units[unit].old_state, &units[unit].stpar1); 
	units[unit].state[step] = sta;    
	out = (*units[unit].output_function) (&sta, &units[unit].outpar1, &units[unit].outpar2); 
	units[unit].old_state = units[unit].state[step]; 
	units[unit].output[step] = out;                            
	

}


/** synchronous updating of all links **/

void UPDATE_LINKS (step)
int step;
{
LINK	*link;
int		del, unit;           
    for (unit = 0; unit < N_UNITS; unit++)                 
		{
		link = units[unit].links_to_unit;
		while (link != NULL)
			{   
			if (link->weight != 0.0)
				PROPAGATE_LINK_SIGNAL (link, step);   
			link = link->next;            
			}
		}
}



void UPDATE_NET (step)
int step;
{
int	unit, n;                                       
int	s, v, g, p, i;
float 	in, sum; 
LINK 	*link;
float   *delta;
	v = g = p = i = 0;       
	for (unit = 0; unit < N_UNITS; unit++)
		{
		UPDATE_NEURON (unit, step); 
		}
	UPDATE_LINKS (step);  

}

                       

#if 1
float RUN ()
{
int step;
 float sp, sy;
 int too, from, d, d2; 
 float amin, in_m, in_n, aplus, m, old_m, *old_p, *p, gmax, forgettime; 
 LINK *link;
int interval;
interval = 120; 
	/*GET_RUN_PARAMETERS ("para.dat");*/
	NULL_ALL ();
	printf ("0 dont 1 learn\n"); 
	scanf ("%d", &d);
	printf ("0 dont forget 1 forget\n");
	scanf ("%d", &d2);
	if (d2==1)
		{
		printf("how long?\n");
		scanf ("%f", &forgettime);
		}

	MEASURE_WEIGHTS1 ();
	MEASURE_WEIGHTS2 ();
	MEASURE_WEIGHTS3 ();
	if (d2 == 1)
		{
		/*FORGET_PC_ASS (FORGETASS, forgettime);*/
		FORGET_MC_GC (FORGETMCGC, forgettime);
		/*FORGET_PC_GC (FORGETMCGC, forgettime);*/
		}
	MEASURE_WEIGHTS1 ();
	MEASURE_WEIGHTS2 ();
	MEASURE_WEIGHTS3 ();
	
	for (step = 0; step < N_STEPS; step++)
	  {
		  UPDATE_NET (step);
	if ((step == interval) && (d==1))
		{GET_AVERAGES (step-interval, interval);
		/*HEBB_ASS_PC (RATEASS);*/
		HEBB_MC_GC (RATEMCGC);
		/*HEBB_PC_GC (RATEPCGC);*/ 
		interval += 120;}		
	}
	SYNCH ();
	MEASURE_WEIGHTS1 ();
	MEASURE_WEIGHTS2 ();
	MEASURE_WEIGHTS3 ();

}
#endif

#if 0
float RUN ()
{
int step;
 float sp, sy;
 int too, from; 
 float amin, in_m, in_n, aplus, m, old_m, *old_p, *p, gmax; 
 LINK *link;
	/*GET_RUN_PARAMETERS ("para.dat");*/
	NULL_ALL ();

	for (step = 0; step < N_STEPS; step++)
	  {
		  UPDATE_NET (step);
	}
}
#endif
float RUN2 ()
{
int step;
 float sp, sy;
 int too, from; 
 float amin, in_m, in_n, aplus, m, old_m, *old_p, *p, gmax; 
 LINK *link;
	/*GET_RUN_PARAMETERS ("para.dat");*/
	NULL_ALL ();

	for (step = 0; step < N_STEPS; step++)
	  {
		  UPDATE_NET (step);
		
	}
}


float RUN3 (weightfile)
FILE *weightfile;
{
int unit, step; 
LINK *link;
float wppav, wmgav, wpgav; 
int ppcount, mgcount, pgcount; 
int interval; 
 
	/*GET_RUN_PARAMETERS ("para.dat");*/
	NULL_ALL ();
	for (step = 0; step < 120; step++)
		  {
		  UPDATE_NET (step);
		}
	wmgav=0.0; wppav = 0.0; wpgav=0.0; 
	ppcount = 0; mgcount = 0; pgcount = 0; 
	for (unit = 0; unit < N_UNITS; unit++)
		{
		if (units[unit].type == granule)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == mitral2)
					{
					wmgav += link->weight; 
					mgcount += 1; 
					}
				if (units[link->from_unit].type == pyr)
					{
					wpgav += link->weight;
					pgcount += 1; 
					}
				link = link->next;
				}
			}	
		if (units[unit].type == pyr)
			{
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == pyr)
					{
					wppav += link->weight; 
					ppcount += 1;
		 			}
				link = link->next; 
					
				}
			}
		}
		fprintf (weightfile, "%f %f %f\n", wmgav/mgcount, wpgav/pgcount, wppav/ppcount);
		HEBB_ASS_PC (RATEASS);
		HEBB_MC_GC (RATEMCGC);
		HEBB_PC_GC (RATEPCGC);
						

}	



float RUN4 (weightfile, interval)
FILE *weightfile;
float interval;
{
int unit, step; 
LINK *link;
float wppav, wmgav, wpgav; 
int ppcount, mgcount, pgcount; 
 
	/*GET_RUN_PARAMETERS ("para.dat");*/
	NULL_ALL ();
	
		wmgav=0.0; wppav = 0.0; wpgav=0.0; 
		ppcount = 0; mgcount = 0; pgcount = 0; 
		for (unit = 0; unit < N_UNITS; unit++)
			{
			if (units[unit].type == granule)
				{
				link = units[unit].links_to_unit;
				while (link)
					{
					if (units[link->from_unit].type == mitral2)
						{
						wmgav += link->weight; 
						mgcount += 1; 
						}
					if (units[link->from_unit].type == pyr)
						{
						wpgav += link->weight;
						pgcount += 1; 
						}
					link = link->next;
					}
				}
			if (units[unit].type == pyr)
				{
				link = units[unit].links_to_unit;
				while (link)
					{
					if (units[link->from_unit].type == pyr)
						{
						wppav += link->weight; 
						ppcount += 1; 
						}
					link = link->next; 
					}
				}
			}
		/*FORGET_PC_ASS (FORGETASS, interval);*/
		FORGET_MC_GC (FORGETMCGC, interval);
		/*FORGET_PC_GC (FORGETMCGC, interval);*/

		fprintf (weightfile, "%f %f %f\n", wmgav/mgcount, wpgav/pgcount, wppav/ppcount);
						

		

}	

			
		    
		
	  

			    
			

		    
		
 
		













Loading data, please wait...