//*************************************************************************
// create and set netstims using champawt(), chnmdawt(), chint()



objref ConnectAMPA_[2000]
objref ConnectNMDA_[2000]
objref ConnectMGLU_[2000]
objref ConnectGABA_[2000]		// GABA only in soma
objref ConnectDR_[2000]
objref ConnectFAKE_[2000]		// NetCon that allows me to deliver an event to netstims

objref vsrc_
objref vsrcg_
objref tsrc_
objref fakeit					// i need something to connect the fake NetCon to


// create ampa connections
proc champawt() {    nAMPA_WT = $1   
    for i = 0, cell_number-1 {
    
    	for j = 0, NGLU-1 {
           	k = j*cell_number + i
			ConnectAMPA_[k] = new NetCon( NS_NetStim[k].pp, MSP_Cell[i].synlist.object[j].pp, 0, 0, nAMPA_WT) 
        }
    }
 }


// create nmda connections
proc chnmdawt() {    nNMDA_WT = $1 
    for i = 0, cell_number-1 {

    	for j = 0, NGLU-1 {
            k = j*cell_number + i
	        ConnectNMDA_[k] = new NetCon( NS_NetStim[k].pp, MSP_Cell[i].synlist.object[j+NGLU].pp, 0, 0, nNMDA_WT) 
        }
    }
}


// create mGluR connections
proc chmgluwt() {    nMGLU_WT = $1 
    for i = 0, cell_number-1 {

    	for j = 0, NGLU-1 {
            k = j*cell_number + i
	        ConnectMGLU_[k] = new NetCon( NS_NetStim[k].pp, MSP_Cell[i].synlist.object[j+2*NGLU].pp, 0, 0, nMGLU_WT) 
        }
    }
}


// create gaba connections
proc chgabawt() {    nGABA_WT = $1
    for i = 0, cell_number-1 {

        for j = 0, NGABA-1  {
            k = j*cell_number + i
            ConnectGABA_[k] = new NetCon( NS_NetStim[k+NGLU*cell_number].pp, MSP_Cell[i].synlist.object[j+3*NGLU].pp, 0, 0, nGABA_WT) 
        }
    }
}

// create DR connections
proc chdrwt() {    nDR_WT = $1 
    for i = 0, cell_number-1 {

    	for j = 0, NDA-1 {
            k = j*cell_number + i
	        ConnectDR_[k] = new NetCon( NS_NetStim[k+(NGLU+NGABA)*cell_number].pp, MSP_Cell[i].synlist.object[j+4*NGLU].pp, 0, 0, nDR_WT) 
        }
    }
}

// This procedure will use vector play to change the inputs for up and down states
proc chfreq() {		// downstate frequency, upstate frequency, time of cycle, gaba:ampa number inputs ratio
    nDS_FRQ = $1
    nUS_FRQ = $2
    nT_CYCLE = $3
    nGA_RATIO = $4

    ncyc = 7		// number of cycles, as in 1 ds, 1 us, 1 ds, 1 us, 1 ds = 5

    tsrc_ = new Vector( 20, 10e5)		// used for predicting the interval changes for jstims
    for i = 0, ncyc-2 {tsrc_.x[i] = (i+1)*nT_CYCLE}	// netstims do not change interval until new spike is registered - jstim fixes this
    tsrc_.play( "for i = 0, NSYN-1 {NS_NetStim[i].pp.change = $1}", nT_CYCLE-dt)

    vsrc_ = new Vector( 20, nDS_FRQ) 		// init to down state frequency
    vsrc_.x[1] = nUS_FRQ 				// higher frequency for up states
    vsrc_.x[3] = nUS_FRQ
    vsrc_.x[5] = nUS_FRQ
    vsrc_.x[7] = nUS_FRQ
    vsrc_.play(" for i = 0, NGLU-1 { NS_NetStim[i].pp.frequency = $1 }", nT_CYCLE-dt )

    vsrcg_ = new Vector( 20, nDS_FRQ*(NGLU/NGABA)*nGA_RATIO)	// inputs to gaba netstims
    vsrcg_.x[1] = nUS_FRQ * (NGLU/NGABA) * nGA_RATIO	
    vsrcg_.x[3] = nUS_FRQ * (NGLU/NGABA) * nGA_RATIO	
    vsrcg_.x[5] = nUS_FRQ * (NGLU/NGABA) * nGA_RATIO	
    vsrcg_.play(" for i = NGLU, NGLU+NGABA-1  { NS_NetStim[i].pp.frequency = $1 }", nT_CYCLE-dt )
}





proc make_netstims() {
	for i = 0, NGLU*cell_number-1 {		// cortical cells 
		cell_append(new NS_NetStim(), 0, 0, 0)
	}

	for i = NGLU*cell_number, (NGLU+NGABA)*cell_number-1 {	//makes NGABA interneurons
		cell_append(new NS_NetStim(), 0, 0, 0)
	}
	
	for i = (NGLU+NGABA)*cell_number, (NGLU+NGABA+NDA)*cell_number-1 {	//makes NDA
		cell_append(new NS_NetStim(), 0, 0, 0)
	}

	for i = 0, (NGLU+NGABA+NDA)*cell_number-1 {
		ConnectFAKE_[i] = new NetCon( fakeit, NS_NetStim[i].pp,1,0,1) 	// source, target, threshold, delay, weight
	}			// now, ConnectFAKE_ can be used to deliver an event to NetStim from hoc

	champawt(AMPA_WT)  
	chnmdawt(NMDA_WT)
	chmgluwt(MGLU_WT)
	chgabawt(GABA_WT)
	chdrwt(DR_WT)


	gampa(G_AMPA)
	gnmda(G_NMDA)
	//gmglu(G_MGLU)
	ggaba(G_GABA)
	
	chfreq(0,0,284,1)  // downstate frequency, upstate frequency, time of cycle, GABA:AMPA ratio
}

make_netstims()
setnetn(0)			// allows events to played into NetCons via ConnectFAKEs

print "cells loaded"