docs: def plotRatePSD(include=['allCells', 'eachPop'], timeRange=None, binSize=5, maxFreq=100, NFFT=256, noverlap=128, smooth=0, overlay=True,
      ylim = None, popColors = {}, fontSize=12, figSize=(10,8), saveData=None, saveFig=None, showFig=True): 
      ''' 
      Plot firing rate power spectral density (PSD)
          - include (['all',|'allCells','allNetStims',|,120,|,'E1'|,('L2', 56)|,('L5',[4,5,6])]): List of data series to include. 
              Note: one line per item, not grouped (default: ['allCells', 'eachPop'])
          - timeRange ([start:stop]): Time range of spikes shown; if None shows all (default: None)
          - binSize (int): Size in ms of spike bins (default: 5)
          - maxFreq (float): Maximum frequency to show in plot (default: 100)
          - NFFT (float): The number of data points used in each block for the FFT (power of 2) (default: 256)
          - smooth (int): Window size for smoothing; no smoothing if 0 (default: 0)
          - overlay (True|False): Whether to overlay the data lines or plot in separate subplots (default: True)
          - graphType ('line'|'bar'): Type of graph to use (line graph or bar plot) (default: 'line')
          - yaxis ('rate'|'count'): Units of y axis (firing rate in Hz, or spike count) (default: 'rate')
          - popColors (dict): Dictionary with color (value) used for each population (key) (default: None)
          - figSize ((width, height)): Size of figure (default: (10,8))
          - saveData (None|True|'fileName'): File name where to save the final data used to generate the figure;
              if set to True uses filename from simConfig (default: None)
          - saveFig (None|True|'fileName'): File name where to save the figure;
              if set to True uses filename from simConfig (default: None)
          - showFig (True|False): Whether to show the figure or not (default: True)
  
          - Returns figure handle
      '''
  
      from .. import sim
  
      print('Plotting firing rate power spectral density (PSD) ...')
      
      # Replace 'eachPop' with list of pops
      if 'eachPop' in include: 
          include.remove('eachPop')
          for pop in sim.net.allPops: include.append(pop)
  
      # time range
      if timeRange is None:
          timeRange = [0,sim.cfg.duration]
  
      histData = []
  
      # create fig
      fig,ax1 = plt.subplots(figsize=figSize)
      fontsiz = fontSize
  
      # set font size
      plt.rcParams.update({'font.size': fontSize})
          
      allPower, allSignal, allFreqs = [], [], []
  
      # Plot separate line for each entry in include
      for iplot,subset in enumerate(include):
          cells, cellGids, netStimLabels = getCellsInclude([subset])   
          numNetStims = 0
  
          # Select cells to include
          if len(cellGids) > 0:
              try:
                  spkinds,spkts = list(zip(*[(spkgid,spkt) for spkgid,spkt in zip(sim.allSimData['spkid'],sim.allSimData['spkt']) if spkgid in cellGids]))
              except:
                  spkinds,spkts = [],[]
          else: 
              spkinds,spkts = [],[]
  
  
          # Add NetStim spikes
          spkts, spkinds = list(spkts), list(spkinds)
          numNetStims = 0
          if 'stims' in sim.allSimData:
              for netStimLabel in netStimLabels:
                  netStimSpks = [spk for cell,stims in sim.allSimData['stims'].items() \
                      for stimLabel,stimSpks in stims.items() for spk in stimSpks if stimLabel == netStimLabel]
                  if len(netStimSpks) > 0:
                      lastInd = max(spkinds) if len(spkinds)>0 else 0
                      spktsNew = netStimSpks 
                      spkindsNew = [lastInd+1+i for i in range(len(netStimSpks))]
                      spkts.extend(spktsNew)
                      spkinds.extend(spkindsNew)
                      numNetStims += 1
  
          histo = np.histogram(spkts, bins = np.arange(timeRange[0], timeRange[1], binSize))
          histoT = histo[1][:-1]+binSize/2
          histoCount = histo[0] 
          histoCount = histoCount * (1000.0 / binSize) / (len(cellGids)+numNetStims) # convert to rates
  
          histData.append(histoCount)
  
          color = popColors[subset] if isinstance(subset, (str, tuple)) and subset in popColors else colorList[iplot%len(colorList)] 
  
          if not overlay: 
              plt.subplot(len(include),1,iplot+1)  # if subplot, create new subplot
              title (str(subset), fontsize=fontsiz)
              color = 'blue'
          
          Fs = 1000.0/binSize # ACTUALLY DEPENDS ON BIN WINDOW!!! RATE NOT SPIKE!
          power = mlab.psd(histoCount, Fs=Fs, NFFT=NFFT, detrend=mlab.detrend_none, window=mlab.window_hanning, 
              noverlap=noverlap, pad_to=None, sides='default', scale_by_freq=None)
  
          if smooth:
              signal = _smooth1d(10*np.log10(power[0]), smooth)
          else:
              signal = 10*np.log10(power[0])
          freqs = power[1]
  
          allFreqs.append(freqs)
          allPower.append(power)
          allSignal.append(signal)
  
          plt.plot(freqs[freqs<maxFreq], signal[freqs<maxFreq], linewidth=1.5, color=color)
  
          plt.xlabel('Frequency (Hz)', fontsize=fontsiz)
          plt.ylabel('Power Spectral Density (dB/Hz)', fontsize=fontsiz) # add yaxis in opposite side
          plt.xlim([0, maxFreq])
          if ylim: plt.ylim(ylim)
  
      # if len(include) < 5:  # if apply tight_layout with many subplots it inverts the y-axis
      #     try:
      #         plt.tight_layout()
      #     except:
      #         pass
  
      # Add legend
      if overlay:
          for i,subset in enumerate(include):
              color = popColors[subset] if isinstance(subset, basestring) and subset in popColors else colorList[i%len(colorList)] 
              plt.plot(0,0,color=color,label=str(subset))
          plt.legend(fontsize=fontsiz, loc=1)#, bbox_to_anchor=(1.04, 1), loc=2, borderaxespad=0.)
          maxLabelLen = min(10,max([len(str(l)) for l in include]))
          #plt.subplots_adjust(right=(0.9-0.012*maxLabelLen))
  
  
      # save figure data
      if saveData:
          figData = {'histData': histData, 'histT': histoT, 'include': include, 'timeRange': timeRange, 'binSize': binSize,
           'saveData': saveData, 'saveFig': saveFig, 'showFig': showFig}
      
          _saveFigData(figData, saveData, 'spikeHist')
   
      # save figure
      if saveFig: 
          if isinstance(saveFig, basestring):
              filename = saveFig
          else:
              filename = sim.cfg.filename+'_'+'spikePSD.png'
          plt.savefig(filename)
  
      # show fig 
      if showFig: _showFigure()
  
      return fig, {'allSignal':allSignal, 'allPower':allPower, 'allFreqs':allFreqs}