Skip to content

Well tops, trajectories and horizon grids

Besides LAS well logs you can upload three more kinds of scientific data. Each keeps its exact original bytes, becomes an exact version you can share and revoke like a LAS original, and reads the same way in Workspace, in Python and offline.

Type File What is kept
Well tops CSV with columns name, md and optionally tvd, source names, measured depths, provided vertical depths, pick sources, file order (repeated names allowed)
Deviation survey CSV with columns md, inclination, azimuth and optionally tvd; measured depth must increase every station; empty angles stay missing
Triangulated surface Ophiolite mesh text: # ophiolite-mesh 1, optional attributes a b, vertices rows x y z [values] (- for missing) and triangles rows of three vertex numbers from 0 every vertex and triangle in file order; missing values stay missing; only triangle references are checked (coincident or thin triangles are kept)
Point set CSV with x, y, optionally z, and up to 16 numeric columns every point in file order; empty cells stay missing
Horizon grid ESRI ASCII grid (ncols, nrows, corner or centre origin, cellsize, optional NODATA_value) up to 512 × 512 cells every cell in file order, first row north; NODATA cells stay missing; zero stays zero

Nothing is converted, sorted, filled or interpolated. A file that cannot be read exactly is refused with the reason.

In Workspace open Connect → Add a data source → Upload, choose the Type of data and the file, then declare what the file itself does not say: depth unit, whether the tops use the same depth reference as their well log, the azimuth reference of a survey, and for a grid its coordinate system (an EPSG code), value meaning, unit, positive direction and vertical datum. Anything you leave empty stays Not stated; nothing is guessed.

Tops and surveys can belong to a well log: choose one of the uploaded LAS logs you can open. The link is to that exact log version and is never inferred from a well name. A colleague who can open the tops but not the log sees “A well log you cannot open” and no identifier.

  • Tops show as a table. When you open the associated well log, Show tops draws them on the log tracks — only if the uploader stated the same depth reference and the depth units match. Otherwise the reason is shown and nothing is drawn.
  • Surveys show every station. Calculate vertical depth (minimum curvature) adds clearly labelled calculated columns: change in vertical depth, north and east from the first station, along the declared azimuth reference. A station without angles refuses the calculation. A vertical depth provided in the file is never replaced.
  • Horizon grids show as a map (north up, missing cells grey) with the value, cell centre and row/column under the pointer or the arrow keys.
from ophiolite import Client
client = Client.from_configuration("configuration.json")
tops = client.read_data(asset_id, revision) # WellTops, Trajectory or GridSurface
tops.to_frame() # pandas extra; missing values stay missing
grid = client.read_data(grid_id, grid_revision)
grid.to_numpy() # NaN only where the file had NODATA
grid.cell_center(row, column) # row 0 is the northmost row
survey.minimum_curvature() # explicit calculation, relative to the first station

ophiolite read-data --asset … --revision … --output folder saves the exact original, data.json and descriptor.json.

client.export([(log_id, log_rev, ["GR"]), (tops_id, tops_rev, None), …], "folder") writes a portable bundle. With any tops, survey or grid in it the bundle is version 2.0; a curve-only export stays 1.0 so earlier readers keep working. Readers from before this release refuse a 2.0 bundle rather than misreading it. See Take exact curves with you.

Triangulated surfaces and point sets are drawn in plan view with north at the top. A surface’s vertex readout moves with the arrow keys; point sets show a table. Extra value columns keep the names you wrote; their units are not declared yet and are shown as such. Everything stays within the deployment’s upload limit (8 MiB by default), which usually binds before the 200,000-vertex or 100,000-point limits. In Python, read_data returns TriangulatedSurface (to_numpy() gives vertices and triangles) or PointSet; bundles that contain them are version 2.2 (older readers refuse them rather than misread them).

No OpendTect marker or horizon files, shapefiles, GeoTIFF horizons, coordinate transformation, TVD-indexed log tracks or calculations on these types. OSDU/Energistics names are declared for orientation only (contracts typed-standards.json); no import or export to those standards exists. Public NLOG tops and surveys are not bundled: their redistribution rights were not established.