Getting started
TART turns a raw telemetry export into an understanding of how your spacecraft behaved. It analyses files you upload. It never commands, never schedules, and never connects to a spacecraft.
You need three things. Only the first is mandatory to see something useful.
| What it is | Without it | |
|---|---|---|
| 1. Telemetry file | Your export, in whatever format your ground segment produces | Nothing works |
| 2. Dictionary | One row per parameter, saying what each one means | TART knows names and nothing else |
| 3. Satellite configuration | Orbital elements for your spacecraft | No ground track, no eclipse, no reference comparison |
Start with the file. Add the other two when you want more.
Step 1 — Import your telemetry file
Upload the export exactly as your ground segment produced it. Do not clean it first: the gaps, duplicates and out-of-order rows are information about your ground station, and TART counts every one rather than quietly discarding it.
One hard requirement: every reading needs a timestamp. TART is built around time, and a file without it cannot be analysed. If your export carries only sample indices, it will not work here.
Three timestamps, not one. TART distinguishes:
receipt— when the ground station received itonboard— when the spacecraft's own clock recorded itmeasure— when the measurement was actually taken
These are rarely the same. A reading buffered before downlink arrives labelled later than the moment it describes. TART never assumes they agree, and every analysis declares which axis it read. If your file only has receipt time — most do — TART says so on every result rather than letting you forget.
What you get immediately
The overview appears the moment the import finishes, before you configure anything:
- How many samples, over how many days, in how many contacts
- Every parameter name, how much data each carries, and what type it looks like
- Which days delivered nothing at all
- Everything the reader excluded, and why
Nothing here is guessed. If TART has not been told what a parameter means, it says so instead of inventing a unit.
Step 2 — The dictionary
This is the part that makes TART yours. It is a spreadsheet with one row per parameter, keyed by the parameter name exactly as it appears in your file.
There is no alias list and no hidden mapping table. The dictionary is the mapping, and you own it.
Get a draft, do not start blank
TART reads your file and writes a draft dictionary with one row per parameter,
ordered by how much data each carries. name and data_type are already filled
in from observation. Everything else is yours.
Fill in the top rows first — in most exports a small number of parameters account for nearly all the data.
The columns
Required
| Column | |
|---|---|
name |
The parameter name exactly as it appears in your file. Character for character. |
data_type |
How to read the value: float, int, bool, enum, string. |
Optional, and each one buys something
| Column | What it buys |
|---|---|
display_name |
A readable label on plots and findings. Defaults to name. |
subsystem |
Groups the parameter in the overview and on the dial. Defaults to Unassigned. |
unit |
The unit as recorded in your file — mV, mA, degC, count. Not the unit you wish it were. |
valid_min / valid_max |
Physically impossible boundaries. |
nominal |
Normal operating value or range. |
alarm |
Genuinely bad value or range. |
is_counter |
TRUE if the value only rises until it wraps or resets. |
sampling_interval_s |
Expected seconds between samples. |
time_source |
Which clock the timestamp came from. |
standard_id |
The highest-value column here. See below. |
description |
What it actually measures, in your words. |
Conditional
| Column | When required |
|---|---|
limit_source |
Required if nominal or alarm is filled. One of observed, client_spec, datasheet, derived. |
counter_bits |
Required if is_counter is TRUE. 16 means the counter wraps at 65535. |
Three kinds of boundary, and they are not interchangeable
This is the single most misunderstood part, and getting it wrong makes TART lie to you.
valid_min / valid_max — physically impossible. A reading outside these
is corrupt. TART excludes it from every average and counts it. Use these for
sentinel values and sensor faults: a battery reporting 65535 mV is not a high
reading, it is 0xFFFF meaning "no data".
nominal — normal operation. Drawn as a band behind the data. Outside it is
interesting, not wrong.
alarm — genuinely bad, but a real reading. The value happened. It is
included in every calculation and flagged.
A corrupt reading is excluded. A bad reading is kept and reported. Confusing the two either hides real faults or poisons your averages with sentinels.
Where your limits came from matters
limit_source is required whenever you fill in a limit, because TART renders
them differently.
A limit marked observed — derived from watching the data — is drawn dashed
and labelled provisional, never as a red alarm line. The widest value you have
seen is not the widest value possible, and a month of observation during an
unusual period would otherwise bless abnormal behaviour as normal.
Limits from a datasheet or a specification are drawn as real limits.
TART will never fill these in for you from observed data. That is deliberate.
`standard_id` — what unlocks the prebuilt analyses
TART ships analyses that work on any spacecraft. They can, because they never name your parameters — they name a standard id, and you say once which of your parameters that is.
your name standard_id
Pcu.Battery1.VTotalPcuSide -> BAT1_VOLTAGE
Pick from the dropdown in the template. Filling it in is optional: a parameter without one still ingests, still plots, and can still drive an analysis you write yourself. It simply does not unlock the prebuilt ones.
The mapping view shows how far you have got, which analyses are ready, and which single parameter would unlock the most if you mapped it next. It also suggests candidates from your own file — as suggestions only. TART never writes a mapping. Where several parameters match equally well, it says so and chooses none, because a wrong mapping is worse than no mapping.
Status values
For enum parameters, use the second sheet to say what each value means, and which values are valid. A value your dictionary does not declare is treated as corrupt, not as an unknown state.
Step 3 — Satellite configuration
Supply orbital elements (a TLE file) and TART computes its own reference:
- Ground track, altitude, latitude and longitude
- Sun vector
- Eclipse entry and exit, with both cylindrical and conical shadow models
This is what separates TART from a plotting tool. It does not read your spacecraft's reported position and believe it — it works out where the spacecraft actually was and compares.
Two things to know.
Accuracy is bounded by the elements, not by the code. A TLE gives roughly a kilometre of error at its epoch, growing one to three kilometres per day. Every result records how stale the element set was, so you can judge a disagreement rather than guess at it.
Eclipse and display sampling are separate concerns. The penumbra on a low orbit lasts under ten seconds. If you sample eclipse state on a one-minute grid you will step straight over it. TART detects transitions on its own fine grid, independent of how you choose to plot.
Running analyses
Choose analyses from the catalog and run them. Each is a declarative spec, not code, which is why adding one is a configuration change.
Every analysis is one of five archetypes:
| RefCompare | Measured against a computed reference, with the error |
| WindowStats | Statistics over a window, optionally split day/night |
| Cumulative | Day-by-day accumulation, with reset and rollover detection |
| HealthFlags | Flags against expected state |
| Event-Based | Anchored on events rather than a fixed grid |
An analysis whose inputs are not in your file is reported as not applicable — not as a failure, and not silently dropped. Nothing is broken; that analysis simply describes telemetry your spacecraft does not send.
Reading a result
Every result carries four things.
Findings — statements in plain language, at three levels: info, notable, concern. A plot without a statement is a plotting tool.
Counts — every sample that went in, was used, was excluded and why. These always reconcile. If 8,000 samples went in and 7,200 were used, the result tells you where the other 800 went.
Caveats — anything about the data itself that bears on this analysis. The receipt-time limitation, corrupt readings, coverage gaps. Attached automatically to any analysis that read an affected parameter, at the top where they cannot be missed.
Provenance — dataset identity and checksum, adapter version, dictionary source, spec version, physical core version, and the element-set epoch distance where a reference was used. Enough to reproduce the number exactly, or to explain why a rerun differs.
Data quality
TART assesses your data before running any analysis, and only for parameters you have described — a row with a name and nothing else supplies no standard to judge by.
Per parameter: sample count, corrupt readings, unreadable values, type consistency, distinct values, cadence, and either gaps or coverage.
The distinction matters. TART reports a gap only against a
sampling_interval_s you declared. Without one it reports coverage — contacts,
longest silence, covered fraction — and states that the gap count is not
assessable. Measuring gaps against an inferred cadence would report every
contact boundary as a fault, which is noise dressed as diagnosis.
Custom analysis
Pick parameters, plot them, choose the axes. X defaults to time but does not have to be.
A custom analysis is a spec through the same engines as everything else — not a second code path — so it carries the same counts, caveats and provenance as a prebuilt one.
Export
Any result exports as a self-contained HTML file: no network, no external assets, opens anywhere. Provenance travels with it, so a report forwarded to a colleague still says exactly what produced it.
What TART will not do
Worth knowing up front, because each is deliberate.
- It will not guess a parameter name. A name that does not match your dictionary character for character is reported as unmapped, never matched to something similar.
- It will not invent limits. Not from observed range, not from a similar parameter, not from a datasheet it has not been shown.
- It will not silently drop data. Every exclusion, coercion, deduplication and interpolation is counted and reported. Missing data is information about your spacecraft.
- It will not present a guess as a measurement. Where several answers fit equally well, it shows them all and chooses none.
- It will not command your spacecraft. TART analyses files. It has no path to a vehicle.