// Calculate firing rate
objref mitrate, granrate, spk, hist
spk = new Vector()
mitrate = new Vector()
granrate = new Vector()
T = (tstop-ttrans)/1000
proc firing_rate() { local i, n
for i = 0, nMit-1 {
n = 0
if (mit[i].spiketimes.size() > 0) {
spk = mit[i].spiketimes
ind = spk.indwhere(">", ttrans)
if (ind != -1) {
//print ind
n = spk.size()-ind
}
}
mitrate.append(n/T)
}
for i = 0, nGran-1 {
n = 0
if (gran[i].spiketimes.size() > 0) {
spk = gran[i].spiketimes
ind = spk.indwhere(">", ttrans)
if (ind != -1) {
//print ind
n = spk.size()-ind
}
}
granrate.append(n/T)
}
print "\n Individual MC somatic firing rate:"
mitrate.printf()
print "\n The average MC somatic rate is:"
print mitrate.mean()
print "\n Individual GC dendritic firing rate:"
granrate.printf()
print "\n The average GC dendritic rate is:"
print granrate.mean()
// Create histogram
minrate = mitrate.min()
maxrate = mitrate.max()
//hist = mitrate.histogram(minrate, maxrate, 10)
// Save results to file
outfile.wopen("data/Fmit")
mitrate.printf(outfile)
outfile.close()
outfile.wopen("data/Fgran")
granrate.printf(outfile)
outfile.close()
outfile.aopen(filename)
outfile.printf("\nMitral average rate: %10.3f\n", mitrate.mean())
outfile.printf("Std: %10.3f\n", mitrate.stdev())
outfile.printf("Granule average rate: %10.3f\n", granrate.mean())
outfile.printf("Std: %10.3f\n", granrate.stdev())
outfile.printf("\nIndividual mitral firing rate:\n")
mitrate.printf(outfile)
outfile.printf("Individual granule firing rate:\n")
granrate.printf(outfile)
outfile.close()
}
// Calculate synchronization index
objref outfile, lags, work
outfile = new File()
lags = new Vector()
work = new Vector()
proc print_si() { // 1 arg - fileroot
print "MC Soma synchronization index"
print phaselock_index_Mit()
print "MC Dend synchronization index"
print phaselock_index_Mit_dend()
print "GC Dend synchronization index"
print phaselock_index_Gran()
sprint(filename,"%s",$s1)
outfile.wopen(filename)
outfile.printf("MC Soma Phase-locking index: %10.3f\n",phaselock_index_Mit())
outfile.printf("MC Dend Phase-locking index: %10.3f\n",phaselock_index_Mit_dend())
outfile.printf("GC Dend Phase-locking index: %10.3f\n",phaselock_index_Gran())
outfile.close()
}
func phaselock_index_Mit() { local n,i1,j1,i2,j2
synchindex = 0
n = 0
for i1 = 0, nMit-1 {
if (mit[i1].spiketimes.size() > 0) {
for i2 = 0, nMit-1 {
if (i1 != i2) {
calc_phase_lags_Mit(i1,i2,ttrans)
if (lags.size() > 1) {
synchindex += lags.var()
n += 1
}
}
}
}
}
if (n > 0) {
synchindex = sqrt(synchindex/n)
return synchindex
} else {
return 1e6
}
}
func phaselock_index_Mit_dend() { local n,i1,j1,i2,j2
synchindex = 0
n = 0
for i1 = 0, nMit-1 {
if (mit[i1].dendspike.size() > 0) {
for i2 = 0, nMit-1 {
if (i1 != i2) {
calc_phase_lags_Mit_dend(i1,i2,ttrans)
if (lags.size() > 1) {
synchindex += lags.var()
n += 1
}
}
}
}
}
if (n > 0) {
synchindex = sqrt(synchindex/n)
return synchindex
} else {
return 1e6
}
}
func phaselock_index_Gran() { local n,i1,j1,i2,j2
synchindex = 0
n = 0
for i1 = 0, nGran-1 {
if (gran[i1].spiketimes.size() > 0) {
for i2 = 0, nGran-1 {
if (i1 != i2) {
calc_phase_lags_Gran(i1,i2,ttrans)
if (lags.size() > 1) {
synchindex += lags.var()
n += 1
}
}
}
}
}
if (n > 0) {
synchindex = sqrt(synchindex/n)
return synchindex
} else {
return 1e6
}
}
//=====================================================================================================
proc calc_phase_lags_Mit() { local i1,j1,i2,j2,k,minidx,min // 5 args - indices of mitral cells, transient time
if ($1 > nMit || $2 > nMit) {
print "Sorry - index out of range. Please try again."
return
}
i1 = int($1)
i2 = int($2)
lags.resize(0)
// for each spiketime in cell 1, find closest spike in cell 2
// Note: first and last spikes ignored since can't calculate previous ISI
if (mit[i2].spiketimes.size > 0) {
for k = 1,mit[i1].spiketimes.size()-2 {
if (mit[i1].spiketimes.x[k] > $3) {
work = mit[i2].spiketimes.c.add(-mit[i1].spiketimes.x[k])
minidx = work.c.abs.min_ind()
min = work.x[minidx]
isiprev = mit[i1].spiketimes.x[k-1]-mit[i1].spiketimes.x[k]
isinext = mit[i1].spiketimes.x[k+1]-mit[i1].spiketimes.x[k]
if (min > isiprev/2 && min < isinext/2) {
if (min < 0) {
lags.append(min/isiprev)
} else {
lags.append(min/isinext)
}
}
}
}
}
}
proc calc_phase_lags_Mit_dend() { local i1,j1,i2,j2,k,minidx,min // 5 args - indices of mitral cells, transient time
if ($1 > nMit || $2 > nMit) {
print "Sorry - index out of range. Please try again."
return
}
i1 = int($1)
i2 = int($2)
lags.resize(0)
// for each spiketime in cell 1, find closest spike in cell 2
// Note: first and last spikes ignored since can't calculate previous ISI
if (mit[i2].dendspike.size > 0) {
for k = 1,mit[i1].dendspike.size()-2 {
if (mit[i1].dendspike.x[k] > $3) {
work = mit[i2].dendspike.c.add(-mit[i1].dendspike.x[k])
minidx = work.c.abs.min_ind()
min = work.x[minidx]
isiprev = mit[i1].dendspike.x[k-1]-mit[i1].dendspike.x[k]
isinext = mit[i1].dendspike.x[k+1]-mit[i1].dendspike.x[k]
if (min > isiprev/2 && min < isinext/2) {
if (min < 0) {
lags.append(min/isiprev)
} else {
lags.append(min/isinext)
}
}
}
}
}
}
proc calc_phase_lags_Gran() { local i1,j1,i2,j2,k,minidx,min // 5 args - indices of mitral cells, transient time
if ($1 > nGran || $2 > nGran) {
print "Sorry - index out of range. Please try again."
return
}
i1 = int($1)
i2 = int($2)
lags.resize(0)
// for each spiketime in cell 1, find closest spike in cell 2
// Note: first and last spikes ignored since can't calculate previous ISI
if (gran[i2].spiketimes.size > 0) {
for k = 1,gran[i1].spiketimes.size()-2 {
if (gran[i1].spiketimes.x[k] > $3) {
work = gran[i2].spiketimes.c.add(-gran[i1].spiketimes.x[k])
minidx = work.c.abs.min_ind()
min = work.x[minidx]
isiprev = gran[i1].spiketimes.x[k-1]-gran[i1].spiketimes.x[k]
isinext = gran[i1].spiketimes.x[k+1]-gran[i1].spiketimes.x[k]
if (min > isiprev/2 && min < isinext/2) {
if (min < 0) {
lags.append(min/isiprev)
} else {
lags.append(min/isinext)
}
}
}
}
}
}