docs: def register(self, newdata, *args, **kwargs):
          """
          Register data in registry. Meta for each data is specified by positional
          or keyword arguments after the new data and consists of the following:
  
          * ``uncertainty`` - Map of uncertainties in percent corresponding to new
            keys. The uncertainty keys must be a subset of the new data keys.
          * ``variance`` - Square of the uncertainty (no units).
          * ``isconstant``: Map corresponding to new keys whose values are``True``
            if constant or ``False`` if periodic. These keys must be a subset of
            the new data keys.
          * ``timeseries``: Name of corresponding time series data, ``None`` if no
            time series. _EG_: DNI data ``timeseries`` attribute might be set to a
            date/time data that it corresponds to. More than one data can have the
            same ``timeseries`` data.
          * ``data_source``: the
            :class:`~simkit.core.data_sources.DataSource` superclass that
            was used to acquire this data. This can be used to group data from a
            specific source together.
  
          :param newdata: New data to add to registry. When registering new data,
              keys are not allowed to override existing keys in the data
              registry.
          :type newdata: mapping
          :raises:
              :exc:`~simkit.core.exceptions.UncertaintyPercentUnitsError`
          """
          kwargs.update(zip(self.meta_names, args))
          # check uncertainty has units of percent
          uncertainty = kwargs['uncertainty']
          variance = kwargs['variance']
          isconstant = kwargs['isconstant']
          # check uncertainty is percent
          if uncertainty:
              for k0, d in uncertainty.iteritems():
                  for k1, v01 in d.iteritems():
                      units = v01.units
                      if units != UREG('percent'):
                          keys = '%s-%s' % (k0, k1)
                          raise UncertaintyPercentUnitsError(keys, units)
          # check variance is square of uncertainty
          if variance and uncertainty:
              for k0, d in variance.iteritems():
                  for k1, v01 in d.iteritems():
                      keys = '%s-%s' % (k0, k1)
                      missing = k1 not in uncertainty[k0]
                      v2 = np.asarray(uncertainty[k0][k1].to('fraction').m) ** 2.0
                      if missing or not np.allclose(np.asarray(v01), v2):
                          raise UncertaintyVarianceError(keys, v01)
          # check that isconstant is boolean
          if isconstant:
              for k, v in isconstant.iteritems():
                  if not isinstance(v, bool):
                      classname = self.__class__.__name__
                      error_msg = ['%s meta "isconstant" should be' % classname,
                                   'boolean, but it was "%s" for "%s".' % (v, k)]
                      raise TypeError(' '.join(error_msg))
          # call super method, meta must be passed as kwargs!
          super(DataRegistry, self).register(newdata, **kwargs)