Loading...
Loading...
Create, visualize, and analyze lithological and stratigraphic logs for well data. Use when Claude needs to: (1) Create lithology columns from depth intervals, (2) Parse geological descriptions into structured logs, (3) Visualize stratigraphic columns with patterns and colors, (4) Perform well-to-well correlations, (5) Extract statistics like net-to-gross ratios, (6) Define rock type lexicons and legends, (7) Export lithology data to CSV/LAS/JSON.
npx skill4agent add steadfastasart/geoscience-skills striplogfrom striplog import Striplog, Interval, Component
# Create from intervals
intervals = [
Interval(top=0, base=10, components=[Component({'lithology': 'sandstone'})]),
Interval(top=10, base=25, components=[Component({'lithology': 'shale'})]),
Interval(top=25, base=40, components=[Component({'lithology': 'limestone'})]),
]
strip = Striplog(intervals)
# Load from file
strip = Striplog.from_csv('lithology.csv') # Columns: top, base, lithology
# Access and display
print(strip)
strip.plot()
df = strip.to_dataframe()| Class | Purpose |
|---|---|
| Main log container - holds intervals |
| Depth interval with top, base, and components |
| Rock type definition with properties |
| Rock type dictionary with synonyms |
| Visualization styles (colors, patterns) |
# CSV format: top,base,lithology
strip = Striplog.from_csv('lithology.csv')
strip.plot()from striplog import Striplog, Lexicon
description = """
0.0 - 5.5 m: Fine to medium sandstone
5.5 - 12.0 m: Grey shale with silt laminations
12.0 - 18.5 m: Massive limestone, fossiliferous
"""
strip = Striplog.from_description(description, lexicon=lexicon)# Get interval at depth
interval = strip.read_at(z=15)
print(interval.primary.lithology)
# Crop to depth range
subset = strip.crop((10, 30))
# Unique lithologies
lithologies = strip.unique('lithology')# Net-to-gross for specific lithology
ntg = strip.net_to_gross(pattern={'lithology': 'sandstone'})
print(f"Sandstone: {ntg * 100:.1f}%")
# Merge adjacent same-lithology intervals
merged = strip.merge_neighbours()import matplotlib.pyplot as plt
wells = [Striplog.from_csv(f'well{i}.csv') for i in range(1, 4)]
fig, axes = plt.subplots(1, 3, figsize=(10, 8), sharey=True)
for ax, well, name in zip(axes, wells, ['Well 1', 'Well 2', 'Well 3']):
well.plot(ax=ax, legend=legend)
ax.set_title(name)
plt.tight_layout()
plt.savefig('correlation.png')strip.to_csv('output.csv')
strip.to_las('output.las')
strip.to_json('output.json')
df = strip.to_dataframe()| Pattern | Code | Typical Use |
|---|---|---|
| Dots | | Sandstone |
| Dashes | | Shale |
| Plus | | Limestone |
| X | | Dolomite |
| V | | Volcanic |
| Tool | Best For |
|---|---|
| striplog | Structured lithology logs, interval-based data, NTG, correlation |
| welly | Well log curves (continuous data), multi-well projects |
| custom matplotlib | Simple one-off stratigraphic columns without interval logic |
- [ ] Prepare CSV with columns: top, base, lithology (optionally color)
- [ ] Load with `Striplog.from_csv('lithology.csv')`
- [ ] Define Legend with colors and hatch patterns for each lithology
- [ ] Verify intervals: check for gaps or overlaps
- [ ] Merge adjacent same-lithology intervals with `merge_neighbours()`
- [ ] Compute statistics: `net_to_gross()`, `unique()`
- [ ] Plot with legend and export to desired format| Issue | Solution |
|---|---|
| Text not parsing | Define a Lexicon with synonyms |
| Wrong colors | Create custom Legend with Decor objects |
| Gaps in log | Check interval top/base values match |
| Plot looks wrong | Verify depth direction (increasing down) |