About gprpy
gprpy is a skill for auditable ground-penetrating radar (GPR) processing with GPRPy 1.0.14. It guides data preparation, cautious interpretation, and reproducible processing for researchers working with radar profiles.
Key features
- 01Read supported MALA, Sensors & Software, and GSSI inputs
- 02Apply selected processing operations
- 03Preserve raw and intermediate arrays
- 04Record parameters, axes, and source checksums
- 05Export processing results and provenance
Use cases
- 01Process radar profiles while retaining raw amplitudes
- 02Record processing choices for reproducibility
- 03Create documented time or depth outputs
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill gprpyAfter installing, type/gprpyin Claude Code to confirm it loaded.
Bundled filesreferences/processing_steps.mdscripts/process_gpr.py
Details
From the project READMEAuditable GPR processing
GPRPy operates on arrays shaped (samples, traces). Inspect acquisition
metadata before assigning physical axes: a trace index is not distance, and a
radar vendor's SEG-Y interval field may need a documented time scale. Preserve
unknown units explicitly. Do not obtain a site velocity from a generic material
lookup and present it as measured.
Read and select operations
GPRPy 1.0.14 natively reads paired MALA .rad/.rd3, Sensors & Software
.DT1/.HD, GSSI .DZT, and its documented BSQ inputs. Native .gpr files are
Python pickle sessions, not a MALA exchange format; read only trusted sessions.
GPRPy does not natively read or export SEG-Y.
import gprpy.gprpy as gp
profile = gp.gprpyProfile()
profile.importdata('profile.rad') # requires matching profile.rd3
raw = profile.data.copy()
profile.dewow(window=64) # argument is sample count, not ns
Select operations to answer the user's question. dewow(window) and
agcGain(window) take sample counts; remMeanTrace(ntraces) takes traces.
Background subtraction may remove real continuous reflectors. Time-power gain
changes amplitude scaling and is not a calibrated attenuation correction.
Keep the raw arrays and record every applied operation. Window edge behaviour
and the effective interior support need particular care; see the
processing reference.
setVelocity(velocity) uses m/ns and computes the zero-offset constant-velocity
scenario depth = twtt * velocity / 2; it does not estimate velocity or migrate
reflectors. Resolve time zero and antenna-offset assumptions first. Retain
native two-way time alongside any assumed depth, and state which independent
measurements support velocity and its uncertainty.
Reproducible helper
The processing helper supports tested .rad/.rd3 and
.sgy/.segy routes. The latter explicitly uses segyio before real GPRPy
processing. It writes profile.npz and processing.json and reads them back;
NPZ loading uses allow_pickle=False. Outputs include raw amplitudes,
intermediate arrays, final amplitudes, original sample/trace indices, available
physical axes, source checksums, parameters and selected encoded header fields.
A new output directory prevents silent replacement of a previous result.
python scripts/process_gpr.py profile.rad --metadata sampling.json \
--output processed --dewow-samples 64
Resolve paths relative to the installed skill directory. sampling.json
contains source_note, sample_interval_ns, time_origin_ns,
trace_spacing_m, profile_origin_m, horizontal_crs and vertical_reference.
Use JSON null for unknown time or spacing; explain provenance in source_note.
Uniform physical sampling requires a finite origin and a positive interval.
Irregular positions require a separately validated geometry route; do not
replace them with a fabricated regular line.
Only supply --gain-power when nonnegative physical time is known. Only supply
--velocity-m-ns for an explicitly labelled zero-offset constant-velocity depth
scenario. Both are rejected when time calibration is unresolved. No processing
step is enabled by default. The helper fails on missing/nonfinite amplitudes,
unsupported formats, non-live SEG-Y trace flags, variable trace sampling or a
failed requested export instead of reporting partial work as success.
Other APIs and verification boundary
For plotting, use showProfile() or printProfile(...); neither accepts the
previously documented ax= export pattern. GPRPy 1.0.14 has no
bandpassFilter, exportASCII, exportSEGY or gprpyCMP API. Its CMP/WARR
class is gprpyCW; consult the installed source before using its stacked
amplitude methods. Topographic correction uses topoCorrect(topofile, delimiter=',') after a separately chosen velocity, not a velocity= keyword.
These advanced branches require their own acceptance checks.
The checked path uses fixed GPRPy source version 1.0.14, native generated MALA bytes, and one licensed observed SEG-Y line. The field line's time scaling and coordinate units remain unresolved, so only sample-index processing is claimed. Synthetic timing and impulse depth checks are separate from field accuracy. See source installation and limits for the tested commit and dependency distinction.