docs: def save_hdf(self,filename,path='',properties=None,
                   overwrite=False, append=False):
          """Saves to HDF5 file.
  
          Subclasses should be sure to define
          ``_properties`` attribute to ensure that all
          correct attributes get saved.  Load a saved population
          with :func:`StarPopulation.load_hdf`.
  
          Example usage::
  
              >>> from vespa.stars import Raghavan_BinaryPopulation, StarPopulation
              >>> pop = Raghavan_BinaryPopulation(1., n=1000)
              >>> pop.save_hdf('test.h5')
              >>> pop2 = StarPopulation.load_hdf('test.h5')
              >>> pop == pop2
                  True
              >>> pop3 = Ragahavan_BinaryPopulation.load_hdf('test.h5')
              >>> pop3 == pop2
                  True
  
  
          :param filename:
              Name of HDF file.
  
          :param path: (optional)
              Path within HDF file to save object.
  
          :param properties: (optional)
              Names of any properties (in addition to
              those defined in ``_properties`` attribute)
              that you wish to save.  (This is an old
              keyword, and should probably be removed.
              Feel free to ignore it.)
  
          :param overwrite: (optional)
              Whether to overwrite file if it already
              exists.  If ``True``, then any existing file
              will be deleted before object is saved.  Use
              ``append`` if you don't wish this to happen.
  
          :param append: (optional)
              If ``True``, then if the file exists,
              then only the particular path in the file
              will get written/overwritten.  If ``False`` and both
              file and path exist, then an ``IOError`` will
              be raised.  If ``False`` and file exists but not
              path, then no error will be raised.
  
          """
          if os.path.exists(filename):
              with pd.HDFStore(filename) as store:
                  if path in store:
                      if overwrite:
                          os.remove(filename)
                      elif not append:
                          raise IOError('{} in {} exists.  '.format(path,filename) +
                                       'Set either overwrite or append option.')
  
          if properties is None:
              properties = {}
  
          for prop in self._properties:
              properties[prop] = getattr(self, prop)
  
          self.stars.to_hdf(filename,'{}/stars'.format(path))
          self.constraint_df.to_hdf(filename,'{}/constraints'.format(path))
  
          if self.orbpop is not None:
              self.orbpop.save_hdf(filename, path=path+'/orbpop')
  
          with pd.HDFStore(filename) as store:
              attrs = store.get_storer('{}/stars'.format(path)).attrs
              attrs.selectfrac_skip = self.selectfrac_skip
              attrs.distribution_skip = self.distribution_skip
              attrs.name = self.name
              attrs.poptype = type(self)
              attrs.properties = properties