This is the README for the neuron files (esp. ca1.hoc) associated with
the paper:

Bezaire et al 

For detailed information, view Model_Manual.pdf
Produced by: marianne.case@uci.edu 2010

PURPOSE OF CODE:
This code creates a scalable network of cells and runs a simulation.
It models the rat CA1 using several cell types and can include
characteristics of an epileptic network (sprouting and cell death).

UPDATES
- 2022-04-01: sgate.mod: patch for compatibility with NEURON > 8.1. Technical fix, no expected changes.
- 2022-05-23: Updated MOD files to contain valid C++ and be compatible with the upcoming versions 8.2 and 9.0 of NEURON.

INSTRUCTIONS FOR RUNNING THE PROGRAM
>SETUP:
1. Ensure neuron is installed on the head node and has its directory added to PATH
2. Ensure that mpich2 is installed on the head node and has its directory added to PATH
3. Compile the mod files into the directory from which the model program will be run
	a. To compile all mod files in the directory, simply enter:
		$ nrnivmodl
	b. To compile specific mod files, enter them after the command:
		$ nrnivmodl ccanl nca tca

>RUNNING:
1. Edit the parameter input files (listed below) as necessary
2. Turn on mpd:
		$ mpdboot	
	or alternatively:
		$ mpd &
3. Call the program with the number of available hosts where the '2' is:
		$ mpiexec -n 2 $NEURONHOME/nrn/x86_64/bin/nrniv -nobanner -nogui -mpi ca1.hoc	
4. When finished using mpi, shut down mpd:
		$ mpdallexit

FILE ORGANIZATION:
root folder:
	- ca1.hoc (main hoc file) and all mechanism files
cells folder:
	- individual files defining each cell type
	- individual files defining the axonal distribution of each cell type
connections folder:
	- individual files specifing the probability, strength, and delay of each connection type
setupfiles folder:
	- default parameter definitions file
	- cell numbers and soma layers
	- other files needed by ca1.hoc to run the model
stimulation folder:
	- individual files defining each stimulation protocol
results folder:
	- contains result folders for each run
tools folder:
	- contains MATLAB and NEURON scripts to organize results and generate figures
jobscripts folder:
	- contains scripts generated by you to submit a model run to a batch queue. This folder can be moved to another location.
x86_64 folder:
	- automatically generated when mechanisms are compiled, stores compiled mechanisms

FILES IN RESULTS FOLDER
spikeraster.dat
connections.dat
numcons.dat
position.dat
celltype.dat
runtimes.dat
ranseeds.dat
runreceipt.txt
lowindex.hoc

VIEWING THE RESULTS
In the tools folder, there are several MATLAB scripts useful for viewing the model characteristics or simulation results:
- Run Organizer
- AutoRig

USING MERCURIAL
Mercurial is a code versioning program; this model is meant to be used with Mercurial.
To get started:
1. Download and install Mercurial from http://mercurial.selenic.com/
2. At the command prompt, cd to the root folder of this model
3. To create a Mercurial repository of the model, enter:
	$ hg init
4. To commit changes to the repository, enter:
	$ hg commit -m "comment about this code version"
5. To check which code version you are using:
	$ hg parent
6. To list all the code versions in the repository:
	$ hg log
7. To switch to a different code version (ex: version 2):
	$ hg update -C -r 2
8. To switch to back to the most recent version:
	$ hg update -C -r tip
9. To check the changes made since you last commit:
	$ hg status
10. To have Mercurial start tracking a file:
	$ hg add myfile.txt
11. To have Mercurial remove and stop tracking a file:
	$ hg remove myfile.txt
12. To have Mercurial move and keep tracking a file:
	$ hg mv original.txt target.txt
13. For more extensive instructions, see:
	http://mercurial.selenic.com/guide/

SPECIFYING PARAMETER VALUES AT EXECUTION TIME
Add the '-c' option, followed by the equation to set the parameter in quotes:
	$ mpiexec -n 2 $NEURONHOME/nrn/x86_64/bin/nrniv -nobanner -nogui -mpi -c "mytstop=100" ca1.hoc	
For strings, include another '-c' option to define the string and enclose the string value in '\"':
	$ mpiexec -n 2 $NEURONHOME/nrn/x86_64/bin/nrniv -nobanner -nogui -mpi -c "strdef RunName" "RunName=\"myrun\"" ca1.hoc	

CODE OUTLINE:
I.  LOAD LIBRARIES & PARAMETERS
	1. Load the main nrngui.hoc
	2. Load the template for the parallelnetmanager class (used to parallelize the code)
	3. Load the template for the randomstream class (used to generate random number streams)
	4. Load the template for CellCategoryInfo class, which generates 1 object per cell type
		to store celltype specific data and enable the removal of all hard-coded cell type refs
		
II. SET MODEL SIZE, CELL DEFINITIONS
	1. Load some parameters from file
	2. Set more static parameters directly in this code
	3. Load celltype specific data
		a. For each cell type specified in the cells2include.hoc file
			i.  Read in the cell name, # cells, layer specifier, stim input specifier
			ii. Compute the start and end of the gid # range
			iii.Create an object of the CellCategoryInfo class and store the data from i & ii
			iv. Load the hoc file containing the celltype class template
		b. Load the hoc file containing the perforant path stimulation template
	4. Kill off a % of cells (specified by sclerosis factor) that specified as being in the hilar layer
	5. Recalculate the gid ranges for each cell type, now that the number of cells for some types has decreased
	6. Calculate the total number of cells including and excluding the perforant path stimulation cell(s)
	
III.SET UP PARALLEL CAPABILITY
	1. Set up a ParallelNetManager object
	2. Create a ParallelContext
	3. Call the round robin command, which distributes all cells among all processors in a round
	4. Define an iterator that can iterate over all the cells in a given range that are owned by
		the host that called the iterator
		
IV. CREATE, UNIQUELY ID, AND POSITION CELLS
	1. For each cell type defined in cells2include.hoc:
		a. For each host in the cluster:
			i.  Check that the gid is owned by the host (and it should be, because we are using the iterator)
			ii. Create a cell of that cell type and reference it in a list contained by that cellType object
			iii.Add the cell to the 'cells' list (this is something proposed by NEURON developers,
				but we don't use explicitly use it in the code)
			iv. Create an empty connection for the cell to use as a spike detector
			v.  Associate the cell with its gid and with the spike generation location (empty connection)
			vi. Calculate and store the cell's position using an algorithm based on gid, cell type,
				# of cells of that type, # available 'bins'

V.	CONNECT THE CELLS AND CONNECT THE PERFORANT PATH TO SOME CELLS
	1. For each cell type x cell type combination, load in the connection properties
		(probability, weight, delay # synapses to choose from)
		a. If the probability of connection is not 0, for a given cell type x cell type combination:
		b. Iterate through each (potential) post-synaptic cell of that type that exists on the host executing this code
			i.  Iterate through each (potential) pre-synaptic cell of that type (regardless of where it lives)
			ii. Algorithmically obtain the positions of the pre- and post- cells
			iii.Calculate the distance between the cells and obtain a probability factor based on the distance and
				distribution of axon length for the pre-synaptic cell
			iv. Multiply the distribution number by the probability of those two types of cells connecting
				and by a connection factor that was artificially added to ensure the proper amount of connectivity
				between cells in a network of a given size
			v.  Pick a random number between 0 and 1 and check if it is less than this product.
			vi. If the above statement is true, make a connection between the cells with the given weight and delay
				and add the connection to a list 'nclist' (this is something proposed by NEURON developers)
	2. For each perforant path stimulator cell:
		a. Connect the cell with the middle 10% of granule cells in the network
		b. Connect the cell with the middle 10% of basket cells in the network
		c. Make 10 connections to the middle 10% of mossy cells in the network (note that with small network sizes,
			a given cell may receive more than 1 connection)
			
VI.	INITIALIZE AND RUN NETWORK, OUTPUT RESULT FILES
	1. Initialize the network using parameters specified in part I.
	2. Run a low resolution 'pre-simulation' to allow cells to 'settle' and all components to reach steady state
	3. Set the program to records all spikes of all cells on the host executing this code
	4. Run the simulation for the time specified in part I, at the resolution specified in part I.
	5. Output various result files:
		a. A spike raster file giving spike times # gids of spiking cells
		b. A connection file that gives pre- and post- synaptic cell gids and synapse types
		c. A position file that gives the gid and x, y, and z coordinates of each cell
		d. A cell type file that gives cell name and gid range for each cell type
		e. A runtimes file that gives the real time taken by each code section in seconds

DATASETS
Dataset Files - Column Headers

cellnumbers_###.dat:
Cell Type Name - name of the cell as it will be referred to in the conndata and syndata datasets, as well as elsewhere in the code and analysis
Technical Type - which code template to use for the cell (class_[technicalcell].hoc). have these two decoupled means we can play around with which ephys profile to use with which cell if we are trying to study/break a phenomenon we see in the network
Number - number of cells to include in the model (if at full scale, Scale==1.  Will be scaled down proportionally for smaller scale models)
Layer - Which layer (in 3D) to place the cell, 0-oriens, 1-pyramidale, 2-radiatum, 3-lacunosum-moleculare
Artifical Flag - 0: realistic cell, 1: artificial point process spike train cell, 2: Izhikevich neuron


conndata_###.dat:
Presynaptic Cell Type
PostSynaptic Cell Type
Synapse Weight - weight of each synaptic connection in the units of the corresponding mod file's conductance. For this model, we always use microSemiens, uS
Number of Connections - In terms of Convergence onto a single cell: the number of presynaptic cells of that type that connect to 1 postsynaptic cell of the postsynaptic type
Synapses/Connection - since connections between cells often comprise multiple synapses, here set the number of synapses that will be made between each "connection" of 1 presynaptic to 1 postsynaptic cell

syndata_###.dat:
PostSynaptic Cell Type
Presynaptic Cell Type
Synapse Mechanism - corresponds to the name of the NMODL mechanism to use for the synapse (the SUFFIX within the NEURON block of the mod file)
Section List - the section list on the postsynaptic cell (must be defined in that celltype's class_.hoc template) where synapses of this type can be found
Distance Condition 1 - criteria for distance away from the soma synapses may occur (on sections within the section list only)
Distance Condition 2 - criteria for distance away from the soma synapses may occur (on sections within the section list only)
Scaling parameter - blank for all synapses in this model
Tau1 - for all synapses except mixed GABA_AB (for which this field is blank), the 10-90% rise time of the synapse (ms)
Tau2 - for all synapses except mixed GABA_AB (for which this field is blank), the decay time constant of the synapse (ms)
e - for all synapses except mixed GABA_AB (for which this field is blank), the reversal potential of the synapse (mV)
Tau1a - for mixed GABA_AB synapses only (for all others this is blank), the 10-90% rise time of the GABA_A conductance of the synapse (ms)
Tau2a - for mixed GABA_AB synapses only (for all others this is blank), the decay time constant of the GABA_A conductance of the synapse (ms)
ea - for mixed GABA_AB synapses only (for all others this is blank), the reversal potential of the GABA_A conductance of the synapse (mV)
Tau1b - for mixed GABA_AB synapses only (for all others this is blank), the 10-90% rise time of the GABA_B conductance of the synapse (ms)
Tau2b - for mixed GABA_AB synapses only (for all others this is blank), the decay time constant of the GABA_A conductance of the synapse (ms)
eb - for mixed GABA_AB synapses only (for all others this is blank), the reversal potential of the GABA_A conductance of the synapse (mV)