Screening
Screening compares a Lab Result against a threshold and reports whether it exceeds. The thresholds live in a three-level hierarchy: a Screening Program holds one or more Screening Criteria Sets, and each Criteria Set holds Screening Levels — the per-analyte limit values a result is measured against. One server-side evaluator runs the comparison, so every analysis tool reports the same verdict.
The screening hierarchy
A Screening Program is the top-level container — typically one regulatory framework or risk basis (for example, a state groundwater standard). It carries a Code (required, unique), a Name (required), and an optional Description.
A Screening Criteria Set is a named, versioned collection of limits within a program — usually one specific table or revision. Its Name is required and unique within its program. Each set carries a Status (Draft, Active, Superseded, or Archived; default Draft), an optional EffectiveDate and Source, an optional Description, and a Color used in displays. A set has no Code of its own — the Program is the only Code-keyed level.
A Screening Level is one threshold row inside a Criteria Set, identified by its analyte, Matrix, and Fraction. Each level can set an Upper Limit, a Lower Limit, or both — the two values share one unit, and each bound has its own qualifier. At least one bound is required, each provided bound must be non-negative, and when both are set the lower limit must be below the upper.
Figure: A Screening Program holds Criteria Sets; each Criteria Set holds per-analyte Screening Levels.
A level's identity within its set is the combination of Analyte, Matrix, and Fraction, so the same analyte can legitimately repeat for a different matrix or fraction. The Fraction defaults to Any (all fractions); a level set to a specific fraction (such as Dissolved or Total) applies only to results of that fraction.
When a regulatory table is revised
When an agency publishes a revision to a table you screen against, enter the revision as a new Criteria Set in the same Screening Program, with its own Effective Date and Source. Then mark the old set Superseded and pick the new set in its Superseded By field, so the lineage between vintages is recorded. Projects that reference the superseded set keep screening against that vintage deliberately — reports already delivered under the old table stay reproducible — while new work references the new set.
Changing level values inside a referenced Criteria Set changes the screening verdict of every result already evaluated against it — historical exceedances can appear or disappear. Erde warns when you save ("This criteria set is currently referenced by one or more projects; changes will affect their screening results.") but does not block, because marking an in-use set Superseded is itself an edit to it. Treating a regulatory revision as a new set is the curator's rule.
How a result is evaluated
When a tool screens a result, it resolves a single comparison value, then asks the evaluator to compare it to the matching Screening Levels:
- A detected result compares its measured value; a detected result that reports only an EMPC (no value or text) compares the EMPC instead of being skipped.
- A non-detect compares its recorded result value when it has one, otherwise the plan's chosen detection or reporting limit — falling back to a reported EMPC when no limit exists, or using the EMPC as the limit when the DMP is configured to — when non-detect screening is on, and is not screened when it is off.
Screening resolves one of five statuses:
| Status | Meaning | Display |
|---|---|---|
| Exceeds | Compared against at least one applicable level and exceeded a bound | "Exceeds" |
| Within Limits | Compared against at least one applicable level, exceeded none | "Within Limits" |
| Unscreenable | A dimensionally compatible criterion exists, but this result could not be compared — no matching matrix or fraction, or a non-detect with no recorded value or limit | "Unscreenable" |
| Not Applicable | Screening ran, but the analyte has no comparable criterion at all | "Not Applicable" |
| Not Screened | Screening was not performed — no set selected, an ineligible sample type, or a non-detect while non-detect screening is off | blank |
Exceedance is decided per bound. By default an upper limit is exceeded when the result is strictly greater than the limit (the boundary value passes), and a lower limit is exceeded when the result is strictly less than it. Each bound's qualifier can switch to "or equal", making the boundary value itself an exceedance. A result exceeds the level if either bound is exceeded.
Unscreenable is the flagged case worth attention: a criterion for the analyte exists in a compatible unit, but this specific result could not be matched — most often a matrix or fraction mismatch, or a non-detect with no recorded value or limit to screen against. It is never treated as a silent pass. Not Applicable means no criterion applies at all, so the result is expected to read blank and is not counted as a problem.
Total and Total Recoverable are distinct fractions and do not cross-match. A criterion meant to apply to both should be authored with Fraction set to Any (all fractions), or entered for each fraction. A mismatch surfaces as Unscreenable, not a silent pass.
The Criteria Set Color
Each Criteria Set carries a Color drawn from a fixed palette of 20 named values (default Crimson). The Color is what displays use to attribute an exceedance to the set that produced it — the marker, cell highlight, or legend swatch that tells you which set a result failed.
The color identity is stable: only the name is stored, and the actual hex values are applied when the result is drawn, so the on-screen hues can be retuned without changing saved data. When you save a set using a color already in use by another Draft or Active set, Erde shows a non-blocking warning so you can keep set colors distinct, but the save still succeeds. Superseded and Archived sets are excluded from the check.
Where screening appears
The same evaluator feeds every analytical surface, so a result's verdict is identical wherever you open it. The surface differs only in the unit it screens:
| Surface | Screens | Shows |
|---|---|---|
| Data Explorer | Per result row | A screening status column, with a count of unscreenable results |
| Crosstab | Per cell | Cell highlight in the Criteria Set Color of the driving exceedance |
| Map | Per location (rolled up) | A marker colored by the location's combined status |
The Map rolls the per-result statuses for a location into a single marker status: an exceedance always wins; a location with a compatible-but-uncompared result and no exceedance reads as partially screened; a location whose only screenable results are non-detects (with non-detect screening off) still reads clean.
You select which Criteria Sets to screen against in each tool's filter panel. Multiple sets can apply at once, and each contributes its own result and color.
Where a surface shows a qualifier beside a screened result, it is the result's validated qualifier only — an unvalidated result contributes none. A non-detect's status is conveyed by its < limit or ND notation, independent of any qualifier. The raw lab qualifier is kept only in the Data Explorer's audit columns.
How it fits together
Screening sits alongside the Data Management Plan (DMP) in the analysis flow. The DMP, assigned to a Project, prepares the results — unit conversion, summation, duplicate aggregation, and non-detect handling — before the screening evaluator compares them to the selected Criteria Sets.
| Screening Criteria Set | Data Management Plan | |
|---|---|---|
| Role | Supplies the limits a result is compared against | Prepares results before comparison |
| Identity | Name, unique within its Screening Program | Assigned to a Project |
| Selected | In each tool's filter panel | Automatically, from the Project's DMP |
Screening Programs, Criteria Sets, and Screening Levels are managed under Data Management; creating or editing them requires Data Steward access (the Administrator or Data Manager role), while reading them needs only sign-in.