Skip to content

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.

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):

Terminal window
export DTECT_APPL=/opt/OpendTect/7.0.0
export PYTHONPATH="$DTECT_APPL/bin/python:$PWD/companion"
python companion/application_access.py --credentials ./application.json login \
--url https://workspace.example --project your-project --write

Follow 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.

Terminal window
python tools/opendtect_application.py prepare --directory ./run-1 \
--credentials ./application.json --preset ./destination.json \
--url https://workspace.example --project your-project --binding BINDING_ID
python tools/opendtect_application.py apply --directory ./run-1 --credentials ./application.json

Between 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.

Terminal window
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.json

A 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.

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.

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.

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.

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.