//
// Recording.hoc - Records activity traces in a binary format
//
// Variables and numbers are all recorded as double precision floats (8 bytes).
//
// Header is composed of the number of recorded retinal cells, then the number of recorded TC cells and finally the number 1 (there is only one cortical cell).
// (See "StartBinaryRecording" function in this file)
//
// Then, for each time step (dt), in order:
// - for each recorded retinal cells (8 bytes)
// write 1 if a spike was generated during this step, 0 otherwise
// - for each recorded thalamic cells (16 bytes)
// write the Vm
// write the number of input retinal spikes received during this step (sum of all spikes generated by all retinal cells converging to this TC cell)
// - for the cortical cell (16 bytes)
// write the Vm
// write the number of input thalamic spikes received during this step (sum of all spikes generated by all relay cells)
// (See "ProcessBinaryRecording" function in this file)
//
// In summary:
// - header size is 24 bytes
// - activity size is 40 bytes * number of steps
// - example for tstop = 10000 and dt = 0.1 (10s of activity at 10kHz)
// 40 bytes * 100001 steps => 4000040 bytes
// adding header size, total generated file will be 4000064 bytes (~4MB)
//
// Thalamocortical convergence studies
// Sébastien Béhuret, UNIC/CNRS Paris, 2009
//
// Enabled in Simulation.hoc
RecordingEnabled = 0
// Unless you want to compare the generated traces in different cells, you should leave those to 1
// Will not record more than RetinalCellCount and RelayCellCount defined in Geometry.hoc
MaxRecordedRetinalCellCount = 1 //RetinalCellMax
MaxRecordedRelayCellCount = 1 //RelayCellMax
objref RecordingFile, RecordingVector
RecordingFile = new File()
RecordingVector = new Vector(1)
proc init() {
finitialize(v_init)
if (RecordingEnabled == 1) {
ProcessRecording()
}
}
proc advance() {
fadvance()
if (RecordingEnabled == 1) {
ProcessRecording()
}
}
proc StartRecording() {
RecordingFile.wopen($s1)
RecordingEnabled = 1
StartBinaryRecording($s1)
}
proc ProcessRecording() {
ProcessBinaryRecording()
}
proc StartBinaryRecording() {
RecordedRetinalCellCount = RetinalCellCount
if (RecordedRetinalCellCount > MaxRecordedRetinalCellCount) { RecordedRetinalCellCount = MaxRecordedRetinalCellCount }
RecordedRelayCellCount = RelayCellCount
if (RecordedRelayCellCount > MaxRecordedRelayCellCount) { RecordedRelayCellCount = MaxRecordedRelayCellCount }
// header
RecordingVector.x[0] = RecordedRetinalCellCount
RecordingVector.fwrite(RecordingFile)
RecordingVector.x[0] = RecordedRelayCellCount
RecordingVector.fwrite(RecordingFile)
RecordingVector.x[0] = 1
RecordingVector.fwrite(RecordingFile)
}
proc ProcessBinaryRecording() { local i, RecordedRelayCellCount
RecordedRetinalCellCount = RetinalCellCount
if (RecordedRetinalCellCount > MaxRecordedRetinalCellCount) { RecordedRetinalCellCount = MaxRecordedRetinalCellCount }
RecordedRelayCellCount = RelayCellCount
if (RecordedRelayCellCount > MaxRecordedRelayCellCount) { RecordedRelayCellCount = MaxRecordedRelayCellCount }
// Retinal spikes
for i = 0, RecordedRetinalCellCount - 1 {
RecordingVector.x[0] = RetinalCells[i].Spike
RecordingVector.fwrite(RecordingFile)
}
// Relay Vms & summed inputs
for i = 0, RecordedRelayCellCount - 1 {
RecordingVector.x[0] = RelayCells[i].Soma.v(0.5)
RecordingVector.fwrite(RecordingFile)
Sum = 0
for j = 0, RelayConvergenceCount - 1 {
if (RelayAMPA[i][j].Trigger > RelayAMPA[i][j].Threshold) {
Sum = Sum + RelayAMPA[i][j].Weight / RelayAMPAWeight
}
}
RecordingVector.x[0] = Sum
RecordingVector.fwrite(RecordingFile)
}
// Cortical Vm
RecordingVector.x[0] = CorticalCell.Soma.v(0.5)
RecordingVector.fwrite(RecordingFile)
// Cortical summed input
Sum = 0
for i = 0, RelayCellCount - 1 {
if (CorticalAMPA[i].Trigger > CorticalAMPA[i].Threshold) {
Sum = Sum + 1
}
}
RecordingVector.x[0] = Sum
RecordingVector.fwrite(RecordingFile)
}
proc StopRecording() {
RecordingEnabled = 0
RecordingFile.close()
}
proc RecordingGUI() {
xlabel("==============================")
xlabel("recording")
xlabel("==============================")
xlabel("")
xbutton("start", "StartRecording(\"Default.dat\")")
xbutton("stop", "StopRecording()")
xlabel("")
}