Skip to content

Wells and wellbores

Ophiolite never decides which well a file belongs to from its name or its coordinates. You say so, explicitly, with evidence, and everyone who may read both the wellbore and the data sees the same answer.

A well or wellbore has a name and either an external identity — the registry that names it (for example NLOG) and its identifier there — or is provisional until you know it. A provisional one can receive its external identity later; the change is recorded with your name and the time, and everything associated with it stays in place.

Like uploads, a well or wellbore is private to you until you share it with project members. People you have not shared it with do not see it at all, and nothing tells them it exists.

In the browser: Data → Wells and wellbores lists what you may open and lets you add a well or wellbore. A wellbore can name the well it is part of; say how you know (for example the completion report).

In the upload form, choose Belongs to wellbore. After the upload, the exact version you just uploaded is associated with that wellbore, with the file itself as evidence. If that step fails, the form offers to try it again without uploading the file twice.

A later version of the same data does not move the association: it stays on the exact version it was made for.

In Python:

well = client.create_entity("well", "Q08-01", authority="nlog", key="Q08-01")
bore = client.create_entity("wellbore", "Q08-01 main", provisional=True,
part_of=well, statement="Completion report")
client.of_entity(log.asset_id, log.revision, bore, statement="The LAS header names it")
for item in client.entity(bore.entity_id).assets(profile="well-tops-csv/1"):
print(item["name"], item["revision"], item["association"]["evidence"])

To learn which well or wellbore each of many files belongs to, read every association you may see at once instead of asking well by well (from 2026.10.21):

for item in client.associations(kind="wellbore", profile="las2/1"):
print(item["entity"]["name"], item["name"], item["revision"])

Each item is what entity(...).assets() returns for that well or wellbore, with the entity it belongs to; assets=[...] limits it to up to 100 files. Files and wells you may not read are left out without a count.

client.lineage(asset, revision) shows one step each way from an exact version: what it was calculated from and what was calculated from it. Anything you may not read is reported only as restricted, never by name.

Only the relationships in the registry are accepted (part-of, of-entity; calculations and new versions are recorded by Ophiolite itself). A name in place of an identifier, an unknown relationship, a second wellbore for the same exact version, or a relationship without its evidence is refused with a clear error and changes nothing.

An export includes the wells and wellbores the exported versions belong to (those you may read), their wells, and the associations with their evidence. The bundle checks every association against the registry and its own contents, and navigates offline:

from ophiolite.bundle import open_bundle
bundle = open_bundle("q08-bundle")
for asset in bundle.assets_of(bundle.entity(bore.entity_id)):
print(asset.type, asset.revision)

Bundles with wells and wellbores are version 2.4; readers of any 2.x version read their data and ignore the associations they do not know.

Map, in the project’s sidebar, draws every well you may open that a source you may read locates. The picture is drawn in your browser; no map service is contacted. Find a well by name searches the wells, and the list below the map holds the wells without a position you can read. Choose a well and Open well page.

A well page shows the well’s Wellbores and everything filed on the well or on its wellbores, in six groups: Logs, Well tops, Directional survey, Time-depth relation, Results and Other data. Each row names the wellbore it is filed on and opens that exact version; Show curves draws a log in place. Files you may not read are left out without a count. ← Back to the map returns to the view you left. Identifiers and evidence are under Technical details.

In Python, the same read in one call: a well’s own data together with its wellbores’, each item naming the well or wellbore it is filed on.

from collections import Counter
well = next(w for w in client.wells() if w.name == well_name)
items = client.entity(well.entity_id).assets(include_wellbores=True)
for item in items:
print(item["entity"]["name"], "-", item["name"], item["revision"][:12])
counts = Counter(item["entity"]["name"] for item in items)
print(dict(counts))

assets() without include_wellbores reads only what is filed on the well itself.