From 0cbc6823dd49506039e5e27fa0c343e5653f9427 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 6 Feb 2026 19:36:07 +0000 Subject: [PATCH] Several fixes and tests of the 3 segY modules. --- src/psbasemap.jl | 4 +- src/segy/segy.jl | 104 ++++++++++++++++--------------------------- src/segy/segy2grd.jl | 41 +++++++---------- test/runtests.jl | 5 +++ 4 files changed, 62 insertions(+), 92 deletions(-) diff --git a/src/psbasemap.jl b/src/psbasemap.jl index 7cfed6a3f..a10df7d13 100644 --- a/src/psbasemap.jl +++ b/src/psbasemap.jl @@ -44,8 +44,8 @@ To see the full documentation type: ``@? basemap`` """ basemap(; first=true, kwargs...) = helper_basemap(; first=first, kwargs...) basemap!(; kwargs...) = helper_basemap(; first=false, kwargs...) -function helper_basemap(; first=true, kw...) - d, K, O = init_module(first, kw...) # Also checks if the user wants ONLY the HELP mode +function helper_basemap(; first=first, kw...) + d, K, O = init_module(first==1, kw...) # Also checks if the user wants ONLY the HELP mode helper_basemap(O, K, d) end diff --git a/src/segy/segy.jl b/src/segy/segy.jl index d22bd25b1..cd0aa54ab 100644 --- a/src/segy/segy.jl +++ b/src/segy/segy.jl @@ -1,17 +1,21 @@ """ - segy(cmd0::String="", arg1=nothing; kwargs...) + segy(cmd0::String=""; kwargs...) Plot a SEGY file as a seismic data image. """ -segy(cmd0::String=""; kwargs...) = segy_helper(cmd0, nothing; kwargs...) -segy(arg1; kwargs...) = segy_helper("", arg1; kwargs...) +segy!(cmd0::String; kwargs...) = segy_helper(cmd0; first=false, kwargs...) +function segy(cmd0::String; first=true, kw...) + #(cmd0 === "") && error("Missing input segY file name to run this module.") + d, K, O = init_module(first==1, kw...) # Also checks if the user wants ONLY the HELP mode + segy_helper(cmd0, O, K, d) +end # --------------------------------------------------------------------------------------------------- -function segy_helper(cmd0::String, arg1; first=true, kwargs...) - d, K, O = init_module(first, kwargs...) +function segy_helper(cmd0::String, O::Bool, K::Bool, d::Dict{Symbol, Any}) - cmd, _, _, opt_R = parse_BJR(d, "", "", O, "") - cmd, = parse_common_opts(d, cmd, [:V_params :UVXY :p :t :params], first) + cmd = ((IamModern[]) ? "segy " : "pssegy ") * cmd0 + cmd = parse_BJR(d, cmd, "", O, "")[1] + cmd = parse_common_opts(d, cmd, [:V_params :UVXY :p :t :params]; first=!O)[1] cmd = segy_common(d, cmd) # -E error tolerance (segy only) @@ -34,27 +38,30 @@ function segy_helper(cmd0::String, arg1; first=true, kwargs...) # -T trace list file (segy only) cmd = add_opt(d, cmd, "T", [:T :tracelist :tracefile]) - (cmd0 != "") && (cmd *= " " * cmd0) - - cmd = "segy " * cmd + ((r = check_dbg_print_cmd(d, cmd)) !== nothing) && return r + !isfile(cmd0) && error("segY file $cmd0 does not exist.") # Testing here only allows pass a Vd=2 for test parsing finish_PS_module(d, cmd, "", K, O, true) end # --------------------------------------------------------------------------------------------------- """ - segyz(cmd0::String="", arg1=nothing; kwargs...) + segyz(cmd0::String=""; kwargs...) Plot a SEGY file in 3-D as a seismic data image. """ -segyz(cmd0::String=""; kwargs...) = segyz_helper(cmd0, nothing; kwargs...) -segyz(arg1; kwargs...) = segyz_helper("", arg1; kwargs...) +segyz!(cmd0::String; kwargs...) = segyz_helper(cmd0; first=false, kwargs...) +function segyz(cmd0::String; first=true, kw...) + d, K, O = init_module(first==1, kw...) # Also checks if the user wants ONLY the HELP mode + segyz_helper(cmd0, O, K, d) +end # --------------------------------------------------------------------------------------------------- -function segyz_helper(cmd0::String, arg1; first=true, kwargs...) - d, K, O = init_module(first, kwargs...) +function segyz_helper(cmd0::String, O::Bool, K::Bool, d::Dict{Symbol, Any}) - cmd, _, _, opt_R = parse_BJR(d, "", "", O, "") - cmd = parse_common_opts(d, cmd, [:Jz :V_params :UVXY :p :t :params], first)[1] + cmd = ((IamModern[]) ? "segyz " : "pssegyz ") * cmd0 + cmd = parse_BJR(d, "", "", O, "")[1] + cmd = parse_common_opts(d, cmd, [:V_params :UVXY :p :t :params], first=!O)[1] + cmd, opt_JZ = parse_JZ(d, cmd, O=O, is3D=true) cmd = segy_common(d, cmd) # -S trace location header (segyz: header_x/header_y) @@ -80,68 +87,35 @@ function segyz_helper(cmd0::String, arg1; first=true, kwargs...) end end - (cmd0 != "") && (cmd *= " " * cmd0) - - cmd = "segyz " * cmd + ((r = check_dbg_print_cmd(d, cmd)) !== nothing) && return r + !isfile(cmd0) && error("segY file $cmd0 does not exist.") # Testing here only allows pass a Vd=2 for test parsing finish_PS_module(d, cmd, "", K, O, true) end # --------------------------------------------------------------------------------------------------- # Shared options between segy and segyz function segy_common(d::Dict, cmd::String) - # -D deviation (required) - cmd = add_opt(d, cmd, "D", [:D :dev :deviation]) - - # -F fill color - if ((val = find_in_dict(d, [:F :fill :color])[1]) !== nothing) - if isa(val, Bool) && val - cmd *= " -F" - else - cmd *= " -F" * arg2str(val) - end - end - # -W wiggle trace - cmd = parse_these_opts(cmd, d, [[:W :wiggle]]) + ((s = hlp_desnany_str(d, [:F :fill :color])) !== "") && (cmd *= " -F" * s) # -F fill color - # -A byte swap - cmd = parse_these_opts(cmd, d, [[:A :byteswap :swap]]) + cmd = parse_these_opts(cmd, d, [[:A :byteswap :swap], [:C :clip], [:D :dev :deviation], [:I :negative :fillneg], + [:L :nsamp :nsamples], [:M :ntraces], [:N :normalize :norm], [:W :wiggle], [:Z :skipzero :nozero]]) + !contains(cmd, " -D") && error("Option 'D' or 'dev' or 'deviation' is required") + !contains(cmd, " -F") && !contains(cmd, " -W") && (cmd *= " -W") - # -C clip - cmd = add_opt(d, cmd, "C", [:C :clip]) - - # -I fill negative - cmd = parse_these_opts(cmd, d, [[:I :negative :fillneg]]) - - # -L samples per trace - cmd = add_opt(d, cmd, "L", [:L :nsamp :nsamples]) - - # -M number of traces - cmd = add_opt(d, cmd, "M", [:M :ntraces]) - - # -N normalize - cmd = parse_these_opts(cmd, d, [[:N :normalize :norm]]) - - # -Q adjustments - if ((val = find_in_dict(d, [:Q :adjust])[1]) !== nothing) + if ((val = find_in_dict(d, [:Q :adjust])[1]) !== nothing) # -Q adjustments if isa(val, NamedTuple) - haskey(val, :bias) && (cmd *= " -Qb" * string(val.bias)) - haskey(val, :b) && (cmd *= " -Qb" * string(val.b)) - haskey(val, :dpi) && (cmd *= " -Qi" * string(val.dpi)) - haskey(val, :i) && (cmd *= " -Qi" * string(val.i)) - haskey(val, :redvel) && (cmd *= " -Qu" * string(val.redvel)) - haskey(val, :u) && (cmd *= " -Qu" * string(val.u)) - haskey(val, :xmult) && (cmd *= " -Qx" * string(val.xmult)) - haskey(val, :x) && (cmd *= " -Qx" * string(val.x)) - haskey(val, :dy) && (cmd *= " -Qy" * string(val.dy)) - haskey(val, :y) && (cmd *= " -Qy" * string(val.y)) + for key = keys(val) + key in (:b, :bias) && (cmd *= " -Qb" * string(val[key])) + key in (:i, :dpi) && (cmd *= " -Qi" * string(val[key])) + key in (:u, :redvel) && (cmd *= " -Qu" * string(val[key])) + key in (:x, :xmult) && (cmd *= " -Qx" * string(val[key])) + key in (:y, :dy) && (cmd *= " -Qy" * string(val[key])) + end else cmd *= " -Q" * arg2str(val) end end - # -Z skip zero rms - cmd = parse_these_opts(cmd, d, [[:Z :skipzero :nozero]]) - return cmd end diff --git a/src/segy/segy2grd.jl b/src/segy/segy2grd.jl index 0cc786303..4a6ee818f 100644 --- a/src/segy/segy2grd.jl +++ b/src/segy/segy2grd.jl @@ -1,20 +1,20 @@ """ - segy2grd(cmd0::String="", arg1=nothing; kwargs...) + segy2grd(cmd0::String=""; kwargs...) Create a grid file from an ideographic SEGY file. """ -segy2grd(cmd0::String=""; kwargs...) = segy2grd_helper(cmd0, nothing; kwargs...) -segy2grd(arg1; kwargs...) = segy2grd_helper("", arg1; kwargs...) +function segy2grd(cmd0::String; kwargs...) + d = init_module(false, kwargs...)[1] + segy2grd_helper(cmd0, d) +end # --------------------------------------------------------------------------------------------------- -function segy2grd_helper(cmd0::String, arg1; kwargs...) - d = init_module(false, kwargs...)[1] +function segy2grd_helper(cmd0::String, d::Dict{Symbol, Any}) cmd, opt_R = parse_R(d, "")[1:2] + (opt_R === "") && error("Missing R or region option.") cmd = parse_common_opts(d, cmd, [:I :V_params :bi :di :r :yx])[1] - - # -G output grid (required) - cmd = add_opt(d, cmd, "G", [:G :outgrid :save]) + !contains(cmd, " -I") && error("Option 'I' or 'inc' is required") # -A add up or count if ((val = find_in_dict(d, [:A :add :count])[1]) !== nothing) @@ -29,22 +29,14 @@ function segy2grd_helper(cmd0::String, arg1; kwargs...) end end - # -D grid metadata - cmd = add_opt(d, cmd, "D", [:D :metadata :header]) + cmd = parse_these_opts(cmd, d, [[:D :metadata :header], [:G :outgrid :save], [:L :nsamp :nsamples], [:M :ntrace]]) - # -L number of samples - cmd = add_opt(d, cmd, "L", [:L :nsamp :nsamples]) - - # -M number of traces - cmd = add_opt(d, cmd, "M", [:M :ntraces]) - - # -Q scale or sample interval - if ((val = find_in_dict(d, [:Q :adjust])[1]) !== nothing) + if ((val = find_in_dict(d, [:Q :adjust])[1]) !== nothing) # -Q scale or sample interval if isa(val, NamedTuple) - haskey(val, :x) && (cmd *= " -Qx" * string(val.x)) - haskey(val, :xscale) && (cmd *= " -Qx" * string(val.xscale)) - haskey(val, :y) && (cmd *= " -Qy" * string(val.y)) - haskey(val, :sint) && (cmd *= " -Qy" * string(val.sint)) + for key = keys(val) + key in (:x, :xscale) && (cmd *= " -Qx" * string(val[key])) + key in (:y, :sint) && (cmd *= " -Qy" * string(val[key])) + end else cmd *= " -Q" * arg2str(val) end @@ -64,9 +56,8 @@ function segy2grd_helper(cmd0::String, arg1; kwargs...) end end - (cmd0 != "") && (cmd *= " " * cmd0) - - cmd = "segy2grd " * cmd + cmd = "segy2grd " * cmd0 * cmd ((r = check_dbg_print_cmd(d, cmd)) !== nothing) && return r + !isfile(cmd0) && error("segY file $cmd0 does not exist.") # Testing here only allows pass a Vd=2 for test parsing gmt(cmd, arg1) end diff --git a/test/runtests.jl b/test/runtests.jl index 2c4d0fb50..c608218b9 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -131,6 +131,11 @@ using InteractiveUtils sac("$(TESTSDIR)/assets/ntkl.z $(TESTSDIR)/assets/onkl.z", J="X15c/4c", R="-300/1100/22/27", B="x100 y1", E=:d, M=1.5, T="+t1", Vd=dbg2) sac!("$(TESTSDIR)/assets/ntkl.z $(TESTSDIR)/assets/onkl.z", J="X15c/4c", R="-300/1100/22/27", B="x100 y1", E="d", M=1.5, T=(mark=1,), C=(-100,500), fill=(negative=true, color=:blue), F="r", Vd=dbg2) + println(" SEGY") + segy("", R="-35/6/0/30", J="x0.15i/-0.15i", D=0.35, C=8.0, F=:green, Q=(b=-1.2, x=0.1, y=0.1), S=:c, W=true, Vd=2); + segyz("", R="-35/6/0/30/0/30", J="x0.15i/-0.15i", Jz="-0.15i", p=(175,5), D=0.35, C=8.0, F=:green, Q=(b=-1.2,), S="c/5", W=true, Vd=2); + segy2grd("", R="-35/6/0/30", I=0.1, Vd=2); + #G = gmt("grdmath -R-15/15/-15/15 -I1 X Y HYPOT DUP 2 MUL PI MUL 8 DIV COS EXCH NEG 10 DIV EXP MUL ="); #D = grd2xyz(G); #gmtwrite("lixo.gmt", D);