diff --git a/mysite/plots/avl_tree.py b/mysite/plots/avl_tree.py
index 6ff57d8c03bd9fdc8328c16757393673d7bd42fb..2ba973bdf9600d3ad154ab404b7f7c9c93ca58f3 100644
--- a/mysite/plots/avl_tree.py
+++ b/mysite/plots/avl_tree.py
@@ -164,6 +164,7 @@ class AVLTree(object):
         self.preOrder(root.right)
 
     def preOrder_array(self, root, array, key):
+        # array is an accumulator
         if not root:
             return
             # print("{0} ".format(root.key), end="")
diff --git a/mysite/plots/dataset_creator.py b/mysite/plots/dataset_creator.py
index 5ccbd19a3f7b9137e3fec0ca0f7e17af1db2d1ae..0f66237495651d5667f639795daf8e4bc6a6b50d 100644
--- a/mysite/plots/dataset_creator.py
+++ b/mysite/plots/dataset_creator.py
@@ -1,83 +1,97 @@
-# import pandas as pd
-# from .packing_algo import ConvexPolygon, pack_polygons, truncate, RectangularContainer, plot_containers, ConvexContainer
-# from .polygon_creator import voronoi_polygons_wrapper, rectangle_cutter
-#
-#
-# # def build_aprox_factors():
-#
-#
-# def build_dataset_with_rectangle_cutter(rect_width: float, rect_height, repetition, angle_steps=90, cut_min=1,
-#                                         cut_max=1, cut_steps=1, intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1]):
-#     if cut_min > cut_max:
-#         cut_max = cut_min
-#     data_dict_list = []
-#     for cut_count in range(cut_min, cut_max + cut_steps, cut_steps):
-#         cutted_polygons_lists = []
-#         for n in range(0, repetition):
-#             cutted_polygons = rectangle_cutter(rect_width, rect_height, cut_count, intervals=intervals, weights=weights)
-#             cutted_polygons_lists.append(cutted_polygons)
-#         dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps)
-#         data_dict_list.append(dict_data)
-#     return data_dict_list
-#
-#
-# def build_dataset_with_voronoi(rect_width, rect_height, repetition, cut_min=5, cut_max=5, cut_steps=1, angle_steps=90):
-#     if cut_min > cut_max:
-#         cut_max = cut_min
-#     data_dict_list = []
-#     for cut_count in range(cut_min, cut_max + cut_steps, cut_steps):
-#         cutted_polygons_lists = []
-#         for n in range(0, repetition):
-#             cutted_polygons = voronoi_polygons_wrapper(rect_width, rect_height, cut_count)
-#             cutted_polygons_lists.append(cutted_polygons)
-#         dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps)
-#         data_dict_list.append(dict_data)
-#     return data_dict_list
-#
-#
-# def collect_rect_containers_data(rect_width: float, rect_height: float, cutted_polygons_lists: [[ConvexPolygon]],
-#                                  angle_steps=90) -> {str, list}:
-#     opt_area = rect_width * rect_height
-#     opt_area_list = []
-#     area_list = []
-#     area_div_list = []
-#     angle_0_area_div_list = []
-#     angle_0_not_clipped_area_div_list = []
-#     not_clipped_area_list = []
-#     not_clipped_area_div_list = []
-#     polygon_count_list = []
-#     end_container_list = []
-#     mini_container_count_list = []
-#     for polygons in cutted_polygons_lists:
-#         cc = ConvexContainer(polygons, steps=angle_steps)
-#         end_container = cc.smallest_end_container
-#         end_container_angle_0 = cc.angle_0_end_container
-#
-#         c_area = end_container.container_area
-#         c_not_opt_area = end_container.container_not_clipped_area
-#         c_not_r_area = end_container_angle_0.container_area
-#         c_not_r_not_opt_area = end_container_angle_0.container_not_clipped_area
-#         area_list.append(truncate(c_area, 1))
-#         area_div_list.append(truncate(c_area / opt_area, 1))
-#         not_clipped_area_list.append(truncate(c_not_opt_area, 1))
-#         not_clipped_area_div_list.append(truncate(c_not_opt_area / opt_area, 1))
-#
-#         angle_0_area_div_list.append(truncate(c_not_r_area / opt_area, 1))
-#         angle_0_not_clipped_area_div_list.append(truncate(c_not_r_not_opt_area / opt_area, 1))
-#         opt_area_list.append(opt_area)
-#         polygon_count_list.append(len(polygons))
-#         mini_container_count_list.append(len(end_container.mini_containers))
-#         end_container_list.append(cc)
-#     rect_containers_data_dict = {'area': area_list, 'area/opt_area': area_div_list,
-#                                  'not_clipped_area': not_clipped_area_list,
-#                                  'not_clipped_area/opt_area': not_clipped_area_div_list,
-#                                  'angle_0_area/opt_area': angle_0_area_div_list,
-#                                  'angle_0_not_clipped_area/opt_area': angle_0_not_clipped_area_div_list,
-#                                  'opt-area': opt_area_list, 'polygon count': polygon_count_list,
-#                                  'mini-container count': mini_container_count_list, 'Rectangular-Container': end_container_list}
-#     return rect_containers_data_dict
-#
-#
+import pandas as pd
+
+from plots.packing_algo import ConvexPolygon, pack_polygons, truncate, RectangularContainer, ConvexContainer
+from plots.polygon_creator import voronoi_polygons_wrapper, rectangle_cutter
+
+
+# def build_aprox_factors():
+
+
+def build_dataset_with_rectangle_cutter(rect_width: float, rect_height, repetition, cut_list=[], angle_steps=90, cut_min=1,
+                                        cut_max=1, cut_steps=1, intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1],save_container=True):
+    cut_numbers=[]
+    data_dict_list = []
+    if cut_list:
+        cut_numbers= cut_list
+    else:
+        if cut_min > cut_max:
+            cut_max = cut_min
+        for cut_number in range(cut_min, cut_max + 1, cut_steps):
+            cut_numbers.append(cut_number)
+    for cut_count in cut_numbers:
+        cutted_polygons_lists = []
+        for n in range(0, repetition):
+            cutted_polygons = rectangle_cutter(rect_width, rect_height, cut_count, intervals=intervals, weights=weights)
+            cutted_polygons_lists.append(cutted_polygons)
+        dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps,save_container)
+        data_dict_list.append(dict_data)
+    return data_dict_list
+
+
+def build_dataset_with_voronoi(rect_width, rect_height, repetition, cut_list=[], cut_min=5, cut_max=5, cut_steps=1, angle_steps=90, save_container=True):
+    cut_numbers=[]
+    data_dict_list = []
+    if cut_list:
+        cut_numbers = cut_list
+    else:
+        if cut_min > cut_max:
+            cut_max = cut_min
+        for cut_number in range(cut_min, cut_max + 1, cut_steps):
+            cut_numbers.append(cut_number)
+    for cut_count in cut_numbers:
+        cutted_polygons_lists = []
+        for n in range(0, repetition):
+            cutted_polygons = voronoi_polygons_wrapper(rect_width, rect_height, cut_count)
+            cutted_polygons_lists.append(cutted_polygons)
+        dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps,save_container)
+        data_dict_list.append(dict_data)
+    return data_dict_list
+
+
+def collect_rect_containers_data(rect_width: float, rect_height: float, cutted_polygons_lists: [[ConvexPolygon]],
+                                 angle_steps=90, save_container=True) -> {str, list}:
+    opt_area = rect_width * rect_height
+    opt_area_list = []
+    area_list = []
+    area_div_list = []
+    angle_0_area_div_list = []
+    angle_0_not_clipped_area_div_list = []
+    not_clipped_area_list = []
+    not_clipped_area_div_list = []
+    polygon_count_list = []
+    end_container_list_plots = []
+    for polygons in cutted_polygons_lists:
+        cc = ConvexContainer(polygons, steps=angle_steps)
+        end_container = cc.smallest_rectangular_container
+        end_container_angle_0 = cc.angle_0_rectangular_container
+
+        c_area = end_container.container_area
+        c_not_opt_area = end_container.container_not_clipped_area
+        c_not_r_area = end_container_angle_0.container_area
+        c_not_r_not_opt_area = end_container_angle_0.container_not_clipped_area
+        area_list.append(truncate(c_area, 1))
+        area_div_list.append(truncate(c_area / opt_area, 1))
+        not_clipped_area_list.append(truncate(c_not_opt_area, 1))
+        not_clipped_area_div_list.append(truncate(c_not_opt_area / opt_area, 1))
+
+        angle_0_area_div_list.append(truncate(c_not_r_area / opt_area, 1))
+        angle_0_not_clipped_area_div_list.append(truncate(c_not_r_not_opt_area / opt_area, 1))
+        opt_area_list.append(opt_area)
+        polygon_count_list.append(len(polygons))
+        if save_container:
+            end_container_list_plots.append(cc.plot_container(render=False))
+    rect_containers_data_dict = {'area': area_list, 'area/opt_area': area_div_list,
+                                 'not_clipped_area': not_clipped_area_list,
+                                 'not_clipped_area/opt_area': not_clipped_area_div_list,
+                                 'angle_0_area/opt_area': angle_0_area_div_list,
+                                 'angle_0_not_clipped_area/opt_area': angle_0_not_clipped_area_div_list,
+                                 'opt-area': opt_area_list,
+                                 'polygon count': polygon_count_list}
+    if end_container_list_plots:
+        rect_containers_data_dict['End-Container']=end_container_list_plots
+    return rect_containers_data_dict
+
+
 # # need to update like rectangle_cutter with deviation
 # def find_repition_factor_rectangle_voronoi(cut, rep_high, rep_low=1, rep_steps=1, display_flag=True,
 #                                            intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1]):
@@ -128,46 +142,48 @@
 #             return average_list
 #         average_list.append((rep, average))
 #     return average_list
-#
-#
-# def dict_list_to_ordered_panda_list(dictionary_list: [dict], ordered_by_area=True) -> [pd.DataFrame]:
-#     data_frame_list = []
-#     for dic in dictionary_list:
-#         df = pd.DataFrame(dic)
-#         if ordered_by_area:
-#             data_frame_list.append(df.sort_values(by="area", ascending=False))
-#         else:
-#             data_frame_list.append(df.sort_values(by="not_clipped_area", ascending=False))
-#     return data_frame_list
-#
-#
+
+
+def dict_list_to_ordered_panda_list(dictionary_list: [dict], ordered_by_area=True) -> [pd.DataFrame]:
+    data_frame_list = []
+    for dic in dictionary_list:
+        df = pd.DataFrame(dic)
+        if ordered_by_area:
+            data_frame_list.append(df.sort_values(by="area", ascending=False))
+        else:
+            data_frame_list.append(df.sort_values(by="not_clipped_area", ascending=False))
+    return data_frame_list
+
+
 # def display_panda_df_list(df_list: [pd.DataFrame]) -> None:
 #     for df in df_list:
 #         display(df)
-#
-#
-# def build_aprox_values(panda_data):
-#     mean_opt = 0
-#     mean_not_clipped = 0
-#     mean_angle_0 = 0
-#     mean_angle_0_not_clipped = 0
-#     counter = 0
-#     mean_best = 0
-#     mean_worst = 0
-#     for data in panda_data:
-#         mean_opt += data["area/opt_area"].mean(axis=0)
-#         mean_best += data["area/opt_area"].iloc[-1]
-#         mean_worst += data["area/opt_area"].iloc[0]
-#         mean_not_clipped += data["not_clipped_area/opt_area"].mean(axis=0)
-#         mean_angle_0 += data["angle_0_area/opt_area"].mean(axis=0)
-#         mean_angle_0_not_clipped += data["angle_0_not_clipped_area/opt_area"].mean(axis=0)
-#         counter += 1
-#     mean_opt = mean_opt / counter
-#     mean_best = mean_best / counter
-#     mean_worst = mean_worst / counter
-#     mean_not_clipped = mean_not_clipped / counter
-#     mean_angle_0 = mean_angle_0 / counter
-#     mean_angle_0_not_clipped = mean_angle_0_not_clipped / counter
-#     aprox_dict = dict(aprox=mean_opt, aprox_best=mean_best, aprox_worst=mean_worst, aprox_not_clipped=mean_not_clipped,
-#                       aprox_angle_0=mean_angle_0, aprox_angle_0_not_clipped=mean_angle_0_not_clipped)
-#     return aprox_dict
\ No newline at end of file
+
+
+def build_aprox_values(panda_data):
+    mean_opt = 0
+    mean_not_clipped = 0
+    mean_angle_0 = 0
+    mean_angle_0_not_clipped = 0
+    counter = 0
+    mean_best = 0
+    mean_worst = 0
+    for data in panda_data:
+        mean_opt += data["area/opt_area"].mean(axis=0)
+        mean_best += data["area/opt_area"].iloc[-1]
+        mean_worst += data["area/opt_area"].iloc[0]
+        mean_not_clipped += data["not_clipped_area/opt_area"].mean(axis=0)
+        mean_angle_0 += data["angle_0_area/opt_area"].mean(axis=0)
+        mean_angle_0_not_clipped += data["angle_0_not_clipped_area/opt_area"].mean(axis=0)
+        counter += 1
+    mean_opt = mean_opt / counter
+    mean_best = mean_best / counter
+    mean_worst = mean_worst / counter
+    mean_not_clipped = mean_not_clipped / counter
+    mean_angle_0 = mean_angle_0 / counter
+    mean_angle_0_not_clipped = mean_angle_0_not_clipped / counter
+    aprox_dict = dict(aprox=mean_opt, aprox_best=mean_best, aprox_worst=mean_worst, aprox_not_clipped=mean_not_clipped,
+                      aprox_angle_0=mean_angle_0, aprox_angle_0_not_clipped=mean_angle_0_not_clipped)
+    return aprox_dict
+
+
diff --git a/mysite/plots/packing_algo.py b/mysite/plots/packing_algo.py
index 4ae3f8703d31677c183fa0185f40d15ac447d100..33c5136cc7afc454998d5e81c8149246f551b4ef 100644
--- a/mysite/plots/packing_algo.py
+++ b/mysite/plots/packing_algo.py
@@ -199,7 +199,7 @@ class ConvexPolygon(object):
            spine_bottom, spine_top (Point_xy, Point_xy): a tuple a the lowest and highest vertex or bottom left and
                                                          top left
         """
-        y_sorted_p_p = sorted(self.__shell, key=lambda k: k[1])  # ordering the vertices to their y value
+        y_sorted_p_p = sorted(self.__shell[0:-1], key=lambda k: k[1])  # ordering the vertices to their y values
         if y_sorted_p_p[0][1] == y_sorted_p_p[1][1]:  # if there are two lowest vertices take the left one
             if y_sorted_p_p[0][0] < y_sorted_p_p[1][0]:
                 spine_bottom = y_sorted_p_p[0]
diff --git a/mysite/plots/polygon.txt b/mysite/plots/polygon.txt
index 57a6ad0083f1a246c14d564b339e882314a519cc..688a4d0ded902598826d12a23ee236bc4b44c907 100644
--- a/mysite/plots/polygon.txt
+++ b/mysite/plots/polygon.txt
@@ -1,9 +1,11 @@
 Polygon
 [(686.0, 0.0), (0.0, 41.0), (289.0, 371.0), (686.0, 0.0)]
-[(686.0, 0.0), (1101.9999999999995, 905.0), (1291.9999999999995, 62.0), (686.0, 0.0)]
-[(1842.7583497053038, 0.0), (1286.7583497053042, 4.0), (1332.7583497053042, 513.0), (2047.7583497053038, 608.0), (2023.7583497053038, 423.0), (1842.7583497053038, 0.0)]
-[(316.9999999999998, 905.0), (0.0, 1490.0), (356.9999999999998, 1527.0), (741.9999999999998, 1428.0), (724.9999999999998, 1078.0), (316.9999999999998, 905.0)]
-[(586.0, 1527.0), (0.0, 1540.0), (300.0, 1762.0), (586.0, 1527.0)]
-[(27.26304579339723, 1762.0), (8.413205537806178, 1763.8987341772151), (0.0, 1788.26582278481), (1.490947816826413, 1799.6582278481012), (7.8807241746538885, 1800.0801687763712), (51.43769968051117, 1795.649789029536), (27.26304579339723, 1762.0)]
-[(4.1324156191531145, 1800.0801687763712), (0.0, 1810.483927967384), (13.756594100601824, 1811.809503462764), (13.267229093070533, 1804.739767487404), (4.1324156191531145, 1800.0801687763712)]
-[(0.05437388972569579, 1811.809503462764), (0.0, 1817.1519743986896), (9.406682922545912, 1816.3485953105805), (8.482326797209026, 1813.6171064110094), (0.05437388972569579, 1811.809503462764)]
\ No newline at end of file
+[(1237.7196765498647, 0.0), (681.7196765498652, 4.0), (727.7196765498652, 513.0), (1442.7196765498647, 608.0), (1418.7196765498647, 423.0), (1237.7196765498647, 0.0)]
+[(1756.7358927660807, 0.0), (1439.735892766081, 585.0), (1796.7358927660807, 622.0), (2181.7358927660807, 523.0), (2164.7358927660807, 173.0), (1756.7358927660807, 0.0)]
+[(586.0, 622.0), (0.0, 635.0), (300.0, 857.0), (586.0, 622.0)]
+[(10.22364217252396, 857.0), (0.8519701810436633, 891.493670886076), (0.0, 916.493670886076), (12.247071352502662, 907.9493670886076), (10.22364217252396, 857.0)]
+[(22.56508289290622, 857.0), (11.7024630845995, 894.2362869198312), (13.299907174056372, 910.1645569620254), (23.09756425605852, 907.9493670886076), (22.56508289290622, 857.0)]
+[(27.26304579339723, 916.493670886076), (8.413205537806178, 918.3924050632911), (0.0, 942.7594936708861), (1.490947816826413, 954.1518987341772), (7.8807241746538885, 954.5738396624472), (51.43769968051117, 950.1434599156119), (27.26304579339723, 916.493670886076)]
+[(50.25001012809531, 916.493670886076), (40.25849830881026, 926.7050419270416), (40.158081104596334, 934.4428510388293), (47.63916281853338, 934.3794263739785), (50.25001012809531, 916.493670886076)]
+[(4.1324156191531145, 954.5738396624472), (0.0, 964.97759885346), (13.756594100601824, 966.30317434884), (13.267229093070533, 959.2334383734799), (4.1324156191531145, 954.5738396624472)]
+[(0.05437388972569579, 966.30317434884), (0.0, 971.6456452847656), (9.406682922545912, 970.8422661966565), (8.482326797209026, 968.1107772970854), (0.05437388972569579, 966.30317434884)]
\ No newline at end of file