Concepts¶
Dataset layer¶
WellDataset is the normalized data container.
It can hold:
- scalar channels
- array channels
- raster channels
Every channel must carry explicit axis information and units. The renderer should not guess whether a channel is depth-based, time-based, metric, or imperial.
Typical dataset operations:
- ingest from LAS / DLIS
- add computed channels from
numpy/pandas - validate channel shapes and axes
- sort indices
- convert index units
- reindex to another basis
- merge datasets with explicit collision policies
Composition layer¶
Layout composition is separate from data ingestion.
Main composition objects:
LogBuilderProgrammaticLogSpecLogDocument- sections
- tracks
- bindings
- report pages (
heading,remarks,tail)
This separation is deliberate: research code should not need to care about page geometry until the point of composition.
Track types¶
Current track families:
referencenormalarrayannotation
They have different responsibilities:
referencedefines the layout axis and can host overlay curves/eventsnormalhosts scalar curves and fillsarrayhosts raster/VDL-style displaysannotationhosts intervals, text, markers, arrows, and glyphs
Rendering layer¶
The render layer supports both report-style and notebook-style outputs.
Available scopes:
- full report
- section
- track
- depth/time window
- PNG / SVG bytes for notebooks
Serialization¶
YAML remains a first-class saved format.
Important rule:
- YAML serializes layout/report structure
- in-memory dataset contents remain separate Python objects unless they originate from file-backed section sources