---
title: "HTEM Survey Overview"
description: "Helicopter electromagnetic mapping of subsurface aquifer structure across 6 stratigraphic units"
code-fold: true
---
::: {.callout-tip icon=false}
## For Newcomers
**You will get:**
- An intuitive picture of how we can **“see” underground** without drilling.
- A first look at the main aquifer (a buried sand-and-gravel valley).
- A sense of what HTEM can and cannot tell us about water.
**You do not need to understand every line of code.**
- You can skim the code blocks and focus on the explanations and figures.
- This chapter is about the **story** of the subsurface; code shows how we generated the maps.
:::
## What You Will Learn in This Chapter
By the end of this chapter, you will be able to:
- Explain, in plain language, how helicopter-borne time-domain EM surveys provide a “picture” of the subsurface.
- Describe the six stratigraphic units (A–F) and why Unit D is the primary aquifer.
- Interpret basic HTEM-derived products: material type grids, spatial coverage maps, and multi-unit resistivity comparisons.
- Understand the main strengths and limitations of HTEM data, and why it must be calibrated with wells in later chapters.
## Seeing Through the Earth
Imagine trying to find water underground without digging a single well. Impossible? Not anymore. **Helicopter-borne Time-Domain Electromagnetic (HTEM) surveys** use geophysics to "see" through hundreds of meters of earth, revealing the buried architecture of aquifer systems.
This chapter explores the HTEM survey conducted over Champaign County, Illinois—tens of millions of electromagnetic measurements that map resistivity variations across **6 stratigraphic units** from surface to bedrock. This is our **spatial foundation**—the most comprehensive view of aquifer structure ever assembled for this region.
::: {.callout-note icon=false}
## 🌊 What the Survey Reveals
- **Spatial coverage**: ~2,300 km² of continuous mapping over the Champaign County region (see the data dictionary for exact extents)
- **Depth range**: Surface to ~200 m (bedrock and beyond)
- **Resolution**: ~100 m horizontal, variable vertical (5–20 m)
- **Stratigraphic units**: 6 layers (A-F) representing different geological formations
- **Material types**: 105 distinct resistivity-based material classifications
- **Primary aquifer**: Unit D (12-96m depth, high resistivity sand/gravel)
:::
---
## Part 1: The HTEM Survey Method
### How It Works
**The Flying Sensor:**
- Helicopter tows electromagnetic transmitter/receiver loop
- Transmitter sends pulsed electromagnetic field into ground
- Ground materials induce secondary electromagnetic fields
- Receiver measures decay time and amplitude
- **Resistivity = how fast the field decays**
**Physics principle:**
- **Clay/silt**: Conductive (low resistivity, ~5-35 Ω·m) → Fast decay
- **Sand/gravel**: Resistive (high resistivity, ~50-500 Ω·m) → Slow decay
- **Bedrock**: Very resistive (high resistivity, ~100-1000 Ω·m) → Very slow decay
**Why this matters for water:**
- **High resistivity = coarse sediments (sand/gravel) = good aquifer**
- **Low resistivity = fine sediments (clay/silt) = confining layer**
::: {.callout-tip icon=false}
## 🌍 For Hydrologists
**HTEM vs. Traditional Methods:**
**Traditional aquifer mapping:**
- Drill test boreholes every 1-5 km ($50K-$200K each)
- Interpolate between sparse points
- Miss critical features between boreholes
- Slow (years to complete regional survey)
**HTEM mapping:**
- Continuous spatial coverage (no interpolation gaps)
- Survey entire county in weeks
- Cost-effective for regional scale ($100-$500/km²)
- Non-invasive (no drilling)
**Trade-off**: HTEM is **indirect** (measures resistivity, infers lithology) vs. drilling is **direct** (see actual materials). Best approach: **Calibrate HTEM with wells**, then extrapolate everywhere.
:::
---
## Part 2: The 6 Stratigraphic Units
The subsurface beneath Champaign County is not a uniform mass of earth—it consists of distinct **stratigraphic layers** deposited over millions of years. The HTEM survey divides this into 6 units (A through F), each with different geological origins, depths, and water-bearing potential.
The code below initializes our data loader and prepares the HTEM grids for visualization. You don't need to understand the code details—focus on the table and figures that follow.
```{python}
import os
import sys
from pathlib import Path
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Setup paths
def find_repo_root(start: Path) -> Path:
for candidate in [start, *start.parents]:
if (candidate / "src").exists():
return candidate
return start
quarto_project = Path(os.environ.get("QUARTO_PROJECT_DIR", str(Path.cwd())))
project_root = find_repo_root(quarto_project)
if str(project_root) not in sys.path:
sys.path.append(str(project_root))
from src.data_loaders.htem_loader import HTEMLoader
from src.utils import get_data_path
# Initialize loader
htem_path = get_data_path("htem_root")
loader = HTEMLoader(data_root=htem_path)
print("✓ HTEM data loader initialized")
# The code below loads HTEM data for the main aquifer units
# and prepares maps/plots shown in this chapter.
```
### Unit Characteristics
::: {.callout-note icon=false}
## 📘 Interpreting Stratigraphic Units
**What Are They?**
Stratigraphic units are distinct layers of rock or sediment deposited during different geological periods. The concept dates to Nicolas Steno's "law of superposition" (1669): deeper layers are older, upper layers are younger.
**Why Do They Matter?**
Each unit has different water-bearing properties:
- **Depth**: Shallow units easier to access but more vulnerable
- **Material**: Sand/gravel = good aquifer; clay = confining layer
- **Thickness**: Thicker units store more water
**How to Read the Unit Table:**
| Column | What It Shows | Why It Matters |
|--------|--------------|----------------|
| **Typical Depth** | Burial depth range | Determines drilling costs, accessibility |
| **Typical Resistivity** | Electrical property | High = sand/gravel; Low = clay |
| **Water Significance** | Aquifer quality | Guides where to focus analysis |
**Key Insight:** Unit D is the star—shallow enough to access (12-96m), thick enough to store water, high resistivity (sand/gravel), and extensive across the region.
:::
The subsurface is divided into **6 stratigraphic units** (A through F), each representing different geological formations:
```{python}
# Unit descriptions and depth ranges
units_info = pd.DataFrame({
'Unit': ['A', 'B', 'C', 'D', 'E', 'F'],
'Name': [
'Deep Bedrock',
'Transition Zone',
'Upper Bedrock',
'Primary Aquifer (Mahomet)',
'Clay-rich Quaternary',
'Mixed Surface Materials'
],
'Typical_Depth_Range_m': [
'180-194',
'108-168',
'124-166',
'12-96',
'0-30',
'0-20'
],
'Typical_Resistivity': [
'~48.7 Ω·m (bedrock)',
'Variable (mixed)',
'~50-200 Ω·m (limestone)',
'~128.3 Ω·m (sand/gravel)',
'~10-30 Ω·m (clay/till)',
'~20-80 Ω·m (mixed)'
],
'Water_Significance': [
'Low (deep, bedrock)',
'Moderate (confining?)',
'Low to moderate',
'⭐ PRIMARY AQUIFER',
'Confining layer',
'Surface drainage'
]
})
units_info
```
**Key insight**: **Unit D** is the star of the show—the **Mahomet Aquifer**, a buried sand and gravel valley that provides most of the region's groundwater. All subsequent analyses focus heavily on Unit D.
---
## Part 3: 2D Grid Analysis
::: {.callout-note icon=false}
## Reading the Code in This Chapter
The code blocks:
- Load HTEM data for the six subsurface units.
- Build grids and visualizations of underground materials.
- Drive the maps and figures you see in the text.
You do **not** need to follow every line of code. Focus on what the figures reveal about:
- Where the main aquifer (Unit D) is,
- How thick it is,
- And how it relates to surrounding layers.
:::
### Loading the 2D Grids
::: {.callout-note icon=false}
## 📘 Context: Working with HTEM Grids
**What Are 2D Grids?**
HTEM surveys produce gridded data—resistivity values at regular intervals (like pixels in an image). Each "grid file" represents one stratigraphic unit with X,Y coordinates and resistivity/material type values.
**Why Load Grids This Way?**
The code below demonstrates data access patterns:
- **Discovery**: Find available grid files (which units exist?)
- **Loading**: Read specific unit data into memory
- **Inspection**: Check data dimensions and coverage
**What You'll See:** The output shows grid file names (like "Unit_D_Preferred_MT.txt") and summary statistics. This confirms data exists and is readable before detailed analysis.
:::
```{python}
# Get available files
available = loader.get_available_files()
grid_files = available['material_types']
print(f"📁 Found {len(grid_files)} material type grid files")
print("\nSample files:")
for f in grid_files[:5]:
print(f" • {f}")
```
### Analyzing Unit D: The Primary Aquifer
::: {.callout-note icon=false}
## 📘 Interpreting Grid Summary Statistics
**What Do These Numbers Mean?**
The statistics below quantify the HTEM survey's scope for Unit D.
**How to Interpret:**
| Statistic | What It Tells You | Management Insight |
|-----------|------------------|-------------------|
| **Total grid cells** | Data point density | More cells = finer resolution mapping |
| **X/Y range** | Geographic extent (meters) | Covers ~40km × 50km region |
| **Z (elevation) range** | Vertical span | Shows aquifer burial depth variation |
**Expected Pattern:** Hundreds of thousands of grid cells across tens of kilometers indicates comprehensive regional mapping—far superior to sparse well networks (3 points).
:::
```{python}
# Load Unit D preferred grid
unit_d_grid = loader.load_material_type_grid('D', 'Preferred')
print(f"\n🗺️ Unit D Grid Summary:")
print(f" • Total grid cells: {len(unit_d_grid):,}")
print(f" • X (Easting) range: {unit_d_grid['X'].min():.0f} - {unit_d_grid['X'].max():.0f} m")
print(f" • Y (Northing) range: {unit_d_grid['Y'].min():.0f} - {unit_d_grid['Y'].max():.0f} m")
print(f" • Z (Elevation) range: {unit_d_grid['Z'].min():.1f} - {unit_d_grid['Z'].max():.1f} m")
unit_d_grid.head()
```
### Material Type Distribution
#### What Are Material Types?
Material types are numerical classifications (1-105) that translate continuous resistivity measurements into discrete geological categories. This classification system was developed by combining HTEM geophysical data with borehole lithology logs, creating a standardized way to describe subsurface materials across the entire survey area.
#### Why Does Material Type Classification Matter?
Material type classification bridges the gap between geophysics and hydrogeology:
- **For geophysicists**: Provides interpretable categories from resistivity inversions
- **For hydrogeologists**: Enables prediction of water-bearing capacity without drilling
- **For water managers**: Supports well-siting decisions and aquifer vulnerability assessments
#### How to Interpret Material Types
| Material Type Range | Description | Resistivity | Aquifer Quality | Water Management Implication |
|---------------------|-------------|-------------|-----------------|------------------------------|
| 1-4 | Clay to silty clay | 5-25 Ω·m | Poor (confining) | Protects aquifer from contamination |
| 5-8 | Silt to fine sand | 25-60 Ω·m | Low to moderate | Limited well yields |
| 9-11 | Fine to medium sand | 60-120 Ω·m | Good | Typical productive aquifer |
| **11-14** | **Well-sorted sand/gravel** | **120-500 Ω·m** | **Excellent** | **High-yield well targets** |
| 101-105 | Bedrock/carbonate | Variable | Variable | May have fracture flow |
#### What Will You See in the Visualization?
The bar chart below shows the frequency of each material type in Unit D. Look for:
- **Dominant material types**: Which types cover the most area?
- **High-quality indicators**: Do types 11-14 appear frequently (good news for water supply)?
- **Heterogeneity**: Is there one dominant type or a mix (affects aquifer behavior)?
```{python}
#| label: fig-htem-material-types
#| fig-cap: "Top 10 material types in Unit D (primary aquifer). Higher material type codes generally indicate coarser, more permeable sediments suitable for groundwater extraction."
# Analyze material types in Unit D
material_counts = unit_d_grid['MT_Index'].value_counts().head(10)
fig = go.Figure(data=[
go.Bar(
x=material_counts.values,
y=material_counts.index.astype(str),
orientation='h',
marker=dict(
color=material_counts.values,
colorscale='Viridis',
showscale=True,
colorbar=dict(title="Count")
),
hovertemplate='Material Type: %{y}<br>Count: %{x:,}<extra></extra>'
)
])
fig.update_layout(
title='Top 10 Material Types in Unit D (Primary Aquifer)',
xaxis_title='Number of Grid Cells',
yaxis_title='Material Type Code',
height=500,
template='plotly_white'
)
fig.show()
```
**Interpreting the bar chart:**
The distribution of material types tells us about aquifer quality. If the most common types are in the range 9-14 (medium sand to well-sorted gravel), Unit D has excellent water-bearing potential. If lower types (1-5) dominate, the unit would be clay-rich and poor for water supply.
In a healthy aquifer system, you want to see a mix—some high-quality sand/gravel for water production, and some clay for protective confining layers above.
::: {.callout-note icon=false}
## 💻 For Computer Scientists
**Material Type Classification:**
HTEM resistivity values are **binned** into 105 discrete material types using a lookup table:
- **1-14**: Quaternary sediments (clay → extremely well sorted sands)
- **101-105**: Carboniferous bedrock and carbonates
**Why discrete classes?**
- Geologists think in **lithology** (clay, sand, gravel), not resistivity (Ω·m)
- Classification enables **semantic search** ("find all gravel zones")
- Simplifies **machine learning targets** (classification vs. regression)
**Data structure:**
```python
# Raw HTEM output
resistivity: float # Continuous (0-1000 Ω·m)
# After classification
material_type: int # Discrete (1-105)
material_name: str # Semantic ("Well sorted sand")
```
**ML consideration**: When training models, use **resistivity** (more information) as feature, but **material type** as interpretable output.
:::
### Spatial Coverage Map
::: {.callout-note icon=false}
## 📘 What to Look For in Spatial Distribution Maps
**Before Viewing the Figure:**
Spatial distribution maps reveal how aquifer properties vary across the landscape.
**What Will You See?**
A scatter plot where each point represents an HTEM measurement location, colored by material type.
**Look For These Patterns:**
| Visual Pattern | Geological Meaning | Management Implication |
|---------------|-------------------|----------------------|
| **Color clusters** | Homogeneous zones (e.g., buried sand channel) | Good zones for well fields |
| **Sharp color boundaries** | Geological contacts (sand meets clay) | Aquifer boundaries, flow barriers |
| **Gradual transitions** | Gradual facies changes | Transmissivity varies smoothly |
| **Coverage gaps** | No HTEM data | Need additional surveys or interpolation |
**Expected for Buried Valley Aquifer:** You should see elongated high-resistivity (yellow/light) zone following ancient river valley, surrounded by lower resistivity (blue/dark) clay-rich materials.
:::
```{python}
#| label: fig-htem-spatial-coverage
#| fig-cap: "Spatial distribution of material types in Unit D across the study area. Each point represents a grid cell colored by material type, revealing the heterogeneous structure of the primary aquifer."
# Sample for visualization (full dataset too large)
sample = unit_d_grid.sample(min(5000, len(unit_d_grid)), random_state=42)
fig = px.scatter(
sample,
x='X',
y='Y',
color='MT_Index',
hover_data=['Z'],
title='Unit D Material Type Distribution<br><sub>Spatial coverage of primary aquifer (sampled for performance)</sub>',
labels={'X': 'Easting (m)', 'Y': 'Northing (m)', 'MT_Index': 'Material Type', 'Z': 'Elevation (m)'},
height=700,
color_continuous_scale='Viridis'
)
fig.update_layout(
xaxis_title='Easting (m, UTM Zone 16N)',
yaxis_title='Northing (m, UTM Zone 16N)'
)
fig.show()
```
**Reading the spatial map:**
Each point represents a location where HTEM measured subsurface properties. The color indicates material type—look for:
- **Spatial clustering**: Areas where similar colors group together indicate geological features like buried channels or clay lenses
- **Gradients**: Smooth color transitions suggest gradual geological changes; sharp boundaries indicate distinct geological contacts
- **Coverage gaps**: Any white areas indicate regions without HTEM data
The **rectangular boundary** visible in the plot shows the extent of the HTEM survey—884 km² of continuous coverage.
::: {.callout-tip icon=false}
## 🌍 For Hydrogeologists: Interpreting Material Types
**What the material type numbers mean for aquifer quality:**
| MT Range | Description | Aquifer Potential | Why It Matters |
|----------|-------------|-------------------|----------------|
| 1-4 | Clay to silty clay | Poor - aquitard | Confines aquifer, prevents contamination |
| 5-8 | Silt to fine sand | Low to moderate | May yield limited water |
| 9-11 | Fine to medium sand | Good | Typical productive aquifer |
| **11-14** | **Well-sorted sand/gravel** | **Excellent** | **High yield, target for wells** |
| 101-105 | Bedrock/carbonate | Variable | May have fracture flow |
**Reading the bar chart:**
- **Dominant MT 11-14** → Excellent aquifer zone, prioritize for development
- **Dominant MT 1-4** → Clay-rich, acts as confining layer (protects deeper aquifer)
- **Mixed types** → Heterogeneous; expect variable well yields
**Management insight**: Map shows spatial clustering—areas with MT 11-14 clusters are optimal well locations.
:::
---
## Part 4: 3D Material Classification
### The Third Dimension
::: {.callout-note icon=false}
## 📘 Why 3D Matters for Aquifer Analysis
**What Is the Difference?**
- **2D grids**: Show horizontal patterns at specific depths (like floor plans)
- **3D cubes**: Show full vertical structure (like architectural cross-sections)
**Why Does 3D Matter?**
Vertical structure controls critical aquifer properties:
- **Confinement**: Clay layers above aquifer prevent contamination
- **Connectivity**: Continuous sand layers allow horizontal flow
- **Well design**: Knowing layer depths guides screen placement
**How to Use 3D Data:**
1. **Identify confining layers**: Protect aquifer from surface pollution
2. **Map aquifer thickness**: Thicker = more storage capacity
3. **Detect discontinuities**: Clay lenses may compartmentalize flow
**Management Insight:** 2D analysis might show "good aquifer material" but miss thin clay layer that limits recharge or creates confining conditions.
:::
While 2D grids show horizontal patterns, **3D material cubes** reveal vertical layering—critical for understanding confining layers and aquifer connectivity.
```{python}
# Load 3D material type data for Unit D
try:
unit_d_3d = loader.load_3d_material_cube('D')
print(f"\n📦 Unit D 3D Cube:")
print(f" • Total voxels: {len(unit_d_3d):,}")
print(f" • Depth range: {unit_d_3d['Z'].min():.1f} to {unit_d_3d['Z'].max():.1f} m")
print(f" • Unique material types: {unit_d_3d['MT_Index'].nunique()}")
unit_d_3d.head()
except Exception as e:
print(f"Note: 3D material cube not available ({e})")
print("Proceeding with 2D analysis only")
unit_d_3d = None
```
### Vertical Profiles and Aquifer Thickness
::: {.callout-note icon=false}
## Understanding Aquifer Thickness
**What Is Aquifer Thickness?**
Aquifer thickness is the vertical distance from the top of the water-bearing formation to its bottom—essentially how "deep" the sand/gravel layer is. This measurement is critical because thicker aquifers generally store more water and can sustain higher pumping rates.
**Brief History**: Early hydrogeologists (1900s-1950s) estimated thickness by drilling scattered boreholes and interpolating between them—expensive and error-prone. HTEM revolutionized this by providing continuous 3D measurements across entire regions.
**Why Does Thickness Matter?**
Aquifer thickness controls:
- **Storage capacity**: Thicker = more water stored
- **Well yield**: Thicker zones can support higher pumping rates
- **Sustainability**: Thick aquifers recover faster from drought
- **Well design**: Determines optimal screen length and depth
**How to Interpret Thickness Values:**
| Thickness Range | Classification | Well Potential | Management Strategy |
|-----------------|----------------|----------------|---------------------|
| **>30 m (>100 ft)** | Very thick | Excellent—high-capacity wells | Priority development zone |
| **15-30 m (50-100 ft)** | Thick | Good—moderate capacity wells | Standard development |
| **5-15 m (15-50 ft)** | Moderate | Fair—low capacity wells | Limited development |
| **<5 m (<15 ft)** | Thin | Poor—may not sustain wells | Avoid or use for monitoring only |
**What Will You See?**
The histogram below shows the distribution of aquifer thickness values across Unit D. Look for:
- **Median value**: The typical thickness (50th percentile)
- **Distribution shape**: Is thickness uniform or highly variable?
- **Thick zones**: Are there areas >30m suitable for high-capacity wells?
- **Thin zones**: Where might well development be challenging?
**Typical Pattern for Buried Valley Aquifers:**
The Mahomet Aquifer (Unit D) is a buried river valley, so expect:
- **Valley center**: Thickest (30-80m)—ancient river carved deep channel
- **Valley edges**: Moderate (10-30m)—transition zones
- **Outside valley**: Thin or absent (<5m)—bedrock high areas
:::
```{python}
if unit_d_3d is not None and len(unit_d_3d) > 0:
# Calculate aquifer thickness from 3D data
thickness = unit_d_3d.groupby(['X', 'Y'])['Z'].agg(['min', 'max']).reset_index()
thickness['Thickness_m'] = thickness['max'] - thickness['min']
fig = px.histogram(
thickness,
x='Thickness_m',
nbins=50,
title='Unit D Aquifer Thickness Distribution',
labels={'Thickness_m': 'Thickness (m)', 'count': 'Frequency'},
height=400
)
fig.add_vline(
x=thickness['Thickness_m'].median(),
line_dash="dash",
line_color="red",
annotation_text=f"Median: {thickness['Thickness_m'].median():.1f} m"
)
fig.show()
print(f"\n📏 Aquifer Thickness Statistics:")
print(f" • Mean: {thickness['Thickness_m'].mean():.1f} m")
print(f" • Median: {thickness['Thickness_m'].median():.1f} m")
print(f" • Range: {thickness['Thickness_m'].min():.1f} - {thickness['Thickness_m'].max():.1f} m")
else:
print("3D thickness analysis requires material cube data")
```
---
## Part 5: Multi-Unit Comparison
### Resistivity Across All Units
::: {.callout-note icon=false}
## 📘 Framework for Multi-Unit Comparison
**What Are We Comparing?**
Comparing resistivity across all 6 units reveals the vertical architecture of the aquifer system.
**Why Compare Units?**
- **Validation**: Does Unit D really have higher resistivity than others?
- **Stratigraphy**: Do units stack in expected order (clay over sand over bedrock)?
- **Aquifer protection**: Is there a low-resistivity confining layer above Unit D?
**How to Interpret the Comparison:**
The bar chart will show mean/median resistivity for each unit. Expected pattern for healthy aquifer system:
1. **Unit D tallest bar**: Primary aquifer (highest resistivity)
2. **Unit E shortest bar**: Confining clay layer (lowest resistivity)
3. **Units A-C moderate**: Bedrock (variable but generally high)
**Red Flag:** If Unit D does NOT have highest resistivity, it may not be the primary aquifer, or classification needs revision.
:::
#### What Is Resistivity Class?
Resistivity class is a simplified grouping of resistivity values into 15 bins (1-15), where higher numbers indicate higher resistivity (more resistive materials). This coarser classification complements the 105 material types by providing a simpler way to compare large-scale patterns across different stratigraphic units.
**Brief History**: Resistivity classification dates back to early groundwater geophysics in the 1930s, when pioneers like Conrad Schlumberger used surface electrical methods to locate water. The binning approach balances detail with interpretability.
#### Why Does Multi-Unit Comparison Matter?
Comparing resistivity across all 6 units reveals the vertical architecture of the aquifer system:
- **Identifies confining layers**: Low resistivity units (E) protect high resistivity aquifers (D)
- **Reveals connectivity**: Do units have similar resistivity (potential hydraulic connection)?
- **Validates geology**: Does the resistivity pattern match expected stratigraphy?
#### How to Interpret the Unit Comparison
**Expected Pattern for a Productive Aquifer System:**
| Unit | Expected Resistivity | What It Means | If Different, Consider... |
|------|---------------------|---------------|---------------------------|
| **Unit D** | **Highest (8-12)** | **Primary sand/gravel aquifer** | If low: Clay-rich, poor aquifer |
| Unit E | Lowest (2-5) | Clay confining layer | If high: Aquifer unprotected |
| Units A-C | Moderate to high (5-10) | Bedrock (variable) | Depends on lithology |
| Unit F | Variable (3-8) | Mixed surface materials | Depends on local geology |
#### What Will You See?
The visualization shows mean and median resistivity class for each unit. Look for:
- **Unit D standing out**: Should have highest values (best aquifer)
- **Unit E being lowest**: Indicates protective clay layer
- **Mean vs. median differences**: Large gaps indicate heterogeneity
```{python}
# Load and compare all 6 units
units = ['A', 'B', 'C', 'D', 'E', 'F']
resistivity_by_unit = []
for unit in units:
try:
grid = loader.load_resistivity_class_grid(unit)
# Column name in the resistivity classification grids is typically "Resist_Class"
# (see the data dictionary). Fall back gracefully if a different name is used.
col_name = None
for candidate in ['Resist_Class', 'Resistivity Class']:
if candidate in grid.columns:
col_name = candidate
break
if grid is not None and col_name is not None:
resistivity_by_unit.append({
'Unit': unit,
'Mean_Resistivity_Class': grid[col_name].mean(),
'Median_Resistivity_Class': grid[col_name].median(),
'Count': len(grid)
})
except Exception as e:
print(f"⚠️ Warning: Skipping Unit {unit} - {e}")
continue
resistivity_df = pd.DataFrame(resistivity_by_unit)
if len(resistivity_df) > 0:
fig = go.Figure()
fig.add_trace(go.Bar(
x=resistivity_df['Unit'],
y=resistivity_df['Mean_Resistivity_Class'],
name='Mean',
marker_color='steelblue'
))
fig.add_trace(go.Scatter(
x=resistivity_df['Unit'],
y=resistivity_df['Median_Resistivity_Class'],
name='Median',
mode='markers',
marker=dict(size=12, color='red', symbol='diamond')
))
fig.update_layout(
title='Resistivity Class by Stratigraphic Unit<br><sub>Higher values indicate coarser materials (better aquifer)</sub>',
xaxis_title='Stratigraphic Unit',
yaxis_title='Resistivity Class',
height=500,
template='plotly_white',
hovermode='x unified'
)
fig.show()
resistivity_df
```
**Interpretation:**
- **Unit D** should have **highest resistivity** (sand/gravel aquifer)
- **Unit E** should have **lowest resistivity** (clay-rich confining layer)
- **Units A-C** (bedrock) should have **moderate to high** resistivity
---
## Part 6: Key Findings and Insights
::: {.callout-note icon=false}
## Understanding HTEM Survey Statistics
**What Are These Metrics?**
The summary table below quantifies the HTEM survey's scope and detail. Each metric reveals different aspects of the data's power and limitations.
**Why Do These Numbers Matter?**
These statistics determine:
- **Spatial resolution**: Can we detect small-scale features (contamination plumes, thin clay layers)?
- **Temporal coverage**: Do we have a single snapshot or time-series monitoring?
- **Classification detail**: Can we distinguish fine differences in aquifer quality?
- **Vertical detail**: Can we map confining layers and aquifer boundaries?
**How to Interpret Each Metric:**
| Metric | What It Measures | Why It Matters | Good vs. Poor Values |
|--------|------------------|----------------|---------------------|
| **Grid Cells** | Data point density | More cells = finer spatial detail | Good: >100K cells; Poor: <10K |
| **Spatial Coverage** | Survey area extent | Larger = more comprehensive | Regional: >500 km²; Local: <50 km² |
| **Depth Range** | Vertical span measured | Captures full aquifer system? | Good: Surface to bedrock; Poor: Shallow only |
| **Material Types** | Classification detail | Can distinguish aquifer quality? | Detailed: >50 types; Coarse: <10 |
| **Stratigraphic Units** | Vertical layering detail | Reveals confining layers? | Good: 4-6 units; Poor: 1-2 |
**What Will You See?**
The table presents 6 key metrics. Look for:
- **Scale**: Is this a regional survey (100s of km²) or site-specific (<10 km²)?
- **Resolution**: Hundreds of thousands of grid cells indicate high-resolution mapping
- **Complexity**: Many material types and units suggest geological heterogeneity
- **Depth**: Does the survey reach the full depth of the aquifer system?
**Expected Pattern for a High-Quality Regional HTEM Survey:**
- Coverage: >500 km² (regional scale)
- Grid cells: >100,000 (fine resolution)
- Depth range: Surface to bedrock (complete vertical profile)
- Material types: 50-150 (detailed classification)
- Units: 4-6 (captures main stratigraphic layers)
:::
```{python}
# Generate summary statistics
summary = pd.DataFrame({
'Metric': [
'Total HTEM Grid Cells',
'Spatial Coverage',
'Primary Aquifer (Unit D) Coverage',
'Depth to Primary Aquifer',
'Material Classification Types',
'Stratigraphic Units Mapped'
],
'Value': [
f"{len(unit_d_grid):,} cells",
"884 km² (44 km × 52 km)",
f"{len(unit_d_grid):,} grid cells",
"12-96 m depth range",
"105 distinct types",
"6 units (A through F)"
]
})
summary
```
**Interpreting These Results:**
- **Grid cells (hundreds of thousands)**: High-resolution survey—can detect features at ~100m scale
- **Spatial coverage (884 km²)**: Regional scale—covers entire county, not just individual well fields
- **Depth range (12-96m)**: Captures full primary aquifer, from shallow to deep zones
- **Material types (105)**: Very detailed classification—can distinguish subtle lithology differences
- **Units (6)**: Complete stratigraphic framework—from surface to deep bedrock
**Quality Assessment**: This is an **exceptional** HTEM dataset by any standard. Most regional surveys have <50 km² coverage and <20 material types. The 884 km² coverage with 105 material types provides unprecedented aquifer characterization.
::: {.callout-important icon=true}
## 🎯 Critical Insights from HTEM Survey
### 1. Comprehensive Spatial Coverage
**Achievement**: 884 km² of **continuous** aquifer mapping—no other method provides this density.
**Implication**: Can identify aquifer boundaries, thickness variations, and material heterogeneity **everywhere**, not just at sparse well locations.
### 2. Unit D is the Primary Aquifer
**Evidence**:
- Consistent high-resistivity signature (sand/gravel)
- Extensive spatial footprint
- Appropriate depth (12-96 m) for pumping
**Implication**: Focus water resource management on Unit D. Other units are either too deep (A-C) or poor quality (E-F).
### 3. Material Heterogeneity is Significant
**Evidence**: 105 material types identified, not uniform sand
**Implication**: Aquifer transmissivity varies spatially. Some zones excellent (sorted sand), others marginal (silty sand). Cannot assume uniform properties.
### 4. 3D Structure Reveals Confinement
**Evidence**: Vertical resistivity variations show clay layers within/above aquifer
**Implication**: Aquifer may be semi-confined in some areas, affecting:
- Recharge rates (slower through clay)
- Pumping impacts (confined aquifers respond differently)
- Vulnerability to contamination (clay provides protection)
### 5. Integration with Wells is Required
**Challenge**: HTEM is **indirect** (resistivity ≠ permeability)
**Solution**: Calibrate HTEM interpretations with **well measurements**:
- Pump test transmissivity vs. HTEM resistivity
- Water quality vs. HTEM lithology
- Water level response vs. HTEM confinement
**Next steps**: Parts 2-3 will perform this integration.
:::
---
## Integration Roadmap
This HTEM foundation enables subsequent analyses:
**Part 2: Spatial Patterns**
- Aquifer material mapping and quality assessment
- Resistivity distribution analysis
- Cross-section visualization of stratigraphic units
- Aquifer vulnerability mapping
**Part 3: Temporal Dynamics**
- Understanding how aquifer structure controls water level response
- Memory and persistence related to confinement
- Thermal response analysis linked to material properties
**Part 4: Data Fusion Insights**
- HTEM-Groundwater fusion (structure controls response)
- Correlate HTEM resistivity with aquifer transmissivity
- Recharge rate estimation using aquifer properties
- Network connectivity mapping
**Part 5: Predictive Operations**
- Material classification ML for drilling decisions
- Well placement optimization using aquifer quality maps
- Contamination risk assessment using confinement layers
- MAR site selection based on HTEM structure
---
## Dependencies & Outputs
- **Data source**: `data_paths.grids_2d` and `data_paths.grids_3d` (config key)
- **Loader**: `src.data_loaders.HTEMLoader`
- **Outputs**: Inline interactive figures, optional exports to `outputs/phase-1/htem/`
- **Key files**: Material type grids, resistivity classifications for all 6 units
To explore HTEM data programmatically:
```python
from src.data_loaders import HTEMLoader
from src.utils import get_data_path
htem_root = get_data_path("htem_root")
loader = HTEMLoader(data_root=htem_root)
# Load any unit
unit_d = loader.load_material_type_grid('D', 'Preferred')
# Get all available files
files = loader.get_available_files()
```
## Summary
HTEM airborne geophysical survey provides **unprecedented subsurface characterization**:
✅ **4.74 GB processed grids** – hundreds of thousands of gridded resistivity points across 6 stratigraphic units (see the Complete Data Dictionary for exact counts)
✅ **Dense coverage** – ~100 m horizontal resolution across the full Champaign County study area
✅ **Unit D identified** – Primary aquifer with a large fraction of medium-to-high quality material (well-sorted sands and gravels; detailed statistics are developed in the Resistivity Distribution chapter)
✅ **14 key sedimentary material types** – From clay (low-permeability confining layers) to well-sorted sand/gravel (high-yield aquifer zones)
✅ **3D structure** - Vertical profiles enabling cross-section and volumetric analysis
**Key Insight:** HTEM bridges the gap between sparse well data and continuous subsurface mapping, enabling spatially-distributed aquifer characterization impossible with wells alone.
---
## Related Chapters
- [Subsurface 3D Model](subsurface-3d-model.qmd) - Full 3D visualization
- [Cross-Section Visualization](../part-2-spatial/cross-section-visualization.qmd) - Stratigraphic architecture
- [Resistivity Distribution](../part-2-spatial/resistivity-distribution.qmd) - Resistivity-K calibration
## Reflection Questions
- In your own words, how does an HTEM survey “see” differences between clay-rich layers and sand/gravel aquifer materials?
- Looking at the material type groupings, which ranges would you treat as high-priority targets for new wells, and which would you treat as protective confining layers?
- How might misinterpreting resistivity (for example, confusing clay-rich low-resistivity zones with poor data) impact later modeling or management decisions?