diff --git a/stonesoup/metricgenerator/tracktotruthmetrics.py b/stonesoup/metricgenerator/tracktotruthmetrics.py
index d076e4d2..0ac1edca 100644
--- a/stonesoup/metricgenerator/tracktotruthmetrics.py
+++ b/stonesoup/metricgenerator/tracktotruthmetrics.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 import datetime
+import warnings
 from operator import attrgetter
 
 import numpy as np
@@ -48,6 +49,16 @@ class SIAPMetrics(MetricGenerator):
                    self.LS(manager)]
         return metrics
 
+    @staticmethod
+    def _warn_no_truth(manager):
+        if len(manager.groundtruth_paths) == 0:
+            warnings.warn("No truth to generate SIAP Metric", stacklevel=2)
+
+    @staticmethod
+    def _warn_no_tracks(manager):
+        if len(manager.tracks) == 0:
+            warnings.warn("No tracks to generate SIAP Metric", stacklevel=2)
+
     def C_single_time(self, manager, timestamp):
         r"""SIAP metric C at a specific time
 
@@ -126,8 +137,12 @@ class SIAPMetrics(MetricGenerator):
         """
 
         timestamps = manager.list_timestamps()
-        C = self._jt_sum(manager, timestamps) / self._j_sum(
-            manager, timestamps)
+        try:
+            C = self._jt_sum(manager, timestamps) / self._j_sum(
+                manager, timestamps)
+        except ZeroDivisionError:
+            self._warn_no_truth(manager)
+            C = 0
         return TimeRangeMetric(
             title="SIAP C",
             value=C,
@@ -165,8 +180,12 @@ class SIAPMetrics(MetricGenerator):
         """
 
         timestamps = manager.list_timestamps()
-        A = self._na_sum(manager, timestamps) / self._jt_sum(
-            manager, timestamps)
+        try:
+            A = self._na_sum(manager, timestamps) / self._jt_sum(manager, timestamps)
+        except ZeroDivisionError:
+            self._warn_no_truth(manager)
+            self._warn_no_tracks(manager)
+            A = 0
         return TimeRangeMetric(
             title="SIAP A",
             value=A,
@@ -207,7 +226,11 @@ class SIAPMetrics(MetricGenerator):
             self._n_t(manager, timestamp) - self._na_t(manager, timestamp)
             for timestamp in timestamps)
 
-        S = numerator / self._n_sum(manager, timestamps)
+        try:
+            S = numerator / self._n_sum(manager, timestamps)
+        except ZeroDivisionError:
+            self._warn_no_tracks(manager)
+            S = 0
         return TimeRangeMetric(
             title="SIAP S",
             value=S,
@@ -234,6 +257,8 @@ class SIAPMetrics(MetricGenerator):
         r = self._r(manager)
         if r == 0:
             value = np.inf
+            self._warn_no_truth(manager)
+            self._warn_no_tracks(manager)
         else:
             value = 1 / r
 
@@ -277,9 +302,14 @@ class SIAPMetrics(MetricGenerator):
                           for truth in manager.groundtruth_paths)
 
         timestamps = manager.list_timestamps()
+        try:
+            LS = numerator / denominator
+        except ZeroDivisionError:
+            self._warn_no_truth(manager)
+            LS = 0
         return TimeRangeMetric(
             title="SIAP LS",
-            value=numerator / denominator,
+            value=LS,
             time_range=TimeRange(min(timestamps), max(timestamps)),
             generator=self)
 
@@ -571,7 +601,11 @@ class SIAPMetrics(MetricGenerator):
                         for truth in manager.groundtruth_paths)
         denominator = sum(self._tt_j(manager, truth).total_seconds()
                           for truth in manager.groundtruth_paths)
-        return numerator / denominator
+        try:
+            return numerator / denominator
+        except ZeroDivisionError:
+            # No truth or tracks
+            return 0
 
     def _t_j(self, truth):
         """Total time truth exists for

self.metric_manager.generate_metrics() : ZeroDivisionError: division by zero
Probably my data, however FYI.

```
  File "lib\_mot\mot.py", line 302, in run
    self.metrics_generate()
  File "lib\_mot\mot.py", line 253, in metrics_generate
    self.metrics = self.metric_manager.generate_metrics()
  File "C:\g\testapp\lib\lib\site-packages\stonesoup\metricgenerator\manager.py", line 87, in generate_metrics
    metric = generator.compute_metric(self)
  File "C:\g\testapp\lib\lib\site-packages\stonesoup\metricgenerator\tracktotruthmetrics.py", line 45, in compute_metric
    self.A_time_range(manager),
  File "C:\g\testapp\lib\lib\site-packages\stonesoup\metricgenerator\tracktotruthmetrics.py", line 169, in A_time_range
    manager, timestamps)
ZeroDivisionError: division by zero
```
diff --git a/stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py b/stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py
index e7a3df90..6fc0c9ea 100644
--- a/stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py
+++ b/stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py
@@ -1,5 +1,7 @@
 import datetime
 
+import pytest
+
 from ..tracktotruthmetrics import SIAPMetrics
 from ...types.association import TimeRangeAssociation, AssociationSet
 from ...types.track import Track
@@ -271,7 +273,6 @@ def test_compute_metric():
     track9 = Track(
         states=[State([[9]], timestamp=tstart + datetime.timedelta(seconds=i))
                 for i in range(35, 40)])
-    manager.groundtruth_paths = truth
     manager.tracks = {track1, track2, track3, track4, track5, track6, track7,
                       track8, track9}
     manager.groundtruth_paths = {truth}
@@ -330,3 +331,77 @@ def test_compute_metric():
     assert ls.time_range.start_timestamp == tstart
     assert ls.time_range.end_timestamp == tend
     assert ls.generator == generator
+
+
+def test_no_truth_divide_by_zero():
+    manager = SimpleManager()
+    generator = SIAPMetrics()
+    # Create truth, tracks and associations, same as test_nu_j
+    tstart = datetime.datetime.now()
+    track1 = Track(
+        states=[State([[1]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(3)])
+    track2 = Track(
+        states=[State([[2]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(5, 10)])
+    track3 = Track(
+        states=[State([[3]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(7, 15)])
+    track4 = Track(
+        states=[State([[4]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(13, 20)])
+    track5 = Track(
+        states=[State([[5]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(18, 28)])
+    track6 = Track(
+        states=[State([[6]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(22, 26)])
+    track7 = Track(
+        states=[State([[7]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(30, 40)])
+    track8 = Track(
+        states=[State([[8]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(30, 35)])
+    track9 = Track(
+        states=[State([[9]], timestamp=tstart + datetime.timedelta(seconds=i))
+                for i in range(35, 40)])
+    manager.tracks = {track1, track2, track3, track4, track5, track6, track7,
+                      track8, track9}
+    manager.groundtruth_paths = set()
+    associations = {TimeRangeAssociation({track}, time_range=TimeRange(
+        start_timestamp=min([state.timestamp for state in track.states]),
+        end_timestamp=max([state.timestamp for state in track.states])))
+                    for track in manager.tracks}
+    manager.association_set = AssociationSet(associations)
+
+    with pytest.warns(UserWarning) as warning:
+        metrics = generator.compute_metric(manager)
+
+    assert warning[0].message.args[0] == "No truth to generate SIAP Metric"
+
+    assert len(metrics) == 5
+
+
+def test_no_track_divide_by_zero():
+    manager = SimpleManager()
+    generator = SIAPMetrics()
+    # Create truth, tracks and associations, same as test_nu_j
+    tstart = datetime.datetime.now()
+    truth = GroundTruthPath(states=[
+        GroundTruthState([[1]], timestamp=tstart + datetime.timedelta(
+            seconds=i))
+        for i in range(40)])
+    manager.tracks = set()
+    manager.groundtruth_paths = {truth}
+    associations = {TimeRangeAssociation({truth}, time_range=TimeRange(
+        start_timestamp=min([state.timestamp for state in track.states]),
+        end_timestamp=max([state.timestamp for state in track.states])))
+                    for track in manager.tracks}
+    manager.association_set = AssociationSet(associations)
+
+    with pytest.warns(UserWarning) as warning:
+        metrics = generator.compute_metric(manager)
+
+    assert warning[0].message.args[0] == "No tracks to generate SIAP Metric"
+
+    assert len(metrics) == 5

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-flake8 pytest-cov
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
babel==2.17.0
branca==0.8.1
certifi==2025.1.31
charset-normalizer==3.4.1
contourpy==1.3.0
coverage==7.8.0
cycler==0.12.1
docutils==0.21.2
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
flake8==7.2.0
folium==0.19.5
fonttools==4.56.0
idna==3.10
imagesize==1.4.1
importlib_metadata==8.6.1
importlib_resources==6.5.2
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.1.6
kiwisolver==1.4.7
MarkupSafe==3.0.2
matplotlib==3.9.4
mccabe==0.7.0
numpy==2.0.2
packaging @ file:///croot/packaging_1734472117206/work
pillow==11.1.0
pluggy @ file:///croot/pluggy_1733169602837/work
pycodestyle==2.13.0
pyflakes==3.3.2
Pygments==2.19.1
pymap3d==3.1.0
pyparsing==3.2.3
pytest @ file:///croot/pytest_1738938843180/work
pytest-cov==6.0.0
pytest-flake8==1.3.0
python-dateutil==2.9.0.post0
requests==2.32.3
ruamel.yaml==0.18.10
ruamel.yaml.clib==0.2.12
scipy==1.13.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==7.4.7
sphinx-gallery==0.19.0
sphinx-rtd-theme==3.0.2
sphinxcontrib-applehelp==2.0.0
sphinxcontrib-devhelp==2.0.0
sphinxcontrib-htmlhelp==2.1.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
-e git+https://github.com/dstl/Stone-Soup.git@1bf38717a65d21044480c1da4625be243c7d1b5a#egg=stonesoup
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
urllib3==2.3.0
utm==0.8.1
xyzservices==2025.1.0
zipp==3.21.0

name: Stone-Soup
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - babel==2.17.0
      - branca==0.8.1
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - contourpy==1.3.0
      - coverage==7.8.0
      - cycler==0.12.1
      - docutils==0.21.2
      - flake8==7.2.0
      - folium==0.19.5
      - fonttools==4.56.0
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.6.1
      - importlib-resources==6.5.2
      - jinja2==3.1.6
      - kiwisolver==1.4.7
      - markupsafe==3.0.2
      - matplotlib==3.9.4
      - mccabe==0.7.0
      - numpy==2.0.2
      - pillow==11.1.0
      - pycodestyle==2.13.0
      - pyflakes==3.3.2
      - pygments==2.19.1
      - pymap3d==3.1.0
      - pyparsing==3.2.3
      - pytest-cov==6.0.0
      - pytest-flake8==1.3.0
      - python-dateutil==2.9.0.post0
      - requests==2.32.3
      - ruamel-yaml==0.18.10
      - ruamel-yaml-clib==0.2.12
      - scipy==1.13.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==7.4.7
      - sphinx-gallery==0.19.0
      - sphinx-rtd-theme==3.0.2
      - sphinxcontrib-applehelp==2.0.0
      - sphinxcontrib-devhelp==2.0.0
      - sphinxcontrib-htmlhelp==2.1.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==2.0.0
      - sphinxcontrib-serializinghtml==2.0.0
      - urllib3==2.3.0
      - utm==0.8.1
      - xyzservices==2025.1.0
      - zipp==3.21.0
prefix: /opt/conda/envs/Stone-Soup

stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_no_truth_divide_by_zero stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_no_track_divide_by_zero
stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_j_t stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_j_sum stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_jt stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test__na stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_n stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_tt_j stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_nu_j stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_t_j stonesoup/metricgenerator/tests/test_tracktotruthmetrics.py::test_compute_metric
stonesoup/metricgenerator/tracktotruthmetrics.py
stonesoup/metricgenerator/tracktotruthmetrics.py