Skip to content
Snippets Groups Projects
Select Git revision
  • 39be42621908eb44b834a24484c233a7c6954c7a
  • master default protected
  • noelp-master-patch-87404
  • disable-view
  • experimental_rel
  • test_quiggeldy_service
  • update-arbor-0.10.0
  • image_build
  • spack_v0.22.1
  • ebrains-24-04
  • update-readme
  • create-module-file
  • add-nestml-tests
  • feat_add_py-norse
  • update-libneuroml
  • update-bluebrain-packages
  • feat_arbor_install_all_binaries
  • ebrains-23.09-jsc-site-config
  • spack-v0.20.0
  • ebrains-23-09-spack-v0.19.2
  • ebrains-23-09
21 results

package.py

Blame
  • QIF.cpp 3.74 KiB
    /**********************************************************************
    ** This program is part of 'MOOSE', the
    ** Messaging Object Oriented Simulation Environment.
    **           Copyright (C) 2003-2007 Upinder S. Bhalla. and NCBS
    ** It is made available under the terms of the
    ** GNU Lesser General Public License version 2.1
    ** See the file COPYING.LIB for the full notice.
    **********************************************************************/
    
    #include "header.h"
    #include "ElementValueFinfo.h"
    #include "../biophysics/CompartmentBase.h"
    #include "../biophysics/Compartment.h"
    #include "IntFireBase.h"
    #include "QIF.h"
    
    using namespace moose;
    
    const Cinfo* QIF::initCinfo()
    {
    	static string doc[] =
    	{
    		"Name", "QIF",
    		"Author", "Aditya Gilra",
    		"Description", "Leaky Integrate-and-Fire neuron with Quadratic term in Vm."
            "Based on Spiking Neuron Models book by Gerstner and Kistler."
            "Rm*Cm * dVm/dt = a0*(Vm-Em)*(Vm-vCritical) + Rm*I"
    	};
    
        static ElementValueFinfo< QIF, double > vCritical(
            "vCritical",
            "Critical voltage for spike initiation",
            &QIF::setVCritical,
            &QIF::getVCritical
        );
    
    
        static ElementValueFinfo< QIF, double > a0(
            "a0",
            "Parameter in Rm*Cm dVm/dt = a0*(Vm-Em)*(Vm-vCritical) + Rm*I, a0>0",
            &QIF::setA0,
            &QIF::getA0
        );
    
    	static Finfo* QIFFinfos[] = {
    		&vCritical,		// Value
            &a0             // Value
    	};
    
        static Dinfo< QIF > dinfo;
    	static Cinfo QIFCinfo(
    				"QIF",
    				IntFireBase::initCinfo(), // this is the initCinfo of the parent class
                    QIFFinfos,
    				sizeof( QIFFinfos ) / sizeof (Finfo*),
    				&dinfo,
                    doc,
                    sizeof(doc)/sizeof(string)
    	);
    
    	return &QIFCinfo;
    }
    
    static const Cinfo* QIFCinfo = QIF::initCinfo();
    
    //////////////////////////////////////////////////////////////////
    // Here we put the QIF class functions.
    //////////////////////////////////////////////////////////////////
    
    QIF::QIF()
    {a0_ = 0.0;
    vCritical_ = 0.0;}
    
    QIF::~QIF()
    {;}
    
    //////////////////////////////////////////////////////////////////
    // QIF::Dest function definitions.
    //////////////////////////////////////////////////////////////////
    
    void QIF::vProcess( const Eref& e, ProcPtr p )
    {
        // fully taking over Compartment's vProcess due to quadratic term in Vm
        // we no longer care about A and B
    	fired_ = false;
    	if ( p->currTime < lastEvent_ + refractT_ ) {
    		Vm_ = vReset_;
    		sumInject_ = 0.0;
    		VmOut()->send( e, Vm_ );
    	} else {
            // activation can be a continous variable (graded synapse).
            // So integrate it at every time step, thus *dt.
            // For a delta-fn synapse, SynHandler-s divide by dt and send activation.
            // See: http://www.genesis-sim.org/GENESIS/Hyperdoc/Manual-26.html#synchan
            //          for this continuous definition of activation.
    		Vm_ += activation_ * p->dt;
    		activation_ = 0.0;
    		if ( Vm_ > threshold_ ) {
    			Vm_ = vReset_;
    			lastEvent_ = p->currTime;
    			fired_ = true;
    			spikeOut()->send( e, p->currTime );
    			VmOut()->send( e, Vm_ );
    		} else {
                Vm_ += ( (inject_+sumInject_)
                        + a0_*(Vm_-Em_)*(Vm_-vCritical_)/Rm_ ) * p->dt / Cm_;
                lastIm_ = Im_;
                Im_ = 0.0;
                sumInject_ = 0.0;
                // Send out Vm to channels, SpikeGens, etc.
                VmOut()->send( e, Vm_ );
    		}
    	}
    }
    
    void QIF::vReinit(  const Eref& e, ProcPtr p )
    {
    	activation_ = 0.0;
    	fired_ = false;
    	lastEvent_ = -refractT_; // Allow it to fire right away.
    	Compartment::vReinit( e, p );
    }
    
    void QIF::setVCritical( const Eref& e, double val )
    {
    	vCritical_ = val;
    }
    
    double QIF::getVCritical( const Eref& e ) const
    {
    	return vCritical_;
    }
    
    void QIF::setA0( const Eref& e, double val )
    {
    	a0_ = val;
    }
    
    double QIF::getA0( const Eref& e ) const
    {
    	return a0_;
    }