docs: def stack_decon_stims(stim_list):
      '''take a ``list`` (in order of runs) of ``dict``s of stim_name:DeconStim and stack them together. returns
      a single ``dict`` of stim_name:decon_stim
  
      As in, takes:
      [
          # Run 1
          { "stim1": decon_stim1a, "stim2": decon_stim2a },
          # Run 2
          { "stim1": decon_stim1b, "stim2": decon_stim2b, "stim3": decon_stim3 }
      ]
  
      And makes:
          { "stim1": decon_stim1, "stim2": decon_stim2, "stim3": decon_stim3 }
  
      If a stimulus is not present in a run, it will fill that run with an empty stimulus
      '''
      stim_names = list(set(nl.flatten([stims.keys() for stims in stim_list])))
  
      stim_dict = {}
      for stim_name in stim_names:
          types = list(set([stims[stim_name].type() for stims in stim_list if stim_name in stims]))
          if len(types)>1:
              nl.notify('Error: Trying to stack stimuli of different types! (%s)' % stim_name,level=nl.level.error)
              return None
          type = types[0]
  
          stim_stack = []
          for i in xrange(len(stim_list)):
              if stim_name in stim_list[i]:
                  stim_stack.append(stim_list[i][stim_name])
              else:
                  stim_stack.append(stim_list[i].values()[0].blank_stim(type=type))
          stim_dict[stim_name] = copy.copy(stim_stack[0])
          for stim in stim_stack[1:]:
              stim_dict[stim_name] = stim_dict[stim_name].concat_stim(stim)
      return stim_dict.values()