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"



void SAVE_WEIGHTS ()

{
int unit, x, y;
LINK *link;
char chain[20], name[50];
FILE *saveto;
	printf ("save to file \n");
	scanf ("%s", name);
	saveto = fopen (name, "w");
	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 == pyr)
					fprintf (saveto, "%f ", link->weight);
				link = link->next;
				}
			fprintf (saveto, "\n");
			}
		}
			
}

void GET_CHANNELS ()
{
FILE *read_from;
char dummy[50];
	if ((read_from = fopen ("channels.dat", "r")) == NULL)
		{
		printf (" error in open file channels.dat \n");
		exit (0);
		}

	if (fscanf (read_from, "%s %s %f %f %f %d %f %f %s %f %f %f %d %f %f %s %f %f %f %d %f %f %s %f %f %f %d %f %f", dummy, dummy, &channels[NMDA].nernst, &channels[NMDA].tau1, &channels[NMDA].tau2, &channels[NMDA].hebb, &channels[NMDA].max_weight, &channels[NMDA].nuu, dummy, &channels[AMPA].nernst, &channels[AMPA].tau1, &channels[AMPA].tau2, &channels[AMPA].hebb, &channels[AMPA].max_weight, &channels[AMPA].nuu, dummy, &channels[GABAA].nernst, &channels[GABAA].tau1, &channels[GABAA].tau2, &channels[GABAA].hebb, &channels[GABAA].max_weight, &channels[GABAA].nuu, dummy, &channels[GABAB].nernst, &channels[GABAB].tau1, &channels[GABAB].tau2 , &channels[GABAB].hebb, &channels[GABAB].max_weight, &channels[GABAB].nuu) != 29) 
	printf (" error in reading chanlles \n");
}


#if 0
void GET_ODORS ()
{

typedef struct 
	{
	int x, y;
	float value;
	} X;
X *mol; 
int i, o, m, from, too;
EVENT maus;
int steps;  
int x, y, j;            
float con;

       if ((odors != NULL) && (NODS != 0))
	  {
	    for (m = 0; m < NODS; m++)
		free (odors[m].values);
           free (odors);
	  }
	if (mol_window == NULL)
		mol_window = OPEN_WINDOW (0, 0,MOL*20, 200, blanc);
	printf (" mols %d nodors .. \n", MOL);
	scanf ("%d", &NODS);  

	odors = (ODORS *) calloc (NODS, sizeof (ODORS));
	for (m = 0; m < NODS; m++)
		odors[m].values = (float *) calloc (MOL, sizeof (float));
	mol = (X *) calloc (MOL, sizeof (X)); 
	x = 10; y = 10;j = 0;
	CHOOSE_WINDOW (mol_window);
	CLEAR ();
	for (;;)
  		{
	for (o = 0; o < NODS; o++, y+= 20)
		{ 
		maus = GET_EVENT ();
                          
		x = 10;
		for (i = 0; i < MOL; i++, x+= 20)
			{
			CIRCLE (x, y, 10);
			mol[i].x = x;
			mol[i].y = y;
			}            
		printf (" odor %d from .. too .. concentration\n", o);
		scanf ("%d %d %f", &from, &too, &con);
		printf (" click left in active molecules, right when done\n");	 
		maus.button = LEFT;
		while (maus.button != RIGHT)
			{
			maus = GET_EVENT ();
			if ((maus.flag == mouse) && (maus.button == LEFT))
				{
				for (i = 0; i < MOL; i++)
					if ((maus.xpos <= mol[i].x + 10) && (maus.xpos >= mol[i].x -10) &&
						(maus.ypos <= mol[i].y + 10) && (maus.ypos >= mol[i].y - 10))
					{   
					FILLED_CIRCLE (mol[i].x, mol[i].y, 10); 
					mol[i].value = 1.0;
					}
				}
			} 
                odors[o].from = from;
		odors[o].too = too;
		for (i = 0; i < MOL; i++)
			odors[o].values[i] = mol[i].value;
		for (i = from; i < too; i++)
			for (m = 0; m < MOL; m++)
				molecules[m].stim[i] += con * mol[m].value;
		for (i = 0; i < MOL; i++)
			mol[i].value = 0.0;
		}
	break;
      	}
       	/*DESTROY_WINDOW (mol_window);*/

	free (mol);   

}
#endif
void SAVE_CONFIG ()
{
int 	unit, nlinks, in, sta, out;
FILE	*save_to;
char	filename[50];
LINK	*link;
	printf (" save config to file ... \n"); scanf ("%s", filename);
	save_to = fopen (filename, "w");  
	printf ("written %d\n", fprintf ( save_to, "%d       %s   %d   %d   %d    \n", 	
			N_UNITS, TEX, REC, MOL, GLOM));
    	for (unit = 0; unit < N_UNITS; unit++)  
		{ 
		nlinks = 0;       
		link = units[unit].links_to_unit;
		while (link != 0)
			{
			nlinks++;
			link = link->next;
                	}
		if (fprintf (save_to, "%d %f %f %f %f %f %s %d %d %d %d\n", 
		units[unit].type, units[unit].inpar1, units[unit].inpar2, units[unit].stpar1, units[unit].outpar1, units[unit].outpar2, units[unit].name, units[unit].flag, units[unit].selected, nlinks, units[unit].couche) == EOF) printf ("found EOF at unit %d \n", unit);
		if (units[unit].input_function == GET_MOLECULES)        in = 0;
		if (units[unit].input_function == SUM_INPUTS) 		in = 1;
		if (units[unit].input_function == MIXED_INPUTS) 	in = 2;      
		if (units[unit].input_function == GET_MOLECULES) 	in = 4;
		
		if (units[unit].input_function == SAT_INPUTS)		in = 6;
		if (units[unit].input_function == ADAPT_INPUT)		in = 7;
		if (units[unit].input_function == GUST_INPUT)		in = 8;
		if (units[unit].state_function == LINEAR) 		sta = 0;
		if (units[unit].state_function == DECAY) 		sta = 1;
		if (units[unit].state_function == FALSE_DECAY) 		sta = 3;
		if (units[unit].state_function == POT_REC) 		sta = 2;
		if (units[unit].output_function == SPIKE) 		out = 0;
		if (units[unit].output_function == THRESHOLD) 		out = 1;
		if (units[unit].output_function == LINEAR) 		out = 3;
		if (units[unit].output_function == SAT)			out = 31;
		if (units[unit].output_function == SIG) 		out = 4;
		if (units[unit].output_function == FALSE_SIG)	 	out = 5; 
		if (units[unit].output_function == FALSE_SPIKE) 	out = 6;
		if (units[unit].output_function == ADAPT_SPIKE)         out = 7;
		if (fprintf (save_to, "%d %d %d\n", in, sta, out) == EOF) printf (" found eof at unit %d\n", unit);
		link = units[unit].links_to_unit;
		while (link != NULL)
			{         
			if (fprintf (save_to, "%d %f %d %d\n", 
				link->from_unit, link->weight, link->delay, link->type) == EOF) printf ("found eof in links at unit %d\n", unit);
			link = link->next;
			}     
		
		}
fclose (save_to);

}              



                 

void SHOW_UNITS ()
{
int	unit, i;
LINK	*link;          
	i = 0;
	for (unit = 0; unit < N_UNITS; unit++)           
		printf (" neuron %d is a %d %s in layer %d out1 %f out2 %f \n", 
				unit, units[unit].type, units[unit].name, units[unit].couche, units[unit].outpar1, units[unit].outpar2);

}
void SHOW_LINKS ()
{
int unit; 
LINK *link;int i;
	for (unit = 0; unit < N_UNITS; unit++)
		{
		  i = 0;
		link = units[unit].links_to_unit;
		while (link != NULL)
			{
			printf ("link %d from neuron %d to neuron %d with weigth %f delay %d type %d\n",
				i, link->from_unit,  unit, 
				link->weight, link->delay, link->type);
			i++;
			link = link->next;
			}
		}

}

#if 0		
void READ_CONFIG ()
{
int	    	unit, nlinks, link, in, sta, out;
FILE    	*read_from;   
char		filename[50];                           
int 		nunits, type, sel, flag, from_unit, delay, couche;
float		inp1, inp2, par, out1, out2, weight;
char		name[10];                       
FUNCTION 	inf, staf, outf;     
LINK		*lin;
open_loop:
	printf (" read config from file ... \n");
	scanf ("%s", filename);
	if ((read_from = fopen (filename, "r")) == NULL)
		{
		printf (" file does not exist, try again\n");
		goto open_loop;		
		}
	if (fscanf (read_from, "%d       %s   %d    %d    %d     \n", 
						&nunits, TEX, &REC, &MOL, &GLOM) != 5) printf (" first error \n"); 
	ALLOCATE_NEURONS (nunits);
	N_UNITS = 0; 
	for (unit = 0; unit < nunits; unit++)
		{
		if (fscanf (read_from, "%d %f %f %f %f %f %s %d %d %d %d\n",&type, &inp1, &inp2, &par, &out1, &out2, name, &flag, &sel, &nlinks, &couche) != 11) printf (" error at unit %d \n", unit);
		if (fscanf (read_from, "%d %d %d\n", &in, &sta, &out) != 3) printf (" 2 error at unit %d \n", unit);
		if (in == 0) inf = GET_MOLECULES;
		if (in == 1) inf = SUM_INPUTS;
		if (in == 2) inf = MIXED_INPUTS;
		if (in == 4) inf = GET_MOLECULES;
		if (in == 5) inf = PROJ_INPUTS;                   
		if (in == 6) inf = SAT_INPUTS;
		if (in == 8) inf = GUST_INPUT;
		if (in == 7) inf = ADAPT_INPUT;
		if (sta == 0) staf = LINEAR;
		if (sta == 1) staf = DECAY;
		if (sta == 2) staf = POT_REC;
		if (sta == 3) staf = FALSE_DECAY;
		if (out == 0) outf = SPIKE;
		if (out == 1) outf = THRESHOLD;
		if (out == 3) outf = LINEAR;                    
		if (out == 31) outf = SAT;
		if (out == 4) outf = SIG;                              
		if (out == 5) outf = FALSE_SIG;  
		if (out == 6) outf = FALSE_SPIKE;
		if (out == 7) outf = ADAPT_SPIKE;
        	MAKE_NEURON (type, name, inf, staf, outf, inp1, inp2, par, out1, out2);
        	units[unit].selected = sel;  
		units[unit].flag = FAUX;                            
		units[unit].couche = couche;
        	for (link = 0; link < nlinks; link++)
			{
			if (fscanf (read_from, "%d %f %d %d\n", &from_unit, &weight, &delay, &type) != 4)
			  {printf (" error at unit %d link %d\n" ,unit, link);getchar ();}
            		MAKE_LINK (from_unit, unit, weight, delay, type);
                    
		}    
	      }


	fclose (read_from);
} 
#endif		
#if 0
void GET_CONFIG ()
{
int	    	unit, nlinks, link, in, sta, out;
FILE    	*read_from;   
char		filename[50];                           
int 		nunits, type, sel, flag, from_unit, delay, couche;
float		inp1, inp2, par, out1, out2, weight;
char		name[10];                       
FUNCTION 	inf, staf, outf;     
LINK		*lin;
open_loop:
	printf (" read config from file ... \n");
	scanf ("%s", filename);
	if ((read_from = fopen (filename, "r")) == NULL)
		{
		printf (" file does not exist, try again\n");
		goto open_loop;		
		}
	fscanf (read_from, "%d       %s   \n", 
						&nunits, TEX); 
	ALLOCATE_NEURONS (nunits);
	N_UNITS = 0; 
	for (unit = 0; unit < nunits; unit++)
		{
		if (fscanf (read_from, "%d %f %f %f %f %s %d %d %d \n",&type, &inp1, &par, &out1, &out2, name, &flag, &sel, &nlinks) != 9) printf (" error at unit %d \n", unit);
		fscanf (read_from, "%d %d %d\n", &in, &sta, &out);
		if (in == 0) inf = SUM_INPUTS;
		if (in == 1) inf = SUM_INPUTS;
		if (in == 2) inf = MIXED_INPUTS;
		if (in == 4) inf = GET_MOLECULES;
		if (in == 6) inf = SAT_INPUTS;
		if (sta == 0) staf = LINEAR;
		if (sta == 1) staf = DECAY;
		if (sta == 2) staf = POT_REC;
		if (sta == 3) staf = FALSE_DECAY;
		if (out == 0) outf = SPIKE;
		if (out == 1) outf = THRESHOLD;
		if (out == 3) outf = LINEAR;                    
		if (out == 31) outf = SAT;
		if (out == 4) outf = SIG;                              
		if (out == 5) outf = FALSE_SIG;  
		if (out == 6) outf = FALSE_SPIKE;
		if (out == 7) outf = FALSE_SPIKE;
        	MAKE_NEURON (type, name, inf, staf, outf, inp1, 0.0, par, out1, out2);
        	units[unit].selected = sel;  

		units[unit].couche = 0;
        	for (link = 0; link < nlinks; link++)
			{
			if (fscanf (read_from, "%d %f %d\n", &from_unit, &weight, &delay) != 3) printf (" error at unit %d link %d \n", unit, link);
            		MAKE_LINK (from_unit, unit, weight, delay, local);
			}
                    
		}    

	fclose (read_from);
} 
#endif
void NULL_ODORS ()
{
int step, o;
	for (o = 0; o < MOL; o++)
		for (step = 0; step < N_STEPS; step++)
			molecules[o].stim[step] = 0.0;   
}

void SHOW_ODORS ()
{
int step, o;
		for (step = 0; step < N_STEPS; step++)
		    	{
			for (o = 0; o < MOL; o++)
				printf ("%2.1f ", molecules[o].stim[step]); 
			printf ("\n");
			}  
}

void RESET_UNITS ()
{
int unit;
	for (unit = 0; unit < N_UNITS; unit++)
	        {
		units[unit].x_coor = units[unit].y_coor = 0;
		units[unit].flag = FAUX;
		units[unit].selected = FAUX;
		}
}

void FAMILIAR ()
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[10].stim[step] = 1.0;
		molecules[30].stim[step] = 1.0;
		molecules[50].stim[step] = 1.0; 
		molecules[70].stim[step] = 1.0;
		molecules[90].stim[step] = 1.0;
		}
}

void NOVEL3 ()
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[20].stim[step] = 1.0;
		molecules[40].stim[step] = 1.0;
		molecules[60].stim[step] = 1.0; 
		molecules[80].stim[step] = 1.0;
		molecules[99].stim[step] = 1.0;
		}
}

void NOVEL1 ()
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[12].stim[step] = 1.0;
		molecules[32].stim[step] = 1.0;
		molecules[52].stim[step] = 1.0; 
		molecules[72].stim[step] = 1.0;
		molecules[92].stim[step] = 1.0;
		}
}

void NOVEL2 ()
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[15].stim[step] = 1.0;
		molecules[35].stim[step] = 1.0;
		molecules[55].stim[step] = 1.0; 
		molecules[75].stim[step] = 1.0;
		molecules[95].stim[step] = 1.0;
		}
}

void C0 (conc)
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[20].stim[step] = conc;
		molecules[60].stim[step] = conc;
				}
}


void C1 (conc)
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[25].stim[step] = conc;
		molecules[65].stim[step] = conc;
				}
}
void C2 (conc)
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[30].stim[step] = conc;
		molecules[70].stim[step] = conc;
				}
}
void C3 (conc)
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[35].stim[step] = conc;
		molecules[75].stim[step] = conc;
				}
}


void X (conc)
{
int step; 
	for (step = 0; step < N_STEPS; step++)
		{
		molecules[0].stim[step] = conc;
		molecules[90].stim[step] = conc;
				}
}
void GET_RUN_PARAMETERS (filename)
char *filename;
{
FILE *read_from;
char to[30];
int help1, help2, points, i;
	if ((read_from = fopen (filename, "r")) == NULL)
  		{
  		printf (" error in open file para.dat \n");
  		exit (0);
  		}

	if (fscanf (read_from, "%s %s %d %s %d %s %d %s %f", 
	    TEX, to, &N_STEPS, to, &WIDTH, to, &HEIGHT, to, &DELTA) != 9)
	  	{
	    	printf (" error in reading file para.dat\n");
	    	exit (0); 
	  	}
	close (read_from);
	
}


void TESTSN ()
{
int i;
for (i=100; i < 200; i++)
	{
	molecules[10].stim[i]=0.0;
	molecules[15].stim[i] = 0.0;
	molecules[20].stim[i] = 0.0; 
	molecules[25].stim[i]=0.0;
	molecules[30].stim[i] = 0.0;
	}

for (i=500; i < 600; i++)
	{
	molecules[10].stim[i]=1.0;
	molecules[15].stim[i] = 1.0;
	molecules[20].stim[i] = 1.0; 
	molecules[25].stim[i]=1.0;
	molecules[30].stim[i] = 1.0;
	}
}

void RESP (conc, m1, m2)
float conc;
int m1, m2;
{
int n, o, s, i, from, too;
float c, c0;
c=conc;
s=0;
c0=0.0;
	for(i=0; i < N_STEPS; i++)
		for(o=0; o < GLOM; o++)
			{molecules[o].stim[i]=0.0;
			
			}
i=0;
while (i<N_STEPS)
	{
	for (i=s; i<s+20; i++)
		{molecules[m1].stim[i]=c0;
		molecules[m2].stim[i]=c0;
		c0+=c/20;
		}
	for (i=s+20;i<s+60;i++)
		{
		molecules[m1].stim[i]=c;
		molecules[m2].stim[i] =c;
		}
	c0=c;
	for (i=s+60; i < s+80; i++)
		{
		molecules[m1].stim[i]= c0;
		molecules[m2].stim[i] = c0;
		c0-=c/20;
		}
	s+=100;
	}
}

#if 0
void RESP_O ()
{
int n, o, s, i, from, too;
float c, c0;
int oo[100];
printf ("nmols ? c ? from ?");
scanf ("%d %f %d", &n, &c, &from);
for (o=0; o < n; o++)
	{oo[o]=floor(RANF()*GLOM);
	printf ("%d \n", oo[o]);}
s=from;
c0=0.0;
	for(i=0; i < too; i++)
		for (o=0; o<n;o++)
			molecules[oo[o]].stim[i]=0.0;

while (i<N_STEPS)
	{
	if ((RANF()> 0.6)&& (i > 400) && (i < 800))
		c=1.0;
	else
		c=0.05;
	for (i=s; i<s+1; i++)
		{
		for (o=0; o<n;o++)	
			molecules[oo[o]].stim[i]=c0;
		c0+=c/1;
		}
	for (i=s+1;i<s+6;i++)
		{
		for (o=0; o<n; o++)
			molecules[oo[o]].stim[i]=c;
		}
	c0=c;
	for (i=s+6; i < s+8; i++)
		{
		for (o=0;o<n;o++)
			molecules[oo[o]].stim[i]= c0;
		c0-=c/2;
		}
	for (i=s+8; i < s+10; i++)
		{
		for (o=0;o<n;o++)
			molecules[oo[o]].stim[i]= 0.0;
		}
	s+=10;
	}
printf ("end of resp\n");
}		

#endif
#if 1
void SAVE_DATA ()
{
FILE *save_to; 
char name[20]; 
int unit;
int step;
	printf ("save to file .. \n");
	scanf ("%s", name);
	save_to = fopen (name, "w"); 
	for (step = 0; step < N_STEPS; step++)
		{
		for (unit = 0; unit < N_UNITS; unit++)
			if (units[unit].type == mitral2)
				fprintf (save_to, "%f ", units[unit].output[step]); 
		}
	fclose (save_to);
}					
#endif



Loading data, please wait...