//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*======================================================================================================================*/
/*GLUT Poisson synapses are distributed at all basal dendrites
  GABA periodic (40Hz) stimulus is pointed at soma*/
/*======================================================================================================================*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*======================================================================================================================*/
/*distribute synapses over the basal dendrites*/
/*=========================================*/
/////////////////////////////////////////////

Glucon=60           //uM   glutamate concentration

cell_area1 = 0
totnseg1 = 0
 
forsec basaldend {
    for i = 1, nseg {
        node_pos1 = (2*i -1)/(2*nseg)
        cell_area1 = cell_area1 + area(node_pos1)
        totnseg1 = totnseg1 +1
    }
}
fprint("cell area = %f um^2\n" , cell_area1)
fprint("total number of segments in cell = %d\n" , totnseg1)

//gamma1=0.025                              //(nS)
//AMPA_weight1=100e-6                      //(uS)
//GABA_weight1=1000e-6                      //(uS)

GLUprefreq_per1 = 3             //Hz
//GABAprefreq_per1 = 40

//events = 6000

//nsyn_start_GLUT1 = 1000		
nsyn_start_GABA1 = events/GABAprefreq_per1


GLUprefreq1 = GLUprefreq_per1*nsyn_start_GLUT1                 
GABAprefreq1 = GABAprefreq_per1*nsyn_start_GABA1                
 
numGLUT1=GLUprefreq1*tstop*0.001
 
densityGLUT1 = cell_area1/nsyn_start_GLUT1
fprint("densityGLUT = %f (um^2)/synapse\n", densityGLUT1)
 
 
objref AMPAsyn1[nsyn_start_GLUT1], NMDAsyn1[nsyn_start_GLUT1], ns_GLUT1[nsyn_start_GLUT1]
objref GABAsyn1
 
objref nonint_nsynvec1
nonint_nsynvec1 = new Vector(1)      //since the floor function can only be used for vectors
 
/*initializations for GLUT synapses*/
leftover_area1 = 0
nsyn_used_GLUT1 = 0
nsyn_left_GLUT1 = nsyn_start_GLUT1

segnum_cell1 = 0
                                                      
forsec basaldend {
    //fprint("SECTION %s\n", secname())
    //fprint("number of segments in section = %d\n", nseg)
    //fprint("number of GLUT synapses left to distribute = %d\n", nsyn_left_GLUT)
   
    segnum_sec1 = 1                                  				//initialization
    nsynGLUTsec1 = 0                         	   		     	 	//initialization
    while(nseg >= segnum_sec1 && nsyn_left_GLUT1>0) {
        //fprint("segment number %d\n", segnum_sec1)
        //fprint("we are on segment # %d of a total of %d segments in the cell\n", segnum_cell+1, totnseg)
        node_pos1 = (2*segnum_sec1-1)/(2*nseg)
        area_seg1 = area(node_pos1)         					//microns^2, returns the area of the segment which contains node point
        //fprint("area of segment %d = %f um^2\n", segnum_sec1, area_seg1)
        //fprint("leftover area = %f um^2\n", leftover_area1)
        area_avail1 = leftover_area1 + area_seg1
        nonint_nsyn1 = area_avail1/densityGLUT1
        nonint_nsynvec1.x[0] = nonint_nsyn1
        nonint_nsynvec1.floor()
        nsyn_allocate1 = nonint_nsynvec1.x[0] 
        leftover_area1 = (nonint_nsyn1 - nsyn_allocate1)*densityGLUT1
        
        nsyn_allocated1 = 0                      			//initialization
        while (nsyn_allocate1>nsyn_allocated1  &&   nsyn_left_GLUT1>0)  {
        	AMPAsyn1[nsyn_used_GLUT1] = new Exp2Syn(node_pos1)       //put a synapse in the center of each segment
		AMPAsyn1[nsyn_used_GLUT1].tau1 = .5			//ms
		AMPAsyn1[nsyn_used_GLUT1].tau2 = 2			//ms
		AMPAsyn1[nsyn_used_GLUT1].e = 0				//mV

                NMDAsyn1[nsyn_used_GLUT1] = new NMDA_TESTED(node_pos1)			
                NMDAsyn1[nsyn_used_GLUT1].nchan  =  1  //  (pS)  set number of channels (maximum conductance)
                NMDAsyn1[nsyn_used_GLUT1].gamma = gamma1 // (ns) single channel conductance
                NMDAsyn1[nsyn_used_GLUT1].del = 0       //delay of Neurotransmitter pulse
                NMDAsyn1[nsyn_used_GLUT1].dur = 10     //duration of Neurotransmitter pulse
                NMDAsyn1[nsyn_used_GLUT1].conc = 0     // uM

       	        ns_GLUT1[nsyn_used_GLUT1] = new NetStim(node_pos1)
                ns_GLUT1[nsyn_used_GLUT1].interval = 1/GLUprefreq_per1*1000
                ns_GLUT1[nsyn_used_GLUT1].start = 0
                ns_GLUT1[nsyn_used_GLUT1].noise = 1
                ns_GLUT1[nsyn_used_GLUT1].number = numGLUT1

                nsyn_used_GLUT1 = nsyn_used_GLUT1 + 1
       	        nsyn_left_GLUT1 = nsyn_start_GLUT1 - nsyn_used_GLUT1
       	        nsyn_allocated1 = nsyn_allocated1 +1
       	        nsynGLUTsec1 =  nsynGLUTsec1 + 1
        }
        //fprint("number of GLUT synapses allocated for this segment = %d\n", nsyn_allocated1)
        segnum_sec1 = segnum_sec1 + 1
        segnum_cell1 = segnum_cell1 + 1
    }
    fprint("number of GLUT synapses used for section %s = %d\n", secname(), nsynGLUTsec1)
}
//fprint("went through %d segments out of total %d segments in the cell\n", segnum_cell, totnseg1)
fprint("total number GLUT synapses used in cell = %d out of %d GLUT synapses available\n", nsyn_used_GLUT1, nsyn_start_GLUT1)




   
fprint("=====================================================================================================================================\n")
fprint("=====================================================================================================================================\n")
fprint("=====================================================================================================================================\n\n\n\n\n\n")
 
 

/*initializations for GABA synapses*/

soma { 
      GABAsyn1 = new Exp2Syn(0.5)        	//put a synapse in the center of each segment
      GABAsyn1.tau1= amp1 //.5         			//ms	
      GABAsyn1.tau2 = amp2 //7         			//ms
      GABAsyn1.e = -70	     			//mV
      fprint("GABA section %s\n", secname())
} 

	print "GLUprefreq1 = ", GLUprefreq1 
	print "GABAprefreq1 = ", GABAprefreq1
	//print "pathnumber1 = ", pathnum1

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*======================================================================================================================================================*/
/*create the spike time vectors for all the synapses*/
/*==================================================*/
//////////////////////////////////////////////////////

nsynGLUT1 = nsyn_used_GLUT1

strdef basename, aftername, extension, filename

objectvar gabafile1
basename = "Codes for periodic inhibition/GABAprespikes_delta2_"
aftername = "_"
extension = "dat"

sprint(filename, "%s%g%s%d%s%d.%s", basename, delta, aftername, GABAprefreq_per1, aftername, events, extension)
gabafile1 = new File(filename)
gabafile1.ropen()

objref GABAtimevec1
nspiketimes_GABA1 = gabafile1.scanvar()
GABAtimevec1 = new Vector(nspiketimes_GABA1)				
for h = 0,nspiketimes_GABA1-1 {
     GABAtimevec1.x[h] = gabafile1.scanvar()
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*create netcon objects and load syntimevecs into the event queue for the netcon objects*//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////


objectvar ncAMPA1[nsynGLUT1]     
objectvar ncNMDA1[nsynGLUT1]  
objectvar ncGABA1, null, fih_GABA1

fih_GABA1 = new FInitializeHandler("loadqueueGABA1()")

proc loadqueueGABA1() { local jj
  for jj=0,GABAtimevec1.size()-1 ncGABA1.event(GABAtimevec1.x[jj])
}

//////////////////////////////////////////////////////////////////////////////////

for k = 0, nsynGLUT1-1  {
	ncAMPA1[k] = new NetCon(ns_GLUT1[k], AMPAsyn1[k])
    		ncAMPA1[k].weight = AMPA_weight1      		      //uS
	ncNMDA1[k] = new NetCon(ns_GLUT1[k], NMDAsyn1[k])
		ncNMDA1[k].weight = (Glucon)  			//uM   25e-6
}

ncGABA1 = new NetCon(null, GABAsyn1)
ncGABA1.weight = GABA_weight1   //uS

 
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/* total conductance of each kind of receptor*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////

fprint("somatic periodic inhibition")
fprint("number of basal ex synapses = %d", nsyn_start_GLUT1)
fprint("delta=%g", delta)
fprint("events=%g", events)
fprint("tau1=%g", amp1)
fprint("tau2=%g", amp2)
fprint("gca_proximal=%g", gca_proximal)
fprint("g_gaba=%g", GABA_weight1)
fprint("ghbar=%g", ghbar)