Index: framspy/evolalg/base/union_step.py
===================================================================
--- framspy/evolalg/base/union_step.py	(revision 1145)
+++ framspy/evolalg/base/union_step.py	(revision 1146)
@@ -12,4 +12,9 @@
             self.steps = [steps]
 
+    def init(self):
+        for s in self.steps:
+            if isinstance(s, Step):
+                s.init()
+
     def call(self, population):
         super(UnionStep, self).call(population)
Index: framspy/evolalg/examples/niching_novelty.py
===================================================================
--- framspy/evolalg/examples/niching_novelty.py	(revision 1145)
+++ framspy/evolalg/examples/niching_novelty.py	(revision 1146)
@@ -141,14 +141,14 @@
 
 
+def func_raw(ind): setattr(ind, "fitness", ind.fitness_raw)
+
+
+def func_novelty(ind): setattr(ind, "fitness", ind.dissim)
+
+
+def func_knn_novelty(ind): setattr(ind, "fitness", ind.dissim)
+
+
 def func_niching(ind): setattr(ind, "fitness", ind.fitness_raw * (1 + ind.dissim))
-
-
-def func_raw(ind): setattr(ind, "fitness", ind.fitness_raw)
-
-
-def func_novelty(ind): setattr(ind, "fitness", ind.dissim)
-
-
-def func_knn_novelty(ind): setattr(ind, "fitness", ind.dissim)
 
 
@@ -180,5 +180,5 @@
     new_generation_stages = [FramsCrossAndMutate(frams_lib, cross_prob=0.2, mutate_prob=0.9)]
 
-    # Steps after new population is created. Executed exacly once per generation.
+    # Steps after new population is created. Executed exactly once per generation.
     generation_modifications = []
 
@@ -245,5 +245,5 @@
         generation_modifications.append(raw)
 
-    if parsed_args.fit == Fitness.niching:
+    if parsed_args.fit == Fitness.niching: # TODO reduce redundancy in the four cases below: dictionary?
         niching = UnionStep([
             dissim,
@@ -297,5 +297,5 @@
 
     # -------------------------------------------------
-    # End stages: this will execute exacly once after all generations.
+    # End stages: this will execute exactly once after all generations.
     end_stages = [
         replace_with_hof,
Index: framspy/evolalg/examples/standard.py
===================================================================
--- framspy/evolalg/examples/standard.py	(revision 1145)
+++ framspy/evolalg/examples/standard.py	(revision 1146)
@@ -8,5 +8,5 @@
 # TODO add comments to all examples in this directory
 # TODO add to standard.py and steadystate.py evaluating each genotype in HOF N (configurable, default 20) times when the evolution ends, as it is in niching_novelty.py
-# TODO "--debug" mode, indent nested steps (pre++, post-- of a static counter?) and print their arguments so it is easy to see what happens during evolution
+# TODO "-debug" mode, indent nested steps (pre++, post-- of a static counter?) and print their arguments so it is easy to see what happens during evolution
 
 
@@ -80,10 +80,10 @@
     ])
 
-    fitness_remove = UnionStep(
+    fitness_remove = UnionStep(  # evaluate performance and fitness, rename some of the fields, and remove some performance fields that we get from Framsticks, but we don't need them here
         [
         FitnessStep(frams_lib, fields={"velocity": "fitness", "data->recording": "recording"},
                     fields_defaults={"velocity": None, "data->recording": None})  # custom definitions and handling
         if EVAL_LIFESPAN_BEHAVIOR else
-        FitnessStep(frams_lib, fields={parsed_args.opt: "fitness", }, fields_defaults={parsed_args.opt: None})
+        FitnessStep(frams_lib, fields={parsed_args.opt: "fitness"}, fields_defaults={parsed_args.opt: None})
         ]
         +
Index: framspy/evolalg/statistics/statistics_deap.py
===================================================================
--- framspy/evolalg/statistics/statistics_deap.py	(revision 1145)
+++ framspy/evolalg/statistics/statistics_deap.py	(revision 1146)
@@ -26,2 +26,7 @@
         if self.verbose:
             print(self.logbook.stream)
+
+    def compile(self, data):
+        return self.stats.compile(data)
+
+
