diff --git a/enstools/feature/identification/_proto_gen/african_easterly_waves_pb2.py b/enstools/feature/identification/_proto_gen/african_easterly_waves_pb2.py
index 1951363f5a2a204cf91c6176e018a44a53fe3bdf..bd45a72bbdcb4ef1cebf4a3efc37b22f848826f2 100644
--- a/enstools/feature/identification/_proto_gen/african_easterly_waves_pb2.py
+++ b/enstools/feature/identification/_proto_gen/african_easterly_waves_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: tmpo5hidrpg
+# source: tmpk72e7pki
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,10 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpo5hidrpg\"(\n\x0cLatLonPoints\x12\x0b\n\x03lat\x18\x01 \x01(\x02\x12\x0b\n\x03lon\x18\x02 \x01(\x02\"E\n\x0b\x42oundingBox\x12\x1a\n\x03min\x18\x01 \x01(\x0b\x32\r.LatLonPoints\x12\x1a\n\x03max\x18\x02 \x01(\x0b\x32\r.LatLonPoints\"[\n\nProperties\x12\x1f\n\x08line_pts\x18\x01 \x03(\x0b\x32\r.LatLonPoints\x12\x18\n\x02\x62\x62\x18\x02 \x01(\x0b\x32\x0c.BoundingBox\x12\x12\n\nlength_deg\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpk72e7pki\"(\n\x0cLatLonPoints\x12\x0b\n\x03lat\x18\x01 \x01(\x02\x12\x0b\n\x03lon\x18\x02 \x01(\x02\"E\n\x0b\x42oundingBox\x12\x1a\n\x03min\x18\x01 \x01(\x0b\x32\r.LatLonPoints\x12\x1a\n\x03max\x18\x02 \x01(\x0b\x32\r.LatLonPoints\"[\n\nProperties\x12\x1f\n\x08line_pts\x18\x01 \x03(\x0b\x32\r.LatLonPoints\x12\x18\n\x02\x62\x62\x18\x02 \x01(\x0b\x32\x0c.BoundingBox\x12\x12\n\nlength_deg\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpo5hidrpg_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpk72e7pki_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -45,11 +45,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=728
   _OBJECTGRAPH._serialized_end=774
   _OBJECT._serialized_start=777
-  _OBJECT._serialized_end=957
-  _TIMESTEP._serialized_start=959
-  _TIMESTEP._serialized_end=1015
-  _TRACKABLESET._serialized_start=1018
-  _TRACKABLESET._serialized_end=1171
-  _DATASETDESCRIPTION._serialized_start=1173
-  _DATASETDESCRIPTION._serialized_end=1268
+  _OBJECT._serialized_end=971
+  _TIMESTEP._serialized_start=973
+  _TIMESTEP._serialized_end=1029
+  _TRACKABLESET._serialized_start=1032
+  _TRACKABLESET._serialized_end=1185
+  _DATASETDESCRIPTION._serialized_start=1187
+  _DATASETDESCRIPTION._serialized_end=1282
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/_proto_gen/overlap_example_pb2.py b/enstools/feature/identification/_proto_gen/overlap_example_pb2.py
index b6eff5aa19b5c1b6beb24f0574035397783c12f3..1dc65f74ab9611a9ce441e7d59d5817baf325233 100644
--- a/enstools/feature/identification/_proto_gen/overlap_example_pb2.py
+++ b/enstools/feature/identification/_proto_gen/overlap_example_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: tmp1d24z_3j
+# source: tmpsoxyup23
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,10 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmp1d24z_3j\"P\n\nProperties\x12\x19\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\x07.Vector\x12\x0c\n\x04size\x18\x02 \x01(\x05\x12\x19\n\x11list_of_something\x18\x03 \x03(\t\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x02(\x02\x12\t\n\x01y\x18\x02 \x02(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpsoxyup23\"P\n\nProperties\x12\x19\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\x07.Vector\x12\x0c\n\x04size\x18\x02 \x01(\x05\x12\x19\n\x11list_of_something\x18\x03 \x03(\t\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x02(\x02\x12\t\n\x01y\x18\x02 \x02(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmp1d24z_3j_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpsoxyup23_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -43,11 +43,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=647
   _OBJECTGRAPH._serialized_end=693
   _OBJECT._serialized_start=696
-  _OBJECT._serialized_end=876
-  _TIMESTEP._serialized_start=878
-  _TIMESTEP._serialized_end=934
-  _TRACKABLESET._serialized_start=937
-  _TRACKABLESET._serialized_end=1090
-  _DATASETDESCRIPTION._serialized_start=1092
-  _DATASETDESCRIPTION._serialized_end=1187
+  _OBJECT._serialized_end=890
+  _TIMESTEP._serialized_start=892
+  _TIMESTEP._serialized_end=948
+  _TRACKABLESET._serialized_start=951
+  _TRACKABLESET._serialized_end=1104
+  _DATASETDESCRIPTION._serialized_start=1106
+  _DATASETDESCRIPTION._serialized_end=1201
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/_proto_gen/pv_streamer_pb2.py b/enstools/feature/identification/_proto_gen/pv_streamer_pb2.py
index 70777d52619003318ceaee3f9fb1cda9039c4143..a52dcb409d3a928bc20e49a0170919f05f5e9135 100644
--- a/enstools/feature/identification/_proto_gen/pv_streamer_pb2.py
+++ b/enstools/feature/identification/_proto_gen/pv_streamer_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: tmpn63nnypr
+# source: tmpej52ncue
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,10 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpn63nnypr\"4\n\tVectorGeo\x12\r\n\x05level\x18\x64 \x01(\x02\x12\x0b\n\x03lat\x18\x65 \x01(\x02\x12\x0b\n\x03lon\x18\x66 \x01(\x02\")\n\x06Vector\x12\t\n\x01z\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01x\x18\x03 \x01(\x02\"\xf6\x02\n\nProperties\x12\x1c\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\n.VectorGeo\x12\x12\n\nvolume_km3\x18\x02 \x01(\x02\x12\x13\n\x0bvolume_km2K\x18\x03 \x01(\x02\x12\x10\n\x08\x61rea_km2\x18\x04 \x01(\x02\x12\x1c\n\x08min_bbox\x18\x05 \x01(\x0b\x32\n.VectorGeo\x12\x1c\n\x08max_bbox\x18\x06 \x01(\x0b\x32\n.VectorGeo\x12\x0e\n\x06max_pv\x18\x07 \x01(\x02\x12\x0e\n\x06\x61vg_pv\x18\x08 \x01(\x02\x12\x11\n\tis_cutoff\x18\t \x01(\x08\x12\x0e\n\x06length\x18\n \x01(\x02\x12\x14\n\x0clength_ratio\x18\x0b \x01(\x02\x12\x1b\n\nmajor_axis\x18\x0c \x01(\x0b\x32\x07.Vector\x12\x1c\n\x0bmedium_axis\x18\r \x01(\x0b\x32\x07.Vector\x12\x1b\n\nminor_axis\x18\x0e \x01(\x0b\x32\x07.Vector\x12\"\n\x1amajor_axis_orientation_deg\x18\x0f \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpej52ncue\"4\n\tVectorGeo\x12\r\n\x05level\x18\x64 \x01(\x02\x12\x0b\n\x03lat\x18\x65 \x01(\x02\x12\x0b\n\x03lon\x18\x66 \x01(\x02\")\n\x06Vector\x12\t\n\x01z\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01x\x18\x03 \x01(\x02\"\xf6\x02\n\nProperties\x12\x1c\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\n.VectorGeo\x12\x12\n\nvolume_km3\x18\x02 \x01(\x02\x12\x13\n\x0bvolume_km2K\x18\x03 \x01(\x02\x12\x10\n\x08\x61rea_km2\x18\x04 \x01(\x02\x12\x1c\n\x08min_bbox\x18\x05 \x01(\x0b\x32\n.VectorGeo\x12\x1c\n\x08max_bbox\x18\x06 \x01(\x0b\x32\n.VectorGeo\x12\x0e\n\x06max_pv\x18\x07 \x01(\x02\x12\x0e\n\x06\x61vg_pv\x18\x08 \x01(\x02\x12\x11\n\tis_cutoff\x18\t \x01(\x08\x12\x0e\n\x06length\x18\n \x01(\x02\x12\x14\n\x0clength_ratio\x18\x0b \x01(\x02\x12\x1b\n\nmajor_axis\x18\x0c \x01(\x0b\x32\x07.Vector\x12\x1c\n\x0bmedium_axis\x18\r \x01(\x0b\x32\x07.Vector\x12\x1b\n\nminor_axis\x18\x0e \x01(\x0b\x32\x07.Vector\x12\"\n\x1amajor_axis_orientation_deg\x18\x0f \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpn63nnypr_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpej52ncue_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -45,11 +45,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=996
   _OBJECTGRAPH._serialized_end=1042
   _OBJECT._serialized_start=1045
-  _OBJECT._serialized_end=1225
-  _TIMESTEP._serialized_start=1227
-  _TIMESTEP._serialized_end=1283
-  _TRACKABLESET._serialized_start=1286
-  _TRACKABLESET._serialized_end=1439
-  _DATASETDESCRIPTION._serialized_start=1441
-  _DATASETDESCRIPTION._serialized_end=1536
+  _OBJECT._serialized_end=1239
+  _TIMESTEP._serialized_start=1241
+  _TIMESTEP._serialized_end=1297
+  _TRACKABLESET._serialized_start=1300
+  _TRACKABLESET._serialized_end=1453
+  _DATASETDESCRIPTION._serialized_start=1455
+  _DATASETDESCRIPTION._serialized_end=1550
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/_proto_gen/storm_pb2.py b/enstools/feature/identification/_proto_gen/storm_pb2.py
index e8a244db659c12a27203cc927dcad8c6b5bd28b4..cd1cdde939e873066fa411059fc574a8d759f6b8 100644
--- a/enstools/feature/identification/_proto_gen/storm_pb2.py
+++ b/enstools/feature/identification/_proto_gen/storm_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: tmpz751s9fm
+# source: tmptzdfrp83
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,10 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpz751s9fm\"\x1f\n\x03Pos\x12\x0b\n\x03lat\x18\x01 \x02(\x02\x12\x0b\n\x03lon\x18\x02 \x02(\x02\"B\n\nProperties\x12\x14\n\x0cmin_pressure\x18\x01 \x02(\x02\x12\x1e\n\x10min_pressure_pos\x18\x02 \x02(\x0b\x32\x04.Pos\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmptzdfrp83\"\x1f\n\x03Pos\x12\x0b\n\x03lat\x18\x01 \x02(\x02\x12\x0b\n\x03lon\x18\x02 \x02(\x02\"B\n\nProperties\x12\x14\n\x0cmin_pressure\x18\x01 \x02(\x02\x12\x1e\n\x10min_pressure_pos\x18\x02 \x02(\x0b\x32\x04.Pos\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpz751s9fm_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmptzdfrp83_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -43,11 +43,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=623
   _OBJECTGRAPH._serialized_end=669
   _OBJECT._serialized_start=672
-  _OBJECT._serialized_end=852
-  _TIMESTEP._serialized_start=854
-  _TIMESTEP._serialized_end=910
-  _TRACKABLESET._serialized_start=913
-  _TRACKABLESET._serialized_end=1066
-  _DATASETDESCRIPTION._serialized_start=1068
-  _DATASETDESCRIPTION._serialized_end=1163
+  _OBJECT._serialized_end=866
+  _TIMESTEP._serialized_start=868
+  _TIMESTEP._serialized_end=924
+  _TRACKABLESET._serialized_start=927
+  _TRACKABLESET._serialized_end=1080
+  _DATASETDESCRIPTION._serialized_start=1082
+  _DATASETDESCRIPTION._serialized_end=1177
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/_proto_gen/template_pb2.py b/enstools/feature/identification/_proto_gen/template_pb2.py
index 35b2a6f5696e41da0f2d420013a3c007311f2e7f..86d1e7729b81b134c7ea89af353f4b410d891410 100644
--- a/enstools/feature/identification/_proto_gen/template_pb2.py
+++ b/enstools/feature/identification/_proto_gen/template_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: tmpqxin01s0
+# source: tmpfirnhda7
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,10 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpqxin01s0\"P\n\nProperties\x12\x19\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\x07.Vector\x12\x0c\n\x04size\x18\x02 \x01(\x05\x12\x19\n\x11list_of_something\x18\x03 \x03(\t\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x02(\x02\x12\t\n\x01y\x18\x02 \x02(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpfirnhda7\"P\n\nProperties\x12\x19\n\x08\x63\x65ntroid\x18\x01 \x01(\x0b\x32\x07.Vector\x12\x0c\n\x04size\x18\x02 \x01(\x05\x12\x19\n\x11list_of_something\x18\x03 \x03(\t\")\n\x06Vector\x12\t\n\x01x\x18\x01 \x02(\x02\x12\t\n\x01y\x18\x02 \x02(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpqxin01s0_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpfirnhda7_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -43,11 +43,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=647
   _OBJECTGRAPH._serialized_end=693
   _OBJECT._serialized_start=696
-  _OBJECT._serialized_end=876
-  _TIMESTEP._serialized_start=878
-  _TIMESTEP._serialized_end=934
-  _TRACKABLESET._serialized_start=937
-  _TRACKABLESET._serialized_end=1090
-  _DATASETDESCRIPTION._serialized_start=1092
-  _DATASETDESCRIPTION._serialized_end=1187
+  _OBJECT._serialized_end=890
+  _TIMESTEP._serialized_start=892
+  _TIMESTEP._serialized_end=948
+  _TRACKABLESET._serialized_start=951
+  _TRACKABLESET._serialized_end=1104
+  _DATASETDESCRIPTION._serialized_start=1106
+  _DATASETDESCRIPTION._serialized_end=1201
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/_proto_gen/threshold_pb2.py b/enstools/feature/identification/_proto_gen/threshold_pb2.py
index a3639bc8f713c39776a44aafe3805f67bd0b79ca..f3a9ec9b844eaec5dbf2bf174cf90c1e707eb371 100644
--- a/enstools/feature/identification/_proto_gen/threshold_pb2.py
+++ b/enstools/feature/identification/_proto_gen/threshold_pb2.py
@@ -1,10 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-<<<<<<< HEAD
-# source: tmpwdhwhb1j
-=======
-# source: tmpncjfrx7c
->>>>>>> origin/aew_kitweather
+# source: tmp8j7ak3eo
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -17,832 +13,10 @@ _sym_db = _symbol_database.Default()
 
 
 
-<<<<<<< HEAD
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmpwdhwhb1j\"6\n\tMaskArray\x12\r\n\x05shape\x18\x01 \x03(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x02(\x0c\x12\x0c\n\x04zlib\x18\x03 \x02(\x08\"u\n\nProperties\x12\x18\n\x04mask\x18\x01 \x02(\x0b\x32\n.MaskArray\x12\x17\n\x0fouter_threshold\x18\x02 \x02(\x02\x12\x17\n\x0finner_threshold\x18\x03 \x02(\x02\x12\x1b\n\x13\x63omparison_operator\x18\x04 \x02(\t\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
-=======
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='tmpncjfrx7c',
-  package='',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x0btmpncjfrx7c\"6\n\tMaskArray\x12\r\n\x05shape\x18\x01 \x03(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x02(\x0c\x12\x0c\n\x04zlib\x18\x03 \x02(\x08\"u\n\nProperties\x12\x18\n\x04mask\x18\x01 \x02(\x0b\x32\n.MaskArray\x12\x17\n\x0fouter_threshold\x18\x02 \x02(\x02\x12\x17\n\x0finner_threshold\x18\x03 \x02(\x02\x12\x1b\n\x13\x63omparison_operator\x18\x04 \x02(\t\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"I\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1a\n\x06\x63hilds\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xb4\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet'
-)
-
-
-
-
-_MASKARRAY = _descriptor.Descriptor(
-  name='MaskArray',
-  full_name='MaskArray',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='shape', full_name='MaskArray.shape', index=0,
-      number=1, type=5, cpp_type=1, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='MaskArray.data', index=1,
-      number=2, type=12, cpp_type=9, label=2,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='zlib', full_name='MaskArray.zlib', index=2,
-      number=3, type=8, cpp_type=7, label=2,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=15,
-  serialized_end=69,
-)
-
-
-_PROPERTIES = _descriptor.Descriptor(
-  name='Properties',
-  full_name='Properties',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='mask', full_name='Properties.mask', index=0,
-      number=1, type=11, cpp_type=10, label=2,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='outer_threshold', full_name='Properties.outer_threshold', index=1,
-      number=2, type=2, cpp_type=6, label=2,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inner_threshold', full_name='Properties.inner_threshold', index=2,
-      number=3, type=2, cpp_type=6, label=2,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='comparison_operator', full_name='Properties.comparison_operator', index=3,
-      number=4, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=71,
-  serialized_end=188,
-)
-
-
-_VOXELDATA = _descriptor.Descriptor(
-  name='VoxelData',
-  full_name='VoxelData',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='index', full_name='VoxelData.index', index=0,
-      number=1, type=13, cpp_type=3, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='VoxelData.value', index=1,
-      number=2, type=2, cpp_type=6, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=190,
-  serialized_end=231,
-)
-
-
-_VERTEXDATA = _descriptor.Descriptor(
-  name='VertexData',
-  full_name='VertexData',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='position', full_name='VertexData.position', index=0,
-      number=1, type=2, cpp_type=6, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='VertexData.value', index=1,
-      number=2, type=2, cpp_type=6, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=233,
-  serialized_end=278,
-)
-
-
-_FACEDATA = _descriptor.Descriptor(
-  name='FaceData',
-  full_name='FaceData',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='vertices', full_name='FaceData.vertices', index=0,
-      number=1, type=13, cpp_type=3, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='FaceData.value', index=1,
-      number=2, type=2, cpp_type=6, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=280,
-  serialized_end=323,
-)
-
-
-_VOXELREPRESENTATION = _descriptor.Descriptor(
-  name='VoxelRepresentation',
-  full_name='VoxelRepresentation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='desc', full_name='VoxelRepresentation.desc', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='voxel_data', full_name='VoxelRepresentation.voxel_data', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=325,
-  serialized_end=392,
-)
-
-
-_LINEREPRESENTATION = _descriptor.Descriptor(
-  name='LineRepresentation',
-  full_name='LineRepresentation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='desc', full_name='LineRepresentation.desc', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vertex_data', full_name='LineRepresentation.vertex_data', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=394,
-  serialized_end=462,
-)
-
-
-_BOUNDARYREPRESENTATION = _descriptor.Descriptor(
-  name='BoundaryRepresentation',
-  full_name='BoundaryRepresentation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='desc', full_name='BoundaryRepresentation.desc', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vertex_data', full_name='BoundaryRepresentation.vertex_data', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_data', full_name='BoundaryRepresentation.face_data', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=464,
-  serialized_end=566,
-)
-
-
-_GRAPHNODE = _descriptor.Descriptor(
-  name='GraphNode',
-  full_name='GraphNode',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='time', full_name='GraphNode.time', index=0,
-      number=1, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='object', full_name='GraphNode.object', index=1,
-      number=2, type=11, cpp_type=10, label=2,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=568,
-  serialized_end=618,
-)
-
-
-_GRAPHCONNECTION = _descriptor.Descriptor(
-  name='GraphConnection',
-  full_name='GraphConnection',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='parent', full_name='GraphConnection.parent', index=0,
-      number=1, type=11, cpp_type=10, label=2,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='childs', full_name='GraphConnection.childs', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=620,
-  serialized_end=693,
-)
-
-
-_OBJECTGRAPH = _descriptor.Descriptor(
-  name='ObjectGraph',
-  full_name='ObjectGraph',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='edges', full_name='ObjectGraph.edges', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=695,
-  serialized_end=741,
-)
-
-
-_OBJECT = _descriptor.Descriptor(
-  name='Object',
-  full_name='Object',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='Object.id', index=0,
-      number=1, type=5, cpp_type=1, label=2,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='line_rep', full_name='Object.line_rep', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='voxel_rep', full_name='Object.voxel_rep', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='boundary_rep', full_name='Object.boundary_rep', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='properties', full_name='Object.properties', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=744,
-  serialized_end=924,
-)
-
-
-_TIMESTEP = _descriptor.Descriptor(
-  name='Timestep',
-  full_name='Timestep',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='valid_time', full_name='Timestep.valid_time', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='objects', full_name='Timestep.objects', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=926,
-  serialized_end=982,
-)
-
-
-_TRACKABLESET = _descriptor.Descriptor(
-  name='TrackableSet',
-  full_name='TrackableSet',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='init_time', full_name='TrackableSet.init_time', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member', full_name='TrackableSet.member', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='level', full_name='TrackableSet.level', index=2,
-      number=3, type=2, cpp_type=6, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='timesteps', full_name='TrackableSet.timesteps', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='graph', full_name='TrackableSet.graph', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tracks', full_name='TrackableSet.tracks', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=985,
-  serialized_end=1138,
-)
-
-
-_DATASETDESCRIPTION = _descriptor.Descriptor(
-  name='DatasetDescription',
-  full_name='DatasetDescription',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='DatasetDescription.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file', full_name='DatasetDescription.file', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='run_time', full_name='DatasetDescription.run_time', index=2,
-      number=3, type=9, cpp_type=9, label=2,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sets', full_name='DatasetDescription.sets', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1140,
-  serialized_end=1235,
-)
-
-_PROPERTIES.fields_by_name['mask'].message_type = _MASKARRAY
-_VOXELREPRESENTATION.fields_by_name['voxel_data'].message_type = _VOXELDATA
-_LINEREPRESENTATION.fields_by_name['vertex_data'].message_type = _VERTEXDATA
-_BOUNDARYREPRESENTATION.fields_by_name['vertex_data'].message_type = _VERTEXDATA
-_BOUNDARYREPRESENTATION.fields_by_name['face_data'].message_type = _FACEDATA
-_GRAPHNODE.fields_by_name['object'].message_type = _OBJECT
-_GRAPHCONNECTION.fields_by_name['parent'].message_type = _GRAPHNODE
-_GRAPHCONNECTION.fields_by_name['childs'].message_type = _GRAPHNODE
-_OBJECTGRAPH.fields_by_name['edges'].message_type = _GRAPHCONNECTION
-_OBJECT.fields_by_name['line_rep'].message_type = _LINEREPRESENTATION
-_OBJECT.fields_by_name['voxel_rep'].message_type = _VOXELREPRESENTATION
-_OBJECT.fields_by_name['boundary_rep'].message_type = _BOUNDARYREPRESENTATION
-_OBJECT.fields_by_name['properties'].message_type = _PROPERTIES
-_TIMESTEP.fields_by_name['objects'].message_type = _OBJECT
-_TRACKABLESET.fields_by_name['timesteps'].message_type = _TIMESTEP
-_TRACKABLESET.fields_by_name['graph'].message_type = _OBJECTGRAPH
-_TRACKABLESET.fields_by_name['tracks'].message_type = _OBJECTGRAPH
-_DATASETDESCRIPTION.fields_by_name['sets'].message_type = _TRACKABLESET
-DESCRIPTOR.message_types_by_name['MaskArray'] = _MASKARRAY
-DESCRIPTOR.message_types_by_name['Properties'] = _PROPERTIES
-DESCRIPTOR.message_types_by_name['VoxelData'] = _VOXELDATA
-DESCRIPTOR.message_types_by_name['VertexData'] = _VERTEXDATA
-DESCRIPTOR.message_types_by_name['FaceData'] = _FACEDATA
-DESCRIPTOR.message_types_by_name['VoxelRepresentation'] = _VOXELREPRESENTATION
-DESCRIPTOR.message_types_by_name['LineRepresentation'] = _LINEREPRESENTATION
-DESCRIPTOR.message_types_by_name['BoundaryRepresentation'] = _BOUNDARYREPRESENTATION
-DESCRIPTOR.message_types_by_name['GraphNode'] = _GRAPHNODE
-DESCRIPTOR.message_types_by_name['GraphConnection'] = _GRAPHCONNECTION
-DESCRIPTOR.message_types_by_name['ObjectGraph'] = _OBJECTGRAPH
-DESCRIPTOR.message_types_by_name['Object'] = _OBJECT
-DESCRIPTOR.message_types_by_name['Timestep'] = _TIMESTEP
-DESCRIPTOR.message_types_by_name['TrackableSet'] = _TRACKABLESET
-DESCRIPTOR.message_types_by_name['DatasetDescription'] = _DATASETDESCRIPTION
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-MaskArray = _reflection.GeneratedProtocolMessageType('MaskArray', (_message.Message,), {
-  'DESCRIPTOR' : _MASKARRAY,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:MaskArray)
-  })
-_sym_db.RegisterMessage(MaskArray)
-
-Properties = _reflection.GeneratedProtocolMessageType('Properties', (_message.Message,), {
-  'DESCRIPTOR' : _PROPERTIES,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:Properties)
-  })
-_sym_db.RegisterMessage(Properties)
-
-VoxelData = _reflection.GeneratedProtocolMessageType('VoxelData', (_message.Message,), {
-  'DESCRIPTOR' : _VOXELDATA,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:VoxelData)
-  })
-_sym_db.RegisterMessage(VoxelData)
-
-VertexData = _reflection.GeneratedProtocolMessageType('VertexData', (_message.Message,), {
-  'DESCRIPTOR' : _VERTEXDATA,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:VertexData)
-  })
-_sym_db.RegisterMessage(VertexData)
-
-FaceData = _reflection.GeneratedProtocolMessageType('FaceData', (_message.Message,), {
-  'DESCRIPTOR' : _FACEDATA,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:FaceData)
-  })
-_sym_db.RegisterMessage(FaceData)
-
-VoxelRepresentation = _reflection.GeneratedProtocolMessageType('VoxelRepresentation', (_message.Message,), {
-  'DESCRIPTOR' : _VOXELREPRESENTATION,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:VoxelRepresentation)
-  })
-_sym_db.RegisterMessage(VoxelRepresentation)
-
-LineRepresentation = _reflection.GeneratedProtocolMessageType('LineRepresentation', (_message.Message,), {
-  'DESCRIPTOR' : _LINEREPRESENTATION,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:LineRepresentation)
-  })
-_sym_db.RegisterMessage(LineRepresentation)
-
-BoundaryRepresentation = _reflection.GeneratedProtocolMessageType('BoundaryRepresentation', (_message.Message,), {
-  'DESCRIPTOR' : _BOUNDARYREPRESENTATION,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:BoundaryRepresentation)
-  })
-_sym_db.RegisterMessage(BoundaryRepresentation)
-
-GraphNode = _reflection.GeneratedProtocolMessageType('GraphNode', (_message.Message,), {
-  'DESCRIPTOR' : _GRAPHNODE,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:GraphNode)
-  })
-_sym_db.RegisterMessage(GraphNode)
-
-GraphConnection = _reflection.GeneratedProtocolMessageType('GraphConnection', (_message.Message,), {
-  'DESCRIPTOR' : _GRAPHCONNECTION,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:GraphConnection)
-  })
-_sym_db.RegisterMessage(GraphConnection)
-
-ObjectGraph = _reflection.GeneratedProtocolMessageType('ObjectGraph', (_message.Message,), {
-  'DESCRIPTOR' : _OBJECTGRAPH,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:ObjectGraph)
-  })
-_sym_db.RegisterMessage(ObjectGraph)
-
-Object = _reflection.GeneratedProtocolMessageType('Object', (_message.Message,), {
-  'DESCRIPTOR' : _OBJECT,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:Object)
-  })
-_sym_db.RegisterMessage(Object)
-
-Timestep = _reflection.GeneratedProtocolMessageType('Timestep', (_message.Message,), {
-  'DESCRIPTOR' : _TIMESTEP,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:Timestep)
-  })
-_sym_db.RegisterMessage(Timestep)
-
-TrackableSet = _reflection.GeneratedProtocolMessageType('TrackableSet', (_message.Message,), {
-  'DESCRIPTOR' : _TRACKABLESET,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:TrackableSet)
-  })
-_sym_db.RegisterMessage(TrackableSet)
-
-DatasetDescription = _reflection.GeneratedProtocolMessageType('DatasetDescription', (_message.Message,), {
-  'DESCRIPTOR' : _DATASETDESCRIPTION,
-  '__module__' : 'tmpncjfrx7c_pb2'
-  # @@protoc_insertion_point(class_scope:DatasetDescription)
-  })
-_sym_db.RegisterMessage(DatasetDescription)
->>>>>>> origin/aew_kitweather
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0btmp8j7ak3eo\"6\n\tMaskArray\x12\r\n\x05shape\x18\x01 \x03(\x05\x12\x0c\n\x04\x64\x61ta\x18\x02 \x02(\x0c\x12\x0c\n\x04zlib\x18\x03 \x02(\x08\"u\n\nProperties\x12\x18\n\x04mask\x18\x01 \x02(\x0b\x32\n.MaskArray\x12\x17\n\x0fouter_threshold\x18\x02 \x02(\x02\x12\x17\n\x0finner_threshold\x18\x03 \x02(\x02\x12\x1b\n\x13\x63omparison_operator\x18\x04 \x02(\t\")\n\tVoxelData\x12\r\n\x05index\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"-\n\nVertexData\x12\x10\n\x08position\x18\x01 \x03(\x02\x12\r\n\x05value\x18\x02 \x01(\x02\"+\n\x08\x46\x61\x63\x65\x44\x61ta\x12\x10\n\x08vertices\x18\x01 \x03(\r\x12\r\n\x05value\x18\x02 \x01(\x02\"C\n\x13VoxelRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12\x1e\n\nvoxel_data\x18\x02 \x03(\x0b\x32\n.VoxelData\"D\n\x12LineRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\"f\n\x16\x42oundaryRepresentation\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\t\x12 \n\x0bvertex_data\x18\x02 \x03(\x0b\x32\x0b.VertexData\x12\x1c\n\tface_data\x18\x03 \x03(\x0b\x32\t.FaceData\"2\n\tGraphNode\x12\x0c\n\x04time\x18\x01 \x02(\t\x12\x17\n\x06object\x18\x02 \x02(\x0b\x32\x07.Object\"K\n\x0fGraphConnection\x12\x1a\n\x06parent\x18\x01 \x02(\x0b\x32\n.GraphNode\x12\x1c\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\n.GraphNode\".\n\x0bObjectGraph\x12\x1f\n\x05\x65\x64ges\x18\x01 \x03(\x0b\x32\x10.GraphConnection\"\xc2\x01\n\x06Object\x12\n\n\x02id\x18\x01 \x02(\x05\x12%\n\x08line_rep\x18\x02 \x03(\x0b\x32\x13.LineRepresentation\x12\'\n\tvoxel_rep\x18\x03 \x01(\x0b\x32\x14.VoxelRepresentation\x12-\n\x0c\x62oundary_rep\x18\x04 \x03(\x0b\x32\x17.BoundaryRepresentation\x12\x1f\n\nproperties\x18\x05 \x01(\x0b\x32\x0b.Properties\x12\x0c\n\x04\x66lag\x18\x06 \x01(\x08\"8\n\x08Timestep\x12\x12\n\nvalid_time\x18\x01 \x01(\t\x12\x18\n\x07objects\x18\x02 \x03(\x0b\x32\x07.Object\"\x99\x01\n\x0cTrackableSet\x12\x11\n\tinit_time\x18\x01 \x01(\t\x12\x0e\n\x06member\x18\x02 \x01(\r\x12\r\n\x05level\x18\x03 \x01(\x02\x12\x1c\n\ttimesteps\x18\x04 \x03(\x0b\x32\t.Timestep\x12\x1b\n\x05graph\x18\x05 \x01(\x0b\x32\x0c.ObjectGraph\x12\x1c\n\x06tracks\x18\x06 \x03(\x0b\x32\x0c.ObjectGraph\"_\n\x12\x44\x61tasetDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x66ile\x18\x02 \x01(\t\x12\x10\n\x08run_time\x18\x03 \x02(\t\x12\x1b\n\x04sets\x18\x04 \x03(\x0b\x32\r.TrackableSet')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmpwdhwhb1j_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tmp8j7ak3eo_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
@@ -869,11 +43,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _OBJECTGRAPH._serialized_start=697
   _OBJECTGRAPH._serialized_end=743
   _OBJECT._serialized_start=746
-  _OBJECT._serialized_end=926
-  _TIMESTEP._serialized_start=928
-  _TIMESTEP._serialized_end=984
-  _TRACKABLESET._serialized_start=987
-  _TRACKABLESET._serialized_end=1140
-  _DATASETDESCRIPTION._serialized_start=1142
-  _DATASETDESCRIPTION._serialized_end=1237
+  _OBJECT._serialized_end=940
+  _TIMESTEP._serialized_start=942
+  _TIMESTEP._serialized_end=998
+  _TRACKABLESET._serialized_start=1001
+  _TRACKABLESET._serialized_end=1154
+  _DATASETDESCRIPTION._serialized_start=1156
+  _DATASETDESCRIPTION._serialized_end=1251
 # @@protoc_insertion_point(module_scope)
diff --git a/enstools/feature/identification/aew_vortices/__init__.py b/enstools/feature/identification/aew_vortices/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..10c699833c7791ad82260b5e80efc47be7e8d88b
--- /dev/null
+++ b/enstools/feature/identification/aew_vortices/__init__.py
@@ -0,0 +1 @@
+from .identification import AEWVortexIdentification
\ No newline at end of file
diff --git a/enstools/feature/identification/aew_vortices/configuration.py b/enstools/feature/identification/aew_vortices/configuration.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d9e2436f7090c94f0e310a606e8382fef44f913
--- /dev/null
+++ b/enstools/feature/identification/aew_vortices/configuration.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+from os.path import expanduser, join
+from datetime import timedelta
+import numpy as np
+
+# data area
+# latN = 35
+# latS = -35
+# lonW = -100
+# lonE = 45
+
+in_data = "/home/ws/he7273/phd_all/data/coll_oper/jjaso2021.nc"
+in_wts = "/home/ws/he7273/phd_all/data/coll_oper/jjaso2021.json"
+
+# plot_dir = '/home/ws/he7273/phd_all/data/coll_oper/' # '/project/meteo/w2w/C3/fischer/belanger/plots/' # join('/home/ws/he7273/phd_all/data/aew/plots/') # '/project/meteo/w2w/C3/fischer/belanger/plots/'
+
+levels = [700, 850]  # 700 hPa
+u_dim = 'u'
+v_dim = 'v'
+
+# time of interest, if None all
+# june-oct is AEW season
+
+start_date = '2021-09-01T00:00' # '2022-08-01T00:00' # None # '2008-08-01T00:00' #  # '2008-08-01T00:00'
+end_date = '2021-09-05T00:00' # '2022-08-15T00:00'  # None # '2008-08-15T00:00' # None # '2008-08-03T00:00'
+
diff --git a/enstools/feature/identification/aew_vortices/identification.py b/enstools/feature/identification/aew_vortices/identification.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5ceee27e764fb332fb66be9b48f9aaa9424a599
--- /dev/null
+++ b/enstools/feature/identification/aew_vortices/identification.py
@@ -0,0 +1,182 @@
+from enstools.feature.identification import IdentificationStrategy
+import xarray as xr
+import numpy as np
+import os, sys
+from .util import compute_field, interpolate_wavetroughs, create_wt_troughs_and_areas
+
+import json
+from types import SimpleNamespace
+from matplotlib import pyplot as plt
+from enstools.feature.identification._proto_gen import african_easterly_waves_pb2
+import cartopy.crs as ccrs
+
+from scipy.signal import find_peaks
+from scipy.ndimage import maximum_filter, generate_binary_structure
+from skimage.draw import line_aa
+from enstools.feature.util.enstools_utils import get_u_var, get_v_var, get_vertical_dim, get_longitude_dim, get_latitude_dim, get_init_time_dim, get_valid_time_dim
+import threading
+from skimage.draw import line
+
+
+class AEWVortexIdentification(IdentificationStrategy):
+
+    def __init__(self, field='cv', bpf=False, **kwargs):
+        """
+        Initialize
+
+        """
+
+        import enstools.feature.identification.aew_vortices.configuration as cfg
+        self.config = cfg  # config
+        self.field = field
+        self.bpf = bpf
+        
+        json_path = cfg.in_wts
+        with open(json_path) as f:
+            wt_data = json.load(f, object_hook=lambda x: SimpleNamespace(**x))
+
+        self.json_desc = wt_data
+
+        pass
+
+    def precompute(self, dataset: xr.Dataset, **kwargs):
+        print("Precompute for AEW identification...")
+
+        plt.switch_backend('agg')  # this is thread safe matplotlib but cant display.
+
+        # --------------- CLIMATOLOGY
+
+        u_name = self.config.u_dim if hasattr(self.config, 'u_dim') and (self.config.u_dim is not None) else get_u_var(dataset)
+        v_name = self.config.v_dim if hasattr(self.config, 'v_dim') and (self.config.v_dim is not None) else get_v_var(dataset)
+
+        if u_name is None or v_name is None:
+            print("Could not locate u and v fields in dataset. Needed to compute advection terms.")
+            exit()
+
+        level_str = get_vertical_dim(dataset)
+        lat_str = get_latitude_dim(dataset)
+        lon_str = get_longitude_dim(dataset)
+        init_time_str = get_init_time_dim(dataset)
+        valid_time_str = get_valid_time_dim(dataset)
+
+        # --------------- SUBSET DATA ACCORDING TO CFG
+        start_date_dt = np.datetime64(self.config.start_date) if self.config.start_date is not None else None
+        end_date_dt = np.datetime64(self.config.end_date) if self.config.end_date is not None else None
+
+        # if data is lon=0..360, change it to -180..180
+        dataset.coords[lon_str] = (dataset.coords[lon_str] + 180) % 360 - 180
+        dataset = dataset.sortby(dataset[lon_str])
+
+        sel_levels = self.config.levels
+        filter_time_str = init_time_str if init_time_str is not None else valid_time_str
+
+        # subset lon,lat,lev,time
+        dataset = dataset.sel(
+            # **{lat_str: slice(lat_range[0], lat_range[1])},
+            # **{lon_str: slice(lon_range[0], lon_range[1])},
+            **{level_str: sel_levels},
+            **{filter_time_str: slice(start_date_dt, end_date_dt)})
+
+        # get the data we want to investigate
+        dataset = dataset.sortby(lat_str) # in case of descending
+
+        if len(dataset.time.values) == 0:
+            print("Given start and end time leads to no data to process.")
+            exit(1)
+
+        # --------------- DO NUMPY PARALLELIZED STUFF: CREATE TROUGH MASKS
+
+        # BPF (optional) TODO
+        if self.bpf:
+            dataset = aew_bpf(dataset)
+
+        self.json_desc = interpolate_wavetroughs(self.json_desc, african_easterly_waves_pb2, self.pb_dataset)
+
+        # create field to use
+        dataset = compute_field(dataset, u_name, v_name, self.field)
+        dataset = dataset.transpose(..., lat_str, lon_str)
+
+        data_field = dataset[self.field]
+        dataset['vortices'] = xr.zeros_like(dataset[self.field], dtype=int)
+
+        # search local max.
+        # TODO make sure lat and lon are in back
+        neighborhood = generate_binary_structure(2, 2)
+        # TODO depending on num dimensions. here 4d, with latlon back.
+        neighborhood = np.pad([[neighborhood]], ((1,1),(1,1),(0,0),(0,0)))
+        max_mask = maximum_filter(data_field.values, footprint=neighborhood) == data_field.values
+
+        # find peaks can give better results
+        # max_lat = find_peaks(data_field.values, np.greater, axis=-2) # if more sophisiticated:
+        # max_lon = find_peaks(data_field.values, np.greater, axis=-1) #  scipy.signal.find_peaks
+        print(max_mask.shape)
+        dataset['vortices'].data = max_mask
+
+        # TODO filter:
+        #   prob > 66% clim
+        #   cluster? only rep?
+
+        dataset = create_wt_troughs_and_areas(dataset, self.json_desc, False)
+
+        dataset.to_netcdf("/home/ws/he7273/phd_all/data/coll_oper/jjaso2021_test.nc")
+        exit()
+        # filter vortices somehow, before? prob need after
+        # add them to WT descs.
+
+        # filter max points by WT mask
+        # interpolate_wave_areas() # for gaps in tracks. -> also add json info? maybe create WT area ourself.
+        #     for each child in track node: if dt > 6h: add inbetween "fake" wt to json
+        # put lows in.
+        # maybe depending on whether they form a track?
+
+
+
+
+
+        maxima.keep_where(wt_area) # WT Area range see Fink/Reiner?
+
+        # add vortices to tracks?
+
+
+
+        #if self.config.cv_name not in dataset.data_vars:
+        #    print("Curvature Vorticity not found, trying to compute it out of U and V...")
+        #    dataset = compute_cv(dataset, u_name, v_name, self.config.cv_name)
+
+        # make dataset to 2.5 (or same as cv_clim)
+        # dataset = dataset.interp({lat_str: cv_clim.coords[lat_str], lon_str: cv_clim.coords[lon_str]})
+
+        # make sure that lat and lon are last two dimensions
+        # dataset = dataset.transpose(..., lat_str, lon_str)
+
+
+        # dataset['wavetroughs'] = wt
+
+        return dataset
+
+    def identify(self, data_chunk: xr.Dataset, **kwargs):
+
+        objs = []
+
+        id_ = 1
+        for path in []:
+
+            # get new object, set id
+            # o = self.get_new_object()
+            # o.id = id_
+            # populate it
+            # populate_object(o.properties, path, self.config)
+
+            # add to objects if keep
+            # if not self.keep_wavetrough(o.properties):
+            #     continue
+
+            # objs.append(o)
+            # id_ += 1
+            break
+
+        return data_chunk, objs
+
+    def postprocess(self, dataset: xr.Dataset, data_desc, **kwargs):
+        return dataset, data_desc
+
diff --git a/enstools/feature/identification/aew_vortices/run_identify.py b/enstools/feature/identification/aew_vortices/run_identify.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f546537634e37280da4b260bf3d52546d751f90
--- /dev/null
+++ b/enstools/feature/identification/aew_vortices/run_identify.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+
+# Usage Example
+from enstools.feature.pipeline import FeaturePipeline
+from enstools.feature.identification.aew_vortices import AEWVortexIdentification
+from datetime import timedelta, datetime
+from enstools.feature.identification._proto_gen import african_easterly_waves_pb2
+from os.path import expanduser, join
+from enstools.feature.util.graph import DataGraph
+import enstools.feature.identification.aew_vortices.configuration as cfg
+import os, sys, glob, shutil
+from enstools.feature.util.data_utils import get_subset_by_description
+import xarray as xr
+xr.set_options(keep_attrs=True)
+import numpy as np
+from pprint import pprint
+
+pipeline = FeaturePipeline(african_easterly_waves_pb2, processing_mode='2d')
+
+# in_files_all_cv_data = cfg.cv_data_ex
+
+in_file = cfg.in_data
+in_desc = cfg.in_wts
+pipeline.set_data_path(in_file)
+
+# init AEWIdentification strategy, can take different parameters
+i_strat = AEWVortexIdentification(field='cv', bpf=False)
+# t_strat = SomeTracking()
+
+pipeline.set_identification_strategy(i_strat)
+# pipeline.set_tracking_strategy(t_strat)
+
+# execute pipeline
+pipeline.execute()
+
+od = pipeline.get_object_desc()
+
+all_tracks = []
+for set_id, trackable_set in enumerate(od.sets):
+
+    # generate graph out of tracked data
+    g = DataGraph(trackable_set, t_strat)
+
+    # generate single tracks from tracked data
+    # returns list of tracks, also gets added to object description. Also if apply_filter, keep_track can be implemented
+    g.generate_tracks(apply_filter=True) # add tracks to OD, applies filtering TODO tracks not in desc.
+    tracks = g.set_desc.tracks
+
+    # parents of a node: track.get_parents(track.graph.edges[0].parent)
+    # children of a node: track.get_children(track.graph.edges[0].parent)
+
+    # plot tracks
+
+    for track_id, track in enumerate(tracks):
+        plot_track(track, "track" + "{:03d}".format(set_id) + "_" + "{:03d}".format(track_id))
+
+    ds = pipeline.get_data()
+    ds_set = get_subset_by_description(ds, trackable_set, '2d')
+    # plot differences (passed filtering / did not pass)
+    # plot_differences(g, tracks) TODO need to fix if we want this
+
+    # for track_id, track in enumerate(tracks):
+    #     plot_track(track, "track" + str(track_id))
+
+    all_tracks.extend(tracks)
+# ds_set = get_subset_by_description(ds, trackable_set, '2d')
+    
+ds = pipeline.get_data()
+
+# plot kitweather mode
+# if len(sys.argv) > 1 and sys.argv[1] == '-kw':
+#     plot_kw(all_tracks, ds=ds, tp=rain_ds.tp, plot_prefix=(plot_dir + run + '/' + plot_file_prefix), ens_mode=ens_mode) # TODO need g?
+
+
+
+# no out dataset here.
+pipeline.save_result(description_type='json', description_path=cfg.out_json_path) #, dataset_path=out_dataset_path) # dataset_path=out_dataset_path,
diff --git a/enstools/feature/identification/aew_vortices/util.py b/enstools/feature/identification/aew_vortices/util.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e8dbd820b5fe5dcf86bc7416851ac8317bbac2a
--- /dev/null
+++ b/enstools/feature/identification/aew_vortices/util.py
@@ -0,0 +1,369 @@
+
+import numpy as np
+import xarray as xr
+import math, json
+from enstools.feature.util.enstools_utils import get_u_var, get_v_var, get_vertical_dim, get_longitude_dim, \
+    get_latitude_dim
+from skimage.draw import line
+from enstools.feature.util.data_utils import clip, pb_str_to_datetime64, datetime64_to_pb_str, get_json, pb_str_to_datetime
+from types import SimpleNamespace
+from google.protobuf import json_format
+
+# calculates the dx's and dy's for each grid cell
+# takes list of latitudes and longitudes as input and returns field with dimensions len(lats) x len(lons)
+def calculate_dx_dy(lats, lons):
+    lat_res = lats[1] - lats[0]
+    lon_res = lons[1] - lons[0]
+    nlat = len(lats)
+    nlon = len(lons)
+    lon_percent = (lon_res * nlon) / 360.0  # percentage of global longitudes. e.g. if 110W to 70E -> 0.5
+    lat_percent = (lat_res * nlat) / 180.0  # percentage of global latitudes
+    Re = 6378100
+
+    # field filled with the latitude value at each grid point
+    lat_f = np.tile(lats, (nlon, 1)).transpose()
+    # field filled with the longitude value at each grid point
+    lon_f = np.tile(lons, (nlat, 1))
+    # dx: circumference at current latitude  *  percentage of longitudes in dataset  /  amount of lon grid points
+    dx = np.cos(lat_f * math.pi / 180.0) * 2.0 * math.pi * Re * lon_percent / nlon
+    # dy: constant everywhere: half circumference  *  latitude percentage /  amount of lat points
+    dy = (lat_f * 0) + lat_percent * math.pi * Re / nlat
+
+    return dx, dy
+
+
+def compute_vort(dataset, vtype, u_str, v_str, field_str):
+    xr.set_options(keep_attrs=True)  # assign coords keeps attributes
+
+    lon_str = get_longitude_dim(dataset)
+    lat_str = get_latitude_dim(dataset)
+
+    lats = dataset.coords[lat_str].data
+    lons = dataset.coords[lon_str].data
+
+    # be careful if your data is non-continuous by the chosen window (e.g. +120E..-120W)
+    # reorder axis for efficient numpy broadcasting
+    dataset = dataset.sortby(lat_str)
+    dataset = dataset.transpose(..., lat_str, lon_str)
+
+    dataset[field_str] = xr.zeros_like(dataset[u_str], dtype=float)
+
+    # calculate dx and dy for each cell in grid in meters
+    dx, dy = calculate_dx_dy(lats, lons)
+
+    # Relative Vorticity = dv/dx - du/dy, use central differences
+    u_arr = dataset[u_str].data
+    v_arr = dataset[v_str].data
+    ndims = u_arr.ndim
+
+    # roll axes so we have a reference to each cell's neighbours
+    # ax[-1] = lon, ax[-2] = lat
+    # works as expected if longitude band is full 360 degrees. Rolling does exactly that.
+    v_xp = np.roll(v_arr, -1, axis=ndims - 1)  # roll -1 to get +1. v_xp = v(x+1)
+    v_xm = np.roll(v_arr, 1, axis=ndims - 1)
+    v_yp = np.roll(v_arr, -1, axis=ndims - 2)
+    v_ym = np.roll(v_arr, 1, axis=ndims - 2)
+
+    u_xp = np.roll(u_arr, -1, axis=ndims - 1)  # roll -1 to get +1
+    u_xm = np.roll(u_arr, 1, axis=ndims - 1)
+    u_yp = np.roll(u_arr, -1, axis=ndims - 2)
+    u_ym = np.roll(u_arr, 1, axis=ndims - 2)
+
+    # central differences:  (V(x+1)-V(x-1)) / 2x - (U(y+1)-U(y-1)) / 2y
+    RV = ((v_xp - v_xm) / (2 * dx)) - ((u_yp - u_ym) / (2 * dy))
+    # results verified to ERA5 vo-data
+    if vtype == 'relative':
+        dataset[field_str].values = RV
+        dataset[field_str].attrs = {'long_name': "Relative Vorticity", 'units': "s**-1"}
+        return dataset
+
+
+    # split into shear + curvature: RV = -dV/dn + V/R
+    # shear vorticity:
+    # rate of change of wind speed in the direction of flow
+    # -dV/dn
+
+    # wind direction of this cell
+    ref_angle = np.arctan2(v_arr, u_arr)
+
+    ### METHOD 1 ### from analytical standpoint
+
+    sin_angle = np.sin(ref_angle)
+    cos_angle = np.cos(ref_angle)
+    # here is where the magic happens...
+    # to cartesian: dV/dn = - dV/dx * sin(phi) + dV/dy * cos(phi) ## n is normal to V, split it into x,y respecting the
+    # n-direction, where phi is the rotation angle of the natural coordinate system, this also is the angle of the
+    # wind vector
+    #
+    # we get the magnitude of shear as the projection of dV/dn onto the vector itself (direction e_t)
+    # with e_t = cos(phi)*e_x + sin(phi)*e_y , so:
+    # dV/dn * e_t = du/dx * (-sin*cos) + du/dy cos^2 + dv/dx *(-sin^2) + dv/dy (cos*sin)
+    SV = (u_xp - u_xm) / (2 * dx) * (-sin_angle * cos_angle) + \
+         (u_yp - u_ym) / (2 * dy) * (cos_angle ** 2) + \
+         (v_xp - v_xm) / (2 * dx) * (-(sin_angle ** 2)) + \
+         (v_yp - v_ym) / (2 * dy) * (sin_angle * cos_angle)
+    SV = -SV  # -dV/dn
+    if vtype == 'shear':
+        dataset[field_str].values = SV
+        dataset[field_str].attrs = {'long_name': "Shear Vorticity", 'units': "s**-1"}
+        return dataset
+
+    # remainder is CV
+    CV = RV - SV
+    if vtype == 'curvature':
+        dataset[field_str].values = CV
+        dataset[field_str].attrs = {'long_name': "Curvature Vorticity", 'units': "s**-1"}
+        return dataset
+    return None
+
+
+def compute_field(dataset, u_str, v_str, field_name):
+
+    if field_name in ['cv', 'cva', 'stormrel_cv', 'stormrel_cva']:
+        dataset = compute_vort(dataset, 'curvature', u_str, v_str, 'cv')
+    elif field_name in ['rv', 'rva']:
+        dataset = compute_vort(dataset, 'relative', u_str, v_str, 'rv')
+    else:
+        print("NYI")
+        exit(1)
+
+    if field_name in ['rva', 'cva', 'stormrel_cv', 'stormrel_cva']:
+        print("NYI")
+        exit(1)
+
+    return dataset
+
+
+def create_fake_wt_edges(edge, child_idx, pb_ref, pb_desc):
+    # make multiple edges out of this one
+
+    parent_node = edge.parent
+    parent_node_pb = json_format.Parse(json.dumps(get_json(parent_node)), pb_ref.GraphNode(), ignore_unknown_fields=False)
+    child_node = edge.children[child_idx]
+    child_node_pb = json_format.Parse(json.dumps(get_json(child_node)), pb_ref.GraphNode(), ignore_unknown_fields=False)
+
+    parent_node_time = pb_str_to_datetime64(parent_node.time)
+    child_node_time = pb_str_to_datetime64(child_node.time)
+
+    delt = child_node_time - parent_node_time
+    print(delt)
+    if delt != np.timedelta64(12, 'h'):
+        print("NO 12h abort")
+        print(delt)
+    else:
+        print("12h")
+
+    fake_node_time = parent_node_time + 0.5 * delt # TODO assert only skip 1
+    parent_json = get_json(parent_node)
+
+    # create fake node as copy of parent
+    fake_node = pb_ref.GraphNode() # json_format.Parse(json.dumps(parent_json), pb_ref.GraphNode(), ignore_unknown_fields=False)
+    fake_node.time = datetime64_to_pb_str(fake_node_time)
+
+    # id and flag False
+    fake_node.object.id = -1
+    fake_node.object.flag = False
+
+    # set properties: bb as mean of parent and child
+    parent_props = fake_node.object.properties
+    child_props = fake_node.object.properties
+    fake_props = fake_node.object.properties
+
+    fake_props.bb.min.lat = (parent_props.bb.min.lat + child_props.bb.min.lat) / 2.0
+    fake_props.bb.max.lat = (parent_props.bb.max.lat + child_props.bb.max.lat) / 2.0
+    fake_props.bb.min.lon = (parent_props.bb.min.lon + child_props.bb.min.lon) / 2.0
+    fake_props.bb.max.lon = (parent_props.bb.max.lon + child_props.bb.max.lon) / 2.0
+
+    avg_lon = (fake_props.bb.min.lon + fake_props.bb.max.lon) / 2.0
+    fake_props.line_pts.add()
+    fake_props.line_pts[0].lat = fake_props.bb.min.lat
+    fake_props.line_pts[0].lon = avg_lon
+    fake_props.line_pts.add()
+    fake_props.line_pts[1].lat = fake_props.bb.max.lat
+    fake_props.line_pts[1].lon = avg_lon
+
+    # new edge:
+    edge1 = pb_ref.GraphConnection()
+    edge1.parent.CopyFrom(parent_node_pb)
+    edge1.children.append(fake_node)
+
+    edge2 = pb_ref.GraphConnection()
+    edge2.parent.CopyFrom(fake_node)
+    edge2.children.append(child_node_pb)
+
+    return [edge1, edge2]
+
+def interpolate_wavetroughs(json_desc, pb_ref, pb_desc):
+
+    for set_ in json_desc.sets:
+
+        for track in set_.tracks:
+            # old_edges = []
+            new_edges = []
+
+            for edge in track.edges:
+                parent_node = edge.parent
+                parent_node_time = pb_str_to_datetime64(parent_node.time)
+                if not hasattr(edge, 'children'):
+                    continue
+
+                for child_idx, child_node in enumerate(edge.children):
+                    child_node_time = pb_str_to_datetime64(child_node.time)
+
+                    if child_node_time - parent_node_time > np.timedelta64(6, 'h'):
+                        print("skipper")
+                        wt_edges = create_fake_wt_edges(edge, child_idx, pb_ref, pb_desc)
+                        # old_edges.append((edge, child_idx))
+                        new_edges.extend(wt_edges)
+                    else:
+                        print("non skipper")
+
+            # TODO dont remove edges for now, quite complicated with splits. lets have transitives instead
+            # remove old_edges from this track and from graph
+
+            track.edges.extend(new_edges)
+            set_.graph.edges.extend(new_edges)
+            # print("EOT")
+            # not to TS!
+
+    return json_desc
+
+
+def create_wt_troughs_and_areas(dataset, in_json, use_fc):
+    print("Create WT lines...")
+
+    if use_fc:
+        # TODO
+        print("NO FC")
+        exit(1)
+        # dataset['wt_fc'] = xr.zeros_like(dataset.u700_fc, dtype=int)
+    else:
+        dataset['wt_rea'] = xr.zeros_like(dataset.u.isel(level=0).squeeze(), dtype=int)
+
+        #  for ts in ana_set.timesteps:
+
+    min_lat = dataset.latitude.data.min()
+    max_lat = dataset.latitude.data.max()
+    min_lon = dataset.longitude.data.min()
+    max_lon = dataset.longitude.data.max()
+    lons = len(dataset.longitude.data)
+    lats = len(dataset.latitude.data)
+
+    for wt_set in in_json.sets:
+
+        cur_set = wt_set
+
+        if use_fc:
+            initTime = wt_set.initTime
+            set_ds = dataset.sel(time=initTime)  # init time
+        else:
+            set_ds = dataset
+
+        for track in cur_set.tracks:
+            track_nodes = [e.parent for e in track.edges]
+
+            for node in track_nodes:
+
+                vt = node.validTime
+                """
+                try:
+                if use_fc:
+                    diff_time = pb_str_to_datetime(vt) - pb_str_to_datetime(initTime)
+                    wt_da = set_ds.wt_fc.sel(step=diff_time)
+                else:
+                """
+                wt_da = set_ds.wt_rea.sel(time=vt)
+                #except KeyError:
+                #continue
+
+                props = node.properties
+
+                for v_idx in range(len(props.linePts) - 1):
+                    start_lonlat = props.linePts[v_idx].lon, props.linePts[v_idx].lat
+                    end_lonlat = props.linePts[v_idx + 1].lon, props.linePts[v_idx + 1].lat
+
+                    start_idx = ((start_lonlat[0] - min_lon) / (max_lon - min_lon) * lons,
+                                 (start_lonlat[1] - min_lat) / (max_lat - min_lat) * lats)
+                    # start_idx = clip(start_idx, (0, 0), (lons, lats))
+
+                    end_idx = ((end_lonlat[0] - min_lon) / (max_lon - min_lon) * lons,
+                               (end_lonlat[1] - min_lat) / (max_lat - min_lat) * lats)
+                    # end_idx = clip(end_idx, (0, 0), (lons, lats))
+
+                    rr, cc = line(int(start_idx[0]), int(start_idx[1]), int(end_idx[0]), int(end_idx[1]))
+                    rr = clip(rr, 0, lons - 1)
+                    cc = clip(cc, 0, lats - 1)
+
+                    wt_da.data[cc, rr] = wt.id
+
+                    lons_along_wt = lons_from(cc)
+                    lats_along_wt = lats_from(rr)
+
+                    # make circle
+                    for px_idx in range(len(lons_along_wt)):
+
+                        circle = circles.sel(longitude_center=lons_along_wt[px_idx], latitude_center=lats_along_wt[px_idx])
+                        influence_area = circle.where(circle < d, 0)
+
+                        circle_da = xr.where(influence_area, wt.id, circle_da)
+
+
+
+
+"""
+# from wavetrough line expand by d meters TODO also ahead on land. -> just also on trough and then shift ahead?
+def create_wt_areas(dataset, circles, use_fc, d=5.0):
+    print("Create WT areas...")
+
+    if use_fc:
+        wt = dataset['wt_fc']  # TODO rea
+    else:
+        wt = dataset['wt_rea']  # TODO rea
+
+    wt_area = xr.zeros_like(wt, dtype=int)
+
+    multi_wt_data = wt.stack(z=[...])
+    multi_wt_data = multi_wt_data.where(multi_wt_data > 0, drop=True)
+
+    num = len(multi_wt_data.z.data)
+    for z in range(len(multi_wt_data.z.data)):
+        if z % 100 == 0:
+            print(str(z) + "/" + str(num))
+
+        lon = multi_wt_data.longitude[z]
+        lat = multi_wt_data.latitude[z]
+        time = multi_wt_data.time[z]
+        if use_fc:
+            step = multi_wt_data.step[z]
+            wt_area_subset = wt_area.sel(time=time, step=step)  # TODO FC sel where to put circle.
+        else:
+            wt_area_subset = wt_area.sel(time=time)  # TODO FC sel where to put circle.
+
+        wt_index = int(multi_wt_data.data[z])
+
+        circle = circles.sel(longitude_center=lon, latitude_center=lat)
+
+        influence_area = circle.where(circle < d, 0)
+        influence_area = influence_area.astype(dtype=bool).astype(dtype=int) * wt_index
+
+        wt_area_subset_new_values = np.where(influence_area > 0, influence_area, wt_area_subset.values)
+        if use_fc:
+            wt_area.loc[dict(time=time, step=step)] = wt_area_subset_new_values
+        else:
+            wt_area.loc[dict(time=time)] = wt_area_subset_new_values
+
+    if use_fc:
+        dataset['wt_area_fc'] = wt_area
+    else:
+        dataset['wt_area_rea'] = wt_area
+"""
+"""
+def create_wt_troughs_and_areas(dataset, in_json):
+"""
+    # iterate over wavetroughs, for each
+    #   put line in WT field, keep id (-1 also!)
+    #   put area around it, keep id
+
+
+
+
diff --git a/enstools/feature/identification/african_easterly_waves/configuration.py b/enstools/feature/identification/african_easterly_waves/configuration.py
index c868ecea2be3e84694be9a47f14694de37e5ec8d..c48aa71808cb009efd5d3fea3c8c0c6a602c77ae 100644
--- a/enstools/feature/identification/african_easterly_waves/configuration.py
+++ b/enstools/feature/identification/african_easterly_waves/configuration.py
@@ -12,12 +12,12 @@ import numpy as np
 data_lat = (3, 35)
 data_lon = (-100, 45)
 
-aew_clim_dir = '/project/meteo/w2w/C3/fischer/belanger/aew_clim/cv_clim_era5.nc' # '/lsdf/MOD/Gruppe_Transregio/Gruppe_Knippertz/kitweather/data/era5/cv_clim_era5.nc' 'C:\\Users\\Christoph\\phd\\data\\enstools-feature\\cv_clim_era5.nc' # '/home/christoph/phd/data/aew/clim/cv_clim_era5.nc' # '/home/christoph/phd/data/framework_example_ds/aew/' # '/project/meteo/w2w/C3/fischer/belanger/aew_clim/' #
-in_files = '/project/meteo/w2w/C3/fischer/data/jja2022.nc' # '/home/ws/he7273/phd_all/data/coll_oper/jja2021/jja2021.nc'  # 'C:\\Users\\Christoph\\phd\\data\\enstools-feature\\2008_sum_uv.nc' # '/home/christoph/phd/data/framework_example_ds/aew/cv_aug_08.nc'
-out_dir = '/project/meteo/w2w/C3/fischer/belanger/out/' # join('/home/ws/he7273/phd_all/data/aew/out/') # '/project/meteo/w2w/C3/fischer/belanger/out/'
-out_json_path = out_dir + 'jja2022_fc_test.json'
+aew_clim_dir = '/home/ws/he7273/phd_all/data/aew/clim/cv_clim_era5.nc' # '/project/meteo/w2w/C3/fischer/belanger/aew_clim/cv_clim_era5.nc' # '/lsdf/MOD/Gruppe_Transregio/Gruppe_Knippertz/kitweather/data/era5/cv_clim_era5.nc' 'C:\\Users\\Christoph\\phd\\data\\enstools-feature\\cv_clim_era5.nc' # '/home/christoph/phd/data/aew/clim/cv_clim_era5.nc' # '/home/christoph/phd/data/framework_example_ds/aew/' # '/project/meteo/w2w/C3/fischer/belanger/aew_clim/' #
+in_files = '/home/ws/he7273/phd_all/data/coll_oper/jjaso2021.nc' # '/project/meteo/w2w/C3/fischer/data/jja2022.nc' # '/home/ws/he7273/phd_all/data/coll_oper/jja2021/jja2021.nc'  # 'C:\\Users\\Christoph\\phd\\data\\enstools-feature\\2008_sum_uv.nc' # '/home/christoph/phd/data/framework_example_ds/aew/cv_aug_08.nc'
+out_dir = '/home/ws/he7273/phd_all/data/coll_oper/' # '/project/meteo/w2w/C3/fischer/belanger/out/' # join('/home/ws/he7273/phd_all/data/aew/out/') # '/project/meteo/w2w/C3/fischer/belanger/out/'
+out_json_path = out_dir + 'jjaso2021.json'
 
-plot_dir = '/project/meteo/w2w/C3/fischer/belanger/plots/' # join('/home/ws/he7273/phd_all/data/aew/plots/') # '/project/meteo/w2w/C3/fischer/belanger/plots/'
+plot_dir = '/home/ws/he7273/phd_all/data/coll_oper/' # '/project/meteo/w2w/C3/fischer/belanger/plots/' # join('/home/ws/he7273/phd_all/data/aew/plots/') # '/project/meteo/w2w/C3/fischer/belanger/plots/'
 
 timedelta_ana = np.timedelta64(7, 'D')
 
@@ -67,8 +67,8 @@ wave_filter_lat = (-5, 30) # TODO see bottom method -> more adaptive on lons.
 wave_filter_lon = (-110, 55)
 
 levels = [700]  # 700 hPa
-u_dim = 'xxu700_fc'
-v_dim = 'v700_fc'
+u_dim = 'u'
+v_dim = 'v'
 
 # time of interest, if None all
 # june-oct is AEW season
diff --git a/enstools/feature/identification/identification.proto b/enstools/feature/identification/identification.proto
index 575a922b2fbe856b7632f53bbed576d0f56f0f6e..805045f9d3a0b876d7f154ee6b1b57abb3670263 100644
--- a/enstools/feature/identification/identification.proto
+++ b/enstools/feature/identification/identification.proto
@@ -66,6 +66,8 @@ message Object {
         optional VoxelRepresentation voxel_rep = 3;
         repeated BoundaryRepresentation boundary_rep = 4;
         optional Properties properties = 5;
+
+        optional bool flag = 6;
 }
 
 /* Timestep represents the state of the data for one single point in time within one time series. It is defined by its
diff --git a/enstools/feature/util/data_utils.py b/enstools/feature/util/data_utils.py
index 592a7cfe7588636d9eec86ac39ce475ba1566c8f..7f720bf7c1befbba749ff8d8ec112a377839d0f2 100644
--- a/enstools/feature/util/data_utils.py
+++ b/enstools/feature/util/data_utils.py
@@ -1,11 +1,12 @@
 import xarray as xr
 from enum import Enum
 from datetime import datetime
-
+import json
 from enstools.misc import get_ensemble_dim, get_time_dim
 from enstools.feature.util.enstools_utils import get_vertical_dim, get_init_time_dim, get_longitude_dim, \
     get_latitude_dim, get_possible_time_dims, get_valid_time_dim
 from multiprocessing import Lock
+import pandas as pd
 lock = Lock()
 
 class SplitDimension:
@@ -252,3 +253,21 @@ def datetime_to_pb_str(time_dt):
     Time string in %Y-%m-%dT%H:%M:%S format
     """
     return time_dt.strftime('%Y-%m-%dT%H:%M:%S')
+
+def datetime64_to_pb_str(time_dt):
+    return pd.to_datetime(str(time_dt)).strftime('%Y-%m-%dT%H:%M:%S')
+
+def pb_str_to_datetime64(time_str):
+    dt = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S')
+    return np.datetime64(dt)
+
+def get_json(obj):
+    """
+    Convert objects (e.g. proto) to json recursively.
+    """
+    return json.loads(
+            json.dumps(obj, default=lambda o: getattr(o, '__dict__', str(o)))
+    )
+
+def clip(tup, mint, maxt):
+    return np.clip(tup, mint, maxt)
\ No newline at end of file