00001 #ifndef GenericPLBasicSynapse_H_
00002 #define GenericPLBasicSynapse_H_
00003
00004 #include "EvSimObject.h"
00005 #include "SpikeResponse.h"
00006 #include "EvSimObjectTypeUtils.h"
00007 #include "Synapse.h"
00008 #include "SimException.h"
00009 #include "Neuron.h"
00010
00011 #include <iostream>
00012
00013
00014 #ifndef SWIG
00015
00016 #include <boost/format.hpp>
00017 using boost::str;
00018
00019 #endif
00020
00021 class PLSynapse : public Synapse {
00022 public:
00023
00024 double getSlope() {return slope;};
00025
00026 virtual ~PLSynapse();
00027
00028 protected:
00029 void updatePSRSlope(double new_slope, Time time) {
00030 slope = new_slope;
00031 }
00032
00033 void resetPSRSlope() {
00034 slope = 0;
00035 }
00036
00037 double slope;
00038 };
00039
00040
00041 class PLActiveSynapse : public ActiveSynapse {
00042 public:
00043
00044 virtual ~PLActiveSynapse();
00045
00046 protected:
00047 inline void updatePSR(double new_psr, Time time)
00048 {
00049 psr_old = psr;
00050 if (time > cur_time) {
00051 psr_old += (time-cur_time)*slope;
00052 cur_time = time;
00053 }
00054 psr = new_psr;
00055 target_nrn->updatePSR(psr, psr - psr_old, time);
00056 }
00057
00058 void updatePSRSlope(double new_slope, Time time)
00059 {
00060 slope_old = slope;
00061 slope = new_slope;
00062 target_nrn->updatePSRSlope(slope, slope - slope_old, time);
00063 }
00064
00065 void resetPSRSlope()
00066 {
00067 slope = slope_old = 0;
00068 cur_time = 0;
00069 }
00070
00071 double slope;
00072 double slope_old;
00073 Time cur_time;
00074 };
00075
00076
00077 template<class BaseSyn>
00078 class GenericPLBasicSynapse : public BaseSyn {
00079 public:
00080
00081 GenericPLBasicSynapse(float W = 1)
00082 {
00083 this->W = W;
00084 this->syn_resp = 0;
00085 };
00086
00087 virtual ~GenericPLBasicSynapse() {};
00088
00089 double W;
00090
00091 virtual void reset(SimContext &sim_ctxt)
00092 {
00093 BaseSyn::resetPSRs();
00094 BaseSyn::resetPSRSlope();
00095 };
00096
00097 virtual void setPostSynResponse(SpikeResponse *response) {
00098 syn_resp = response;
00099 }
00100
00101 virtual void updateState(SimContext &sim_ctxt, Time time, update_id_t upd_id)
00102 {
00103 BaseSyn::updatePSR(W*syn_resp->get(), time);
00104 BaseSyn::updatePSRSlope(W*syn_resp->getSlope(), time);
00105 }
00106
00107 protected:
00108 SpikeResponse *syn_resp;
00109 };
00110
00111 #endif