From e742ce84d418a5fe0a33f9e6aa14146f1c97b299 Mon Sep 17 00:00:00 2001 From: Elijah Andrews <eda1g15@soton.ac.uk> Date: Wed, 1 Feb 2023 12:06:46 +0000 Subject: [PATCH] Added packaged version of bubble analysis GUI. --- .../anisotropy/figure1.py | 0 .../anisotropy/figure2.py | 0 .../anisotropy/figure3.py | 0 .../anisotropy/figure4.py | 0 .../anisotropy/figure5.py | 0 .../anisotropy/figure6.py | 0 .../anisotropy/figure7and8.py | 0 .../model_bem_flat_plate_experiment.py | 0 .../anisotropy/model_bem_slot_experiment.py | 0 .../R1.0_L20_n50000_cn3 | 0 .../model_data/corner_anisotropy_sweep.py | 0 ...4.00_drat0.1_wthresh12.00_len100.0_N33.csv | 0 ...00_H4.00_drat0.1_wthresh12.00_len100.0.csv | 0 ...00_H4.00_drat0.1_wthresh12.00_len100.0.csv | 0 .../model_data/slot_anisotropy_sweep.py | 0 .../R1.0_L15_n20000_i32 | 0 .../model_data/square_anisotropy_sweep.py | 0 .../R1.0_L15_n20000_i32 | 0 .../model_data/triangle_anisotropy_sweep.py | 0 .../anisotropy/model_sa_corner_experiment.py | 0 .../model_sa_equi_triangle_experiment.py | 0 .../anisotropy/model_sa_square_experiment.py | 0 .../anisotropy/util/analysis_utils.py | 0 .../anisotropy/util/bem.py | 0 .../anisotropy/util/determineDisplacement.py | 0 .../anisotropy/util/file_utils.py | 0 .../anisotropy/util/gen_utils.py | 0 .../anisotropy/util/moi_utils.py | 0 .../anisotropy/util/mp4.py | 0 .../anisotropy/util/mraw.py | 0 .../anisotropy/util/plotting_utils.py | 0 .../anisotropy/util/vector_utils.py | 0 packaged-code/pacakged-gui/README.md | 15 + .../pacakged-gui/bubble_analysis_gui.py | 1005 +++++++++++++++++ packaged-code/pacakged-gui/icon.png | Bin 0 -> 197082 bytes .../pacakged-gui/run_bubble_analysis.bat | 2 + .../pacakged-gui}/util/analysis_utils.py | 0 .../pacakged-gui/util/calibration_utils.py | 51 + .../util/determineDisplacement.py | 0 .../pacakged-gui}/util/file_utils.py | 0 .../pacakged-gui}/util/mp4.py | 0 .../pacakged-gui}/util/mraw.py | 0 .../pacakged-gui/util/mraw_converter.py | 170 +++ .../pacakged-gui/util/pixel_correction.py | 69 ++ .../pacakged-gui}/util/plotting_utils.py | 0 packaged-code/pacakged-gui/util/qt_utils.py | 18 + .../pacakged-gui}/util/vector_utils.py | 0 .../complex_geometry_anisotropy_data.csv | 0 .../porous/fig_data/surface_nucleation.mp4 | Bin .../porous/figure10.py | 0 .../porous/figure12.py | 0 .../porous/figure13.py | 0 .../porous/figure14and15.py | 0 .../porous/figure3.py | 0 .../porous/figure4.py | 0 .../porous/figure5.py | 0 .../porous/figure6.py | 0 .../porous/figure7.py | 0 .../porous/figure8.py | 0 .../porous/figure9.py | 0 .../porous/steel_porous_plate_anisotropy.py | 0 .../porous}/util/analysis_utils.py | 0 .../porous/util/bem.py | 0 .../porous}/util/determineDisplacement.py | 0 .../porous/util/drawing_utils.py | 0 .../porous}/util/file_utils.py | 0 .../porous/util/gen_utils.py | 0 .../porous}/util/mp4.py | 0 .../porous}/util/mraw.py | 0 .../porous}/util/plotting_utils.py | 0 .../slots/bem/bem.py | 0 .../slots/bem/slot.py | 0 .../slots/bem/util/file_utils.py | 0 .../slots/bem/util/gen_utils.py | 0 .../slots/bem/util/plotting_utils.py | 0 .../slots}/bem/util/vector_utils.py | 0 .../figure_plots/all_direct_comparisons.py | 0 .../mean_data/mean_sweep_W1H3_Y1.94.csv | 0 .../mean_data/mean_sweep_W1H3_Y2.91.csv | 0 .../mean_data/mean_sweep_W1H3_Y3.89.csv | 0 .../mean_data/mean_sweep_W2H12_Y2.63.csv | 0 .../mean_data/mean_sweep_W2H3a_Y1.77.csv | 0 .../mean_data/mean_sweep_W2H3a_Y2.29.csv | 0 .../mean_data/mean_sweep_W2H3a_Y2.81.csv | 0 .../mean_data/mean_sweep_W2H3a_Y3.32.csv | 0 .../mean_data/mean_sweep_W2H3a_Y3.84.csv | 0 .../mean_data/mean_sweep_W2H3b_Y2.66.csv | 0 .../mean_data/mean_sweep_W2H3b_Y3.68.csv | 0 .../mean_data/mean_sweep_W2H6_Y1.52.csv | 0 .../mean_data/mean_sweep_W2H6_Y1.99.csv | 0 .../mean_data/mean_sweep_W2H6_Y2.48.csv | 0 .../mean_data/mean_sweep_W2H6_Y2.99.csv | 0 .../mean_data/mean_sweep_W2H6_Y3.50.csv | 0 .../mean_data/mean_sweep_W2H9_Y1.66.csv | 0 .../mean_data/mean_sweep_W2H9_Y2.66.csv | 0 .../mean_data/mean_sweep_W4H12_Y2.43.csv | 0 .../mean_data/mean_sweep_W4H12_Y3.43.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y1.94.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y2.91.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y3.89.csv | 0 .../raw_data/raw_data_sweep_W2H12_Y2.63.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y1.77.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y2.29.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y2.81.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y3.32.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y3.84.csv | 0 .../raw_data/raw_data_sweep_W2H3b_Y2.66.csv | 0 .../raw_data/raw_data_sweep_W2H3b_Y3.68.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y1.52.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y1.99.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y2.48.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y2.99.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y3.50.csv | 0 .../raw_data/raw_data_sweep_W2H9_Y1.66.csv | 0 .../raw_data/raw_data_sweep_W2H9_Y2.66.csv | 0 .../raw_data/raw_data_sweep_W4H12_Y2.43.csv | 0 .../raw_data/raw_data_sweep_W4H12_Y3.43.csv | 0 .../shifted_data_sweep_W1H3_Y1.94.csv | 0 .../shifted_data_sweep_W1H3_Y2.91.csv | 0 .../shifted_data_sweep_W1H3_Y3.89.csv | 0 .../shifted_data_sweep_W2H12_Y2.63.csv | 0 .../shifted_data_sweep_W2H3a_Y1.77.csv | 0 .../shifted_data_sweep_W2H3a_Y2.29.csv | 0 .../shifted_data_sweep_W2H3a_Y2.81.csv | 0 .../shifted_data_sweep_W2H3a_Y3.32.csv | 0 .../shifted_data_sweep_W2H3a_Y3.84.csv | 0 .../shifted_data_sweep_W2H3b_Y2.66.csv | 0 .../shifted_data_sweep_W2H3b_Y3.68.csv | 0 .../shifted_data_sweep_W2H6_Y1.52.csv | 0 .../shifted_data_sweep_W2H6_Y1.99.csv | 0 .../shifted_data_sweep_W2H6_Y2.48.csv | 0 .../shifted_data_sweep_W2H6_Y2.99.csv | 0 .../shifted_data_sweep_W2H6_Y3.50.csv | 0 .../shifted_data_sweep_W2H9_Y1.66.csv | 0 .../shifted_data_sweep_W2H9_Y2.66.csv | 0 .../shifted_data_sweep_W4H12_Y2.43.csv | 0 .../shifted_data_sweep_W4H12_Y3.43.csv | 0 .../mean_sweep_W1H3_Y1.94.csv | 0 .../mean_sweep_W1H3_Y2.91.csv | 0 .../mean_sweep_W1H3_Y3.89.csv | 0 .../mean_sweep_W2H12_Y2.63.csv | 0 .../mean_sweep_W2H3a_Y1.77.csv | 0 .../mean_sweep_W2H3a_Y2.29.csv | 0 .../mean_sweep_W2H3a_Y2.81.csv | 0 .../mean_sweep_W2H3a_Y3.32.csv | 0 .../mean_sweep_W2H3a_Y3.84.csv | 0 .../mean_sweep_W2H3b_Y2.66.csv | 0 .../mean_sweep_W2H3b_Y3.68.csv | 0 .../mean_sweep_W2H6_Y1.52.csv | 0 .../mean_sweep_W2H6_Y1.99.csv | 0 .../mean_sweep_W2H6_Y2.48.csv | 0 .../mean_sweep_W2H6_Y2.99.csv | 0 .../mean_sweep_W2H6_Y3.50.csv | 0 .../mean_sweep_W2H9_Y1.66.csv | 0 .../mean_sweep_W2H9_Y2.66.csv | 0 .../mean_sweep_W4H12_Y2.43.csv | 0 .../mean_sweep_W4H12_Y3.43.csv | 0 .../slots/figure_plots/figure10.py | 0 .../slots/figure_plots/figure11.py | 0 .../slots/figure_plots/figure12.py | 0 .../slots/figure_plots/figure13.py | 0 .../figure13_data/W1H3_experimental | 0 .../figure_plots/figure13_data/W1H3_numerical | 0 .../figure13_data/W2H3a_experimental | 0 .../figure13_data/W2H3a_numerical | 0 .../slots/figure_plots/figure5.py | 0 ...0_w2.00_h2.00_drat0.1_wthresh12_len100.csv | 0 ...0_w2.00_h2.00_drat0.1_wthresh12_len100.csv | 0 ....00_H2.00_drat0.1_wthresh12_len100_N64.csv | 0 .../slots/figure_plots/figure6.py | 0 .../figure6_data/h_collapse_n20000_H1.0.csv | 0 .../figure6_data/h_collapse_n20000_H2.0.csv | 0 .../figure6_data/h_collapse_n20000_H3.0.csv | 0 .../figure6_data/h_collapse_n20000_H4.0.csv | 0 .../figure6_data/h_collapse_n20000_H5.0.csv | 0 .../slots/figure_plots/figure7.py | 0 .../figure7_data/y_collapse_n20000_Y1.0.csv | 0 .../figure7_data/y_collapse_n20000_Y2.0.csv | 0 .../figure7_data/y_collapse_n20000_Y3.0.csv | 0 .../figure7_data/y_collapse_n20000_Y4.0.csv | 0 .../figure7_data/y_collapse_n20000_Y5.0.csv | 0 .../slots/figure_plots/figure8.py | 0 .../peak_sweep_20000_16x16_plate_100.csv | 0 .../slots/figure_plots/figure9.py | 0 ...1.94_bem_slot_prediction_20000_0.25_15.csv | 0 ...2.91_bem_slot_prediction_20000_0.25_15.csv | 0 ...3.89_bem_slot_prediction_20000_0.25_15.csv | 0 ...Y1.66_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.66_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.63_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y1.77_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.29_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.81_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.32_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.84_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.66_bem_slot_prediction_20000_0.25_8.csv | 0 ...Y3.68_bem_slot_prediction_20000_0.25_8.csv | 0 ...Y1.52_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y1.99_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.43_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.43_bem_slot_prediction_20000_0.25_5.csv | 0 .../slots/figure_plots/util/analyse_slot.py | 0 .../slots/figure_plots/util/analysis_utils.py | 0 .../slots/figure_plots/util/config_utils.py | 0 .../slots/figure_plots/util/file_utils.py | 0 .../slots/figure_plots/util/plotting_utils.py | 0 .../thesis/chapter 2/fig_data/plasma.mp4 | Bin .../thesis/chapter 2/figure5.py | 0 .../thesis/chapter 2/figure6.py | 0 .../thesis/chapter 2/figure7.py | 0 .../thesis/chapter 2}/util/analysis_utils.py | 0 .../chapter 2}/util/determineDisplacement.py | 0 .../thesis/chapter 2}/util/file_utils.py | 0 .../thesis/chapter 2}/util/mp4.py | 0 .../thesis/chapter 2}/util/mraw.py | 0 .../thesis/chapter 2}/util/plotting_utils.py | 0 .../thesis/chapter 2/util/raytrace.py | 0 .../thesis/chapter 3/bem/bem.py | 0 .../thesis/chapter 3/bem/slot.py | 0 .../thesis/chapter 3/bem/util/file_utils.py | 0 .../thesis/chapter 3/bem/util/gen_utils.py | 0 .../chapter 3/bem/util/plotting_utils.py | 0 .../chapter 3/bem}/util/vector_utils.py | 0 .../figure_plots/all_direct_comparisons.py | 0 .../mean_data/mean_sweep_W1H3_Y1.94.csv | 0 .../mean_data/mean_sweep_W1H3_Y2.91.csv | 0 .../mean_data/mean_sweep_W1H3_Y3.89.csv | 0 .../mean_data/mean_sweep_W2H12_Y2.63.csv | 0 .../mean_data/mean_sweep_W2H3a_Y1.77.csv | 0 .../mean_data/mean_sweep_W2H3a_Y2.29.csv | 0 .../mean_data/mean_sweep_W2H3a_Y2.81.csv | 0 .../mean_data/mean_sweep_W2H3a_Y3.32.csv | 0 .../mean_data/mean_sweep_W2H3a_Y3.84.csv | 0 .../mean_data/mean_sweep_W2H3b_Y2.66.csv | 0 .../mean_data/mean_sweep_W2H3b_Y3.68.csv | 0 .../mean_data/mean_sweep_W2H6_Y1.52.csv | 0 .../mean_data/mean_sweep_W2H6_Y1.99.csv | 0 .../mean_data/mean_sweep_W2H6_Y2.48.csv | 0 .../mean_data/mean_sweep_W2H6_Y2.99.csv | 0 .../mean_data/mean_sweep_W2H6_Y3.50.csv | 0 .../mean_data/mean_sweep_W2H9_Y1.66.csv | 0 .../mean_data/mean_sweep_W2H9_Y2.66.csv | 0 .../mean_data/mean_sweep_W4H12_Y2.43.csv | 0 .../mean_data/mean_sweep_W4H12_Y3.43.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y1.94.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y2.91.csv | 0 .../raw_data/raw_data_sweep_W1H3_Y3.89.csv | 0 .../raw_data/raw_data_sweep_W2H12_Y2.63.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y1.77.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y2.29.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y2.81.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y3.32.csv | 0 .../raw_data/raw_data_sweep_W2H3a_Y3.84.csv | 0 .../raw_data/raw_data_sweep_W2H3b_Y2.66.csv | 0 .../raw_data/raw_data_sweep_W2H3b_Y3.68.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y1.52.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y1.99.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y2.48.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y2.99.csv | 0 .../raw_data/raw_data_sweep_W2H6_Y3.50.csv | 0 .../raw_data/raw_data_sweep_W2H9_Y1.66.csv | 0 .../raw_data/raw_data_sweep_W2H9_Y2.66.csv | 0 .../raw_data/raw_data_sweep_W4H12_Y2.43.csv | 0 .../raw_data/raw_data_sweep_W4H12_Y3.43.csv | 0 .../shifted_data_sweep_W1H3_Y1.94.csv | 0 .../shifted_data_sweep_W1H3_Y2.91.csv | 0 .../shifted_data_sweep_W1H3_Y3.89.csv | 0 .../shifted_data_sweep_W2H12_Y2.63.csv | 0 .../shifted_data_sweep_W2H3a_Y1.77.csv | 0 .../shifted_data_sweep_W2H3a_Y2.29.csv | 0 .../shifted_data_sweep_W2H3a_Y2.81.csv | 0 .../shifted_data_sweep_W2H3a_Y3.32.csv | 0 .../shifted_data_sweep_W2H3a_Y3.84.csv | 0 .../shifted_data_sweep_W2H3b_Y2.66.csv | 0 .../shifted_data_sweep_W2H3b_Y3.68.csv | 0 .../shifted_data_sweep_W2H6_Y1.52.csv | 0 .../shifted_data_sweep_W2H6_Y1.99.csv | 0 .../shifted_data_sweep_W2H6_Y2.48.csv | 0 .../shifted_data_sweep_W2H6_Y2.99.csv | 0 .../shifted_data_sweep_W2H6_Y3.50.csv | 0 .../shifted_data_sweep_W2H9_Y1.66.csv | 0 .../shifted_data_sweep_W2H9_Y2.66.csv | 0 .../shifted_data_sweep_W4H12_Y2.43.csv | 0 .../shifted_data_sweep_W4H12_Y3.43.csv | 0 .../mean_sweep_W1H3_Y1.94.csv | 0 .../mean_sweep_W1H3_Y2.91.csv | 0 .../mean_sweep_W1H3_Y3.89.csv | 0 .../mean_sweep_W2H12_Y2.63.csv | 0 .../mean_sweep_W2H3a_Y1.77.csv | 0 .../mean_sweep_W2H3a_Y2.29.csv | 0 .../mean_sweep_W2H3a_Y2.81.csv | 0 .../mean_sweep_W2H3a_Y3.32.csv | 0 .../mean_sweep_W2H3a_Y3.84.csv | 0 .../mean_sweep_W2H3b_Y2.66.csv | 0 .../mean_sweep_W2H3b_Y3.68.csv | 0 .../mean_sweep_W2H6_Y1.52.csv | 0 .../mean_sweep_W2H6_Y1.99.csv | 0 .../mean_sweep_W2H6_Y2.48.csv | 0 .../mean_sweep_W2H6_Y2.99.csv | 0 .../mean_sweep_W2H6_Y3.50.csv | 0 .../mean_sweep_W2H9_Y1.66.csv | 0 .../mean_sweep_W2H9_Y2.66.csv | 0 .../mean_sweep_W4H12_Y2.43.csv | 0 .../mean_sweep_W4H12_Y3.43.csv | 0 .../thesis/chapter 3/figure_plots/figure10.py | 0 .../peak_sweep_20000_16x16_plate_100.csv | 0 .../thesis/chapter 3/figure_plots/figure11.py | 0 .../thesis/chapter 3/figure_plots/figure12.py | 0 .../thesis/chapter 3/figure_plots/figure13.py | 0 .../thesis/chapter 3/figure_plots/figure14.py | 0 .../thesis/chapter 3/figure_plots/figure15.py | 0 .../figure15_data/W1H3_experimental | 0 .../figure_plots/figure15_data/W1H3_numerical | 0 .../figure15_data/W2H3a_experimental | 0 .../figure15_data/W2H3a_numerical | 0 .../thesis/chapter 3/figure_plots/figure4.py | 0 .../thesis/chapter 3/figure_plots/figure6.py | 0 .../uniform_corner_rms_between_panels_10.csv | 0 .../uniform_corner_rms_between_panels_100.csv | 0 .../uniform_corner_rms_between_panels_150.csv | 0 .../uniform_corner_rms_between_panels_20.csv | 0 .../uniform_corner_rms_between_panels_200.csv | 0 .../uniform_corner_rms_between_panels_250.csv | 0 .../uniform_corner_rms_between_panels_30.csv | 0 .../uniform_corner_rms_between_panels_40.csv | 0 .../uniform_corner_rms_between_panels_50.csv | 0 .../thesis/chapter 3/figure_plots/figure7.py | 0 ...0_w2.00_h2.00_drat0.1_wthresh12_len100.csv | 0 ...0_w2.00_h2.00_drat0.1_wthresh12_len100.csv | 0 ....00_H2.00_drat0.1_wthresh12_len100_N64.csv | 0 .../thesis/chapter 3/figure_plots/figure8.py | 0 .../figure8_data/h_collapse_n20000_H1.0.csv | 0 .../figure8_data/h_collapse_n20000_H2.0.csv | 0 .../figure8_data/h_collapse_n20000_H3.0.csv | 0 .../figure8_data/h_collapse_n20000_H4.0.csv | 0 .../figure8_data/h_collapse_n20000_H5.0.csv | 0 .../thesis/chapter 3/figure_plots/figure9.py | 0 .../figure9_data/y_collapse_n20000_Y1.0.csv | 0 .../figure9_data/y_collapse_n20000_Y2.0.csv | 0 .../figure9_data/y_collapse_n20000_Y3.0.csv | 0 .../figure9_data/y_collapse_n20000_Y4.0.csv | 0 .../figure9_data/y_collapse_n20000_Y5.0.csv | 0 ...1.94_bem_slot_prediction_20000_0.25_15.csv | 0 ...2.91_bem_slot_prediction_20000_0.25_15.csv | 0 ...3.89_bem_slot_prediction_20000_0.25_15.csv | 0 ...Y1.66_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.66_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.63_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y1.77_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.29_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.81_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.32_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.84_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.66_bem_slot_prediction_20000_0.25_8.csv | 0 ...Y3.68_bem_slot_prediction_20000_0.25_8.csv | 0 ...Y1.52_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y1.99_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y2.43_bem_slot_prediction_20000_0.25_5.csv | 0 ...Y3.43_bem_slot_prediction_20000_0.25_5.csv | 0 .../figure_plots/util/analyse_slot.py | 0 .../figure_plots/util/analysis_utils.py | 0 .../thesis/chapter 3/figure_plots/util/bem.py | 0 .../figure_plots/util/config_utils.py | 0 .../figure_plots/util/element_utils.py | 0 .../chapter 3/figure_plots/util/elements.py | 0 .../chapter 3/figure_plots/util/file_utils.py | 0 .../chapter 3/figure_plots/util/gen_utils.py | 0 .../figure_plots/util/plotting_utils.py | 0 .../figure_plots}/util/vector_utils.py | 0 .../thesis/chapter 4/figure1.py | 0 .../thesis/chapter 4/figure2.py | 0 .../thesis/chapter 4/figure3.py | 0 .../thesis/chapter 4/figure4.py | 0 .../thesis/chapter 4/figure5.py | 0 .../thesis/chapter 4/figure6and7.py | 0 .../model_bem_flat_plate_experiment.py | 0 .../chapter 4/model_bem_slot_experiment.py | 0 .../R1.0_L20_n50000_cn3 | 0 .../model_data/corner_anisotropy_sweep.py | 0 ...4.00_drat0.1_wthresh12.00_len100.0_N33.csv | 0 ...00_H4.00_drat0.1_wthresh12.00_len100.0.csv | 0 ...00_H4.00_drat0.1_wthresh12.00_len100.0.csv | 0 .../model_data/slot_anisotropy_sweep.py | 0 .../R1.0_L15_n20000_i32 | 0 .../model_data/square_anisotropy_sweep.py | 0 .../R1.0_L15_n20000_i32 | 0 .../model_data/triangle_anisotropy_sweep.py | 0 .../chapter 4/model_sa_corner_experiment.py | 0 .../model_sa_equi_triangle_experiment.py | 0 .../chapter 4/model_sa_square_experiment.py | 0 .../thesis/chapter 4}/util/analysis_utils.py | 0 .../thesis/chapter 4/util/bem.py | 0 .../chapter 4}/util/determineDisplacement.py | 0 .../thesis/chapter 4}/util/file_utils.py | 0 .../thesis/chapter 4/util/gen_utils.py | 0 .../thesis/chapter 4/util/moi_utils.py | 0 .../thesis/chapter 4}/util/mp4.py | 0 .../thesis/chapter 4}/util/mraw.py | 0 .../thesis/chapter 4}/util/plotting_utils.py | 0 .../thesis/chapter 4/util/vector_utils.py | 57 + .../complex_geometry_anisotropy_data.csv | 0 .../chapter 5/fig_data/surface_nucleation.mp4 | Bin .../thesis/chapter 5/figure10.py | 0 .../thesis/chapter 5/figure11.py | 0 .../thesis/chapter 5/figure12and13.py | 0 .../thesis/chapter 5/figure2.py | 0 .../thesis/chapter 5/figure3.py | 0 .../thesis/chapter 5/figure4.py | 0 .../thesis/chapter 5/figure5.py | 0 .../thesis/chapter 5/figure6.py | 0 .../thesis/chapter 5/figure7.py | 0 .../thesis/chapter 5/figure8.py | 0 .../steel_porous_plate_anisotropy.py | 0 .../thesis/chapter 5/util/analysis_utils.py | 641 +++++++++++ .../thesis/chapter 5/util/bem.py | 0 .../chapter 5/util/determineDisplacement.py | 69 ++ .../thesis/chapter 5/util/drawing_utils.py | 0 .../thesis/chapter 5/util/file_utils.py | 118 ++ .../thesis/chapter 5/util/gen_utils.py | 0 packaged-code/thesis/chapter 5/util/mp4.py | 45 + packaged-code/thesis/chapter 5/util/mraw.py | 174 +++ .../thesis/chapter 5/util/plotting_utils.py | 260 +++++ 422 files changed, 2694 insertions(+) rename {paper_code => packaged-code}/anisotropy/figure1.py (100%) rename {paper_code => packaged-code}/anisotropy/figure2.py (100%) rename {paper_code => packaged-code}/anisotropy/figure3.py (100%) rename {paper_code => packaged-code}/anisotropy/figure4.py (100%) rename {paper_code => packaged-code}/anisotropy/figure5.py (100%) rename {paper_code => packaged-code}/anisotropy/figure6.py (100%) rename {paper_code => packaged-code}/anisotropy/figure7and8.py (100%) rename {paper_code => packaged-code}/anisotropy/model_bem_flat_plate_experiment.py (100%) rename {paper_code => packaged-code}/anisotropy/model_bem_slot_experiment.py (100%) rename {paper_code => packaged-code}/anisotropy/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 (100%) rename {paper_code => packaged-code}/anisotropy/model_data/corner_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/anisotropy/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv (100%) rename {paper_code => packaged-code}/anisotropy/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv (100%) rename {paper_code => packaged-code}/anisotropy/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv (100%) rename {paper_code => packaged-code}/anisotropy/model_data/slot_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/anisotropy/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 (100%) rename {paper_code => packaged-code}/anisotropy/model_data/square_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/anisotropy/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 (100%) rename {paper_code => packaged-code}/anisotropy/model_data/triangle_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/anisotropy/model_sa_corner_experiment.py (100%) rename {paper_code => packaged-code}/anisotropy/model_sa_equi_triangle_experiment.py (100%) rename {paper_code => packaged-code}/anisotropy/model_sa_square_experiment.py (100%) rename {paper_code => packaged-code}/anisotropy/util/analysis_utils.py (100%) rename {paper_code => packaged-code}/anisotropy/util/bem.py (100%) rename {paper_code => packaged-code}/anisotropy/util/determineDisplacement.py (100%) rename {paper_code => packaged-code}/anisotropy/util/file_utils.py (100%) rename {paper_code => packaged-code}/anisotropy/util/gen_utils.py (100%) rename {paper_code => packaged-code}/anisotropy/util/moi_utils.py (100%) rename {paper_code => packaged-code}/anisotropy/util/mp4.py (100%) rename {paper_code => packaged-code}/anisotropy/util/mraw.py (100%) rename {paper_code => packaged-code}/anisotropy/util/plotting_utils.py (100%) rename {paper_code => packaged-code}/anisotropy/util/vector_utils.py (100%) create mode 100644 packaged-code/pacakged-gui/README.md create mode 100644 packaged-code/pacakged-gui/bubble_analysis_gui.py create mode 100644 packaged-code/pacakged-gui/icon.png create mode 100644 packaged-code/pacakged-gui/run_bubble_analysis.bat rename {paper_code/porous => packaged-code/pacakged-gui}/util/analysis_utils.py (100%) create mode 100644 packaged-code/pacakged-gui/util/calibration_utils.py rename {paper_code/porous => packaged-code/pacakged-gui}/util/determineDisplacement.py (100%) rename {paper_code/porous => packaged-code/pacakged-gui}/util/file_utils.py (100%) rename {paper_code/porous => packaged-code/pacakged-gui}/util/mp4.py (100%) rename {paper_code/porous => packaged-code/pacakged-gui}/util/mraw.py (100%) create mode 100644 packaged-code/pacakged-gui/util/mraw_converter.py create mode 100644 packaged-code/pacakged-gui/util/pixel_correction.py rename {paper_code/porous => packaged-code/pacakged-gui}/util/plotting_utils.py (100%) create mode 100644 packaged-code/pacakged-gui/util/qt_utils.py rename {paper_code/slots/bem => packaged-code/pacakged-gui}/util/vector_utils.py (100%) rename {paper_code => packaged-code}/porous/fig_data/complex_geometry_anisotropy_data.csv (100%) rename {paper_code => packaged-code}/porous/fig_data/surface_nucleation.mp4 (100%) rename {paper_code => packaged-code}/porous/figure10.py (100%) rename {paper_code => packaged-code}/porous/figure12.py (100%) rename {paper_code => packaged-code}/porous/figure13.py (100%) rename {paper_code => packaged-code}/porous/figure14and15.py (100%) rename {paper_code => packaged-code}/porous/figure3.py (100%) rename {paper_code => packaged-code}/porous/figure4.py (100%) rename {paper_code => packaged-code}/porous/figure5.py (100%) rename {paper_code => packaged-code}/porous/figure6.py (100%) rename {paper_code => packaged-code}/porous/figure7.py (100%) rename {paper_code => packaged-code}/porous/figure8.py (100%) rename {paper_code => packaged-code}/porous/figure9.py (100%) rename {paper_code => packaged-code}/porous/steel_porous_plate_anisotropy.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/analysis_utils.py (100%) rename {paper_code => packaged-code}/porous/util/bem.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/determineDisplacement.py (100%) rename {paper_code => packaged-code}/porous/util/drawing_utils.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/file_utils.py (100%) rename {paper_code => packaged-code}/porous/util/gen_utils.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/mp4.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/mraw.py (100%) rename {paper_code/thesis/chapter 2 => packaged-code/porous}/util/plotting_utils.py (100%) rename {paper_code => packaged-code}/slots/bem/bem.py (100%) rename {paper_code => packaged-code}/slots/bem/slot.py (100%) rename {paper_code => packaged-code}/slots/bem/util/file_utils.py (100%) rename {paper_code => packaged-code}/slots/bem/util/gen_utils.py (100%) rename {paper_code => packaged-code}/slots/bem/util/plotting_utils.py (100%) rename {paper_code/thesis/chapter 3 => packaged-code/slots}/bem/util/vector_utils.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/all_direct_comparisons.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure10.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure11.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure12.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure13.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure13_data/W1H3_experimental (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure13_data/W1H3_numerical (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure13_data/W2H3a_experimental (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure13_data/W2H3a_numerical (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure5.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure5_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure5_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure5_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6_data/h_collapse_n20000_H1.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6_data/h_collapse_n20000_H2.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6_data/h_collapse_n20000_H3.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6_data/h_collapse_n20000_H4.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure6_data/h_collapse_n20000_H5.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7_data/y_collapse_n20000_Y1.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7_data/y_collapse_n20000_Y2.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7_data/y_collapse_n20000_Y3.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7_data/y_collapse_n20000_Y4.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure7_data/y_collapse_n20000_Y5.0.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure8.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure8_data/peak_sweep_20000_16x16_plate_100.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/figure9.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/slots/figure_plots/util/analyse_slot.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/util/analysis_utils.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/util/config_utils.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/util/file_utils.py (100%) rename {paper_code => packaged-code}/slots/figure_plots/util/plotting_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 2/fig_data/plasma.mp4 (100%) rename {paper_code => packaged-code}/thesis/chapter 2/figure5.py (100%) rename {paper_code => packaged-code}/thesis/chapter 2/figure6.py (100%) rename {paper_code => packaged-code}/thesis/chapter 2/figure7.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/analysis_utils.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/determineDisplacement.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/file_utils.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/mp4.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/mraw.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 2}/util/plotting_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 2/util/raytrace.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/bem/bem.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/bem/slot.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/bem/util/file_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/bem/util/gen_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/bem/util/plotting_utils.py (100%) rename {paper_code/thesis/chapter 3/figure_plots => packaged-code/thesis/chapter 3/bem}/util/vector_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/all_direct_comparisons.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure10.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure10_data/peak_sweep_20000_16x16_plate_100.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure11.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure12.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure13.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure14.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure15.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure15_data/W1H3_experimental (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure15_data/W1H3_numerical (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure15_data/W2H3a_experimental (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure15_data/W2H3a_numerical (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure4.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_10.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_100.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_150.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_20.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_200.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_250.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_30.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_40.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_50.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure7.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure7_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure7_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure7_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H1.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H2.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H3.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H4.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H5.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y1.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y2.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y3.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y4.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y5.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/analyse_slot.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/analysis_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/bem.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/config_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/element_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/elements.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/file_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/gen_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 3/figure_plots/util/plotting_utils.py (100%) rename {paper_code/thesis/chapter 4 => packaged-code/thesis/chapter 3/figure_plots}/util/vector_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure1.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure2.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure3.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure4.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure5.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/figure6and7.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_bem_flat_plate_experiment.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_bem_slot_experiment.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/corner_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/slot_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/square_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_data/triangle_anisotropy_sweep.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_sa_corner_experiment.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_sa_equi_triangle_experiment.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/model_sa_square_experiment.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/analysis_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/util/bem.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/determineDisplacement.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/file_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/util/gen_utils.py (100%) rename {paper_code => packaged-code}/thesis/chapter 4/util/moi_utils.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/mp4.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/mraw.py (100%) rename {paper_code/thesis/chapter 5 => packaged-code/thesis/chapter 4}/util/plotting_utils.py (100%) create mode 100644 packaged-code/thesis/chapter 4/util/vector_utils.py rename {paper_code => packaged-code}/thesis/chapter 5/fig_data/complex_geometry_anisotropy_data.csv (100%) rename {paper_code => packaged-code}/thesis/chapter 5/fig_data/surface_nucleation.mp4 (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure10.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure11.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure12and13.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure2.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure3.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure4.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure5.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure6.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure7.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/figure8.py (100%) rename {paper_code => packaged-code}/thesis/chapter 5/steel_porous_plate_anisotropy.py (100%) create mode 100644 packaged-code/thesis/chapter 5/util/analysis_utils.py rename {paper_code => packaged-code}/thesis/chapter 5/util/bem.py (100%) create mode 100644 packaged-code/thesis/chapter 5/util/determineDisplacement.py rename {paper_code => packaged-code}/thesis/chapter 5/util/drawing_utils.py (100%) create mode 100644 packaged-code/thesis/chapter 5/util/file_utils.py rename {paper_code => packaged-code}/thesis/chapter 5/util/gen_utils.py (100%) create mode 100644 packaged-code/thesis/chapter 5/util/mp4.py create mode 100644 packaged-code/thesis/chapter 5/util/mraw.py create mode 100644 packaged-code/thesis/chapter 5/util/plotting_utils.py diff --git a/paper_code/anisotropy/figure1.py b/packaged-code/anisotropy/figure1.py similarity index 100% rename from paper_code/anisotropy/figure1.py rename to packaged-code/anisotropy/figure1.py diff --git a/paper_code/anisotropy/figure2.py b/packaged-code/anisotropy/figure2.py similarity index 100% rename from paper_code/anisotropy/figure2.py rename to packaged-code/anisotropy/figure2.py diff --git a/paper_code/anisotropy/figure3.py b/packaged-code/anisotropy/figure3.py similarity index 100% rename from paper_code/anisotropy/figure3.py rename to packaged-code/anisotropy/figure3.py diff --git a/paper_code/anisotropy/figure4.py b/packaged-code/anisotropy/figure4.py similarity index 100% rename from paper_code/anisotropy/figure4.py rename to packaged-code/anisotropy/figure4.py diff --git a/paper_code/anisotropy/figure5.py b/packaged-code/anisotropy/figure5.py similarity index 100% rename from paper_code/anisotropy/figure5.py rename to packaged-code/anisotropy/figure5.py diff --git a/paper_code/anisotropy/figure6.py b/packaged-code/anisotropy/figure6.py similarity index 100% rename from paper_code/anisotropy/figure6.py rename to packaged-code/anisotropy/figure6.py diff --git a/paper_code/anisotropy/figure7and8.py b/packaged-code/anisotropy/figure7and8.py similarity index 100% rename from paper_code/anisotropy/figure7and8.py rename to packaged-code/anisotropy/figure7and8.py diff --git a/paper_code/anisotropy/model_bem_flat_plate_experiment.py b/packaged-code/anisotropy/model_bem_flat_plate_experiment.py similarity index 100% rename from paper_code/anisotropy/model_bem_flat_plate_experiment.py rename to packaged-code/anisotropy/model_bem_flat_plate_experiment.py diff --git a/paper_code/anisotropy/model_bem_slot_experiment.py b/packaged-code/anisotropy/model_bem_slot_experiment.py similarity index 100% rename from paper_code/anisotropy/model_bem_slot_experiment.py rename to packaged-code/anisotropy/model_bem_slot_experiment.py diff --git a/paper_code/anisotropy/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 b/packaged-code/anisotropy/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 similarity index 100% rename from paper_code/anisotropy/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 rename to packaged-code/anisotropy/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 diff --git a/paper_code/anisotropy/model_data/corner_anisotropy_sweep.py b/packaged-code/anisotropy/model_data/corner_anisotropy_sweep.py similarity index 100% rename from paper_code/anisotropy/model_data/corner_anisotropy_sweep.py rename to packaged-code/anisotropy/model_data/corner_anisotropy_sweep.py diff --git a/paper_code/anisotropy/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv b/packaged-code/anisotropy/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv similarity index 100% rename from paper_code/anisotropy/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv rename to packaged-code/anisotropy/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv diff --git a/paper_code/anisotropy/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv b/packaged-code/anisotropy/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv similarity index 100% rename from paper_code/anisotropy/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv rename to packaged-code/anisotropy/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv diff --git a/paper_code/anisotropy/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv b/packaged-code/anisotropy/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv similarity index 100% rename from paper_code/anisotropy/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv rename to packaged-code/anisotropy/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv diff --git a/paper_code/anisotropy/model_data/slot_anisotropy_sweep.py b/packaged-code/anisotropy/model_data/slot_anisotropy_sweep.py similarity index 100% rename from paper_code/anisotropy/model_data/slot_anisotropy_sweep.py rename to packaged-code/anisotropy/model_data/slot_anisotropy_sweep.py diff --git a/paper_code/anisotropy/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 b/packaged-code/anisotropy/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 similarity index 100% rename from paper_code/anisotropy/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 rename to packaged-code/anisotropy/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 diff --git a/paper_code/anisotropy/model_data/square_anisotropy_sweep.py b/packaged-code/anisotropy/model_data/square_anisotropy_sweep.py similarity index 100% rename from paper_code/anisotropy/model_data/square_anisotropy_sweep.py rename to packaged-code/anisotropy/model_data/square_anisotropy_sweep.py diff --git a/paper_code/anisotropy/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 b/packaged-code/anisotropy/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 similarity index 100% rename from paper_code/anisotropy/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 rename to packaged-code/anisotropy/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 diff --git a/paper_code/anisotropy/model_data/triangle_anisotropy_sweep.py b/packaged-code/anisotropy/model_data/triangle_anisotropy_sweep.py similarity index 100% rename from paper_code/anisotropy/model_data/triangle_anisotropy_sweep.py rename to packaged-code/anisotropy/model_data/triangle_anisotropy_sweep.py diff --git a/paper_code/anisotropy/model_sa_corner_experiment.py b/packaged-code/anisotropy/model_sa_corner_experiment.py similarity index 100% rename from paper_code/anisotropy/model_sa_corner_experiment.py rename to packaged-code/anisotropy/model_sa_corner_experiment.py diff --git a/paper_code/anisotropy/model_sa_equi_triangle_experiment.py b/packaged-code/anisotropy/model_sa_equi_triangle_experiment.py similarity index 100% rename from paper_code/anisotropy/model_sa_equi_triangle_experiment.py rename to packaged-code/anisotropy/model_sa_equi_triangle_experiment.py diff --git a/paper_code/anisotropy/model_sa_square_experiment.py b/packaged-code/anisotropy/model_sa_square_experiment.py similarity index 100% rename from paper_code/anisotropy/model_sa_square_experiment.py rename to packaged-code/anisotropy/model_sa_square_experiment.py diff --git a/paper_code/anisotropy/util/analysis_utils.py b/packaged-code/anisotropy/util/analysis_utils.py similarity index 100% rename from paper_code/anisotropy/util/analysis_utils.py rename to packaged-code/anisotropy/util/analysis_utils.py diff --git a/paper_code/anisotropy/util/bem.py b/packaged-code/anisotropy/util/bem.py similarity index 100% rename from paper_code/anisotropy/util/bem.py rename to packaged-code/anisotropy/util/bem.py diff --git a/paper_code/anisotropy/util/determineDisplacement.py b/packaged-code/anisotropy/util/determineDisplacement.py similarity index 100% rename from paper_code/anisotropy/util/determineDisplacement.py rename to packaged-code/anisotropy/util/determineDisplacement.py diff --git a/paper_code/anisotropy/util/file_utils.py b/packaged-code/anisotropy/util/file_utils.py similarity index 100% rename from paper_code/anisotropy/util/file_utils.py rename to packaged-code/anisotropy/util/file_utils.py diff --git a/paper_code/anisotropy/util/gen_utils.py b/packaged-code/anisotropy/util/gen_utils.py similarity index 100% rename from paper_code/anisotropy/util/gen_utils.py rename to packaged-code/anisotropy/util/gen_utils.py diff --git a/paper_code/anisotropy/util/moi_utils.py b/packaged-code/anisotropy/util/moi_utils.py similarity index 100% rename from paper_code/anisotropy/util/moi_utils.py rename to packaged-code/anisotropy/util/moi_utils.py diff --git a/paper_code/anisotropy/util/mp4.py b/packaged-code/anisotropy/util/mp4.py similarity index 100% rename from paper_code/anisotropy/util/mp4.py rename to packaged-code/anisotropy/util/mp4.py diff --git a/paper_code/anisotropy/util/mraw.py b/packaged-code/anisotropy/util/mraw.py similarity index 100% rename from paper_code/anisotropy/util/mraw.py rename to packaged-code/anisotropy/util/mraw.py diff --git a/paper_code/anisotropy/util/plotting_utils.py b/packaged-code/anisotropy/util/plotting_utils.py similarity index 100% rename from paper_code/anisotropy/util/plotting_utils.py rename to packaged-code/anisotropy/util/plotting_utils.py diff --git a/paper_code/anisotropy/util/vector_utils.py b/packaged-code/anisotropy/util/vector_utils.py similarity index 100% rename from paper_code/anisotropy/util/vector_utils.py rename to packaged-code/anisotropy/util/vector_utils.py diff --git a/packaged-code/pacakged-gui/README.md b/packaged-code/pacakged-gui/README.md new file mode 100644 index 0000000..558cbfe --- /dev/null +++ b/packaged-code/pacakged-gui/README.md @@ -0,0 +1,15 @@ +# Bubble Analysis GUI +`bubble_analysis_gui.py` is a GUI program written with PyQt5 that allows a series of readings to be inspected and analysed easily. A demonstration can be found [here](https://xorg.us/2018-07-18_12-07-23.mp4). + +#### Instructions +1) On running the script a file selection prompt will appear. Select the folder that contains the index.csv file. +2) Find as many readings in your data that contain the same geometry and have a common coordinate (for example a constant y). Navigate to an empty frame (no bubble) and click 'Add Frame' under 'Calibration'. If you select incorrect frames you can restart by clicking 'Clear Frames'. When you have selected a series of frames click 'Calibrate'. This will take a moment to run and will result in a 'mm/px' value being shown in the 'Calibration' status box. +3) You can navigate through your data with the navigation buttons provided or slide the slider to advance through the frames. +4) You can click on a frame to take measurements, left click once at the start of your measurement and again at the end. A red line will appear and the status box at the bottom of the window will show details about your measurement. The angle noted is measured from the positive horizontal (x) direction anti-clockwise (Note: the order in which you choose your points is important in angle measurement). Right clicking will clear your measurement. +5) There are numerous other options for debugging and information. + +#### Recording Data +To use this analysis tool data must be recorded in the correct format. +- index.csv must be a CSV file with headers "x", "y", "idx" (names are not important but order is). +- Each position index should have its own directory containing movies. +It is suggested to view the existing data as a reference. \ No newline at end of file diff --git a/packaged-code/pacakged-gui/bubble_analysis_gui.py b/packaged-code/pacakged-gui/bubble_analysis_gui.py new file mode 100644 index 0000000..00f3621 --- /dev/null +++ b/packaged-code/pacakged-gui/bubble_analysis_gui.py @@ -0,0 +1,1005 @@ +""" +A program that displays frames from positions and allows them to be measured. + +TODO: +- Allow measurements to be saved for use in other scripts + -> Ensure measurements allow for reproducibility and repeatability. + -> Save to file and allow minor variations to assess error. +- Create a better position selection UI (grid of images?). + -> Maybe make a composite image from all the positions after calibration. + -> Snap to the nearest position centered on the cursor (allow clicking and dragging). +(- Implement zooming + -> Zoom parameter exists but zoom center and actual zooming is not implemented.)? +""" + +import ctypes +import importlib +import math +import os +import sys +import time + +import numpy as np +from PyQt5 import QtGui +from PyQt5.QtCore import Qt, QTimer, QSize, QThread, QObject, pyqtSignal +from PyQt5.QtGui import QPainter, QPen, QIcon, QPixmap, QResizeEvent +from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QHBoxLayout, QTextBrowser, QMainWindow, \ + QPushButton, QSlider, QSpacerItem, QSizePolicy, QStyle, QFileDialog, QLayout, QCheckBox + +import util.vector_utils as vect +import util.analysis_utils as au +import util.calibration_utils as cu +import util.determineDisplacement as dd +import util.file_utils as file +import util.mraw_converter as mraw_converter +import util.qt_utils as qtu +from util.pixel_correction import load_norm_mat + + +class JumpSlider(QSlider): + """ From https://stackoverflow.com/a/29639127/5270376 """ + + def mousePressEvent(self, ev): + """ Jump to click position """ + self.setValue(QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.x(), self.width())) + + def mouseMoveEvent(self, ev): + """ Jump to pointer position while moving """ + self.setValue(QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.x(), self.width())) + + +class Player(QObject): + frames = None + fps = None + skip = False + frame_update = pyqtSignal(int) + finished = pyqtSignal() + + def __init__(self, frames=100, fps=30) -> None: + super().__init__() + self.frames = frames + self.fps = fps + + def play(self, i=0): + last_time = None + while i < self.frames and not self.skip: + if last_time is None or time.time() - last_time > 1 / self.fps: + self.frame_update.emit(i) + i += 1 + last_time = time.time() + app.processEvents() + self.skip = False + self.finished.emit() + + +class PositionSelection(QWidget): + """ + TODO: + -> Maybe make a composite image from all the positions after calibration. + -> Snap to the nearest position centered on the cursor (allow clicking and dragging). + """ + + +class ImageDisplayWidget(QWidget): + pixmap = None + + height = None + width = None + + def set_size(self): + self.setMinimumHeight(self.pixmap.height()) + self.setMinimumWidth(self.pixmap.width()) + + self.setMaximumHeight(self.pixmap.height()) + self.setMaximumWidth(self.pixmap.width()) + + def set_image(self, image): + pixmap = qtu.frame_to_pixmap(image) + pixmap = pixmap.scaledToHeight(pixmap.height()) + + self.pixmap = pixmap + + self.set_size() + self.update() + + def set_image_from_png(self, png_path, scale=0.5): + self.pixmap = QPixmap(png_path) + + self.pixmap = self.pixmap.scaledToHeight(int(round(self.pixmap.height() * scale))) + + self.set_size() + + self.update() + + def clear_image(self): + self.pixmap = None + self.setAutoFillBackground(True) + p = self.palette() + p.setColor(self.backgroundRole(), Qt.gray) + self.setPalette(p) + + self.update() + + def paintEvent(self, e): + if self.pixmap is not None: + # Draw frame. + qp = QPainter() + if qp.isActive(): + qp.setRenderHint(QPainter.Antialiasing) + qp.begin(self) + qp.drawPixmap(0, 0, self.pixmap) + qp.end() + + +class DataWidget(QWidget): + point_1 = None + point_2 = None + frame_idx = None + repeat_idx = None + position_idx = None + total_frames = None + movie = None + norm_mat = None + + scale = None + mm_per_pixel = None + + file_dir = None + + positions = None + + position_prefix = None + + draw_binary = False + show_debug = False + raw = False + + def __init__(self, text_area, position_status, file_dir, aux_box: ImageDisplayWidget, main_window: QMainWindow, + scale=1, parent=None, frame_idx=0, max_frames=100): + if parent: + super().__init__(parent) + else: + super().__init__() + self.text_area = text_area + self.position_status = position_status + self.aux_box = aux_box + self.main_window = main_window + + self.frame_idx = frame_idx + self.max_frames = max_frames + + self.scale = scale + + self.change_dir(file_dir) + + self.width = self.scale * 384 + self.height = self.scale * 264 + self.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) + + # self.setAutoFillBackground(True) + # p = self.palette() + # p.setColor(self.backgroundRole(), Qt.black) + # self.setPalette(p) + + self.update_text() + + def sizeHint(self): + return QSize(384, 264) + + def change_dir(self, file_dir): + # Reset to zero to avoid jumping into a position that doesn't exist + self.frame_idx = 0 + self.repeat_idx = 0 + + self.file_dir = file_dir + self.set_positions(file_dir) + + self.norm_mat = load_norm_mat(file_dir) + if np.std(self.norm_mat) > 0.1: # Something has probably gone wrong + print("Warning: Pixel correction matrix (norm_mat) appears to have malfunctioned and so will be ignored.") + self.norm_mat = None + + self.position_prefix = file.get_prefix_from_idxs(file_dir, np.array(self.positions)[:, 2][0:5]) + + self.set_position(0) + if hasattr(self.main_window, "calibration"): + self.main_window.calibration.load_calibration() + + def set_positions(self, file_dir): + index_file = open(file_dir + "index.csv") + index_lines = index_file.readlines() + + positions = [] # x, y, index + + for i in range(1, len(index_lines)): # Start at 1 to skip header. + split = index_lines[i].strip().split(",") + positions.append([float(split[0]), float(split[1]), split[2]]) # x, y, index number + + # Sort by x + self.positions = sorted(positions, key=lambda r: float(r[2])) + + def update(self): + super().update() + self.update_text() + self.aux_box.update() + self.main_window.update() + + def resizeEvent(self, a0: QResizeEvent) -> None: + last_scale = self.scale + width_ratio = self.frameGeometry().width() / 384 + height_ratio = self.frameGeometry().height() / 264 + self.scale = min(width_ratio, height_ratio) + + if self.point_1 is not None: + self.point_1[0] *= self.scale / last_scale + self.point_1[1] *= self.scale / last_scale + + if self.point_2 is not None: + self.point_2[0] *= self.scale / last_scale + self.point_2[1] *= self.scale / last_scale + + # TODO: Fix this so that the dimension with extra space doesn't expand forever + # self.frameGeometry().setWidth(round(self.scale * 384)) + # self.frameGeometry().setHeight(round(self.scale * 264)) + + def set_position(self, position_idx): + last_position_idx = self.position_idx + self.position_idx = position_idx + r_dir_path = self.file_dir + self.position_prefix + str(self.positions[self.position_idx][2]).rjust(4, + '0') + "/" + if self.movie is not None: + self.movie.close() + + self.movie = file.get_mraw_from_dir(r_dir_path) + self.move_points(last_position_idx) + + def paintEvent(self, e): + r_dir_path = self.file_dir + self.position_prefix + str(self.positions[self.position_idx][2]).rjust(4, + '0') + "/" + image = self.movie[self.frame_idx + self.max_frames * self.repeat_idx] + bg_img = self.movie[0] + binary = dd.makeBinary(np.int32(bg_img) - np.int32(image)) + self.total_frames = self.movie.image_count + + movie_min, movie_max = np.min(image), np.max(image) + + png_path = r_dir_path + "analysis_plot_r{0}.png".format(self.repeat_idx) + if os.path.exists(png_path): + self.aux_box.set_image_from_png(png_path) + else: + self.aux_box.clear_image() + self.main_window.update() + + # Convert to pixel map. + if self.draw_binary: + pixmap = qtu.frame_to_pixmap(np.int32(binary), autoscale=True) + else: + pixmap = qtu.frame_to_pixmap(image, autoscale=not self.raw, min=movie_min, max=movie_max, + norm_mat=None if self.raw else self.norm_mat) + pixmap = pixmap.scaledToHeight(pixmap.height() * self.scale) + + # Draw frame. + qp = QPainter() + if qp.isActive(): + qp.setRenderHint(QPainter.Antialiasing) + qp.begin(self) + qp.drawPixmap(0, 0, pixmap) + + # Draw bubble position + if self.show_debug: + b_pos_x, b_pos_y, area, ecc, sol, jet_tip = au.analyse_frame(image, bg_img, debug=True) + + if b_pos_x is not None and b_pos_y is not None and jet_tip is not None: + self.draw_line(qp, [(b_pos_x + 1) * self.scale, (b_pos_y + 1) * self.scale], + [(jet_tip[0] + 1) * self.scale, (jet_tip[1] + 1) * self.scale], colour=Qt.green) + + if b_pos_x is not None and b_pos_y is not None: + self.draw_point(qp, [(b_pos_x + 1) * self.scale, (b_pos_y + 1) * self.scale], + Qt.magenta) + + if area is not None: + self.draw_circle(qp, [(b_pos_x + 1) * self.scale, (b_pos_y + 1) * self.scale], + self.scale * np.sqrt(area / np.pi), Qt.magenta) + + if b_pos_x is not None and b_pos_y is not None \ + and ecc is not None and sol is not None and jet_tip is not None: + if area is None: + qp.drawText(b_pos_x * self.scale + 5, + b_pos_y * self.scale + 5, f"ecc = {ecc:.2f}, sol = {sol:.2f}") + else: + tip_ratio = np.linalg.norm(np.subtract(jet_tip, [b_pos_x, b_pos_y])) / np.sqrt(area / np.pi) + qp.drawText((b_pos_x + np.sqrt(area / np.pi)) * self.scale, + (b_pos_y + np.sqrt(area / np.pi)) * self.scale, + f"ecc = {ecc:.2f}, sol = {sol:.2f}, R = {np.sqrt(area / np.pi):.2f}, tr = {tip_ratio:.2f}") + + # Draw ruler. + if self.point_1 is not None and self.point_2 is None: + self.draw_point(qp, self.point_1) + if self.point_1 is not None and self.point_2 is not None: + self.draw_line(qp) + + qp.end() + + def save_reading_movie(self): + r_dir_path = self.file_dir + self.position_prefix + str(self.positions[self.position_idx][2]).rjust(4, + '0') + "/" + mov = file.get_mraw_from_dir(r_dir_path) + + filename = str(QFileDialog.getSaveFileName(self, "Select Save Directory", + r_dir_path + "video" + "_" + str(self.repeat_idx) + ".mp4")[0]) + if filename == "": + return + if filename[-4:] != ".mp4": + filename += ".mp4" + + # These settings make OpenCV compain about stuff, but they still give much nicer quality. + if self.raw: + mraw_converter.convert(mov, filename, codec='avc1', fps=24, + frame_range=(100 * self.repeat_idx, 100 * (self.repeat_idx + 1) - 1), + autoscale_brightness=False, norm_mat=None, writer='cv2') + else: + mraw_converter.convert(mov, filename, codec='avc1', fps=24, + frame_range=(100 * self.repeat_idx, 100 * (self.repeat_idx + 1) - 1), + autoscale_brightness=True, norm_mat=self.norm_mat, writer='cv2') + + def draw_point(self, qp, point, colour=Qt.red): + pen = QPen(colour, 4, Qt.SolidLine) + qp.setRenderHint(QPainter.Antialiasing) + qp.setPen(pen) + qp.drawPoint(point[0], point[1]) + + def draw_line(self, qp, p1=None, p2=None, colour=Qt.red): + pen = QPen(colour, 2, Qt.SolidLine) + qp.setRenderHint(QPainter.Antialiasing) + qp.setPen(pen) + if p1 is None or p2 is None: + qp.drawLine(self.point_1[0], self.point_1[1], self.point_2[0], self.point_2[1]) + else: + qp.drawLine(p1[0], p1[1], p2[0], p2[1]) + + def draw_circle(self, qp, center, radius, colour=Qt.red): + pen = QPen(colour, 2, Qt.SolidLine) + qp.setRenderHint(QPainter.Antialiasing) + qp.setPen(pen) + qp.drawEllipse(center[0] - radius, center[1] - radius, 2 * radius, 2 * radius) + + def next_frame(self): + self.frame_idx += 1 + if self.frame_idx >= self.max_frames: + self.frame_idx = 0 + self.update() + + def previous_frame(self): + self.frame_idx -= 1 + if self.frame_idx < 0: + self.frame_idx = self.max_frames - 1 + self.update() + + def move_points(self, last_position_idx): + if self.mm_per_pixel is not None: + px_per_mm = 1 / self.mm_per_pixel + last_position = self.positions[last_position_idx] + this_position = self.positions[self.position_idx] + if last_position[0] != this_position[0]: + dx_mm = last_position[0] - this_position[0] + if self.point_1 is not None: + self.point_1[0] += self.scale * dx_mm * px_per_mm + if self.point_2 is not None: + self.point_2[0] += self.scale * dx_mm * px_per_mm + if last_position[1] != this_position[1]: + dy_mm = last_position[1] - this_position[1] + if self.point_1 is not None: + self.point_1[1] -= self.scale * dy_mm * px_per_mm + if self.point_2 is not None: + self.point_2[1] -= self.scale * dy_mm * px_per_mm + + def next_position(self): + self.repeat_idx = 0 + if self.position_idx + 1 >= len(self.positions): + self.set_position(0) + else: + self.set_position(self.position_idx + 1) + self.update() + + def previous_position(self): + self.repeat_idx = 0 + if self.position_idx - 1 < 0: + self.set_position(len(self.positions) - 1) + else: + self.set_position(self.position_idx - 1) + self.update() + + def next_repeat(self): + self.repeat_idx += 1 + if self.frame_idx + self.repeat_idx * self.max_frames >= self.total_frames: + self.repeat_idx = int(self.total_frames / self.max_frames) - 1 + self.update() + + def previous_repeat(self): + self.repeat_idx -= 1 + if self.repeat_idx < 0: + self.repeat_idx = 0 + self.update() + + def set_frame(self, frame_idx): + self.frame_idx = frame_idx + self.update() + + def set_draw_binary(self, draw_binary): + self.draw_binary = draw_binary + self.update() + + def set_show_debug(self, show_debug): + self.show_debug = show_debug + self.update() + + def set_raw(self, raw): + self.raw = raw + self.update() + + def update_text(self): + # Line 1 + text = "Frame: {0}".format(self.frame_idx) + text += " Repeat: {0}".format(self.repeat_idx) + if self.point_1 is not None: + text += " Point 1: {0:.1f}, {1:.1f} (px)".format(self.point_1[0] / self.scale, + self.point_1[1] / self.scale) + if self.mm_per_pixel is not None: + text += " {0:.2f}, {1:.2f} (mm)".format( + self.positions[self.position_idx][0] + self.mm_per_pixel * self.point_1[0] / self.scale, + self.positions[self.position_idx][1] + self.mm_per_pixel * (264 - self.point_1[1] / self.scale)) + if self.point_2 is not None: + text += " Point 2: {0:.1f}, {1:.1f} (px)".format(self.point_2[0] / self.scale, + self.point_2[1] / self.scale) + if self.mm_per_pixel is not None: + text += " {0:.2f}, {1:.2f} (mm)".format( + self.positions[self.position_idx][0] + self.mm_per_pixel * self.point_2[0] / self.scale, + self.positions[self.position_idx][1] + self.mm_per_pixel * (264 - self.point_2[1] / self.scale)) + # Line 2 + if self.point_1 is not None and self.point_2 is not None: + dx = (self.point_2[0] - self.point_1[0]) / self.scale + dy = (self.point_2[1] - self.point_1[1]) / self.scale + length = math.sqrt(dx ** 2 + dy ** 2) + text += "\nLength (px): {0:.2f}".format(length) + text += " dx (px) = {0:.2f} dy (px) = {1:.2f}".format(dx, dy) + + # y measured backwards (point_2 to point_1) to correct for inverted axis. + text += " Angle (rad): {0:.4f}".format(math.atan2(-dy, dx)) + + # Line 3 + if self.mm_per_pixel is not None: + text += "\nLength (mm): {0:.2f}".format(length * self.mm_per_pixel) + text += " dx (mm) = {0:.2f} dy (mm) = {1:.2f}".format(dx * self.mm_per_pixel, + -dy * self.mm_per_pixel) + + self.text_area.setText(text) + + # Position status + position_status_text = "x = {0:.2f}" \ + "\ny = {1:.2f}" \ + "\nidx = {2}" \ + .format(self.positions[self.position_idx][0], self.positions[self.position_idx][1], + self.positions[self.position_idx][2]) + self.position_status.setText(position_status_text) + + def mousePressEvent(self, event): + if event.buttons() & Qt.LeftButton: + if self.point_1 is None and self.point_2 is None: + self.point_1 = [event.x(), event.y()] + elif self.point_1 is not None and self.point_2 is None: + self.point_2 = [event.x(), event.y()] + else: + self.point_1 = [event.x(), event.y()] + self.point_2 = None + self.update() + if event.buttons() & Qt.RightButton: + self.point_1 = None + self.point_2 = None + self.update() + self.update_text() + + def mouseMoveEvent(self, event): + if event.buttons() & Qt.LeftButton: + if self.point_1 is not None: + self.point_2 = [event.x(), event.y()] + self.update() + + def get_current_frame_data(self): + x = self.positions[self.position_idx][0] + y = self.positions[self.position_idx][1] + mov = file.get_mraw_from_dir( + self.file_dir + self.position_prefix + str(self.positions[self.position_idx][2]).rjust(4, '0') + "/") + image = mov[self.frame_idx + self.max_frames * self.repeat_idx] + self.total_frames = mov.image_count + mov.close() + return x, y, image + + def incr_y(self): + cur_x = self.positions[self.position_idx][0] + cur_y = self.positions[self.position_idx][1] + + min_y_dif = None # type: float + min_x_dif = None # type: float + min_r = None + for r in range(len(self.positions)): + position_y = self.positions[r][1] + position_x = self.positions[r][0] + if position_y > cur_y: + y_dif = abs(position_y - cur_y) + x_dif = abs(position_x - cur_x) + if min_y_dif is None or y_dif < min_y_dif: + min_x_dif = x_dif + min_y_dif = y_dif + min_r = r + elif y_dif == min_y_dif and x_dif < min_x_dif: + min_x_dif = x_dif + min_r = r + if min_r is not None: + last_position_idx = self.position_idx + self.set_position(min_r) + self.repeat_idx = 0 + self.update() + + def decr_y(self): + cur_x = self.positions[self.position_idx][0] + cur_y = self.positions[self.position_idx][1] + + min_y_dif = None # type: float + min_x_dif = None # type: float + min_r = None + for r in range(len(self.positions)): + position_y = self.positions[r][1] + position_x = self.positions[r][0] + if position_y < cur_y: + y_dif = abs(position_y - cur_y) + x_dif = abs(position_x - cur_x) + if min_y_dif is None or y_dif < min_y_dif: + min_x_dif = x_dif + min_y_dif = y_dif + min_r = r + elif y_dif == min_y_dif and x_dif < min_x_dif: + min_x_dif = x_dif + min_r = r + if min_r is not None: + last_position_idx = self.position_idx + self.set_position(min_r) + self.repeat_idx = 0 + self.update() + + def incr_x(self): + cur_x = self.positions[self.position_idx][0] + cur_y = self.positions[self.position_idx][1] + + min_y_dif = None # type: float + min_x_dif = None # type: float + min_r = None + for r in range(len(self.positions)): + position_y = self.positions[r][1] + position_x = self.positions[r][0] + if position_x > cur_x: + y_dif = abs(position_y - cur_y) + x_dif = abs(position_x - cur_x) + if min_x_dif is None or x_dif < min_x_dif: + min_x_dif = x_dif + min_y_dif = y_dif + min_r = r + elif x_dif == min_x_dif and y_dif < min_y_dif: + min_y_dif = y_dif + min_r = r + if min_r is not None: + last_position_idx = self.position_idx + self.set_position(min_r) + self.repeat_idx = 0 + self.update() + + def decr_x(self): + cur_x = self.positions[self.position_idx][0] + cur_y = self.positions[self.position_idx][1] + + min_y_dif = None # type: float + min_x_dif = None # type: float + min_r = None + for r in range(len(self.positions)): + position_y = self.positions[r][1] + position_x = self.positions[r][0] + if position_x < cur_x: + y_dif = abs(position_y - cur_y) + x_dif = abs(position_x - cur_x) + if min_x_dif is None or x_dif < min_x_dif: + min_x_dif = x_dif + min_y_dif = y_dif + min_r = r + elif x_dif == min_x_dif and y_dif < min_y_dif: + min_y_dif = y_dif + min_r = r + if min_r is not None: + last_position_idx = self.position_idx + self.set_position(min_r) + self.repeat_idx = 0 + self.update() + + +class CalibrationWidget(QWidget): + calibration_frames = None # x, y, frame + text_area = None + mm_per_pixel = None + + def __init__(self, data_widget: DataWidget, parent=None): + if parent: + super().__init__(parent) + else: + super().__init__() + + self.data_widget = data_widget + self.calibration_frames = [] + + vbox = QVBoxLayout() + vbox.setAlignment(Qt.AlignTop) + vbox.setSizeConstraint(QLayout.SetFixedSize) + + label = QLabel("Calibration") + label.setStyleSheet("QLabel { font-weight: bold; }") + label.setAlignment(Qt.AlignHCenter) + label.setMaximumHeight(16) + + text_area = QTextBrowser() + text_area.setMaximumHeight(36) + text_area.setMaximumWidth(100) + self.text_area = text_area + + add_frame_button = QPushButton("Add Frame") + add_frame_button.clicked.connect(self.take_frame) + clear_frames_button = QPushButton("Clear Frames") + clear_frames_button.clicked.connect(self.clear_frames) + calibrate_button = QPushButton("Calibrate") + calibrate_button.clicked.connect(self.calibrate) + + vbox.addWidget(label) + vbox.addWidget(add_frame_button) + vbox.addWidget(clear_frames_button) + vbox.addWidget(calibrate_button) + vbox.addWidget(text_area) + self.setLayout(vbox) + + self.load_calibration() + self.update_text() + + def take_frame(self): + self.calibration_frames.append(self.data_widget.get_current_frame_data()) + self.update_text() + + def clear_frames(self): + self.calibration_frames.clear() + self.update_text() + + def load_calibration(self): + file_dir = self.data_widget.file_dir + if os.path.exists(file_dir + "params.py"): + sys.path.append(file_dir) + import params + importlib.reload(params) + sys.path.remove(file_dir) + + if params.mm_per_px: + self.mm_per_pixel = params.mm_per_px + self.data_widget.mm_per_pixel = params.mm_per_px + self.update_text() + + def calibrate(self): + mm_per_pixels = [] + for i in range(1, len(self.calibration_frames)): + x_1 = self.calibration_frames[i - 1][0] + y_1 = self.calibration_frames[i - 1][1] + + x_2 = self.calibration_frames[i][0] + y_2 = self.calibration_frames[i][1] + + if x_2 == x_1 and y_2 == y_1: + self.text_area.setText("Warning!\nDuplicate frame.") + continue + + mm = math.sqrt((x_2 - x_1) ** 2 + (y_2 - y_1) ** 2) + + px_offset = cu.calculate_offset(self.calibration_frames[i - 1][2], self.calibration_frames[i][2]) + print(px_offset) + px = vect.mag(px_offset) + if px == 0: + self.text_area.setText("Error!\nNo offset found.") + continue + mm_per_pixels.append(mm / px) + + if len(mm_per_pixels) == 0: + return + self.mm_per_pixel = np.mean(mm_per_pixels) + self.data_widget.mm_per_pixel = self.mm_per_pixel + self.update_text() + + def update_text(self): + text = "Frames: {0}".format(len(self.calibration_frames)) + if self.mm_per_pixel is not None: + text += "\nmm/px = {0:.4f}".format(self.mm_per_pixel) + self.text_area.setText(text) + + +class BubbleAnalyser(QMainWindow, QObject): + player_play_signal = pyqtSignal(int) + + def __init__(self, file_dir=None): + QMainWindow.__init__(self) + QObject.__init__(self) + while file_dir is None or not os.path.exists(file_dir + "index.csv"): + file_dir = str(QFileDialog.getExistingDirectory(self, "Select Directory", "../")) + if file_dir == "": + QTimer.singleShot(0, self.close) + return + else: + file_dir += "/" + + self.title = 'Bubble Analysis - ' + file_dir + + self.setWindowTitle(self.title) + self.setWindowIcon(QIcon('icon.png')) + + # Reset the App ID to interact more nicely with Windows (separate icon from generic Python etc.). + myappid = u'bubble_analysis.py' # arbitrary string + ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) + + # Build text area + text_area = QTextBrowser() + text_area.setMaximumHeight(52) + + # Build side bar area. + side_bar = QVBoxLayout() + side_bar.setAlignment(Qt.AlignTop) + + # Build position box + position_box = QVBoxLayout() + position_box.setContentsMargins(8, 0, 8, 0) + position_box.setSizeConstraint(QLayout.SetFixedSize) + position_label = QLabel("Position") + position_label.setStyleSheet("QLabel { font-weight: bold; }") + position_label.setAlignment(Qt.AlignHCenter) + position_label.setMaximumHeight(16) + position_box.setAlignment(Qt.AlignTop) + + position_back = QPushButton("Previous") + position_back.setAutoRepeat(True) + position_forward = QPushButton("Next") + position_forward.setAutoRepeat(True) + + incr_x = QPushButton("x +") + incr_x.setAutoRepeat(True) + incr_x.setMaximumWidth(40) + decr_x = QPushButton("x -") + decr_x.setAutoRepeat(True) + decr_x.setMaximumWidth(40) + incr_y = QPushButton("y +") + incr_y.setAutoRepeat(True) + incr_y.setMaximumWidth(40) + decr_y = QPushButton("y -") + decr_y.setAutoRepeat(True) + decr_y.setMaximumWidth(40) + position_buttons = QVBoxLayout() + position_buttons.setAlignment(Qt.AlignHCenter) + x_buttons = QHBoxLayout() + x_buttons.addWidget(decr_x) + x_buttons.addWidget(incr_x) + incr_y_wrapper = QHBoxLayout() + incr_y_wrapper.addWidget(incr_y) + decr_y_wrapper = QHBoxLayout() + decr_y_wrapper.addWidget(decr_y) + position_buttons.addLayout(incr_y_wrapper) + position_buttons.addLayout(x_buttons) + position_buttons.addLayout(decr_y_wrapper) + + flag_repeat = QPushButton("Flag Invalid Repeat") + flag_repeat.clicked.connect(self.flag_invalid_repeat) + + position_status = QTextBrowser() + position_status.setMaximumHeight(52) + position_status.setMaximumWidth(100) + position_box.addWidget(position_label) + position_box.addWidget(position_forward) + position_box.addWidget(position_back) + position_box.addWidget(position_status) + position_box.addLayout(position_buttons) + position_box.addWidget(flag_repeat) + + # Build auxiliary box + aux_box = ImageDisplayWidget() + + # Build image area + self.data_widget = DataWidget(text_area, position_status, file_dir, aux_box, self) + + position_forward.clicked.connect(self.data_widget.next_position) + position_back.clicked.connect(self.data_widget.previous_position) + incr_x.clicked.connect(self.data_widget.incr_x) + decr_x.clicked.connect(self.data_widget.decr_x) + incr_y.clicked.connect(self.data_widget.incr_y) + decr_y.clicked.connect(self.data_widget.decr_y) + + save_repeat = QPushButton("Save Repeat Movie") + save_repeat.clicked.connect(self.data_widget.save_reading_movie) + position_box.addWidget(save_repeat) + + dir_change = QPushButton("Change Directory") + dir_change.clicked.connect(self.select_dir) + position_box.addWidget(dir_change) + + # Build calibration widget + self.calibration = CalibrationWidget(self.data_widget) + side_bar.addWidget(self.calibration) + side_bar.addLayout(position_box) + + # Build upper area (image and side buttons) + upper_box = QHBoxLayout() + # upper_box.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Minimum)) + upper_box.addWidget(self.data_widget) + # upper_box.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Minimum)) + upper_box.addLayout(side_bar) + + # Build button area + slider = JumpSlider(Qt.Horizontal) + slider.setFocusPolicy(Qt.StrongFocus) + slider.setTickPosition(QSlider.TicksBothSides) + slider.setTickInterval(10) + slider.setSingleStep(1) + slider.setValue(0) + slider.setMinimum(0) + slider.setMaximum(99) + slider.valueChanged.connect(self.set_frame_from_slider) + self.slider = slider + + self.player_thread = QThread() + self.player = Player() + self.player.moveToThread(self.player_thread) + self.player.frame_update.connect(self.set_frame_from_player) + self.player.finished.connect(self.on_player_finished) + self.player_play_signal.connect(self.player.play) + + spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Minimum) + + button_box = QHBoxLayout() + frame_back = QPushButton("Previous Frame") + frame_back.setAutoRepeat(True) + frame_back.clicked.connect(self.previous_frame) + button_box.addWidget(frame_back) + frame_forward = QPushButton("Next Frame") + frame_forward.setAutoRepeat(True) + frame_forward.clicked.connect(self.next_frame) + button_box.addWidget(frame_forward) + + button_box.addItem(spacer) + + rep_back = QPushButton("Previous Repeat") + rep_back.setAutoRepeat(True) + rep_back.clicked.connect(self.data_widget.previous_repeat) + button_box.addWidget(rep_back) + rep_forward = QPushButton("Next Repeat") + rep_forward.setAutoRepeat(True) + rep_forward.clicked.connect(self.data_widget.next_repeat) + button_box.addWidget(rep_forward) + + button_box.addItem(spacer) + + self.loop_toggle = QCheckBox("Loop") + self.loop_toggle.stateChanged.connect(lambda _: self.toggle_loop(self.loop_toggle.isChecked())) + button_box.addWidget(self.loop_toggle) + + binary_toggle = QCheckBox("Binary") + binary_toggle.stateChanged.connect(lambda _: self.data_widget.set_draw_binary(binary_toggle.isChecked())) + button_box.addWidget(binary_toggle) + + debug_toggle = QCheckBox("Debug") + debug_toggle.stateChanged.connect(lambda _: self.data_widget.set_show_debug(debug_toggle.isChecked())) + button_box.addWidget(debug_toggle) + + auto_bright_toggle = QCheckBox("Raw Output") + auto_bright_toggle.setChecked(False) + auto_bright_toggle.stateChanged.connect( + lambda _: self.data_widget.set_raw(auto_bright_toggle.isChecked())) + button_box.addWidget(auto_bright_toggle) + + self.rand_toggle = QCheckBox("Randomise") + button_box.addWidget(self.rand_toggle) + + # Build window contents + vbox = QVBoxLayout() # Main box. + hbox = QHBoxLayout() # Box containing the main box and auxiliary box. + central_widget = QWidget() + central_widget.setLayout(hbox) + + # Put together the main box + vbox.addLayout(upper_box) + vbox.addWidget(slider) + vbox.addLayout(button_box) + vbox.addWidget(text_area) + + # Add the auxiliary box + hbox.addLayout(vbox) + hbox.addWidget(aux_box) + + self.setCentralWidget(central_widget) + self.show() + self.update() + self.player_thread.start() + + def set_frame_from_slider(self): + self.data_widget.set_frame(self.slider.value()) + + def set_frame_from_player(self, i): + self.data_widget.set_frame(i) + self.slider.setValue(i) + + def toggle_loop(self, loop): + if loop: + self.slider.setEnabled(False) + self.player_play_signal.emit(self.slider.value()) + else: + self.player.skip = True # This is probably pretty unhealthy but it'll do + + def on_player_finished(self): + if self.loop_toggle.isChecked(): + if self.rand_toggle.isChecked(): + rand_pos = np.random.randint(len(self.data_widget.positions)) + self.data_widget.set_position(rand_pos) + rand_rep = np.random.randint(int(self.data_widget.total_frames / self.data_widget.max_frames)) + self.data_widget.repeat_idx = rand_rep + self.data_widget.update() + + self.player_play_signal.emit(0) + else: + self.slider.setEnabled(True) + + def next_frame(self): + self.data_widget.next_frame() + self.slider.setValue(self.data_widget.frame_idx) + + def previous_frame(self): + self.data_widget.previous_frame() + self.slider.setValue(self.data_widget.frame_idx) + + def update(self): + # self.resize(self.minimumSizeHint()) + super().update() + + def flag_invalid_repeat(self): + f = open(self.data_widget.file_dir + "invalid_readings.txt", "a") + f.write("{0}:{1}\n".format(self.data_widget.positions[self.data_widget.position_idx][2], + self.data_widget.repeat_idx)) + f.close() + + def select_dir(self): + file_dir = None + while file_dir is None or not os.path.exists(file_dir + "index.csv"): + file_dir = str( + QFileDialog.getExistingDirectory(self, "Select Directory", self.data_widget.file_dir + "../")) + if file_dir == "": + return + else: + file_dir += "/" + + self.calibration.clear_frames() + self.calibration.load_calibration() + self.data_widget.change_dir(file_dir) + self.slider.setSliderPosition(0) + self.title = 'Bubble Analysis - ' + file_dir + self.setWindowTitle(self.title) + + def keyPressEvent(self, e: QtGui.QKeyEvent): + if e.key() == Qt.Key_Slash: + self.loop_toggle.setChecked(not self.loop_toggle.isChecked()) + if e.key() == Qt.Key_Comma: + self.data_widget.previous_frame() + self.slider.setValue(self.data_widget.frame_idx) + if e.key() == Qt.Key_Period: + self.data_widget.next_frame() + self.slider.setValue(self.data_widget.frame_idx) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + ex = BubbleAnalyser() + # ex.show() + # ex = BubbleAnalyser("../../Data/Test1/HSweep4/") + sys.exit(app.exec_()) diff --git a/packaged-code/pacakged-gui/icon.png b/packaged-code/pacakged-gui/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..80ed0787decb4706102ca384107b3d9288fc3e86 GIT binary patch literal 197082 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�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	`|MK zZqwX1Trj$(la+k+jOv7!i-lJTDT_%OJy*^Tj*RSE#l7Q&;7irn=eF`>&uiye)f?n? zL`SONa*VQ;x8)qUo=@9k&+q?lRsQZg&m>8?c}&6Y_v>eL?{zdQyS=nH^<uKh>x(9O zCw7OHC8~&I8egj7kFxT#{ylMNA*0!(g97oF0#j$YlmvI^y9wHSzxz%gcHiSar>g7u zf3H3Nthnmzf#dc6&mZ{D{9olod)-8RgW@k@g6eYNzml51OWo7!_;RCU>4v`GD#tn6 zX9DxzOPy&mJ3gDO^s0`GtQg;n3uR|ABu{cwnXG>l%5>(7kHBozSxkaGhJx<r)@N}Z z_cH$ThvR<f+~@NxH~e4Byqzue(<H-<l~26B9C;ud^hx+Jr<KWCzsZLuT&OWyBh~7Z zt-HzL7?b<y6W`hFlGvGNGB-T9s9(UhuRMos<|NCBjGHyzoS3CN!=}UO`9!}3?1l=# zeVJB|=0~_2Shuc>O>q%-xc#VM)AiHSN^XHhB=+f^IC!_4q5omfv4EQ~UeSGt4_Xf> ze>S?o^=WH=yii5TlwVePC+|(&$j>iwmwVA}iTE!~7iLBEElN~c!K%B_d?i=viv!9B zyabI@w+1d*wo!4j?FNA*%QkNgac4{YcSG5xcD<nomx#-vjbSQocAHaQMlY#&EtEcS zVNxX9^{+Auf1cp}rFlD5mvvQl$Cbo)V$sv)3+G&{Z>dof4%*$kbierAzxSS0x12d> zt~P0fx#gzk-1GlP@BRC9{@x{zUE^;heoZcr-obl)fAe~-n!^kAY`5s!a5&4Z*533g zaJ_dO|5kN=O&>hNM}&AB~!-3wofjms8IJ8QFQzs$~u=|VHMv>7dbvGsY^i=bD^ z=Ve#czgufly0&P-hlKL&-tPN?IxS=TXG(WGFnE2RUqvT$g5lcG#VxCsF8|P*$USYL zk_>ZZ_BqAh?Ky8klInK+>bBf8P5Y|LAxR&xg%%s^cK#{w`f}pSt|vA@X1<d=J6}1+ z$R(${|GE8VKWI?mS8)99=?5xu_UljICug>9+UcJ54Pr-23ntCgedscAt4s0c8N1$# z#kzjqsqT3rK{YsRYu<sQ0gw0Cuk&+@jF>QKTO_A>cgl}&!7VM9U0J)9i@9*t-fx$G zICI*y+a=YjzW(9&J<HzljP=W*q!W|Q3Ni)7Drs3g-OtjY`e4D@LxEBARZbksoaLaj z_}0g5VrRdeWYP4C<x$A7iut6Q^N}fiyY2lQ|Md3VGGzL5Bb(E%;dsOG4b}6XzPSD~ z^a0x%5g&HmSf0xh#b@6P4S)TsZBynZP6tjmr`utzvyBb7kF)7soUMA-SiSaY)lc6W zUL~_MZa!FE+^e+XjP%5tN=L6ecDVRlt*!sgqs;FX3X}OR^;m{a^;kRk%;)ng);Fhq zU9k2q!`F^z|6hLJR409`if^zmdN;w4fphnko~wP&idjO1dU_Z$Qp}g+hJ{TqVlp+d zU-8j&>WlK53==+_kG|r4{VeB#XQ9nDPh1Q)bnOBUP;AkgubegSupFDsD!q?Syo28! zsM=`qVp-Ip={s`Wba%_O`=ykmc&~lab|p2V$NQH?>X`=yERtMLeUzG&SDTc~_nUU{ zk<%uzk`;z&nvrKGp7Aib!k1CH<r&8^sijl?%v*3NAot}I&hE8mdLLT5&8uEhl;Qbl zMqp9Zx|ar;+phIIanWS(+<fD5RpM%$>k}U4Wa@r9VtLqNIg8#}_lOfx3fH2_mVI@y zJe#8%`DvG4%#X+25fz?l{zfimF0Yje?w5{ve*Il-pK^bq&9_VabEos!Rj^y^`Mch6 z@4@{GzVAB0DzbZ3Zse`^8Jl+6x*Kmk+U;G{WBk4@_u1#C{Z^j5p6511nLXIXyU4rT zx4uxd`1w-xc~J}EjKpeZC98!StGs!3;LF@}o9corF;-78mZ#}T{60!awnyE)L_~GP zR=@jvj=w+cV1Q><zoOO@<^Rd;K@(!j1g4y8`EvZGfr4wId5ZPoC!tL`XFC~%CS7{7 z{i@4BrZ**jtM-(z27SpYxcK?1o2Bcf`PVXQt@VBe|GIpWulB_E>a%}Y6*i?7J>IkZ zM%MHI_5O{X_j7+Yzw|iPsh9GeDWU4xaS0x_<X8W9NtCE-Dy0ewg>CL$?WUdQc`Rkc z3%}2gf*vmlocwUwJ;BLmJYMeA_Bv_UB{5~T^*Q^B$+w@&&13Z6RvWxaN_obXM`ca7 zaypB;KDwVjV6{j%+txGA^ORZLp{TURBmcB^majUV;a-&&Cd9USYMF6h#;z3SHQ#R6 zoV)$KwD9Mh2lMy;UH{ehsjU9b9kr5r|LvI`6t?sKVXI$|UUTpLXUE3hbFUVhoWpT) zOK_}p+^=KdpCT^F$j@NW4H2F?mCuG}CbLWh_pybM+}lsPU0t0wBYQ`hi&FJf?s*+~ zhMu$AYFj-LuFf+1BF0`byZ6^!^Bu+IY4z2Qe5P6+U9R=umb~>><ylIX6S-~|oUQj} zwQsn-Vc(58yLun{bjrlkbbSn*ZS>$6SJ~N%zbn@)b#vy;IcJ{9$G@{*bh_kRp3_Cv z%PMpau`Zt2qQ&^5=FOwaa~jXB)H}cJ2zR(z@v*hPouBPIetE`Y|I*2pYs0tQTk-AV zv&`QA!fDng3{OsEe|=0SVnaW-eY$hy4T0zRTP-+!nRa(=k&4>7=Te%|KRt)Z1zUHx zE6n7aquH0cMZR#KcC50|v>i_V*CJhlJ}aKEGk-U0@yD!6!&N79TpZH&&zN$l`LK=a z3b%_Kldnh_?F=fic`xkBy6?T<yji`gq|S7#QSOnOw>DB({@vs=FC+BkeO|Qt@kUGk zbGCX1qb$N}iZA9iozXpbY|gfuXBa<TX*r{5mOC*}DDc6ylxBzRx6`hPNiWZ0n|kzF z+MJW7b=6vb4nD3ERNr�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 K&t;ucLK6T!Ptq~~ literal 0 HcmV?d00001 diff --git a/packaged-code/pacakged-gui/run_bubble_analysis.bat b/packaged-code/pacakged-gui/run_bubble_analysis.bat new file mode 100644 index 0000000..2013560 --- /dev/null +++ b/packaged-code/pacakged-gui/run_bubble_analysis.bat @@ -0,0 +1,2 @@ +python ./bubble_analysis_gui.py +PAUSE \ No newline at end of file diff --git a/paper_code/porous/util/analysis_utils.py b/packaged-code/pacakged-gui/util/analysis_utils.py similarity index 100% rename from paper_code/porous/util/analysis_utils.py rename to packaged-code/pacakged-gui/util/analysis_utils.py diff --git a/packaged-code/pacakged-gui/util/calibration_utils.py b/packaged-code/pacakged-gui/util/calibration_utils.py new file mode 100644 index 0000000..47fbac5 --- /dev/null +++ b/packaged-code/pacakged-gui/util/calibration_utils.py @@ -0,0 +1,51 @@ +import math + +import matplotlib.pyplot as plt +import numpy as np +import skimage.transform as tf +from skimage.registration import phase_cross_correlation +from skimage.filters import sobel, threshold_triangle +from skimage.restoration import denoise_bilateral + +import util.plotting_utils as pu +import util.file_utils as fu + + +def calculate_offset(frame_1, frame_2, plot_compared_frames=False): + """ + Calculates a required offset of frame_1 in direction dir such that it maps onto frame_2 as closely as possible. + + :param frame_1: Frame to be moved. + :param frame_2: Frame to be mapped onto. + :param plot_compared_frames: Whether to plot the final frame comparison. + :return: Offset required in direction. + """ + frame_1 = denoise_bilateral(frame_1, channel_axis=None, bins=2, mode='reflect', sigma_spatial=2.5) + frame_2 = denoise_bilateral(frame_2, channel_axis=None, bins=2, mode='reflect', sigma_spatial=2.5) + frame_1 = sobel(frame_1, mask=np.ones(frame_1.shape, dtype=bool)) + frame_2 = sobel(frame_2, mask=np.ones(frame_1.shape, dtype=bool)) + + # thresh_1 = threshold_triangle(frame_1) + # thresh_2 = threshold_triangle(frame_2) + # thresh = (thresh_1 + thresh_2) / 2 + # frame_1 = frame_1 > thresh + # frame_2 = frame_2 > thresh + + offset, error, _ = phase_cross_correlation(frame_1, frame_2, normalization=None) + if plot_compared_frames: + tform = tf.SimilarityTransform(translation=[offset[1], offset[0]]) + pu.plot_frame(tf.warp(frame_1, tform), show_immediately=False) + pu.plot_frame(frame_2, show_immediately=False) + plt.show() + + return offset + + +if __name__ == '__main__': + # cal_dir = "../../../Data/SidewaysSeries/w2.2h2.7/" + # print(calculate_mm_per_pixel(cal_dir, plot_compared_frames=True)) + # mraw_1 = fu.get_mraw_from_dir("../../../../Data/SlotSweeps/w1h3/movie_S0013/") + # mraw_2 = fu.get_mraw_from_dir("../../../../Data/SlotSweeps/w1h3/movie_S0001/") + mraw_1 = fu.get_mraw_from_dir("C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/~25VF/Purer water between 3 degassed again/movie_C001H001S0001/") + mraw_2 = fu.get_mraw_from_dir("C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/~25VF/Purer water between 3 degassed again/movie_C001H001S0002/") + print(calculate_offset(mraw_1[0], mraw_2[0], True)) diff --git a/paper_code/porous/util/determineDisplacement.py b/packaged-code/pacakged-gui/util/determineDisplacement.py similarity index 100% rename from paper_code/porous/util/determineDisplacement.py rename to packaged-code/pacakged-gui/util/determineDisplacement.py diff --git a/paper_code/porous/util/file_utils.py b/packaged-code/pacakged-gui/util/file_utils.py similarity index 100% rename from paper_code/porous/util/file_utils.py rename to packaged-code/pacakged-gui/util/file_utils.py diff --git a/paper_code/porous/util/mp4.py b/packaged-code/pacakged-gui/util/mp4.py similarity index 100% rename from paper_code/porous/util/mp4.py rename to packaged-code/pacakged-gui/util/mp4.py diff --git a/paper_code/porous/util/mraw.py b/packaged-code/pacakged-gui/util/mraw.py similarity index 100% rename from paper_code/porous/util/mraw.py rename to packaged-code/pacakged-gui/util/mraw.py diff --git a/packaged-code/pacakged-gui/util/mraw_converter.py b/packaged-code/pacakged-gui/util/mraw_converter.py new file mode 100644 index 0000000..9118de1 --- /dev/null +++ b/packaged-code/pacakged-gui/util/mraw_converter.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Jul 6 14:36:00 2017 + +@author: Ivo Peters +ivo.r.peters@gmail.com + +Modified by Elijah Andrews +""" + +import numpy as np +# import matplotlib.pyplot as plt +import cv2 +from PIL import Image +from subprocess import Popen, PIPE +import os +import multiprocessing + +from util.mraw import mraw +from util.pixel_correction import safe_correct, load_norm_mat +import util.file_utils as file + + +def convert(mraw_obj, outputFile, codec='XVID', fps=24, frame_range=None, scale=1, contrast=1, crf=18, + autoscale_brightness=False, norm_mat=None, writer='ffmpeg'): + """ + Convert a given mraw object into a video file. + :param mraw_obj: mraw object + :param outputFile: output file path + :param codec: four letter codec name - ignored if using writer='ffmpeg' + :param fps: frames per second in the output file + :param frame_range: range of frames to include, [a, b] inclusive of both a and b + :param scale: image scale + :param contrast: contrast ratio + :param crf: Constant Rate Factor (quality), only used for writer='ffmpeg' + :param autoscale_brightness: whether to scale brightness based on maximum and minimum brightnesses in the image + :param writer: which video-writing method to use (cv2 or ffmpeg) + """ + movie = mraw_obj + if frame_range is None: + frame_range = (0, len(movie)) + + if writer == "cv2": + if type(codec) is str and len(codec) == 4: + codec = cv2.VideoWriter_fourcc(codec[0], codec[1], codec[2], codec[3]) + out = cv2.VideoWriter(outputFile, codec, fps, + (movie.width * scale, movie.height * scale), + 0) + elif writer == "ffmpeg": + p = Popen(['ffmpeg', + '-y', # Overwrite files + '-f', 'image2pipe', # Input format + '-r', '24', # Framerate + '-i', '-', # stdin + '-c:v', 'libx264', # Codec + '-preset', 'slow', + '-crf', f'{crf}', # H264 Constant Rate Factor (quality, lower is better) + '-loglevel', 'quiet', # Stop yelling at me + '-flush_packets', '1', + outputFile], stdin=PIPE) + + movie_min = np.min([np.min(movie[i]) for i in range(frame_range[0], frame_range[1] + 1)]) + movie_max = np.max([np.max(movie[i]) for i in range(frame_range[0], frame_range[1] + 1)]) + movie_ptp = movie_max - movie_min + for i in range(frame_range[0], frame_range[1] + 1): + frame = movie[i] + if norm_mat is not None: + frame = safe_correct(frame, norm_mat) + if autoscale_brightness: + frame = ((frame - movie_min) / (movie_ptp / 255.0)).astype(np.uint8) + else: + frame = np.uint8(np.double(frame) / (2 ** 12) * 255) # Convert to 8 bit colour. + if scale != 1: + frame = cv2.resize(frame, (movie.width * scale, movie.height * scale)) + if contrast != 1: + frame = cv2.convertScaleAbs(frame, alpha=contrast) + + if writer == "cv2": + out.write(frame) + elif writer == "ffmpeg": + im = Image.fromarray(frame) + im.save(p.stdin, 'PNG') + + if writer == "cv2": + out.release() + elif writer == "ffmpeg": + p.stdin.close() + p.wait() + + +def convert_mraw(mraw_obj, outputFile, codec='XVID', fps=24, separate_readings=True, writer="ffmpeg", norm_mat=None): + movie = mraw_obj + if separate_readings: + repeats = movie.image_count // 100 + for i in range(repeats): + filename = outputFile[:-4] + "_" + str(i) + outputFile[-4:] + convert(movie, filename, frame_range=(i * 100, (i + 1) * 100 - 1), + codec=codec, fps=fps, contrast=1, writer=writer, norm_mat=norm_mat) + else: + convert(mraw_obj, outputFile, codec=codec, fps=fps, contrast=1, writer=writer, norm_mat=norm_mat) + + +def convert_series(dir_path, codec="mp4v", file_format="mp4", writer="ffmpeg", px_correct=True): + print(dir_path) + index_file = open(dir_path + "index.csv") + index_lines = index_file.readlines() + index_file.close() + + input_data = [] # x, y, index + + for i in range(1, len(index_lines)): # Start at 1 to skip header. + split = index_lines[i].strip().split(",") + input_data.append([float(split[0]), float(split[1]), split[2]]) # x, y, index number + + reading_prefix = file.get_prefix_from_idxs(dir_path, np.array(input_data)[:, 2]) + for i in range(len(input_data)): + print("Converting reading {0}. - {1}".format(input_data[i][2], dir_path)) + reading_path = dir_path + reading_prefix + str(input_data[i][2]).rjust(4, "0") + "/" + mraw_obj = file.get_mraw_from_dir(reading_path) + if px_correct: + norm_mat = load_norm_mat(dir_path) + else: + norm_mat = None + convert_mraw(mraw_obj, reading_path + "video." + file_format, + codec=codec, separate_readings=True, writer=writer, norm_mat=norm_mat) + + +if __name__ == "__main__": + # Anisotropy modelling paper + # to_convert = ["E:/Data/Lebo/Restructured Data/Equilateral triangle/", + # "E:/Data/Lebo/Restructured Data/Equilateral triangle 2/", + # "E:/Data/Lebo/Restructured Data/Square/", + # "E:/Data/Lebo/Restructured Data/Square 2/", + # "E:/Data/Lebo/Restructured Data/Square 3/", + # "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/Solid plate/"] + + to_convert = [] + + # Porous plates paper + root_dir = "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/Steel plates/" + + for root, _, files in os.walk(root_dir): + if "params.py" in files: + to_convert.append(root + "/") + + for cdir in to_convert: + print(cdir) + print(f"Found {len(to_convert)} data sets") + + pool = multiprocessing.Pool(processes=os.cpu_count() - 1) # Leave one core for the rest of us + pool.map(convert_series, to_convert) + pool.close() + + # this_path = "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/" \ + # "Steel plates/w48vf24circles/Between 3 holes/" + # norm_mat = load_norm_mat(this_path) + # this_mraw = file.get_mraw_from_dir(this_path + "movie_C001H001S0026/") + # convert_mraw(this_mraw, this_path + "movie_C001H001S0026/" + "video.mp4", norm_mat=norm_mat) + + # TESTING OPTIONS + # basic_norm_mat = load_norm_mat() + + # convert(file.get_mraw_from_dir( + # "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/2something Hole 1mm Acrylic 50mm Plate/The Lump/normal_angle_C001H001S0001/"), + # "converted.mp4", codec="mp4v", frame_range=[200, 300], scale=2, contrast=1, autoscale_brightness=True) + + # this_dir = "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/Data/Misc/OAP mirror testing/sono-100power-75att_C001H001S0001/" + # convert(file.get_mraw_from_dir(this_dir), this_dir + "luminescence/luminescence1.png", codec=0, + # frame_range=[400, 499], + # scale=1, contrast=1, fps=0, autoscale_brightness=True, norm_mat=basic_norm_mat) diff --git a/packaged-code/pacakged-gui/util/pixel_correction.py b/packaged-code/pacakged-gui/util/pixel_correction.py new file mode 100644 index 0000000..2609cda --- /dev/null +++ b/packaged-code/pacakged-gui/util/pixel_correction.py @@ -0,0 +1,69 @@ +import numpy as np +import matplotlib.pyplot as plt +import os + +from util.mraw import mraw +from util.file_utils import get_mraw_from_dir, get_prefix_from_idxs + + +def load_norm_mat(dataset_dir="C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/" + "Data/Steel plates/w20vf24squares/On a hole/"): + """ Load a normalisation matrix for pixel errors. Default dataset dir is set for a clean data set. """ + subdirs = [d for d in os.listdir(dataset_dir) if "movie_C001H001S" in d or "movie_S" in d or "movie" in d] + all_idxs = [] + max_idx = 0 + for sd in subdirs: + if "movie_C001H001S" in sd: + idx = int(sd.split("movie_C001H001S")[-1]) + elif "movie_S" in sd: + idx = int(sd.split("movie_S")[-1]) + elif "movie" in sd: + idx = int(sd.split("movie")[-1]) + else: + raise RuntimeError("Could not find movies in " + dataset_dir) + + if idx > max_idx: + max_idx = idx + + all_idxs.append(idx) + + prefix = get_prefix_from_idxs(dataset_dir, all_idxs) + + norm_mats = [] + if len(all_idxs) > 10: + first_blank = max_idx - 2 + else: + first_blank = max_idx + for i in range(first_blank, max_idx + 1): + max_mraw = get_mraw_from_dir(dataset_dir + f"{prefix}{i:04d}/") # type: mraw + med = np.median(max_mraw[0]) + norm_mats.append(med / max_mraw[0]) + return np.median(norm_mats, axis=0) + + +def safe_correct(frame, norm_mat, max_value=2 ** 12 - 1): + """ Performs pixel correction but ignores saturated pixels. """ + out = np.copy(np.float64(frame)) + np.multiply(norm_mat, frame, out=out, where=frame != max_value) + np.minimum(out, max_value, out=out) # Cap values that become over-saturated (possible for almost-saturated pixels). + return out + + +if __name__ == "__main__": + mov_dir = "C:/Users/eda1g15/OneDrive - University of Southampton/Research/Porous Materials/" \ + "Data/Steel plates/w12vf16triangles/On a hole/movie_C001H001S0001/" + normalisation_mat = load_norm_mat(mov_dir + "../") + + mov = get_mraw_from_dir(mov_dir) # type: mraw + plt.figure() + plt.imshow(mov[32], plt.cm.gray) + plt.xticks([]) + plt.yticks([]) + plt.tight_layout() + + plt.figure() + plt.imshow(normalisation_mat * mov[32], plt.cm.gray) + plt.xticks([]) + plt.yticks([]) + plt.tight_layout() + plt.show() diff --git a/paper_code/porous/util/plotting_utils.py b/packaged-code/pacakged-gui/util/plotting_utils.py similarity index 100% rename from paper_code/porous/util/plotting_utils.py rename to packaged-code/pacakged-gui/util/plotting_utils.py diff --git a/packaged-code/pacakged-gui/util/qt_utils.py b/packaged-code/pacakged-gui/util/qt_utils.py new file mode 100644 index 0000000..ab2d9a2 --- /dev/null +++ b/packaged-code/pacakged-gui/util/qt_utils.py @@ -0,0 +1,18 @@ +import numpy as np +from PyQt5.QtGui import QImage, QPixmap +from util.pixel_correction import safe_correct + + +def frame_to_pixmap(frame, autoscale=True, min=None, max=None, norm_mat=None): + if norm_mat is not None: + frame = safe_correct(frame, norm_mat) + if autoscale: + if min is not None and max is not None: + img_8bit = ((frame - min) / ((max - min) / 255.0)).astype(np.uint8) # map the data range to 0 - 255 + else: + img_8bit = ((frame - frame.min()) / (frame.ptp() / 255.0)).astype(np.uint8) # map the data range to 0 - 255 + else: + img_8bit = (frame / (4095 / 255)).astype(np.uint8) + img = QImage(img_8bit, img_8bit.shape[1], img_8bit.shape[0], QImage.Format_Grayscale8) + pixmap = QPixmap(img) + return pixmap diff --git a/paper_code/slots/bem/util/vector_utils.py b/packaged-code/pacakged-gui/util/vector_utils.py similarity index 100% rename from paper_code/slots/bem/util/vector_utils.py rename to packaged-code/pacakged-gui/util/vector_utils.py diff --git a/paper_code/porous/fig_data/complex_geometry_anisotropy_data.csv b/packaged-code/porous/fig_data/complex_geometry_anisotropy_data.csv similarity index 100% rename from paper_code/porous/fig_data/complex_geometry_anisotropy_data.csv rename to packaged-code/porous/fig_data/complex_geometry_anisotropy_data.csv diff --git a/paper_code/porous/fig_data/surface_nucleation.mp4 b/packaged-code/porous/fig_data/surface_nucleation.mp4 similarity index 100% rename from paper_code/porous/fig_data/surface_nucleation.mp4 rename to packaged-code/porous/fig_data/surface_nucleation.mp4 diff --git a/paper_code/porous/figure10.py b/packaged-code/porous/figure10.py similarity index 100% rename from paper_code/porous/figure10.py rename to packaged-code/porous/figure10.py diff --git a/paper_code/porous/figure12.py b/packaged-code/porous/figure12.py similarity index 100% rename from paper_code/porous/figure12.py rename to packaged-code/porous/figure12.py diff --git a/paper_code/porous/figure13.py b/packaged-code/porous/figure13.py similarity index 100% rename from paper_code/porous/figure13.py rename to packaged-code/porous/figure13.py diff --git a/paper_code/porous/figure14and15.py b/packaged-code/porous/figure14and15.py similarity index 100% rename from paper_code/porous/figure14and15.py rename to packaged-code/porous/figure14and15.py diff --git a/paper_code/porous/figure3.py b/packaged-code/porous/figure3.py similarity index 100% rename from paper_code/porous/figure3.py rename to packaged-code/porous/figure3.py diff --git a/paper_code/porous/figure4.py b/packaged-code/porous/figure4.py similarity index 100% rename from paper_code/porous/figure4.py rename to packaged-code/porous/figure4.py diff --git a/paper_code/porous/figure5.py b/packaged-code/porous/figure5.py similarity index 100% rename from paper_code/porous/figure5.py rename to packaged-code/porous/figure5.py diff --git a/paper_code/porous/figure6.py b/packaged-code/porous/figure6.py similarity index 100% rename from paper_code/porous/figure6.py rename to packaged-code/porous/figure6.py diff --git a/paper_code/porous/figure7.py b/packaged-code/porous/figure7.py similarity index 100% rename from paper_code/porous/figure7.py rename to packaged-code/porous/figure7.py diff --git a/paper_code/porous/figure8.py b/packaged-code/porous/figure8.py similarity index 100% rename from paper_code/porous/figure8.py rename to packaged-code/porous/figure8.py diff --git a/paper_code/porous/figure9.py b/packaged-code/porous/figure9.py similarity index 100% rename from paper_code/porous/figure9.py rename to packaged-code/porous/figure9.py diff --git a/paper_code/porous/steel_porous_plate_anisotropy.py b/packaged-code/porous/steel_porous_plate_anisotropy.py similarity index 100% rename from paper_code/porous/steel_porous_plate_anisotropy.py rename to packaged-code/porous/steel_porous_plate_anisotropy.py diff --git a/paper_code/thesis/chapter 2/util/analysis_utils.py b/packaged-code/porous/util/analysis_utils.py similarity index 100% rename from paper_code/thesis/chapter 2/util/analysis_utils.py rename to packaged-code/porous/util/analysis_utils.py diff --git a/paper_code/porous/util/bem.py b/packaged-code/porous/util/bem.py similarity index 100% rename from paper_code/porous/util/bem.py rename to packaged-code/porous/util/bem.py diff --git a/paper_code/thesis/chapter 2/util/determineDisplacement.py b/packaged-code/porous/util/determineDisplacement.py similarity index 100% rename from paper_code/thesis/chapter 2/util/determineDisplacement.py rename to packaged-code/porous/util/determineDisplacement.py diff --git a/paper_code/porous/util/drawing_utils.py b/packaged-code/porous/util/drawing_utils.py similarity index 100% rename from paper_code/porous/util/drawing_utils.py rename to packaged-code/porous/util/drawing_utils.py diff --git a/paper_code/thesis/chapter 2/util/file_utils.py b/packaged-code/porous/util/file_utils.py similarity index 100% rename from paper_code/thesis/chapter 2/util/file_utils.py rename to packaged-code/porous/util/file_utils.py diff --git a/paper_code/porous/util/gen_utils.py b/packaged-code/porous/util/gen_utils.py similarity index 100% rename from paper_code/porous/util/gen_utils.py rename to packaged-code/porous/util/gen_utils.py diff --git a/paper_code/thesis/chapter 2/util/mp4.py b/packaged-code/porous/util/mp4.py similarity index 100% rename from paper_code/thesis/chapter 2/util/mp4.py rename to packaged-code/porous/util/mp4.py diff --git a/paper_code/thesis/chapter 2/util/mraw.py b/packaged-code/porous/util/mraw.py similarity index 100% rename from paper_code/thesis/chapter 2/util/mraw.py rename to packaged-code/porous/util/mraw.py diff --git a/paper_code/thesis/chapter 2/util/plotting_utils.py b/packaged-code/porous/util/plotting_utils.py similarity index 100% rename from paper_code/thesis/chapter 2/util/plotting_utils.py rename to packaged-code/porous/util/plotting_utils.py diff --git a/paper_code/slots/bem/bem.py b/packaged-code/slots/bem/bem.py similarity index 100% rename from paper_code/slots/bem/bem.py rename to packaged-code/slots/bem/bem.py diff --git a/paper_code/slots/bem/slot.py b/packaged-code/slots/bem/slot.py similarity index 100% rename from paper_code/slots/bem/slot.py rename to packaged-code/slots/bem/slot.py diff --git a/paper_code/slots/bem/util/file_utils.py b/packaged-code/slots/bem/util/file_utils.py similarity index 100% rename from paper_code/slots/bem/util/file_utils.py rename to packaged-code/slots/bem/util/file_utils.py diff --git a/paper_code/slots/bem/util/gen_utils.py b/packaged-code/slots/bem/util/gen_utils.py similarity index 100% rename from paper_code/slots/bem/util/gen_utils.py rename to packaged-code/slots/bem/util/gen_utils.py diff --git a/paper_code/slots/bem/util/plotting_utils.py b/packaged-code/slots/bem/util/plotting_utils.py similarity index 100% rename from paper_code/slots/bem/util/plotting_utils.py rename to packaged-code/slots/bem/util/plotting_utils.py diff --git a/paper_code/thesis/chapter 3/bem/util/vector_utils.py b/packaged-code/slots/bem/util/vector_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/util/vector_utils.py rename to packaged-code/slots/bem/util/vector_utils.py diff --git a/paper_code/slots/figure_plots/all_direct_comparisons.py b/packaged-code/slots/figure_plots/all_direct_comparisons.py similarity index 100% rename from paper_code/slots/figure_plots/all_direct_comparisons.py rename to packaged-code/slots/figure_plots/all_direct_comparisons.py diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv b/packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv rename to packaged-code/slots/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv b/packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv rename to packaged-code/slots/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv diff --git a/paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv b/packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv rename to packaged-code/slots/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv diff --git a/paper_code/slots/figure_plots/figure10.py b/packaged-code/slots/figure_plots/figure10.py similarity index 100% rename from paper_code/slots/figure_plots/figure10.py rename to packaged-code/slots/figure_plots/figure10.py diff --git a/paper_code/slots/figure_plots/figure11.py b/packaged-code/slots/figure_plots/figure11.py similarity index 100% rename from paper_code/slots/figure_plots/figure11.py rename to packaged-code/slots/figure_plots/figure11.py diff --git a/paper_code/slots/figure_plots/figure12.py b/packaged-code/slots/figure_plots/figure12.py similarity index 100% rename from paper_code/slots/figure_plots/figure12.py rename to packaged-code/slots/figure_plots/figure12.py diff --git a/paper_code/slots/figure_plots/figure13.py b/packaged-code/slots/figure_plots/figure13.py similarity index 100% rename from paper_code/slots/figure_plots/figure13.py rename to packaged-code/slots/figure_plots/figure13.py diff --git a/paper_code/slots/figure_plots/figure13_data/W1H3_experimental b/packaged-code/slots/figure_plots/figure13_data/W1H3_experimental similarity index 100% rename from paper_code/slots/figure_plots/figure13_data/W1H3_experimental rename to packaged-code/slots/figure_plots/figure13_data/W1H3_experimental diff --git a/paper_code/slots/figure_plots/figure13_data/W1H3_numerical b/packaged-code/slots/figure_plots/figure13_data/W1H3_numerical similarity index 100% rename from paper_code/slots/figure_plots/figure13_data/W1H3_numerical rename to packaged-code/slots/figure_plots/figure13_data/W1H3_numerical diff --git a/paper_code/slots/figure_plots/figure13_data/W2H3a_experimental b/packaged-code/slots/figure_plots/figure13_data/W2H3a_experimental similarity index 100% rename from paper_code/slots/figure_plots/figure13_data/W2H3a_experimental rename to packaged-code/slots/figure_plots/figure13_data/W2H3a_experimental diff --git a/paper_code/slots/figure_plots/figure13_data/W2H3a_numerical b/packaged-code/slots/figure_plots/figure13_data/W2H3a_numerical similarity index 100% rename from paper_code/slots/figure_plots/figure13_data/W2H3a_numerical rename to packaged-code/slots/figure_plots/figure13_data/W2H3a_numerical diff --git a/paper_code/slots/figure_plots/figure5.py b/packaged-code/slots/figure_plots/figure5.py similarity index 100% rename from paper_code/slots/figure_plots/figure5.py rename to packaged-code/slots/figure_plots/figure5.py diff --git a/paper_code/slots/figure_plots/figure5_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv b/packaged-code/slots/figure_plots/figure5_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv similarity index 100% rename from paper_code/slots/figure_plots/figure5_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv rename to packaged-code/slots/figure_plots/figure5_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv diff --git a/paper_code/slots/figure_plots/figure5_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv b/packaged-code/slots/figure_plots/figure5_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv similarity index 100% rename from paper_code/slots/figure_plots/figure5_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv rename to packaged-code/slots/figure_plots/figure5_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv diff --git a/paper_code/slots/figure_plots/figure5_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv b/packaged-code/slots/figure_plots/figure5_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv similarity index 100% rename from paper_code/slots/figure_plots/figure5_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv rename to packaged-code/slots/figure_plots/figure5_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv diff --git a/paper_code/slots/figure_plots/figure6.py b/packaged-code/slots/figure_plots/figure6.py similarity index 100% rename from paper_code/slots/figure_plots/figure6.py rename to packaged-code/slots/figure_plots/figure6.py diff --git a/paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H1.0.csv b/packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H1.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H1.0.csv rename to packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H1.0.csv diff --git a/paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H2.0.csv b/packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H2.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H2.0.csv rename to packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H2.0.csv diff --git a/paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H3.0.csv b/packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H3.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H3.0.csv rename to packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H3.0.csv diff --git a/paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H4.0.csv b/packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H4.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H4.0.csv rename to packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H4.0.csv diff --git a/paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H5.0.csv b/packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H5.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure6_data/h_collapse_n20000_H5.0.csv rename to packaged-code/slots/figure_plots/figure6_data/h_collapse_n20000_H5.0.csv diff --git a/paper_code/slots/figure_plots/figure7.py b/packaged-code/slots/figure_plots/figure7.py similarity index 100% rename from paper_code/slots/figure_plots/figure7.py rename to packaged-code/slots/figure_plots/figure7.py diff --git a/paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y1.0.csv b/packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y1.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y1.0.csv rename to packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y1.0.csv diff --git a/paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y2.0.csv b/packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y2.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y2.0.csv rename to packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y2.0.csv diff --git a/paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y3.0.csv b/packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y3.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y3.0.csv rename to packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y3.0.csv diff --git a/paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y4.0.csv b/packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y4.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y4.0.csv rename to packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y4.0.csv diff --git a/paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y5.0.csv b/packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y5.0.csv similarity index 100% rename from paper_code/slots/figure_plots/figure7_data/y_collapse_n20000_Y5.0.csv rename to packaged-code/slots/figure_plots/figure7_data/y_collapse_n20000_Y5.0.csv diff --git a/paper_code/slots/figure_plots/figure8.py b/packaged-code/slots/figure_plots/figure8.py similarity index 100% rename from paper_code/slots/figure_plots/figure8.py rename to packaged-code/slots/figure_plots/figure8.py diff --git a/paper_code/slots/figure_plots/figure8_data/peak_sweep_20000_16x16_plate_100.csv b/packaged-code/slots/figure_plots/figure8_data/peak_sweep_20000_16x16_plate_100.csv similarity index 100% rename from paper_code/slots/figure_plots/figure8_data/peak_sweep_20000_16x16_plate_100.csv rename to packaged-code/slots/figure_plots/figure8_data/peak_sweep_20000_16x16_plate_100.csv diff --git a/paper_code/slots/figure_plots/figure9.py b/packaged-code/slots/figure_plots/figure9.py similarity index 100% rename from paper_code/slots/figure_plots/figure9.py rename to packaged-code/slots/figure_plots/figure9.py diff --git a/paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/slots/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/slots/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/slots/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/slots/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/slots/figure_plots/util/analyse_slot.py b/packaged-code/slots/figure_plots/util/analyse_slot.py similarity index 100% rename from paper_code/slots/figure_plots/util/analyse_slot.py rename to packaged-code/slots/figure_plots/util/analyse_slot.py diff --git a/paper_code/slots/figure_plots/util/analysis_utils.py b/packaged-code/slots/figure_plots/util/analysis_utils.py similarity index 100% rename from paper_code/slots/figure_plots/util/analysis_utils.py rename to packaged-code/slots/figure_plots/util/analysis_utils.py diff --git a/paper_code/slots/figure_plots/util/config_utils.py b/packaged-code/slots/figure_plots/util/config_utils.py similarity index 100% rename from paper_code/slots/figure_plots/util/config_utils.py rename to packaged-code/slots/figure_plots/util/config_utils.py diff --git a/paper_code/slots/figure_plots/util/file_utils.py b/packaged-code/slots/figure_plots/util/file_utils.py similarity index 100% rename from paper_code/slots/figure_plots/util/file_utils.py rename to packaged-code/slots/figure_plots/util/file_utils.py diff --git a/paper_code/slots/figure_plots/util/plotting_utils.py b/packaged-code/slots/figure_plots/util/plotting_utils.py similarity index 100% rename from paper_code/slots/figure_plots/util/plotting_utils.py rename to packaged-code/slots/figure_plots/util/plotting_utils.py diff --git a/paper_code/thesis/chapter 2/fig_data/plasma.mp4 b/packaged-code/thesis/chapter 2/fig_data/plasma.mp4 similarity index 100% rename from paper_code/thesis/chapter 2/fig_data/plasma.mp4 rename to packaged-code/thesis/chapter 2/fig_data/plasma.mp4 diff --git a/paper_code/thesis/chapter 2/figure5.py b/packaged-code/thesis/chapter 2/figure5.py similarity index 100% rename from paper_code/thesis/chapter 2/figure5.py rename to packaged-code/thesis/chapter 2/figure5.py diff --git a/paper_code/thesis/chapter 2/figure6.py b/packaged-code/thesis/chapter 2/figure6.py similarity index 100% rename from paper_code/thesis/chapter 2/figure6.py rename to packaged-code/thesis/chapter 2/figure6.py diff --git a/paper_code/thesis/chapter 2/figure7.py b/packaged-code/thesis/chapter 2/figure7.py similarity index 100% rename from paper_code/thesis/chapter 2/figure7.py rename to packaged-code/thesis/chapter 2/figure7.py diff --git a/paper_code/thesis/chapter 4/util/analysis_utils.py b/packaged-code/thesis/chapter 2/util/analysis_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/analysis_utils.py rename to packaged-code/thesis/chapter 2/util/analysis_utils.py diff --git a/paper_code/thesis/chapter 4/util/determineDisplacement.py b/packaged-code/thesis/chapter 2/util/determineDisplacement.py similarity index 100% rename from paper_code/thesis/chapter 4/util/determineDisplacement.py rename to packaged-code/thesis/chapter 2/util/determineDisplacement.py diff --git a/paper_code/thesis/chapter 4/util/file_utils.py b/packaged-code/thesis/chapter 2/util/file_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/file_utils.py rename to packaged-code/thesis/chapter 2/util/file_utils.py diff --git a/paper_code/thesis/chapter 4/util/mp4.py b/packaged-code/thesis/chapter 2/util/mp4.py similarity index 100% rename from paper_code/thesis/chapter 4/util/mp4.py rename to packaged-code/thesis/chapter 2/util/mp4.py diff --git a/paper_code/thesis/chapter 4/util/mraw.py b/packaged-code/thesis/chapter 2/util/mraw.py similarity index 100% rename from paper_code/thesis/chapter 4/util/mraw.py rename to packaged-code/thesis/chapter 2/util/mraw.py diff --git a/paper_code/thesis/chapter 4/util/plotting_utils.py b/packaged-code/thesis/chapter 2/util/plotting_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/plotting_utils.py rename to packaged-code/thesis/chapter 2/util/plotting_utils.py diff --git a/paper_code/thesis/chapter 2/util/raytrace.py b/packaged-code/thesis/chapter 2/util/raytrace.py similarity index 100% rename from paper_code/thesis/chapter 2/util/raytrace.py rename to packaged-code/thesis/chapter 2/util/raytrace.py diff --git a/paper_code/thesis/chapter 3/bem/bem.py b/packaged-code/thesis/chapter 3/bem/bem.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/bem.py rename to packaged-code/thesis/chapter 3/bem/bem.py diff --git a/paper_code/thesis/chapter 3/bem/slot.py b/packaged-code/thesis/chapter 3/bem/slot.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/slot.py rename to packaged-code/thesis/chapter 3/bem/slot.py diff --git a/paper_code/thesis/chapter 3/bem/util/file_utils.py b/packaged-code/thesis/chapter 3/bem/util/file_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/util/file_utils.py rename to packaged-code/thesis/chapter 3/bem/util/file_utils.py diff --git a/paper_code/thesis/chapter 3/bem/util/gen_utils.py b/packaged-code/thesis/chapter 3/bem/util/gen_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/util/gen_utils.py rename to packaged-code/thesis/chapter 3/bem/util/gen_utils.py diff --git a/paper_code/thesis/chapter 3/bem/util/plotting_utils.py b/packaged-code/thesis/chapter 3/bem/util/plotting_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/bem/util/plotting_utils.py rename to packaged-code/thesis/chapter 3/bem/util/plotting_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/vector_utils.py b/packaged-code/thesis/chapter 3/bem/util/vector_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/vector_utils.py rename to packaged-code/thesis/chapter 3/bem/util/vector_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/all_direct_comparisons.py b/packaged-code/thesis/chapter 3/figure_plots/all_direct_comparisons.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/all_direct_comparisons.py rename to packaged-code/thesis/chapter 3/figure_plots/all_direct_comparisons.py diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y1.94.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y2.91.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W1H3_Y3.89.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H12_Y2.63.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.52.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y1.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.48.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y2.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H6_Y3.50.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y1.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W2H9_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y2.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/mean_data/mean_sweep_W4H12_Y3.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y1.94.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y2.91.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W1H3_Y3.89.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H12_Y2.63.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.52.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y1.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.48.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y2.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H6_Y3.50.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y1.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W2H9_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y2.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/raw_data/raw_data_sweep_W4H12_Y3.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y1.94.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y2.91.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W1H3_Y3.89.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H12_Y2.63.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.52.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y1.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.48.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y2.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H6_Y3.50.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y1.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W2H9_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y2.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_data/shifted_data_sweep_W4H12_Y3.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y1.94.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y2.91.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W1H3_Y3.89.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H12_Y2.63.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y1.77.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.29.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y2.81.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.32.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3a_Y3.84.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H3b_Y3.68.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.52.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y1.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.48.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y2.99.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H6_Y3.50.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y1.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W2H9_Y2.66.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y2.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv b/packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv rename to packaged-code/thesis/chapter 3/figure_plots/experiment_data/shifted_mean_data/mean_sweep_W4H12_Y3.43.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure10.py b/packaged-code/thesis/chapter 3/figure_plots/figure10.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure10.py rename to packaged-code/thesis/chapter 3/figure_plots/figure10.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure10_data/peak_sweep_20000_16x16_plate_100.csv b/packaged-code/thesis/chapter 3/figure_plots/figure10_data/peak_sweep_20000_16x16_plate_100.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure10_data/peak_sweep_20000_16x16_plate_100.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure10_data/peak_sweep_20000_16x16_plate_100.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure11.py b/packaged-code/thesis/chapter 3/figure_plots/figure11.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure11.py rename to packaged-code/thesis/chapter 3/figure_plots/figure11.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure12.py b/packaged-code/thesis/chapter 3/figure_plots/figure12.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure12.py rename to packaged-code/thesis/chapter 3/figure_plots/figure12.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure13.py b/packaged-code/thesis/chapter 3/figure_plots/figure13.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure13.py rename to packaged-code/thesis/chapter 3/figure_plots/figure13.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure14.py b/packaged-code/thesis/chapter 3/figure_plots/figure14.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure14.py rename to packaged-code/thesis/chapter 3/figure_plots/figure14.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure15.py b/packaged-code/thesis/chapter 3/figure_plots/figure15.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure15.py rename to packaged-code/thesis/chapter 3/figure_plots/figure15.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure15_data/W1H3_experimental b/packaged-code/thesis/chapter 3/figure_plots/figure15_data/W1H3_experimental similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure15_data/W1H3_experimental rename to packaged-code/thesis/chapter 3/figure_plots/figure15_data/W1H3_experimental diff --git a/paper_code/thesis/chapter 3/figure_plots/figure15_data/W1H3_numerical b/packaged-code/thesis/chapter 3/figure_plots/figure15_data/W1H3_numerical similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure15_data/W1H3_numerical rename to packaged-code/thesis/chapter 3/figure_plots/figure15_data/W1H3_numerical diff --git a/paper_code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_experimental b/packaged-code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_experimental similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_experimental rename to packaged-code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_experimental diff --git a/paper_code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_numerical b/packaged-code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_numerical similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_numerical rename to packaged-code/thesis/chapter 3/figure_plots/figure15_data/W2H3a_numerical diff --git a/paper_code/thesis/chapter 3/figure_plots/figure4.py b/packaged-code/thesis/chapter 3/figure_plots/figure4.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure4.py rename to packaged-code/thesis/chapter 3/figure_plots/figure4.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6.py b/packaged-code/thesis/chapter 3/figure_plots/figure6.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6.py rename to packaged-code/thesis/chapter 3/figure_plots/figure6.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_10.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_10.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_10.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_10.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_100.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_100.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_100.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_100.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_150.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_150.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_150.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_150.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_20.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_20.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_20.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_20.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_200.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_200.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_200.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_200.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_250.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_250.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_250.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_250.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_30.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_30.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_30.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_30.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_40.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_40.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_40.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_40.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_50.csv b/packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_50.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_50.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure6_data/uniform_corner_rms_between_panels_50.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure7.py b/packaged-code/thesis/chapter 3/figure_plots/figure7.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure7.py rename to packaged-code/thesis/chapter 3/figure_plots/figure7.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure7_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv b/packaged-code/thesis/chapter 3/figure_plots/figure7_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure7_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure7_data/centroids_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure7_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv b/packaged-code/thesis/chapter 3/figure_plots/figure7_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure7_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure7_data/normals_n20000_w2.00_h2.00_drat0.1_wthresh12_len100.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure7_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv b/packaged-code/thesis/chapter 3/figure_plots/figure7_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure7_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure7_data/vel_sweep_n20000_W2.00_H2.00_drat0.1_wthresh12_len100_N64.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8.py b/packaged-code/thesis/chapter 3/figure_plots/figure8.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8.py rename to packaged-code/thesis/chapter 3/figure_plots/figure8.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H1.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H1.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H1.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H1.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H2.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H2.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H2.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H2.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H3.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H3.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H3.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H3.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H4.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H4.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H4.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H4.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H5.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H5.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H5.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure8_data/h_collapse_n20000_H5.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9.py b/packaged-code/thesis/chapter 3/figure_plots/figure9.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9.py rename to packaged-code/thesis/chapter 3/figure_plots/figure9.py diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y1.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y1.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y1.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y1.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y2.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y2.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y2.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y2.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y3.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y3.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y3.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y3.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y4.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y4.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y4.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y4.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y5.0.csv b/packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y5.0.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y5.0.csv rename to packaged-code/thesis/chapter 3/figure_plots/figure9_data/y_collapse_n20000_Y5.0.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y1.94_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y2.91_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W1.23H2.74Y3.89_bem_slot_prediction_20000_0.25_15.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y1.66_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.14H8.21Y2.66_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H11.50Y2.63_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y1.77_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.29_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y2.81_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.32_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.70Y3.84_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y2.66_bem_slot_prediction_20000_0.25_8.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H2.90Y3.68_bem_slot_prediction_20000_0.25_8.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.52_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W2.20H5.40Y1.99_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y2.43_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv b/packaged-code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv rename to packaged-code/thesis/chapter 3/figure_plots/model_predictions/W4.20H11.47Y3.43_bem_slot_prediction_20000_0.25_5.csv diff --git a/paper_code/thesis/chapter 3/figure_plots/util/analyse_slot.py b/packaged-code/thesis/chapter 3/figure_plots/util/analyse_slot.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/analyse_slot.py rename to packaged-code/thesis/chapter 3/figure_plots/util/analyse_slot.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/analysis_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/analysis_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/analysis_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/analysis_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/bem.py b/packaged-code/thesis/chapter 3/figure_plots/util/bem.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/bem.py rename to packaged-code/thesis/chapter 3/figure_plots/util/bem.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/config_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/config_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/config_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/config_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/element_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/element_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/element_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/element_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/elements.py b/packaged-code/thesis/chapter 3/figure_plots/util/elements.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/elements.py rename to packaged-code/thesis/chapter 3/figure_plots/util/elements.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/file_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/file_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/file_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/file_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/gen_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/gen_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/gen_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/gen_utils.py diff --git a/paper_code/thesis/chapter 3/figure_plots/util/plotting_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/plotting_utils.py similarity index 100% rename from paper_code/thesis/chapter 3/figure_plots/util/plotting_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/plotting_utils.py diff --git a/paper_code/thesis/chapter 4/util/vector_utils.py b/packaged-code/thesis/chapter 3/figure_plots/util/vector_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/vector_utils.py rename to packaged-code/thesis/chapter 3/figure_plots/util/vector_utils.py diff --git a/paper_code/thesis/chapter 4/figure1.py b/packaged-code/thesis/chapter 4/figure1.py similarity index 100% rename from paper_code/thesis/chapter 4/figure1.py rename to packaged-code/thesis/chapter 4/figure1.py diff --git a/paper_code/thesis/chapter 4/figure2.py b/packaged-code/thesis/chapter 4/figure2.py similarity index 100% rename from paper_code/thesis/chapter 4/figure2.py rename to packaged-code/thesis/chapter 4/figure2.py diff --git a/paper_code/thesis/chapter 4/figure3.py b/packaged-code/thesis/chapter 4/figure3.py similarity index 100% rename from paper_code/thesis/chapter 4/figure3.py rename to packaged-code/thesis/chapter 4/figure3.py diff --git a/paper_code/thesis/chapter 4/figure4.py b/packaged-code/thesis/chapter 4/figure4.py similarity index 100% rename from paper_code/thesis/chapter 4/figure4.py rename to packaged-code/thesis/chapter 4/figure4.py diff --git a/paper_code/thesis/chapter 4/figure5.py b/packaged-code/thesis/chapter 4/figure5.py similarity index 100% rename from paper_code/thesis/chapter 4/figure5.py rename to packaged-code/thesis/chapter 4/figure5.py diff --git a/paper_code/thesis/chapter 4/figure6and7.py b/packaged-code/thesis/chapter 4/figure6and7.py similarity index 100% rename from paper_code/thesis/chapter 4/figure6and7.py rename to packaged-code/thesis/chapter 4/figure6and7.py diff --git a/paper_code/thesis/chapter 4/model_bem_flat_plate_experiment.py b/packaged-code/thesis/chapter 4/model_bem_flat_plate_experiment.py similarity index 100% rename from paper_code/thesis/chapter 4/model_bem_flat_plate_experiment.py rename to packaged-code/thesis/chapter 4/model_bem_flat_plate_experiment.py diff --git a/paper_code/thesis/chapter 4/model_bem_slot_experiment.py b/packaged-code/thesis/chapter 4/model_bem_slot_experiment.py similarity index 100% rename from paper_code/thesis/chapter 4/model_bem_slot_experiment.py rename to packaged-code/thesis/chapter 4/model_bem_slot_experiment.py diff --git a/paper_code/thesis/chapter 4/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 b/packaged-code/thesis/chapter 4/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 similarity index 100% rename from paper_code/thesis/chapter 4/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 rename to packaged-code/thesis/chapter 4/model_data/corner_anisotropy_data/R1.0_L20_n50000_cn3 diff --git a/paper_code/thesis/chapter 4/model_data/corner_anisotropy_sweep.py b/packaged-code/thesis/chapter 4/model_data/corner_anisotropy_sweep.py similarity index 100% rename from paper_code/thesis/chapter 4/model_data/corner_anisotropy_sweep.py rename to packaged-code/thesis/chapter 4/model_data/corner_anisotropy_sweep.py diff --git a/paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv b/packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv similarity index 100% rename from paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv rename to packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/anisotropy_sweep_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0_N33.csv diff --git a/paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv b/packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv similarity index 100% rename from paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv rename to packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/centroids_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv diff --git a/paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv b/packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv similarity index 100% rename from paper_code/thesis/chapter 4/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv rename to packaged-code/thesis/chapter 4/model_data/slot_anisotropy_data/normals_n23000_W4.00_H4.00_drat0.1_wthresh12.00_len100.0.csv diff --git a/paper_code/thesis/chapter 4/model_data/slot_anisotropy_sweep.py b/packaged-code/thesis/chapter 4/model_data/slot_anisotropy_sweep.py similarity index 100% rename from paper_code/thesis/chapter 4/model_data/slot_anisotropy_sweep.py rename to packaged-code/thesis/chapter 4/model_data/slot_anisotropy_sweep.py diff --git a/paper_code/thesis/chapter 4/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 b/packaged-code/thesis/chapter 4/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 similarity index 100% rename from paper_code/thesis/chapter 4/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 rename to packaged-code/thesis/chapter 4/model_data/square_anisotropy_data/R1.0_L15_n20000_i32 diff --git a/paper_code/thesis/chapter 4/model_data/square_anisotropy_sweep.py b/packaged-code/thesis/chapter 4/model_data/square_anisotropy_sweep.py similarity index 100% rename from paper_code/thesis/chapter 4/model_data/square_anisotropy_sweep.py rename to packaged-code/thesis/chapter 4/model_data/square_anisotropy_sweep.py diff --git a/paper_code/thesis/chapter 4/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 b/packaged-code/thesis/chapter 4/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 similarity index 100% rename from paper_code/thesis/chapter 4/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 rename to packaged-code/thesis/chapter 4/model_data/triangle_anisotropy_data/R1.0_L15_n20000_i32 diff --git a/paper_code/thesis/chapter 4/model_data/triangle_anisotropy_sweep.py b/packaged-code/thesis/chapter 4/model_data/triangle_anisotropy_sweep.py similarity index 100% rename from paper_code/thesis/chapter 4/model_data/triangle_anisotropy_sweep.py rename to packaged-code/thesis/chapter 4/model_data/triangle_anisotropy_sweep.py diff --git a/paper_code/thesis/chapter 4/model_sa_corner_experiment.py b/packaged-code/thesis/chapter 4/model_sa_corner_experiment.py similarity index 100% rename from paper_code/thesis/chapter 4/model_sa_corner_experiment.py rename to packaged-code/thesis/chapter 4/model_sa_corner_experiment.py diff --git a/paper_code/thesis/chapter 4/model_sa_equi_triangle_experiment.py b/packaged-code/thesis/chapter 4/model_sa_equi_triangle_experiment.py similarity index 100% rename from paper_code/thesis/chapter 4/model_sa_equi_triangle_experiment.py rename to packaged-code/thesis/chapter 4/model_sa_equi_triangle_experiment.py diff --git a/paper_code/thesis/chapter 4/model_sa_square_experiment.py b/packaged-code/thesis/chapter 4/model_sa_square_experiment.py similarity index 100% rename from paper_code/thesis/chapter 4/model_sa_square_experiment.py rename to packaged-code/thesis/chapter 4/model_sa_square_experiment.py diff --git a/paper_code/thesis/chapter 5/util/analysis_utils.py b/packaged-code/thesis/chapter 4/util/analysis_utils.py similarity index 100% rename from paper_code/thesis/chapter 5/util/analysis_utils.py rename to packaged-code/thesis/chapter 4/util/analysis_utils.py diff --git a/paper_code/thesis/chapter 4/util/bem.py b/packaged-code/thesis/chapter 4/util/bem.py similarity index 100% rename from paper_code/thesis/chapter 4/util/bem.py rename to packaged-code/thesis/chapter 4/util/bem.py diff --git a/paper_code/thesis/chapter 5/util/determineDisplacement.py b/packaged-code/thesis/chapter 4/util/determineDisplacement.py similarity index 100% rename from paper_code/thesis/chapter 5/util/determineDisplacement.py rename to packaged-code/thesis/chapter 4/util/determineDisplacement.py diff --git a/paper_code/thesis/chapter 5/util/file_utils.py b/packaged-code/thesis/chapter 4/util/file_utils.py similarity index 100% rename from paper_code/thesis/chapter 5/util/file_utils.py rename to packaged-code/thesis/chapter 4/util/file_utils.py diff --git a/paper_code/thesis/chapter 4/util/gen_utils.py b/packaged-code/thesis/chapter 4/util/gen_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/gen_utils.py rename to packaged-code/thesis/chapter 4/util/gen_utils.py diff --git a/paper_code/thesis/chapter 4/util/moi_utils.py b/packaged-code/thesis/chapter 4/util/moi_utils.py similarity index 100% rename from paper_code/thesis/chapter 4/util/moi_utils.py rename to packaged-code/thesis/chapter 4/util/moi_utils.py diff --git a/paper_code/thesis/chapter 5/util/mp4.py b/packaged-code/thesis/chapter 4/util/mp4.py similarity index 100% rename from paper_code/thesis/chapter 5/util/mp4.py rename to packaged-code/thesis/chapter 4/util/mp4.py diff --git a/paper_code/thesis/chapter 5/util/mraw.py b/packaged-code/thesis/chapter 4/util/mraw.py similarity index 100% rename from paper_code/thesis/chapter 5/util/mraw.py rename to packaged-code/thesis/chapter 4/util/mraw.py diff --git a/paper_code/thesis/chapter 5/util/plotting_utils.py b/packaged-code/thesis/chapter 4/util/plotting_utils.py similarity index 100% rename from paper_code/thesis/chapter 5/util/plotting_utils.py rename to packaged-code/thesis/chapter 4/util/plotting_utils.py diff --git a/packaged-code/thesis/chapter 4/util/vector_utils.py b/packaged-code/thesis/chapter 4/util/vector_utils.py new file mode 100644 index 0000000..7732138 --- /dev/null +++ b/packaged-code/thesis/chapter 4/util/vector_utils.py @@ -0,0 +1,57 @@ +def mag(v): + if len(v) == 2: + return (v[0] ** 2 + v[1] ** 2) ** 0.5 + + if len(v) == 3: + return (v[0] ** 2 + v[1] ** 2 + v[2] ** 2) ** 0.5 + + +def unit(v): + m = mag(v) + if len(v) == 2: + return [v[0] / m, v[1] / m] + + if len(v) == 3: + return [v[0] / m, v[1] / m, v[2] / m] + + +def mag_sqrd(v): + if len(v) == 2: + return v[0] ** 2 + v[1] ** 2 + + if len(v) == 3: + return v[0] ** 2 + v[1] ** 2 + v[2] ** 2 + + +def dist(v1, v2): + if len(v1) != len(v2): + raise ValueError("Vector lengths do not match (v1: {0}, v2: {1}).".format(len(v1), len(v2))) + + if len(v1) == 2: + return mag([v2[0] - v1[0], v2[1] - v1[1]]) + + if len(v1) == 3: + return mag([v2[0] - v1[0], v2[1] - v1[1], v2[2] - v1[2]]) + + +def get_line_intersect(pos, vect, l_a, l_b): + """ + Calculates the intersect (if any) between a line and a vector from a point. + :param pos: Position from which to trace. + :param vect: Vector along which to trace. + :param l_a: Point a of the line. + :param l_b: Point b of the line. + :return: Position (x, y) of the intersect or None + """ + # Intersect = pos + zeta * vect + zeta = (((pos[0] - l_a[0]) * (l_b[1] - l_a[1])) - (pos[1] - l_a[1]) * (l_b[0] - l_a[0])) / ( + vect[1] * (l_b[0] - l_a[0]) - vect[0] * (l_b[1] - l_a[1])) + + # Intersect = l_a + kappa * l_b + kappa = (vect[0] * (l_a[1] - pos[1]) - vect[1] * (l_a[0] - pos[0])) / ( + vect[1] * (l_b[0] - l_a[0]) - vect[0] * (l_b[1] - l_a[1])) + + if zeta >= 0 and 0 <= kappa <= 1: + return [pos[0] + zeta * vect[0], pos[1] + zeta * vect[1]] + else: + return None diff --git a/paper_code/thesis/chapter 5/fig_data/complex_geometry_anisotropy_data.csv b/packaged-code/thesis/chapter 5/fig_data/complex_geometry_anisotropy_data.csv similarity index 100% rename from paper_code/thesis/chapter 5/fig_data/complex_geometry_anisotropy_data.csv rename to packaged-code/thesis/chapter 5/fig_data/complex_geometry_anisotropy_data.csv diff --git a/paper_code/thesis/chapter 5/fig_data/surface_nucleation.mp4 b/packaged-code/thesis/chapter 5/fig_data/surface_nucleation.mp4 similarity index 100% rename from paper_code/thesis/chapter 5/fig_data/surface_nucleation.mp4 rename to packaged-code/thesis/chapter 5/fig_data/surface_nucleation.mp4 diff --git a/paper_code/thesis/chapter 5/figure10.py b/packaged-code/thesis/chapter 5/figure10.py similarity index 100% rename from paper_code/thesis/chapter 5/figure10.py rename to packaged-code/thesis/chapter 5/figure10.py diff --git a/paper_code/thesis/chapter 5/figure11.py b/packaged-code/thesis/chapter 5/figure11.py similarity index 100% rename from paper_code/thesis/chapter 5/figure11.py rename to packaged-code/thesis/chapter 5/figure11.py diff --git a/paper_code/thesis/chapter 5/figure12and13.py b/packaged-code/thesis/chapter 5/figure12and13.py similarity index 100% rename from paper_code/thesis/chapter 5/figure12and13.py rename to packaged-code/thesis/chapter 5/figure12and13.py diff --git a/paper_code/thesis/chapter 5/figure2.py b/packaged-code/thesis/chapter 5/figure2.py similarity index 100% rename from paper_code/thesis/chapter 5/figure2.py rename to packaged-code/thesis/chapter 5/figure2.py diff --git a/paper_code/thesis/chapter 5/figure3.py b/packaged-code/thesis/chapter 5/figure3.py similarity index 100% rename from paper_code/thesis/chapter 5/figure3.py rename to packaged-code/thesis/chapter 5/figure3.py diff --git a/paper_code/thesis/chapter 5/figure4.py b/packaged-code/thesis/chapter 5/figure4.py similarity index 100% rename from paper_code/thesis/chapter 5/figure4.py rename to packaged-code/thesis/chapter 5/figure4.py diff --git a/paper_code/thesis/chapter 5/figure5.py b/packaged-code/thesis/chapter 5/figure5.py similarity index 100% rename from paper_code/thesis/chapter 5/figure5.py rename to packaged-code/thesis/chapter 5/figure5.py diff --git a/paper_code/thesis/chapter 5/figure6.py b/packaged-code/thesis/chapter 5/figure6.py similarity index 100% rename from paper_code/thesis/chapter 5/figure6.py rename to packaged-code/thesis/chapter 5/figure6.py diff --git a/paper_code/thesis/chapter 5/figure7.py b/packaged-code/thesis/chapter 5/figure7.py similarity index 100% rename from paper_code/thesis/chapter 5/figure7.py rename to packaged-code/thesis/chapter 5/figure7.py diff --git a/paper_code/thesis/chapter 5/figure8.py b/packaged-code/thesis/chapter 5/figure8.py similarity index 100% rename from paper_code/thesis/chapter 5/figure8.py rename to packaged-code/thesis/chapter 5/figure8.py diff --git a/paper_code/thesis/chapter 5/steel_porous_plate_anisotropy.py b/packaged-code/thesis/chapter 5/steel_porous_plate_anisotropy.py similarity index 100% rename from paper_code/thesis/chapter 5/steel_porous_plate_anisotropy.py rename to packaged-code/thesis/chapter 5/steel_porous_plate_anisotropy.py diff --git a/packaged-code/thesis/chapter 5/util/analysis_utils.py b/packaged-code/thesis/chapter 5/util/analysis_utils.py new file mode 100644 index 0000000..73d3481 --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/analysis_utils.py @@ -0,0 +1,641 @@ +""" +This code is based on code by Ivo Peters. The original code can be found in util/determineDisplacement. + +TODO: +- Improve error detection. + -> Void fraction? (of both frames) + -> Frames too far along (>50?) +- Improve handling of sideways measurements (separate analysis from processing i.e. just x, y, z, idx, vectors etc.) +""" +import os +from typing import List +import sys +import importlib + +import matplotlib.pyplot as plt +import numpy as np +from skimage.measure import label, regionprops +from scipy.interpolate import interp1d + +import util.determineDisplacement as dd +import util.file_utils as file +from util.mp4 import MP4 + + +class Reading: + m_x, m_y, m_z = None, None, None # Measurement coordinates + idx = None + repeat_number = None + + disp_vect = None # Bubble displacement vector (pixels) + sup_disp_vect = None # Displacement vector between minima as in Supponen et al. (2016) + bubble_pos = None # Bubble position in the frame (px coords) + max_bubble_area = None # Maximum bubble area (pixels) + sec_max_area = None # Second maximum of bubble area (pixels) + inter_max_frames = None # Time between + ecc_at_max = None # Eccentricity at maximum area + model_anisotropy = None # Anisotropy vector generated from BEM model + + def __init__(self, idx, repeat_number, m_x=None, m_y=None, m_z=None): + self.idx = idx + self.repeat_number = repeat_number + self.m_x = m_x + self.m_y = m_y + self.m_z = m_z + + def __str__(self): + string = f"{self.idx}:{self.repeat_number},{self.m_x},{self.m_y},{self.m_z}," \ + f"{self.disp_vect[0]},{self.disp_vect[1]}," \ + f"{self.bubble_pos[0]},{self.bubble_pos[1]}," \ + f"{self.max_bubble_area},{self.sec_max_area},{self.inter_max_frames}," \ + f"{self.sup_disp_vect[0]},{self.sup_disp_vect[1]}," \ + f"{self.ecc_at_max}" + if self.model_anisotropy is not None: # Only include anisotropy if available + string += f",{self.model_anisotropy[0]},{self.model_anisotropy[1]},{self.model_anisotropy[2]}" + return string + + def get_bubble_pos_mm(self, mm_per_px, frame_height=264): + return np.array([self.bubble_pos[0] * mm_per_px + self.m_x, + (frame_height - self.bubble_pos[1]) * mm_per_px + self.m_y]) + + def is_complete(self): + return self.disp_vect and self.bubble_pos and self.max_bubble_area \ + and self.sec_max_area and self.inter_max_frames + + def get_jet_angle(self): + return np.arctan2(-self.disp_vect[1], self.disp_vect[0]) + np.pi / 2 + + def get_angle_dif(self): + """ Computes the angle difference between the experimental measurement and the predicted anisotropy. """ + if self.model_anisotropy is not None: + # mm_per_px scaling doesn't matter here, just using this function to get the right direction conventions + return np.arccos(np.dot(self.get_disp_mm(1), self.model_anisotropy) / + (np.linalg.norm(self.get_disp_mm(1)) * np.linalg.norm(self.model_anisotropy))) + + def get_normalised_displacement(self): + return self.disp_vect / np.sqrt(self.max_bubble_area / np.pi) + + def get_disp_mm(self, mm_per_px): + return np.array([self.disp_vect[0] * mm_per_px, - self.disp_vect[1] * mm_per_px, 0]) + + def get_radius_ratio(self): + return np.sqrt(self.sec_max_area / self.max_bubble_area) + + def get_max_radius(self, mm_per_px): + return mm_per_px * np.sqrt(self.max_bubble_area / np.pi) + + def get_scalar_anisotropy(self): + if self.model_anisotropy is not None: + return np.linalg.norm(self.model_anisotropy) + + @staticmethod + def from_str(string: str): + """ Deserializes and returns a Reading object. """ + string = string.strip() + split = string.split(",") + if split[1] == "None": + x = None + else: + x = float(split[1]) + if split[2] == "None": + y = None + else: + y = float(split[2]) + if split[3] == "None": + z = None + else: + z = float(split[3]) + reading = Reading(int(split[0].split(":")[0]), int(split[0].split(":")[1]), x, y, z) + reading.disp_vect = np.array([float(split[4]), float(split[5])]) + reading.bubble_pos = np.array([float(split[6]), float(split[7])]) + reading.max_bubble_area = np.array(int(split[8])) + if len(split) > 9: # Only include newer metrics if available + reading.sec_max_area = np.array(int(split[9])) + reading.inter_max_frames = np.array(int(split[10])) + if len(split) > 11: # Only include even newer metrics if available + reading.sup_disp_vect = np.array([float(split[11]), float(split[12])]) + if len(split) > 13: # Only include even even newer metric (eccentricity) if available + reading.ecc_at_max = np.array(float(split[13])) + if len(split) > 14: # Only include blah blah blah (anisotropy vector) + reading.model_anisotropy = np.array([float(split[14]), float(split[15]), float(split[16])]) + return reading + + +def load_readings(filename, include_invalid=False, do_flag_invalid=True): + if do_flag_invalid: + flag_invalid_readings(filename.rpartition("/")[0] + "/") + dump_file = open(filename) + lines = dump_file.readlines() + + readings = [] + + for line in lines[1:]: + if line[0] == "#" and not include_invalid: + continue + if line[0] == "#": + line = line[1:] + readings.append(Reading.from_str(line)) + + dump_file.close() + + return readings + + +def save_readings(dir_path, readings): + if os.path.exists(dir_path + "readings_dump.csv"): + bkp_num = 0 + while os.path.exists(dir_path + f"readings_dump.csv.bkp.{bkp_num}"): + bkp_num += 1 + os.rename(dir_path + "readings_dump.csv", dir_path + f"readings_dump.csv.bkp.{bkp_num}") + + dump_file = open(dir_path + "readings_dump.csv", "a") + dump_file.write("index:repeat number, measured x (mm), measured y (mm), measured z (mm), " + "peak-to-peak x displacement (px), peak-to-peak y displacement (px), " + "in-frame bubble position x (px), in-frame bubble position y (px), " + "maximum bubble area (px^2), second maximum of bubble area (px^2), frames between maxima, " + "minimum-to-minimum x displacement (px), minimum-to-minimum y displacement (px)," + "eccentricity at maximum size," + "model anisotropy x, model anisotropy y, model anisotropy z\n") + + for reading in readings: + dump_file.write(str(reading) + "\n") + + dump_file.close() + + +def plot_analysis(areas, xs, ys, dx, dy, ns, path, frames, frame_rate, repeat_number=0, show_plot=False): + areas = np.array(areas) + xs = np.array(xs) + ys = np.array(ys) + ns = np.array(ns) + + # calculate time (s) + t = ns / frame_rate + + # close the previous plot + plt.close() + # find and plot peaks + plt.figure() + plt.subplot(2, 3, 3) + plt.plot(1000 * t, areas) + plt.scatter(1000 * t, areas, c="red", s=1) + plt.xlabel('t (ms)') + plt.ylabel('area (sq. pix.)') + peak_idxs, yPeak = dd.findPeaks(ns, areas, kernel=4) + idx = ns[peak_idxs] + plt.plot(1000 * t[peak_idxs], yPeak, 'o') + + # plot raw images + if len(idx) > 0: + plt.subplot(2, 3, 1) + plt.imshow(frames[idx[0]], cmap=plt.cm.gray) + plt.plot(xs[peak_idxs[0]], ys[peak_idxs[0]], 'x') + plt.xticks([]) + plt.yticks([]) + plt.title("Frame {0}".format(idx[0])) + if len(idx) > 1: + plt.subplot(2, 3, 4) + plt.imshow(frames[idx[1]], cmap=plt.cm.gray) + plt.plot(xs[peak_idxs[1]], ys[peak_idxs[1]], 'x') + plt.xticks([]) + plt.yticks([]) + plt.title("Frame {0}".format(idx[1])) + + # plot binary processed bubble images + if len(idx) > 0: + plt.subplot(2, 3, 2) + binary1 = dd.makeBinary(frames[0] - np.int32(frames[idx[0]])) + plt.imshow(binary1, cmap=plt.cm.gray) + plt.xticks([]) + plt.yticks([]) + if len(idx) > 1: + plt.subplot(2, 3, 5) + binary2 = dd.makeBinary(frames[0] - np.int32(frames[idx[1]])) + plt.imshow(binary2, cmap=plt.cm.gray) + plt.xticks([]) + plt.yticks([]) + + # calculate and plot displacement on background image + if len(idx) > 1: + plt.subplot(2, 3, 6) + plt.imshow(frames[0], cmap=plt.cm.gray) + plt.plot(xs[peak_idxs[0]:peak_idxs[1] + 1], ys[peak_idxs[0]:peak_idxs[1] + 1], 'x') + + plt.quiver(xs[peak_idxs[0]], ys[peak_idxs[0]], dx, -dy, + scale_units='x', + scale=0.33, + width=0.02) + + plt.tight_layout() + if show_plot: + plt.show() + + # save figure for checking proper working of algorithms + plt.savefig(path + "analysis_plot_r{0}.png".format(repeat_number), dpi=150) + + +def analyse_frame(frame, bg_frame, max_ecc=0.6, min_sol=0.9, debug=False): + """ + Analyses a single frame to find the coordinates and area of the bubble region. Additional parameters returned if + debug is True. + + :param frame: Image frame. + :param bg_frame: Background image frame. + :return: x, y, area, [eccentricity, solidity] + """ + x, y, area, ecc, sol, jt = None, None, None, None, None, None + + img = np.int32(bg_frame) - np.int32(frame) + binary = dd.makeBinary(img) + label_img = label(binary) + props = regionprops(label_img, cache=False) + + if len(props) > 0: + if len(props) > 1: + max_area = 0.0 + for j in range(len(props)): + if props[j].area > max_area: + max_area = props[j].area + max_idx = j + y, x = props[max_idx].centroid + area = props[max_idx].area + ecc = props[max_idx].eccentricity + sol = props[max_idx].solidity + + coords = np.array(props[max_idx].coords) + dists = np.linalg.norm(np.subtract(coords, [y, x]), axis=1) + max_dist_idx = np.argmax(dists) + jt = coords[max_dist_idx] # np.arctan2(coords[max_dist_idx][1] - y, coords[max_dist_idx][0] - x) + + if props[max_idx].eccentricity > max_ecc or props[max_idx].solidity < min_sol: + area = None + else: + y, x = props[0].centroid + area = props[0].area + ecc = props[0].eccentricity + sol = props[0].solidity + + coords = np.array(props[0].coords) + dists = np.linalg.norm(np.subtract(coords, [y, x]), axis=1) + max_dist_idx = np.argmax(dists) + jt = coords[max_dist_idx] # np.arctan2(coords[max_dist_idx][1] - y, coords[max_dist_idx][0] - x) + + if props[0].eccentricity > max_ecc or props[0].solidity < min_sol: + area = None + + if not debug: + return x, y, area + else: + if jt is not None: + jet_tip = (jt[1], jt[0]) + else: + jet_tip = None + return x, y, area, ecc, sol, jet_tip + + +def estimate_supponen_disp(areas, idxs, frame_rate, xs, ys): + time_per_frame = 1 / frame_rate + times = np.array(idxs) * time_per_frame + + gradients = np.abs((areas[1:] - areas[:-1]) / (times[1:] - times[:-1])) + grad_change_of_sign = np.sign(gradients[1:] - gradients[:-1]) + abs_d_grad_cos = np.abs(grad_change_of_sign[1:] - grad_change_of_sign[:-1]) + + min_grad_idx = None + for i in range(len(abs_d_grad_cos)): + if all(abs_d_grad_cos[i:i + 3] == 2): + min_grad_idx = i + 2 + break + + if min_grad_idx is None: # TODO: Properly analyse these failures + return 0, 0 + + first_collapse_end_idx = min_grad_idx + scnd_collapse_start_idx = min_grad_idx + 1 + + try: + coeffs1 = np.polyfit(times[:first_collapse_end_idx + 1], areas[:first_collapse_end_idx + 1], 2) + coeffs2 = np.polyfit(times[scnd_collapse_start_idx:-1], areas[scnd_collapse_start_idx:-1], 2) + intersection = np.roots(coeffs1 - coeffs2) + interp_x = interp1d(times, xs - xs[0], "linear")(intersection[-1]) + interp_y = interp1d(times, ys - ys[0], "linear")(intersection[-1]) + except: + return 0, 0 + + return interp_x, interp_y + + +def calculate_displacement(frames, frame_rate, trigger_out_delay, save_path=None, repeat_num=0, laser_delay=100e-6, + warn=False): + """ + Calculate bubble displacement vector for a series of frames. + :param frames: Frames + :param frame_rate: Frame rate (fps) + :param trigger_out_delay: Camera trigger out delay + :param save_path: Path in which to save the analysis plot, if None does not save. + :param repeat_num: Number of the repeat, used to save the analysis plot for movies with multiple repeats. + :param laser_delay: Laser delay + :return: displacement vector [x, y], initial bubble centroid [x, y], max area, second max area, inter-max frames, + Supponen displacement vector [x, y] + """ + xs = [] + ys = [] + areas = [] + eccs = [] + idxs = [] + + bg_frame = np.int32(frames[0]) + + total_laser_delay = laser_delay + trigger_out_delay # determine total delay in firing the laser + laser_frame_idx = int(round(frame_rate * total_laser_delay)) # delay in frames + first_frame_idx = laser_frame_idx + 1 # first frame we will analyse + + for idx in range(first_frame_idx, len(frames)): + x, y, area, ecc, sol, _ = analyse_frame(frames[idx], bg_frame, debug=True) + if area is None: + continue # No bubble found. + xs.append(x) + ys.append(y) + areas.append(area) + idxs.append(idx) + eccs.append(ecc) + + xs = np.array(xs) + ys = np.array(ys) + areas = np.array(areas) + idxs = np.array(idxs) + + peak_idxs, peak_areas = dd.findPeaks(idxs, areas, kernel=4) + + if len(peak_idxs) > 1: + dx = xs[peak_idxs[1]] - xs[peak_idxs[0]] + dy = ys[peak_idxs[1]] - ys[peak_idxs[0]] + + sup_dx, sup_dy = estimate_supponen_disp(areas, idxs, frame_rate, xs, ys) + + if save_path is not None: + plot_analysis(areas, xs, ys, dx, dy, idxs, save_path, frames, frame_rate, repeat_number=repeat_num) + + return [dx, dy], [xs[peak_idxs[0]], ys[peak_idxs[0]]], areas[peak_idxs[0]], areas[peak_idxs[1]], \ + peak_idxs[1] - peak_idxs[0], [sup_dx, sup_dy], eccs[peak_idxs[0]] + else: + if save_path is not None: + plot_analysis(areas, xs, ys, 0, 0, idxs, save_path, frames, frame_rate, repeat_number=repeat_num) + if warn: + print("Warning: Less than two area peaks found.") + return None + + +def analyse_reading(dir_path, return_mean=False, warn=False, short_status=False): + """ + Analyses a reading in specified file path. + + :param dir_path: Reading directory path. + :param return_mean: Whether to return the mean displacement or a list of displacements. + :return: mean displacement vector [x, y], mean bubble position vector [x, y] + """ + if not os.path.exists(dir_path): + if warn: + print("Warning: " + dir_path + " does not exist.") + return + + if not short_status: + print("Analysing " + dir_path) + movie = file.get_mraw_from_dir(dir_path) + if movie.image_count % 100 != 0: + if warn: + print("Warning: {0} does not have a multiple of 100 frames. Assuming single collapse.".format(dir_path)) + repeats = 1 + else: + repeats = int(movie.image_count / 100) + + frame_rate = movie.get_fps() + trigger_out_delay = movie.trigger_out_delay + + disps = [] + positions = [] + areas = [] + sec_areas = [] + inter_max_frames = [] + sup_disps = [] + eccs = [] + for i in range(repeats): + frames = list(movie[i * 100: (i + 1) * 100]) + disp_out = calculate_displacement(frames, frame_rate, trigger_out_delay, save_path=dir_path, repeat_num=i, + warn=warn) + + if disp_out is not None: + disp, pos, area, sec_area, imf, sup_disp, ecc_at_max = disp_out + disps.append(disp) + positions.append(pos) + areas.append(area) + sec_areas.append(sec_area) + inter_max_frames.append(imf) + sup_disps.append(sup_disp) + eccs.append(ecc_at_max) + else: + disps.append(None) + positions.append(None) + areas.append(None) + sec_areas.append(None) + inter_max_frames.append(None) + sup_disps.append(None) + eccs.append(None) + + movie.close() + + if short_status: + print("|", end="", flush=True) # TODO: Make this work + + if return_mean: + mean_disp = np.mean([d for d in disps if d is not None], axis=1) + mean_pos = np.mean([p for p in positions if p is not None], axis=1) + return mean_disp, mean_pos + else: + return disps, positions, areas, sec_areas, inter_max_frames, sup_disps, eccs + + +def analyse_series(dir_path, frame_shape=(384, 264), warn=False): + index_file = open(dir_path + "index.csv") + index_lines = index_file.readlines() + index_file.close() + + if os.path.exists(dir_path + "readings_dump.csv"): + bkp_num = 0 + while os.path.exists(dir_path + f"readings_dump.csv.bkp.{bkp_num}"): + bkp_num += 1 + os.rename(dir_path + "readings_dump.csv", dir_path + f"readings_dump.csv.bkp.{bkp_num}") + + for root, _, files in os.walk(dir_path): + for name in files: + if "analysis_plot" in name and ".png" in name: + os.remove(os.path.join(root, name)) + + dump_file = open(dir_path + "readings_dump.csv", "a") + dump_file.write("index:repeat number, measured x (mm), measured y (mm), measured z (mm), " + "peak-to-peak x displacement (px), peak-to-peak y displacement (px), " + "in-frame bubble position x (px), in-frame bubble position y (px), " + "maximum bubble area (px^2), second maximum of bubble area (px^2), frames between maxima, " + "minimum-to-minimum x displacement (px), minimum-to-minimum y displacement (px)," + "eccentricity at maximum size\n") + + sideways = False + # Identify system: + headers = index_lines[0].strip().split(",") + for i, h in enumerate(headers): + headers[i] = h.strip() + if headers[0][0] == "x" and headers[1][0] == "y" and headers[2] == "idx": + sideways = False + frame_height = frame_shape[1] + elif headers[0][0] == "x" and headers[1][0] == "z" and headers[2] == "idx": + sideways = True + frame_height = frame_shape[0] + else: + raise ValueError("Index file format was not recognized.") + + # At code end this is formatted: + # x, y, index, displacement vector, bubble position vector (px), bubble position vector (mm) + # readings = [] # type: List[List[Union[float, float, str, np.ndarray, np.ndarray, np.ndarray]]] + readings = [] # type: List[Reading] + + input_data = [] # x, y, index + + for i in range(1, len(index_lines)): # Start at 1 to skip header. + split = index_lines[i].strip().split(",") + if sideways: + # In sideways configuration the actual x is the measured -z, actual y is measured x. + input_data.append([-float(split[1]), float(split[0]), split[2]]) # x, y, idx converted from x, z, idx + pass + else: + input_data.append([float(split[0]), float(split[1]), split[2]]) # x, y, idx + + reading_prefix = file.get_prefix_from_idxs(dir_path, np.array(input_data)[:, 2]) + for i in range(len(input_data)): + reading_path = dir_path + reading_prefix + str(input_data[i][2]).rjust(4, "0") + "/" + to_write = 0 + + disps, positions, areas, sec_areas, inter_max_frames, sup_disps, eccs = analyse_reading(reading_path, False, + warn=warn) + for d in range(len(disps)): + reading = Reading(input_data[i][2], d, m_x=input_data[i][0], m_y=input_data[i][1]) + # reading = input_data[i].copy() + + if sideways and disps[d] is not None and positions[d] is not None: + # Rotate into correct orientation. + disps[d] = [disps[d][1], -disps[d][0]] + positions[d] = [positions[d][1], frame_height - positions[d][0]] + + reading.disp_vect = disps[d] + reading.bubble_pos = positions[d] + reading.max_bubble_area = areas[d] + reading.sec_max_area = sec_areas[d] + reading.inter_max_frames = inter_max_frames[d] + reading.sup_disp_vect = sup_disps[d] + reading.ecc_at_max = eccs[d] + + readings.append(reading) + to_write += 1 + + for j in range(1, to_write + 1): + reading = readings[-j] + if reading.is_complete(): + dump_file.write(str(reading) + "\n") + + dump_file.close() + + try: + flag_invalid_readings(dir_path) + except ValueError: + if warn: + print(f"Could not flag invalid readings in {dir_path}") + else: + pass + return readings + + +def flag_invalid_readings(dir_path, error_on_not_found=False): + r_path = dir_path + "readings_dump.csv" + i_path = dir_path + "invalid_readings.txt" + if os.path.exists(i_path) and os.path.exists(r_path): + r_file = open(r_path, "r") + r_lines = r_file.readlines() + i_file = open(i_path, "r") + i_lines = i_file.readlines() + new_lines = [] + for r_line in r_lines: + flagged = False + for i_line in i_lines: + if r_line.split(",")[0] == i_line.strip() and r_line[0] != "#": + new_lines.append("#" + r_line) + flagged = True + break + if not flagged: + new_lines.append(r_line) + r_file.close() + i_file.close() + + r_file = open(r_path, "w") + r_file.writelines(new_lines) + r_file.close() + elif error_on_not_found: + raise ValueError("Path does not contain the required files.") + + +def get_collapse_variations(dir_path, idx, repeat, laser_delay=151.0e-6, geometry_type=None): + reading_prefix = file.get_prefix_from_idxs(dir_path, [idx]) + reading_path = dir_path + reading_prefix + str(idx).rjust(4, "0") + "/" + + movie = MP4(reading_path + f"video_{repeat}.mp4") + + frame_rate = movie.get_fps() + trigger_out_delay = movie.trigger_out_delay + + frames = list(movie[:100]) + + xs = [] + ys = [] + areas = [] + eccs = [] + idxs = [] + + bg_frame = np.int32(frames[0]) + + total_laser_delay = laser_delay + trigger_out_delay # determine total delay in firing the laser + laser_frame_idx = int(round(frame_rate * total_laser_delay)) # delay in frames + first_frame_idx = laser_frame_idx + 1 # first frame we will analyse + + for idx in range(first_frame_idx, len(frames)): + x, y, area, ecc, sol, _ = analyse_frame(frames[idx], bg_frame, debug=True) + if area is None: + continue # No bubble found. + xs.append(x) + ys.append(y) + areas.append(area) + idxs.append(idx) + eccs.append(ecc) + + xs = np.array(xs) + ys = np.array(ys) + areas = np.array(areas) + idxs = np.array(idxs) + + sys.path.append(dir_path) + import params + + importlib.reload(params) + sys.path.remove(dir_path) + + if geometry_type == 'slot': + xs = xs - (params.left_slot_wall_x + params.slot_width / 2) + ys = ys - params.upper_surface_y + + xs = xs * params.mm_per_px + ys = ys * params.mm_per_px + radii = np.sqrt(areas / np.pi) * params.mm_per_px + ts = idxs / frame_rate + + return xs, ys, radii, ts + + +if __name__ == "__main__": + flag_invalid_readings(file.select_dir("../../../../../")) diff --git a/paper_code/thesis/chapter 5/util/bem.py b/packaged-code/thesis/chapter 5/util/bem.py similarity index 100% rename from paper_code/thesis/chapter 5/util/bem.py rename to packaged-code/thesis/chapter 5/util/bem.py diff --git a/packaged-code/thesis/chapter 5/util/determineDisplacement.py b/packaged-code/thesis/chapter 5/util/determineDisplacement.py new file mode 100644 index 0000000..0b3a936 --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/determineDisplacement.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +""" +Created on Sat May 6 20:43:51 2017 + +@author: Ivo Peters +ivo.r.peters@gmail.com + +version 1.5 + +Update version 1.2 (2017-12-07): + Added a catch in case only one peak is found for the bubble size. +Update version 1.3 (2017-12-10): + Reduced dpi of output images from 300 to 150. +Update version 1.4 (2018-03-29): + Added a catch in case the peak consists of two points with exactly the same + value. +Update version 1.5 (2018-04-08): + Fixed use of non-integer as index in findPeaks function. +""" + +import numpy as np +from skimage.filters import threshold_otsu +import skimage.morphology as morph +from scipy import ndimage + + +def findPeaks(x, y, n=2, kernel=5): + """ + Standard peak finding algorithm, finds the first n peaks using a kernel + of size kernel. + """ + peakIdx = [] # index of the peak + yPeak = [] # peak value + k = np.int((kernel - 1) / 2) + for i in range(len(x) - (kernel - 1)): + if np.max(y[i:i + kernel]) == y[i + k]: + # If this is the first peak that is found, then the peak is added + if len(peakIdx) < 1: + peakIdx.append(i + k) + yPeak.append(y[i + k]) + # Check if this is not a peak within the same range + elif (i + k - peakIdx[-1]) > k: + peakIdx.append(i + k) + yPeak.append(y[i + k]) + if len(peakIdx) == n: + break + return peakIdx, yPeak + + +def makeBinary(I): + """ + Turn a grayscale image into a binary image, trying to only keep the main + bubble as a uniform white object on a fully black background. + """ + # find a reasonable threshold + thresh = threshold_otsu(I) + # make a binary version of the image + binary = I > thresh + # try to separate small objects that are attached to the main bubble + morph.binary_opening(binary, footprint=None, out=binary) + # fill up holes to make the bright spot in the center of the bubble black + ndimage.binary_fill_holes(binary, output=binary) + # remove small objects (noise and object that we separated a few steps ago) + binary = morph.remove_small_objects(binary, min_size=128) + # return the binary image + return binary + + +laserDelay = 151.0e-6 # delay (s) for Q-switch after lamp was triggered (setting in laser) diff --git a/paper_code/thesis/chapter 5/util/drawing_utils.py b/packaged-code/thesis/chapter 5/util/drawing_utils.py similarity index 100% rename from paper_code/thesis/chapter 5/util/drawing_utils.py rename to packaged-code/thesis/chapter 5/util/drawing_utils.py diff --git a/packaged-code/thesis/chapter 5/util/file_utils.py b/packaged-code/thesis/chapter 5/util/file_utils.py new file mode 100644 index 0000000..1de6b12 --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/file_utils.py @@ -0,0 +1,118 @@ +import os +import re +from PyQt5.QtWidgets import QFileDialog, QApplication +import sys +import importlib +import numpy as np + +from util.mraw import mraw + + +def get_prefix_from_idxs(dir_path, idxs): + """ + Finds the prefix used in a directory for a series of indexes. e.g. movie0001 vs movie_S0001. + :param dir_path: Directory path. + :param idxs: Array of indexes to check. + :return: Prefix. + """ + files = os.listdir(dir_path) + + prefix = None + for idx in idxs: + for file in files: + if os.path.isdir(dir_path + file): + suffix = str(idx).rjust(4, '0') + match = re.match(r'(.*)' + suffix, file) + if match: + file_prefix = match.group(1) + if prefix is None: + prefix = file_prefix + else: + if prefix != file_prefix: + print("Warning: Multiple directory prefixes found. Only using {0}".format(prefix)) + return prefix + + +def get_mraw_from_dir(dir_path): + files = os.listdir(dir_path) + headers = [] + for file in files: + if re.match(r'(.*\.cih)', file): + headers.append(file) + + if len(headers) > 1: + print("Warning: Multiple headers found. Using {0}".format(headers[0])) + if len(headers) == 0: + print("Warning: No headers found in {0}".format(dir_path)) + return None + + return mraw(dir_path + headers[0]) + + +def select_dir(start_path="../../../../../", create_window=True): + if create_window: + window = QApplication([]) + dir_path = str(QFileDialog.getExistingDirectory(None, "Select Directory", start_path)) + "/" + return dir_path + + +def load_params(params_dir): + sys.path.append(params_dir) + import params + + importlib.reload(params) + sys.path.remove(params_dir) + return params + +def lists_to_csv(file_dir, filename, lists, headers=None, overwrite=False): + """ + Writes a list of lists to a CSV file where each list is a column + :param file_dir: The directory in which to save the CSV file. + :param filename: The name of the CSV file (including file extension). + :param lists: The lists to save. + :param headers: A list of header strings, one for each column, defaults to no headers. + :param overwrite: Whether to overwrite an existing file, defaults to false. + :return: Success of file write. + """ + if os.path.exists(file_dir + filename) and not overwrite: + print(f"Warning: file already exists. {file_dir + filename}") + return False + if file_dir != "": + os.makedirs(file_dir, exist_ok=True) + file = open(file_dir + filename, "w") + if headers: + line = "" + for h in headers: + line += h + "," + line = line[:-1] + "\n" + file.write(line) + zipped_lists = np.transpose(lists) + for entry in zipped_lists: + line = "" + for part in entry: + line += str(part) + "," + line = line[:-1] + "\n" + file.write(line) + file.close() + return True + + +def csv_to_lists(file_dir, filename, has_headers=False): + """ + Reads a CSV file to a list of lists where each column becomes a list. + :param file_dir: The directory from which to read the CSV file. + :param filename: The name of the CSV file (including file extension). + :param has_headers: Whether the CSV file has headers, defaults to False. + :return: List of lists. + """ + file = open(file_dir + filename, "r") + lines = file.readlines() + start_idx = 1 if has_headers else 0 + zipped_lists = [] + for line in lines[start_idx:]: + line = line.strip(',\n') + part_arr = [] + for part in line.split(","): + part_arr.append(float(part)) + zipped_lists.append(part_arr) + return np.transpose(zipped_lists) diff --git a/paper_code/thesis/chapter 5/util/gen_utils.py b/packaged-code/thesis/chapter 5/util/gen_utils.py similarity index 100% rename from paper_code/thesis/chapter 5/util/gen_utils.py rename to packaged-code/thesis/chapter 5/util/gen_utils.py diff --git a/packaged-code/thesis/chapter 5/util/mp4.py b/packaged-code/thesis/chapter 5/util/mp4.py new file mode 100644 index 0000000..f6d8419 --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/mp4.py @@ -0,0 +1,45 @@ +import cv2 +import numpy as np + + +class MP4: + # Declared to allow IDE to find these properties automatically. + width, height, image_count = None, None, None + + # Hard code these for compatibility assuming that the movies are from MRAW data using the usual settings. + frame_rate = 100000 + trigger_out_delay = 100 * 100e-9 + + buf = None + + def __init__(self, fn): + cap = cv2.VideoCapture(fn) + self.image_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) + self.width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + self.height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + + self.buf = np.empty((self.image_count, self.height, self.width), np.dtype('uint8')) + + fc = 0 + ret = True + + while fc < self.image_count and ret: + self.buf[fc] = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY) + fc += 1 + + cap.release() + + def __len__(self): + return self.image_count + + def __getitem__(self, key): + if type(key) == slice: + return map(self.get_frame, range(self.image_count)[key]) + + return self.get_frame(key) + + def get_frame(self, idx): + return self.buf[idx] + + def get_fps(self): + return self.frame_rate diff --git a/packaged-code/thesis/chapter 5/util/mraw.py b/packaged-code/thesis/chapter 5/util/mraw.py new file mode 100644 index 0000000..8d79039 --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/mraw.py @@ -0,0 +1,174 @@ +""" +Photron MRAW reader +Author: Ivo Peters (i.r.peters@soton.ac.uk) +Created on: 2016-10-26 +Last revision: 2016-10-27 +Version: 0.2 + +Chunks of code taken from: +CINE library: Dustin Kleckner (dkleckner@uchicago.edu) +pyMRAW.py: Jaka Javh (jaka.javh@fs.uni-lj.si) +""" + +from os import path +import numpy as np +import warnings +import xmltodict + +# Processing the data in chunks keeps it in the L2 catch of the processor, increasing speed for large arrays by ~50% +CHUNK_SIZE = 6 * 10 ** 5 # Should be divisible by 3, 4 and 5! This seems to be near-optimal. + +SUPPORTED_FILE_FORMATS = ['mraw', 'tiff'] +SUPPORTED_EFFECTIVE_BIT_SIDE = ['lower', 'higher'] + + +def read_cih(filename): + name, ext = path.splitext(filename) + if ext == '.cih': + cih = dict() + # read the cif header + with open(filename, 'r') as f: + for line in f: + if line == '\n': # end of cif header + break + line_sp = line.replace('\n', '').split(' : ') + if len(line_sp) == 2: + key, value = line_sp + try: + if '.' in value: + value = float(value) + else: + value = int(value) + cih[key] = value + except: + cih[key] = value + + elif ext == '.cihx': + with open(filename, 'r', encoding='utf-8', errors='ignore') as f: + lines = f.readlines() + first_last_line = [i for i in range(len(lines)) if '<cih>' in lines[i] or '</cih>' in lines[i]] + xml = ''.join(lines[first_last_line[0]:first_last_line[-1] + 1]) + + raw_cih_dict = xmltodict.parse(xml) + cih = { + 'Date': raw_cih_dict['cih']['fileInfo']['date'], + 'Camera Type': raw_cih_dict['cih']['deviceInfo']['deviceName'], + 'Record Rate(fps)': float(raw_cih_dict['cih']['recordInfo']['recordRate']), + 'Shutter Speed(s)': float(raw_cih_dict['cih']['recordInfo']['shutterSpeed']), + 'Total Frame': int(raw_cih_dict['cih']['frameInfo']['totalFrame']), + 'Original Total Frame': int(raw_cih_dict['cih']['frameInfo']['recordedFrame']), + 'Image Width': int(raw_cih_dict['cih']['imageDataInfo']['resolution']['width']), + 'Image Height': int(raw_cih_dict['cih']['imageDataInfo']['resolution']['height']), + 'File Format': raw_cih_dict['cih']['imageFileInfo']['fileFormat'], + 'EffectiveBit Depth': int(raw_cih_dict['cih']['imageDataInfo']['effectiveBit']['depth']), + 'EffectiveBit Side': raw_cih_dict['cih']['imageDataInfo']['effectiveBit']['side'], + 'Color Bit': int(raw_cih_dict['cih']['imageDataInfo']['colorInfo']['bit']), + 'Comment Text': raw_cih_dict['cih']['basicInfo'].get('comment', ''), + 'Signal Delay Trigger Out Width(nsec)': int( + raw_cih_dict['cih']['deviceInfo']['delayInfos']['delayInfo'][3]['value']) * 100 + # 4th signal is Trigger Out Width in 100ns units + } + + else: + raise Exception('Unsupported configuration file ({:s})!'.format(ext)) + + # check exceptions + # ff = cih['File Format'] + # if ff.lower() not in SUPPORTED_FILE_FORMATS: + # raise Exception('Unexpected File Format: {:g}.'.format(ff)) + # bits = cih['Color Bit'] + # if bits < 12: + # warnings.warn('Not 12bit ({:g} bits)! clipped values?'.format(bits)) + # - may cause overflow') + # 12-bit values are spaced over the 16bit resolution - in case of photron filming at 12bit + # this can be meanded by dividing images with //16 + # if cih['EffectiveBit Depth'] != 12: + # warnings.warn('Not 12bit image!') + # ebs = cih['EffectiveBit Side'] + # if ebs.lower() not in SUPPORTED_EFFECTIVE_BIT_SIDE: + # raise Exception('Unexpected EffectiveBit Side: {:g}'.format(ebs)) + # if (cih['File Format'].lower() == 'mraw') & (cih['Color Bit'] not in [8, 16]): + # raise Exception('pyMRAW only works for 8-bit and 16-bit files!') + # if cih['Original Total Frame'] > cih['Total Frame']: + # warnings.warn('Clipped footage! (Total frame: {}, Original total frame: {})'.format(cih['Total Frame'], cih[ + # 'Original Total Frame'])) + + return cih + + +def twelve2sixteen(a): + b = np.zeros(a.size // 3 * 2, dtype='u2') + + for j in range(0, len(a), CHUNK_SIZE): + (a0, a1, a2) = [a[j + i:j + CHUNK_SIZE:3].astype('u2') for i in range(3)] + + k = j // 3 * 2 + k2 = k + CHUNK_SIZE // 3 * 2 + + b[k + 0:k2:2] = ((a0 & 0xFF) << 4) + ((a1 & 0xF0) >> 4) + b[k + 1:k2:2] = ((a1 & 0x0F) << 8) + ((a2 & 0xFF) >> 0) + + return b + + +class mraw(object): + # Declared to allow IDE to find these properties automatically. + width, height, imageSize, image_count = None, None, None, None + + def __init__(self, fn): + cih = read_cih(fn) + self.cih = cih + + self.width = cih['Image Width'] + self.height = cih['Image Height'] + self.image_count = cih['Total Frame'] + self.bit_depth = cih['EffectiveBit Depth'] + self.frame_rate = float(cih[ + 'Record Rate(fps)']) # turn the frame rate into a float to avoid problems with creating unwanted integers by accident when using this property + self.trigger_out_delay = float(cih['Signal Delay Trigger Out Width(nsec)']) * 1e-9 + + # calculate the size of an image in bytes: + self.imageSize = self.width * self.height * self.bit_depth // 8 + + if fn[-4:] == '.cih': + self.fileName = fn[:-4] + '.mraw' + elif fn[-5:] == '.cihx': + self.fileName = fn[:-5] + '.mraw' + else: + raise ValueError("Input file is neither CIH or CIHX.") + self.f = open(self.fileName, 'rb') + + def __len__(self): + return self.image_count + + def __getitem__(self, key): + if type(key) == slice: + return map(self.get_frame, range(self.image_count)[key]) + + return self.get_frame(key) + + def get_fps(self): + return self.frame_rate + + def get_frame(self, number): + # calculate the position in bytes where the image is: + bytePosition = number * self.imageSize + # seek this position in the file: + self.f.seek(bytePosition) + # image = np.memmap(f, dtype=np.uint8, mode='r', shape=(self.width * self.height * 12 / 8)) + image = np.frombuffer(self.f.read(self.imageSize), np.uint8) + image = twelve2sixteen(image) + image = np.reshape(image, (self.height, self.width)) + return image + + def get_pixel_range(self): + """ Gets the pixel brightness range for the movie """ + # go to the start of the file + self.f.seek(0) + # read all the images + all_pixels = np.frombuffer(self.f.read(self.imageSize * self.image_count), np.uint8) + twelve2sixteen(all_pixels) + return np.min(all_pixels), np.max(all_pixels) + + def close(self): + self.f.close() diff --git a/packaged-code/thesis/chapter 5/util/plotting_utils.py b/packaged-code/thesis/chapter 5/util/plotting_utils.py new file mode 100644 index 0000000..08dd8ba --- /dev/null +++ b/packaged-code/thesis/chapter 5/util/plotting_utils.py @@ -0,0 +1,260 @@ +import matplotlib as mpl +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import warnings +from matplotlib.pyplot import Axes +from matplotlib.axis import Axis +from matplotlib.colors import LinearSegmentedColormap +from matplotlib.ticker import StrMethodFormatter, LogLocator, AutoLocator, AutoMinorLocator +from mpl_toolkits.mplot3d import Axes3D +import seaborn as sns +import numpy as np + + +def fig_width(): + return 5.31445 + + +def plot_frame(frame, pos=None, show_immediately=True): + plt.figure() + plt.imshow(frame, cmap=plt.cm.gray) + if pos is not None: + plt.plot(pos[0], pos[1], 'rx') + plt.xticks([]) + plt.yticks([]) + if show_immediately: + plt.show() + + +def initialize_plt(font_size=10, line_scale=1, capsize=3, latex=True, dpi=300, colourblind=True): + warnings.filterwarnings("ignore", "cmr10") # STOP TELLING ME THIS PLEASE I KNOW WHAT FONT I WANT + if colourblind: + sns.set_palette("colorblind") + # plt.style.use('seaborn-colorblind') + if (latex): + plt.rc('text', usetex=True) + plt.rc('text.latex', + preamble=r'\usepackage{amsmath}\usepackage{amsfonts}\usepackage{amssymb}\DeclareMathAlphabet\mathsfbi{OT1}{cmss}{m}{sl}') + font = {'family': 'serif', 'size': font_size, 'serif': ['cmr10']} + plt.rc('font', **font) + plt.rc('lines', linewidth=line_scale, markersize=3 * line_scale) + plt.rc('xtick.major', width=line_scale / 2) + plt.rc('xtick.minor', width=line_scale / 2) + plt.rc('ytick.major', width=line_scale / 2) + plt.rc('ytick.minor', width=line_scale / 2) + plt.rc('axes', linewidth=0.5 * line_scale) + plt.rc('patch', linewidth=0.5 * line_scale) + plt.rc('figure', dpi=dpi) + plt.rc('errorbar', capsize=capsize) + + +def label_subplot(ax, label, color='k', loc='tl'): + xlim = ax.get_xlim() + ylim = ax.get_ylim() + font_size = plt.rcParams['font.size'] + x_off = 0.33 * font_size / 72 # inches + y_off = 0.33 * font_size / 72 + + ax_width = ax.get_window_extent().width / ax.figure.dpi # inches + ax_height = ax.get_window_extent().height / ax.figure.dpi # inches + + if loc == 'out': + height_frac = (ax_height - y_off) / ax_height + width_frac = - x_off / ax_width + valign = 'top' + halign = 'right' + else: + if loc[0] == 't': + height_frac = (ax_height - y_off) / ax_height + valign = 'top' + elif loc[0] == 'b': + height_frac = y_off / ax_height + valign = 'bottom' + else: + raise ValueError("loc must be tl, bl, tr, or br") + + if loc[1] == 'l': + width_frac = x_off / ax_width + halign = 'left' + elif loc[1] == 'r': + width_frac = (ax_width - x_off) / ax_width + halign = 'right' + else: + raise ValueError("loc must be tl, bl, tr, or br") + + ax.annotate(label, + xy=(np.mean(xlim), np.mean(ylim)), # ensure it shows up + xytext=(width_frac, height_frac), # points = inches * 72 + textcoords='axes fraction', color=color, + horizontalalignment=halign, verticalalignment=valign) + + +def format_axis_ticks_decimal(axis: Axis, decimal_places=2): + y_formatter = StrMethodFormatter("{x:.%0df}" % decimal_places) + axis.set_major_formatter(y_formatter) + axis.set_minor_formatter(y_formatter) + + axis.set_major_locator(AutoLocator()) + axis.set_minor_locator(AutoLocator()) + + +color_dict = {'red': ((0.0, 0.0, 0.0), + (0.9, 0.5, 1.0), + (1.0, 1.0, 1.0)), + 'green': ((0.0, 0.0, 0.0), + (0.5, 0.0, 0.0), + (1.0, 0.0, 0.0)), + 'blue': ((0.0, 0.0, 0.0), + (0.5, 0.0, 0.0), + (1.0, 0.0, 0.0))} + +heatmap_cm = LinearSegmentedColormap('heatmap', color_dict) + + +def set_axes_radius(ax, origin, radius): + """ https://stackoverflow.com/a/50664367/5270376 """ + ax.set_xlim3d([origin[0] - radius, origin[0] + radius]) + ax.set_ylim3d([origin[1] - radius, origin[1] + radius]) + ax.set_zlim3d([origin[2] - radius, origin[2] + radius]) + + +def set_axes_equal(ax): + """ + https://stackoverflow.com/a/50664367/5270376 + + Make axes of 3D plot have equal scale so that spheres appear as spheres, + cubes as cubes, etc.. This is one possible solution to Matplotlib's + ax.set_aspect('equal') and ax.axis('equal') not working for 3D. + + Input + ax: a matplotlib axis, e.g., as output from plt.gca(). + """ + + limits = np.array([ + ax.get_xlim3d(), + ax.get_ylim3d(), + ax.get_zlim3d(), + ]) + + origin = np.mean(limits, axis=1) + radius = 0.5 * np.max(np.abs(limits[:, 1] - limits[:, 0])) + set_axes_radius(ax, origin, radius) + + +def plot_3d_points(points, c=None, cmap_name="RdBu", center_cmap=True): + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') # type: Axes3D + points = np.array(points) + if c is not None: + if center_cmap: + scat = ax.scatter3D(points[:, 0], points[:, 2], points[:, 1], c=c, cmap=cm.get_cmap(cmap_name), + vmin=-np.max(np.abs(c)), vmax=np.max(np.abs(c))) + else: + scat = ax.scatter3D(points[:, 0], points[:, 2], points[:, 1], c=c, cmap=cm.get_cmap(cmap_name)) + fig.colorbar(scat) + else: + ax.scatter3D(points[:, 0], points[:, 2], points[:, 1]) + ax.set_xlabel('X') + ax.set_ylabel('Z') + ax.set_zlabel('Y') + + lim = [min([ax.get_xlim()[0], ax.get_ylim()[0], ax.get_zlim()[0]]), + max([ax.get_xlim()[1], ax.get_ylim()[1], ax.get_zlim()[1]])] + ax.set_xlim(lim) + ax.set_ylim(lim) + ax.set_zlim(lim) + plt.show() + + +def plot_2d_point_sets(point_sets): + colors = ["r", "b", "g", "orange", "k", "yellow"] + fig = plt.figure() + ax = fig.add_subplot(111, aspect='equal') + for i in range(len(point_sets)): + points = np.array(point_sets[i]) + ax.scatter(points[:, 0], points[:, 1], c=colors[i]) + ax.set_xlabel('X') + ax.set_ylabel('Y') + + lim = [min([ax.get_xlim()[0], ax.get_ylim()[0]]), + max([ax.get_xlim()[1], ax.get_ylim()[1]])] + ax.set_xlim(lim) + ax.set_ylim(lim) + plt.show() + + +def plot_3d_point_sets(point_sets, colors=("r", "b", "g", "orange", "k", "yellow"), colorbar=False): + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') # type: Axes3D + for i in range(len(point_sets)): + points = np.array(point_sets[i]) + scat = ax.scatter3D(points[:, 0], points[:, 2], points[:, 1], c=colors[i]) + if colorbar: + plt.colorbar(scat) + ax.set_xlabel('X') + ax.set_ylabel('Z') + ax.set_zlabel('Y') + + # lim = [min([ax.get_xlim()[0], ax.get_ylim()[0], ax.get_zlim()[0]]), + # max([ax.get_xlim()[1], ax.get_ylim()[1], ax.get_zlim()[1]])] + # ax.set_xlim(lim) + # ax.set_ylim(lim) + # ax.set_zlim(lim) + set_axes_equal(ax) + plt.show() + + +def plot_heatmap(points, x_bins=100, mode='smooth', filename=None, cmap_name='viridis'): + """ + Generate a heatmap plot of a number of points. + :param points: The points to use in the heatmap. + :param x_bins: The number of bins along the x-axis. + :param mode: 'smooth' for smooth bin edges, 'sharp' for sharp bin edges. + :param filename: The filename (and path) to save the plot, does not save if None. + """ + points = np.array(points) + x = points[:, 0] + y = points[:, 1] + + x_dim = abs(np.ptp(x)) + y_dim = abs(np.ptp(y)) + + # Generate heatmap + y_bins = int(round(x_bins * y_dim / x_dim)) + if y_bins == 0: + y_bins = 1 + heatmap, xedges, yedges = np.histogram2d(x, y, bins=(x_bins, y_bins)) + extent = [xedges[0] - 1, xedges[-1] + 1, yedges[0] - 1, yedges[-1] + 1] + + heatmap = heatmap.T + + fig = plt.figure() + if abs(yedges[-1] - yedges[0]) < 0.025: + yedges[0] = -0.025 # Ensure that the data is actually visible. + + if mode == 'smooth': + ax = fig.add_subplot(111, aspect='equal', xlim=xedges[[0, -1]], ylim=yedges[[0, -1]]) + im = mpl.image.NonUniformImage(ax, interpolation='bilinear') + xcenters = (xedges[:-1] + xedges[1:]) / 2 + ycenters = (yedges[:-1] + yedges[1:]) / 2 + im.set_data(xcenters, ycenters, heatmap) + ax.images.append(im) + elif mode == 'sharp': + ax = fig.add_subplot(111, aspect='equal') + X, Y = np.meshgrid(xedges, yedges) + cmap = None + if cmap_name == "heatmap": + cmap = heatmap_cm + else: + cmap = cm.get_cmap(cmap_name) + ax.pcolormesh(X, Y, heatmap, cmap=cmap) + else: + raise (ValueError("{0} is not a valid mode.".format(mode))) + if filename is not None: + plt.savefig(filename) + plt.show() + + +if __name__ == "__main__": + this_points = [[0, 1], [0, 2], [2, 3], [1, 3.5]] + plot_heatmap(this_points, x_bins=5, mode='sharp') -- GitLab