OpendTect GR interchange
Qualified: OpendTect Free 7.0.10, Linux x86_64, Python 3.12 with installed ODBind, NumPy and this Connectors package. This is a local adapter; Workspace does not launch or supervise OpendTect. Windows/macOS and other versions are unqualified.
Set up
Section titled “Set up”Install the official free Linux 7.0.10 release with its ODBind Python component. Create/select a survey and an existing well in OpendTect. Confirm that its stored/display depth units are metres and the input axis is measured depth (MD). Do not identify a well by matching names/coordinates automatically. Importing a GR curve does not establish well trajectory, CRS or vertical datum equivalence.
Your deployment administrator must provide the pinned pilot Connectors package; install it in your Python environment. This is not a generally available SDK. Download opendtect_application.py; commands below assume it is in a tools/ directory.
Download the unchanged public application_access.py from
application_access.py into a companion directory.
Set the following for your installation (example paths, not defaults):
export DTECT_APPL=/opt/OpendTect/7.0.0export PYTHONPATH="$DTECT_APPL/bin/python:$PWD/companion"python companion/application_access.py --credentials ./application.json login \ --url https://workspace.example --project your-project --writeFollow both browser authorization steps and compare confirmation codes. You need project membership and the chosen binding’s execution/publication permission. A binding is configuration, not permission. Retained-input bindings allow member execution and explicitly shared Results; live-source administrator bindings retain their existing download-only behavior. Use Workspace → Connections → Python access to choose the supported GR input and separate LAS output. Copy the binding ID.
Create destination.json yourself:
{ "data_root": "/data/od-surveys", "survey": "My_Survey", "well": "Chosen well", "axis_kind": "MD", "log_name": "OPHIOLITE_GR"}survey is the directory name; well is the exact existing well object name.
The adapter resolves/pins its database ID and context hashes and appends a unique
run suffix to log_name. Do not reuse the working directory for another request.
Import, edit, return
Section titled “Import, edit, return”python tools/opendtect_application.py prepare --directory ./run-1 \ --credentials ./application.json --preset ./destination.json \ --url https://workspace.example --project your-project --binding BINDING_IDpython tools/opendtect_application.py apply --directory ./run-1 --credentials ./application.jsonBetween those commands, review the printed target, precision and missing-edge loss report. Close native log editors during apply. Reopen OpendTect’s Manage Wells; select the chosen well, then the printed log name. Click the pencil to edit samples. Zero is a valid value; blank is missing. Save, confirm Save in the second dialog, and reopen to verify. Close the editor before returning.
python tools/opendtect_application.py inspect-return --directory ./run-1 --credentials ./application.json# Review the exact source-index patches, then explicitly publish:python tools/opendtect_application.py publish --directory ./run-1 --credentials ./application.jsonA separate result.las and receipt.json are downloaded. Retained-input results
appear in Workspace → Data → Results; their author can explicitly share with an
allowed project recipient. A colleague previews/downloads the same result. It is
unreviewed and does not overwrite a source or automatically update another host.
Scientific contract and limits
Section titled “Scientific contract and limits”opendtect-gr-patch/1 accepts the public ophiolite.application-curve/1 GR profile,
gAPI/API values and increasing MD metres, at most 200,000 source samples. Depths and
values become Float32 natively; collapsed depths refuse. Native API is the host’s
canonical gamma-ray unit (scale 1). Unknown units/axis interpretation refuse.
OpendTect trims missing endpoints. The adapter retains full original LAS/arrays, records the finite-ended interval’s source offset and imports interior missing values without filling/interpolating them. All-missing input refuses. On return, only edited native values replace corresponding source indices: untouched source precision, original axes/units, other curves and missing endpoints survive. The LAS NULL marker remains missing; publishing it as a real number refuses. At most 1,000 sample edits per result; resampling, unit changes, new curves and source overwrite are unsupported. Deliberate interior gap-filling is an edit, not an automatically certified scientific correction.
ODBind writes the object. Installed odpy.getLog/Well.logs resample, and the host
od_WellMan JSON serializer rounds some values. Exact readback therefore uses a
strict pinned dGB 7.0.10 binary reader (little-endian Float32 MD/value pairs,
Header info: No, Storage type: Binary). Unknown versions/header/storage variants
refuse. The shipped native CLI independently checks object identity, unit, count
and status. This small version-specific format dependency is explicit maintenance
cost, not a general OpendTect SDK. Source reference:
https://github.com/OpendTect/OpendTect/blob/od7.0/src/Well/wellreader.cc
(odReader::rdLogHdr and readLogData). Native formats are read only by our parser.
Recovery and operational boundaries
Section titled “Recovery and operational boundaries”Keep the owner-private run directory. It journals command ID, binding generation, exact input, target and native/patch hashes. Retry the same command after an interrupted request. Existing names are never intentionally overwritten. An uncertain native write is accepted only when complete readback matches the baseline; otherwise inspect it and prepare a fresh run/name. No distributed transaction is claimed: the advisory lock coordinates this adapter, not other host writers.
A native change after review blocks publication until inspected again. Lost publication responses retry the same frozen patch; server digest/idempotency checks return the same result. A new edit after publication requires another run. Re-login after credential expiry; retain the directory. Disable/revoke blocks subsequent API operations, not local access to previously downloaded files.
The run’s method/parameters and native evidence are script-declared. The server validates publication contracts, not that a human used a particular GUI or that a scientific calculation was appropriate. No automatic follow/run/publish/apply, background synchronization, Petrel/Techlog qualification or OSDU publication is implied.
Tests and demonstrated data
Section titled “Tests and demonstrated data”python -m pytest tests/test_opendtect.py tests/test_opendtect_application.py checks
precision/null/offset mapping, fail-closed native parsing, collision prevention,
resampling refusal, patch limit, interrupted-write recovery and lost publication
responses. Actual-host evidence is in Integration’s
docs/verification/stage3b-opendtect.md: synthetic zero/null and NLOG HON-GT-01,
actual GUI edits saved/reopened, separate publication and colleague consumption.
Additional native limits
Section titled “Additional native limits”Boundary samples changed to missing may be trimmed by OpendTect and are refused. ASCII/Swapped storage and extra native headers are unsupported. A changed survey/well context requires a new run after explicit inspection; existing journals are retained. Native file permissions follow the caller’s environment; run artifacts are private. Shared filesystem groups must be configured by the customer; cross-OS-user native collaboration has not been qualified.
