def test_segyiotests_writer_from_ds(temp_dir, segyio3d_test_files, il_chunks): file, segyio_kwargs = segyio3d_test_files ds = segy_loader(str(file), silent=True, **segyio_kwargs) outfile = temp_dir / file.name segy_writer(ds, outfile, il_chunks=il_chunks) del ds ds = segy_loader(str(outfile), silent=True, **well_known_byte_locs("standard_3d")) assert isinstance(ds, xr.Dataset)
def test_segyiotests_writer_from_seisnc(temp_dir, segyio3d_test_files): file, segyio_kwargs = segyio3d_test_files seisnc = temp_dir / file.with_suffix(".siesnc").name segy_converter(str(file), ncfile=seisnc, silent=True, **segyio_kwargs) outfile = temp_dir / file.name segy_writer(seisnc, outfile) ds = segy_loader(str(outfile), silent=True, **well_known_byte_locs("standard_3d")) assert isinstance(ds, xr.Dataset)
def test_segyiotests_2ds_wheaderscrap(segyio3d_test_files): file, segyio_kwargs = segyio3d_test_files scrape_args = dict() try: scrape_args["endian"] = segyio_kwargs["endian"] except KeyError: pass header = segy_header_scrape(str(file), silent=True, **scrape_args) ds = segy_loader(str(file), silent=True, **segyio_kwargs, head_df=header) assert isinstance(ds, xr.Dataset)
def test_seisnc_return(temp_dir, empty): dims = list(empty.dims) shp = [empty.dims[d] for d in dims] domain = empty.d3_domain empty["data"] = (dims, np.zeros(shp)) if "offset" in empty: empty["offset"] = empty["offset"].astype(np.int32) segy_writer(empty, temp_dir / "temp_empty.segy") back = segy_loader(temp_dir / "temp_empty.segy", vert_domain=domain) assert empty == back
def convert(output_file, input_file, iline, xline, crop, output_type): input_file = pathlib.Path(input_file) if output_type is None and output_file is not None: output_type = guess_file_type(output_file) elif output_type is None and output_file is None: """Because currently only one conversion exists we can guess the output from the input""" input_type = guess_file_type(input_file) if input_type: output_type = "SEGY" if input_type == "NETCDF" else "NETCDF" if output_type is None: click.echo( "Output type not recognised! Please provide the desired output file type explicitly using the --output-type option" ) raise SystemExit click.echo(f"Converting file {input_file.name} to {output_type}") if len(crop) == 0: crop = None if output_type == "NETCDF": if output_file is None: output_file = input_file.stem + ".SEISNC" _ = segy_loader(input_file, ncfile=output_file, iline=iline, xline=xline, ix_crop=crop) click.echo(f"Converted file saved as {output_file}") LOGGER.info(f"NetCDF output written to {output_file}") elif output_type == "SEGY": if output_file is None: output_file = input_file.stem + ".segy" ncdf2segy(input_file, output_file, iline=iline, xline=xline) click.echo(f"Converted file saved as {output_file}") LOGGER.info(f"SEGY output written to {output_file}") else: click.echo( f"Conversion to output-type {output_type} is not implemented yet") raise SystemExit
def main(): # how to track down warnings #import warnings #warnings.filterwarnings('error', category=UnicodeWarning) #warnings.filterwarnings('error', category=DeprecationWarning, module='numpy') #parse args sys_parser = segysakArgsParser() args = sys_parser.parse_args() # gaffe print(f'SEGY-SAK - v{version}') # initialise logging LOGGER.info(f'segysak v{version}') # check inputs checked_files = check_file(args.files) # Generate or Load Configuration File for input_file in checked_files: print(input_file.name) # Print EBCIDC header if args.ebcidc: try: print(get_segy_texthead(input_file)) except IOError: LOGGER.error( "Input SEGY file was not found - check name and path") if args.scan > 0: hscan, nscan = segy_header_scan(input_file, max_traces_scan=args.scan) width = 10 print(f'Traces scanned: {nscan}') print("{:>40s} {:>8s} {:>10s} {:>10s}".format( 'Item', 'Byte Loc', 'Min', 'Max')) for key, item in hscan.items(): print("{:>40s} {:>8d} {:>10.0f} {:>10.0f}".format( key, item[0], item[1], item[2])) iline = args.iline xline = args.xline if args.netCDF is None or args.netCDF is not False: if args.netCDF is None: outfile = input_file.stem + '.SEISNC' else: outfile = args.netCDF _ = segy_loader(input_file, ncfile=outfile, iline=iline, xline=xline, ix_crop=args.crop) LOGGER.info(f"NetCDF output written to {outfile}") if args.SEGY is None or args.SEGY is not False: if args.SEGY is None: outfile = input_file.stem + '.segy' else: outfile = args.SEGY ncdf2segy(input_file, outfile, iline=iline, xline=xline) #, crop=args.crop) LOGGER.info(f"SEGY output written to {outfile}")
def test_segyiotests_ps_2ds(segyio3dps_test_files): file, segyio_kwargs = segyio3dps_test_files ds = segy_loader(str(file), silent=True, **segyio_kwargs) assert isinstance(ds, xr.Dataset)
scrape # %% [markdown] # ## Load SEG-Y data # %% [markdown] # All SEGY (2D, 2D gathers, 3D & 3D gathers) are ingested into `xarray.Dataset` objects through the # `segy_loader` function. It is best to be explicit about the byte locations of key information but # `segy_loader` can attempt to guess the shape of your dataset. Some standard byte positions are # defined in the `well_known_bytes` function and others can be added via pull requests to the Github # repository if desired. # %% from segysak.segy import segy_loader, well_known_byte_locs V3D = segy_loader(V3D_path, iline=189, xline=193, cdpx=73, cdpy=77, vert_domain="TWT") V3D # %% [markdown] # ## Visualising data # # `xarray` objects use smart label based indexing techniques to retreive subsets of data. More # details on `xarray` techniques for *segysak* are covered in the examples, but this demonstrates # a general syntax for selecting data by label with `xarray`. Plottnig is done by `matploblib` and # `xarray` selections can be passed to normal `matplotlib.pyplot` functions. # %% fig, ax1 = plt.subplots(ncols=1, figsize=(15, 8)) iline_sel = 10093 V3D.data.transpose("twt", "iline", "xline", transpose_coords=True).sel( iline=iline_sel
def test_segyiotests_nohead_2ncdf(temp_dir, segyio_nohead_test_files): file, segyio_kwargs = segyio_nohead_test_files seisnc = temp_dir / file.with_suffix(".siesnc").name ds = segy_loader(str(file), ncfile=seisnc, silent=True, **segyio_kwargs) assert isinstance(ds, xr.Dataset)