docs: def _hotellings_fourier(self):
          """ hotelling's T2 tests for fourier domain waveforms"""
          sigma_2 = self._catalog_object.sigma**2
          # compute residual
          df = self._df #degrees of freedom
          R = self._A - np.dot(self._X, self._Bhat)
          R = np.matrix(R)
          # residual covariance matrix
          Sigma_R = (R.H*R) * (1./df)
          # noise covariance matrix
          #raise TypeError("fourier domain hypothesis tests not implemented yet")
          Zft = np.matrix(self._basis_object._Z)
          Sigma_S = Zft.H*np.matrix(np.diag(sigma_2))*Zft
          # add covariances (sum of multivariate normals is normal)
          Sigma_Z = np.array(Sigma_R + Sigma_S)
  
          T_2_list = []
          p_value_list = []
          for i in np.arange(0,self._Bhat.shape[0]):
  
              Bstar       = self._Bhat[i,np.arange(0,np.shape(self._A)[1])]
              lstar       = float(np.shape(Bstar)[0])
              cx          = self._Cx[i,i]
              Einv        = np.linalg.pinv(Sigma_Z)
              Zs          = Bstar/np.sqrt(cx)
              last_part   = np.array(np.matrix(Zs)*np.matrix(Einv)*np.matrix(Zs).H).real
              T_2         = ((df - lstar + 1.)/(df*lstar))*last_part
              p_value     = 1. - stats.f.cdf(T_2, 2.*lstar, 2.*(df - lstar + 1.))
              p_value_list.append(p_value)
              T_2_list.append(T_2)
          # save pvalue results in a table
          results = [['Comparison','Hotellings T^2', "p-value"]]
          for i in np.arange(0,len(self._col_names)):
              results.append([self._col_names[i], T_2_list[i], p_value_list[i]])
          self._results = results