###################################################################################
##                                                                               ##
## Model of primate cones and horizontal cells adapted from the model by van     ##
## Hateren [1]. This script shows the response of the model to a a 100-ms step   ##
## of contrast 2 at a background illuminance of 100 td (see Fig. 6 in [1]).      ##
##                                                                               ##
## Parameters (default from Van Hateren's model):                                ##
## tauR = 0.49                                                                   ##
## tauE = 16.8                                                                   ##
## cb = 2.8 * 10**(-3)                                                           ##
## kb = 1.63 * 10**(-4)                                                          ##
## nX = 1.0                                                                      ##
## tauC = 2.89                                                                   ##
## ac = 9.08 * 10**(-2)                                                          ##
## nc = 4.0                                                                      ##
## taum = 4.0                                                                    ##
## ais = 7.09 * 10**(-2)                                                         ##
## gamma = 0.678                                                                 ##
## tauis = 56.9                                                                  ##
## gs = 0.5 (instead of 8.81)                                                    ##
## tau1 = 4.0                                                                    ##
## tau2 = 4.0                                                                    ##
## tauh = 20.0                                                                   ##
##                                                                               ##
## [1] van Hateren, Hans. "A cellular and molecular model of response kinetics   ##
## and adaptation in primate cones and horizontal cells." Journal of vision 5.4  ##
## (2005): 5-5.                                                                  ##
##                                                                               ##
## Author: Pablo Martinez                                                        ##
## email: pablomc@ugr.es                                                         ##
##                                                                               ##
###################################################################################

### Simulation parameters ###

retina.TempStep('1') # simulation step (in ms)
retina.SimTime('800') # simulation time (in ms)
retina.NumTrials('1') # number of trials
retina.PixelsPerDegree({'1.0'}) # pixels per degree of visual angle
retina.DisplayDelay('0') # display delay
retina.DisplayZoom({'10.0'}) # display zoom
retina.DisplayWindows('4') # Display windows per row

### Visual input ###

retina.Input('impulse',{'start','500.0','stop','600.0','amplitude','200.0','offset','100.0','sizeX','1','sizeY','1'})

### Creation of computational retinal microcircuits ###

# Temporal modules
retina.Create('LinearFilter','tmp_tauR',{'type','Gamma','tau','0.49','n','0.0'})
retina.Create('LinearFilter','tmp_tauE',{'type','Gamma','tau','16.8','n','0.0'})
retina.Create('SingleCompartment','calcium_feedback_SC',{'number_current_ports','1.0','number_conductance_ports','2.0','Rm','0.0','Cm','1.0','E',{'0.0','0.0'}})
retina.Create('LinearFilter','tmp_tauC',{'type','Gamma','tau','2.89','n','0.0'})
retina.Create('LinearFilter','tmp_taum',{'type','Gamma','tau','4.0','n','0.0'})
retina.Create('LinearFilter','tmp_tauis',{'type','Gamma','tau','56.9','n','0.0'})
retina.Create('LinearFilter','tmp_tau1',{'type','Gamma','tau','4.0','n','0.0'})
retina.Create('LinearFilter','tmp_tau2',{'type','Gamma','tau','4.0','n','0.0'})
retina.Create('LinearFilter','tmp_tauh',{'type','Gamma','tau','20.0','n','0.0'})

# Nonlinearities
retina.Create('StaticNonLinearity','beta',{'slope','0.000163','offset','0.0028','exponent','1.0'})
retina.Create('StaticNonLinearity','X',{'slope','1.0','offset','0.0','exponent','1.0'})
retina.Create('StaticNonLinearity','1_div_alpha',{'slope','0.0908','offset','1.0','exponent','4.0'})
retina.Create('StaticNonLinearity','alpha',{'slope','1.0','offset','0.0001','exponent','-1.0'})
retina.Create('StaticNonLinearity','ais',{'slope','0.0709','offset','0.0','exponent','0.678'})
# Constant calculated by using a dark stimulus: (bkg_illuminance = pulse_amplitude = 0)
# Vis_dark = 13.9 mV
retina.Create('StaticNonLinearity','Vis',{'slope','1.0','offset','-13.9','exponent','1.0'})
retina.Create('StaticNonLinearity','gs',{'slope','0.5','offset','0.0','exponent','1.0'})

### Connections ###

# Phototransduction cascade
retina.Connect('L_cones','tmp_tauR','Current')
retina.Connect('tmp_tauR','tmp_tauE','Current')
retina.Connect('tmp_tauE','beta','Current')

# Calcium feedback
retina.Connect('alpha','calcium_feedback_SC','Current')
retina.Connect('beta','calcium_feedback_SC','Conductance')
retina.Connect('calcium_feedback_SC','X','Current')
retina.Connect('X','tmp_tauC','Current')
retina.Connect('tmp_tauC','1_div_alpha','Current')
retina.Connect('1_div_alpha','alpha','Current')

# Inner segment
retina.Connect({'X',/,'tmp_tauis'},'tmp_taum','Current')
retina.Connect('tmp_taum','ais','Current')
retina.Connect('ais','tmp_tauis','Current')

# Vis - Vis_dark
retina.Connect('tmp_taum','Vis','Current')

# Horizontal cell feedback
retina.Connect({'Vis',-,'tmp_tauh'},'gs','Current')
retina.Connect('gs','tmp_tau1','Current')
retina.Connect('tmp_tau1','tmp_tau2','Current')
retina.Connect('tmp_tau2','tmp_tauh','Current')

### Displays and data analysis  ###
retina.Show('X','False','margin','0')

# Temporal multimeters

#retina.multimeter('temporal','Input','Input',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','tmp_tauE','tmp_tauE',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','beta','beta',{'x','0','y','0'},'Show','True')

#retina.multimeter('temporal','tmp_tauC','tmp_tauC',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','1_div_alpha','1_div_alpha',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','alpha','alpha',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','X','X',{'x','0','y','0'},'Show','True')

#retina.multimeter('temporal','ais','ais',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','tmp_tauis','tmp_tauis',{'x','0','y','0'},'Show','True')
#retina.multimeter('temporal','tmp_taum','tmp_taum',{'x','0','y','0'},'Show','True')

retina.multimeter('temporal','Vis','Vis',{'x','0','y','0'},'Show','False')