def test_numpy_data_2d(self):
        DIM = 2
        testdata = np.arange(20 * 21).reshape(20, 21)
        error = 1. * np.ones(testdata.shape)
        source = NumpyData(DataSource.GRAVITY, testdata, null_value=NUMPY_NULL)
        X0, NP, DX = source.getDataExtents()
        for i in range(DIM):
            self.assertAlmostEqual(X0[i], 0., msg="Data origin wrong")
            self.assertEqual(NP[i],
                             testdata.shape[DIM - i - 1],
                             msg="Wrong number of data points")
            self.assertAlmostEqual(DX[i],
                                   1000. / testdata.shape[DIM - i - 1],
                                   msg="Wrong cell size")

        domainbuilder = DomainBuilder(dim=3)
        domainbuilder.addSource(source)
        domainbuilder.setVerticalExtents(depth=-VMIN,
                                         air_layer=VMAX,
                                         num_cells=NE_V)
        domainbuilder.setElementPadding(PAD_X, PAD_Y)
        dom = domainbuilder.getDomain()
        g, s = domainbuilder.getGravitySurveys()[0]

        outfn = os.path.join(WORKDIR, '_npdata2d.csv')
        saveDataCSV(outfn, g=g, s=s)

        DV = (VMAX - VMIN) / NE_V

        # check data
        nx = NP[0] + 2 * PAD_X
        ny = NP[1] + 2 * PAD_Y
        nz = NE_V
        z_data = int(np.round((ALT - VMIN) / DV) - 1)

        out = np.genfromtxt(outfn,
                            delimiter=',',
                            skip_header=1,
                            dtype=np.float64)
        # recompute nz since ripley might have adjusted number of elements
        nz = len(out) // (nx * ny)
        g_out = out[:, 0].reshape(nz, ny, nx)
        s_out = out[:, 1].reshape(nz, ny, nx)
        self.assertAlmostEqual(
            np.abs(g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   testdata).max(),
            0.,
            msg="Difference in gravity data area")

        self.assertAlmostEqual(
            np.abs(s_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   error).max(),
            0.,
            msg="Difference in error data area")

        # overwrite data -> should only be padding value left
        g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] = NUMPY_NULL
        self.assertAlmostEqual(np.abs(g_out - NUMPY_NULL).max(),
                               0.,
                               msg="Wrong values in padding area")
 def test_add_source_after_domain_built(self):
     db = DomainBuilder()
     source1a = NetCdfData(DataSource.GRAVITY, NC_DATA1, scale_factor=1.)
     db.addSource(source1a)
     _ = db.getDomain()
     source1b = NetCdfData(DataSource.GRAVITY, NC_DATA1, scale_factor=2.)
     self.assertRaises(Exception, db.addSource, source1b)
    def test_cdf_with_padding(self):
        source = NetCdfData(DataSource.GRAVITY, NC_DATA, ALT, scale_factor=1e-6)
        domainbuilder=DomainBuilder()
        domainbuilder.addSource(source)
        domainbuilder.setVerticalExtents(depth=-VMIN, air_layer=VMAX, num_cells=NE_V)
        domainbuilder.setElementPadding(PAD_X,PAD_Y)
        dom=domainbuilder.getDomain()
        g,s=domainbuilder.getGravitySurveys()[0]

        outfn=os.path.join(WORKDIR, '_ncdata.csv')
        saveDataCSV(outfn, g=g, s=s)

        X0,NP,DX=source.getDataExtents()
        DV=(VMAX-VMIN)/NE_V

        # check metadata
        self.assertEqual(NP, NC_SIZE, msg="Wrong number of data points")
        # this only works if gdal is available

        try:
            import osgeo.osr
            for i in range(len(NC_ORIGIN)):
                self.assertAlmostEqual(X0[i], NC_ORIGIN[i], msg="Data origin wrong")
        except ImportError:
            print("Skipping test of data origin since gdal is not installed.")

        # check data
        nx=NP[0]+2*PAD_X
        ny=NP[1]+2*PAD_Y
        nz=NE_V
        z_data=int(np.round((ALT-VMIN)/DV)-1)
    
        ref=np.genfromtxt(NC_REF, delimiter=',', dtype=np.float64)
        g_ref=ref[:,0].reshape((NP[1],NP[0]))
        s_ref=ref[:,1].reshape((NP[1],NP[0]))

        out=np.genfromtxt(outfn, delimiter=',', skip_header=1, dtype=np.float64)
        # recompute nz since ripley might have adjusted number of elements

        nz=len(out)//(nx*ny)
        g_out=out[:,0].reshape(nz,ny,nx)
        s_out=out[:,1].reshape(nz,ny,nx)

        self.assertAlmostEqual(np.abs(
            g_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]-g_ref).max(),
            0., msg="Difference in gravity data area")

        self.assertAlmostEqual(np.abs(
            s_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]-s_ref).max(),
            0., msg="Difference in error data area")

        # overwrite data -> should only be padding value left
        g_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]=NC_NULL
        self.assertAlmostEqual(np.abs(g_out-NC_NULL).max(), 0.,
                msg="Wrong values in padding area")
    def test_numpy_data_2d(self):
        DIM=2
        testdata = np.arange(20*21).reshape(20,21)
        error = 1.*np.ones(testdata.shape)
        source = NumpyData(DataSource.GRAVITY, testdata, null_value=NUMPY_NULL)
        X0,NP,DX=source.getDataExtents()
        for i in range(DIM):
            self.assertAlmostEqual(X0[i], 0., msg="Data origin wrong")
            self.assertEqual(NP[i], testdata.shape[DIM-i-1], msg="Wrong number of data points")
            self.assertAlmostEqual(DX[i], 1000./testdata.shape[DIM-i-1], msg="Wrong cell size")

        domainbuilder=DomainBuilder(dim=3)
        domainbuilder.addSource(source)
        domainbuilder.setVerticalExtents(depth=-VMIN, air_layer=VMAX, num_cells=NE_V)
        domainbuilder.setElementPadding(PAD_X, PAD_Y)
        dom=domainbuilder.getDomain()
        g,s=domainbuilder.getGravitySurveys()[0]

        outfn=os.path.join(WORKDIR, '_npdata2d.csv')
        saveDataCSV(outfn, g=g, s=s)

        DV=(VMAX-VMIN)/NE_V

        # check data
        nx=NP[0]+2*PAD_X
        ny=NP[1]+2*PAD_Y
        nz=NE_V
        z_data=int(np.round((ALT-VMIN)/DV)-1)

        out=np.genfromtxt(outfn, delimiter=',', skip_header=1, dtype=np.float64)
        # recompute nz since ripley might have adjusted number of elements
        nz=len(out)//(nx*ny)
        g_out=out[:,0].reshape(nz,ny,nx)
        s_out=out[:,1].reshape(nz,ny,nx)
        self.assertAlmostEqual(np.abs(
            g_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]-testdata).max(),
            0., msg="Difference in gravity data area")

        self.assertAlmostEqual(np.abs(
            s_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]-error).max(),
            0., msg="Difference in error data area")

        # overwrite data -> should only be padding value left
        g_out[z_data, PAD_Y:PAD_Y+NP[1], PAD_X:PAD_X+NP[0]]=NUMPY_NULL
        self.assertAlmostEqual(np.abs(g_out-NUMPY_NULL).max(), 0.,
                msg="Wrong values in padding area")
 def test_geodetic_domain(self):
     COORDINATES = WGS84ReferenceSystem()
     db = DomainBuilder(reference_system=COORDINATES)
     source1a = NetCdfData(DataSource.GRAVITY,
                           NC_DATA1,
                           scale_factor=1.,
                           reference_system=COORDINATES)
     db.addSource(source1a)
     db.setVerticalExtents(depth=20000., air_layer=30000., num_cells=10)
     dom = db.getDomain()
     x = dom.getX()
     self.assertAlmostEqual(inf(x[0]),
                            120.2,
                            delta=0.001,
                            msg="phi range wrong")
     self.assertAlmostEqual(inf(x[1]),
                            -29.2,
                            delta=0.0001,
                            msg="lambda range wrong")
     self.assertAlmostEqual(inf(x[2]),
                            -0.2,
                            msg="h range wrong" + str(x[2]))
     # Cannot check upper bounds of coordinates with more than 1 rank
     # because ripley may adjust internally.
     if getMPISizeWorld() == 1:
         self.assertAlmostEqual(sup(x[0]),
                                120.3,
                                delta=0.001,
                                msg="phi range wrong")
         self.assertAlmostEqual(sup(x[1]),
                                -29.1,
                                delta=0.0001,
                                msg="lambda range wrong")
         self.assertAlmostEqual(sup(x[2]),
                                0.3,
                                msg="h range wrong: " + str(x[2]))
 def test_cartesian_domain(self):
     db = DomainBuilder()
     source1a = NetCdfData(DataSource.GRAVITY, NC_DATA1, scale_factor=1.)
     db.addSource(source1a)
     db.setVerticalExtents(depth=20000., air_layer=30000., num_cells=10)
     dom = db.getDomain()
 def test_mixing_utm_zones(self):
     source1 = NetCdfData(DataSource.GRAVITY, NC_DATA1, scale_factor=1.)
     source2 = NetCdfData(DataSource.GRAVITY, NC_DATA2, scale_factor=1.)
     domainbuilder = DomainBuilder()
     domainbuilder.addSource(source1)
     self.assertRaises(ValueError, domainbuilder.addSource, source2)
 def test_add_garbage(self):
     db = DomainBuilder()
     self.assertRaises(TypeError, db.addSource, 42)
    def test_cdf_with_padding_ellipsoid(self):
        ref = WGS84ReferenceSystem()

        source = NetCdfData(DataSource.GRAVITY,
                            NC_DATA,
                            ALT,
                            reference_system=ref,
                            scale_factor=1e-6)
        domainbuilder = DomainBuilder(reference_system=ref)
        domainbuilder.addSource(source)
        domainbuilder.setVerticalExtents(depth=-VMIN,
                                         air_layer=VMAX,
                                         num_cells=NE_V)
        domainbuilder.setElementPadding(PAD_X, PAD_Y)
        dom = domainbuilder.getDomain()
        g, s = domainbuilder.getGravitySurveys()[0]

        outfn = os.path.join(WORKDIR, '_ncdata.csv')
        saveDataCSV(outfn, g=g, s=s)

        X0, NP, DX = source.getDataExtents()
        DV = (VMAX - VMIN) / NE_V

        # check metadata
        self.assertEqual(NP, NC_SIZE, msg="Wrong number of data points")

        for i in range(len(NC_ORIGIN)):
            self.assertAlmostEqual(X0[i],
                                   NC_ORIGIN_WGS84[i],
                                   msg="Data origin wrong")

        # check data
        nx = NP[0] + 2 * PAD_X
        ny = NP[1] + 2 * PAD_Y
        nz = NE_V
        z_data = int(np.round((ALT - VMIN) / DV) - 1)

        ref = np.genfromtxt(NC_REF, delimiter=',', dtype=np.float64)
        g_ref = ref[:, 0].reshape((NP[1], NP[0]))
        s_ref = ref[:, 1].reshape((NP[1], NP[0]))

        out = np.genfromtxt(outfn,
                            delimiter=',',
                            skip_header=1,
                            dtype=np.float64)

        # recompute nz since ripley might have adjusted number of elements
        nz = len(out) // (nx * ny)
        g_out = out[:, 0].reshape(nz, ny, nx)
        s_out = out[:, 1].reshape(nz, ny, nx)

        self.assertAlmostEqual(
            np.abs(g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   g_ref).max(),
            0.,
            msg="Difference in gravity data area")

        self.assertAlmostEqual(
            np.abs(s_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   s_ref).max(),
            0.,
            msg="Difference in error data area")

        # overwrite data -> should only be padding value left
        g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] = NC_NULL
        self.assertAlmostEqual(np.abs(g_out - NC_NULL).max(),
                               0.,
                               msg="Wrong values in padding area")
    def _ers_tester(self, filename):
        source = ErMapperData(DataSource.GRAVITY,
                              headerfile=filename,
                              altitude=ALT,
                              scale_factor=1e-6)
        domainbuilder = DomainBuilder()
        domainbuilder.addSource(source)
        domainbuilder.setVerticalExtents(depth=-VMIN,
                                         air_layer=VMAX,
                                         num_cells=NE_V)
        domainbuilder.setElementPadding(PAD_X, PAD_Y)
        dom = domainbuilder.getDomain()
        g, s = domainbuilder.getGravitySurveys()[0]

        outfn = os.path.join(WORKDIR, '_ersdata.csv')
        saveDataCSV(outfn, g=g, s=s)

        X0, NP, DX = source.getDataExtents()
        DV = (VMAX - VMIN) / NE_V

        # check metadata
        self.assertEqual(NP, ERS_SIZE, msg="Wrong number of data points")
        # this test only works if gdal is available
        try:
            import osgeo.osr
            for i in range(len(ERS_ORIGIN)):
                self.assertAlmostEqual(X0[i],
                                       ERS_ORIGIN[i],
                                       msg="Data origin wrong")
        except ImportError:
            print("Skipping test of data origin since gdal is not installed.")

        # check data
        nx = NP[0] + 2 * PAD_X
        ny = NP[1] + 2 * PAD_Y
        nz = NE_V
        z_data = int(np.round((ALT - VMIN) / DV) - 1)

        ref = np.genfromtxt(ERS_REF, delimiter=',', dtype=np.float64)
        g_ref = ref[:, 0].reshape((NP[1], NP[0]))
        s_ref = ref[:, 1].reshape((NP[1], NP[0]))

        out = np.genfromtxt(outfn,
                            delimiter=',',
                            skip_header=1,
                            dtype=np.float64)
        # recompute nz since ripley might have adjusted number of elements
        nz = len(out) // (nx * ny)
        g_out = out[:, 0].reshape(nz, ny, nx)
        s_out = out[:, 1].reshape(nz, ny, nx)
        self.assertAlmostEqual(
            np.abs(g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   g_ref).max(),
            0.,
            msg="Difference in gravity data area")

        self.assertAlmostEqual(
            np.abs(s_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] -
                   s_ref).max(),
            0.,
            msg="Difference in error data area")

        # overwrite data -> should only be padding value left
        g_out[z_data, PAD_Y:PAD_Y + NP[1], PAD_X:PAD_X + NP[0]] = ERS_NULL
        self.assertAlmostEqual(np.abs(g_out - ERS_NULL).max(),
                               0.,
                               msg="Wrong values in padding area")