The Pass Schedule
A gauge is compared against SWOT only on the passes whose swath covers it, and the satellite's 21-day orbit flies the same ground tracks in every cycle, so the passes covering a gauge return on a fixed schedule. That schedule sets how often a gauge can be compared, from how many distances across the swath, and which anchors can check the passes over it. Together these decide how well the passes set the elevation of the gauge's sensor, the number a field survey establishes today under a protocol designed to hold it within 5 cm1. This page sets out how Tidemark finds the schedule in the passes the fetch kept, the looks due at each gauge and those the fetched passes hold, and the gauges it flags.
Distance Across the Swath
Every Expert pass The Satellite Passes keeps carries its nadir track, the point directly beneath the satellite on each line across its swaths. For every pass and every gauge in the station catalog, the schedule takes the line running across the gauge and measures how far along it the gauge sits from that nadir track, on the same sphere the fetch measures its 50 km reach on, keeping that line's instant, which every sample at the gauge carries. The distance is positive to the right of the way the satellite flies and negative to its left, as JPL D-56407 counts a cross-track distance.
The mission's Science Data Products User Handbook gives each of the two swaths the span from 10 to 60 km off the track, so a pass stands to a gauge in one of three ways:
- The pass covers the gauge, where the gauge sits from 10 to 60 km off the track, in the left or the right half swath
- The gauge sits in the gap, where it lies within 10 km of the track, beneath the satellite, between the two swaths
- The gauge lies beyond the swath, where it sits more than 60 km off the track, or where the lines the fetch kept stop short of it, so that no line runs across it
The schedule keeps the first two and leaves out the third, reading where a gauge itself sits rather than where the nearest height lies. The product the fetch reads carries no height from the altimeter looking straight down along the track, as its product description notes, so a gauge in the gap is measured only where the heights at the inner edge of a swath fall within the 5 km the comparison reads around it. A pass retraces its ground track to within about a kilometer, so the schedule gives each gauge one distance from each pass near it, the median over the cycles the fetch kept, and no pass the fetch kept covers a gauge in one cycle and leaves it in the gap in another.
The Coverage Map
mise run data:schedule runs tidemark schedule, which rebuilds the schedule the map and the table below are drawn from out of the passes mise run data:fetch:swot fetched. The map opens on every gauge, each marked as an anchor or a target and Wells as retired, with the half swaths of each pass that covers one drawn over the water around them, the water a step deeper for each pass over it, and the gauges gathered beside the map by how many passes cover each. Pointing at a gauge on the map or in that gathering gives its passes per cycle. Picking a gauge from either, or from the menu, zooms the map in on it, rings it at 10 and 60 km, and lights the track of every pass near it, and pointing at a pass in the list beside the map marks the point where its track runs nearest the gauge and names the distance between them.
Anchor
Target
Retired
Half swath14passes
Every gauge the catalog carries on the Maine coast, beneath the half swaths of each pass that covers one
Every value as a table
| Gauge | Covered By | In the Gap Of |
|---|---|---|
| Apprenticeshop, Rockland, ME | 242 at 40.8 km right, 7 at 45.3 km left, 313 at 50.0 km right, 548 at 54.6 km left | None |
| Back River Bridge, Arrowsic, ME | None | 548 at 3.8 km right, 313 at 5.8 km right |
| Bar Harbor | 7 at 16.6 km right, 242 at 36.8 km left, 520 at 57.9 km right | None |
| Bowdoinham, ME | None | 313 at 8.1 km left, 548 at 9.1 km right |
| Cape Neddick River at Shore Road, York, ME | 313 at 41.5 km left, 35 at 55.5 km right | 270 at 9.3 km left |
| Chebeague Island, ME | 313 at 18.1 km left, 548 at 35.2 km right | None |
| Cutler Farris Wharf | 520 at 25.8 km left | 285 at 9.2 km left |
| Damariscotta River, East Boothbay, ME | 548 at 11.1 km left, 313 at 20.0 km right | None |
| Department of Marine Resources, Boothbay Harbor, ME | 313 at 16.2 km right | 548 at 6.1 km left |
| Eastport | 214 at 44.0 km right, 520 at 50.0 km left | 285 at 1.2 km right |
| Fore River, Portland, ME | 313 at 31.0 km left, 270 at 45.1 km left, 548 at 51.0 km right | None |
| Fort Popham, Phippsburg, ME | None | 313 at 7.4 km right, 548 at 7.5 km right |
| GMRI Pier, Portland, ME | 313 at 26.4 km left, 548 at 47.0 km right, 270 at 49.2 km left | None |
| Jordan's Pier, Milbridge, ME | 520 at 27.7 km right, 7 at 39.9 km right, 285 at 54.8 km left | None |
| Kennebec River at Calumet Bridge at Augusta, ME | None | 313 at 7.2 km left, 548 at 9.1 km left |
| Kennebec River at Gardiner, ME | None | 313 at 4.5 km left, 548 at 6.8 km left |
| Kennebec River at Hallowell, ME | None | 548 at 6.9 km left, 313 at 7.6 km left |
| Kennebunkport, ME | 270 at 24.0 km left, 313 at 35.4 km left | None |
| Lindsey Brook, Rockland, Maine | 242 at 41.0 km right, 7 at 45.4 km left, 313 at 49.9 km right, 548 at 54.4 km left | None |
| Machias, ME | 285 at 29.3 km left | 520 at 9.2 km left |
| Maine Maritime Museum, Bath, Maine | None | 313 at 1.2 km right, 548 at 6.0 km right |
| Port Clyde, St. George, ME | 548 at 38.0 km left, 313 at 43.3 km right, 7 at 52.3 km left, 242 at 57.7 km right | None |
| Portland | 313 at 25.7 km left, 548 at 46.0 km right, 270 at 50.2 km left | None |
| Rockland Public Landing, Rockland, ME | 242 at 40.9 km right, 7 at 45.1 km left, 313 at 50.2 km right, 548 at 54.5 km left | None |
| Saco River at Camp Ellis near Saco, ME | 313 at 31.2 km left, 270 at 34.2 km left | None |
| Scarborough River, ME | 313 at 29.7 km left, 270 at 40.1 km left, 548 at 56.2 km right | None |
| Seavey Island | 35 at 47.8 km right, 313 at 49.3 km left | 270 at 4.3 km right |
| Stonington Harbor, ME | 7 at 12.1 km left | 242 at 5.1 km right |
| Town Pier, Jonesport, ME | 285 at 35.2 km left, 7 at 59.3 km right | 520 at 7.2 km right |
| Verona Bridge, Bucksport, ME | 7 at 33.2 km left | 242 at 3.1 km right |
| Wells | 270 at 16.1 km left, 313 at 41.7 km left, 35 at 55.1 km right | None |
Passes per Cycle
SWOT numbers the 584 passes of each 21-day cycle, and a pass keeps its number from one cycle to the next, so the pass numbers covering a gauge fix how many times a cycle it can be compared. For every gauge, the schedule counts the passes whose swath covered it, lists their pass numbers, and divides the passes by the cycles the fetched passes span, where a cycle counts once any of its passes covers a gauge. It counts the passes over where a gauge sits, whether or not the gauge was recording, so Wells, which NOAA removed before SWOT launched, still counts its passes.
The daily orbit SWOT flew in its first months numbers its passes and cycles on a scheme of its own, so the schedule counts the 21-day orbit alone. None of the earlier orbit's passes covers a gauge, since the one track it flew across the box around the gauges ran about 80 km from the nearest gauge, well past the 60 km edge of its swath.
Looks Held and Missing
A look is due at a gauge in each cycle of each pass covering it, from the first crossing the fetch kept to the last, and a gauge's rate falls short of its count of pass numbers only where the fetched passes lack one of those looks. A look is lacking where the fetch kept no line of that cycle's pass across the gauge, whether the archive holds no part of the pass or the part it holds stops short of the gauge. The schedule dates each look it lacks from the looks it holds:
- It dates the start of every cycle from the instant each pass the fetch kept began, which each file names, since a pass begins its share of the cycle after the pass numbered before it, each of the 584 lasting the same share. The median time between two cycles of one pass number sets the repeat period, and each cycle starts one period after the one before.
- It measures how far into its cycle each pass crossed each gauge, over every look the fetched passes hold, and takes the median, since a pass crosses a gauge the same time into every cycle.
- It dates each look the fetched passes lack that far into its own cycle.
Across the fetched passes, the repeat period comes to 20.86 days, and every look they hold falls within 3 seconds of the time into its cycle its pass keeps, so a look they lack is dated to the minute. mise run data:schedule rebuilds the looks, the calendar, and the table below. The calendar shows nine weeks of one gauge at a time, a filled circle on each day a pass came over it and a dashed one on each day a look was due that the fetched passes lack, and a ring on the strip beneath it takes the calendar to the look it stands for.
3 looks every 21 days
2026SMTWTFS
May 10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29Cycle 51
30
31
Jun 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19Cycle 52
20
21
22
23
24
25
26
27
28
29
30
Jul 1
2
3
4
5
6
7
8
9
10Cycle 53
11
202420252026
The fetched passes hold 161 of the 168 looks due, 2.82 a cycle. Tap or click a dashed ring on the strip to find one of the 7 missing.
Across the swath
Every value as a table
| Gauge | Pass Numbers | Due | Held | Per Cycle |
|---|---|---|---|---|
| Apprenticeshop, Rockland, ME | 7, 242, 313, 548 | 225 | 216 | 3.79 |
| Bar Harbor | 7, 242, 520 | 169 | 163 | 2.86 |
| Cape Neddick River at Shore Road, York, ME | 35, 313 | 112 | 109 | 1.91 |
| Chebeague Island, ME | 313, 548 | 112 | 107 | 1.88 |
| Cutler Farris Wharf | 520 | 56 | 54 | 0.95 |
| Damariscotta River, East Boothbay, ME | 313, 548 | 112 | 107 | 1.88 |
| Department of Marine Resources, Boothbay Harbor, ME | 313 | 56 | 54 | 0.95 |
| Eastport | 214, 520 | 113 | 110 | 1.93 |
| Fore River, Portland, ME | 270, 313, 548 | 168 | 161 | 2.82 |
| GMRI Pier, Portland, ME | 270, 313, 548 | 168 | 161 | 2.82 |
| Jordan's Pier, Milbridge, ME | 7, 285, 520 | 168 | 159 | 2.79 |
| Kennebunkport, ME | 270, 313 | 112 | 108 | 1.89 |
| Lindsey Brook, Rockland, Maine | 7, 242, 313, 548 | 225 | 216 | 3.79 |
| Machias, ME | 285 | 56 | 51 | 0.89 |
| Port Clyde, St. George, ME | 7, 242, 313, 548 | 224 | 215 | 3.79 |
| Portland | 270, 313, 548 | 168 | 161 | 2.82 |
| Rockland Public Landing, Rockland, ME | 7, 242, 313, 548 | 225 | 216 | 3.79 |
| Saco River at Camp Ellis near Saco, ME | 270, 313 | 112 | 108 | 1.89 |
| Scarborough River, ME | 270, 313, 548 | 168 | 161 | 2.82 |
| Seavey Island | 35, 313 | 112 | 109 | 1.91 |
| Stonington Harbor, ME | 7 | 56 | 54 | 0.95 |
| Town Pier, Jonesport, ME | 7, 285 | 112 | 105 | 1.84 |
| Verona Bridge, Bucksport, ME | 7 | 56 | 54 | 0.95 |
| Wells | 35, 270, 313 | 168 | 163 | 2.86 |
One Pass Number Alone
The error the gauges on one pass share takes a shape across the swath, an offset for each half, a tilt, and a curve, as The Satellite’s Reading sets out, so its size at a gauge changes with the gauge's distance across the swath89. Each pass carries a share of that error of its own, since the tilt alone changes over the 120-day cycle of the Sun's angle to the orbit and over each orbit9, so a gauge's own passes never tell their shares apart from the elevation of its sensor, however many pass numbers cover it. Each pass's share rests instead on the anchors that pass covers, or on the gauges it shares with passes that cover one, and the pass numbers a gauge shares with each anchor name the passes that anchor can check it on. A gauge that one pass number alone covers sits at the same distance in every cycle, so any part of the error that recurs at that distance and escapes those ties stays in its estimate, and the schedule flags it. The flag carries weight for a target alone, since an anchor's elevation is already established.
Machias, one pass number alone
Pass 285 crosses no anchor. One shared pass away: Bar Harbor, Cutler Farris and Eastport.
Across the Network
We found the gauges below that one pass number alone covers, in the schedule mise run data:schedule computes, each place on a line of its own, so two sensors at one place share a line:
- Stonington Harbor, ME, on pass 7
- Verona Bridge, Bucksport, ME, on pass 7
- Machias, ME, on pass 285
- Department of Marine Resources, Boothbay Harbor, ME, on pass 313
- Cutler Farris Wharf, an anchor, on pass 520
Every other gauge a pass covers is seen by two or more pass numbers, and each gauge below by 4, the most of any:
- Apprenticeshop, Rockland, ME
- Lindsey Brook, Rockland, Maine
- Port Clyde, St. George, ME
- Rockland Public Landing, Rockland, ME
Of the 3,309 looks due at the gauges, which count two sensors at one place apart, the fetched passes hold 3,173.
No pass covers the gauges below, all of them on the Kennebec, listed from its mouth up the river:
- Fort Popham, Phippsburg, ME
- Back River Bridge, Arrowsic, ME
- Maine Maritime Museum, Bath, Maine
- Bowdoinham, ME
- Kennebec River at Gardiner, ME, an anchor
- Kennebec River at Hallowell, ME, an anchor
- Kennebec River at Calumet Bridge at Augusta, ME, an anchor
The nadir tracks of passes 313 and 548 both run within 10 km of every one of them, so each gauge falls in the gap beneath the satellite on both passes, while every other pass leaves them more than 80 km away. The inner edge of pass 548's swath still leaves heights within 5 km of Fort Popham and a few within 5 km of Back River Bridge, whereas the gauges further up the river have none.
The Tables It Ships
The package ships the pass schedule under src/tidemark/swot/, one Parquet file for each table, and mise run docs:render writes each table's section below from the schema the schedule checks it against, the sentence beneath its heading from the schema's docstring. Beside the tables, parts.json records each SWOT part a rebuild read the nadir tracks of, by its name and its SHA-256, and mise run data:schedule -- --check rebuilds the tables from exactly those parts, naming any part the store lacks before it computes anything, so a store holding later passes still checks the schedule the package ships.
counts.parquet
One row per
gauge the station catalog holds
station
Shares station with 4 other tables.
station also keys The Station Table, The Series Table, distances.parquet, and looks.parquet.
5columns
The counts table, one row for each gauge the station catalog holds, counting the passes of the 21-day orbit whose swath covers it.
| Column | Holds |
|---|---|
station | A shared key the tables join on |
pass_numbers | Each pass number whose swath covers the gauge, in order |
passes | The passes whose swath covered the gauge |
passes_per_cycle | The passes whose swath covered the gauge in an average cycle, empty where no pass of the 21-day orbit covers any gauge |
single_pass_number | Whether one pass number alone covers the gauge, which holds it at one distance across the swath in every cycle |
cycles.parquet
One row per
cycle of the 21-day orbit
cycle_number
Shares cycle_number with 3 other tables.
cycle_number also keys The Samples Table, The Nadir Tracks, and looks.parquet.
2columns
The cycles table, one row for each cycle of the 21-day orbit, from the first the fetch kept a pass from to the last, naming the instant the cycle began.
| Column | Holds |
|---|---|
cycle_number | A shared key the tables join on |
start | The instant the first pass of the cycle began, in UTC |
distances.parquet
One row per
gauge and each pass of the 21-day orbit whose nadir track runs within 60 km of it
stationpass_number
Shares station with 4 and pass_number with 4 other tables.
station also keys The Station Table, The Series Table, counts.parquet, and looks.parquet.
pass_number also keys The Samples Table, The Nadir Tracks, ground_tracks.parquet, and looks.parquet.
4columns
The distances table, one row for each gauge and each pass of the 21-day orbit whose nadir track runs within 60 km of it, naming how far across the swath the gauge sits and which half swath holds it.
| Column | Holds |
|---|---|
station | A shared key the tables join on |
cross_track_distance | The median distance in meters of the gauge from the pass's nadir track over the cycles the fetch kept, negative on its left side |
half_swath | The half swath the gauge falls in, left or right of the track, empty where the gauge sits in the gap beneath the satellite |
pass_number | A shared key the tables join on |
ground_tracks.parquet
One row per
line of the nadir track of every pass whose track runs within 60 km of a gauge
pass_number
Shares pass_number with 4 other tables.
pass_number also keys The Samples Table, The Nadir Tracks, distances.parquet, and looks.parquet.
4columns
The ground tracks table, one row for each line of the nadir track of every pass whose track runs within 60 km of a gauge, in the order the satellite flew them, read from the cycle the fetch kept the most lines of that pass from.
| Column | Holds |
|---|---|
latitude | Where the point beneath the satellite sat in degrees north |
longitude | Where the point beneath the satellite sat in degrees east, from -180 to 180 |
pass_number | A shared key the tables join on |
velocity_heading | The direction the satellite flew over the ground, in degrees clockwise from true north |
looks.parquet
One row per
cycle of each pass whose swath covers a gauge
stationcycle_numberpass_number
Shares station with 4, cycle_number with 3, and pass_number with 4 other tables.
station also keys The Station Table, The Series Table, counts.parquet, and distances.parquet.
cycle_number also keys The Samples Table, The Nadir Tracks, and cycles.parquet.
pass_number also keys The Samples Table, The Nadir Tracks, distances.parquet, and ground_tracks.parquet.
5columns
The looks table, one row for each cycle of each pass whose swath covers a gauge, from the first crossing the fetch kept to the last, naming when the pass crossed the gauge or was due to and whether the fetched passes hold the look.
| Column | Holds |
|---|---|
station | A shared key the tables join on |
cycle_number | A shared key the tables join on |
pass_number | A shared key the tables join on |
seen | Whether the fetched passes hold the look, meaning a crossing of that cycle whose swath covers the gauge |
time | The instant the pass crossed the gauge wherever the fetched passes hold that crossing, or the instant it was due to otherwise, in UTC |
1Baranes et al. 2026. "Supporting Coastal Flood Forecasting and Community-Led Adaptation With Tide Gauges, Community Science and Youth Engagement." Frontiers in Climate 8: 1757212. https://doi.org/
10.3389/ ↩︎fclim.2026.1757212 2Statistics Canada 2021. "Provinces/Territories, Cartographic Boundary File, 2021 Census." https://www12.statcan.gc.ca/
census-recensement/ .↩︎2021/ geo/ sip-pis/ boundary-limites/ files-fichiers/ lpr_000b21a_e.zip 3U.S. Census Bureau 2024. "2024 Cartographic Boundary File (SHP), State and Equivalent Entities for United States, 1:500,000." https://www2.census.gov/
geo/ .↩︎tiger/ GENZ2024/ shp/ cb_2024_us_state_500k.zip 4Gulf of Maine Research Institute & Brown University 2026. "NERACOOS ERDDAP." Northeastern Regional Association of Coastal Ocean Observing Systems. https://data.neracoos.org/
erddap/ .↩︎5United States Geological Survey 1994. "USGS Water Data for the Nation." https://doi.org/
10.5066/ .↩︎F7P55KJN 6NOAA CO-OPS 2026. "CO-OPS Data Retrieval API and Metadata API." https://tidesandcurrents.noaa.gov/
web_services_info.html .↩︎7SWOT 2025. "SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product." Version D. NASA Physical Oceanography Distributed Active Archive Center. https://doi.org/
10.5067/ .↩︎SWOT-SSH-D 8Dibarboure et al. 2022. "Data-Driven Calibration Algorithm and Pre-Launch Performance Simulations for the SWOT Mission." Remote Sensing 14(23): 6070. https://doi.org/
10.3390/ ↩︎rs14236070 9Ubelmann et al. 2024. "Data-Driven Calibration of SWOT's Systematic Errors: First In-Flight Assessment." Remote Sensing 16(19): 3558. https://doi.org/
10.3390/ ↩︎ ↩︎rs16193558