예제 #1
0
 def test_data_setter(self):
     """
     Test that the :attr:`data` can be properly set when the FKPCatalog
     is either open or closed
     
     Test this by checking that the :attr:`alpha` attribute is properly computed
     """
     data1   = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     data2   = UnitTestDataSource(2*self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # initialize the catalog with the first data1
     catalog = FKPCatalog(data1, randoms)
     
     # data1 has alpha = 1.0
     with catalog:
         self.assertTrue(catalog.alpha == 1.0)
     
     # assign data2 when closed
     catalog.data = data2
     with catalog:
         self.assertTrue(catalog.alpha == 2.0)
     
     # assign data2 when open
     with catalog:
         catalog.data = data2
         self.assertTrue(catalog.alpha == 2.0)
예제 #2
0
 def test_closed_paint(self):
     """
     Test that a :exception:`ValueError` is raised if the catalog is closed
     while attempting to call :func:`~nbodykit.fkp.FKPCatalog.paint`
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     catalog = FKPCatalog(data, randoms)
     with pytest.raises(ValueError):
         stats = catalog.paint(self.pm)
예제 #3
0
    def test_read(self):
        """
        Test a valid input to the :func:`FKPCatalog.read` function
        """
        data    = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
        randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)

        # this should work fine
        catalog = FKPCatalog(data, randoms, fsky=1.0)
        with catalog:
            [[pos, nbar]] = catalog.read('data', ['Position', 'Nbar'], full=True)
예제 #4
0
    def test_paint(self):
        """
        Test a valid input to the :func:`FKPCatalog.paint` function
        """
        data    = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Nbar', float)], cosmo=self.cosmo)
        randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3)), ('Nbar', float)], cosmo=self.cosmo)

        # this should work fine
        catalog = FKPCatalog(data, randoms, fsky=1.0)
        with catalog:
            real, stats = catalog.paint(self.pm)
            self.assertTrue(stats['alpha'] == 0.01)
예제 #5
0
 def test_missing_fsky(self):
     """
     Test that if we have to compute n(z) from the randoms, then :attr:`fsky`
     is supplied
     """        
     data    = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
              
     # need fsky
     catalog = FKPCatalog(data, randoms)
     with pytest.raises(ValueError):
         with catalog:
             [nbar] = catalog.read('randoms', ['Nbar'])
예제 #6
0
    def test_small_box(self):
        """
        Test that a RuntimeWarning is thrown if the BoxSize is too small to hold all of
        the data particles
        """
        data    = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
        randoms = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)

        # box is too small
        catalog = FKPCatalog(data, randoms, fsky=1.0, BoxSize=0.5)
        with catalog:
            with pytest.warns(RuntimeWarning):
                [[pos, nbar]] = catalog.read('data', ['Position', 'Nbar'], full=True)
예제 #7
0
 def test_no_z_in_randoms(self):
     """
     Test that if we have to compute n(z) from the randoms, then the `randoms`
     DataSource has a `Redshift` column
     """        
     data    = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3))], cosmo=self.cosmo)
              
     # need Redshift column in randoms too
     catalog = FKPCatalog(data, randoms, fsky=1.0)
     with pytest.raises(ValueError):
         with catalog:
             [nbar] = catalog.read('data', ['Nbar'])
예제 #8
0
 def test_nbar_file_columns(self):
     """
     Test that a :exception:`ValueError` is raised if the file specified
     for :attr:`nbar` has the wrong number of columns
     """
     import tempfile
     
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # wrong number of columns
     with tempfile.NamedTemporaryFile() as ff:
         ff.write(("0 0 0 0 0 0 0\n0 0 0 0 0 0 0\n").encode()); ff.seek(0)
         with pytest.raises(ValueError):
             catalog = FKPCatalog(data, randoms, nbar=ff.name)
             
     # (z, nz) file
     with tempfile.NamedTemporaryFile() as ff:
         
         z = numpy.linspace(0, 1.0, 100)
         numpy.savetxt(ff, numpy.vstack([z, 2*z]).T)
         ff.seek(0)
         
         catalog = FKPCatalog(data, randoms, nbar=ff.name)
         numpy.testing.assert_allclose(2*z, catalog.nbar(z), atol=1e-3, rtol=1e-3)
         
     # (z_min, z_max, z_cen, nz) file
     with tempfile.NamedTemporaryFile() as ff:
         
         z = numpy.linspace(0, 1.0, 100)
         numpy.savetxt(ff, numpy.vstack([z, z, z, 2*z]).T)
         ff.seek(0)
         
         catalog = FKPCatalog(data, randoms, nbar=ff.name)
         numpy.testing.assert_allclose(2*z, catalog.nbar(z), atol=1e-3, rtol=1e-3)
예제 #9
0
 def test_constant_nbar(self):
     """
     Test that the `nbar` function returns a constant array of the correct length
     (internally using the strides technique to save memory) 
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # constant nbar
     catalog = FKPCatalog(data, randoms, nbar=1e-4)
     
     z = numpy.linspace(0., 1.0, 100)
     nbar = catalog.nbar(z)
     numpy.testing.assert_allclose(nbar, 1e-4)
     self.assertTrue(len(nbar) == 100)
예제 #10
0
 def test_invalid_nbar_types(self):
     """
     Test that a :exception:`TypeError` or :exception:`ValueError` is raised 
     for invalid :attr:`nbar` types
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # string is not a valid filename
     with pytest.raises(ValueError):
         catalog = FKPCatalog(data, randoms, nbar="invalid_filename")
         
     # value is not a scalar
     with pytest.raises(TypeError):
         catalog = FKPCatalog(data, randoms, nbar=[0,1,2])
예제 #11
0
 def test_required_cosmo(self):
     """
     The `data` and `randoms` DataSources must have a valid :attr:`cosmo` attribute.
     
     Test that a :exception:`ValueError` is raised if :attr`cosmo` is missing
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))])
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))])
     
     with pytest.raises(ValueError):
         catalog = FKPCatalog(data, randoms)
예제 #12
0
 def test_closed_alpha(self):
     """
     Test that a :exception:`ValueError` is raised if the catalog is closed
     while attempting to access :attr:`alpha`
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     catalog = FKPCatalog(data, randoms)
     with pytest.raises(ValueError):
         alpha = catalog.alpha
예제 #13
0
 def test_comm_mismatch(self):
     """
     Test that a :exception:`ValueError` is raised if `data` and `randoms` have
     different :attr`comm` attributes
     """
     from mpi4py import MPI
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo, comm=MPI.COMM_WORLD)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo, comm=None)
     
     with pytest.raises(ValueError):
         catalog = FKPCatalog(data, randoms)
예제 #14
0
 def test_missing_fsky(self):
     """
     Test that a :exception:`AttributeError` is raised if no :attr:`fsky` attribute
     is specified
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     
     catalog = FKPCatalog(data, randoms)
     with pytest.raises(AttributeError):
         fsky = catalog.fsky
예제 #15
0
 def test_cosmo_mismatch(self):
     """
     The `data` and `randoms` DataSources must have a valid :attr:`cosmo` attribute.
     
     Test that a :exception:`ValueError` is raised if `data` and `randoms` have
     different :attr`cosmo` attributes
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3))])
     
     with pytest.raises(ValueError):
         catalog = FKPCatalog(data, randoms)
예제 #16
0
 def test_missing_z_for_nbar(self):
     """
     Test that if we need the `Redshift` column to compute n(z), that it is valid
     in the input data sources
     """
     import tempfile
     from nbodykit.core import DataSource
     
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3))], cosmo=self.cosmo)
             
     with tempfile.NamedTemporaryFile() as ff:
         
         # write the (z, nz) file
         z = numpy.linspace(0, 1.0, 100)
         numpy.savetxt(ff, numpy.vstack([z, 2*z]).T)
         ff.seek(0)
         
         # "Redshift" column is missing from data
         catalog = FKPCatalog(data, randoms, nbar=ff.name)
         with pytest.raises(DataSource.MissingColumn):
             with catalog:
                 [nbar] = catalog.read('data', ['Nbar'])
                 
     # "Redshift" column is required to compute n(z)
     catalog = FKPCatalog(data, randoms)
     with pytest.raises(DataSource.MissingColumn):
         with catalog:
             [nbar] = catalog.read('data', ['Nbar'])
예제 #17
0
 def test_invalid_read(self):
     """
     Test that when calling ``read`` that both the stream name and the column
     names are valid
     """
     from nbodykit.core import DataSource
     
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # initialize the catalog
     catalog = FKPCatalog(data, randoms, nbar=1e-4)
     
     # invalid column name
     with pytest.raises(DataSource.MissingColumn):
         with catalog:
             [col] = catalog.read('data', ['MissingColumn'])
             
     # invalid stream name
     with pytest.raises(ValueError):
         with catalog:
             [pos] = catalog.read('missing_stream', ['Position'])
예제 #18
0
 def test_randoms_nbar_exception(self):
     """
     Test that a warning is raised if the ``RedshiftHistogram`` algorithm fails
     when computing n(z) from the `randoms` catalog
     """
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N, [('Position', (float, 3)), ('Redshift', float)], cosmo=self.cosmo)
     
     # invalid fsky value --> will cause 
     catalog = FKPCatalog(data, randoms, fsky="1.0")
     
     # catch the warning raised when n(z) algorithm fails
     with pytest.warns(RuntimeWarning):
         with catalog:
            pass
예제 #19
0
    def __init__(self,
                 data,
                 randoms,
                 Nmesh,
                 max_ell,
                 paintbrush='cic',
                 dk=None,
                 kmin=0.,
                 BoxSize=None,
                 BoxPad=0.02,
                 compute_fkp_weights=False,
                 P0_fkp=None,
                 nbar=None,
                 fsky=None,
                 factor_hexadecapole=False,
                 keep_cache=False):

        # positional arguments
        self.data = data
        self.randoms = randoms
        self.Nmesh = Nmesh
        self.max_ell = max_ell

        # keyword arguments
        self.paintbrush = paintbrush
        self.dk = dk
        self.kmin = kmin
        self.BoxSize = BoxSize
        self.BoxPad = BoxPad
        self.compute_fkp_weights = compute_fkp_weights
        self.P0_fkp = P0_fkp
        self.nbar = nbar
        self.fsky = fsky
        self.factor_hexadecapole = factor_hexadecapole
        self.keep_cache = keep_cache

        # initialize the FKP catalog (unopened)
        kws = {}
        kws['BoxSize'] = self.BoxSize
        kws['BoxPad'] = self.BoxPad
        kws['compute_fkp_weights'] = self.compute_fkp_weights
        kws['P0_fkp'] = self.P0_fkp
        kws['nbar'] = self.nbar
        kws['fsky'] = self.fsky
        self.catalog = FKPCatalog(self.data, self.randoms, **kws)
예제 #20
0
 def test_compute_fkp_weights(self):
     """
     Test the calculation of FKP weights in FKPCatalog -- must specify :attr:`P0_fkp`
     if we want to compute n(z)
     """
     from nbodykit.core import DataSource
     
     data    = UnitTestDataSource(self.N, [('Position', (float, 3))], cosmo=self.cosmo)
     randoms = UnitTestDataSource(self.N*100, [('Position', (float, 3))], cosmo=self.cosmo)
     
     # missing P0_fkp raises a ValueError
     with pytest.raises(ValueError):
         catalog = FKPCatalog(data, randoms, nbar=1e-4, compute_fkp_weights=True)
         with catalog:
             [weight] = catalog.read('data', ['FKPWeight'])
             
     # this should work fine
     catalog = FKPCatalog(data, randoms, nbar=1e-4, compute_fkp_weights=True, P0_fkp=1e4)
     with catalog:
         [weight] = catalog.read('data', ['FKPWeight'])
         numpy.testing.assert_allclose(weight, 0.5) # fkp_weight = 1.0 / (1.0 + nbar * P0_fkp) = 0.5