docs: def connected_sites( self, site_labels=None ):
          """
          Searches the lattice to find sets of sites that are contiguously neighbouring.
          Mutually exclusive sets of contiguous sites are returned as Cluster objects.
  
          Args:
              site_labels (:obj:(List(Str)|Set(Str)|Str), optional): Labels for sites to be considered in the search.
                  This can be a list::
  
                      [ 'A', 'B' ]
  
                  a set::
  
                      ( 'A', 'B' )
  
                  or a string::
  
                      'A'.
  
          Returns:
              (List(Cluster)): List of Cluster objects for groups of contiguous sites.
          """
          if site_labels:
             selected_sites = self.select_sites( site_labels )
          else:
             selected_sites = self.sites
          initial_clusters = [ cluster.Cluster( [ site ] ) for site in selected_sites ]
          if site_labels:
              blocking_sites = self.site_labels - set( site_labels )
              for c in initial_clusters:
                  c.remove_sites_from_neighbours( blocking_sites )
          final_clusters = []
          while initial_clusters: # loop until initial_clusters is empty
              this_cluster = initial_clusters.pop(0)
              while this_cluster.neighbours:
                  neighbouring_clusters = [ c for c in initial_clusters if this_cluster.is_neighbouring( c ) ] 
                  for nc in neighbouring_clusters:
                      initial_clusters.remove( nc )
                      this_cluster = this_cluster.merge( nc ) 
              final_clusters.append( this_cluster )
          return final_clusters