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 DRAW_INTER (msec)
int msec;
{
int i,j; 
EVENT maus;
float *inter, *dist, sum, med, spikes;
char text[20];
int o;
      inter = (float *) calloc (msec, sizeof (float));
      dist = (float *) calloc (15, sizeof (float));
       if (spike_window == NULL)
		     spike_window = OPEN_WINDOW (0, 0, 600, 500, blanc);
       CHOOSE_WINDOW (spike_window);	
       CLEAR ();
       for (;;)
	   {
	   for (o = 0; o < NODS; o++)
	       {
	       sum = 0.0;spikes = 0;
	       inter = INTERSPIKE (p_out, msec, o);
	       for (i = 0; i < 15; i++)
		   sum += inter[i];
	       for (i = 0; i < 15; i++)
		   if (sum != 0.0)
		      {
		      med = 0.0;
		      for (j = 0; j <=i; j++)
			  {med += inter[j];
			   }
		      dist[i] = (med)/sum;
		      }
	       for (i = odors[o].from; i < odors[o].too; i++)
		   spikes += p_out[i];
		   for (i = 0; i < msec; i++)
		       inter[i] /= 10;
	       AXIS (50, 50+100*o, 2, 1, msec, 10);
	       SPIKES (50, 50+100*o, 2, 1, msec, inter);
	       sprintf (text, "%f spikes", spikes);
	       TEXT (text, 50, 50+100*o+20); 
	       AXIS (350, 300, 20, 200, 15, 1);
	       CURVE (350, 300, 20, 200, 14, dist); 
	       }
	   maus.flag = expose;
	   while (maus.flag != mouse)
			maus = GET_EVENT ();
		if (maus.button == RIGHT)
			break;
	   }
free (inter);
}




       


void DRAW_ONE_STEP (step, x, y, type)
int	step, x, y;                     
enum TYPES type;
{        
int g, unit, r, i;
float value[50];
	for (i = 0; i < GLOM; i++)
		value[i] = 0.0;                                           
	for (unit = 0; unit < N_UNITS; unit++)
	  	{
	  	if ((type != receptor) && (units[unit].type == type) && (units[unit].couche < GLOM))
	      		value[units[unit].couche] = units[unit].output[step];   
		if (type == receptor)
	  		{
	  		 for (r = 0; r < REC; r++)
	       			for (g = 0; g < GLOM; g++)
		   			{
		   			if ((g >= r * (int) (GLOM/REC)) && (g < (r+1)* (int) (GLOM/REC)))
		      				value[g] += units[r].output[step];
		   			}
	   		}	
		}
	BOX (x, y, x+5*GLOM, y-50);  
	for (g = 0; g < GLOM; g++, x+= 5)
		{
		if ((value[g] > 0.0) && (value[g] < 1.0))
			FILLED_BOX (x, y, x+4, (int) (y - 100*value[g])); 
                else 
                   if (value[g] >= 1.0)
		     FILLED_BOX (x, y, x+4, (int) (y - 50));
		}
}	



void SHOW_WEIGHTS ()

{
int unit, x, y, y0;
LINK *link;
char chain[20];
y0 = 10;
	if (weight_window == NULL)
  		weight_window = OPEN_WINDOW (0, 0, 450, 100, blanc);
	CHOOSE_WINDOW (weight_window);
	CLEAR ();
	for (unit = 0; unit < N_UNITS; unit++)
		{
		if (units[unit].type == granule)
			{
			y = y0+25+50; 
			link = units[unit].links_to_unit;
			while (link)
				{
				if (units[link->from_unit].type == pyr)
					{
					x = units[link->from_unit].couche * 20 + 20;

					CIRCLE (x, y, 10); 
					FILLED_CIRCLE (x, y, (int) (link->weight * 5));
						
					}     
				link = link->next;
				}
			}
		}
			
}



void SHOW_PV (xmul, ymul)
int xmul, ymul;
{
int g, unit, y;
LINK *link;
EVENT maus;
char chain[10];
	if (pv_window == NULL)
		pv_window = OPEN_WINDOW (0, 0, 1000, 500, blanc);
	CHOOSE_WINDOW (pv_window);
	CLEAR ();
	for (;;)
		{
		for (g = 0, y = 20; g < GLOM; g++, y += 2*ymul)
			{
			for (unit = 0; unit < N_UNITS; unit++)
				if ((units[unit].type == vum) && (units[unit].couche == g))
					{
					link = units[unit].links_to_unit;
					break;
					}
			while (link)
				{
				if ((units[link->from_unit].type == proj) && (units[link->from_unit].couche == g))
					break;
				link = link->next;
				}
			CURVE (50, y, xmul, ymul, N_STEPS, link->weight_change);
			AXIS (50, y, xmul, ymul, N_STEPS, 10);
			sprintf (chain, "%d", g);
			TEXT (chain, 20, y);
			}
		maus.flag = expose;
		while (maus.flag != mouse)
			maus = GET_EVENT ();
		if (maus.button == RIGHT)
			break;
		
		}
}



void SHOW_VI (xmul, ymul)
int xmul, ymul;
{
int g, unit, y;
LINK *link;
EVENT maus;
char chain[10];
	if (vi_window == NULL)
		vi_window = OPEN_WINDOW (0, 0, 1000, 500, blanc);
	CHOOSE_WINDOW (vi_window);
	CLEAR ();
	for (;;)
		{
		for (g = 0, y = 20; g < GLOM; g++, y += 2*ymul)
			{
			for (unit = 0; unit < N_UNITS; unit++)
				if ((units[unit].type == inhib) && (units[unit].couche == g))
					{
					link = units[unit].links_to_unit;
					break;
					}
			while (link)
				{
				if ((units[link->from_unit].type == vum) && (units[link->from_unit].couche == g))
					break;
				link = link->next;
				}
			CURVE (50, y, xmul, ymul, N_STEPS, link->weight_change);
			AXIS (50, y, xmul, ymul, N_STEPS, 10);
			sprintf (chain, "%d", g);
			TEXT (chain, 20, y);
			}
		maus.flag = expose;
		while (maus.flag != mouse)
			maus = GET_EVENT ();
		if (maus.button == RIGHT)
			break;
		}
}
		

void DRAW_WEIGHTS ()
{
int y1, y2, x1, x2, y, g, unit;
float weighti, weightp;
LINK *link;
EVENT maus;
		weight_window = OPEN_WINDOW (0, 0, 600, 200, blanc);
	CHOOSE_WINDOW (weight_window);
	CLEAR ();
	for (;;)
		{
		x1 = 20; y1 = 80;y2 = 180;x2 = 100;
		BOX (x1, y1, x1+5*GLOM, y1 - 50);
		BOX (x1, y2, x1+5*GLOM, y2-50);
		BOX (x2, y1, x2+5*GLOM, y1 -50);
	/*	BOX (x2, y2, x2+5*GLOM, y2-50);*/
		for (g = 0; g < GLOM; g++, x1+= 5)
			{
			for (unit = 0; unit < N_UNITS; unit++)
				if ((units[unit].type == vum) && (units[unit].couche == 100))
					{
					link = units[unit].links_to_unit;
					break;
					}
			weighti = weightp = 0.0;

			while (link)
				{
				if ((units[link->from_unit].type == inhib) && (units[link->from_unit].couche == g))
					weighti = link->weight;
				if (((units[link->from_unit].type == proj) || (units[link->from_unit].type == excit)) && (units[link->from_unit].couche == g))
					weightp = link->weight;
				FILLED_BOX (x1, y2, x1+4, (int) (y2 - 50*fabs (weightp)));
				FILLED_BOX (x1, y1, x1+4, (int) (y1 - 50*fabs (weighti)));

				link = link->next;
				}
			}
		weighti = 0.0;
		for (g = 0; g < GLOM; g++, x2+=5)
			{
			for (unit = 0; unit < N_UNITS; unit++)
				if ((units[unit].type == inhib) && (units[unit].couche == g))
					{
					link = units[unit].links_to_unit;
					break;
					}
			while (link)
				{
				if ((units[link->from_unit].type == vum) && (units[link->from_unit].couche == 100))
					weighti = link->weight;
				FILLED_BOX (x2, y1, x2+4, (int) (y1 - 50*fabs (weighti)));
				link = link->next;
				}
			}
		maus.flag = expose;
		while (maus.flag != mouse)
			maus = GET_EVENT ();
		if (maus.button == RIGHT)
			break;


		}
		DESTROY_WINDOW (weight_window);
}
	
void DRAW_MEANS ()

{
int g, unit, r, i;
float value1[50];
float value2[50];
float value3[50];
float value4[50];
 float max;
int x1, x, y1, o, step, y2, y3, y4;
EVENT maus;
 x1 = 20; y1 = 80;y2 = 220;y3 = 360;y4 = 500;

	if (other_window == NULL)
		other_window = OPEN_WINDOW (0, 0, 600, 600, blanc);
	CHOOSE_WINDOW (other_window);
	CLEAR (); 
	for (;;)
		{
		for (o = 0, x1 = 20; o < NODS; o++, x1 += 5*GLOM + 30)
  			{
			for (i = 0; i < GLOM; i++)
			    {
			    value1[i] = 0.0;
			    value2[i] = 0.0;
			    value3[i] = 0.0;
			    value4[i] = 0.0;
			    }
		 
			max = 0.0;
			for (unit = 0; unit < N_UNITS; unit++)
	  			{
	  			if ((units[unit].type == proj) && (units[unit].couche < GLOM))
	    				{
	    				for (step = odors[o].from; step < odors[o].too; step++)
					  	{ 
						  value2[units[unit].couche] += units[unit].output[step];
						}
					value2[units[unit].couche] /= (odors[o].too - odors[o].from);
					if (value2[units[unit].couche] > max)
					  max = value2[units[unit].couche];

	  				}
				if ((units[unit].type == receptor) && (units[unit].couche < GLOM))
					{
					for (step = odors[o].from; step < odors[o].too; step++)
					  	value1[units[unit].couche] += units[unit].output[step];   
	    				value1[units[unit].couche] /= (odors[o].too - odors[o].from);
				    
	 				}
			
				}
			for (i = 0; i < GLOM; i++)
			  {
			    value3[i] = odors[o].outputs[i];
			    value2[i] /= max;
			    value4[i] = value3[i] - value2[i];
			  }
				BOX (x1, y1, x1+5*GLOM, y1-50);  
				for (g = 0, x = x1; g < GLOM; g++, x+= 5)
					{
					
					FILLED_BOX (x, y1, x+4, (int) (y1 - 50*value1[g])); 
                			
					}
			       
				BOX (x1, y1, x1+5*GLOM, y1-50);
				BOX (x1, y2, x1+5*GLOM, y2-50);
				BOX (x1, y3, x1+5*GLOM, y3-50);
				BOX (x1, y4, x1+5*GLOM, y4-50);
				for (g = 0, x = x1; g < GLOM; g++, x+= 5)
				     {
				       FILLED_BOX (x, y1, x+4, (int) (y1-50*value1[g]));
				     if (value2[g] >= 0.0)
					FILLED_BOX (x, y2, x+4, (int) (y2 - 50*value2[g])); 
					else
					FILLED_BOX (x, (int) (y2-50*value2[g]), x+4, y2);
				     FILLED_BOX (x, y3, x+4, (int) (y3-50*value3[g]));
				     if (value4[g] >= 0.0)
				       FILLED_BOX (x, y4, x+4, (int) (y4-50*value4[g]));
				     else
				       FILLED_BOX (x, (int) (y4-50*value4[g]), x+4, y4);
				     }

			}		
					
			
	TEXT ("for quit click right ", 10, 10);
	maus.flag = expose;
	while (maus.flag != mouse)
		maus = GET_EVENT ();
	if (maus.button == RIGHT)
		break;
	}
	/*DESTROY_WINDOW (new_window);*/
}
			      

void DRAW_LASTS (type)
enum TYPES type;
{                
extern void DRAW_MOL ();
int o, x1, y1;
EVENT maus;
x1 = 20; y1 = 60;    
        
	maus.flag = expose;
	if (new_window == NULL)
		new_window = OPEN_WINDOW (0, 0, 600, 200, blanc);
	CHOOSE_WINDOW (new_window);
	CLEAR (); 
	for (;;)
		{
		for (o = 0; o < NODS; o++, x1 += 5*GLOM + 30)
			{
			DRAW_ONE_STEP (odors[o].too-10, x1, y1, type);
			DRAW_MOL (x1, y1+20, o);     
			}
		while (maus.flag != mouse)
			maus = GET_EVENT ();
		if ((maus.flag == mouse) && (maus.button == RIGHT))
			break;
		}
/*	DESTROY_WINDOW (new_window);*/
}
				


void DRAW_MORE (from, last, type)
int from, last;                 
enum TYPES type;
{         
int x1, y1, i;
 	x1 = 20; y1 = 60;
 	for (i = from; i < from+5; i++, x1 += 5*GLOM + 10)
		DRAW_ONE_STEP (i, x1, y1, type);
 	y1 += 60; x1 = 20;
 	for (i = i; i < from + 9; i++, x1 += 5*GLOM+10)
      		DRAW_ONE_STEP (i, x1, y1, type);
 	y1 += 60; x1 = 20;
 	for (i = i; i < from + 13; i++, x1 += 5*GLOM+10)
   		DRAW_ONE_STEP (i, x1, y1, type);
 	DRAW_ONE_STEP (last, x1, y1, type);
}

void DRAW_MOL (x, y, odor)
int x, y, odor;
{
         
int m;                                              
	for (m = 0; m < MOL; m++)
		{ 
		if (odors[odor].values[m] != 0.0)
			FILLED_CIRCLE (x, y, 8);
		else 
			CIRCLE (x, y, 8);
		x += 8;
		}
}


void DRAW_ODOR (odor, type1)
int odor;                 
enum TYPES type1;
{
int from, last;
EVENT maus ;
	if (new_window == NULL)
		new_window = OPEN_WINDOW (0, 0, 600, 300, blanc);
	CHOOSE_WINDOW (new_window);  
	CLEAR ();
	for (;;)
		{
		DRAW_MORE (odors[odor].from+2, odors[odor].too, type1);
		DRAW_MOL (50, 220, odor);
		TEXT ("click right for quit", 10, 10);
	maus.flag = expose;

		while (maus.flag != mouse)
			maus = GET_EVENT ();
		if (maus.button == RIGHT)
			break;
		}
	/*DESTROY_WINDOW (new_window);*/
}
	














Loading data, please wait...