// Assign orders to a given branch. This is implemented in the following way: // 1) give a seed section that will receive a given order; then, // 2) all other branches in the same effective branch will be given the same // order ; // 3) all children of the effective branch will receive the next order // // Steps 2 and 3 repeat until all effective child branches of the assigned // branch are given an order. // INPUT: // $o1: SectionRef instance, corresponding to the section to order. // $o2: [optional] variable. First order value to assign (default = 1). This // allows flexibility to call the soma as being order "0". // OUTPUT: // The value brOrd_id is assigned for all daughters of the given section. strdef secToMatch proc assignBranchOrder(){local nn,oo,brN,curOrd,numsSecs localobj curSecs,nextSecs,usedSecs,tempSec,theHits // Identify the associated effective branch. $o1.sec { secToMatch = secname() } for nn=1,numEffBr{ forsec brEff[nn-1]{ if(abs(strcmp(secToMatch,secname()))<0.0001){ brN = nn-1 } } } // Assign all branches in effective branch to be the sections to // iterate over. curSecs = new SectionList() nextSecs = new SectionList() numSecs = 0 forsec brEff[brN] { nextSecs.append() numSecs+=1 } // Assign first order. if(numarg()>1.1){ curOrd = $2 }else{ curOrd = 1 } // Iterative assign orders. usedSecs = new SectionList() while(numSecs>0.1){ curSecs = new SectionList() // Add the effective branch associated with each branch. // Populate curSecs; nextSecs will then be reset. theHits = new Vector() forsec nextSecs { secToMatch = secname() for nn=1,numEffBr{ forsec brEff[nn-1]{ gotHit = 0 if(abs(strcmp(secToMatch,secname()))<0.0001){ theHits.append(nn-1) } } } } for nn=1,theHits.size() { forsec brEff[theHits.x[nn-1]]{ curSecs.append() } } nextSecs = new SectionList() numSecs = 0 // Assign branch order and populate all potential next visited // dendrites. forsec curSecs { brOrd_id = curOrd nextSecs.children() usedSecs.append() } // Take only unique used sections. usedSecs.unique() // Remove any branches that have already been assigned a // branch order. forsec usedSecs { secToMatch = secname() forsec nextSecs { if(abs(strcmp(secToMatch,secname()))<0.0001){ nextSecs.remove() } } } // Calculate total number of remaining sections to visit. forsec nextSecs { numSecs +=1 } curOrd+=1 } }