docs: def nTE(cells1 = [], cells2 = [], spks1 = None, spks2 = None, timeRange = None, binSize = 20, numShuffle = 30):
      ''' 
      Calculate normalized transfer entropy
          - cells1 (['all',|'allCells','allNetStims',|,120,|,'E1'|,('L2', 56)|,('L5',[4,5,6])]): Subset of cells from which to obtain spike train 1 (default: [])
          - cells2 (['all',|'allCells','allNetStims',|,120,|,'E1'|,('L2', 56)|,('L5',[4,5,6])]): Subset of cells from which to obtain spike train 1 (default: [])
          - spks1 (list): Spike train 1; list of spike times; if omitted then obtains spikes from cells1 (default: None)
          - spks2 (list): Spike train 2; list of spike times; if omitted then obtains spikes from cells2 (default: None)
          - timeRange ([min, max]): Range of time to calculate nTE in ms (default: [0,cfg.duration])
          - binSize (int): Bin size used to convert spike times into histogram 
          - numShuffle (int): Number of times to shuffle spike train 1 to calculate TEshuffled; note: nTE = (TE - TEShuffled)/H(X2F|X2P)
  
          - Returns nTE (float): normalized transfer entropy 
      '''
  
      from neuron import h
      import netpyne
      from .. import sim
      import os
              
      root = os.path.dirname(netpyne.__file__)
      
      if 'nte' not in dir(h): 
          try: 
              print(' Warning: support/nte.mod not compiled; attempting to compile from %s via "nrnivmodl support"'%(root))
              os.system('cd ' + root + '; nrnivmodl support')
              from neuron import load_mechanisms
              load_mechanisms(root)
              print(' Compilation of support folder mod files successful')
          except:
              print(' Error compiling support folder mod files')
              return
  
      h.load_file(root+'/support/nte.hoc') # nTE code (also requires support/net.mod)
      
      if not spks1:  # if doesnt contain a list of spk times, obtain from cells specified
          cells, cellGids, netStimPops = getCellsInclude(cells1)
          numNetStims = 0
  
          # Select cells to include
          if len(cellGids) > 0:
              try:
                  spkts = [spkt for spkgid,spkt in zip(sim.allSimData['spkid'],sim.allSimData['spkt']) if spkgid in cellGids]
              except:
                  spkts = []
          else: 
              spkts = []
  
          # Add NetStim spikes
          spkts = list(spkts)
          numNetStims = 0
          for netStimPop in netStimPops:
              if 'stims' in sim.allSimData:
                  cellStims = [cellStim for cell,cellStim in sim.allSimData['stims'].items() if netStimPop in cellStim]
                  if len(cellStims) > 0:
                      spktsNew = [spkt for cellStim in cellStims for spkt in cellStim[netStimPop] ]
                      spkts.extend(spktsNew)
                      numNetStims += len(cellStims)
  
          spks1 = list(spkts)
  
      if not spks2:  # if doesnt contain a list of spk times, obtain from cells specified
          cells, cellGids, netStimPops = getCellsInclude(cells2)
          numNetStims = 0
  
          # Select cells to include
          if len(cellGids) > 0:
              try:
                  spkts = [spkt for spkgid,spkt in zip(sim.allSimData['spkid'],sim.allSimData['spkt']) if spkgid in cellGids]
              except:
                  spkts = []
          else: 
              spkts = []
  
          # Add NetStim spikes
          spkts = list(spkts)
          numNetStims = 0
          for netStimPop in netStimPops:
              if 'stims' in sim.allSimData:
                  cellStims = [cellStim for cell,cellStim in sim.allSimData['stims'].items() if netStimPop in cellStim]
                  if len(cellStims) > 0:
                      spktsNew = [spkt for cellStim in cellStims for spkt in cellStim[netStimPop] ]
                      spkts.extend(spktsNew)
                      numNetStims += len(cellStims)
  
          spks2 = list(spkts)
  
      # time range
      if getattr(sim, 'cfg', None):
          timeRange = [0,sim.cfg.duration]
      else:
          timeRange = [0, max(spks1+spks2)]
  
      inputVec = h.Vector()
      outputVec = h.Vector()
      histo1 = np.histogram(spks1, bins = np.arange(timeRange[0], timeRange[1], binSize))
      histoCount1 = histo1[0] 
      histo2 = np.histogram(spks2, bins = np.arange(timeRange[0], timeRange[1], binSize))
      histoCount2 = histo2[0] 
  
      inputVec.from_python(histoCount1)
      outputVec.from_python(histoCount2)
      out = h.normte(inputVec, outputVec, numShuffle)
      TE, H, nTE, _, _ = out.to_python()
      return nTE