// written by Gabriela Cirtala
// Heterogenous ion channel conductance density model
// This code corresponds to simultaneous activation of Branch 5 and 10 of the PC (Figure 7 in Cirtala2024)
// This code is based on the code written by Yunliang Zang for the homogenous PC model proposed in Zang and De Schutter 2021, Journal of Neuroscience.
// This code will automatically run for PF in [2:2:150] for 1.0CaP for branch 5 and 1.5CaP for branch10
// Generates many .dat files corresponding to each PF and each point at which the voltage is recorded (check Results folder)
// Shows the dendritic spike propagation (check at PF activation time

load_file("nrngui.hoc")

Default_Eleak = -65
membranecap = 0.64      	/* specific membrane capacitance in uF cm^-2 */
membraneresist = 120236 	/* specific membrane resistance in ohm cm^2 */
axialresist = 120	     	/* axial resistivity in ohm cm */

	xopen("PurkinjeMorphology_allbr.nrn")	// Load the morphology file.
	forsec "axon" delete_section()	// Delete original axon and add a fake AIS

objref g2, b2,c2, distrx, distry, cdistry, p

	forall {
		insert pas e_pas=Default_Eleak	/* Insert Leak everywhere */
	  insert hpkj	// Ih inserted everywhere
		insert ds
		insert pk
	}

    AIS {  g_pas=1/membraneresist Ra=axialresist cm=membranecap}
	forsec spinydend {g_pas=5.3/membraneresist Ra=axialresist cm=5.3*membranecap}
    forsec maindend {g_pas=1.2/membraneresist Ra=axialresist cm=1.2*membranecap}
	forsec "soma" { g_pas=1/membraneresist Ra=axialresist cm=membranecap}

	forsec maindend {insert cdp4N}
	forsec alldend {
			insert Kv3
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 4
			insert newCaP
			pcabar_newCaP = 1.90e-4
			vshift_newCaP =-5
			insert CaT3_1
			pcabar_CaT3_1 = 2.7e-5
			insert mslo
			gbar_mslo = 0.21504
			insert SK2
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			ghbar_hpkj = 0.00036
			insert Kv1
			gbar_Kv1 = 0.002//*2
			insert Kv4
			gbar_Kv4 = 0.0252
			insert Kv4s
			gbar_Kv4s = 0.015

	}
	forsec spinydend {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}


	forsec branch1 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch2 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP  = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch3 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch4 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch5 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.9
			gbar_Kv4s = 0.015*1.9
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch6 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*2.2
			gbar_Kv4s = 0.015*2.2
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch7 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*2.6
			gbar_Kv4s = 0.015*2.6
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch8 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*2.2
			gbar_Kv4s = 0.015*2.2
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP  = 7.6000e-04*0.9
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch9 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch10 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04*1.5
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch11 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.2
			gbar_Kv4s = 0.015*1.2
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch12 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.3
			gbar_Kv4s = 0.015*1.3
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04*0.8
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch13 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.9
			gbar_Kv4s = 0.015*1.9
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch14 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch15 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch16 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch17 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch18 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.0
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch19 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.0
			gbar_Kv4s  = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch20 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264*1.0
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch21 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 =  0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP  =7.6000e-04*0.8
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	forsec branch22 {
			insert cdp4Nsp
			gkbar_SK2 = 3.6000e-04
			scal_SK2 = 1.0
			gbar_Kv4 = 0.0264
			gbar_Kv4s = 0.015
			ghbar_hpkj = 3.2400e-04
			vshift_Kv4 = 0
			gbar_Kv1 = 0.001
			gbar_Kv3 = 0.1512
			vshift_Kv3 = 0
			pcabar_CaT3_1 = 1.0800e-04
			pcabar_newCaP = 7.6000e-04*0.8
			vshift_newCaP = -5
			scale_cdp4Nsp = 3.5
			gbar_mslo = 0.0896
			insert abBK
			gabkbar_abBK = 0.15
	}

	somaA distance(0,0.5)
	access somaA

	//xopen("dendv_arnd21.ses")

	forsec "soma" {
	 // INa & IK's at soma only
	//for soma, I make it fire under dissociated condition. The firing properties is comparable with Bean's data
			insert naRsg		// INa + resurgent
			gbar_naRsg = 0.03168
			vshifta_naRsg = 0
			vshiftk_naRsg = 0
			vshifti_naRsg = -5

			insert nap
			gbar_nap =  1.4000e-04
			insert pk
			ena = 63
			ghbar_hpkj = 1.0800e-04 // Default = 1

			insert cdp20N_FD2
			insert Kv3
			gbar_Kv3 = 1.8
			vshift_Kv3 = 4

			insert Kv1
			gbar_Kv1 = 0
			insert newCaP
			pcabar_newCaP = 1.9000e-04
			kt_newCaP = 1
			vshift_newCaP = -5
			insert mslo
			gbar_mslo = 0.8736
			insert abBK
			gabkbar_abBK = 0.3
			insert SK2
			gkbar_SK2 = 0.0075
	}

	AIS {
			insert naRsg		// INa + resurgent
			gbar_naRsg = 0.56
			vshifta_naRsg = 15
			vshiftk_naRsg = 5
			vshifti_naRsg = -5

			insert nap
			gbar_nap = 0.0023

			insert CaT3_1
			pcabar_CaT3_1 =  1.2800e-04
			ena = 63
			ghbar_hpkj =  1.0800e-04


			insert cdpAIS
			insert Kv3
			gbar_Kv3 = 115.2
			vshift_Kv3 = 4
			insert Kv1
			gbar_Kv1 = 0

			insert newCaP
			pcabar_newCaP = 0.00228
			kt_newCaP = 1
			vshift_newCaP = -5

			insert mslo
			gbar_mslo = 6
			insert abBK
			gabkbar_abBK = 1.05
			insert SK2
			gkbar_SK2 = 0.0278
	}


objref patch_site
patch_site = new List()

ip = 0
forsec patch_list {
patch_site.append(new SectionRef())

}

celsius = 34
dt = 0.02
steps_per_ms = 1/dt
dtsim = 0.02
ntrial = 500
tstop = 600 //final time

Nsyn_grc = 1
Ngrc = 2000
NPFsyn = Ngrc*Nsyn_grc

Nsyn_ST = 16
NST = 9
NSTsyn = Nsyn_ST*NST

Nsyn_BS = 40
NBS = 4
NBSsyn = Nsyn_BS*NBS

Freq_pf = 0.135
Freq_st = 14.4
Freq_bs = 14.4


objref g2, b2,c2, distrm, distrd, rt, rn
xopen ("electrode.hoc")
xopen("distri.hoc")	//voltage spatial distribution

v_init = -70

objref scalefile
scalefile=new File()

xopen("distri_synapse.hoc")
xopen("background_syn_distrib.hoc")

//start parallel instance
objref pc
pc = new ParallelContext()

//print "number of hosts: ", pc.nhost(), "\thost id: ", pc.id()

//function farmed out to slave nodes
func distscale() {local key, errval, cu_id, spk_id, syn_id localobj parvec, returnlist
	key = $1
	cu_id = int($1/10000000000)
	spk_id = int(($1 - cu_id*10000000000)/100000000)
	site_id = int(($1 - cu_id*10000000000-spk_id*100000000)/1000000)
	syn_id = int(($1 - cu_id*10000000000-spk_id*100000000-site_id*1000000)/10000)
	trial_id = $1 - cu_id*10000000000-spk_id*100000000-site_id*1000000-syn_id*10000
	returnlist = new List()
	returnlist = calc_EPSP_single(cu_id,spk_id,site_id,syn_id,trial_id)

	pc.pack(returnlist.o(0))
	pc.pack(returnlist.o(1))
	pc.pack(returnlist.o(2))
	pc.pack(returnlist.o(3))
	pc.pack(returnlist.o(4))
	pc.pack(returnlist.o(5))
	pc.pack(returnlist.o(6))
	pc.pack(returnlist.o(7))
	pc.pack(returnlist.o(8))
	pc.pack(returnlist.o(9))
	pc.pack(returnlist.o(10))
	pc.pack(returnlist.o(11))
	pc.pack(returnlist.o(12))
	pc.pack(returnlist.o(13))
	pc.pack(returnlist.o(14))
	pc.pack(returnlist.o(15))
	pc.pack(returnlist.o(16))
	pc.pack(returnlist.o(17))
	pc.pack(returnlist.o(18))
	pc.pack(returnlist.o(19))
	pc.pack(returnlist.o(20))
	pc.pack(returnlist.o(21))
	pc.pack(returnlist.o(22))
	pc.pack(returnlist.o(23))
	pc.pack(returnlist.o(24))
	pc.post(key)
	return key
}

objref aSynapseList[11]
objref recording, baby1, babyend,babybranchlet, temone,terminal

obfunc calc_EPSP_single() {localobj outlist, currecord, integ_soma, br0, br1, tip0, tip1, onpath, patch, tip_br1, tip_br2, tip_br3, tip_br4, tip_br5, tip_br6, tip_br7, tip_br8, tip_br9, tip_br10, tip_br11, tip_br12, tip_br13, tip_br14,tip_br15,tip_br16,tip_br17,tip_br18,tip_br19,tip_br20,tip_br21,tip_br22
	//function to calculate the max deflection due to a single synapse
	cu_id = $1
	dspk_id = $2
	siteval = $3
	synval= $4
	tr_id = $5
	curr = -0.4+(cu_id-1)*0.2
	nlist = 2

	Npf = 2+(synval-1)*2

for i = 1,nlist {aSynapseList[i-1] = new List() }	// every time this will be initialized.

randomseed0 = cu_id*10000000000+dspk_id*100000000+siteval*1000000 +synval*10000 + tr_id
randomseed1 = randomseed0+dspk_id-siteval

rt = new Random(randomseed0)
rt.uniform(0,25)

rn = new Random(randomseed0)
rn.normal (0, 0.6)

br0 = new SectionList()
br1 = new SectionList()

patch_site.o(dspk_id-1).sec br0.subtree()
patch_site.o(siteval-1).sec br1.subtree()
br0.remove(cf)
br0.unique()
br1.remove(cf)
br1.unique()

if (dspk_id==12) {
	br0 = new SectionList()
	forsec "dendA1_001101100*" br0.append()
}
if (dspk_id==13) {
	br0 = new SectionList()
	forsec "dendA1_0011011100*" br0.append()
	forsec "dendA1_0011011101*" br0.append()
}

if (siteval==12) {
	br1 = new SectionList()
	forsec "dendA1_001101100*" br1.append()
}
if (siteval==13) {
	br1 = new SectionList()
	forsec "dendA1_0011011100*" br1.append()
	forsec "dendA1_0011011101*" br1.append()
}

//br1.printnames()
tip0 = new Vector()
tip_br1 = new Vector()
tip_br2 = new Vector()
tip_br3 = new Vector()
tip_br4 = new Vector()
tip_br5 = new Vector()
tip_br6 = new Vector()
tip_br7 = new Vector()
tip_br8 = new Vector()
tip_br9 = new Vector()
tip_br10 = new Vector()
tip_br11 = new Vector()
tip_br12 = new Vector()
tip_br13 = new Vector()
tip_br14 = new Vector()
tip_br15 = new Vector()
tip_br16 = new Vector()
tip_br17 = new Vector()
tip_br18 = new Vector()
tip_br19 = new Vector()
tip_br20 = new Vector()
tip_br21 = new Vector()
tip_br22 = new Vector()


aSynapseList[0] = distSyns(Npf,br0,randomseed0)

if (dspk_id  == 8) {
	tip0.record(&dendA1_001011110110010110.v(0.5))
} if (dspk_id  == 1) {
tip0.record(&dendA1_00001101.v(0.5))
} if (dspk_id  == 2) {
tip0.record(&dendA1_001000111.v(0.05))
}
 if (dspk_id  == 3) {
tip0.record(&dendA1_0010101100.v(0.5))
} if (dspk_id  == 21) {
	tip0.record(&dendA1_0100100100110110001.v(0.5))
}


	tip_br1.record(&dendA1_00001101.v(0.5))
	tip_br2.record(&dendA1_001000111.v(0.05))
	tip_br3.record(&dendA1_0010101100.v(0.5))
	tip_br4.record(&dendA1_00101101001111.v(0.5))
	tip_br5.record(&dendA1_00101110101000110.v(0.5))
	tip_br6.record(&dendA1_0010111100111.v(0.5))
	tip_br7.record(&dendA1_0010111101011001111.v(0.5))
	tip_br8.record(&dendA1_001011110110010101.v(0.5))
	tip_br9.record(&dendA1_001100110001110.v(0.5))
	tip_br10.record(&dendA1_00111000010.v(0.5))
	tip_br11.record(&dendA1_00110101101101.v(0.5))
	tip_br12.record(&dendA1_0011011000001011100.v(0.5))
	tip_br13.record(&dendA1_0011011101010010.v(0.5))
	tip_br14.record(&dendA1_0110110.v(0.5))
	tip_br15.record(&dendA1_01010101011.v(0.5))
	tip_br16.record(&dendA1_01000100001.v(0.5))
	tip_br17.record(&dendA1_01001011001100.v(0.5))
	tip_br18.record(&dendA1_0100110010.v(0.5))
	tip_br19.record(&dendA1_01001110001.v(0.5))
	tip_br20.record(&dendA1_01001000000111.v(0.5))
	tip_br21.record(&dendA1_0100100100110110001.v(0.5))
	tip_br22.record(&dendA1_0100100110000110.v(0.5))


aSynapseList[1] = distSyns(Npf,br1,randomseed1)

for i = 1,nlist {
	for ii=1,aSynapseList[i-1].count() {
  	  aSynapseList[i-1].object(ii-1).onset = 400
  	  aSynapseList[i-1].object(ii-1).tau0 = 0.3
  	  aSynapseList[i-1].object(ii-1).tau1 = 3
   	 aSynapseList[i-1].object(ii-1).e = 0
   	 aSynapseList[i-1].object(ii-1).gmax = 0.5e-3//
	}
}

// following are background synapses

// need new random numbers

nvecpf = new Vector(numsegsp, 0)
nvecst= new Vector(numsegsp, 0)
nvecbs= new Vector(numsegbs, 0)

ampsynlist = new List()
gabastsynlist = new List()
gababssynlist = new List()
ampsynprelist = new List()
gabastsynprelist = new List()
gababssynprelist = new List()

for ii=1,NPFsyn {
  x = mtotalpf/NPFsyn*(ii-1) //value drawn from uniform distribution over [0,mtotal]
  jj = mvecpf.indwhere(">=", x) // the first element in mvecpf that is >=x
  // this is the index of the segment that should get the synapse
  nvecpf.x[jj] += 1             // the value will be 1 if it get the synapses
}

for ii=1,NSTsyn {
  x = mtotalpf/NSTsyn*(ii-1) //value drawn from uniform distribution over [0,mtotal]
  jj = mvecst.indwhere(">=", x) // the first element in mvecpf that is >=x
  // this is the index of the segment that should get the synapse
  nvecst.x[jj] += 1         // the value will be 1 if it get the synapses
}

for ii=1,NBSsyn {
  x = mtotalbs/NBSsyn *(ii-1) //value drawn from uniform distribution over [0,mtotal]
  jj = mvecbs.indwhere(">=", x) // the first element in mvecpf that is >=x
  // this is the index of the segment that should get the synapse
  nvecbs.x[jj] += 1             // the number of synapses in this segment
}

ii = 0
forsec spinydend {
  for (x, 0) {
    num = nvecpf.x[ii]
    if (num>0) {
      for jj=1,num {ampsynlist.append(new Exp2Syn(x)) ampsynprelist.append(new NetStim(x))}
    }
    ii += 1 // we're moving on to the next segment,
  }
}

ii = 0
forsec spinydend {
  for (x, 0) {
    num = nvecst.x[ii]
    if (num>0) {
      for jj=1,num {gabastsynlist.append(new Exp2Syn(x)) gabastsynprelist.append(new NetStim(x))}
    }
    ii += 1 // we're moving on to the next segment,
  }
}

ii = 0
forsec bs {
  for (x, 0) {
    num = nvecbs.x[ii]
    if (num>0) {
      for jj=1,num {gababssynlist.append(new Exp2Syn(x)) gababssynprelist.append(new NetStim(x))}
    }
    ii += 1 // we're moving on to the next segment,
  }
}
for i = 0, Ngrc-1 {
 	   ampsynprelist.object(i).interval = 1000/Freq_pf
 	   ampsynprelist.object(i).number = 10000
 	   ampsynprelist.object(i).start = 0
 	   ampsynprelist.object(i).noise = 1
		ampsynprelist.object(i).seed(i+SEED_0+randomseed0)
	for j=0,Nsyn_grc-1 {
	   ampsynlist.object(Nsyn_grc*i+j).tau1 = 0.3
	   ampsynlist.object(Nsyn_grc*i+j).tau2 = 3
 	   ampsynlist.object(Nsyn_grc*i+j).e = 0

	   ampcon[Nsyn_grc*i+j] = new NetCon(ampsynprelist.object(i),ampsynlist.object(Nsyn_grc*i+j))
	   ampcon[Nsyn_grc*i+j].weight = 0.5e-3
	}
}

for i = 0,NST-1 {
 	gabastsynprelist.object(i).interval = 1000/Freq_st
	gabastsynprelist.object(i).number = 10000
	gabastsynprelist.object(i).start = 0
	gabastsynprelist.object(i).noise = 1
	gabastsynprelist.object(i).seed(i+SEED_1+randomseed0)

	for j=0,Nsyn_ST-1 {
	    gabastsynlist.object(Nsyn_ST*i+j).tau1 = 1
	    gabastsynlist.object(Nsyn_ST*i+j).tau2 = 8
	    gabastsynlist.object(Nsyn_ST*i+j).e = -85
	    gabastcon[Nsyn_ST*i+j] = new NetCon(gabastsynprelist.object(i),gabastsynlist.object(Nsyn_ST*i+j))
	    gabastcon[Nsyn_ST*i+j].weight = 0.1e-3
	}
}

for i = 0, NBS-1{
	    gababssynprelist.object(i).interval = 1000/Freq_bs
	    gababssynprelist.object(i).number = 10000
	    gababssynprelist.object(i).start = 0
	    gababssynprelist.object(i).noise = 1
	    gababssynprelist.object(i).seed(i+SEED_2+randomseed0)

	for j=0,Nsyn_BS-1 {
	    gababssynlist.object(Nsyn_BS*i+j).tau1 = 1
	    gababssynlist.object(Nsyn_BS*i+j).tau2 = 8
	    gababssynlist.object(Nsyn_BS*i+j).e = -85

	    gababscon[Nsyn_BS*i+j] = new NetCon(gababssynprelist.object(i),gababssynlist.object(Nsyn_BS*i+j))
	    gababscon[Nsyn_BS*i+j].weight = 0.1e-3
	}
}

forsec br1 {
temone = new SectionRef()
if (temone.nchild == 0) {temone.sec terminal = new SectionRef()}
}

	outlist=new List()
	integ_soma = new Vector()
/******	Details: Transfers take place on exit from finitialize() and on exit from fadvance(). *******/
	integ_soma.record(&somaA.v(0.5))

	tip1 = new Vector()
	tip1.record(&terminal.sec.v(0.5))

	tip_br1 = new Vector()
	tip_br2 = new Vector()
	tip_br3 = new Vector()
	tip_br4 = new Vector()
	tip_br5 = new Vector()
	tip_br6 = new Vector()
	tip_br7 = new Vector()
	tip_br8 = new Vector()
	tip_br9 = new Vector()
	tip_br10 = new Vector()
	tip_br11 = new Vector()
	tip_br12 = new Vector()
	tip_br13 = new Vector()
	tip_br14 = new Vector()
	tip_br15 = new Vector()
	tip_br16 = new Vector()
	tip_br17 = new Vector()
	tip_br18 = new Vector()
	tip_br19 = new Vector()
	tip_br20 = new Vector()
	tip_br21 = new Vector()
	tip_br22 = new Vector()

		tip_br1.record(&dendA1_00001101.v(0.5))
		tip_br2.record(&dendA1_001000111.v(0.05))
		tip_br3.record(&dendA1_0010101100.v(0.5))
		tip_br4.record(&dendA1_00101101001111.v(0.5))
		tip_br5.record(&dendA1_00101110101000110.v(0.5))
		tip_br6.record(&dendA1_0010111100111.v(0.5))
		tip_br7.record(&dendA1_0010111101011001111.v(0.5))
		tip_br8.record(&dendA1_001011110110010101.v(0.5))
		tip_br9.record(&dendA1_001100110001110.v(0.5))
		tip_br10.record(&dendA1_00111000010.v(0.5))
		tip_br11.record(&dendA1_00110101101101.v(0.5))
		tip_br12.record(&dendA1_0011011000001011100.v(0.5))
		tip_br13.record(&dendA1_0011011101010010.v(0.5))
		tip_br14.record(&dendA1_0110110.v(0.5))
		tip_br15.record(&dendA1_01010101011.v(0.5))
		tip_br16.record(&dendA1_01000100001.v(0.5))
		tip_br17.record(&dendA1_01001011001100.v(0.5))
		tip_br18.record(&dendA1_0100110010.v(0.5))
		tip_br19.record(&dendA1_01001110001.v(0.5))
		tip_br20.record(&dendA1_01001000000111.v(0.5))
		tip_br21.record(&dendA1_0100100100110110001.v(0.5))
		tip_br22.record(&dendA1_0100100110000110.v(0.5))


stim1.del = 0
stim1.dur = rt.repick()
stim1.amp = -0.3

//rn.play (&CCn.amp)

finitialize(v_init)
continuerun(tstop)

for i = 1,nlist {aSynapseList[i-1].remove_all()}

ampsynlist.remove_all()
gabastsynlist.remove_all()
gababssynlist.remove_all()
ampsynprelist.remove_all()
gabastsynprelist.remove_all()
gababssynprelist.remove_all()

outlist.append(integ_soma)
outlist.append(tip0)
outlist.append(tip1)
outlist.append(tip_br1)
outlist.append(tip_br2)
outlist.append(tip_br3)
outlist.append(tip_br4)
outlist.append(tip_br5)
outlist.append(tip_br6)
outlist.append(tip_br7)
outlist.append(tip_br8)
outlist.append(tip_br9)
outlist.append(tip_br10)
outlist.append(tip_br11)
outlist.append(tip_br12)
outlist.append(tip_br13)
outlist.append(tip_br14)
outlist.append(tip_br15)
outlist.append(tip_br16)
outlist.append(tip_br17)
outlist.append(tip_br18)
outlist.append(tip_br19)
outlist.append(tip_br20)
outlist.append(tip_br21)
outlist.append(tip_br22)




return outlist
}

pc.runworker()

//objects for input/output
objref somavec, tipvec, patchvec, onpathvec,br1vec,br2vec,br3vec,br4vec,br5vec,br6vec,br7vec,br8vec,br9vec,br10vec,br11vec,br12vec,br13vec,br14vec,br15vec,br16vec,br17vec,br18vec,br19vec,br20vec,br21vec,br22vec

somavec = new Vector()
tipvec = new Vector()
patchvec = new Vector()
br1vec = new Vector()
br2vec = new Vector()
br3vec = new Vector()
br4vec = new Vector()
br5vec = new Vector()
br6vec = new Vector()
br7vec = new Vector()
br8vec = new Vector()
br9vec = new Vector()
br10vec = new Vector()
br11vec = new Vector()
br12vec = new Vector()
br13vec = new Vector()
br14vec = new Vector()
br15vec = new Vector()
br16vec = new Vector()
br17vec = new Vector()
br18vec = new Vector()
br19vec = new Vector()
br20vec = new Vector()
br21vec = new Vector()
br22vec = new Vector()


strdef tmpstr
strdef outDir
strdef cmd
objref outfile
outfile = new File()

proc calcEPSPs() {
	sprint(outDir,"Results")
	sprint(cmd, "system(\"mkdir -p %s\")",outDir)
	execute(cmd)
	somaA distance(0,0.5)
	// cu = 3 set the holding current to be 0 nA.
	for cu = 3, $1 {
		for dspk = $2, $2 {
			for site = $3, $3 {
				for m = 1, $4 {
					for nt =$5 ,$5 {
						mmtag=cu*10000000000 + dspk*100000000 + site*1000000 + m*10000 + nt
						pc.submit("distscale",mmtag)	//send out the error calculations
					}
				}
			}
		}
	}
	//collect error values
	while (pc.working()) {
		key = pc.retval()	//retrieve the tag
		pc.look_take(key)	//remove the tag/job from the bulletin
		somavec = pc.upkvec()	//unpack the error value associated with the tag
		tipvec = pc.upkvec()
		patchvec = pc.upkvec()
		br1vec = pc.upkvec()
		br2vec = pc.upkvec()
		br3vec = pc.upkvec()
		br4vec = pc.upkvec()
		br5vec = pc.upkvec()
		br6vec = pc.upkvec()
		br7vec = pc.upkvec()
		br8vec = pc.upkvec()
		br9vec = pc.upkvec()
		br10vec = pc.upkvec()
		br11vec = pc.upkvec()
		br12vec = pc.upkvec()
		br13vec = pc.upkvec()
		br14vec = pc.upkvec()
	  br15vec = pc.upkvec()
		br16vec = pc.upkvec()
		br17vec = pc.upkvec()
		br18vec = pc.upkvec()
		br19vec = pc.upkvec()
		br20vec = pc.upkvec()
		br21vec = pc.upkvec()
		br22vec = pc.upkvec()

		print "received key ",key
		cuno = int(key/10000000000)
		frno = int((key- cuno*10000000000)/100000000)
		siteno = int((key - cuno*10000000000 - frno*100000000)/1000000)
		synno= int((key - cuno*10000000000 - frno*100000000 - siteno*1000000)/10000)
		trno  = key - cuno*10000000000-frno*100000000-siteno*1000000-synno*10000

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vsoma.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		somavec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip0.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		tipvec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip1.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		patchvec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br1.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br1vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br2.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br2vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br3.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br3vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br4.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br4vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br5.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br5vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br6.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br6vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br7.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br7vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br8.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br8vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br9.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br9vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br10.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br10vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br11.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br11vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br12.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br12vec.printf(outfile)
		outfile.close()

	  sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br13.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br13vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br14.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br14vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br15.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br15vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br16.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br16vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br17.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br17vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br18.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br18vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br19.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br19vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br20.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br20vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br21.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br21vec.printf(outfile)
		outfile.close()

		sprint(tmpstr,"%s/%03d_%03d_%03d_%03d_%03d_vtip_br22.dat",outDir,cuno,frno,siteno,synno,trno)
		outfile.wopen(tmpstr)
		br22vec.printf(outfile)
		outfile.close()

	}
}

co_br = 10

calcEPSPs(3,5,co_br,52,1)