diff --git a/scripts/online_reco.py b/scripts/online_reco.py
index 5cdf2d3e183a424a07040b7353951ba81f734be0..44a9e09b9308b489e77cd336d1e53e992d98fbd6 100644
--- a/scripts/online_reco.py
+++ b/scripts/online_reco.py
@@ -18,19 +18,45 @@ Options:
 
 """
 from collections import deque
+import time
+import threading
+import numpy as np
+import matplotlib
+matplotlib.use("Agg")
+import matplotlib.pyplot as plt
 import km3pipe as kp
+import km3pipe.style
+
+km3pipe.style.use('km3pipe')
 
 
 class ZenithDistribution(kp.Module):
     def configure(self):
+        self.plots_path = self.require('plots_path')
         self.max_events = 1000
-        self.zeniths = deque(maxlen=1000)
+        self.thetas = deque(maxlen=1000)
+        self.interval = 60
+        threading.Thread(target=self.plot).start()
 
     def process(self, blob):
-        print(blob.keys())
-        print(blob['RecoTrack'])
+        track = blob['RecoTrack']
+        theta = np.rad2deg(
+            kp.math.angle_between([0, 0, -1], [track.dx, track.dy, track.dz]))
+        self.thetas.append(theta)
         return blob
 
+    def plot(self):
+        while True:
+            time.sleep(self.interval)
+            self.create_plot()
+
+    def create_plot(self):
+        fig, ax = plt.subplots(figsize=(16, 4))
+        plt.histogram(self.thetas, bins=180)
+        filename = join(self.plots_path, 'track_reco.png')
+        plt.savefig(filename, dpi=120, bbox_inches="tight")
+        plt.close('all')
+
 
 def main():
     from docopt import docopt
@@ -47,8 +73,7 @@ def main():
         port=ligier_port,
         tags='IO_OLINE',
         timeout=60 * 60 * 24 * 7,
-        max_queue=2000
-    )
+        max_queue=2000)
     pipe.attach(kp.io.daq.DAQProcessor)
     pipe.attach(ZenithDistribution, plots_path=plots_path)
     pipe.drain()