//======== CREATE SYNAPSES FROM SUBPIAL NEURONS FOR NGU MODEL ========//
// This file contains functions to create a synapses from the         //
// subpial neurons.                                                   //
//                                                                    //                                                           
// Setup:                                                             //
// 1. Call make_subpial_synapses                                      //
//                                                                    //
// Modeling notes:                                                    //
// The subpial synapses are made to lateral, medial,and subpial       //
// neurons that are within a specified radius of a stellate neuron.   //
// The synapses contain both GABA_A and GABA_B receptors.             //
// Self synapses are not allowed.                                     //
//                                                                    //
// Different synaptic weights are used for synapses that are close    //
// to the LGN: near weights are used for neurons whose position       //
// satisfies x > 1.0 and y < 0.6. Far weights are used for other      //
// neurons.                                                           //                                                   
//                                                                    //
//====================================================================//
include ../lib/global_constants.g
include ../lib/synapses.g

//============ LOCATION OF SUBPIAL SYNAPSE TARGETS ====================//
str SUB_LAT_TARGET = "/apical4"  // Lateral target of subpial synapse
str SUB_MED_TARGET = "/dend2"    // Medial target of subpial synapse
str SUB_SUB_TARGET = "/dend24"   // Subpial target of subpial synapse

//============= SUBPIAL SYNAPSE TARGET NAMES ==========================//
str SUB_LAT_SYNAPSE = "subp_lat"
str SUB_MED_SYNAPSE = "subp_med"
str SUB_SUB_SYNAPSE = "subp_subp"

//============== SYNAPTIC WEIGHTS NEAR AND FAR FROM LGN ==============//
float SUB_LAT_WA_N = 7.8    // Weight of subpial-lateral GABA_A synapse near
float SUB_LAT_WA_F = 1.9    // Weight of subpial-lateral GABA_A synapse far
float SUB_LAT_WB_N = 0.02   // Weight of subpial-lateral GABA_B synapse near
float SUB_LAT_WB_F = 0.002  // Weight of subpial-lateral GABA_B synapse far
float SUB_MED_WA_N = 2.3    // Weight of subpial-medial GABA_A synapse near
float SUB_MED_WA_F = 1.37   // Weight of subpial-medial GABA_A synapse far
float SUB_MED_WB_N = 0.01   // Weight of subpial-medial GABA_B synapse near
float SUB_MED_WB_F = 0.001  // Weight of subpial-medial GABA_B synapse far
float SUB_SUB_WA = 0.1      // Weight of subpial-subpial GABA_A synapse
float SUB_SUB_WB = 2.5e-4   // Weight of subpial-subpial GABA_B synapse

float SUB_X_NEAR_CUTOFF = 1.0
float SUB_Y_NEAR_CUTOFF = 0.6

//============= SYNAPSES FROM SUBPIAL - EFFECTIVE DISTANCES ===========//
float SUB_LAT_R = 0.350
float SUB_MED_R = 0.350
float SUB_SUB_R = 0.350

//===================== SUBPIAL SYNAPTIC PARAMETERS ===================//
float SUB_GS = 3e-9
float SUB_GS2 = 5e-9
float SUB_DELAY_FACTOR = 1e-3/ 0.05

//=============== SUBPIAL PARAMETERS FOR GABA_A RECEPTORS =============//
float SUB_TA = 1.7e-3
float SUB_TTA = 1.7e-3
float SUB_IA = -70.0e-3

//=============== SUBPIAL PARAMETERS FOR GABA_B RECEPTORS =============//
float SUB_TB = 500e-3
float SUB_TTB = 500e-3
float SUB_IB = -90e-3

//============= SYNAPSE COUNTS FOR DEBUGGING ==========================//
int sub_lat_count = 0 
int sub_med_count = 0
int sub_sub_count = 0

/* ******************************************************************
                       create_subpial_synapses_for_group
     Create a synapse for each member of the root group. The synapse 
     contains a GABA_A and a GABA_B receptor that will sum
     the contributions of all subpial neuron sources that impinge on
     the neuron
     
     Parameters:
        root           root of the neuron group hierarchy
        target         target compartment for the group
        syn_name       base name of synapse for this group

****************************************************************** */  
function create_subpial_synapses_for_group (root, target, syn_name, gmax)
     str root, target, syn_name  
     float gmax                          
  
     str name, dest
     str syn_chan_a = {syn_name}@"_a"
     str syn_chan_b = {syn_name}@"_b"
     foreach name  ({el {{root}@"/cell"}#})
         dest = {name}@{target}    
         // GABA_A receptor
         make_synapse {dest} {syn_chan_a} {gmax} {SUB_IA} {SUB_TA} {SUB_TTA}
   
        // GABA_B receptor
        make_synapse {dest} {syn_chan_b} {gmax} {SUB_IB} {SUB_TB} {SUB_TTB}      
     end
end


/* ******************************************************************
                       connect_subpial_synapse_group
     Connects synapses for each member of the root group within a 
     specified radius of the src subpial neuron
     
     Parameters:
        root           root of the neuron group hierarchy
        src            subpial soma source
        syn_name       base name of synapse for this group
        target         target compartment for the group
        x_sub          x coordinate for the subpial source
        y_sub          y coordinate for the subpial source
        radius         effective distance of synapse
        weight_a       synaptic weight for GABA_A 
        weight_b       synaptic weight for GABA_B
        gmax           peak conductance

      Returns:  number of synapses created for this src
****************************************************************** */  
function connect_subpial_synapse_group(root, src, syn_name, target, \
                                x_sub, y_sub, radius, weight_a, weight_b)
   str root, src, syn_name, target
   float x_sub, y_sub, radius, weight_a, weight_b
   
   str dest, name
   str syn_chan_a = {{syn_name}@"_a"}
   str syn_chan_b = {{syn_name}@"_b"}
   str src_object = {src}@"/soma/spike" 
   int syn_count = 0
   float x, y, dist, tdelay
   foreach name  ({el {{root}@"/cell"}#})
      x = {getfield {name} x}
      y = {getfield {name} y}
      dist = {sqrt  {(x_sub - x)**2 + (y_sub - y)**2} }
      if (dist <= radius && {strcmp {src} {name}} != 0)
         tdelay = {dist} * SUB_DELAY_FACTOR //sec
         dest = {name}@{target}
         connect_synapse {src_object} {dest} {syn_chan_a} {tdelay} {weight_a}
         connect_synapse {src_object} {dest} {syn_chan_b} {tdelay} {weight_b}
         syn_count = syn_count + 1
      end
   end 
   return syn_count
 end
/* ******************************************************************
                       connect_subpial_lateral_synapses
     Connects synapses containing a GABA_A and a GABA_B receptor from 
     the subpial src neuron to the destination lateral neuron
     
     Parameters:
        root           root of lateral neuron hierarchy
        src            subpial soma source
        x_sub          x coordinate of the subpial source neuron
        y_sub          y coordinate of the subpial source neuron
****************************************************************** */ 
function connect_subpial_lateral_synapses (root, src, x_sub, y_sub)
   str root, src
   float x_sub, y_sub

   float weight_a, weight_b
   if (x_sub > SUB_X_NEAR_CUTOFF && y_sub < SUB_Y_NEAR_CUTOFF)
      weight_a = SUB_LAT_WA_N
      weight_b = SUB_LAT_WB_N
   else
      weight_a = SUB_LAT_WA_F
      weight_b = SUB_LAT_WB_F
   end
   
   sub_lat_count = sub_lat_count + {connect_subpial_synapse_group \
                   {root} {src} {SUB_LAT_SYNAPSE} {SUB_LAT_TARGET} \
                   {x_sub} {y_sub} {SUB_LAT_R} {weight_a} {weight_b}}                            
end


/* ******************************************************************
                       connect_subpial_medial_synapses
     Connects synapses containing a GABA_A and a GABA_B receptor from 
     the subpial src neuron to the destination medial neuron
     
     Parameters:
        root           root of medial neuron hierarchy
        src            subpial soma source
        x_sub          x coordinate of the subpial source neuron
        y_sub          y coordinate of the subpial source neuron
****************************************************************** */ 
function connect_subpial_medial_synapses (root, src, x_sub, y_sub)
   str root, src
   float x_sub, y_sub
  
   float weight_a, weight_b
   if (x_sub > SUB_X_NEAR_CUTOFF && y_sub < SUB_Y_NEAR_CUTOFF)
      weight_a = SUB_MED_WA_N
      weight_b = SUB_MED_WB_N
   else
      weight_a = SUB_MED_WA_F
      weight_b = SUB_MED_WB_F
   end

   sub_med_count = sub_med_count + {connect_subpial_synapse_group \
                   {root} {src} {SUB_MED_SYNAPSE} {SUB_MED_TARGET} \
                   {x_sub} {y_sub} {SUB_MED_R} {weight_a} {weight_b}}                        
end


/* ******************************************************************
                       connect_subpial_subpial_synapses
     Connects synapses containing a GABA_A and a GABA_B receptor from 
     the subpial src neuron to the destination subpial neuron
     
     Parameters:
        root           root of subpial neuron hierarchy
        src            subpial soma source
        x_sub          x coordinate of the subpial source neuron
        y_sub          y coordinate of the subpial source neuron
        
        Note: Self synapses are not allowed.
****************************************************************** */ 
function connect_subpial_subpial_synapses (root, src, x_sub, y_sub)
   str root, src
   float x_sub, y_sub

   sub_sub_count = sub_sub_count + {connect_subpial_synapse_group \
                   {root} {src} {SUB_SUB_SYNAPSE} {SUB_SUB_TARGET} \
                  {x_sub} {y_sub} {SUB_SUB_R} {SUB_SUB_WA} {SUB_SUB_WB}}                          
end


/* ******************************************************************
                       make_subpial_synapses
     Creates the synapses from subpial neurons in the NGU model
     
     Parameters:
        sub_root            root of the hierarchy for subpial neurons
        lat_root            root of the hierarchy for lateral neurons                   
        med_root            root of the hierarchy for medial neurons  
****************************************************************** */ 
function make_subpial_synapses (sub_root, lat_root, med_root)
   str sub_root, lat_root, med_root

   
   //Start by creating a representative synapse for each potential target neuron
   create_subpial_synapses_for_group {lat_root} {SUB_LAT_TARGET} \
                            {SUB_LAT_SYNAPSE} {SUB_GS}
   create_subpial_synapses_for_group {med_root} {SUB_MED_TARGET} \
                            {SUB_MED_SYNAPSE} {SUB_GS}
   create_subpial_synapses_for_group {sub_root} {SUB_SUB_TARGET} \
                            {SUB_SUB_SYNAPSE} {SUB_GS2} 
   
   //Now create spikes from subpial source neurons
   str name
   int count = 0;
   float x_sub, y_sub
   foreach name  ({el {{sub_root}@"/cell"}#})
      count = count + 1;
      x_sub = {getfield {name} x}
      y_sub = {getfield {name} y}
      connect_subpial_lateral_synapses {lat_root} {name} {x_sub} {y_sub}
      connect_subpial_medial_synapses {med_root} {name} {x_sub} {y_sub}
      connect_subpial_subpial_synapses {sub_root} {name} {x_sub} {y_sub}
   end

   if (ECHO_ON == 1)
      echo "Created synapses for" {count} "subpial source neurons"
      echo "  " {sub_lat_count} "synapses from subpial to lateral neurons"     
      echo "  " {sub_med_count} "synapses from subpial to medial neurons"     
      echo "  " {sub_sub_count} "synapses from subpial to subpial neurons"   
   end;
end