{load_file("nrngui.hoc")}				// Standard definitions - NEURON library file

chdir("setupfiles")
{load_file("../setupfiles/defaultvar.hoc")}	// Contains the proc definition for default_var proc
{default_var("NumData",100)}		// for paired recording, use these synapse weights
{default_var("SynData",100)}		// for paired recording, use these synapse weights
{default_var("path2ConnData","../datasets/conndata_%g.dat")}		// for paired recording, use these synapse weights
{default_var("path2SynData","../datasets/syndata_%g.dat")}		// for paired recording, use these synapse weights
{default_var("filesavepath","../cells")}		// for paired recording, use these synapse weights

{load_file("../setupfiles/SynStore.hoc")}	// Contains the template that defines a 

strdef cmdstr
objref f2
	f2 = new File()
	sprint(cmdstr, "../datasets/cellnumbers_%g.dat", NumData)
	f2.ropen(cmdstr)		// Open the celltype
	
	numCellTypes = f2.scanvar       // Scan the first line, which contains a number giving the
									// # cell types, including stimulating (artificial) cells (still?)

objref celltypestring[numCellTypes], techstring[numCellTypes], cellType[numCellTypes], cell
double cellnumvar[numCellTypes], cellLayerflag[numCellTypes], cellArtflag[numCellTypes]

begintemplate CellCategoryInfo
	public cellType_string, technicalType, setCellTypeParams, SynList, setSynList
	objref SynList, this
	strdef cellType_string, technicalType
	proc setCellTypeParams(){
		cellType_string = $s1		// Name of the cell type
		technicalType = $s2
	}
	
	proc setSynList(){			// From a file, read in the constants
		objref SynList[$1]
	}
endtemplate CellCategoryInfo	

for i=0, numCellTypes-1 {
	celltypestring[i]= new String()
	techstring[i] = new String()
	f2.scanstr(celltypestring[i].s)				// Scan in the cell name
	f2.scanstr(techstring[i].s)
	cellnumvar[i]=f2.scanvar					// Scan in the initial (before sclerosis) number of each cell type
	cellLayerflag[i]=f2.scanvar					// Scan the layer flag (hilar=2, granular=1, molecular=0), where hilar cells
	cellArtflag[i]=f2.scanvar					// Scan the layer flag (hilar=2, granular=1, molecular=0), where hilar cells

	cellType[i] = new CellCategoryInfo(i)	// Make one object for each cell type to store cell type info
	cellType[i].setCellTypeParams(celltypestring[i].s, techstring[i].s)
}

{load_file("../setupfiles/load_cell_syns.hoc")}	// Load in the cell connectivity info

DegreeStim=1
strdef filestr
sprint(filestr,"%s/allsyns.dat",filesavepath) 
objref fAll, fSyn
fAll = new File(filestr)
fAll.wopen()
sprint(filestr,"%s/synlist.dat",filesavepath)
fSyn = new File(filestr)
fSyn.wopen()

strdef cmdstr, tempFileStr
objref newSecRef
for i = 0, numCellTypes-1 {
	if (cellArtflag[i]==0) {
		sprint(tempFileStr,"../cells/class_%s.hoc", cellType[i].technicalType)	// Concatenate the
		load_file(tempFileStr)			// Load the file with the template that defines the class
		sprint(cmdstr, "cell = new %s(i,i,i)", cellType[i].technicalType)
		{execute1(cmdstr)}
		ist = 0
		ien = 0
		myi = 0
		access cell.soma[0]
		{distance()}

		for precellType = 0, numCellTypes-1 {
			ist = myi
			for r=0, cellType[i].SynList[precellType].count()-1 {
				sprint(cmdstr,"newSecRef = cell.%s",cellType[i].SynList[precellType].object(r).SecRefStr)
				execute(cmdstr) // sets newSecRef
							
				forsec newSecRef {		
					for (x,0) {
						execute(cellType[i].SynList[precellType].object(r).CondStr)
						 if (y==1) {
							fSyn.printf("%s %s %g %s\n", cellType[i].cellType_string, cellType[precellType].cellType_string, myi, secname())
							myi = myi + 1
						}
					}
				}
			}
			ien = myi - 1
			if (ien>=ist) {fAll.printf("%s %s %g %g\n", cellType[i].cellType_string, cellType[precellType].cellType_string, ist, ien)}
		}
	}
}

fAll.close()
fSyn.close()


f2.close
quit()