// genesis

// Function make_fibres (pathname).
// Creates in {pathname} three populations of fibres: feedforward, feedback intracolumn,
// feedback intercolumn.

// Each population consists of randomspike elements with associated diffamps.
// The diffamps send RATE msgs to their respective randomspikes. 
// In other scripts, the diffamps will get PLUS messages, e.g.feedforward fibres 
// will get input from Harsch-Robinson_input.g, whereas the randsomspikes will be 
// connected (in Excitatory_fibers.g and Inhibitory_fibres.g) to synapses on the L5P cell.

// Actually, for each compartment on L5P, one fibre is generated, (almost) randomly
// assigned to one of the three classes and put at the same position as the compartment.


 
int  index



function make_fibres (pathname)

str pathname


// Make library protoptypes *****

   if ({!{exists /library}})
          create neutral /library 
          disable /library
   end

   if ({!{exists /library/FF_fibre}})
         //   create randomspike2 /library/FF_fibre  // randomspike 2 does not exist in official release
   		create randomspike /library/FF_fibre
		//   setfield ^ rate {E_fibre_rate} 
		//              abs_refract 0.001 
		//              rate_type RS_EFFECTIVE

	   create randomspike /library/FBintra_fibre
	   create randomspike /library/FBinter_fibre

	   create diffamp /library/FF_diffamp
	   setfield ^ plus 0 minus 0 saturation 10e10
	   create diffamp /library/FBintra_diffamp
	   setfield ^ plus 0 minus 0 saturation 10e10
	   create diffamp /library/FBinter_diffamp
	   setfield ^ plus 0 minus 0 saturation 10e10
   end



// Make subpopulations *****

	echo Making {pathname} and subpopulations

	if(!{exists {pathname}}) 
          create neutral {pathname}
	end
	create neutral {pathname}/FF
	create neutral {pathname}/FBintra
	create neutral {pathname}/FBinter
   
	echo The fibres
	createmap /library/FF_fibre {pathname}/FF \
             686 1 -delta 0 0 -origin 0 0 
	createmap /library/FBintra_fibre {pathname}/FBintra \
             686 1 -delta 0 0 -origin 0 0 
	createmap /library/FBinter_fibre {pathname}/FBinter \
             686 1 -delta 0 0 -origin 0 0 

	echo The diffamps
	createmap /library/FF_diffamp {pathname}/FF \
             686 1 -delta 0 0 -origin 0 0 
	createmap /library/FBintra_diffamp {pathname}/FBintra \
             686 1 -delta 0 0 -origin 0 0 
	createmap /library/FBinter_diffamp {pathname}/FBinter \
             686 1 -delta 0 0 -origin 0 0 


// works only for randomspike2; not sure this exists in Genesis2.3
//   setfield {pathname}/E_fibre[] seed1 0 -increment 9 100
//   setfield {pathname}/E_fibre[] seed2 0 -increment 9e-2 100



// Position fibres at corresponding L5P compartments *****

	echo Calculating positions of {pathname} 

	str subpath
	ce {pathname}
	index = 0
   
	foreach name ({el /L5P/p#[][TYPE=compartment]})
   
//   echo {name}
      if ({{index % 3} == 0})
           subpath = "FF/FF_fibre"
      elif ({{index % 3} == 1})
           subpath = "FBintra/FBintra_fibre"
      else subpath = "FBinter/FBinter_fibre"
      end
      
	 setfield {subpath}[{index / 3}] \
                x {getfield {name} x} \
                y {getfield {name} y} \
                z {getfield {name} z} 

//        echo {name} {index}  {subpath} {index / 3}  // OK works
        index = {index + 1}
//        echo index = {index}   // OK 2058 dendritic compartments
   end



// Connect diffamps to fibres *****

	echo Sending RATE msgs from diffmaps to fibres 

	for (index = 0; index < 686; index = {index} + 1)
	   setfield FF/FF_diffamp[{index}]              x {getfield FF/FF_fibre[{index}] x} \
	                                                y {getfield FF/FF_fibre[{index}] y} \
	                                                z {getfield FF/FF_fibre[{index}] z}
	   setfield FBintra/FBintra_diffamp[{index}]    x {getfield FBintra/FBintra_fibre[{index}] x} \
	                                                y {getfield FBintra/FBintra_fibre[{index}] y} \
	                                                z {getfield FBintra/FBintra_fibre[{index}] z}
	   setfield FBinter/FBinter_diffamp[{index}]    x {getfield FBinter/FBinter_fibre[{index}] x} \
	                                                y {getfield FBinter/FBinter_fibre[{index}] y} \
	                                                z {getfield FBinter/FBinter_fibre[{index}] z}
	   
       addmsg FF/FF_diffamp[{index}]            FF/FF_fibre[{index}]              RATE    output
       addmsg FBintra/FBintra_diffamp[{index}]  FBintra/FBintra_fibre[{index}]    RATE    output
       addmsg FBinter/FBinter_diffamp[{index}]  FBinter/FBinter_fibre[{index}]    RATE    output
	end
   
   
end