FMP Operations Guide
Reference manual for Flow Management Position operators using atfm-tools at the seven Canadian scope airports. Covers system concepts, page-by-page workflows, and operational procedures.
Contents
1. System Overview
atfm-tools is a rate-based tactical CTOT allocator for VATSIM Canadian airports. It ingests live data from the VATSIM data feed every 2 minutes, estimates arrival times using a multi-tier cascade, and allocates arrival slots against a declared acceptance rate.
Scope
Seven airports: CYHZ CYOW CYUL CYVR CYWG CYYC CYYZ.
Architecture
- Ingestor — polls VATSIM every 2 min, updates flight positions, stamps milestones, runs ETA estimation
- Allocator — runs every 2 min, evaluates active restrictions, assigns CTOTs to inbound flights
- Dashboard — real-time FMP situational awareness (this portal)
- CDM Plugin — EuroScope plugin consumes CTOT data via
/api/v1/restricted
2. Core Concepts
Acceptance Rate (AAR)
The maximum number of arrivals an airport can accept per hour. Derived from runway configuration, wake-mix, and wind conditions. Set by the FMP on the AAR page and consumed by the allocator.
CTOT (Calculated Take-Off Time)
A departure slot assigned to manage arrival flow. Equivalent to the FAA EDCT. The allocator issues CTOTs when a restriction is active and inbound demand exceeds the declared rate.
ELDT (Estimated Landing Time)
The system's best estimate of when a flight will land. Computed by the ETA cascade from wind data, position, filed flight plan, or aircraft performance. The ELDT drives slot allocation.
TLDT (Target Landing Time)
The frozen ELDT — locked at T-90 minutes before predicted landing. Once frozen, the TLDT becomes the committed slot time. Target accuracy: ±3 minutes.
OpLevel
Operational severity level (PERTI-compatible):
| Level | Name | Scope |
|---|---|---|
| 1 | Steady State | Normal operations, no restrictions |
| 2 | Localized | Single airport affected |
| 3 | Regional | Adjacent FIRs affected |
| 4 | NAS-Wide | Multiple regions |
3. Dashboard Page
The primary FMP view. Shows all tracked flights organized by airport with real-time status.
Header Pills
- Departures / Arrivals / Overflights — live counts across scope
- Ingest age — time since last successful data feed poll. Should always be < 3 min
- Version — running software version
Airport Cards
Each airport card shows:
- Active config — runway configuration and arrival rate (from AAR page)
- Restriction badge — shows when a CTOT restriction is active
- Inbound list — flights sorted by ELDT, showing callsign, type, origin, ETA, phase, and any assigned CTOT
- Departure list — flights at the airport awaiting pushback or taxi
Right-Docked Drawer
Click any flight to open the detail drawer showing:
- Full flight plan (route, altitude, filed TAS, equipment)
- Milestone timeline (EOBT, TOBT, TSAT, AOBT, ATOT, ELDT, ALDT, AIBT)
- ETA source and confidence tier
- Position data (lat/lon, altitude, groundspeed)
4. AAR / Runway Page
Sets the active runway configuration and acceptance rate for each airport. This is the single source of truth for rates — the value set here is what the allocator uses.
Wind Data
Fetched from METAR. For each runway, the page computes:
- Headwind (HW) — component along the runway. Positive = headwind, negative = tailwind
- Crosswind (XW) — component across the runway. Shown as absolute value
Runway Availability
A runway is marked unavailable (red) when:
- Tailwind exceeds 5 kt (NAV CANADA MATS limit)
- Crosswind exceeds 30 kt dry / 20 kt wet
Auto-Propose
The system automatically proposes the best configuration using a composite score:
score = declared_rate + headwind_bonus + ILS_bonus headwind_bonus = max(0, headwind) × 0.5 ILS_bonus = 3 (only in IFR/LIFR conditions, for ILS-equipped runways)
Dual-parallel configs (rate 42+) dominate single-runway. Exceptional configs (e.g. CYYZ 15/33) are only selected when all preferred configs are out of tolerance.
LAHSO
Land and Hold Short Operations. Available only when:
- Weather is VMC (VFR or MVFR)
- Runway surface is dry
When unavailable, the tooltip shows the specific reason.
Setting the Rate
- Review the auto-proposed config and adjust runway roles if needed
- Click Set Active Config to commit
- The rate is immediately visible on the dashboard and used by the allocator
airports table. It persists across page refreshes and is visible to all connected users.
5. Reports Page
Historical performance metrics over a selectable time window (6h / 12h / 24h / 48h / 7d).
Stat Cards
| Card | What it shows |
|---|---|
| Arrivals | Completed arrivals (flights with ALDT) in the window |
| Departures | Completed departures (flights with ATOT) in the window |
| Dwell | Median spawn-to-pushback time (AOBT − created_at). Capped at 120 min |
| ELDT err | Median ELDT prediction error at departure (ELDT − ALDT). Positive = late prediction |
| TLDT err | Median frozen-ETA error (TLDT − ALDT). Should be ±3 min |
Per-Airport Table
| Column | Meaning |
|---|---|
| Airport | ICAO code + name |
| Rate | Active arrival rate (from AAR page) |
| Arr / Dep | Completed movements in window |
| Dwell | Median spawn-to-pushback (departure quality metric) |
| ELDT err | Median arrival prediction error |
| TLDT err | Median frozen-ETA error |
ETA Source Distribution
Breakdown of which ETA cascade tier produced the final estimate for each arrival. Helps assess data quality:
- High WIND_GRIB percentage = good (position + real winds)
- High CALC_DEFAULT = poor (no flight plan data available)
TLDT Accuracy Panel
Detailed validation of the frozen ETA (TLDT) against actual landing (ALDT):
- Median error, MAE (Mean Absolute Error)
- Percentage within ±3 min and ±5 min targets
- Breakdown by ETA source tier and by airport
Aircraft Type Table
Movement counts by aircraft type. Counts completed movements only (arrivals with ALDT, departures with ATOT). Per-airport columns sum ADES + ADEP movements.
6. PERTI Page
Detailed per-flight view compatible with the PERTI milestone format. Shows the full A-CDM milestone chain for each flight at a selected airport.
Three-Way ELDT Comparison
For flights with GRIB wind data, the PERTI page shows:
- ELDT — the system's primary estimate (from the ETA cascade)
- ELDT (wind) — the GRIB wind-corrected estimate (QA comparison)
- PERTI — the PERTI system's estimate (when available)
7. CTOT Allocation
How Slots Are Assigned
- The allocator runs every 2 minutes
- For each airport with an active restriction, it examines all inbound flights with ELDT within the restriction window
- Flights are sorted by ELDT and assigned to rate-limited slots
- A CTOT is the departure time that would place the aircraft in its assigned arrival slot
CTOT Lifecycle
- Candidate — flight identified as needing a slot
- Issued — CTOT assigned and communicated to CDM plugin
- Frozen — CTOT locked at T-90 min, not subject to revision
- Released — restriction lifted, CTOT cleared
- Reissued — CTOT revised due to updated ELDT or rate change
Shadow Mode
The allocator can run in shadow (dry-run) mode via bin/compute-ctots.php --shadow. In this mode, the full allocation logic executes but no database writes occur. The output shows what WOULD have happened — useful for validating restriction parameters before going live.
8. A-CDM Milestones
The system uses ICAO A-CDM milestone vocabulary internally, translating at display edges for PERTI compatibility.
Naming Convention
S* = Scheduled, E* = Estimated, T* = Target, C* = Calculated (regulation), A* = Actual.
Key Milestones
| Milestone | Meaning | How Observed |
|---|---|---|
EOBT | Estimated Off-Block Time | From flight plan deptime + DOF |
TOBT | Target Off-Block Time | Proxy: max(EOBT, spawned + 20 min) |
AOBT | Actual Off-Block (pushback) | First cycle with GS > 0 at departure geofence |
ATOT | Actual Take-Off Time | First cycle in DEPARTED phase |
ELDT | Estimated Landing Time | ETA cascade (multi-tier) |
TLDT | Target Landing (frozen ELDT) | Frozen at T-90 min |
ALDT | Actual Landing Time | First cycle in ON_RUNWAY / TAXI_IN / ARRIVED |
AIBT | Actual In-Block Time | Second consecutive ARRIVED cycle |
CTOT | Calculated Take-Off Time | Allocator output (departure slot) |
Taxi Time Milestones
| Planning | Actual | Formula |
|---|---|---|
| EXOT (Estimated Taxi-Out) | AXOT (Actual Taxi-Out) | ATOT − AOBT, capped 1–60 min |
| EXIT (Estimated Taxi-In) | AXIT (Actual Taxi-In) | AIBT − ALDT |
9. Flight Lifecycle
Phase Taxonomy
Geofence Thresholds
| Transition | Trigger |
|---|---|
| FILED → TAXI_OUT | GS > 0 within departure geofence |
| TAXI_OUT → CLIMBOUT | Altitude > field + 500 ft |
| CLIMBOUT → DEPARTED | Distance from ADEP > 40 nm |
| DEPARTED → CRUISE | Within 2000 ft of filed altitude |
| CRUISE → DESCENT | Descending, altitude drops > 2000 ft below filed |
| DESCENT → ARRIVING | Within 40 nm of destination |
| ARRIVING → ON_RUNWAY | Below field + 200 ft, within 5 nm |
| ARRIVED | GS < 5 kt within airport geofence |
ELDT Eligibility
ELDT is only computed for flights at cruise altitude (within 2000 ft of filed altitude) or in ARRIVING phase. Flights in FILED, CLIMBOUT, or early DEPARTED phases show no ELDT — ground-tier estimates from filed ETE are used instead.
10. ETA Cascade
The ETA cascade determines the best available arrival estimate for each flight. Higher-priority tiers are tried first; the first one that fires produces the ELDT.
Airborne Tiers (at cruise)
| Priority | Tier | Source | Confidence |
|---|---|---|---|
| 1 | WIND_GRIB | GRIB wind along resolved route, 3-phase (climb/cruise/descent) | 92 |
| 2 | OBSERVED_POS | Along-route distance ÷ filed TAS (or GS) | 91 / 88 |
| 3 | FILED | ATOT + filed ETE (defensive fallback) | 85 |
Ground Tiers
| Priority | Tier | Source | Confidence |
|---|---|---|---|
| 1 | FILED | EOBT + taxi + filed enroute time | 90 |
| 1b | FIR_EET | ICAO EET/ from remarks + approach time | 80 |
| 2 | CALC_FILED_TAS | Great-circle ÷ filed TAS | 70 |
| 3 | CALC_TYPE_TAS | Great-circle ÷ aircraft type TAS | 55 |
| 4 | CALC_DEFAULT | Great-circle ÷ 430 kt | 40 |
Why This Order?
- WIND_GRIB is best: real winds along the actual route from the observed position. Updates every cycle.
- OBSERVED_POS uses the aircraft's current position and filed TAS (wind-neutral). Position-aware and updates every cycle — better than static FILED.
- FILED (airborne) is static from takeoff. SimBrief winds are good at departure but stale after hours en route.
- Ground tiers use planning estimates anchored to EOBT, improving as more flight plan data is available.
ELDT Freeze
At T-90 minutes before predicted landing, the ELDT is frozen and becomes the TLDT. This is aligned with the CTOT scope — candidates have ETE ≤ 1:30, so the allocator lookahead and freeze horizon are the same clock.
11. Wind-Corrected ELDT
The WIND_GRIB tier uses GFS 1° GRIB data from NOAA NOMADS at three pressure levels:
| Level | Approx FL | Used For |
|---|---|---|
| 250 mb | FL340 | High-altitude jets (FL340+) |
| 300 mb | FL300 | Mid-level jets (FL280–FL340) |
| 500 mb | FL180 | Turboprops (below FL280) |
How It Works (3-phase wind model, v0.6.42+)
The route from the current position to the threshold is split into four segments, each integrated per grid cell with the appropriate wind level:
| Phase | Wind Grid | Avg TAS | Notes |
|---|---|---|---|
| Climb (if still climbing) | 500 mb | cruise × 0.80 | climb gradient ~300 ft/nm |
| Cruise | altitude-selected | filed or type TAS | main enroute segment |
| Descent above FL100 | 500 mb | descent IAShigh × 1.30 | TOD to FL100 traverse |
| Below FL100 | (no wind) | 140–250 kt profile | low-level GRIB not representative; short segment |
- Resolve the filed route to a coordinate waypoint array (4-layer parsing)
- Compute phase boundaries: climb distance from
(cruiseAlt − curAlt) / 300, TOD ataltAbove / 318, FL100 crossing atfl100AGL / 318 - For each grid cell along the route, integrate wind at the level appropriate to the phase (500mb for climb + descent, cruise-level for cruise)
- Compute headwind/tailwind component and adjust TAS per segment
- Sum all four phase times
Why 3-phase matters: prior to v0.6.42, only cruise had wind applied; descent used a no-wind geometric model. That caused a systematic ~−4 min early bias because jetstream tailwinds on descent (typically 15–25 kt for ~15 min) went uncounted. Short-haul flights (<90 min, dominated by climb+descent) barely benefited from GRIB at all. The 3-phase model applies wind to the whole airborne portion where it’s well-represented.
Grid Coverage
LAT 15–70°N, LON 170°W–30°E. Covers CONUS, Caribbean, NAT tracks, Europe, and trans-Pacific east of the dateline. Flights outside the grid fall back to OBSERVED_POS or FILED tiers.
Route Resolution
Filed routes (e.g. SSM V300 YVV DCT TONNY BOXUM7) are resolved to coordinate arrays via a 4-layer pipeline:
- Coordinate waypoints —
49N050W,5530N02030W - Named fixes — lookup in 124,684-fix database
- Airway segments — expanded via adjacency graph (4,654 airways)
- SID/STAR procedures — terminal procedures for the 7 Canadian airports
12. Operational Procedures
Starting a Session
- Open the AAR page and verify/set the runway configuration for your airport(s)
- Confirm the arrival rate is appropriate for current conditions
- Open the Dashboard to monitor inbound traffic
- The system runs autonomously — CTOTs are assigned automatically when restrictions are active
Setting a Restriction
When demand exceeds capacity:
- Verify the AAR is set correctly on the AAR page
- Create an arrival restriction for the airport (via the dashboard or API)
- The allocator will begin issuing CTOTs to inbound flights within scope
- Monitor the dashboard for compliance and adjust the rate as conditions change
Changing the Rate
If weather deteriorates or runway configuration changes:
- Update the configuration on the AAR page
- The new rate takes effect immediately
- Existing CTOTs will be reissued on the next allocator run if the rate change affects them
- Frozen CTOTs (T-90m) are not revised — only unfrozen CTOTs adjust
Airport-Specific Notes
| Airport | Notes |
|---|---|
CYHZ | Runway 14 has ILS (preferred arrival in IMC). 05/23 longer for heavy departures. Dependent configs available. |
CYOW | 07/25 for E-W alignment. 32 noise-preferred for arrivals despite no HSE (heavy brake to taxiway D). |
CYVR | North runway (08R/26L) normally used for arrivals. South complex for departures. LAHSO available in VMC dry. |
CYYZ | Dual parallel (05s/06s or 23s/24s). Highest capacity in scope. 15/33 exceptional only. |
CYUL | 06L/24R primary. 10/28 crosswind runway. |
CYYC | Parallel 17L/R or 35L/R. Single-runway configs for low traffic. |
CYWG | 18/36 or 13/31. Single-runway operations typical. |
13. Abbreviations
| Abbrev | Meaning |
|---|---|
| AAR | Airport Acceptance Rate (arrivals/hour) |
| ADR | Airport Departure Rate (departures/hour) |
| A-CDM | Airport Collaborative Decision Making |
| AIBT | Actual In-Block Time |
| ALDT | Actual Landing Time |
| AOBT | Actual Off-Block Time |
| ASAT | Actual Start-Up Approval Time |
| ATOT | Actual Take-Off Time |
| AXOT | Actual Taxi-Out Time |
| AXIT | Actual Taxi-In Time |
| CDM | Collaborative Decision Making |
| CTOT | Calculated Take-Off Time (= FAA EDCT) |
| EDCT | Expected Departure Clearance Time (FAA term for CTOT) |
| ELDT | Estimated Landing Time |
| EOBT | Estimated Off-Block Time |
| EXOT | Estimated Taxi-Out Time |
| EXIT | Estimated Taxi-In Time |
| FIR | Flight Information Region |
| FMP | Flow Management Position |
| GS | Groundspeed |
| GRIB | GRIdded Binary (weather data format) |
| HW | Headwind |
| ILS | Instrument Landing System |
| LAHSO | Land and Hold Short Operations |
| MAE | Mean Absolute Error |
| MATS | Manual of Air Traffic Services (NAV CANADA) |
| ROT | Runway Occupancy Time |
| TAS | True Airspeed |
| TLDT | Target Landing Time (frozen ELDT) |
| TOBT | Target Off-Block Time |
| TSAT | Target Start-Up Approval Time |
| TTOT | Target Take-Off Time |
| XW | Crosswind |