//======================================================================
// Save simulation data into data files
//======================================================================
double Ngm[nMit]
objref f1
f1 = new File()
strdef filepath, filepath1, filepath2, filename
filepath = "data/" // data is saved into the "data" folder
filepath1 = "SP/" // timing of random backgound spike trains is saved into the "SP" folder
objref time, Vmean, Vmean2
objref GABApm[nMit]
objref Ggm[nMit][nGran], Ggm_Total[nMit]
objref Vms[nMit], Vmt[nMit]
objref Vmd0[nMit], Vmd1[nMit], Vmd2[nMit]
objref Vgs[nGran], Vgb[nGran]
objref Vps[nPG], Vpb[nPG]
time = new Vector()
// Record time
time.record(&t, DT)
//====================================================
// Record Voltage
//====================================================
// Record Mit Soma Voltage
for i=0, nMit-1 {
Vms[i] = new Vector()
Vms[i].record(&mit[i].soma.v(0.5), DT)
}
// Record PG Soma Voltage
for i=0, nPG-1 {
Vps[i] = new Vector()
Vps[i].record(&pg[i].soma.v(0.5), DT)
}
// Record PG Spine Voltage
for i=0, nPG-1 {
Vpb[i] = new Vector()
Vpb[i].record(&pg[i].gemmbody.v(0.5), DT)
}
// Record GC Voltage if the Full model is simulated (i.e., NTCE==0)
if (NTCE==0) {
// Record GC soma voltage
for i=0, nGran-1 {
Vgs[i] = new Vector()
Vgs[i].record(&gran[i].soma.v(0.5), DT)
}
// Record GC Voltage
for i=0, nGran-1 {
Vgb[i] = new Vector()
Vgb[i].record(&gran[i].gemmbody.v(0.5), DT)
}
}
//====================================================
// Record Conductance
//====================================================
// Save PG->MC conductance
for i=0, nMit-1 {
GABApm[i] = new Vector()
GABApm[i].record(&p2m[i].g, DT)
}
// Save GC->MC conductance
if (NTCE==0) {
f1.ropen("Connection/Ngc")
for i=0, nMit-1 {
Ngm[i] = f1.scanvar()
}
f1.close()
for i=0, nMit-1 {
for j=0, Ngm[i]-1 {
Ggm[i][j] = new Vector()
Ggm[i][j].record(&g2m[i][j].g, DT)
}
}
}
//====================================================
// Save Data
//====================================================
proc save_data() {
// Calculate the mean voltage for MCs and GCs
size1 = Vms[0].size()
Vmean = new Vector(size1, 0)
for i=0, nMit-1 {
Vmean = Vmean.c.add(Vms[i])
}
if (NTCE==0) {
size2 = Vgb[0].size()
Vmean2 = new Vector(size2, 0)
for i=0, nGran-1 {
Vmean2 = Vmean2.c.add(Vgb[i])
}
}
// Calculate the TOTAL GC GABAa conductance to each MC
if (NTCE==0) {
size = Ggm[0][0].size()
for i=0, nMit-1 {
Ggm_Total[i] = new Vector(size, 0)
for j=0, Ngm[i]-1 {
Ggm_Total[i] = Ggm_Total[i].c.add(Ggm[i][j])
}
}
}
//====================================================
// Save Conductance
//====================================================
// Save PG-->MC conductance
for i=0, nMit-1 {
sprint(filename, "%sGABApm%d",filepath, i)
f1.wopen(filename)
GABApm[i].printf(f1)
f1.close()
}
// Save GC-->MC conductance
if (NTCE==0) {
for i=0, nMit-1 {
sprint(filename, "%sGgm%d",filepath, i)
f1.wopen(filename)
Ggm_Total[i].printf(f1)
f1.close()
}
}
// ====================================================
// Save Simulation Time
// ====================================================
f1.wopen("data/tt")
time.printf(f1)
f1.close()
//====================================================
// Save Voltage
//====================================================
//Save mean voltage
Vmean = Vmean.div(nMit)
f1.wopen("data/Vm")
Vmean.printf(f1)
f1.close()
if (NTCE==0) {
Vmean2 = Vmean2.div(nGran)
f1.wopen("data/Vg")
Vmean2.printf(f1)
f1.close()
}
//Save voltage of mitral cells
//Soma
for i=0, nMit-1 {
sprint(filename, "%sVms%d",filepath, i)
f1.wopen(filename)
Vms[i].printf(f1)
f1.close()
}
// Save PG voltages
// Soma
for i=0, nPG-1 {
sprint(filename, "%sVps%d",filepath, i)
f1.wopen(filename)
Vps[i].printf(f1)
f1.close()
}
// Spine
for i=0, nPG-1 {
sprint(filename, "%sVpb%d",filepath, i)
f1.wopen(filename)
Vpb[i].printf(f1)
f1.close()
}
// Save GC voltages
// Soma
if (NTCE==0) {
for i=0, nGran-1 {
sprint(filename, "%sVgs%d",filepath, i)
f1.wopen(filename)
Vgs[i].printf(f1)
f1.close()
}
// Spine
for i=0, nGran-1 {
sprint(filename, "%sVgb%d",filepath, i)
f1.wopen(filename)
Vgb[i].printf(f1)
f1.close()
}
}
//====================================================
// Save Spike Time
//====================================================
//Save MC somatic spike time
for i=0, nMit-1 {
sprint(filename, "%sMs%d",filepath, i)
f1.wopen(filename)
mit[i].spiketimes.printf(f1)
f1.close()
}
// Save MC dendritic spike time
for i=0, nMit-1 {
sprint(filename, "%sMd%d",filepath, i)
f1.wopen(filename)
mit[i].dendspike.printf(f1)
f1.close()
}
// Save PG somatic spike time
for i=0, nPG-1 {
sprint(filename, "%sPs%d",filepath, i)
f1.wopen(filename)
pg[i].spiketimes.printf(f1)
f1.close()
}
// Save PG dendritic spike time
for i=0, nPG-1 {
sprint(filename, "%sPd%d",filepath, i,j)
f1.wopen(filename)
pg[i].dendspike.printf(f1)
f1.close()
}
// Save GC somatic spike time
if (NTCE==0) {
for i=0, nGran-1 {
sprint(filename, "%sGs%d",filepath, i)
f1.wopen(filename)
gran[i].spiketimes.printf(f1)
f1.close()
}
// Save GC dendritic spike time
for i=0, nGran-1 {
sprint(filename, "%sGd%d", filepath, i)
f1.wopen(filename)
gran[i].dendspike.printf(f1)
f1.close()
}
}
//===============================================
// Save random spontaneous spikes
for i=0, nMit-1 {
sprint(filename, "%sspp%d",filepath1, i)
f1.wopen(filename)
WSP[i].printf(f1)
f1.close()
}
}