// DEFINE FUNCTIONS THAT HELP WITH SYNAPSE ALLOCATION. // identify vgat synapses that are part of a given branch // provide a SectionRef instance to seek, and optionally, two x values for // low and high values to seek. // $o1: SectionRef instance. // $2,$3: optional, variables, low and high values to constrain results. // NOTE: $2 and $3 are currently implemented to work with EFFECTIVE x values, // not the true x values. strdef seekSecName obfunc getVgatInds(){local theX localobj vecOfInds vecOfInds = new Vector(0) $o1.sec { seekSecName = secname() } for ii=1,totVgatAt { { theX = synVgatAt[ii-1].get_loc() theX = synVgatAt[ii-1].xEff if(abs(strcmp(secname(),seekSecName))<0.00001){ if(numarg()>1.1){ // x values supplied if(theX>$2&&theX<$3){ vecOfInds.append(ii-1) } }else{ // no x values supplied, simply take vecOfInds.append(ii-1) } } pop_section() } } return vecOfInds } theRandomSeed = 1000000 // Sample values from the given vector without replacement. // $o1: Vector. The vector of values to sample from. // $2: numeric. The number of values to sample. // $3: numeric. The seed. If set =-1 (or just <=-0.1), sets a random seed that increments. If >-0.1, uses // the supplied seed. obfunc sampleNoReplace(){local tempRand,jj localobj randGen,theOut,theOut2 if($2>$o1.size()){ //print "Number of items to return exceeds vector size." //print "Returning the original vector." //print "Wanted/got:",$2,$o1.size() return $o1 } if($2<0.0001){ theOut2 = new Vector() return theOut2 } if($3>(-0.1)) { // supplied a random seed; go with it. randGen = new Random($3) }else{ // define a random number generator with new seed randGen = new Random(theRandomSeed) theRandomSeed+=1 } randGen.uniform(0,$o1.size()) theOut = new Vector() theOut2 = new Vector($2) while(1){ tempRand = int(randGen.repick()) // add new number if not present if(theOut.contains(tempRand)){ // do nothing }else{ // add theOut.append(tempRand) } if(abs(theOut.size()-$2)<0.0001){ // have filled the desired vector. for jj=1,$2{ theOut2.x[jj-1] = $o1.x[theOut.x[jj-1]] } return theOut2 } } } // Sample a given branch (and potential limits on x locations) to identify the // a subset of synapses. This is used for tagging VGAT+ synapses as other types // of synapses. // $o1: SectionRef. The section to look at. // $2: numeric. The number of sampled synapse indices to return. // $3: numeric. The seed to use. // $3,$4: numerics (optional). The low and high x values to consider for the // particular SectionRef. obfunc synIndSubset(){localobj allInds,theOut allInds = new Vector() if(numarg()<3.1){ allInds = getVgatInds($o1) }else{ allInds = getVgatInds($o1,$4,$5) } theOut = sampleNoReplace(allInds,$2,$3) return theOut }