from neuron import h
import math
import numpy as np
from TheNetSyn_py3 import Synapse_py3
from golgi_number_1 import number_ind_1

class Golgi_net_py3_1():
    def __init__(self):
        
        print( "golgi2016 python3")
        
        h.load_file('stdlib.hoc')
        h.load_file('import3d.hoc')
        
        cell = h.Import3d_Neurolucida3()
        cell.input('morphology/pair-140514-C2-1_split_1.asc')
            
        
        i3d = h.Import3d_GUI(cell,0)
        i3d.instantiate(self)
        
        conductvalues = np.genfromtxt("final_pop_opti_1_third.txt")
            

        indiv_number = number_ind_1['indiv']
        print( 'indiv number', indiv_number)
        
      
#Soma

        self.soma[0].nseg = 1 + (2 * int(self.soma[0].L / 40))
        self.soma[0].Ra = 122
        self.soma[0].cm = 1 
        
        self.soma[0].insert('Leak')
        self.soma[0].gmax_Leak = 0.00003
        self.soma[0].e_Leak = -55
        
        self.soma[0].insert('Nav1_6')
        self.soma[0].gbar_Nav1_6 = conductvalues[indiv_number,9]
        self.soma[0].ena = 60
	
        self.soma[0].insert('Kv1_1')
        self.soma[0].gbar_Kv1_1 = conductvalues[indiv_number,10]
	
        self.soma[0].insert('Kv3_4')
        self.soma[0].gkbar_Kv3_4 = conductvalues[indiv_number,11]
        
        self.soma[0].insert('Kv4_3')
        self.soma[0].gkbar_Kv4_3 = conductvalues[indiv_number,12]	
	  
        self.soma[0].insert('Kca1_1')
        self.soma[0].gbar_Kca1_1 = conductvalues[indiv_number,13]
	  
        self.soma[0].insert('Kca3_1')
        self.soma[0].gkbar_Kca3_1 = conductvalues[indiv_number,14]
        
        self.soma[0].insert('GRC_CA')
        self.soma[0].gcabar_GRC_CA = conductvalues[indiv_number,15]
	
        self.soma[0].insert('Cav3_1')
        self.soma[0].pcabar_Cav3_1 = conductvalues[indiv_number,16]
        
        self.soma[0].ek = -80
        
        self.soma[0].insert('cdp5StCmod')
        self.soma[0].TotalPump_cdp5StCmod = 1e-7
        
        self.soma[0].eca = 137

	
        self.whatami = "golgi2019"
        
        self.dendbasal = []
        self.dendapical = []
        self.terminal_dend = []

##dend #to be redone
    
        
        for en_index, d_sec in enumerate(self.dend):
            #print('number, len', en_index, d_sec.L)
            if en_index >= 0 and en_index <= 3 or en_index >= 16 and en_index <= 17 or en_index >= 33 and en_index <= 41 or en_index == 84 or en_index >= 105 and en_index <= 150:
                self.dendbasal.append(d_sec)
                
            if en_index >= 4 and en_index <= 15 or en_index >= 18 and en_index <= 32 or en_index >= 42 and en_index <= 83 or en_index >= 85 and en_index <= 104:
                self.dendapical.append(d_sec)

        final_sec = [1, 17, 38, 40, 41, 105, 106, 109, 111, 112, 115, 117, 118, 120, 121, 123, 124, 127, 128, 129, 131, 132, 133, 135, 137, 139, 140, 144, 145, 147, 148, 150]
        for en_index, d_sec in enumerate(self.dend):
            if en_index in final_sec:
                self.terminal_dend.append(d_sec)
        
        #Dend apical	    
        for r in self.dendapical:
                r.nseg = 1 + (2 * int(r.L / 40))
                r.Ra = 122
                r.cm = 2.5
                
                r.insert('Leak')
                r.gmax_Leak = 0.00003
                r.e_Leak = -55
                
                r.insert('Nav1_6')
                r.gbar_Nav1_6 = conductvalues[indiv_number,0]
                r.ena = 60
                
                r.insert('Kca1_1')
                r.gbar_Kca1_1 = conductvalues[indiv_number,1]
                
                r.insert('Kca2_2')
                r.gkbar_Kca2_2 = conductvalues[indiv_number,2]
                r.ek = -80
                
                r.insert('Cav2_3')
                r.gcabar_Cav2_3 = conductvalues[indiv_number,3]
                
                r.insert('Cav3_1')
                r.pcabar_Cav3_1 = conductvalues[indiv_number,4]
                
                r.insert('cdp5StCmod')
                r.TotalPump_cdp5StCmod = 5e-9
                
               
                r.push()
                r.eca = 137
                h.pop_section()   
	
	
        #Dend basal
        for i in self.dendbasal:
                i.nseg = 1 + (2 * int(i.L / 40))
                i.Ra = 122
                i.cm = 2.5
                
                i.insert('Leak')
                i.gmax_Leak = 0.00003
                i.e_Leak = -55	
                
                i.insert('Nav1_6')
                i.gbar_Nav1_6 = conductvalues[indiv_number,5]
                i.ena = 60
                
                i.insert('Kca1_1')
                i.gbar_Kca1_1 = conductvalues[indiv_number,6]
                
                i.insert('Kca2_2')
                i.gkbar_Kca2_2 = conductvalues[indiv_number,7]
                i.ek = -80

                i.insert('GRC_CA')
                i.gcabar_GRC_CA = conductvalues[indiv_number,8]

                i.insert('cdp5StCmod')
                i.TotalPump_cdp5StCmod = 2e-9
                
                i.push()
                i.eca = 137
                h.pop_section()   

    #final dend
        self.dend_final = [h.Section(name='final_dend'+str(x)) for x in range(32)]
 
        for i in self.dend_final:
                i.L = 2.5
                i.diam = 0.58
                i.nseg = 1
                i.Ra = 122
                i.cm = 2.5
                
                i.insert('Leak')
                i.gmax_Leak = 0.00003
                i.e_Leak = -55	
                
                i.insert('Nav1_6')
                i.gbar_Nav1_6 = conductvalues[indiv_number,5]
                i.ena = 60

                i.insert('Kca1_1')
                i.gbar_Kca1_1 = conductvalues[indiv_number,6]

                i.insert('Kca2_2')
                i.gkbar_Kca2_2 = conductvalues[indiv_number,7]
                i.ek = -80

                i.insert('GRC_CA')
                i.gcabar_GRC_CA = conductvalues[indiv_number,8]
# 
                i.insert('cdp5StCmod')
                i.TotalPump_cdp5StCmod = 2e-9
                
                i.insert('cdp5_nmdaCa')
                i.TotalPump_cdp5_nmdaCa = 1e-9
                
                i.push()
                i.eca = 137
                h.pop_section()  
                
        for sec in range(len(self.dend_final)):
            self.dend_final[sec].connect(self.terminal_dend[sec],1,0)
            print(self.dend_final[sec], self.terminal_dend[sec])
           
           
 
#axon
        for i,d in enumerate(self.axon):
            if i == 0:
                #AIS
                self.axon[i].nseg = 1 + (2 * int(self.axon[i].L / 40))
                self.axon[i].Ra = 122
                self.axon[i].cm = 1
                
                self.axon[i].insert('Leak')
                self.axon[i].gmax_Leak = 0.00003
                self.axon[i].e_Leak = -55
                
                self.axon[i].insert('HCN1')
                self.axon[i].gbar_HCN1 = conductvalues[indiv_number,17]
                
                self.axon[i].insert('HCN2')
                self.axon[i].gbar_HCN2 = conductvalues[indiv_number,18]
            
                self.axon[i].insert('Nav1_6')
                self.axon[i].gbar_Nav1_6 = conductvalues[indiv_number,19]
                self.axon[i].ena = 60
            
                self.axon[i].insert('GRC_KM')
                self.axon[i].gkbar_GRC_KM = conductvalues[indiv_number,20]
                
                self.axon[i].insert('Kca1_1')
                self.axon[i].gbar_Kca1_1 = conductvalues[indiv_number,21]               

                self.axon[i].insert('GRC_CA')
                self.axon[i].gcabar_GRC_CA = conductvalues[indiv_number,22]

                self.axon[i].ek = -80                 
                self.axon[i].insert('cdp5StCmod')	
                self.axon[i].TotalPump_cdp5StCmod = 1e-8
                
                self.axon[i].push()
                self.axon[i].eca = 137
                h.pop_section()  
                    
            elif i >= 1:
                #axon
                    
                self.axon[i].nseg = 1 + (2 * int(self.axon[i].L / 40))
                self.axon[i].cm = 1
                self.axon[i].Ra = 122
                
                
                self.axon[i].insert('Leak')
                self.axon[i].e_Leak = -55
                self.axon[i].gmax_Leak = 0.000001
                
                self.axon[i].insert('Nav1_6')
                self.axon[i].gbar_Nav1_6 = 0.0115
                self.axon[i].ena = 60

                self.axon[i].insert('Kv3_4')
                self.axon[i].gkbar_Kv3_4 = 0.0091
                self.axon[i].ek = -80  
                

                self.axon[i].insert('cdp5StCmod')	    
                self.axon[i].TotalPump_cdp5StCmod = 1e-8
                
                self.axon[i].push()
                self.axon[i].eca = 137
                h.pop_section()   
        

        
        self.time_vector = h.Vector()
        self.time_vector.record(h._ref_t)

        self.vm = h.Vector()
        self.vm.record(self.soma[0](0.5)._ref_v)
        
        self.vm_dend_apic = h.Vector()
        self.vm_dend_apic.record(self.dend[48](0.5)._ref_v)
        
        self.vm_dend_basal = h.Vector()
        self.vm_dend_basal.record(self.dend[3](0.5)._ref_v)
        

        
#calcium dendrites activated        
        
        self.cai_nmda_dend_0 = h.Vector()
        self.cai_nmda_dend_0.record(self.dend_final[0](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_1 = h.Vector()
        self.cai_nmda_dend_1.record(self.dend_final[1](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_2 = h.Vector()
        self.cai_nmda_dend_2.record(self.dend_final[2](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_3 = h.Vector()
        self.cai_nmda_dend_3.record(self.dend_final[3](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_4 = h.Vector()
        self.cai_nmda_dend_4.record(self.dend_final[4](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_5 = h.Vector()
        self.cai_nmda_dend_5.record(self.dend_final[5](0.5)._ref_ca_nmdai)

        self.cai_nmda_dend_6 = h.Vector()
        self.cai_nmda_dend_6.record(self.dend_final[6](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_7 = h.Vector()
        self.cai_nmda_dend_7.record(self.dend_final[7](0.5)._ref_ca_nmdai) 
        
        
        self.cai_nmda_dend_8 = h.Vector()
        self.cai_nmda_dend_8.record(self.dend_final[8](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_9 = h.Vector()
        self.cai_nmda_dend_9.record(self.dend_final[9](0.5)._ref_ca_nmdai) 
        
        self.cai_nmda_dend_10 = h.Vector()
        self.cai_nmda_dend_10.record(self.dend_final[10](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_11 = h.Vector()
        self.cai_nmda_dend_11.record(self.dend_final[11](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_12 = h.Vector()
        self.cai_nmda_dend_12.record(self.dend_final[12](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_13 = h.Vector()
        self.cai_nmda_dend_13.record(self.dend_final[13](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_14 = h.Vector()
        self.cai_nmda_dend_14.record(self.dend_final[14](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_15 = h.Vector()
        self.cai_nmda_dend_15.record(self.dend_final[15](0.5)._ref_ca_nmdai)

        self.cai_nmda_dend_16 = h.Vector()
        self.cai_nmda_dend_16.record(self.dend_final[16](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_17 = h.Vector()
        self.cai_nmda_dend_17.record(self.dend_final[17](0.5)._ref_ca_nmdai) 
        
        
        self.cai_nmda_dend_18 = h.Vector()
        self.cai_nmda_dend_18.record(self.dend_final[18](0.5)._ref_ca_nmdai)
        
        self.cai_nmda_dend_19 = h.Vector()
        self.cai_nmda_dend_19.record(self.dend_final[19](0.5)._ref_ca_nmdai) 

        
            
            
    def createsyn(self, pf_n, mf_n, fixed_pf, dend_start_pf, dend_end_pf, fixed_mf, dend_start_mf, dend_end_mf, aa_n):
#PF       
        self.L_PF = []
        self.dend_pf = []
        
        for sec_index, sec_sec in enumerate(self.dend):
            if sec_index >= 4 and sec_index <= 15 or sec_index >= 18 and sec_index <= 32 or sec_index >= 42 and sec_index <= 83 or sec_index >= 85 and sec_index <= 104:
                self.dend_pf.append(sec_sec)   

        print('self.dend_pf', len(self.dend_pf))
        
        
#PF location
        if fixed_pf == 0:
            for fix_i in range(dend_start_pf, dend_end_pf):
                self.L_PF.append(Synapse_py3('PF',self,self.dend_pf[fix_i])) 
        
        elif fixed_pf == 1:
            for i in range(0, pf_n):
                self.L_PF.append(Synapse_py3('PF',self,self.dend_pf[i])) 
                
            
#MOSSY        
        self.L_MF = []
        self.L_MF_NMDA_B = []
        self.dend_mf = []
        self.dend_aa = []
        
        for sec_index, sec_sec in enumerate(self.dend):
            if sec_index >= 108 and sec_index <= 112 or sec_index >= 114 and sec_index <= 121 or sec_index >= 128 and sec_index <= 129 or sec_index >= 131 and sec_index <= 132 or sec_index >= 135 and sec_index <= 140 or sec_index >= 144 and sec_index <= 145 or sec_index >= 147 and sec_index <= 150:
                self.dend_mf.append(sec_sec)   
                self.dend_aa.append(sec_sec) 

        print('self.dend_mf', len(self.dend_mf))
        

        
#MF location        
        

        for i in range(0, mf_n):
            self.L_MF.append(Synapse_py3('MF',self,self.dend_final[i]))
            self.L_MF_NMDA_B.append(Synapse_py3('MF_nmda_B',self,self.dend_final[i]))





#AA
        self.L_AA = []
        self.L_AA_NMDA_B = []

        for i in range(0, aa_n):
                self.L_AA.append(Synapse_py3('AA',self,self.dend_aa[i]))
                self.L_AA_NMDA_B.append(Synapse_py3('MF_nmda_B',self,self.dend_aa[i]))