code: def _remove_dummy_species(structure):
          
          if not structure.is_ordered:
              raise Exception("Something went wrong with enumeration.")
  
          sites_to_remove = []
          logger.debug('Dummy species structure:\n{}'.format(str(structure)))
          for idx, site in enumerate(structure):
              if isinstance(site.specie, DummySpecie):
                  sites_to_remove.append(idx)
                  spin = site.specie._properties.get('spin', None)
                  neighbors = structure.get_neighbors(
                      site,
                      0.05,  # arbitrary threshold, needs to be << any bond length
                      # but >> floating point precision issues
                      include_index=True
                  )
                  if len(neighbors) != 1:
                      raise Exception("This shouldn't happen, found neighbors: {}"
                                      .format(neighbors))
                  orig_site_idx = neighbors[0][2]
                  orig_specie = structure[orig_site_idx].specie
                  new_specie = Specie(orig_specie.symbol,
                                      getattr(orig_specie, 'oxi_state', None),
                                      properties={'spin': spin})
                  structure.replace(orig_site_idx,
                                    new_specie,
                                    properties=structure[orig_site_idx].properties)
          structure.remove_sites(sites_to_remove)
          logger.debug('Structure with dummy species removed:\n{}'.format(str(structure)))
          return structure
docs: :return: Structure with dummy species removed, but
          their corresponding spin properties merged with the
          original sites. Used after performing enumeration.