// THIS SCRIPT ASSIGNS ANNOTATION TO SPECIFIC SUBCELLULAR COMPARTMENTS. forall { insert id for (x) { isTerm_id(x) = 0 isTuft_id(x) = 0 isObl_id(x) = 0 isBas_id(x) = 0 isPrim_id(x) = 0 } } objref soma objref basalList,obliqueList,primList,apicalList,tuftList,dendList,cellList,ca3List apicalList = new SectionList() // apical list basalList = new SectionList() // basal list obliqueList = new SectionList() // oblique list primList = new SectionList() // primary apical list tuftList = new SectionList() dendList = new SectionList() // list of all dendrites cellList = new SectionList() ca3List = new SectionList() // list of places that CA3 cells would contact CA1 (SO + SR) Cell[0].dend[72] {soma = new SectionRef()} // Populate apical list. Cell[0].dend[11] { apicalList.subtree() } // Populate primary apical list. Cell[0].dend[11] { primList.append() } Cell[0].dend[74] { primList.append() } Cell[0].dend[75] { primList.append() } Cell[0].dend[76] { primList.append() } Cell[0].dend[77] { primList.append() } // right before twin bifurcation Cell[0].dend[78] { primList.append() } // left twin apical Cell[0].dend[79] { primList.append() } Cell[0].dend[80] { primList.append() } Cell[0].dend[82] { primList.append() } Cell[0].dend[83] { primList.append() } Cell[0].dend[84] { primList.append() } Cell[0].dend[85] { primList.append() } Cell[0].dend[86] { primList.append() } Cell[0].dend[151] { primList.append() } // right twin apical Cell[0].dend[154] { primList.append() } Cell[0].dend[155] { primList.append() } Cell[0].dend[157] { primList.append() } Cell[0].dend[160] { primList.append() } Cell[0].dend[161] { primList.append() } // By eye, these were the beginning of sections that define the tuft. Cell[0].dend[87] { tuftList.subtree() } Cell[0].dend[162] { tuftList.subtree() } Cell[0].dend[163] { tuftList.subtree() } // Populate obliques. By previous definitions, this is simply the // whole apical dendrite less the tuft and the primary apical. forsec apicalList { obliqueList.append() } forsec tuftList { obliqueList.remove() } forsec primList { obliqueList.remove() } // Populate basals. By previous definitions, this is simply the // whole tree less the apical dendrite and the soma. forall { basalList.append() } forsec apicalList { basalList.remove() } soma.sec { basalList.remove () } // Populate all dendrites. This is everything minus the soma. forall { dendList.append() } soma.sec { dendList.remove() } // Populate the whole cell. This is everything. forall { cellList.append() } // Populate sections which would contact CA3 axons. forsec basalList {ca3List.append()} forsec primList {ca3List.append()} forsec obliqueList {ca3List.append()} soma.sec {ca3List.append()} // Declare a function that looks at whether a given SectionRef instance // (argument 1) is found in a given SectionList (argument 2). // $o1: SectionRef instance to match. // $o2: SectionList instance to search over. // Returns logical of whether section is in list. func sectionRefInList() {local isInList isInList = 0 strdef tempSecName $o1.sec { tempSecName = secname() } forsec $o2 { if(abs(strcmp(secname(),tempSecName))<(1e-5)){ isInList=1 } } return isInList } objref theSec forall { theSec = new SectionRef() for (x){ isTuft_id(x) = sectionRefInList(theSec,tuftList) isPrim_id(x) = sectionRefInList(theSec,primList) isObl_id(x) = sectionRefInList(theSec,obliqueList) isBas_id(x) = sectionRefInList(theSec,basalList) brOrd_id(x) = -1 } } // Assign distances from bifurcation of apical trunk. Note this is used solely // for obliques, so all other locations get assigned a -1 value. forall { insert dists } // Generate a function that point out how far something is from main apical. // INPUT: a SectionRef instance that refers to an oblique branch. // OUTPUT: the distance from the initial bifurcation of this branch from the // primary apical branch. [ note : to be consistent with AT data, this // may not be the distance of the branch itself, but rather from a // parent branch that stems directly off of the primary apical ] func oblDist(){localobj theSec,tempParSec theSec = $o1 // a SectionRef instance // Traverse down branch until hit parent branch that stems directly // off the main apical. // Identify parent. strdef strPar while(1){ theSec.parent{ strPar = secname() } inList = 0 // Is parent in the obliques list? forsec obliqueList { curDist = abs(strcmp(secname(),strPar)) if(curDist<0.0001){ inList = 1 tempParSec = new SectionRef() } } if(inList){ // Repeat; update parent section. tempParSec.sec { theSec = new SectionRef() } }else{ break } } // Get the distance from this parent branch to the soma. soma.sec { distance() } theSec.sec { theDist = distance(0) } return theDist } // Generate a function that point out how far along the main apical a given // section (with associated x value) is. // INPUT: a SectionRef instance that refers to an main apical branch, and a // variable (0<= , <=1) corresponding to the x value. // OUTPUT: the distance of the _middle_ of the section from the soma, divided // by the distance of the total main apical dendrite func primDist(){local tuftDist,somaDist,outDist,theX localobj theSec,allTuftDists theSec = $o1 // a SectionRef instance theX = $2 allTuftDists = new Vector() // Calculate minimum distance from tuft to selected section. theSec.sec { distance() } forsec tuftList { tuftDist = distance(0) allTuftDists.append(tuftDist) } tuftDist = allTuftDists.min() // Calculate distance from selected section to soma. soma.sec { distance() } theSec.sec { somaDist = distance(theX) } outDist = somaDist/(somaDist+tuftDist) return outDist } // Assign main bifurcation distances to obliques, as well as normalised // primary apical distances. forall { for(x) { theSec = new SectionRef() // Main bifurcation distance. if(sectionRefInList(theSec,obliqueList)){ mainbif_dists = oblDist(theSec) }else{ mainbif_dists = -1 } // Norm prim apical distance. if(sectionRefInList(theSec,primList)){ normprim_dists(x) = primDist(theSec,x) }else{ normprim_dists = -1 } } } forall { insert syns npyAt_syns = 0 npyUnif_syns = 0 sstAt_syns = 0 sstUnif_syns = 0 vlsAt_syns = 0 exc_syns = 0 }