SWAT+ drainage area audit (TxtInOut vs NHDPlus HR) | SWATGenX

The final QA step before calibration: does the channel each gage was assigned to actually carry the right drainage area? We read the area SWAT+ truly uses from executable TxtInOut files and compare it to the original NHDPlus HR and NWIS values at every gaged channel.

QA step 3 of 3 · 99 gages · 8 models · executable chandeg.con

This is the third and final step of the SWATGenX streamflow-QA pipeline. The delineation builds the network, gage assignment ties each USGS gage to a channel, and this audit verifies the last link: whether that assigned channel carries the correct drainage area in the executable model. For every gage with an assignment, we read chandeg.con area (hectares → km²) for the matching GIS channel, compare it to the original NHDPlus HR flowline TotDASqKm at the gage, and list NWIS site metadata where available — across all eight publication models, not just the Peace River benchmark.

Read it in order: assignment quality comes first (a wrong-channel pick will look like an area error), so the drainage-area ratios here should be interpreted on the calibration-ready gages identified on the gage-assignment page. That keeps a true SWAT+-vs-NHD area difference from being confused with a mis-assigned gage.

The headline metric is SWAT+ versus NHD on matched reaches: portfolio-wide, 86 of 94 station pairs fall within a 0.5–2.0 ratio (median 1.09 on Peace River). Large SWAT+–NWIS gaps are read as tributary-versus-mainstem assignment diagnostics unless SWAT+–NHD also diverges.

Below the portfolio tables, a Peace River deep-dive documents every hypothesis we tested — wrong metric, merged NHD artifacts, orphan reaches, lakes, the polygon stage, and QSWAT/TauDEM-vs-VAA definition differences — in an experiment-log format, so genuine agreement, systematic offsets, and assignment outliers are reported separately rather than averaged together.

Portfolio summary (8 evaluation models)

This is QA step 3: with the network delineated and each gage assigned to a channel, we verify the assigned channel carries the right drainage area. The area is reconstructed from executable SWAT+ chandeg.con files (what the model actually routes), compared with original NHDPlus HR TotDASqKm, USGS NWIS site drainage area, and the WBD upstream HU12 sum (model context) at each gaged channel. Because a wrong-channel pick masquerades as an area error, gage assignment comes first; read the ratios here on calibration-ready stations so a true SWAT+-vs-NHD area-definition difference is not confused with a mis-assigned gage. Across 98 stations, 97 have both SWAT+ and NHD values; 78 fall within a 0.5–2.0 SWAT/NHD ratio. Agreement is reported as |SWAT+ − NHD| / NHD × 100 at each gage. Large SWAT–NWIS gaps are treated as gage-assignment diagnostics, not proof of NHD-to-SWAT conversion failure.

Models
8
Stations
98
Matched SWAT–NHD
97
Within 0.5–2.0×
78
Method notes
  • SWAT+ column: TxtInOut/chandeg.con column area (hectares ÷ 100), row matched by GIS channel id (v3 NHD-first/SWAT-second assignment for Peace 03100101; stations.shp channel elsewhere)
  • NHD column: Original NHDPlus HR HU4 geodatabase flowline TotDASqKm within 500 m of gage (domain-clipped)
  • NWIS column: meta_{VPUID}.csv nwis_drain_area_km2 (USGS NWIS site-service drain_area_va / contrib)
  • |Δ| vs NHD = |SWAT+ − NHD| / NHD × 100 (same information as SWAT/NHD ratio, expressed as percent difference from NHD).
  • GIS channel in stations.shp matches gis_id in chandeg.con; SWAT lcha is the routing index for channel_sd output (they differ when noted).
Understanding SWAT+ vs NHDPlus HR

Portfolio tables above compare executable chandeg.con drainage area (what SWAT+ runs) with original NHDPlus HR TotDASqKm at each gaged channel — not post-processed national pickles. For the large Peace River HUC-8 model we traced where differences enter the pipeline (phases 1–3), using data-backed scrutiny similar to the calibration runtime benchmark experiment log.

Frozen audit chain (Peace mainstem): Original NHD and streams.pkl reach TotDASqKm match; post-processed polygon upstream area is ~+2–3% vs NHD; QSWAT AreaC and chandeg.con are ~+15–17% on mainstem. The offset first appears at the QSWAT/SWAT+ channel-area stage.

Example — 02294650 (Peace River at SR 60 near Bartow): NHD cumulative TotDASqKm 856.95 km²; local reach AreaSqKm ~3.6 km² (misleading if compared to SWAT+); SWAT+ chandeg 1,002.2 km² (~17% vs TotDASqKm).

Pipeline stages (Peace 10-gage panel)

StageSourceMainstem median vs NHDRole
AOriginal NHD TotDASqKm (zip VAA)×1.00Reference
Gstreams.pkl reach TotDASqKm×1.00Pre-QSWAT attribute
BOriginal upstream Σ AreaSqKm (zip)×1.00Cross-check
CCleaned streams.pkl upstream Σ×0.99Secondary
Dwatersheds.pkl upstream polygon Σ×1.03SWATGenX post-processed polygons (national clip; not per-project QSWAT shapes)
EQSWAT AreaC at assignment×1.17First large exceed
Fchandeg.con (executable SWAT+)×1.17Headline audit column
Hrivs1.AreaC / SQLite (live)Pending artifact restore

Stage D uses national watersheds.pkl clipped to Peace HUC-12s — not necessarily identical to per-project QSWAT Watershed/Shapes when those files are missing. Stage H (live rivs1.AreaC / project SQLite) is pending on this workspace; when shapes are restored, re-run the internal 3b script to close the fork: H ≈ F ≫ NHD → QSWAT channel area; H ≈ NHD and F ≫ H → SWAT+ text export.

Hypotheses investigated (Peace deep-dive)

Each item below was tested with scripts and CSV traces under publication/analysis/qa/ (internal reproducibility). Status reflects weight of evidence on Peace mainstem gages unless noted as a separate outlier class.

Phase 1 — Comparing cumulative SWAT+ to local NHD reach area

Ruled out

Is the gap because chandeg.con is cumulative but we compared to local AreaSqKm?

No — headline metrics use NHD TotDASqKm (cumulative VAA).

  • Peace @ SR 60 (02294650): NHD TotDASqKm 857 km² vs local reach AreaSqKm ~3.6 km²; SWAT+ chandeg 1002 km² aligns with cumulative scale.
  • Median |Δ| vs TotDASqKm on 73 matched Peace gages: ~10.2%; vs local reach area: misleading (~14,900% median).

Phase 2 — Accidentally comparing to post-processed streams.pkl / watersheds.pkl

Ruled out

Does the offset come from comparing SWAT+ to already-merged national artifacts?

No — headline NHD is from the original HU4 geodatabase zip, not merged pickles.

  • nhd_totdasqkm_km2 and upstream Σ AreaSqKm are computed from unzipped NHDPlusFlowlineVAA on the domain-clipped zip.
  • Cleaned streams.pkl upstream Σ is only ~1–2% below zip on mainstem — far smaller than the ~15–17% SWAT+ excess.

Phase 2 — NHD TotDASqKm inconsistent with upstream Σ AreaSqKm

Ruled out

Is NHD VAA internally inconsistent on mainstem reaches?

No on Peace mainstem — TotDASqKm and upstream Σ AreaSqKm agree (e.g. 857 km² at 02294650).

  • Phase 2 crosswalk: original zip TotDASqKm matches original upstream catchment sum on mainstem picks.
  • The ~145 km² SWAT−NHD gap (1002 − 857) is not explained by VAA definition mismatch alone.

Phase 1 — Orphan catchment merge onto mainstem

Ruled out

Did orphan-catchment dissolution pile extra area onto mainstem NHD IDs?

Unlikely for the systematic mainstem +10–17% band.

  • Domain preprocess merges hundreds of orphans nationally; per-gage geometry tests did not stack orphan area on Peace mainstem NHD IDs.
  • Post-processed polygon upstream Σ (stage D) is only ~+2–3% vs NHD — not +15–17%.

Phase 1 — SWAT+ omits lakes that NHD counts

Ruled out

Does lake/waterbody handling explain SWAT+ > NHD on mainstem?

Not the dominant pattern — SWAT+ is higher than NHD, not lower.

  • Lake omission would bias SWAT+ low vs NHD; mainstem shows systematic positive bias (60/73 matched gages SWAT+ > NHD).
  • Upstream WB-linked waterbody area at 02294650 (~126 km²) is too small to explain ~145 km² SWAT−NHD alone.

Phase 3 — SWATGenX pre-inflated TotDASqKm before QSWAT

Ruled out

Did streams.pkl or preprocessing corrupt the reach drainage attribute before QSWAT?

No — reach TotDASqKm in streams.pkl matches original zip NHD within <0.1% on the panel.

  • 02294650: zip 856.95 km² vs streams.pkl 856.95 km²; QSWAT AreaC (README) 1002.2 km².
  • 02294760: zip 891.56 vs streams.pkl 891.56; AreaC 1046.57 km².

Phase 3 — SWATGenX post-processed watershed polygons

Ruled out

Does national watersheds.pkl upstream area carry the mainstem offset?

Not as the primary source — stage D is ~+2–3% vs NHD on mainstem panel.

  • 02294650: polygon upstream Σ 874 km² vs NHD 857 km² (+2%); chandeg 1002 km² (+17%).
  • Median polygon/NHD ≈ 1.03 on three mainstem panel gages; median chandeg/NHD ≈ 1.17.

Phase 3 — QSWAT copied a wrong drainage column from SWAT_plus_streams.shp

Ruled out

Did QSWAT copy an inflated area field we exported on the channel shapefile?

Unlikely — SWAT_plus_streams.shp has no TotDASqKm or AreaC column.

  • SWATGenX write_output exports topology, length, elevations, and lake flags only — not drainage-area attributes.
  • Offset appears at QSWAT AreaC / chandeg, not at reach attributes in streams.pkl.

Phase 3 — QSWAT/TauDEM contributing area vs NHD VAA

Leading explanation

Why does SWAT+ cumulative drainage exceed original NHD on mainstem?

Leading explanation: delineation-definition difference, not necessarily a preprocessing bug.

  • Polygons and NHD reach attributes agree; QSWAT AreaC and chandeg.con jump ~+15–17% at the same stage.
  • Protects NHDPlus HR preprocessing; narrows issue to QSWAT/TauDEM channel-area semantics or SWAT+ export.

Phase 3 — Live rivs1.AreaC / SQLite before chandeg export

Pending check

Is the offset already in rivs1 before TxtInOut, or introduced at text export?

Pending — Peace Watershed/Shapes not on disk; re-run phase 3b after restore.

  • If rivs1 AreaC ≈ chandeg ≫ NHD: QSWAT/TauDEM channel area creates the offset.
  • If rivs1 ≈ NHD but chandeg high: SWAT+ text export introduces the offset.

Phase 1 — Gage–channel assignment outliers

Separate class

What about extreme SWAT/NHD ratios on tributary or mis-assigned gages?

Separate class — not basin-wide conversion failure.

  • Peace: 7 assignment outliers flagged; e.g. tiny SWAT+ vs large NHD on tributary picks.
  • Three gages lack chandeg rows (reservoir/auxiliary channels) — reported explicitly, not folded into headline metrics.
Peace pipeline trace (10-gage panel)

Peace River HUC-8: 76 matched SWAT–NHD; median SWAT/NHD ratio 1.1178; 65 within 0.5–2.0×. Values in km² unless noted.

USGSPanel roleNHD (A)streams.pkl (G)Polygons (D)QSWAT AreaC (E)chandeg (F)|Δ| vs NHD
02294650mainstem 15 17856.95856.95874.221,002.21,002.216.9%
02294760mainstem 15 17891.56891.56914.811,046.571,046.5717.4%
02294898mainstem 15 17995.39995.391,021.9815.131,162.6716.8%
02295420moderate 20 40181.28181.28186.22231.22231.2227.5%
02296389moderate 20 40176.08176.08
02294747outlier low13.1913.1919.1612.0822.9874.2%
02295440outlier low1.761.761.7625.131.760.2%
02293694lake canal78.5378.539.82209.019.887.5%
02294330lake named44.9944.9944.9959.8459.8433%
02297600control good153.72153.72157.23165.61165.617.7%

SWAT+ vs NHDPlus HR drainage area

Each point is one gaged channel: x = original NHDPlus HR TotDASqKm, y = SWAT+ chandeg.con area (km²). The dashed line is 1:1 agreement. Log axes are used when drainage areas span more than one order of magnitude.

0.12.0NHDPlus HR TotDASqKm (km²)0.11.0101001.0kSWAT+ chandeg.con (km²)
≤10% |Δ|10–50% |Δ|>50% |Δ| or assignment outlier
Peace station assignment (v3, production streamflow)

Peace River rows in the portfolio tables above use v3 NHD-first / SWAT-second GIS channel ids when looking up chandeg.con area (same method used for current streamflow extraction), not the legacy da_distance channel in older stations.shp snapshots. Per-gage assignment class, mapping method, and calibration funnel are on the USGS station → SWAT+ assignment page.

What we conclude

Across 8 evaluation models, drainage-area agreement is generally good (78 of 97 matched station pairs within 0.5–2.0× SWAT/NHD). Peace River mainstem gages show a systematic ~10–17% excess in SWAT+ cumulative area vs original NHD VAA that is not explained by comparing to local reach area, using merged NHD artifacts, NHD VAA inconsistency, orphan merge, lake omission, pre-inflated TotDASqKm in streams.pkl, or post-processed polygon accounting alone.

The leading interpretation is a delineation-definition difference between NHDPlus HR hydrosequence cumulative drainage and QSWAT/TauDEM-derived channel contributing area — not necessarily a SWATGenX preprocessing error. That protects the NHDPlus HR method used in model generation while flagging channel-area semantics for calibration interpretation. Assignment outliers and missing chandeg rows remain a separate review class.

Pending: live rivs1.shp / project SQLite on Peace to confirm whether the offset is fully established before chandeg.con export.

Missing rows & assignment outliers

These stations are flagged for follow-up (reservoir/auxiliary objects, tributary vs mainstem assignment). They are excluded from the headline SWAT/NHD success metric unless both areas exist.

USGS siteStation nameGIS ch.SWAT lchaSWAT+ DA (km²)NHD HR (km²)USGS site (km²)WBD HU12↑ (km²)SWAT/NHD|Δ| vs NHD
02297345PEACE RIVER AT PLATT FL1831794,463.272.444,599.151,832.06182,820.9%
02294747SIXMILE CREEK AT BARTOW FL4274051,046.5713.191,448.2779.347,834.6%
02296389OAK CREEK NEAR GARDNER FL598565732.11140.64168.61173.935.21420.6%
02293986PEACE CREEK DRAINAGE CANAL NEAR ALTURAS FL6,6435,7740.14381.12414.4593.050100%
03151500L KANAWHA R NR BURNSVILLE, WV9469072.84400.39401.45559.420.0199.3%
09499500TONTO C NR ROOSEVELT ARIZ1,2201,22030.772,070.972,178.182,193.730.0198.5%
02239600TRIBUTARY TO SILVER RIVER AT SH 40 NEAR OCALA FL220.6234.9253.370.0298.2%
02239601TRIBUTARY TO SILVER RIVER BL SH 40 NR OCALA, FL220.6234.9253.370.0298.2%
02297310HORSE CREEK AT SR 72 NEAR ARCADIA, FL1,3071,23523.72516.24564.62627.960.0595.4%
05536270NORTH CREEK NEAR LANSING, IL16162.7142.7243.5156.970.0693.7%
02239501SILVER RIVER NEAR OCALA, FL220.625.9953.370.189.6%
02293694PEACE CREEK DRAINAGE CANAL NEAR DUNDEE FL1,0089609.878.53150.22392.560.1287.5%
09498800TONTO CREEK NEAR GISELA, ARIZ.1,0031,003145.451,118.931,113.69145.480.1387%
03151915SAND FORK NEAR GLENVILLE, WV877535.09204.95204.87207.620.1782.9%
02295521LT CHARLIE CR BL PARKER BRANCH NR BOWLING GREEN FL3,1442,7779.4749.28121.850.1980.8%
07174000Little Caney River near Copan, OK11,103.861,098.151,116.88
By evaluation model

Oklawaha (FL) (03080102) — 0308/huc12/030801020804

Stations
3
SWAT+ chandeg area
3
NHD TotDASqKm
3
USGS site (NWIS)
0
Matched SWAT–NHD
3
Median |Δ| vs NHD
98.2%
Median SWAT/NHD ratio
0.0176
Within 0.5–2.0× (SWAT/NHD)
0 / 3
Missing chandeg
0
Assignment outliers
3

SWAT+ vs NHDPlus HR drainage area

Each point is one gaged channel: x = original NHDPlus HR TotDASqKm, y = SWAT+ chandeg.con area (km²). The dashed line is 1:1 agreement. Log axes are used when drainage areas span more than one order of magnitude.

0.46.035NHDPlus HR TotDASqKm (km²)0.61.03.06.0102040SWAT+ chandeg.con (km²)
≤10% |Δ|10–50% |Δ|>50% |Δ| or assignment outlier
USGS siteStation nameGIS ch.SWAT lchaSWAT+ DA (km²)NHD HR (km²)USGS site (km²)WBD HU12↑ (km²)SWAT/NHD|Δ| vs NHD
02239600TRIBUTARY TO SILVER RIVER AT SH 40 NEAR OCALA FL220.6234.9253.370.0298.2%
02239601TRIBUTARY TO SILVER RIVER BL SH 40 NR OCALA, FL220.6234.9253.370.0298.2%
02239501SILVER RIVER NEAR OCALA, FL220.625.9953.370.189.6%

FAQ

  • Why compare chandeg.con instead of shapefiles?

    Shapefiles and SQLite exports document preprocessing products, but SWAT+ executes from TxtInOut. The chandeg.con area column is what the solver uses for channel contributing drainage area at each reach.

  • Why can SWAT+ and NWIS drainage areas disagree when SWAT+ and NHD agree?

    NWIS drainage area describes the gage watershed metadata, while the assigned GIS channel may be a tributary reach. SWAT+ versus NHD is the direct check that NHDPlus HR drainage accounting survived into executable model files.

  • What does “missing chandeg row” mean?

    The station is linked to a GIS channel id that does not appear in chandeg.con—often reservoir outlets or auxiliary routing objects. Those rows are flagged for assignment review, not hidden as conversion errors.

  • Why can Peace River mainstem gages show ~10–17% higher SWAT+ than NHD TotDASqKm?

    A phased trace on a 10-gage Peace panel shows the offset first appears at QSWAT channel AreaC and chandeg.con, not at original NHD VAA, streams.pkl reach TotDASqKm, or post-processed watershed polygons (~+2–3% there). The leading interpretation is a delineation-definition difference between NHDPlus HR cumulative drainage and QSWAT/TauDEM contributing area—not necessarily a preprocessing bug.

  • Did SWATGenX inflate NHD drainage area before QSWAT?

    No on the tested reaches: original zip TotDASqKm and streams.pkl reach TotDASqKm match within 0.1% (e.g. 02294650: 856.95 km² both). SWAT_plus_streams.shp does not export a drainage-area column for QSWAT to copy. Live rivs1 verification is pending where project shapes are not on disk.

Related guides

Explore related

Last updated 2026-06-03.