// File for dynamically saving all responses from each array
// DO NOT RUN IF COMPUTATIONAL TIME IS AN ISSUE

load_file("create_Cells.hoc")
load_file("read_population.hoc")
load_file("Parameters.hoc")

objref rect, savt
objref rec_PR_upper[PR_total_upper_cells], rec_PR_lower[PR_total_lower_cells], sav_PR_upper[PR_total_upper_cells], sav_PR_lower[PR_total_lower_cells]
objref rec_HZ_upper[HZ_total_upper_cells], rec_HZ_lower[HZ_total_lower_cells], sav_HZ_upper[HZ_total_upper_cells], sav_HZ_lower[HZ_total_lower_cells]
objref rec_BIP_upper[BIP_total_upper_cells], rec_BIP_lower[BIP_total_lower_cells], sav_BIP_upper[BIP_total_upper_cells], sav_BIP_lower[BIP_total_lower_cells]
objref rec_AII_upper[AII_total_upper_cells], rec_AII_lower[AII_total_lower_cells], sav_AII_upper[AII_total_upper_cells], sav_AII_lower[AII_total_lower_cells]
objref rec_RGC_soma[num_gang], sav_RGC_soma[num_gang], rec_RGC_axon[num_gang], sav_RGC_axon[num_gang]

proc record_t () {

    rect = new Vector()
    rect.record(&t, sample_time)
    savt = new File()
    savt.wopen("Cell responses/t.csv")

}

proc save_t() {

    rect.printf(savt)
    savt.close()

}

proc record_PR_response() {

    strdef generate_sav_file
    for i = 0, PR_total_upper_cells - 1 {
        rec_PR_upper[i] = new Vector()
        rec_PR_upper[i].record(&PR_upper[i].soma.v(0.95), sample_time)
        sav_PR_upper[i] = new File()
        sprint(generate_sav_file, "Cell responses/PRs/PR_upper_%d.csv", i)
        sav_PR_upper[i].wopen(generate_sav_file)
    }
    for i = 0, PR_total_lower_cells - 1 {
        rec_PR_lower[i] = new Vector()
        rec_PR_lower[i].record(&PR_lower[i].soma.v(0.95), sample_time)
        sav_PR_lower[i] = new File()
        sprint(generate_sav_file, "Cell responses/PRs/PR_lower_%d.csv", i)
        sav_PR_lower[i].wopen(generate_sav_file)
    }

}

proc save_PR_response() {

    for i = 0, PR_total_upper_cells - 1 {
        rec_PR_upper[i].printf(sav_PR_upper[i])
        sav_PR_upper[i].close()
    }
    for i = 0, PR_total_lower_cells - 1 {
        rec_PR_lower[i].printf(sav_PR_lower[i])
        sav_PR_lower[i].close()
    }

}

proc record_HZ_response() {

    strdef generate_sav_file
    for i = 0, HZ_total_upper_cells - 1 {
        rec_HZ_upper[i] = new Vector()
        rec_HZ_upper[i].record(&HZ_upper[i].soma.v(0.0555556), sample_time)
        sav_HZ_upper[i] = new File()
        sprint(generate_sav_file, "Cell responses/HZs/HZ_upper_%d.csv", i)
        sav_HZ_upper[i].wopen(generate_sav_file)
    }
    for i = 0, HZ_total_lower_cells - 1 {
        rec_HZ_lower[i] = new Vector()
        rec_HZ_lower[i].record(&HZ_lower[i].soma.v(0.0555556), sample_time)
        sav_HZ_lower[i] = new File()
        sprint(generate_sav_file, "Cell responses/HZs/HZ_lower_%d.csv", i)
        sav_HZ_lower[i].wopen(generate_sav_file)
    }

}

proc save_HZ_response() {

    for i = 0, HZ_total_upper_cells - 1 {
        rec_HZ_upper[i].printf(sav_HZ_upper[i])
        sav_HZ_upper[i].close()
    }
    for i = 0, HZ_total_lower_cells - 1 {
        rec_HZ_lower[i].printf(sav_HZ_lower[i])
        sav_HZ_lower[i].close()
    }

}

proc record_BIP_response() {

    strdef generate_sav_file
    for i = 0, BIP_total_upper_cells - 1 {
        rec_BIP_upper[i] = new Vector()
        rec_BIP_upper[i].record(&BIP_upper[i].soma.v(0.95), sample_time)
        sav_BIP_upper[i] = new File()
        sprint(generate_sav_file, "Cell responses/BIPs/BIP_upper_%d.csv", i)
        sav_BIP_upper[i].wopen(generate_sav_file)
    }
    for i = 0, BIP_total_lower_cells - 1 {
        rec_BIP_lower[i] = new Vector()
        rec_BIP_lower[i].record(&BIP_lower[i].soma.v(0.95), sample_time)
        sav_BIP_lower[i] = new File()
        sprint(generate_sav_file, "Cell responses/BIPs/BIP_lower_%d.csv", i)
        sav_BIP_lower[i].wopen(generate_sav_file)
    }

}

proc save_BIP_response() {

    for i = 0, BIP_total_upper_cells - 1 {
        rec_BIP_upper[i].printf(sav_BIP_upper[i])
        sav_BIP_upper[i].close()
    }
    for i = 0, BIP_total_lower_cells - 1 {
        rec_BIP_lower[i].printf(sav_BIP_lower[i])
        sav_BIP_lower[i].close()
    }

}

proc record_AII_response() {

    strdef generate_sav_file
    for i = 0, AII_total_upper_cells - 1 {
        rec_AII_upper[i] = new Vector()
        rec_AII_upper[i].record(&AII_upper[i].soma.v(0.95), sample_time)
        sav_AII_upper[i] = new File()
        sprint(generate_sav_file, "Cell responses/AIIs/AII_upper_%d.csv", i)
        sav_AII_upper[i].wopen(generate_sav_file)
    }
    for i = 0, AII_total_lower_cells - 1 {
        rec_AII_lower[i] = new Vector()
        rec_AII_lower[i].record(&AII_lower[i].soma.v(0.95), sample_time)
        sav_AII_lower[i] = new File()
        sprint(generate_sav_file, "Cell responses/AIIs/AII_lower_%d.csv", i)
        sav_AII_lower[i].wopen(generate_sav_file)
    }

}

proc save_AII_response () {

    for i = 0, AII_total_upper_cells - 1 {
        rec_AII_upper[i].printf(sav_AII_upper[i])
        sav_AII_upper[i].close()
    }
    for i = 0, AII_total_lower_cells - 1 {
        rec_AII_lower[i].printf(sav_AII_lower[i])
        sav_AII_lower[i].close()
    }

}

proc record_RGC_response() {

    strdef generate_sav_file
    for i = 0, num_gang - 1 {
        rec_RGC_soma[i] = new Vector() 
        rec_RGC_soma[i].record(&Ganglion[i].soma[0].v(0.5), sample_time)
        sav_RGC_soma[i] = new File()
        sprint(generate_sav_file, "Cell responses/RGCs/RGC_soma_%d.csv", i)
        sav_RGC_soma[i].wopen(generate_sav_file)

        rec_RGC_axon[i] = new Vector() 
        rec_RGC_axon[i].record(&Ganglion[i].axon[600].v(0.5), sample_time)
        sav_RGC_axon[i] = new File()
        sprint(generate_sav_file, "Cell responses/RGCs/RGC_axon_%d.csv", i)
        sav_RGC_axon[i].wopen(generate_sav_file)
    }

}

proc save_RGC_response() {

    for i = 0, num_gang - 1 {
        rec_RGC_soma[i].printf(sav_RGC_soma[i])
        sav_RGC_soma[i].close()

        rec_RGC_axon[i].printf(sav_RGC_axon[i])
        sav_RGC_axon[i].close()
    }

}

proc record_response() {

    record_t ()
    record_PR_response()
    record_HZ_response()
    record_BIP_response()
    record_AII_response()
    record_RGC_response()

}

proc save_response() {

    save_t()
    save_PR_response()
    save_HZ_response()
    save_BIP_response()
    save_AII_response()
    save_RGC_response()

}