atfm-tools FMP Guide

––:––:––Z
← dashboard AAR reports perti

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
  2. Core Concepts
  3. Dashboard Page
  4. AAR / Runway Page
  5. Reports Page
  6. PERTI Page
  7. CTOT Allocation
  8. A-CDM Milestones
  9. Flight Lifecycle
  10. ETA Cascade
  11. Wind-Corrected ELDT
  12. Operational Procedures
  13. Abbreviations

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

Data freshness: All data is at most 2 minutes old (one ingest cycle). The dashboard auto-refreshes every 30 seconds.

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):

LevelNameScope
1Steady StateNormal operations, no restrictions
2LocalizedSingle airport affected
3RegionalAdjacent FIRs affected
4NAS-WideMultiple regions

3. Dashboard Page

The primary FMP view. Shows all tracked flights organized by airport with real-time status.

Header Pills

Airport Cards

Each airport card shows:

Right-Docked Drawer

Click any flight to open the detail drawer showing:

DISCONNECTED flights are hidden from the dashboard. They appear only in reports. A flight is marked DISCONNECTED after 3 consecutive missed ingest cycles (~6 minutes).

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:

Runway Availability

A runway is marked unavailable (red) when:

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:

When unavailable, the tooltip shows the specific reason.

Setting the Rate

  1. Review the auto-proposed config and adjust runway roles if needed
  2. Click Set Active Config to commit
  3. The rate is immediately visible on the dashboard and used by the allocator
Config persistence: The active config is stored server-side on the 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

CardWhat it shows
ArrivalsCompleted arrivals (flights with ALDT) in the window
DeparturesCompleted departures (flights with ATOT) in the window
DwellMedian spawn-to-pushback time (AOBT − created_at). Capped at 120 min
ELDT errMedian ELDT prediction error at departure (ELDT − ALDT). Positive = late prediction
TLDT errMedian frozen-ETA error (TLDT − ALDT). Should be ±3 min
Small samples: When n < 5, error metrics are dimmed. Median values with very few observations are statistically unreliable.

Per-Airport Table

ColumnMeaning
AirportICAO code + name
RateActive arrival rate (from AAR page)
Arr / DepCompleted movements in window
DwellMedian spawn-to-pushback (departure quality metric)
ELDT errMedian arrival prediction error
TLDT errMedian frozen-ETA error

ETA Source Distribution

Breakdown of which ETA cascade tier produced the final estimate for each arrival. Helps assess data quality:

TLDT Accuracy Panel

Detailed validation of the frozen ETA (TLDT) against actual landing (ALDT):

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:

7. CTOT Allocation

How Slots Are Assigned

  1. The allocator runs every 2 minutes
  2. For each airport with an active restriction, it examines all inbound flights with ELDT within the restriction window
  3. Flights are sorted by ELDT and assigned to rate-limited slots
  4. A CTOT is the departure time that would place the aircraft in its assigned arrival slot

CTOT Lifecycle

CANDIDATEISSUEDFROZENCOMPLIANT / EXPIRED ↑ ↑ reissued released (restriction lifted)
Stale CTOT protection: CTOTs are never persisted across restriction lifetimes. At the start of every allocator run, any CTOT from a no-longer-active restriction is automatically released.

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

MilestoneMeaningHow Observed
EOBTEstimated Off-Block TimeFrom flight plan deptime + DOF
TOBTTarget Off-Block TimeProxy: max(EOBT, spawned + 20 min)
AOBTActual Off-Block (pushback)First cycle with GS > 0 at departure geofence
ATOTActual Take-Off TimeFirst cycle in DEPARTED phase
ELDTEstimated Landing TimeETA cascade (multi-tier)
TLDTTarget Landing (frozen ELDT)Frozen at T-90 min
ALDTActual Landing TimeFirst cycle in ON_RUNWAY / TAXI_IN / ARRIVED
AIBTActual In-Block TimeSecond consecutive ARRIVED cycle
CTOTCalculated Take-Off TimeAllocator output (departure slot)
ASAT is never stamped. Actual Start-Up Approval is a controller event with no VATSIM signal. The system never fabricates milestones it cannot observe.

Taxi Time Milestones

PlanningActualFormula
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

Departure: PREFILEFILEDTAXI_OUTCLIMBOUT Enroute: DEPARTEDCRUISE Arrival: DESCENTARRIVING Terminal: ON_RUNWAYVACATEDTAXI_INARRIVED

Geofence Thresholds

TransitionTrigger
FILED → TAXI_OUTGS > 0 within departure geofence
TAXI_OUT → CLIMBOUTAltitude > field + 500 ft
CLIMBOUT → DEPARTEDDistance from ADEP > 40 nm
DEPARTED → CRUISEWithin 2000 ft of filed altitude
CRUISE → DESCENTDescending, altitude drops > 2000 ft below filed
DESCENT → ARRIVINGWithin 40 nm of destination
ARRIVING → ON_RUNWAYBelow field + 200 ft, within 5 nm
ARRIVEDGS < 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)

PriorityTierSourceConfidence
1WIND_GRIBGRIB wind along resolved route, 3-phase (climb/cruise/descent)92
2OBSERVED_POSAlong-route distance ÷ filed TAS (or GS)91 / 88
3FILEDATOT + filed ETE (defensive fallback)85

Ground Tiers

PriorityTierSourceConfidence
1FILEDEOBT + taxi + filed enroute time90
1bFIR_EETICAO EET/ from remarks + approach time80
2CALC_FILED_TASGreat-circle ÷ filed TAS70
3CALC_TYPE_TASGreat-circle ÷ aircraft type TAS55
4CALC_DEFAULTGreat-circle ÷ 430 kt40

Why This Order?

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:

LevelApprox FLUsed For
250 mbFL340High-altitude jets (FL340+)
300 mbFL300Mid-level jets (FL280–FL340)
500 mbFL180Turboprops (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:

PhaseWind GridAvg TASNotes
Climb (if still climbing)500 mbcruise × 0.80climb gradient ~300 ft/nm
Cruisealtitude-selectedfiled or type TASmain enroute segment
Descent above FL100500 mbdescent IAShigh × 1.30TOD to FL100 traverse
Below FL100(no wind)140–250 kt profilelow-level GRIB not representative; short segment
  1. Resolve the filed route to a coordinate waypoint array (4-layer parsing)
  2. Compute phase boundaries: climb distance from (cruiseAlt − curAlt) / 300, TOD at altAbove / 318, FL100 crossing at fl100AGL / 318
  3. For each grid cell along the route, integrate wind at the level appropriate to the phase (500mb for climb + descent, cruise-level for cruise)
  4. Compute headwind/tailwind component and adjust TAS per segment
  5. 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:

  1. Coordinate waypoints49N050W, 5530N02030W
  2. Named fixes — lookup in 124,684-fix database
  3. Airway segments — expanded via adjacency graph (4,654 airways)
  4. SID/STAR procedures — terminal procedures for the 7 Canadian airports

12. Operational Procedures

Starting a Session

  1. Open the AAR page and verify/set the runway configuration for your airport(s)
  2. Confirm the arrival rate is appropriate for current conditions
  3. Open the Dashboard to monitor inbound traffic
  4. The system runs autonomously — CTOTs are assigned automatically when restrictions are active

Setting a Restriction

When demand exceeds capacity:

  1. Verify the AAR is set correctly on the AAR page
  2. Create an arrival restriction for the airport (via the dashboard or API)
  3. The allocator will begin issuing CTOTs to inbound flights within scope
  4. Monitor the dashboard for compliance and adjust the rate as conditions change

Changing the Rate

If weather deteriorates or runway configuration changes:

  1. Update the configuration on the AAR page
  2. The new rate takes effect immediately
  3. Existing CTOTs will be reissued on the next allocator run if the rate change affects them
  4. Frozen CTOTs (T-90m) are not revised — only unfrozen CTOTs adjust

Airport-Specific Notes

AirportNotes
CYHZRunway 14 has ILS (preferred arrival in IMC). 05/23 longer for heavy departures. Dependent configs available.
CYOW07/25 for E-W alignment. 32 noise-preferred for arrivals despite no HSE (heavy brake to taxiway D).
CYVRNorth runway (08R/26L) normally used for arrivals. South complex for departures. LAHSO available in VMC dry.
CYYZDual parallel (05s/06s or 23s/24s). Highest capacity in scope. 15/33 exceptional only.
CYUL06L/24R primary. 10/28 crosswind runway.
CYYCParallel 17L/R or 35L/R. Single-runway configs for low traffic.
CYWG18/36 or 13/31. Single-runway operations typical.

13. Abbreviations

AbbrevMeaning
AARAirport Acceptance Rate (arrivals/hour)
ADRAirport Departure Rate (departures/hour)
A-CDMAirport Collaborative Decision Making
AIBTActual In-Block Time
ALDTActual Landing Time
AOBTActual Off-Block Time
ASATActual Start-Up Approval Time
ATOTActual Take-Off Time
AXOTActual Taxi-Out Time
AXITActual Taxi-In Time
CDMCollaborative Decision Making
CTOTCalculated Take-Off Time (= FAA EDCT)
EDCTExpected Departure Clearance Time (FAA term for CTOT)
ELDTEstimated Landing Time
EOBTEstimated Off-Block Time
EXOTEstimated Taxi-Out Time
EXITEstimated Taxi-In Time
FIRFlight Information Region
FMPFlow Management Position
GSGroundspeed
GRIBGRIdded Binary (weather data format)
HWHeadwind
ILSInstrument Landing System
LAHSOLand and Hold Short Operations
MAEMean Absolute Error
MATSManual of Air Traffic Services (NAV CANADA)
ROTRunway Occupancy Time
TASTrue Airspeed
TLDTTarget Landing Time (frozen ELDT)
TOBTTarget Off-Block Time
TSATTarget Start-Up Approval Time
TTOTTarget Take-Off Time
XWCrosswind