docs: def createCellsFixedNum (self):
          ''' Create population cells based on fixed number of cells'''
          from .. import sim
  
          cells = []
          self.rand.Random123(self.tags['numCells'], sim.net.lastGid, sim.cfg.seeds['loc'])
          self.rand.uniform(0, 1)
          vec = h.Vector(self.tags['numCells']*3)
          vec.setrand(self.rand)
          randLocs = np.array(vec).reshape(self.tags['numCells'], 3)  # create random x,y,z locations
  
          if sim.net.params.shape == 'cylinder':
              # Use the x,z random vales 
              rho = randLocs[:,0] # use x rand value as the radius rho in the interval [0, 1)
              phi = 2 * pi * randLocs[:,2] # use z rand value as the angle phi in the interval [0, 2*pi) 
              x = (1 + sqrt(rho) * cos(phi))/2.0
              z = (1 + sqrt(rho) * sin(phi))/2.0
              randLocs[:,0] = x
              randLocs[:,2] = z
      
          elif sim.net.params.shape == 'ellipsoid':
              # Use the x,y,z random vales 
              rho = np.power(randLocs[:,0], 1.0/3.0) # use x rand value as the radius rho in the interval [0, 1); cuberoot
              phi = 2 * pi * randLocs[:,1] # use y rand value as the angle phi in the interval [0, 2*pi) 
              costheta = (2 * randLocs[:,2]) - 1 # use z rand value as cos(theta) in the interval [-1, 1); ensures uniform dist 
              theta = arccos(costheta)  # obtain theta from cos(theta)
              x = (1 + rho * cos(phi) * sin(theta))/2.0
              y = (1 + rho * sin(phi) * sin(theta))/2.0
              z = (1 + rho * cos(theta))/2.0 
              randLocs[:,0] = x
              randLocs[:,1] = y
              randLocs[:,2] = z
          
          for icoord, coord in enumerate(['x', 'y', 'z']):
              if coord+'Range' in self.tags:  # if user provided absolute range, convert to normalized
                  self.tags[coord+'normRange'] = [float(point) / getattr(sim.net.params, 'size'+coord.upper()) for point in self.tags[coord+'Range']]
              # constrain to range set by user
              if coord+'normRange' in self.tags:  # if normalized range, rescale random locations
                  minv = self.tags[coord+'normRange'][0] 
                  maxv = self.tags[coord+'normRange'][1] 
                  randLocs[:,icoord] = randLocs[:,icoord] * (maxv-minv) + minv
  
          for i in self._distributeCells(int(sim.net.params.scale * self.tags['numCells']))[sim.rank]:
              gid = sim.net.lastGid+i
              self.cellGids.append(gid)  # add gid list of cells belonging to this population - not needed?
              cellTags = {k: v for (k, v) in self.tags.items() if k in sim.net.params.popTagsCopiedToCells}  # copy all pop tags to cell tags, except those that are pop-specific
              cellTags['pop'] = self.tags['pop']
              cellTags['xnorm'] = randLocs[i,0] # set x location (um)
              cellTags['ynorm'] = randLocs[i,1] # set y location (um)
              cellTags['znorm'] = randLocs[i,2] # set z location (um)
              cellTags['x'] = sim.net.params.sizeX * randLocs[i,0] # set x location (um)
              cellTags['y'] = sim.net.params.sizeY * randLocs[i,1] # set y location (um)
              cellTags['z'] = sim.net.params.sizeZ * randLocs[i,2] # set z location (um)            
              if 'spkTimes' in self.tags:  # if VecStim, copy spike times to params
                  if isinstance(self.tags['spkTimes'][0], list):
                      try:
                          cellTags['params']['spkTimes'] = self.tags['spkTimes'][i] # 2D list
                      except:
                          pass
                  else:
                      cellTags['params']['spkTimes'] = self.tags['spkTimes'] # 1D list (same for all)
              cells.append(self.cellModelClass(gid, cellTags)) # instantiate Cell object
  
              if sim.cfg.verbose: print(('Cell %d/%d (gid=%d) of pop %s, on node %d, '%(i, sim.net.params.scale * self.tags['numCells']-1, gid, self.tags['pop'], sim.rank)))
          sim.net.lastGid = sim.net.lastGid + self.tags['numCells'] 
          return cells