if (!name_declared("is_split")) {execute("is_split = 0")} splitbit = 6e8 func basegid() { // from piece gid, return base gid return $1 % splitbit } func piecegid() { // from base gid return -1 if no piece on this cpu, otherwise // the piece gid // note that if several pieces of a mitral cell exist on this // cpu, then the smallest gid is returned if (pc.gid_exists($1)) { return $1 }else if (pc.gid_exists($1 + splitbit)) { return $1 + splitbit }else if (pc.gid_exists($1 + 2*splitbit)) { return $1 + 2*splitbit }else{ return -1 } } obfunc gid2piece() {local sgid localobj nil // from base gid return nil if no piece, otherwise // the cell piece object // note that a cell object may contain 1, 2, or 3 mitral pieces sgid = piecegid($1) if (sgid >= 0) { return pc.gid2cell(sgid) }else{ return nil } } func exists() {localobj cell cell = gid2piece($1) if (object_id(cell)) if (section_exists($s2, cell)) { return 1 } return 0 } // split a mitral cell ($1 gid, $o2 whole cell) into three pieces // destroy the pieces not on this cpu // and connect pieces with multisplit // arg is the base gid proc splitmitral() {localobj cell, sl, nil if ($1 >= num_mitral) return // it is a granule cell = $o2 if (is_split == 0) { //cell.axon pc.cell($1, new NetCon(&v(1), nil), 1) cell.soma pc.cell($1, new NetCon(&v(.5), nil), 1) // do not split return } // split cell.secden[0] disconnect() cell.secden[1] disconnect() // destroy what is not supposed to exist on this cpu if (!pc.gid_exists($1 + splitbit)) { cell.secden[0] delete_section() } if (!pc.gid_exists($1 + 2*splitbit)) { cell.secden[1] delete_section() } if (!pc.gid_exists($1)) { sl = new SectionList() cell.soma sl.wholetree() forsec sl { delete_section() } } // multisplit connect using the base gid // also associate the split gids with the cell object if (pc.gid_exists($1))cell.soma { pc.multisplit(.5, $1) //cell.axon pc.cell($1, new NetCon(&v(1), nil), 1) pc.cell($1, new NetCon(&v(.5), nil), 1) } if (pc.gid_exists($1 + splitbit)) cell.secden[0] { pc.multisplit(0, $1) pc.cell($1 + splitbit, new NetCon(&v(.5), nil), 0) } if (pc.gid_exists($1 + 2*splitbit)) cell.secden[1] { pc.multisplit(0, $1) pc.cell($1 + 2*splitbit, new NetCon(&v(.5), nil), 0) } }