def test_cube_attr_rms_two_surfaces_compare_window(load_cube_rsgy1): """Get cube attribute (rms) between two surfaces, and compare with window.""" xs1 = RegularSurface(rtop1) xs2 = xs1.copy() xs2.values += 30 kube = load_cube_rsgy1 xss1 = xs1.copy() xss1.slice_cube_window(kube, other=xs2, other_position='below', attribute='rms', sampling='trilinear') xss2 = xs1.copy() xss2.values += 15 xss2.slice_cube_window(kube, zrange=15, attribute='rms', sampling='trilinear') assert xss1.values.mean() == xss2.values.mean()
def test_cube_attr_mean_two_surfaces_multiattr(tmpdir, load_cube_rsgy1): """Get cube attribute (mean) between two surfaces, many attr at the same time. """ logger.info("Loading surfaces {} {}".format(RTOP1, RBAS1)) xs1 = RegularSurface(RTOP1) xs2 = RegularSurface(RBAS1) logger.info("Loading cube {}".format(RSGY1)) kube = load_cube_rsgy1 xss = xs1.copy() xss.slice_cube_window( kube, other=xs2, other_position="below", attribute="rms", sampling="trilinear", showprogress=True, ) logger.debug(xss.values.mean()) xsx = xs1.copy() attrs = xsx.slice_cube_window( kube, other=xs2, other_position="below", attribute=["max", "mean", "min", "rms"], sampling="trilinear", showprogress=True, ) logger.debug(attrs["rms"].values.mean()) assert xss.values.mean() == attrs["rms"].values.mean() assert xss.values.std() == attrs["rms"].values.std() for attr in attrs.keys(): logger.info("Working with %s", attr) xxx = attrs[attr] xxx.to_file(join(tmpdir, "surf_slice_cube_2surf_" + attr + "multi.gri")) minmax = (None, None) if attr == "mean": minmax = (-0.1, 0.1) xxx.quickplot( filename=join(tmpdir, "surf_slice_cube_2surf_" + attr + "multi.png"), colortable="jet", minmax=minmax, title="Reek two surfs mean multiattr: " + attr, infotext="Method: trilinear, 2 surfs multiattr " + attr, )
def test_cube_slice_w_ignore_dead_traces_nearest(): """Get cube slice nearest aka Auto4D input, with scrambled data with dead traces, various YFLIP cases, ignore dead traces.""" cube1 = Cube(XCUB2) surf1 = RegularSurface() surf1.from_cube(cube1, 1000.1) cells = ((18, 12), (20, 2), (0, 4)) surf1.slice_cube(cube1, deadtraces=False) plotfile = ojn(td, "slice_nea1.png") title = "Cube with dead traces; nearest; use just values as is" surf1.quickplot(filename=plotfile, minmax=(-10000, 10000), title=title) for cell in cells: icell, jcell = cell assert surf1.values[icell, jcell] == pytest.approx(cube1.values[icell, jcell, 0], abs=0.01) assert ma.count_masked(surf1.values) == 0 # shall be no masked cells # swap surface surf2 = surf1.copy() surf2.values = 1000.1 surf2.swapaxes() surf2.slice_cube(cube1, deadtraces=False) assert surf2.values.mean() == pytest.approx(surf1.values.mean(), rel=0.001) # swap surface and cube surf2 = surf1.copy() surf2.values = 1000.1 surf2.swapaxes() cube2 = cube1.copy() cube2.swapaxes() surf2.slice_cube(cube2, deadtraces=False) assert surf2.values.mean() == pytest.approx(surf1.values.mean(), rel=0.001) # swap cube only surf2 = surf1.copy() surf2.values = 1000.1 cube2 = cube1.copy() cube2.swapaxes() surf2.slice_cube(cube2, deadtraces=False) assert surf2.values.mean() == pytest.approx(surf1.values.mean(), rel=0.001)
def test_cube_attr_mean_two_surfaces_multiattr(load_cube_rsgy1): """Get cube attribute (mean) between two surfaces, many attr at the same time. """ logger.info('Loading surfaces {} {}'.format(rtop1, rbas1)) xs1 = RegularSurface(rtop1) xs2 = RegularSurface(rbas1) logger.info('Loading cube {}'.format(rsgy1)) kube = load_cube_rsgy1 xss = xs1.copy() xss.slice_cube_window(kube, other=xs2, other_position='below', attribute='rms', sampling='trilinear', showprogress=True) logger.debug(xss.values.mean()) xsx = xs1.copy() attrs = xsx.slice_cube_window(kube, other=xs2, other_position='below', attribute=['max', 'mean', 'min', 'rms'], sampling='trilinear', showprogress=True) logger.debug(attrs['rms'].values.mean()) assert xss.values.mean() == attrs['rms'].values.mean() assert xss.values.std() == attrs['rms'].values.std() for attr in attrs.keys(): logger.info('Working with %s', attr) xxx = attrs[attr] xxx.to_file(ojn(td, 'surf_slice_cube_2surf_' + attr + 'multi.gri')) minmax = (None, None) if attr == 'mean': minmax = (-0.1, 0.1) xxx.quickplot(filename=ojn( td, 'surf_slice_cube_2surf_' + attr + 'multi.png'), colortable='jet', minmax=minmax, title='Reek two surfs mean multiattr: ' + attr, infotext='Method: trilinear, 2 surfs multiattr ' + attr)
def test_cube_attr_mean_two_surfaces_with_zeroiso(load_cube_rsgy1): """Get cube attribute between two surfaces with partly zero isochore.""" logger.info('Loading surfaces {} {}'.format(rtop1, rbas1)) xs1 = RegularSurface(rtop1) xs2 = RegularSurface(rbas2) logger.info('Loading cube {}'.format(rsgy1)) kube = load_cube_rsgy1 xss = xs1.copy() xss.slice_cube_window(kube, other=xs2, other_position='below', attribute='mean', sampling='trilinear') xss.to_file(td + '/surf_slice_cube_2surf_meantri.gri') xss.quickplot(filename=td + '/surf_slice_cube_2surf_mean_v2.png', colortable='jet', title='Reek two surfs mean', minmax=(-0.1, 0.1), infotext='Method: trilinear, 2 surfs, partly zero isochore') logger.info('Mean is {}'.format(xss.values.mean()))
def test_cube_attr_mean_two_surfaces_with_zeroiso(tmpdir, load_cube_rsgy1): """Get cube attribute between two surfaces with partly zero isochore.""" logger.info("Loading surfaces {} {}".format(RTOP1, RBAS1)) xs1 = RegularSurface(RTOP1) xs2 = RegularSurface(RBAS2) logger.info("Loading cube {}".format(RSGY1)) kube = load_cube_rsgy1 xss = xs1.copy() xss.slice_cube_window( kube, other=xs2, other_position="below", attribute="mean", sampling="trilinear" ) xss.to_file(join(tmpdir, "surf_slice_cube_2surf_meantri.gri")) xss.quickplot( filename=join(tmpdir, "surf_slice_cube_2surf_mean_v2.png"), colortable="jet", title="Reek two surfs mean", minmax=(-0.1, 0.1), infotext="Method: trilinear, 2 surfs, partly zero isochore", ) logger.info("Mean is {}".format(xss.values.mean()))
def test_cube_attr_mean_two_surfaces(load_cube_rsgy1): """Get cube attribute (mean) between two surfaces.""" logger.info("Loading surfaces {} {}".format(RTOP1, RBAS1)) xs1 = RegularSurface(RTOP1) xs2 = RegularSurface(RBAS1) logger.info("Loading cube {}".format(RSGY1)) kube = load_cube_rsgy1 xss = xs1.copy() xss.slice_cube_window(kube, other=xs2, other_position="below", attribute="mean", sampling="trilinear") xss.to_file(td + "/surf_slice_cube_2surf_meantri.gri") xss.quickplot( filename=td + "/surf_slice_cube_2surf_mean.png", colortable="jet", title="Reek two surfs mean", minmax=(-0.1, 0.1), infotext="Method: trilinear, 2 surfs", ) logger.info("Mean is {}".format(xss.values.mean()))
def test_resample_small(): """Do resampling with minimal dataset to test for various yflip etc""" xs1 = RegularSurface( xori=0, yori=0, ncol=3, nrow=3, xinc=100, yinc=100, values=-888.0, yflip=1, ) xs2 = RegularSurface( xori=0, yori=0, ncol=3, nrow=3, xinc=100, yinc=100, values=888.0, yflip=1, ) xs3 = RegularSurface( xori=0, yori=200, ncol=3, nrow=3, xinc=100, yinc=100, values=2888.0, yflip=-1, ) xsx = xs1.copy() xsx.resample(xs2) assert xsx.values.mean() == 888.0 xsx = xs3.copy() xsx.resample(xs2) assert xsx.values.mean() == 888.0 xsx = xs1.copy() xsx.resample(xs3) assert xsx.values.mean() == 2888.0
def test_cube_attr_rms_two_surfaces_compare_window_show(load_cube_rsgy1): """Get cube attribute (rms) between two surfaces, and compare with window, and show plots.""" logger.info("Loading surfaces {} {}".format(RTOP1, RBAS1)) xs1 = RegularSurface(RTOP1) xs2 = xs1.copy() xs2.values += 30 logger.info("Loading cube {}".format(RSGY1)) kube = load_cube_rsgy1 xss1 = xs1.copy() xss1.slice_cube_window(kube, other=xs2, other_position="below", attribute="rms", sampling="trilinear") xss1.quickplot( filename=td + "/surf_slice_cube_2surf_rms1.png", colortable="jet", minmax=[0, 0.5], # TODO: itle='Reek two surfs mean', minmax=(-0.1, 0.1), infotext="Method: trilinear, 2 surfs, 30ms apart", ) print("\n\n{}\n".format("=" * 100)) xss2 = xs1.copy() xss2.values += 15 xss2.slice_cube_window(kube, zrange=15, attribute="rms", sampling="trilinear") xss2.quickplot( filename=td + "/surf_slice_cube_2surf_rms2.png", colortable="jet", minmax=[0, 0.5], # TODO: itle='Reek two surfs mean', minmax=(-0.1, 0.1), infotext="Method: trilinear, 2 surfs, +- 15ms window", ) assert xss1.values.mean() == xss2.values.mean()
def test_cube_attr_rms_two_surfaces_compare_window_show(load_cube_rsgy1): """Get cube attribute (rms) between two surfaces, and compare with window, and show plots.""" logger.info('Loading surfaces {} {}'.format(rtop1, rbas1)) xs1 = RegularSurface(rtop1) xs2 = xs1.copy() xs2.values += 30 logger.info('Loading cube {}'.format(rsgy1)) kube = load_cube_rsgy1 xss1 = xs1.copy() xss1.slice_cube_window(kube, other=xs2, other_position='below', attribute='rms', sampling='trilinear') xss1.quickplot( filename=td + '/surf_slice_cube_2surf_rms1.png', colortable='jet', minmax=[0, 0.5], # TODO: itle='Reek two surfs mean', minmax=(-0.1, 0.1), infotext='Method: trilinear, 2 surfs, 30ms apart') print('\n\n{}\n'.format('=' * 100)) xss2 = xs1.copy() xss2.values += 15 xss2.slice_cube_window(kube, zrange=15, attribute='rms', sampling='trilinear') xss2.quickplot( filename=td + '/surf_slice_cube_2surf_rms2.png', colortable='jet', minmax=[0, 0.5], # TODO: itle='Reek two surfs mean', minmax=(-0.1, 0.1), infotext='Method: trilinear, 2 surfs, +- 15ms window') assert xss1.values.mean() == xss2.values.mean()
def test_slice_attr_window_max_w_plotting(load_cube_rsgy1): """Slice a cube within a window, get max/min etc, using trilinear interpol and plotting.""" logger.info("Loading surface") xs1 = RegularSurface(RTOP1) xs2 = xs1.copy() xs3 = xs1.copy() logger.info("Loading cube") kube = load_cube_rsgy1 t1 = xtg.timer() xs1.slice_cube_window(kube, attribute="min", sampling="trilinear") t2 = xtg.timer(t1) logger.info("Window slicing... {} secs".format(t2)) xs1.quickplot( filename=td + "/surf_slice_cube_window_min.png", colortable="seismic", minmax=(-1, 1), title="Reek Minimum", infotext="Method: trilinear, window", ) xs2.slice_cube_window(kube, attribute="max", sampling="trilinear", showprogress=True) xs2.quickplot( filename=td + "/surf_slice_cube_window_max.png", colortable="seismic", minmax=(-1, 1), title="Reek Maximum", infotext="Method: trilinear, window", ) xs3.slice_cube_window(kube, attribute="rms", sampling="trilinear") xs3.quickplot( filename=td + "/surf_slice_cube_window_rms.png", colortable="jet", minmax=(0, 1), title="Reek rms (root mean square)", infotext="Method: trilinear, window", )
def test_slice_attr_window_max_w_plotting(load_cube_rsgy1): """Slice a cube within a window, get max/min etc, using trilinear interpol and plotting.""" logger.info('Loading surface') xs1 = RegularSurface(rtop1) xs2 = xs1.copy() xs3 = xs1.copy() logger.info('Loading cube') kube = load_cube_rsgy1 t1 = xtg.timer() xs1.slice_cube_window(kube, attribute='min', sampling='trilinear') t2 = xtg.timer(t1) logger.info('Window slicing... {} secs'.format(t2)) xs1.quickplot(filename=td + '/surf_slice_cube_window_min.png', colortable='seismic', minmax=(-1, 1), title='Reek Minimum', infotext='Method: trilinear, window') xs2.slice_cube_window(kube, attribute='max', sampling='trilinear', showprogress=True) xs2.quickplot(filename=td + '/surf_slice_cube_window_max.png', colortable='seismic', minmax=(-1, 1), title='Reek Maximum', infotext='Method: trilinear, window') xs3.slice_cube_window(kube, attribute='rms', sampling='trilinear') xs3.quickplot(filename=td + '/surf_slice_cube_window_rms.png', colortable='jet', minmax=(0, 1), title='Reek rms (root mean square)', infotext='Method: trilinear, window')
def test_resample_partial_sample(tmp_path, reek_map, generate_plot): """Do resampling from one surface to another with partial sampling.""" sml = reek_map # note: values is missing by purpose: snew = RegularSurface( ncol=round(sml.ncol * 0.6), nrow=round(sml.nrow * 0.6), xori=sml.xori - 2000, yori=sml.yori + 3000, xinc=sml.xinc * 0.6, yinc=sml.xinc * 0.6, rotation=sml.rotation, yflip=sml.yflip, ) print(sml.yflip) logger.info(snew.values) snew.resample(sml, mask=True) assert snew.values.mean() == pytest.approx(1726.65) if generate_plot: sml.quickplot(tmp_path / "resampled_input.png") snew.quickplot(tmp_path / "resampled_output.png") sml.to_file(tmp_path / "resampled_input.gri") snew.to_file(tmp_path / "resampled_output.gri") snew2 = snew.copy() snew2._yflip = -1 snew2._xori -= 4000 snew2._yori -= 2000 snew2.resample(sml, mask=True) if generate_plot: snew2.to_file(tmp_path / "resampled_output2.gri") assert snew2.values.mean() == pytest.approx(1747.20, abs=0.2)
def test_cube_slice_w_dead_traces_nearest(): """Get cube slice nearest aka Auto4D input, with scrambled data with dead traces, various YFLIP cases, undef at dead traces.""" cube1 = Cube(xcub2) surf1 = RegularSurface() surf1.from_cube(cube1, 1000.1) cells = ((18, 12), ) surf1.slice_cube(cube1, deadtraces=True) plotfile = ojn(td, 'slice_nea1_dead.png') title = 'Cube with dead traces; nearest; UNDEF at dead traces' surf1.quickplot(filename=plotfile, minmax=(-10000, 10000), title=title) for cell in cells: icell, jcell = cell assert surf1.values[icell, jcell] == cube1.values[icell, jcell, 0] ndead = (cube1.traceidcodes == 2).sum() print(ndead) assert ma.count_masked(surf1.values) == ndead # swap cube only surf2 = surf1.copy() surf2.values = 1000.1 cube2 = cube1.copy() cube2.swapaxes() surf2.slice_cube(cube2, deadtraces=True) plotfile = ojn(td, 'slice_nea1_dead_cubeswap.png') surf2.quickplot(filename=plotfile, minmax=(-10000, 10000)) assert ma.count_masked(surf2.values) == ndead assert surf2.values.mean() == surf1.values.mean()
def test_resample_small(): """Do resampling with minimal dataset to test for various yflip etc.""" xs1 = RegularSurface( xori=0, yori=0, ncol=3, nrow=3, xinc=100, yinc=100, values=-888.0, yflip=1, ) xs2 = RegularSurface( xori=0, yori=0, ncol=3, nrow=3, xinc=100, yinc=100, values=888.0, yflip=1, ) xs3 = RegularSurface( xori=0, yori=200, ncol=3, nrow=3, xinc=100, yinc=100, values=2888.0, yflip=-1, ) xsx = xs1.copy() xsx.resample(xs2) assert list(xsx.values.data.flatten()) == [ 888.0, 888.0, 888.0, 888.0, 888.0, 888.0, 888.0, 888.0, 888.0, ] xsx = xs3.copy() xsx.resample(xs2) assert list(xsx.values.data.flatten()) == [ 1e33, 888.0, 888.0, 1e33, 888.0, 888.0, 1e33, 1e33, 1e33, ] xsx = xs1.copy() xsx.resample(xs3) assert list(xsx.values.data.flatten()) == [ 1e33, 2888.0, 2888.0, 1e33, 2888.0, 2888.0, 1e33, 1e33, 1e33, ]