Thanks for the details. In Brian, when the threshold condition is defined by the user, it is added to a set of codes representing conditions to be checked at each time step. When the condition (threshold) is True for that particular time step, it sets `spike` and `refractory_until` attributes, defining the spike triggering and period of refractory after that respectively. Along with that, if the reset is defined, `run_on_event()` is called which simply sets the given values to state variables of that group, once the `threshold` condition is True. Something like,
for timestep in total_run_timesteps
update state for the particular group
. . . .
if threshold_condition is True: # spike event is detected
execute run_on_event()/reset statements
define refractory_until from refractory given
Being a rookie myself, I am not sure about the reason for the spike time difference, however, it would be helpful if you verify the time-step you used