COMMENT
  IinjLT.mod
  Generates a train of photocurrent injections
  User specifies duration of each Iinj, interpulse interval (ton and toff),
  and number of pulses.
  
           ___            ___            _ _
          /   \          /   \            |
 delay    |    \   toff  |    \           | amp
__________|     \________|     \_______  _|_
            ton
            
   num:      1              2          ...
ENDCOMMENT


NEURON {
	POINT_PROCESS IinjLT_cone
	RANGE del, ton, toff, num, amp,ssI,i
	ELECTRODE_CURRENT i
}

UNITS {
	(pA) = (picoamp)
        (nA) = (nanoamp)
}

PARAMETER {
	del  = 1000 (ms)
	ton  = 8000 (ms) <0, 1e9>	: duration of ON phase
	toff = 1000 (ms) <0, 1e9>	: duration of OFF phase
	num  = 1			: how many to deliver
	amp  = 20 (pA)	  : absolute amplitude of the light induced current
    ssI  = 0 (pA)     : steady-state current (dark current)
        
}

ASSIGNED {
    Ncount     			: counter of the number of the flashes/injections
	ival 		(nA)
	i 			(nA)
	on
	tally				: how many more to deliver
	tr 			(ms)   	: the relative time in each flash 
    Part1
    Part2
    Part3
	Part4
    ssInA 		(nA)
    ampnA 		(nA)
}

INITIAL {
	i = 0
    ssInA=0.001*ssI
    ampnA=amp*0.001
	ival = 0
	tally = num
    Ncount=0
	if (tally > 0) {
		net_send(del, 1)
		on = 0
		tally = tally - 1
	}
}

BREAKPOINT {
: printf("%g\n", t)
        tr=t-del-(ton+toff)*(Ncount-1)
        if (on ==1) { 
			Part1 = (1.01)*( 1-exp(-tr/(60/1200*ton)))^3
			Part2 = -(0.07)/(1+exp(-(tr-(555/1200*ton))/(120/1200*ton))) 
			Part3 = -0.7/(1+exp(-(tr-(1500/1200*ton))/(200/1200*ton)))^1.3
			Part4 = -(0.24)/((1+exp(-(tr-(1200/1200*ton))/(80/1200*ton))))^2
			i=ssInA-ival*(Part1+Part2+Part3+Part4) 
        } else {
        i = ssInA+ival
        }
         
}

NET_RECEIVE (w) {
	: ignore any but self-events with flag == 1
	if (flag == 1) {
		if (on == 0) {
			: turn it on
            Ncount=Ncount+1
			ival = ampnA
			on = 1
			: prepare to turn it off
			:net_send(ton, 1)
		} else {
			: turn it off
			ival = 0
			on = 0
			if (tally > 0) {
				: prepare to turn it on again
				net_send(toff, 1)
				tally = tally - 1
			}
		}
	}
}