docs: def make_neurites(rdw):
      '''Build neurite trees from a raw data wrapper'''
      post_action = _NEURITE_ACTION[rdw.fmt]
      trunks = rdw.neurite_root_section_ids()
      if not trunks:
          return [], []
  
      # One pass over sections to build nodes
      nodes = tuple(Section(section_id=i,
                            points=rdw.data_block[sec.ids],
                            section_type=_TREE_TYPES[sec.ntype])
                    for i, sec in enumerate(rdw.sections))
  
      # One pass over nodes to connect children to parents
      for i, node in enumerate(nodes):
          parent_id = rdw.sections[i].pid
          parent_type = nodes[parent_id].type
          # only connect neurites
          if parent_id != ROOT_ID and parent_type != NeuriteType.soma:
              nodes[parent_id].add_child(node)
  
      neurites = tuple(Neurite(nodes[i]) for i in trunks)
  
      if post_action is not None:
          for n in neurites:
              post_action(n.root_node)
  
      return neurites, nodes