/*
 *  test_dcgen_versus_I_e.sli
 *
 *  This file is part of NEST.
 *
 *  Copyright (C) 2004 The NEST Initiative
 *
 *  NEST is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  NEST is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with NEST.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

/* BeginDocumentation
   Name: testsuite::test_dcgen_versus_I_e - sli script to test if setting I_e and applying a DC generator yields the same results.

   Synopsis: (test_dcgen_versus_I_e) run

   Description:
   This testscript checks consistency between currents coming from dc_generator and internal variable I_e;
   The approach is to simulate both situations for some time and compare membrane potentials at the end;
   Any model which supports current events and setting I_e is checked, other models are skipped.

   SeeAlso: testsuite::test_iaf_i0

   FirstVersion: January 2011
   Author: Sven Schrader
 */

M_ERROR setverbosity

(unittest) run
/unittest using

{

% set amplitude in pA for both DC generator and I_e
/amp 123.456 def
/res [] def  % array to collect bool results

modeldict keys
{
  /model Set

  % check if both membrane potential can be measured....
  /record_VM model GetDefaults /recordables known def
  record_VM 
  {	
    model GetDefaults /recordables get 
    { 
      /V_m eq { true } if 
    } 
    forall 
    count 1 eq 
    {
      ; /record_VM true def
    }
    {
      /record_VM false def
    } 
    ifelse 
  } 
  if

  % .... and I_e can be set
  model GetDefaults /I_e known record_VM and
  {
    ResetKernel
  
    % models requiring special parameters
    model /gif_psc_exp eq { model << /lambda_0 0.0 >> SetDefaults} if 
  	  model /gif_cond_exp eq { model << /lambda_0 0.0 >> SetDefaults} if 
  	  model /gif_psc_exp_multisynapse eq { model << /lambda_0 0.0 >> SetDefaults} if 
  	  model /gif_cond_exp_multisynapse eq { model << /lambda_0 0.0 >> SetDefaults} if
  	  model /pp_psc_delta eq { model << /c_2 0.0 >> SetDefaults} if 
  
  	  model =only (\t: ) =only
  
  	  model Create /n1 Set
  	  model Create /n2 Set
  
  	  %take into account synaptic delay
  	  /dc_generator <</start 99. >> Create /dc Set
  
  	  % todo: make sure that this procedure is 'stopped' if 
  	  % and only if current events are not supported!
  	  {
  	    dc n1 Connect
      dc << /amplitude amp >> SetStatus
  
  	    100 Simulate
  
  	    n2 << /I_e amp >> SetStatus
  
      300 Simulate
  
      % compare final membrane potentials
      n1 GetStatus /V_m get /v1 Set
      n2 GetStatus /V_m get /v2 Set
      
      v1 v2 eq dup 
  	    {
  	      (pass) =
  	    }
  	    { 
  	      (failed with V1: ) =only v1 =only 
  	      (, V2: ) =only v2 =only 
  	      (, dV: ) =only v1 v2 sub =
  	    } 
      ifelse 
      res exch append /res Set
    } 
    stopped 
    {  
      clear (DC not allowed) = 
      errordict /newerror false put  
    } if % skip models that don't support current event
  }
  if   % model GetDefaults /I_e known record_VM and

} forall % modeldict keys

% combine results, one bool left on stack
res First res Rest { and } Fold

} 
assert_or_die

endusing


