diff --git a/examples/GEAR/AgoraDisk/README b/examples/GEAR/AgoraDisk/README
new file mode 100644
index 0000000000000000000000000000000000000000..c51d39ac476250eed6d2032053cc037e73eb188e
--- /dev/null
+++ b/examples/GEAR/AgoraDisk/README
@@ -0,0 +1,6 @@
+An analysis script for this test case can be found in the AGORA project repository:
+https://bitbucket.org/mornkr/agora-analysis-script/
+
+A modified version of the script able to read in SWIFT data is available upon request.
+
+(Note to the SWIFT authors: The modified script is stored with the other reference solutions.)
diff --git a/examples/GEAR/AgoraDisk/plotSolution.py b/examples/GEAR/AgoraDisk/plotSolution.py
deleted file mode 100644
index 0e3f4d14f7a7f291e10c3f331816c95f25aeacc5..0000000000000000000000000000000000000000
--- a/examples/GEAR/AgoraDisk/plotSolution.py
+++ /dev/null
@@ -1,6065 +0,0 @@
-#!/usr/bin/env python3
-#######################################################################
-#
-#  UNIFIED ANALYSIS SCRIPT FOR DISK SIMULATION FOR THE AGORA PROJECT
-#
-#  FOR SCRIPT HISTORY SEE VERSION CONTROL CHANGELOG
-#
-#  Note: This script works with yt-3.5.1.
-#
-#######################################################################
-# This script is a copy of the AGORA project (https://bitbucket.org/mornkr/agora-analysis-script/)
-# modified in order to take into account SWIFT
-import matplotlib
-
-matplotlib.use("Agg")
-import sys
-import math
-import copy
-import csv
-import numpy as np
-import matplotlib.colorbar as cb
-import matplotlib.lines as ln
-import yt.utilities.physical_constants as constants
-import matplotlib.pyplot as plt
-import matplotlib.gridspec as gridspec
-from yt.mods import *
-from yt.units.yt_array import YTQuantity
-from mpl_toolkits.axes_grid1 import AxesGrid
-from matplotlib.offsetbox import AnchoredText
-from matplotlib.ticker import MaxNLocator
-from yt.fields.particle_fields import add_volume_weighted_smoothed_field
-from yt.fields.particle_fields import add_nearest_neighbor_field
-from yt.analysis_modules.star_analysis.api import StarFormationRate
-from yt.analysis_modules.halo_analysis.api import *
-from yt.data_objects.particle_filters import add_particle_filter
-from scipy.stats import kde
-from subprocess import call
-
-# mylog.setLevel(1)
-
-from yt.utilities.math_utils import get_cyl_r, get_cyl_theta, get_cyl_z
-
-import sys
-
-draw_density_map = 1  # 1           # 0/1         = OFF/ON
-draw_temperature_map = 1  # 1           # 0/1         = OFF/ON
-draw_cellsize_map = (
-    2
-)  # 2           # 0/1/2/3     = OFF/ON/ON now with resolution map where particle_size is defined as [M/rho]^(1/3) for SPH/ON with both cell_size and resolution maps
-draw_elevation_map = 1  # 1           # 0/1         = OFF/ON
-draw_metal_map = (
-    0
-)  # 0           # 0/1/2       = OFF/ON/ON with total metal mass in the simulation annotated (this will be inaccurate for SPH)
-draw_zvel_map = 0  # 0           # 0/1         = OFF/ON
-draw_star_map = 1  # 1           # 0/1         = OFF/ON
-draw_star_clump_stats = (
-    1
-)  # 1           # 0/1/2/3     = OFF/ON/ON with additional star_map with annotated clumps/ON with addtional star_map + extra clump mass function with GIZMO-ps2
-draw_SFR_map = (
-    2
-)  ###2         # 0/1/2       = OFF/ON/ON with local K-S plot using patches
-draw_PDF = (
-    2
-)  ###2         # 0/1/2/3     = OFF/ON/ON with constant pressure/entropy lines/ON with additional annotations such as 1D profile from a specific code (CHANGA)
-draw_pos_vel_PDF = (
-    4
-)  ##4          # 0/1/2/3/4   = OFF/ON/ON with 1D profile/ON also with 1D dispersion profile/ON also with separate 1D vertical dispersion profiles
-draw_star_pos_vel_PDF = (
-    4
-)  ##4          # 0/1/2/3/4   = OFF/ON/ON with 1D profile/ON also with 1D dispersion profile/ON also with separate 1D vertical dispersion profiles
-draw_rad_height_PDF = (
-    2
-)  ##2          # 0/1/2/3     = OFF/ON/ON with 1D profile/ON with analytic ftn subtracted
-draw_metal_PDF = 1  ##1          # 0/1         = OFF/ON
-draw_density_DF = (
-    2
-)  # 2           # 0/1/2       = OFF/ON/ON with difference plot between 1st and 2nd datasets (when 2, dataset_num should be set to 2)
-draw_radius_DF = 1  # 1           # 0/1         = OFF/ON
-draw_star_radius_DF = (
-    2
-)  # 2           # 0/1/2       = OFF/ON/ON with SFR profile and K-S plot (when 2, this automatically turns on draw_radius_DF)
-draw_height_DF = 1  # 1           # 0/1         = OFF/ON
-draw_SFR = 1  # 1           # 0/1/2       = OFF/ON/ON with extra line with GIZMO-ps2
-draw_cut_through = 0  # 0           # 0/1         = OFF/ON
-add_nametag = 1  # 1           # 0/1         = OFF/ON
-add_mean_fractional_dispersion = 1  # 1           # 0/1         = OFF/ON
-
-dataset_num = (
-    2
-)  # 1/2         = 1st dataset(Grackle+noSF)/2nd dataset(Grackle+SF+ThermalFbck) for AGORA Paper 4
-yt_version_pre_3_2_3 = (
-    0
-)  # 0/1         = NO/YES to "Is the yt version being used pre yt-dev-3.2.3?"
-times = [0, 500]  # in Myr
-figure_width = 30  # in kpc
-n_ref = 64  # 8; for SPH codes
-over_refine_factor = 1  # 2; for SPH codes
-aperture_size_SFR_map = (
-    750
-)  # in pc       = Used if draw_SFR_map = 1, 750 matches Bigiel et al. (2008)
-young_star_cutoff_SFR_map = 20  # in Myr      = Used if draw_SFR_map = 1
-young_star_cutoff_star_radius_DF = 20  # in Myr      = Used if draw_star_radius_DF = 1
-mean_dispersion_radius_range = [
-    2,
-    10,
-]  # in kpc      = Used if add_mean_fractional_dispersion = 1, for draw_pos_vel_PDF, draw_star_pos_vel_PDF, draw_rad_height_PDF, draw_radius_DF, draw_star_radius_DF
-mean_dispersion_height_range = [
-    0,
-    0.6,
-]  # in kpc      = Used if add_mean_fractional_dispersion = 1, for draw_height_DF
-mean_dispersion_time_range = [
-    50,
-    500,
-]  # in Myr      = Used if add_mean_fractional_dispersion = 1, for draw_SFR
-mean_dispersion_density_range = [
-    1e-25,
-    1e-22,
-]  # in g/cm3    = Used if add_mean_fractional_dispersion = 1, for draw_density_DF
-disk_normal_vector = [0.0, 0.0, 1.0]
-
-gadget_default_unit_base = {
-    "UnitLength_in_cm": 3.08567758e21,
-    "UnitMass_in_g": 1.98848e43,
-    "UnitVelocity_in_cm_per_s": 100000,
-}
-color_names = [
-    "red",
-    "magenta",
-    "orange",
-    "gold",
-    "green",
-    "cyan",
-    "blue",
-    "blueviolet",
-    "black",
-]
-linestyle_names = ["-"]
-marker_names = ["s", "o", "p", "v", "^", "<", ">", "h", "*"]
-
-# file_location = ['/lustre/ki/pfs/mornkr/080112_CHaRGe/pfs-hyades/AGORA-DISK-repository-for-use/Grackle+noSF/',
-#                '/lustre/ki/pfs/mornkr/080112_CHaRGe/pfs-hyades/AGORA-DISK-repository-for-use/Grackle+SF+ThermalFbck/']
-# file_location = ['/global/project/projectdirs/agora/AGORA-DISK-repository-for-use/Grackle+noSF/',
-#                '/global/project/projectdirs/agora/AGORA-DISK-repository-for-use/Grackle+SF+ThermalFbck/']
-# codes = ['ART-I', 'ART-II', 'ENZO', 'RAMSES', 'CHANGA', 'GASOLINE', 'GADGET-3', 'GEAR', 'GIZMO']
-# filenames = [[[file_location[0]+'ART-I/IC/AGORA_Galaxy_LOW.d', file_location[0]+'ART-I/t0.5Gyr/10MpcBox_csf512_02350.d'],
-#             [file_location[0]+'ART-II/noSF_def_2p/OUT/AGORA_LOW_000000.art', file_location[0]+'ART-II/noSF_def_2p/OUT/AGORA_LOW_000098.art'],
-#             [file_location[0]+'ENZO/DD0000/DD0000', file_location[0]+'ENZO/DD0100/DD0100'],
-#             [file_location[0]+'RAMSES/output_00001/info_00001.txt', file_location[0]+'RAMSES/output_00068/info_00068.txt'],
-#             [file_location[0]+'CHANGA/disklow/disklow.000000', file_location[0]+'CHANGA/disklow/disklow.000500'],
-#             [file_location[0]+'GASOLINE/LOW_dataset1.00001', file_location[0]+'GASOLINE/LOW_dataset1.00335'],
-#             [file_location[0]+'GADGET-3/AGORA_ISO_LOW_DRY/snap_iso_dry_000.hdf5', file_location[0]+'GADGET-3/AGORA_ISO_LOW_DRY/snap_iso_dry_010.hdf5'],
-#             [file_location[0]+'GEAR/snapshot_0000', file_location[0]+'GEAR/snapshot_0500'],
-#             [file_location[0]+'GIZMO/snapshot_temp_000', file_location[0]+'GIZMO/snapshot_temp_100']],
-#            [[file_location[1]+'ART-I/IC/AGORA_Galaxy_LOW.d', file_location[1]+'ART-I/t0.5Gyr/10MpcBox_csf512_02350.d'],
-#             [file_location[1]+'ART-II/SF_FBth_def_2p/OUT/AGORA_LOW_000000.art', file_location[1]+'ART-II/SF_FBth_def_2p/OUT/AGORA_LOW_000311.art'],
-#             [file_location[1]+'ENZO/DD0000/DD0000', file_location[1]+'ENZO/DD0050/DD0050'],
-#             [file_location[1]+'RAMSES/output_00001/info_00001.txt', file_location[1]+'RAMSES/output_00216/info_00216.txt'],
-#             [file_location[1]+'CHANGA/disklow/disklow.000000', file_location[1]+'CHANGA/disklow/disklow.000500'],
-#             [file_location[1]+'GASOLINE/LOW_dataset1.00001', file_location[1]+'GASOLINE/LOW_dataset2.00335'],
-#             [file_location[1]+'GADGET-3/AGORA_ISO_LOW_SF_SNII_Thermal_Chevalier_SFT10/snap_iso_sf_000.hdf5', file_location[1]+'GADGET-3/AGORA_ISO_LOW_SF_SNII_Thermal_Chevalier_SFT10/snap_iso_sf_010.hdf5'],
-#             [file_location[1]+'GEAR/snapshot_0000', file_location[1]+'GEAR/snapshot_0500'],
-#             [file_location[1]+'GIZMO/snapshot_temp_000', file_location[1]+'GIZMO/snapshot_temp_100']]]
-codes = ["SWIFT", "GEAR"]
-filenames = [
-    [
-        ["./agora_disk_IC.hdf5", "./agora_disk_500Myr.hdf5"],  # Sim-noSFF
-        ["./snapshot_0000.hdf5", "./snapshot_0050.hdf5"],
-    ],
-    [
-        [
-            "./agora_disk_IC.hdf5",
-            "./agora_disk_500Myr.hdf5",
-        ],  # Sim-SFF (with star formation and feedback)
-        ["./snapshot_0000.hdf5", "./snapshot_0050.hdf5"],
-    ],
-]  # I did not check the order, they can be switched
-
-# codes = ["SWIFT"]
-# filenames = [[["./agora_disk_0000.hdf5", "./agora_disk_0050.hdf5"]],
-#             [["./agora_disk_0000.hdf5", "./agora_disk_0050.hdf5"]]]
-# codes = ['ART-I']
-# filenames = [[[file_location[0]+'ART-I/IC/AGORA_Galaxy_LOW.d', file_location[0]+'ART-I/t0.5Gyr/10MpcBox_csf512_02350.d']],
-#            [[file_location[1]+'ART-I/IC/AGORA_Galaxy_LOW.d', file_location[1]+'ART-I/t0.5Gyr/10MpcBox_csf512_02350.d']]]
-# codes = ['ART-II']
-# filenames = [[[file_location[0]+'ART-II/noSF_def_2p/OUT/AGORA_LOW_000000.art', file_location[0]+'ART-II/noSF_def_2p/OUT/AGORA_LOW_000098.art']],
-#            [[file_location[1]+'ART-II/SF_FBth_def_2p/OUT/AGORA_LOW_000000.art', file_location[1]+'ART-II/SF_FBth_def_2p/OUT/AGORA_LOW_000311.art']]]
-# codes = ['ENZO']
-# filenames = [[[file_location[0]+'ENZO/DD0000/DD0000', file_location[0]+'ENZO/DD0100/DD0100']],
-#            [[file_location[1]+'ENZO/DD0000/DD0000', file_location[1]+'ENZO/DD0050/DD0050']]]
-# codes = ['RAMSES']
-# filenames = [[[file_location[0]+'RAMSES/output_00001/info_00001.txt', file_location[0]+'RAMSES/output_00068/info_00068.txt']],
-#            [[file_location[1]+'RAMSES/output_00001/info_00001.txt', file_location[1]+'RAMSES/output_00216/info_00216.txt']]]
-# codes = ['CHANGA']
-# filenames = [[[file_location[0]+'CHANGA/disklow/disklow.000000', file_location[0]+'CHANGA/disklow/disklow.000500']],
-#            [[file_location[1]+'CHANGA/disklow/disklow.000000', file_location[1]+'CHANGA/disklow/disklow.000500']]]
-# codes = ['GASOLINE']
-# filenames = [[[file_location[0]+'GASOLINE/LOW_dataset1.00001', file_location[0]+'GASOLINE/LOW_dataset1.00335']],
-#            [[file_location[1]+'GASOLINE/LOW_dataset1.00001', file_location[1]+'GASOLINE/LOW_dataset2.00335']]]
-# codes = ['GADGET-3']
-# filenames = [[[file_location[0]+'GADGET-3/AGORA_ISO_LOW_DRY/snap_iso_dry_000.hdf5', file_location[0]+'GADGET-3/AGORA_ISO_LOW_DRY/snap_iso_dry_010.hdf5']],
-#            [[file_location[1]+'GADGET-3/AGORA_ISO_LOW_SF_SNII_Thermal_Chevalier_SFT10/snap_iso_sf_000.hdf5', file_location[1]+'GADGET-3/AGORA_ISO_LOW_SF_SNII_Thermal_Chevalier_SFT10/snap_iso_sf_010.hdf5']]]
-# codes = ['GEAR']
-# filenames = [[['snapshot_0000.hdf5', 'snapshot_0500.hdf5']],
-#            [['snapshot_0000.hdf5', 'snapshot_0500']]]
-# codes = ['GIZMO']
-# filenames = [[[file_location[0]+'GIZMO/snapshot_temp_000', file_location[0]+'GIZMO/snapshot_temp_100']],
-#            [[file_location[1]+'GIZMO/snapshot_temp_000', file_location[1]+'GIZMO/snapshot_temp_100']]]
-
-
-def load_dataset(dataset_num, time, code, codes, filenames_entry):
-    if (
-        codes[code] == "ART-I"
-    ):  # ART frontend doesn't find the accompanying files, so we specify them; see http://yt-project.org/docs/dev/examining/loading_data.html#art-data
-        dirnames = filenames_entry[code][time][
-            : filenames_entry[code][time].rfind("/") + 1
-        ]
-        if time == 0:
-            timestamp = ""
-        else:
-            timestamp = filenames_entry[code][time][
-                filenames_entry[code][time]
-                .rfind("_") : filenames_entry[code][time]
-                .rfind(".")
-            ]
-        pf = load(
-            filenames_entry[code][time],
-            file_particle_header=dirnames + "PMcrd" + timestamp + ".DAT",
-            file_particle_data=dirnames + "PMcrs0" + timestamp + ".DAT",
-            file_particle_stars=dirnames + "stars" + timestamp + ".dat",
-        )
-    elif (
-        codes[code] == "CHANGA" or codes[code] == "GASOLINE"
-    ):  # For TIPSY frontend, always make sure to place your parameter file in the same directory as your datasets
-        pf = load(
-            filenames_entry[code][time],
-            n_ref=n_ref,
-            over_refine_factor=over_refine_factor,
-        )
-    elif (
-        codes[code] == "GADGET-3"
-    ):  # For GADGET-3 2nd dataset, there somehow exist particles very far from the center; so we use [-2000, 2000] for a bounding_box
-        pf = load(
-            filenames_entry[code][time],
-            unit_base=gadget_default_unit_base,
-            bounding_box=[[-2000.0, 2000.0], [-2000.0, 2000.0], [-2000.0, 2000.0]],
-            n_ref=n_ref,
-            over_refine_factor=over_refine_factor,
-        )
-    elif codes[code] == "SWIFT":
-        pf = load(
-            filenames_entry[code][time],
-            unit_base=gadget_default_unit_base,
-            bounding_box=[[-2000.0, 2000.0], [-2000.0, 2000.0], [-2000.0, 2000.0]],
-            n_ref=n_ref,
-            over_refine_factor=over_refine_factor,
-        )
-    elif codes[code] == "GEAR":
-        pf = load(
-            filenames_entry[code][time],
-            unit_base=gadget_default_unit_base,
-            bounding_box=[[-2000.0, 2000.0], [-2000.0, 2000.0], [-2000.0, 2000.0]],
-            n_ref=n_ref,
-            over_refine_factor=over_refine_factor,
-        )
-    # from yt.frontends.gadget.definitions import gadget_header_specs
-    #  from yt.frontends.gadget.definitions import gadget_ptype_specs
-    #  from yt.frontends.gadget.definitions import gadget_field_specs
-    #  if with_cooling:
-    #          gadget_header_specs["chemistry"] = (('h1',  4, 'c'),('h2',  4, 'c'),('empty',  256, 'c'),)
-    #          header_spec = "default+chemistry"
-    #  else:
-    #          header_spec = "default"
-    #  gear_ptype_specs = ("Gas", "Stars", "Halo", "Disk", "Bulge", "Bndry")
-    #  if dataset_num == 1:
-    #          pf = GadgetDataset(filenames_entry[code][time], unit_base = gadget_default_unit_base, bounding_box=[[-1000.0, 1000.0], [-1000.0, 1000.0], [-1000.0, 1000.0]], header_spec=header_spec,
-    #                             ptype_spec=gear_ptype_specs, n_ref=n_ref, over_refine_factor=over_refine_factor)
-    #  elif dataset_num == 2:
-    #          # For GEAR 2nd dataset (Grackle+SF+ThermalFbck), "Metals" is acutally 10-species field; check how metallicity field is added below.
-    #          if with_cooling:
-    #                  agora_gear  = ( "Coordinates",
-    #                                  "Velocities",
-    #                                  "ParticleIDs",
-    #                                  "Mass",
-    #                                  ("InternalEnergy", "Gas"),
-    #                                  ("Density", "Gas"),
-    #                                  ("SmoothingLength", "Gas"),
-    #                                  ("Metals", "Gas"),
-    #                                  ("StellarFormationTime", "Stars"),
-    #                                  ("StellarInitMass", "Stars"),
-    #                                  ("StellarIDs", "Stars"),
-    #                                  ("StellarDensity", "Stars"),
-    #                                  ("StellarSmoothingLength", "Stars"),
-    #                                  ("StellarMetals", "Stars"),
-    #                                  ("Opt1", "Stars"),
-    #                                  ("Opt2", "Stars"),
-    #                  )
-    #          else:
-    #                  agora_gear  = ( "Coordinates",
-    #                                  "Velocities",
-    #                                  "ParticleIDs",
-    #                                  "Mass",
-    #                                  ("InternalEnergy", "Gas"),
-    #                                  ("Density", "Gas"),
-    #                                  ("SmoothingLength", "Gas"),
-    #                  )
-    #          gadget_field_specs["agora_gear"] = agora_gear
-    #          pf = GadgetDataset(filenames_entry[code][time], unit_base = gadget_default_unit_base, bounding_box=[[-1000.0, 1000.0], [-1000.0, 1000.0], [-1000.0, 1000.0]], header_spec=header_spec,
-    #                             ptype_spec=gear_ptype_specs, field_spec="agora_gear", n_ref=n_ref, over_refine_factor=over_refine_factor)
-    elif codes[code] == "GIZMO":
-        from yt.frontends.gadget.definitions import gadget_field_specs
-
-        if dataset_num == 1:
-            agora_gizmo = (
-                "Coordinates",
-                "Velocities",
-                "ParticleIDs",
-                "Mass",
-                ("Temperature", "Gas"),
-                ("Density", "Gas"),
-                ("Electron_Number_Density", "Gas"),
-                ("HI_NumberDensity", "Gas"),
-                ("SmoothingLength", "Gas"),
-            )
-        elif dataset_num == 2:
-            agora_gizmo = (
-                "Coordinates",
-                "Velocities",
-                "ParticleIDs",
-                "Mass",
-                ("Temperature", "Gas"),
-                ("Density", "Gas"),
-                ("ElectronAbundance", "Gas"),
-                ("NeutralHydrogenAbundance", "Gas"),
-                ("SmoothingLength", "Gas"),
-                ("StarFormationRate", "Gas"),
-                ("StellarFormationTime", "Stars"),
-                ("Metallicity", ("Gas", "Stars")),
-                ("DelayTime", "Stars"),
-                ("StellarInitMass", "Stars"),
-            )
-        gadget_field_specs["agora_gizmo"] = agora_gizmo
-        pf = load(
-            filenames_entry[code][time],
-            unit_base=gadget_default_unit_base,
-            bounding_box=[[-1000.0, 1000.0], [-1000.0, 1000.0], [-1000.0, 1000.0]],
-            field_spec="agora_gizmo",
-            n_ref=n_ref,
-            over_refine_factor=over_refine_factor,
-        )
-    else:
-        pf = load(filenames_entry[code][time])
-        # Bug with some fields, need to redefine them in order to get correct units
-
-    def _radius(field, data):
-        """The cylindrical radius component of the particle positions
-                            
-            Relative to the coordinate system defined by the *normal* vector
-            and *center* field parameters.
-            """
-        normal = data.get_field_parameter("normal")
-        pos = data["relative_particle_position"].T
-        return data.ds.arr(get_cyl_r(pos, normal), "cm")
-
-    pf.add_field(
-        ("PartType0", "radius"),
-        sampling_type="particle",
-        function=_radius,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("PartType4", "radius"),
-        sampling_type="particle",
-        function=_radius,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("PartType1", "radius"),
-        sampling_type="particle",
-        function=_radius,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("all", "radius"),
-        sampling_type="particle",
-        function=_radius,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-
-    def _height(field, data):
-        """The cylindrical radius component of the particle positions
-            
-            Relative to the coordinate system defined by the *normal* vector
-            and *center* field parameters.
-            """
-        normal = data.get_field_parameter("normal")
-        pos = data["relative_particle_position"].T
-        return data.ds.arr(get_cyl_z(pos, normal), "cm")
-
-    pf.add_field(
-        ("PartType0", "height"),
-        sampling_type="particle",
-        function=_height,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("PartType1", "height"),
-        sampling_type="particle",
-        function=_height,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("PartType4", "height"),
-        sampling_type="particle",
-        function=_height,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-    pf.add_field(
-        ("all", "height"),
-        sampling_type="particle",
-        function=_height,
-        units="cm",
-        validators=[ValidateParameter("normal"), ValidateParameter("center")],
-    )
-
-    return pf
-
-
-fig_density_map = []
-fig_temperature_map = []
-fig_cellsize_map = []
-fig_cellsize_map_2 = []
-fig_elevation_map = []
-fig_metal_map = []
-fig_zvel_map = []
-fig_star_map = []
-fig_star_map_2 = []
-fig_star_map_3 = []
-fig_degr_sfr_map = []
-fig_degr_density_map = []
-fig_PDF = []
-fig_pos_vel_PDF = []
-fig_star_pos_vel_PDF = []
-fig_rad_height_PDF = []
-fig_metal_PDF = []
-grid_density_map = []
-grid_temperature_map = []
-grid_cellsize_map = []
-grid_cellsize_map_2 = []
-grid_elevation_map = []
-grid_metal_map = []
-grid_zvel_map = []
-grid_star_map = []
-grid_star_map_2 = []
-grid_star_map_3 = []
-grid_degr_sfr_map = []
-grid_degr_density_map = []
-grid_PDF = []
-grid_pos_vel_PDF = []
-grid_star_pos_vel_PDF = []
-grid_rad_height_PDF = []
-grid_metal_PDF = []
-star_clump_masses_hop = []
-star_clump_masses_fof = []
-star_clump_masses_hop_ref = []
-star_clump_masses_fof_ref = []
-pos_vel_xs = []
-pos_vel_profiles = []
-pos_disp_xs = []
-pos_disp_profiles = []
-pos_disp_vert_xs = []
-pos_disp_vert_profiles = []
-star_pos_vel_xs = []
-star_pos_vel_profiles = []
-star_pos_disp_xs = []
-star_pos_disp_profiles = []
-star_pos_disp_vert_xs = []
-star_pos_disp_vert_profiles = []
-rad_height_xs = []
-rad_height_profiles = []
-density_DF_xs = []
-density_DF_profiles = []
-density_DF_1st_xs = []
-density_DF_1st_profiles = []
-radius_DF_xs = []
-radius_DF_profiles = []
-surface_density = []
-star_radius_DF_xs = []
-star_radius_DF_profiles = []
-star_surface_density = []
-sfr_radius_DF_xs = []
-sfr_radius_DF_profiles = []
-sfr_surface_density = []
-height_DF_xs = []
-height_DF_profiles = []
-height_surface_density = []
-sfr_ts = []
-sfr_cum_masses = []
-sfr_sfrs = []
-surf_dens_SFR_map = []
-sfr_surf_dens_SFR_map = []
-cut_through_zs = []
-cut_through_zvalues = []
-cut_through_xs = []
-cut_through_xvalues = []
-
-for time in range(len(times)):
-    if draw_density_map == 1:
-        fig_density_map += [plt.figure(figsize=(100, 20))]
-        grid_density_map += [
-            AxesGrid(
-                fig_density_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_temperature_map == 1:
-        fig_temperature_map += [plt.figure(figsize=(100, 20))]
-        grid_temperature_map += [
-            AxesGrid(
-                fig_temperature_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_cellsize_map >= 1:
-        fig_cellsize_map += [plt.figure(figsize=(100, 20))]
-        grid_cellsize_map += [
-            AxesGrid(
-                fig_cellsize_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-        fig_cellsize_map_2 += [plt.figure(figsize=(100, 20))]
-        grid_cellsize_map_2 += [
-            AxesGrid(
-                fig_cellsize_map_2[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_elevation_map == 1:
-        fig_elevation_map += [plt.figure(figsize=(100, 20))]
-        grid_elevation_map += [
-            AxesGrid(
-                fig_elevation_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(1, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="6%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_metal_map >= 1:
-        fig_metal_map += [plt.figure(figsize=(100, 20))]
-        grid_metal_map += [
-            AxesGrid(
-                fig_metal_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_zvel_map == 1:
-        fig_zvel_map += [plt.figure(figsize=(100, 20))]
-        grid_zvel_map += [
-            AxesGrid(
-                fig_zvel_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_star_map == 1:
-        fig_star_map += [plt.figure(figsize=(100, 20))]
-        grid_star_map += [
-            AxesGrid(
-                fig_star_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_star_clump_stats >= 1:
-        star_clump_masses_hop.append([])
-        star_clump_masses_fof.append([])
-        fig_star_map_2 += [plt.figure(figsize=(100, 20))]
-        grid_star_map_2 += [
-            AxesGrid(
-                fig_star_map_2[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-        fig_star_map_3 += [plt.figure(figsize=(100, 20))]
-        grid_star_map_3 += [
-            AxesGrid(
-                fig_star_map_3[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.02,
-            )
-        ]
-    if draw_SFR_map >= 1:
-        fig_degr_density_map += [plt.figure(figsize=(100, 20))]
-        grid_degr_density_map += [
-            AxesGrid(
-                fig_degr_density_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(1, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="6%",
-                cbar_pad=0.02,
-            )
-        ]
-        fig_degr_sfr_map += [plt.figure(figsize=(100, 20))]
-        grid_degr_sfr_map += [
-            AxesGrid(
-                fig_degr_sfr_map[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(1, len(codes)),
-                axes_pad=0.02,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="6%",
-                cbar_pad=0.02,
-            )
-        ]
-        surf_dens_SFR_map.append([])
-        sfr_surf_dens_SFR_map.append([])
-    if draw_SFR_map >= 2 or draw_star_radius_DF >= 2:
-
-        def import_text(filename, separator):
-            for line in csv.reader(
-                open(filename), delimiter=separator, skipinitialspace=True
-            ):
-                if line:
-                    yield line
-
-    if draw_PDF >= 1:
-        fig_PDF += [plt.figure(figsize=(50, 80))]
-        grid_PDF += [
-            AxesGrid(
-                fig_PDF[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, int(math.ceil(len(codes) / 2.0))),
-                axes_pad=0.05,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.05,
-                aspect=False,
-            )
-        ]
-    if draw_pos_vel_PDF >= 1:
-        fig_pos_vel_PDF += [plt.figure(figsize=(50, 80))]
-        grid_pos_vel_PDF += [
-            AxesGrid(
-                fig_pos_vel_PDF[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(3, int(math.ceil(len(codes) / 3.0))),
-                axes_pad=0.05,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.05,
-                aspect=False,
-            )
-        ]
-        pos_vel_xs.append([])
-        pos_vel_profiles.append([])
-        pos_disp_xs.append([])
-        pos_disp_profiles.append([])
-        pos_disp_vert_xs.append([])
-        pos_disp_vert_profiles.append([])
-    if draw_star_pos_vel_PDF >= 1:
-        fig_star_pos_vel_PDF += [plt.figure(figsize=(50, 80))]
-        grid_star_pos_vel_PDF += [
-            AxesGrid(
-                fig_star_pos_vel_PDF[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(3, int(math.ceil(len(codes) / 3.0))),
-                axes_pad=0.05,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.05,
-                aspect=False,
-            )
-        ]
-        star_pos_vel_xs.append([])
-        star_pos_vel_profiles.append([])
-        star_pos_disp_xs.append([])
-        star_pos_disp_profiles.append([])
-        star_pos_disp_vert_xs.append([])
-        star_pos_disp_vert_profiles.append([])
-    if draw_rad_height_PDF >= 1:
-        fig_rad_height_PDF += [plt.figure(figsize=(50, 80))]
-        grid_rad_height_PDF += [
-            AxesGrid(
-                fig_rad_height_PDF[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(3, int(math.ceil(len(codes) / 3.0))),
-                axes_pad=0.05,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.05,
-                aspect=False,
-            )
-        ]
-        rad_height_xs.append([])
-        rad_height_profiles.append([])
-    if draw_metal_PDF == 1:
-        fig_metal_PDF += [plt.figure(figsize=(50, 80))]
-        grid_metal_PDF += [
-            AxesGrid(
-                fig_metal_PDF[time],
-                (0.01, 0.01, 0.99, 0.99),
-                nrows_ncols=(2, int(math.ceil(len(codes) / 2.0))),
-                axes_pad=0.05,
-                add_all=True,
-                share_all=True,
-                label_mode="1",
-                cbar_mode="single",
-                cbar_location="right",
-                cbar_size="2%",
-                cbar_pad=0.05,
-                aspect=False,
-            )
-        ]
-    if draw_density_DF >= 1:
-        density_DF_xs.append([])
-        density_DF_profiles.append([])
-        density_DF_1st_xs.append([])
-        density_DF_1st_profiles.append([])
-        if draw_density_DF == 2 and dataset_num == 1:
-            print("This won't work; resetting draw_density_DF to 1...")
-            draw_density_DF == 1
-    if draw_star_radius_DF >= 1:
-        star_radius_DF_xs.append([])
-        star_radius_DF_profiles.append([])
-        star_surface_density.append([])
-        sfr_radius_DF_xs.append([])
-        sfr_radius_DF_profiles.append([])
-        sfr_surface_density.append([])
-    if draw_star_radius_DF == 2:
-        draw_radius_DF = 1
-    if draw_radius_DF == 1:
-        radius_DF_xs.append([])
-        radius_DF_profiles.append([])
-        surface_density.append([])
-    if draw_height_DF == 1:
-        height_DF_xs.append([])
-        height_DF_profiles.append([])
-        height_surface_density.append([])
-    if draw_SFR >= 1:
-        sfr_ts.append([])
-        sfr_cum_masses.append([])
-        sfr_sfrs.append([])
-    if draw_cut_through == 1:
-        cut_through_zs.append([])
-        cut_through_zvalues.append([])
-        cut_through_xs.append([])
-        cut_through_xvalues.append([])
-
-for time in range(len(times)):
-
-    for code in range(len(codes)):
-
-        if (dataset_num != 1 and dataset_num != 2) or (
-            filenames[dataset_num - 1][code] == []
-        ):
-            continue
-
-        ####################################
-        #        PRE-ANALYSIS STEPS        #
-        ####################################
-
-        # LOAD DATASETS
-        pf = load_dataset(dataset_num, time, code, codes, filenames[dataset_num - 1])
-
-        # PARTICLE FILED NAMES FOR SPH CODES, AND STELLAR PARTICLE FILTERS
-        PartType_Gas_to_use = "Gas"
-        PartType_Star_to_use = "Stars"
-        PartType_StarBeforeFiltered_to_use = "Stars"
-        MassType_to_use = "Mass"
-        MetallicityType_to_use = "Metallicity"
-        FormationTimeType_to_use = (
-            "StellarFormationTime"
-        )  # for GADGET/GEAR/GIZMO, this field has to be added in frontends/sph/fields.py, in which only "FormationTime" can be recognized
-        SmoothingLengthType_to_use = "SmoothingLength"
-
-        if codes[code] == "CHANGA" or codes[code] == "GASOLINE":
-            MetallicityType_to_use = "Metals"
-            PartType_Star_to_use = "NewStars"
-            PartType_StarBeforeFiltered_to_use = "Stars"
-            FormationTimeType_to_use = "FormationTime"
-            SmoothingLengthType_to_use = "smoothing_length"
-
-            def NewStars(
-                pfilter, data
-            ):  # see http://yt-project.org/docs/dev/analyzing/filtering.html#filtering-particle-fields
-                return data[(pfilter.filtered_type, FormationTimeType_to_use)] > 0
-
-            add_particle_filter(
-                PartType_Star_to_use,
-                function=NewStars,
-                filtered_type=PartType_StarBeforeFiltered_to_use,
-                requires=[FormationTimeType_to_use],
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-            pf.periodicity = (
-                True,
-                True,
-                True,
-            )  # this is needed especially when bPeriodic = 0 in GASOLINE, to avoid RuntimeError in geometry/selection_routines.pyx:855
-        elif codes[code] == "ART-I":
-            PartType_StarBeforeFiltered_to_use = "stars"
-            FormationTimeType_to_use = "particle_creation_time"
-
-            def Stars(pfilter, data):
-                return data[(pfilter.filtered_type, FormationTimeType_to_use)] > 0
-
-            #                               return ((data[(pfilter.filtered_type, FormationTimeType_to_use)] > 0) & (data[(pfilter.filtered_type, "particle_index")] >= 212500)) # without the fix metioned above, the above line won't work because all "stars"="specie1" have the same wrong particle_creation_time of 6.851 Gyr; so you will have to use this quick and dirty patch
-            add_particle_filter(
-                PartType_Star_to_use,
-                function=Stars,
-                filtered_type=PartType_StarBeforeFiltered_to_use,
-                requires=[FormationTimeType_to_use, "particle_index"],
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-        elif codes[code] == "ART-II":
-            PartType_StarBeforeFiltered_to_use = "STAR"
-            if (
-                time != 0
-            ):  # BIRTH_TIME field exists in ART-II but as a dimensionless quantity for some reason in frontends/artio/fields.py; so we create StellarFormationTime field
-
-                def _FormationTime(field, data):
-                    return pf.arr(data["STAR", "BIRTH_TIME"].d, "code_time")
-
-                pf.add_field(
-                    ("STAR", FormationTimeType_to_use),
-                    function=_FormationTime,
-                    particle_type=True,
-                    take_log=False,
-                    units="code_time",
-                )
-
-            def Stars(pfilter, data):
-                return data[(pfilter.filtered_type, FormationTimeType_to_use)] > 0
-
-            add_particle_filter(
-                PartType_Star_to_use,
-                function=Stars,
-                filtered_type=PartType_StarBeforeFiltered_to_use,
-                requires=[FormationTimeType_to_use],
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-        elif codes[code] == "ENZO":
-            PartType_StarBeforeFiltered_to_use = "all"
-            FormationTimeType_to_use = "creation_time"
-
-            def Stars(pfilter, data):
-                return (data[(pfilter.filtered_type, "particle_type")] == 2) & (
-                    data[(pfilter.filtered_type, FormationTimeType_to_use)] > 0
-                )
-
-            add_particle_filter(
-                PartType_Star_to_use,
-                function=Stars,
-                filtered_type=PartType_StarBeforeFiltered_to_use,
-                requires=["particle_type", FormationTimeType_to_use],
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-        elif codes[code] == "GADGET-3":
-            PartType_Gas_to_use = "PartType0"
-            PartType_Star_to_use = "PartType4"
-            PartType_StarBeforeFiltered_to_use = "PartType4"
-            MassType_to_use = "Masses"
-        elif codes[code] == "SWIFT":
-            PartType_Gas_to_use = "PartType0"
-            PartType_Star_to_use = "PartType4"
-            PartType_StarBeforeFiltered_to_use = "PartType4"
-            if time != 0:
-
-                def _FormationTime(field, data):
-                    return pf.arr(data["PartType4", "BirthTimes"].d, "code_time")
-
-                pf.add_field(
-                    ("PartType4", FormationTimeType_to_use),
-                    function=_FormationTime,
-                    particle_type=True,
-                    take_log=False,
-                    units="code_time",
-                )
-
-            MassType_to_use = "Masses"
-        elif codes[code] == "GEAR":
-            PartType_Gas_to_use = "PartType0"
-            PartType_Star_to_use = "PartType1"
-            PartType_StarBeforeFiltered_to_use = "PartType1"
-            MassType_to_use = "Masses"
-            if time != 0:
-
-                def _FormationTime(field, data):
-                    return pf.arr(data["PartType1", "StarFormationTime"].d, "code_time")
-
-                pf.add_field(
-                    ("PartType1", FormationTimeType_to_use),
-                    function=_FormationTime,
-                    particle_type=True,
-                    take_log=False,
-                    units="code_time",
-                )
-        elif codes[code] == "RAMSES":
-            PartType_StarBeforeFiltered_to_use = "all"
-            pf.current_time = pf.arr(
-                pf.parameters["time"], "code_time"
-            )  # reset pf.current_time because it is incorrectly set up in frontends/ramses/data_structure.py, and I don't wish to mess with units there
-            FormationTimeType_to_use = (
-                "particle_age"
-            )  # particle_age field actually means particle creation time, at least for this particular dataset, so the new field below is not needed
-            # if time != 0: # Only particle_age field exists in RAMSES (only for new stars + IC stars), so we create StellarFormationTime field
-            #       def _FormationTime(field, data):
-            #               return pf.current_time - data["all", "particle_age"].in_units("s")
-            #       pf.add_field(("all", FormationTimeType_to_use), function=_FormationTime, particle_type=True, take_log=False, units="code_time")
-            def Stars(pfilter, data):
-                return data[(pfilter.filtered_type, "particle_age")] > 0
-
-            add_particle_filter(
-                PartType_Star_to_use,
-                function=Stars,
-                filtered_type=PartType_StarBeforeFiltered_to_use,
-                requires=["particle_age"],
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-
-        # AXIS SWAP FOR PLOT COLLECTION
-        pf.coordinates.x_axis[1] = 0
-        pf.coordinates.y_axis[1] = 2
-        pf.coordinates.x_axis["y"] = 0
-        pf.coordinates.y_axis["y"] = 2
-
-        # ADDITIONAL FIELDS I: GLOBALLY USED FIELDS
-        def _density_squared(field, data):
-            return data[("gas", "density")] ** 2
-
-        pf.add_field(
-            ("gas", "density_squared"), function=_density_squared, units="g**2/cm**6"
-        )
-
-        # ADDITIONAL FIELDS II: FOR CELL SIZE AND RESOLUTION MAPS
-        def _CellSizepc(field, data):
-            return (data[("index", "cell_volume")].in_units("pc**3")) ** (1 / 3.0)
-
-        pf.add_field(
-            ("index", "cell_size"),
-            function=_CellSizepc,
-            units="pc",
-            display_name="Resolution $\Delta$ x",
-            take_log=True,
-        )
-
-        def _Inv2CellVolumeCode(field, data):
-            return data[("index", "cell_volume")] ** -2
-
-        pf.add_field(
-            ("index", "cell_volume_inv2"),
-            function=_Inv2CellVolumeCode,
-            units="code_length**(-6)",
-            display_name="Inv2CellVolumeCode",
-            take_log=True,
-        )
-        if draw_cellsize_map >= 2:
-            if (
-                codes[code] == "CHANGA"
-                or codes[code] == "GEAR"
-                or codes[code] == "GADGET-3"
-                or codes[code] == "GASOLINE"
-                or codes[code] == "GIZMO"
-                or codes[code] == "SWIFT"
-            ):
-
-                def _ParticleSizepc(field, data):
-                    return (
-                        data[(PartType_Gas_to_use, MassType_to_use)]
-                        / data[(PartType_Gas_to_use, "Density")]
-                    ) ** (1.0 / 3.0)
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "particle_size"),
-                    function=_ParticleSizepc,
-                    units="pc",
-                    display_name="Resolution $\Delta$ x",
-                    particle_type=True,
-                    take_log=True,
-                )
-
-                def _Inv2ParticleVolumepc(field, data):
-                    return (
-                        data[(PartType_Gas_to_use, MassType_to_use)]
-                        / data[(PartType_Gas_to_use, "Density")]
-                    ) ** (-2.0)
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "particle_volume_inv2"),
-                    function=_Inv2ParticleVolumepc,
-                    units="pc**(-6)",
-                    display_name="Inv2ParticleVolumepc",
-                    particle_type=True,
-                    take_log=True,
-                )
-                # Also creating smoothed field following an example in yt-project.org/docs/dev/cookbook/calculating_information.html; use hardcoded num_neighbors as in frontends/gadget/fields.py
-                fn = add_volume_weighted_smoothed_field(
-                    PartType_Gas_to_use,
-                    "Coordinates",
-                    MassType_to_use,
-                    SmoothingLengthType_to_use,
-                    "Density",
-                    "particle_size",
-                    pf.field_info,
-                    nneighbors=64,
-                )
-                fn = add_volume_weighted_smoothed_field(
-                    PartType_Gas_to_use,
-                    "Coordinates",
-                    MassType_to_use,
-                    SmoothingLengthType_to_use,
-                    "Density",
-                    "particle_volume_inv2",
-                    pf.field_info,
-                    nneighbors=64,
-                )
-
-                # Alias doesn't work -- e.g. pf.field_info.alias(("gas", "particle_size"), fn[0]) -- check alias below; so I simply add ("gas", "particle_size")
-                def _ParticleSizepc_2(field, data):
-                    return data[
-                        "deposit", PartType_Gas_to_use + "_smoothed_" + "particle_size"
-                    ]
-
-                pf.add_field(
-                    ("gas", "particle_size"),
-                    function=_ParticleSizepc_2,
-                    units="pc",
-                    force_override=True,
-                    display_name="Resolution $\Delta$ x",
-                    particle_type=False,
-                    take_log=True,
-                )
-
-                def _Inv2ParticleVolumepc_2(field, data):
-                    return data[
-                        "deposit",
-                        PartType_Gas_to_use + "_smoothed_" + "particle_volume_inv2",
-                    ]
-
-                pf.add_field(
-                    ("gas", "particle_volume_inv2"),
-                    function=_Inv2ParticleVolumepc_2,
-                    units="pc**(-6)",
-                    force_override=True,
-                    display_name="Inv2ParticleVolumepc",
-                    particle_type=False,
-                    take_log=True,
-                )
-
-        # ADDITIONAL FIELDS III: TEMPERATURE
-        if (
-            codes[code] == "GEAR"
-            or codes[code] == "GADGET-3"
-            or codes[code] == "RAMSES"
-            or codes[code] == "SWIFT"
-        ):
-            # From grackle/src/python/utilities/convenience.py: Calculate a tabulated approximation to mean molecular weight (valid for data that used Grackle 2.0 or below)
-            def calc_mu_table_local(temperature):
-                tt = np.array(
-                    [
-                        1.0e01,
-                        1.0e02,
-                        1.0e03,
-                        1.0e04,
-                        1.3e04,
-                        2.1e04,
-                        3.4e04,
-                        6.3e04,
-                        1.0e05,
-                        1.0e09,
-                    ]
-                )
-                mt = np.array(
-                    [
-                        1.18701555,
-                        1.15484424,
-                        1.09603514,
-                        0.9981496,
-                        0.96346395,
-                        0.65175895,
-                        0.6142901,
-                        0.6056833,
-                        0.5897776,
-                        0.58822635,
-                    ]
-                )
-                logttt = np.log(temperature)
-                logmu = np.interp(
-                    logttt, np.log(tt), np.log(mt)
-                )  # linear interpolation in log-log space
-                return np.exp(logmu)
-
-            temperature_values = []
-            mu_values = []
-            T_over_mu_values = []
-            current_temperature = 1e1
-            final_temperature = 1e7
-            dlogT = 0.1
-            while current_temperature < final_temperature:
-                temperature_values.append(current_temperature)
-                current_mu = calc_mu_table_local(current_temperature)
-                mu_values.append(current_mu)
-                T_over_mu_values.append(current_temperature / current_mu)
-                current_temperature = np.exp(np.log(current_temperature) + dlogT)
-
-            def convert_T_over_mu_to_T(T_over_mu):
-                logT_over_mu = np.log(T_over_mu)
-                logT = np.interp(
-                    logT_over_mu, np.log(T_over_mu_values), np.log(temperature_values)
-                )  # linear interpolation in log-log space
-                return np.exp(logT)
-
-            if (
-                codes[code] == "GEAR"
-                or codes[code] == "GADGET-3"
-                or codes[code] == "SWIFT"
-            ):
-
-                def _Temperature_3(field, data):
-                    gamma = 5.0 / 3.0
-                    T_over_mu = (
-                        (
-                            data[PartType_Gas_to_use, "InternalEnergy"]
-                            * (gamma - 1)
-                            * constants.mass_hydrogen_cgs
-                            / constants.boltzmann_constant_cgs
-                        )
-                        .in_units("K")
-                        .d
-                    )  # T/mu
-                    return YTArray(convert_T_over_mu_to_T(T_over_mu), "K")  # now T
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "Temperature"),
-                    function=_Temperature_3,
-                    particle_type=True,
-                    force_override=True,
-                    units="K",
-                )
-            elif codes[code] == "RAMSES":
-                # The pressure field includes the artificial pressure support term, so one needs to be careful (compare with the exsiting frontends/ramses/fields.py)
-                def _temperature_3(field, data):
-                    T_J = 1800.0  # in K
-                    n_J = 8.0  # in H/cc
-                    gamma_0 = 2.0
-                    x_H = 0.76
-                    mH = (
-                        1.66e-24
-                    )  # from pymses/utils/constants/__init__.py  (vs. in yt, mass_hydrogen_cgs = 1.007947*amu_cgs = 1.007947*1.660538921e-24 = 1.6737352e-24)
-                    kB = (
-                        1.3806504e-16
-                    )  # from pymses/utils/constants/__init__.py  (vs. in yt, boltzmann_constant_cgs = 1.3806488e-16)
-                    if time != 0:
-                        T_over_mu = data["gas", "pressure"].d / data[
-                            "gas", "density"
-                        ].d * mH / kB - T_J * (
-                            data["gas", "density"].d * x_H / mH / n_J
-                        ) ** (
-                            gamma_0 - 1.0
-                        )  # T/mu = T2 in Ramses
-                    else:
-                        T_over_mu = (
-                            data["gas", "pressure"].d
-                            / data["gas", "density"].d
-                            * mH
-                            / kB
-                        )  # IC: no pressure support
-                    return YTArray(convert_T_over_mu_to_T(T_over_mu), "K")  # now T
-
-                pf.add_field(
-                    ("gas", "temperature"),
-                    function=_temperature_3,
-                    force_override=True,
-                    units="K",
-                )
-
-        # ADDITIONAL FIELDS IV: METALLICITY (IN MASS FRACTION, NOT IN ZSUN)
-        if draw_metal_map >= 1 or draw_metal_PDF == 1:
-            if (
-                codes[code] == "ART-I"
-            ):  # metallicity field in ART-I has a different meaning (see frontends/art/fields.py), and metallicity field in ART-II is missing
-
-                def _metallicity_2(field, data):
-                    return (
-                        (
-                            data["gas", "metal_ii_density"]
-                            + data["gas", "metal_ia_density"]
-                        )
-                        / data["gas", "density"]
-                    )  # metal_ia_density needs to be added to account for initial 0.5 Zsun, even though we don't have SNe Ia
-
-                pf.add_field(
-                    ("gas", "metallicity"),
-                    function=_metallicity_2,
-                    force_override=True,
-                    display_name="Metallicity",
-                    take_log=True,
-                    units="",
-                )
-            elif codes[code] == "ART-II":
-
-                def _metallicity_2(field, data):
-                    return data["gas", "metal_ii_density"] / data["gas", "density"]
-
-                pf.add_field(
-                    ("gas", "metallicity"),
-                    function=_metallicity_2,
-                    force_override=True,
-                    display_name="Metallicity",
-                    take_log=True,
-                    units="",
-                )
-            elif (
-                codes[code] == "ENZO"
-            ):  # metallicity field in ENZO is in Zsun, so we create a new field
-
-                def _metallicity_2(field, data):
-                    return data["gas", "metal_density"] / data["gas", "density"]
-
-                pf.add_field(
-                    ("gas", "metallicity"),
-                    function=_metallicity_2,
-                    force_override=True,
-                    display_name="Metallicity",
-                    take_log=True,
-                    units="",
-                )
-            elif (
-                codes[code] == "GEAR"
-            ):  # "Metals" in GEAR is 10-species field ([:,9] is the total metal fraction), so requires a change in _vector_fields in frontends/gadget/io.py: added ("Metals", 10)
-
-                def _metallicity_2(field, data):
-                    if len(data[PartType_Gas_to_use, "Metals"].shape) == 1:
-                        return data[PartType_Gas_to_use, "Metals"]
-                    else:
-                        return data[PartType_Gas_to_use, "Metals"][:, 9].in_units(
-                            ""
-                        )  # in_units("") turned out to be crucial!; otherwise code_metallicity will be used and it will mess things up
-
-                # We are creating ("Gas", "Metallicity") here, different from ("Gas", "metallicity") which is auto-generated by yt but doesn't work properly
-                pf.add_field(
-                    (PartType_Gas_to_use, MetallicityType_to_use),
-                    function=_metallicity_2,
-                    display_name="Metallicity",
-                    particle_type=True,
-                    take_log=True,
-                    units="",
-                )
-                # Also creating smoothed field following an example in yt-project.org/docs/dev/cookbook/calculating_information.html; use hardcoded num_neighbors as in frontends/gadget/fields.py
-                fn = add_volume_weighted_smoothed_field(
-                    PartType_Gas_to_use,
-                    "Coordinates",
-                    MassType_to_use,
-                    "SmoothingLength",
-                    "Density",
-                    MetallicityType_to_use,
-                    pf.field_info,
-                    nneighbors=64,
-                )
-                # Alias doesn't work -- e.g. pf.field_info.alias(("gas", "metallicity"), fn[0]) -- probably because pf=GadgetDataset()?, not load()?; so I add and replace existing ("gas", "metallicity")
-                def _metallicity_3(field, data):
-                    return data[
-                        "deposit",
-                        PartType_Gas_to_use + "_smoothed_" + MetallicityType_to_use,
-                    ]
-
-                pf.add_field(
-                    ("gas", "metallicity"),
-                    function=_metallicity_3,
-                    force_override=True,
-                    display_name="Metallicity",
-                    particle_type=False,
-                    take_log=True,
-                    units="",
-                )
-            elif (
-                codes[code] == "SWIFT"
-            ):  # "Metals" in SWIFT is 10-species field ([:,9] is the total metal fraction), so requires a change in _vector_fields in frontends/gadget/io.py: added ("Metals", 10)
-
-                def _metallicity_2(field, data):
-                    if (
-                        len(
-                            data[
-                                PartType_Gas_to_use, "SmoothedMetalMassFractions"
-                            ].shape
-                        )
-                        == 1
-                    ):
-                        return data[PartType_Gas_to_use, "SmoothedMetalMassFractions"]
-                    else:
-                        return data[PartType_Gas_to_use, "SmoothedMetalMassFractions"][
-                            :, 9
-                        ].in_units(
-                            ""
-                        )  # in_units("") turned out to be crucial!; otherwise code_metallicity will be used and it will mess things up
-
-                # We are creating ("Gas", "Metallicity") here, different from ("Gas", "metallicity") which is auto-generated by yt but doesn't work properly
-                pf.add_field(
-                    (PartType_Gas_to_use, MetallicityType_to_use),
-                    function=_metallicity_2,
-                    display_name="Metallicity",
-                    particle_type=True,
-                    take_log=True,
-                    units="",
-                )
-                # Also creating smoothed field following an example in yt-project.org/docs/dev/cookbook/calculating_information.html; use hardcoded num_neighbors as in frontends/gadget/fields.py
-                fn = add_volume_weighted_smoothed_field(
-                    PartType_Gas_to_use,
-                    "Coordinates",
-                    MassType_to_use,
-                    "SmoothingLength",
-                    "Density",
-                    MetallicityType_to_use,
-                    pf.field_info,
-                    nneighbors=64,
-                )
-                # Alias doesn't work -- e.g. pf.field_info.alias(("gas", "metallicity"), fn[0]) -- probably because pf=GadgetDataset()?, not load()?; so I add and replace existing ("gas", "metallicity")
-                def _metallicity_3(field, data):
-                    return data[
-                        "deposit",
-                        PartType_Gas_to_use + "_smoothed_" + MetallicityType_to_use,
-                    ]
-
-                pf.add_field(
-                    ("gas", "metallicity"),
-                    function=_metallicity_3,
-                    force_override=True,
-                    display_name="Metallicity",
-                    particle_type=False,
-                    take_log=True,
-                    units="",
-                )
-            if draw_metal_map >= 2:
-
-                def _metal_mass(field, data):
-                    return data["gas", "cell_mass"] * data["gas", "metallicity"]
-
-                pf.add_field(
-                    ("gas", "metal_mass"),
-                    function=_metal_mass,
-                    force_override=True,
-                    display_name="Metal Mass",
-                    take_log=True,
-                    units="Msun",
-                )
-
-        # ADDITIONAL FIELDS V: FAKE PARTICLE FIELDS, CYLINDRICAL COORDINATES, etc.
-        def rho_agora_disk(r, z):
-            r_d = YTArray(3.432, "kpc")
-            z_d = 0.1 * r_d
-            M_d = YTArray(4.297e10, "Msun")
-            f_gas = 0.2
-            r_0 = (f_gas * M_d / (4.0 * np.pi * r_d ** 2 * z_d)).in_units("g/cm**3")
-            return r_0 * numpy.exp(-r / r_d) * numpy.exp(-z / z_d)
-
-        if (
-            codes[code] == "ART-I"
-            or codes[code] == "ART-II"
-            or codes[code] == "ENZO"
-            or codes[code] == "RAMSES"
-        ):
-
-            def _cylindrical_z_abs(field, data):
-                return numpy.abs(data[("index", "cylindrical_z")])
-
-            pf.add_field(
-                ("index", "cylindrical_z_abs"),
-                function=_cylindrical_z_abs,
-                take_log=False,
-                particle_type=False,
-                units="cm",
-            )
-
-            def _density_minus_analytic(field, data):
-                return data[("gas", "density")] - rho_agora_disk(
-                    data[("index", "cylindrical_r")],
-                    data[("index", "cylindrical_z_abs")],
-                )
-
-            pf.add_field(
-                ("gas", "density_minus_analytic"),
-                function=_density_minus_analytic,
-                take_log=False,
-                particle_type=False,
-                display_name="density residual abs",
-                units="g/cm**3",
-            )
-        else:
-
-            def _particle_position_cylindrical_z_abs(field, data):
-                return numpy.abs(data[(PartType_Gas_to_use, "height")])
-
-            pf.add_field(
-                (PartType_Gas_to_use, "particle_position_cylindrical_z_abs"),
-                function=_particle_position_cylindrical_z_abs,
-                take_log=False,
-                particle_type=True,
-                units="cm",
-            )
-            # particle_type=False doesn't make sense, but is critical for PhasePlot/ProfilePlot to work for particle fields
-            # requires a change in data_objects/data_container.py: remove raise YTFieldTypeNotFound(ftype)
-            if draw_metal_map >= 1 or draw_metal_PDF == 1:
-
-                def _Metallicity_2(field, data):
-                    return data[(PartType_Gas_to_use, MetallicityType_to_use)]
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "Metallicity_2"),
-                    function=_Metallicity_2,
-                    take_log=True,
-                    particle_type=True,
-                    display_name="Metallicity",
-                    units="",
-                )
-
-            def _Density_2_minus_analytic(field, data):
-                return data[(PartType_Gas_to_use, "density")] - rho_agora_disk(
-                    data[(PartType_Gas_to_use, "radius")],
-                    data[(PartType_Gas_to_use, "particle_position_cylindrical_z_abs")],
-                )
-
-            pf.add_field(
-                (PartType_Gas_to_use, "Density_2_minus_analytic"),
-                function=_Density_2_minus_analytic,
-                take_log=False,
-                particle_type=False,
-                display_name="Density Residual",
-                units="g/cm**3",
-            )
-
-        ####################################
-        #      MAIN ANALYSIS ROUTINES      #
-        ####################################
-
-        # FIND CENTER AND PROJ_REGION
-        v, cen = pf.h.find_max(
-            ("gas", "density")
-        )  # find the center to keep the galaxy at the center of all the images; here we assume that the gas disk is no bigger than 30 kpc in radius
-        sp = pf.sphere(cen, (30.0, "kpc"))
-        cen2 = sp.quantities.center_of_mass(use_gas=True, use_particles=False).in_units(
-            "kpc"
-        )
-        sp2 = pf.sphere(cen2, (1.0, "kpc"))
-        cen3 = sp2.quantities.max_location(("gas", "density"))
-        center = pf.arr(
-            [cen3[1].d, cen3[2].d, cen3[3].d], "cm"
-        )  # naive usage such as YTArray([cen3[1], cen3[2], cen3[3]]) doesn't work somehow for ART-II data
-        if yt_version_pre_3_2_3 == 1:
-            center = pf.arr(
-                [cen3[2].d, cen3[3].d, cen3[4].d], "code_length"
-            )  # for yt-3.2.3 or before
-        if codes[code] == "GASOLINE" and dataset_num == 2 and time == 1:
-            # center = pf.arr([2.7912903206399826e+20, 1.5205303149849894e+21, 1.5398968883245956e+21], 'cm') # a temporary hack for GASOLINE (center of the most massive stellar clump)
-            center = pf.arr([0.09045956, 0.49277032, 0.49904659], "code_length")
-        # if codes[code] == "GADGET-3" and dataset_num == 2 and time == 1:
-        #       #center = pf.arr([6.184520935812296e+21, 4.972678132728082e+21, 6.559067311284074e+21], 'cm') # a temporary hack for GADGET-3 (center of the most massive stellar clump)
-        #       center = pf.arr([ 2.00426673674,  1.61153523084,  2.12564895041], 'code_length')
-        if (
-            codes[code] == "ART-I"
-            or codes[code] == "ART-II"
-            or codes[code] == "ENZO"
-            or codes[code] == "RAMSES"
-        ):
-            proj_region = pf.box(
-                center - YTArray([figure_width, figure_width, figure_width], "kpc"),
-                center + YTArray([figure_width, figure_width, figure_width], "kpc"),
-            )  # projected images made using a (2*figure_width)^3 box for AMR codes
-        else:
-            proj_region = pf.all_data()
-
-        # DENSITY MAPS
-        if draw_density_map == 1:
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0))  # cmap range [0, 1)
-            my_cmap.set_under(my_cmap(0))
-            for ax in range(1, 3):
-                p = ProjectionPlot(
-                    pf,
-                    ax,
-                    ("gas", "density"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=None,
-                    fontsize=9,
-                )
-                p.set_zlim(("gas", "density"), 1e-5, 1e-1)
-                p.set_cmap(("gas", "density"), my_cmap)
-                plot = p.plots[("gas", "density")]
-
-                plot.figure = fig_density_map[time]
-                plot.axes = grid_density_map[time][(ax - 1) * len(codes) + code].axes
-                if code == 0:
-                    plot.cax = grid_density_map[time].cbar_axes[0]
-                p._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_density_map[time][code].axes.add_artist(at)
-
-        # TEMPERATURE MAPS
-        if draw_temperature_map == 1:
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(
-                my_cmap(0.6)
-            )  # (log(1e4) - log(1e1)) / (log(1e6) - log(1e1)) = 0.6
-            my_cmap.set_under(my_cmap(0))
-            for ax in range(1, 3):
-                p2 = ProjectionPlot(
-                    pf,
-                    ax,
-                    ("gas", "temperature"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=("gas", "density_squared"),
-                    fontsize=9,
-                )
-                p2.set_zlim(("gas", "temperature"), 1e1, 1e6)
-                p2.set_cmap(("gas", "temperature"), my_cmap)
-                plot2 = p2.plots[("gas", "temperature")]
-
-                plot2.figure = fig_temperature_map[time]
-                plot2.axes = grid_temperature_map[time][
-                    (ax - 1) * len(codes) + code
-                ].axes
-                if code == 0:
-                    plot2.cax = grid_temperature_map[time].cbar_axes[0]
-                p2._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_temperature_map[time][code].axes.add_artist(at)
-
-        # CELL-SIZE MAPS
-        if draw_cellsize_map >= 1:
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0.99999))  # 1 doesn't work!
-            my_cmap.set_under(my_cmap(0))
-            if draw_cellsize_map == 1 or draw_cellsize_map == 3:
-                for ax in range(1, 3):
-                    p25 = ProjectionPlot(
-                        pf,
-                        ax,
-                        ("index", "cell_size"),
-                        center=center,
-                        data_source=proj_region,
-                        width=(figure_width, "kpc"),
-                        weight_field=("index", "cell_volume_inv2"),
-                        fontsize=9,
-                    )
-                    p25.set_zlim(("index", "cell_size"), 10, 1e3)
-                    p25.set_cmap(("index", "cell_size"), my_cmap)
-                    plot25 = p25.plots[("index", "cell_size")]
-
-                    plot25.figure = fig_cellsize_map[time]
-                    plot25.axes = grid_cellsize_map[time][
-                        (ax - 1) * len(codes) + code
-                    ].axes
-                    if code == 0:
-                        plot25.cax = grid_cellsize_map[time].cbar_axes[0]
-                    p25._setup_plots()
-
-            # Create another map with a different resolution definition if requested
-            if draw_cellsize_map == 2 or draw_cellsize_map == 3:
-                for ax in range(1, 3):
-                    if (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    ):
-                        p251 = ProjectionPlot(
-                            pf,
-                            ax,
-                            ("index", "cell_size"),
-                            center=center,
-                            data_source=proj_region,
-                            width=(figure_width, "kpc"),
-                            weight_field=("index", "cell_volume_inv2"),
-                            fontsize=9,
-                        )
-                        p251.set_zlim(("index", "cell_size"), 10, 1e3)
-                        p251.set_cmap(("index", "cell_size"), my_cmap)
-                        plot251 = p251.plots[("index", "cell_size")]
-                    else:
-                        p251 = ProjectionPlot(
-                            pf,
-                            ax,
-                            ("gas", "particle_size"),
-                            center=center,
-                            data_source=proj_region,
-                            width=(figure_width, "kpc"),
-                            weight_field=("gas", "particle_volume_inv2"),
-                            fontsize=9,
-                        )
-                        p251.set_zlim(("gas", "particle_size"), 10, 1e3)
-                        p251.set_cmap(("gas", "particle_size"), my_cmap)
-                        plot251 = p251.plots[("gas", "particle_size")]
-
-                    plot251.figure = fig_cellsize_map_2[time]
-                    plot251.axes = grid_cellsize_map_2[time][
-                        (ax - 1) * len(codes) + code
-                    ].axes
-                    if code == 0:
-                        plot251.cax = grid_cellsize_map_2[time].cbar_axes[0]
-                    p251._setup_plots()
-
-            if add_nametag == 1:
-                if draw_cellsize_map == 1 or draw_cellsize_map == 3:
-                    at = AnchoredText(
-                        "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                    )
-                    grid_cellsize_map[time][code].axes.add_artist(at)
-                if draw_cellsize_map == 2 or draw_cellsize_map == 3:
-                    at = AnchoredText(
-                        "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                    )
-                    grid_cellsize_map_2[time][code].axes.add_artist(at)
-
-        # ELEVATION MAPS
-        if draw_elevation_map == 1:
-
-            def _CellzElevationpc(field, data):
-                return (data[("index", "z")] - center[2]).in_units("pc")
-
-            pf.add_field(
-                ("index", "z_elevation"),
-                function=_CellzElevationpc,
-                units="kpc",
-                display_name="$z$ Elevation",
-                take_log=False,
-            )
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0.5))
-            my_cmap.set_under(my_cmap(0))
-            for ax in range(2, 3):
-                p255 = ProjectionPlot(
-                    pf,
-                    ax,
-                    ("index", "z_elevation"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=("gas", "density"),
-                    fontsize=9,
-                )
-                p255.set_zlim(("index", "z_elevation"), -1, 1)
-                p255.set_cmap(("index", "z_elevation"), my_cmap)
-                plot255 = p255.plots[("index", "z_elevation")]
-
-                plot255.figure = fig_elevation_map[time]
-                plot255.axes = grid_elevation_map[time][
-                    (ax - 2) * len(codes) + code
-                ].axes
-                if code == 0:
-                    plot255.cax = grid_elevation_map[time].cbar_axes[0]
-                p255._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_elevation_map[time][code].axes.add_artist(at)
-
-        # Z-VELOCITY MAPS
-        if draw_zvel_map == 1:
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0.5))
-            my_cmap.set_under(my_cmap(0))
-            for ax in range(1, 3):
-                p26 = ProjectionPlot(
-                    pf,
-                    ax,
-                    ("gas", "velocity_z"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=("gas", "density_squared"),
-                    fontsize=9,
-                )
-                p26.set_zlim(("gas", "velocity_z"), -1e7, 1e7)
-                p26.set_cmap(("gas", "velocity_z"), my_cmap)
-                plot26 = p26.plots[("gas", "velocity_z")]
-
-                plot26.figure = fig_zvel_map[time]
-                plot26.axes = grid_zvel_map[time][(ax - 1) * len(codes) + code].axes
-                if code == 0:
-                    plot26.cax = grid_zvel_map[time].cbar_axes[0]
-                p26._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_zvel_map[time][code].axes.add_artist(at)
-
-        # METAL MAPS
-        if draw_metal_map >= 1:
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0.347))  # (0.02041 - 0.01) / (0.04 - 0.01) = 0.347
-            my_cmap.set_under(my_cmap(0))
-            for ax in range(1, 3):
-                pf.field_info[("gas", "metallicity")].take_log = False
-                p26 = ProjectionPlot(
-                    pf,
-                    ax,
-                    ("gas", "metallicity"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=("gas", "density_squared"),
-                    fontsize=9,
-                )
-                p26.set_zlim(("gas", "metallicity"), 0.01, 0.04)
-                p26.set_cmap(("gas", "metallicity"), my_cmap)
-                plot26 = p26.plots[("gas", "metallicity")]
-
-                plot26.figure = fig_metal_map[time]
-                plot26.axes = grid_metal_map[time][(ax - 1) * len(codes) + code].axes
-                if code == 0:
-                    plot26.cax = grid_metal_map[time].cbar_axes[0]
-                p26._setup_plots()
-
-            if add_nametag == 1:
-                if draw_metal_map == 2:
-                    sp = pf.sphere(center, (1, "Mpc"))
-                    total_metal_mass = sp.quantities.total_quantity(
-                        [("gas", "metal_mass")]
-                    )
-                    at = AnchoredText(
-                        "%s - %e" % (codes[code], total_metal_mass),
-                        loc=2,
-                        prop=dict(size=6),
-                        frameon=True,
-                    )
-                else:
-                    at = AnchoredText(
-                        "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                    )
-                grid_metal_map[time][code].axes.add_artist(at)
-
-        # STELLAR MAPS
-        if draw_star_map == 1 and time != 0:
-            for ax in range(1, 3):
-                p27 = ParticleProjectionPlot(
-                    pf,
-                    ax,
-                    (PartType_Star_to_use, "particle_mass"),
-                    center=center,
-                    data_source=proj_region,
-                    width=(figure_width, "kpc"),
-                    weight_field=None,
-                    fontsize=9,
-                )
-                p27.set_unit((PartType_Star_to_use, "particle_mass"), "Msun")
-                p27.set_zlim((PartType_Star_to_use, "particle_mass"), 1e4, 1e7)
-                p27.set_cmap((PartType_Star_to_use, "particle_mass"), "algae")
-                p27.set_buff_size(400)  # default is 800
-                p27.set_colorbar_label(
-                    (PartType_Star_to_use, "particle_mass"),
-                    "Stellar Mass Per Pixel ($\mathrm{M}_{\odot}$)",
-                )
-                plot27 = p27.plots[(PartType_Star_to_use, "particle_mass")]
-                # p27 = ParticleProjectionPlot(pf, ax, (PartType_Star_to_use, "particle_velocity_cylindrical_theta"), center = center, data_source=proj_region, width = (figure_width, 'kpc'), weight_field = (PartType_Star_to_use, "particle_mass"), fontsize=9)
-                # p27.set_unit((PartType_Star_to_use, "particle_velocity_cylindrical_theta"), 'km/s')
-                # p27.set_buff_size(400)
-                # p27.set_colorbar_label((PartType_Star_to_use, "particle_velocity_cylindrical_theta"), "Rotational Velocity (km/s)")
-                # plot27 = p27.plots[(PartType_Star_to_use, "particle_velocity_cylindrical_theta")]
-
-                plot27.figure = fig_star_map[time]
-                plot27.axes = grid_star_map[time][(ax - 1) * len(codes) + code].axes
-                if code == 0:
-                    plot27.cax = grid_star_map[time].cbar_axes[0]
-                p27._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_star_map[time][code].axes.add_artist(at)
-
-        # STELLAR CLUMP STATISTICS AND ANNOTATED STELLAR MAPS
-        if draw_star_clump_stats >= 1 and time != 0:
-            # For make yt's HaloCatalog to work with non-cosmological dataset, a fix needed to be applied to analysis_modules/halo_finding/halo_objects.py: self.period = ds.arr([3.254, 3.254, 3.254], 'Mpc')
-            pf.hubble_constant = 0.71
-            pf.omega_lambda = 0.73
-            pf.omega_matter = 0.27
-            pf.omega_curvature = 0.0
-            pf.current_redshift = (
-                0.0
-            )  # another trick to make HaloCatalog work especially for ART-I dataset
-            if (
-                os.path.exists(
-                    "./halo_catalogs/hop_%s_%05d/hop_%s_%05d.0.h5"
-                    % (codes[code], times[time], codes[code], times[time])
-                )
-                == False
-            ):
-                hc = HaloCatalog(
-                    data_ds=pf,
-                    finder_method="hop",
-                    output_dir="./halo_catalogs/hop_%s_%05d"
-                    % (codes[code], times[time]),
-                    finder_kwargs={
-                        "threshold": 2e8,
-                        "dm_only": False,
-                        "ptype": PartType_Star_to_use,
-                    },
-                )
-                #                                                        finder_kwargs={'threshold': 2e5, 'dm_only': False, 'ptype': "all"})
-                hc.add_filter(
-                    "quantity_value", "particle_mass", ">", 2.6e6, "Msun"
-                )  # exclude halos with less than 30 particles
-                hc.add_filter(
-                    "quantity_value", "particle_mass", "<", 2.6e8, "Msun"
-                )  # exclude the most massive halo (threshold 1e8.4 is hand-picked, so one needs to be careful!)
-                hc.create()
-            halo_ds = load(
-                "./halo_catalogs/hop_%s_%05d/hop_%s_%05d.0.h5"
-                % (codes[code], times[time], codes[code], times[time])
-            )
-            hc = HaloCatalog(
-                halos_ds=halo_ds,
-                output_dir="./halo_catalogs/hop_%s_%05d" % (codes[code], times[time]),
-            )
-            hc.load()
-
-            halo_ad = hc.halos_ds.all_data()
-            star_clump_masses_hop[time].append(
-                np.log10(halo_ad["particle_mass"][:].in_units("Msun"))
-            )
-
-            if (
-                os.path.exists(
-                    "./halo_catalogs/fof_%s_%05d/fof_%s_%05d.0.h5"
-                    % (codes[code], times[time], codes[code], times[time])
-                )
-                == False
-            ):
-                hc2 = HaloCatalog(
-                    data_ds=pf,
-                    finder_method="fof",
-                    output_dir="./halo_catalogs/fof_%s_%05d"
-                    % (codes[code], times[time]),
-                    finder_kwargs={
-                        "link": 0.0025,
-                        "dm_only": False,
-                        "ptype": PartType_Star_to_use,
-                    },
-                )
-                #                                                         finder_kwargs={'link': 0.02, 'dm_only': False, 'ptype': "all"})
-                hc2.add_filter(
-                    "quantity_value", "particle_mass", ">", 2.6e6, "Msun"
-                )  # exclude halos with less than 30 particles
-                hc2.add_filter(
-                    "quantity_value", "particle_mass", "<", 2.6e8, "Msun"
-                )  # exclude the most massive halo (threshold 1e8.4 is hand-picked, so one needs to be careful!)
-                hc2.create()
-            halo_ds2 = load(
-                "./halo_catalogs/fof_%s_%05d/fof_%s_%05d.0.h5"
-                % (codes[code], times[time], codes[code], times[time])
-            )
-            hc2 = HaloCatalog(
-                halos_ds=halo_ds2,
-                output_dir="./halo_catalogs/fof_%s_%05d" % (codes[code], times[time]),
-            )
-            hc2.load()
-
-            halo_ad2 = hc2.halos_ds.all_data()
-            star_clump_masses_fof[time].append(
-                np.log10(halo_ad2["particle_mass"][:].in_units("Msun"))
-            )
-            # most_massive = halo_ad['particle_mass'].max().in_units('Msun')
-            # cen4 = [halo_ad['particle_position_x'][halo_ad['particle_mass'] == most_massive][0].in_units('code_length').d,
-            #       halo_ad['particle_position_y'][halo_ad['particle_mass'] == most_massive][0].in_units('code_length').d,
-            #       halo_ad['particle_position_z'][halo_ad['particle_mass'] == most_massive][0].in_units('code_length').d]
-
-            # Add additional star_map with annotated clumps if requested
-            if draw_star_clump_stats >= 2:
-                for ax in range(1, 3):
-                    p271 = ParticleProjectionPlot(
-                        pf,
-                        ax,
-                        (PartType_Star_to_use, "particle_mass"),
-                        center=center,
-                        data_source=proj_region,
-                        width=(figure_width, "kpc"),
-                        weight_field=None,
-                        fontsize=9,
-                    )
-                    p271.set_unit((PartType_Star_to_use, "particle_mass"), "Msun")
-                    p271.set_zlim((PartType_Star_to_use, "particle_mass"), 1e4, 1e7)
-                    p271.set_cmap((PartType_Star_to_use, "particle_mass"), "algae")
-                    p271.set_buff_size(400)  # default is 800
-                    p271.set_colorbar_label(
-                        (PartType_Star_to_use, "particle_mass"),
-                        "Stellar Mass Per Pixel ($\mathrm{M}_{\odot}$)",
-                    )
-                    plot271 = p271.plots[(PartType_Star_to_use, "particle_mass")]
-                    if ax == 2:
-                        p271.annotate_halos(
-                            hc,
-                            factor=1.0,
-                            circle_args={
-                                "linewidth": 0.7,
-                                "alpha": 0.8,
-                                "facecolor": "none",
-                                "edgecolor": "k",
-                            },
-                        )
-
-                    plot271.figure = fig_star_map_2[time]
-                    plot271.axes = grid_star_map_2[time][
-                        (ax - 1) * len(codes) + code
-                    ].axes
-                    if code == 0:
-                        plot271.cax = grid_star_map_2[time].cbar_axes[0]
-                    p271._setup_plots()
-
-                if add_nametag == 1:
-                    at = AnchoredText(
-                        "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                    )
-                    grid_star_map_2[time][code].axes.add_artist(at)
-
-                for ax in range(1, 3):
-                    p272 = ParticleProjectionPlot(
-                        pf,
-                        ax,
-                        (PartType_Star_to_use, "particle_mass"),
-                        center=center,
-                        data_source=proj_region,
-                        width=(figure_width, "kpc"),
-                        weight_field=None,
-                        fontsize=9,
-                    )
-                    p272.set_unit((PartType_Star_to_use, "particle_mass"), "Msun")
-                    p272.set_zlim((PartType_Star_to_use, "particle_mass"), 1e4, 1e7)
-                    p272.set_cmap((PartType_Star_to_use, "particle_mass"), "algae")
-                    p272.set_buff_size(400)  # default is 800
-                    p272.set_colorbar_label(
-                        (PartType_Star_to_use, "particle_mass"),
-                        "Stellar Mass Per Pixel ($\mathrm{M}_{\odot}$)",
-                    )
-                    plot272 = p272.plots[(PartType_Star_to_use, "particle_mass")]
-                    # p272 = ParticleProjectionPlot(pf, ax, ("all", "particle_mass"), center = center, data_source=proj_region, width = (figure_width, 'kpc'), weight_field = None, fontsize=9)
-                    # p272.set_unit(("all", "particle_mass"), 'Msun')
-                    # p272.set_zlim(("all", "particle_mass"), 1e4, 1e9)
-                    # p272.set_cmap(("all", "particle_mass"), 'algae')
-                    # p272.set_buff_size(400) # default is 800
-                    # p272.set_colorbar_label(("all", "particle_mass"), "Mass Per Pixel ($\mathrm{M}_{\odot}$)")
-                    # plot272 = p272.plots[("all", "particle_mass")]
-                    if ax == 2:
-                        p272.annotate_halos(
-                            hc2,
-                            factor=1.0,
-                            circle_args={
-                                "linewidth": 0.7,
-                                "alpha": 0.8,
-                                "facecolor": "none",
-                                "edgecolor": "k",
-                            },
-                        )  # , annotate_field='particle_mass')
-
-                    plot272.figure = fig_star_map_3[time]
-                    plot272.axes = grid_star_map_3[time][
-                        (ax - 1) * len(codes) + code
-                    ].axes
-                    if code == 0:
-                        plot272.cax = grid_star_map_3[time].cbar_axes[0]
-                    p272._setup_plots()
-
-                if add_nametag == 1:
-                    at = AnchoredText(
-                        "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                    )
-                    grid_star_map_3[time][code].axes.add_artist(at)
-
-        # SFR MAPS
-        if draw_SFR_map >= 1 and time != 0:
-            sp = pf.sphere(center, (1.0 * figure_width, "kpc"))
-            xy_bins = int(float(figure_width) / (float(aperture_size_SFR_map / 1000.0)))
-            my_cmap = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap.set_bad(my_cmap(0))
-            my_cmap.set_under(my_cmap(0))
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-
-                def _position_x_from_center(field, data):
-                    return (data[("index", "x")] - center[0]).in_units("kpc")
-
-                pf.add_field(
-                    ("index", "position_x_from_center"),
-                    function=_position_x_from_center,
-                    take_log=False,
-                    particle_type=False,
-                    units="kpc",
-                )
-
-                def _position_y_from_center(field, data):
-                    return (data[("index", "y")] - center[1]).in_units("kpc")
-
-                pf.add_field(
-                    ("index", "position_y_from_center"),
-                    function=_position_y_from_center,
-                    take_log=False,
-                    particle_type=False,
-                    units="kpc",
-                )
-
-                def _cell_mass_surface_density_SFR_map(field, data):
-                    trans = np.zeros(data[("gas", "cell_mass")].shape)
-                    ind = np.where(data[("gas", "cell_mass")] > 0)
-                    trans[ind] = (
-                        data[("gas", "cell_mass")][ind].in_units("Msun").d
-                        / (float(aperture_size_SFR_map)) ** 2
-                    )
-                    return data.ds.arr(trans, "Msun/pc**2").in_base(
-                        data.ds.unit_system.name
-                    )
-
-                pf.add_field(
-                    ("gas", "cell_mass_surface_density_SFR_map"),
-                    function=_cell_mass_surface_density_SFR_map,
-                    display_name="$\mathrm{\Sigma}_\mathrm{gas}$",
-                    units="Msun/pc**2",
-                    particle_type=False,
-                    take_log=True,
-                )
-
-                p28 = PhasePlot(
-                    sp,
-                    ("index", "position_x_from_center"),
-                    ("index", "position_y_from_center"),
-                    ("gas", "cell_mass_surface_density_SFR_map"),
-                    weight_field=None,
-                    fontsize=9,
-                    x_bins=xy_bins,
-                    y_bins=xy_bins,
-                )
-                p28.set_zlim(("gas", "cell_mass_surface_density_SFR_map"), 1e0, 1e3)
-                p28.set_cmap(("gas", "cell_mass_surface_density_SFR_map"), my_cmap)
-                plot28 = p28.plots[("gas", "cell_mass_surface_density_SFR_map")]
-            else:
-
-                def _particle_position_x_from_center(field, data):
-                    return (
-                        data[(PartType_Gas_to_use, "particle_position_x")] - center[0]
-                    ).in_units("kpc")
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "particle_position_x_from_center"),
-                    function=_particle_position_x_from_center,
-                    take_log=False,
-                    particle_type=True,
-                    units="kpc",
-                )
-
-                def _particle_position_y_from_center(field, data):
-                    return (
-                        data[(PartType_Gas_to_use, "particle_position_y")] - center[0]
-                    ).in_units("kpc")
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "particle_position_y_from_center"),
-                    function=_particle_position_y_from_center,
-                    take_log=False,
-                    particle_type=True,
-                    units="kpc",
-                )
-
-                def _particle_mass_surface_density_SFR_map(field, data):
-                    trans = np.zeros(data[(PartType_Gas_to_use, "particle_mass")].shape)
-                    ind = np.where(data[(PartType_Gas_to_use, "particle_mass")] > 0)
-                    trans[ind] = (
-                        data[(PartType_Gas_to_use, "particle_mass")][ind]
-                        .in_units("Msun")
-                        .d
-                        / (float(aperture_size_SFR_map)) ** 2
-                    )
-                    return data.ds.arr(trans, "Msun/pc**2").in_base(
-                        data.ds.unit_system.name
-                    )
-
-                pf.add_field(
-                    (PartType_Gas_to_use, "particle_mass_surface_density_SFR_map"),
-                    function=_particle_mass_surface_density_SFR_map,
-                    display_name="$\mathrm{\Sigma}_\mathrm{gas}$",
-                    units="Msun/pc**2",
-                    particle_type=True,
-                    take_log=True,
-                )
-
-                p28 = ParticlePhasePlot(
-                    sp,
-                    (PartType_Gas_to_use, "particle_position_x_from_center"),
-                    (PartType_Gas_to_use, "particle_position_y_from_center"),
-                    (PartType_Gas_to_use, "particle_mass_surface_density_SFR_map"),
-                    weight_field=None,
-                    deposition="cic",
-                    fontsize=9,
-                    x_bins=xy_bins,
-                    y_bins=xy_bins,
-                )
-                p28.set_zlim(
-                    (PartType_Gas_to_use, "particle_mass_surface_density_SFR_map"),
-                    1e0,
-                    1e3,
-                )
-                p28.set_cmap(
-                    (PartType_Gas_to_use, "particle_mass_surface_density_SFR_map"),
-                    my_cmap,
-                )
-                plot28 = p28.plots[
-                    (PartType_Gas_to_use, "particle_mass_surface_density_SFR_map")
-                ]
-
-            p28.set_xlabel("x (kpc)")
-            p28.set_ylabel("y (kpc)")
-            p28.set_xlim(-15, 15)
-            p28.set_ylim(-15, 15)
-            plot28.figure = fig_degr_density_map[time]
-            plot28.axes = grid_degr_density_map[time][code].axes
-            if code == 0:
-                plot28.cax = grid_degr_density_map[time].cbar_axes[0]
-            p28._setup_plots()
-
-            def _particle_position_x_from_center_2(field, data):
-                return (
-                    data[(PartType_StarBeforeFiltered_to_use, "particle_position_x")]
-                    - center[0]
-                ).in_units("kpc")
-
-            pf.add_field(
-                (PartType_StarBeforeFiltered_to_use, "particle_position_x_from_center"),
-                function=_particle_position_x_from_center_2,
-                take_log=False,
-                particle_type=True,
-                units="kpc",
-            )
-            pf.add_particle_filter(
-                PartType_Star_to_use
-            )  # This is needed for a filtered particle type PartType_Star_to_use to work, because we have just created new particle fields.
-
-            def _particle_position_y_from_center_2(field, data):
-                return (
-                    data[(PartType_StarBeforeFiltered_to_use, "particle_position_y")]
-                    - center[0]
-                ).in_units("kpc")
-
-            pf.add_field(
-                (PartType_StarBeforeFiltered_to_use, "particle_position_y_from_center"),
-                function=_particle_position_y_from_center_2,
-                take_log=False,
-                particle_type=True,
-                units="kpc",
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-
-            def _particle_mass_young_stars_SFR_surface_density_SFR_map(field, data):
-                trans = np.zeros(
-                    data[(PartType_StarBeforeFiltered_to_use, "particle_mass")].shape
-                )
-                ind = np.where(
-                    data[
-                        (PartType_StarBeforeFiltered_to_use, FormationTimeType_to_use)
-                    ].in_units("Myr")
-                    > (pf.current_time.in_units("Myr").d - young_star_cutoff_SFR_map)
-                )  # mass for young stars only
-                trans[ind] = (
-                    data[(PartType_StarBeforeFiltered_to_use, "particle_mass")][ind]
-                    .in_units("Msun")
-                    .d
-                    / (young_star_cutoff_SFR_map * 1e6)
-                    / (float(aperture_size_SFR_map) / 1000.0) ** 2
-                )
-                return data.ds.arr(trans, "Msun/yr/kpc**2").in_base(
-                    data.ds.unit_system.name
-                )
-
-            pf.add_field(
-                (
-                    PartType_StarBeforeFiltered_to_use,
-                    "particle_mass_young_stars_SFR_surface_density_SFR_map",
-                ),
-                function=_particle_mass_young_stars_SFR_surface_density_SFR_map,
-                display_name="$\mathrm{\Sigma}_\mathrm{SFR}$",
-                units="Msun/yr/kpc**2",
-                particle_type=True,
-                take_log=True,
-            )
-            pf.add_particle_filter(PartType_Star_to_use)
-
-            p281 = ParticlePhasePlot(
-                sp,
-                (PartType_Star_to_use, "particle_position_x_from_center"),
-                (PartType_Star_to_use, "particle_position_y_from_center"),
-                (
-                    PartType_Star_to_use,
-                    "particle_mass_young_stars_SFR_surface_density_SFR_map",
-                ),
-                deposition="cic",
-                weight_field=None,
-                fontsize=9,
-                x_bins=xy_bins,
-                y_bins=xy_bins,
-            )
-            p281.set_zlim(
-                (
-                    PartType_Star_to_use,
-                    "particle_mass_young_stars_SFR_surface_density_SFR_map",
-                ),
-                3e-4,
-                3e-1,
-            )
-            p281.set_cmap(
-                (
-                    PartType_Star_to_use,
-                    "particle_mass_young_stars_SFR_surface_density_SFR_map",
-                ),
-                my_cmap,
-            )
-            plot281 = p281.plots[
-                (
-                    PartType_Star_to_use,
-                    "particle_mass_young_stars_SFR_surface_density_SFR_map",
-                )
-            ]
-
-            p281.set_xlabel("x (kpc)")
-            p281.set_ylabel("y (kpc)")
-            p281.set_xlim(-15, 15)
-            p281.set_ylim(-15, 15)
-            plot281.figure = fig_degr_sfr_map[time]
-            plot281.axes = grid_degr_sfr_map[time][code].axes
-            if code == 0:
-                plot281.cax = grid_degr_sfr_map[time].cbar_axes[0]
-            p281._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_degr_density_map[time][code].axes.add_artist(at)
-                at2 = AnchoredText(
-                    "%s" % codes[code], loc=2, prop=dict(size=6), frameon=True
-                )
-                grid_degr_sfr_map[time][code].axes.add_artist(at2)
-
-            # Record degraded maps for the later use in a local K-S plot
-            if draw_SFR_map == 2 and time != 0:
-                fn = (
-                    p28.profile.save_as_dataset()
-                )  # see http://yt-project.org/docs/dev/reference/api/generated/yt.data_objects.profiles.ProfileND.save_as_dataset.html
-                phaseplot_ds = load(fn)
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-                    phaseplot_surf_dens = phaseplot_ds.data[
-                        ("data", "cell_mass_surface_density_SFR_map")
-                    ]
-                else:
-                    phaseplot_surf_dens = phaseplot_ds.data[
-                        ("data", "particle_mass_surface_density_SFR_map")
-                    ]
-                fn_1 = p281.profile.save_as_dataset()
-                phaseplot_ds_1 = load(fn_1)
-                phaseplot_sfr_surf_dens = phaseplot_ds_1.data[
-                    ("data", "particle_mass_young_stars_SFR_surface_density_SFR_map")
-                ]
-                xy_shape = phaseplot_surf_dens.shape[0]
-                surf_dens_SFR_map[time].append(
-                    phaseplot_surf_dens.reshape(1, xy_shape ** 2)[0]
-                )
-                sfr_surf_dens_SFR_map[time].append(
-                    phaseplot_sfr_surf_dens.reshape(1, xy_shape ** 2)[0]
-                )
-                call(
-                    ["rm", "%s_%s.h5" % (str(pf), "ParticleProfile")]
-                )  # Remove unwanted .h5 files saved
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-                    call(["rm", "%s_%s.h5" % (str(pf), "Profile2D")])
-
-        # DENSITY-TEMPERATURE PDF
-        if draw_PDF >= 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            my_cmap2 = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap2.set_under(my_cmap2(0))
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                p3 = PhasePlot(
-                    sp,
-                    ("gas", "density"),
-                    ("gas", "temperature"),
-                    ("gas", "cell_mass"),
-                    weight_field=None,
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p3.set_unit("cell_mass", "Msun")
-                p3.set_zlim(("gas", "cell_mass"), 1e3, 1e8)
-                p3.set_cmap(("gas", "cell_mass"), my_cmap2)
-                p3.set_colorbar_label(
-                    ("gas", "cell_mass"), "Mass ($\mathrm{M}_{\odot}$)"
-                )
-                plot3 = p3.plots[("gas", "cell_mass")]
-            else:
-                # Because ParticlePhasePlot doesn't yet work for a log-log PDF for some reason, I will do the following trick.
-                p3 = PhasePlot(
-                    sp,
-                    (PartType_Gas_to_use, "density"),
-                    (PartType_Gas_to_use, "temperature"),
-                    (PartType_Gas_to_use, MassType_to_use),
-                    weight_field=None,
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p3.set_unit(MassType_to_use, "Msun")
-                p3.set_zlim((PartType_Gas_to_use, MassType_to_use), 1e3, 1e8)
-                p3.set_cmap((PartType_Gas_to_use, MassType_to_use), my_cmap2)
-                plot3 = p3.plots[(PartType_Gas_to_use, MassType_to_use)]
-
-            p3.set_unit("density", "g/cm**3")
-            p3.set_xlim(1e-29, 1e-21)
-            p3.set_unit("temperature", "K")
-            p3.set_ylim(10, 1e7)
-            p3.set_log("density", True)
-            p3.set_log("temperature", True)
-
-            plot3.figure = fig_PDF[time]
-            plot3.axes = grid_PDF[time][code].axes
-            if code == 0:
-                plot3.cax = grid_PDF[time].cbar_axes[0]
-            p3._setup_plots()
-
-            # Add constant pressure and constant entropy lines to guide the eyes
-            if draw_PDF >= 2:
-                dummy_density = np.logspace(-29, -21, num=4)
-                for constant_i in range(1, 100):
-                    constant = 1e-100 * 100 ** constant_i
-                    line = ln.Line2D(
-                        dummy_density,
-                        constant / dummy_density,
-                        linestyle=":",
-                        linewidth=0.6,
-                        color="k",
-                        alpha=0.7,
-                    )  # constant pressure P ~ n*T
-                    grid_PDF[time][code].axes.add_line(line)
-                    line2 = ln.Line2D(
-                        dummy_density,
-                        constant * dummy_density ** (2.0 / 3.0),
-                        linestyle="-.",
-                        linewidth=0.6,
-                        color="k",
-                        alpha=0.7,
-                    )  # constant entropy S ~ n**(-2/3)*T
-                    grid_PDF[time][code].axes.add_line(line2)
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=3, prop=dict(size=10), frameon=True
-                )
-                grid_PDF[time][code].axes.add_artist(at)
-
-        # POSITION-VELOCITY PDF FOR GAS
-        if draw_pos_vel_PDF >= 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            sp.set_field_parameter("normal", disk_normal_vector)
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                sp_dense = sp.cut_region(
-                    ["obj['gas', 'density'].in_units('g/cm**3') > 1.e-25"]
-                )  # For AMR codes, consider only the cells that are dense enough
-                pf.field_info[("index", "cylindrical_r")].take_log = False
-                pf.field_info[
-                    ("gas", "cylindrical_tangential_velocity")
-                ].take_log = False
-                p4 = PhasePlot(
-                    sp_dense,
-                    ("index", "cylindrical_r"),
-                    ("gas", "cylindrical_tangential_velocity"),
-                    ("gas", "cell_mass"),
-                    weight_field=None,
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p4.set_unit("cylindrical_r", "kpc")
-                p4.set_unit("cylindrical_tangential_velocity", "km/s")
-                p4.set_unit("cell_mass", "Msun")
-                p4.set_zlim(("gas", "cell_mass"), 1e3, 1e8)
-                p4.set_cmap(("gas", "cell_mass"), "algae")
-                p4.set_colorbar_label(
-                    ("gas", "cell_mass"), "Mass ($\mathrm{M}_{\odot}$)"
-                )
-                plot4 = p4.plots[("gas", "cell_mass")]
-            else:
-                pf.field_info[(PartType_Gas_to_use, "radius")].take_log = False
-                pf.field_info[
-                    (PartType_Gas_to_use, "particle_velocity_cylindrical_theta")
-                ].take_log = False
-                p4 = ParticlePhasePlot(
-                    sp,
-                    (PartType_Gas_to_use, "radius"),
-                    (PartType_Gas_to_use, "particle_velocity_cylindrical_theta"),
-                    (PartType_Gas_to_use, MassType_to_use),
-                    deposition="ngp",
-                    weight_field=None,
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p4.set_unit("radius", "kpc")
-                p4.set_unit("particle_velocity_cylindrical_theta", "km/s")
-                p4.set_unit(MassType_to_use, "Msun")
-                p4.set_zlim((PartType_Gas_to_use, MassType_to_use), 1e3, 1e8)
-                p4.set_cmap((PartType_Gas_to_use, MassType_to_use), "algae")
-                p4.set_colorbar_label(
-                    (PartType_Gas_to_use, MassType_to_use),
-                    "Mass ($\mathrm{M}_{\odot}$)",
-                )
-                plot4 = p4.plots[(PartType_Gas_to_use, MassType_to_use)]
-
-            p4.set_xlabel("Cylindrical Radius (kpc)")
-            p4.set_ylabel("Rotational Velocity (km/s)")
-            p4.set_xlim(0, 14)
-            p4.set_ylim(-100, 350)
-
-            plot4.figure = fig_pos_vel_PDF[time]
-            plot4.axes = grid_pos_vel_PDF[time][code].axes
-            if code == 0:
-                plot4.cax = grid_pos_vel_PDF[time].cbar_axes[0]
-            p4._setup_plots()
-
-            # Add 1D profile line if requested
-            if draw_pos_vel_PDF >= 2 and time != 0:
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-                    p5 = ProfilePlot(
-                        sp_dense,
-                        ("index", "cylindrical_r"),
-                        ("gas", "cylindrical_tangential_velocity"),
-                        weight_field=("gas", "cell_mass"),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p5.set_log("cylindrical_tangential_velocity", False)
-                    p5.set_log("cylindrical_r", False)
-                    p5.set_unit("cylindrical_r", "kpc")
-                    p5.set_xlim(1e-3, 14)
-                    p5.set_ylim("cylindrical_tangential_velocity", -100, 350)
-                    line = ln.Line2D(
-                        p5.profiles[0].x.in_units("kpc"),
-                        p5.profiles[0]["cylindrical_tangential_velocity"].in_units(
-                            "km/s"
-                        ),
-                        linestyle="-",
-                        linewidth=2,
-                        color="k",
-                        alpha=0.7,
-                    )
-                    pos_vel_xs[time].append(p5.profiles[0].x.in_units("kpc").d)
-                    pos_vel_profiles[time].append(
-                        p5.profiles[0]["cylindrical_tangential_velocity"]
-                        .in_units("km/s")
-                        .d
-                    )
-                else:
-                    p5 = ProfilePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (PartType_Gas_to_use, "particle_velocity_cylindrical_theta"),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p5.set_log("particle_velocity_cylindrical_theta", False)
-                    p5.set_log("radius", False)
-                    p5.set_unit("radius", "kpc")
-                    p5.set_xlim(1e-3, 14)
-                    p5.set_ylim("particle_velocity_cylindrical_theta", -100, 350)
-                    line = ln.Line2D(
-                        p5.profiles[0].x.in_units("kpc"),
-                        p5.profiles[0]["particle_velocity_cylindrical_theta"].in_units(
-                            "km/s"
-                        ),
-                        linestyle="-",
-                        linewidth=2,
-                        color="k",
-                        alpha=0.7,
-                    )
-                    pos_vel_xs[time].append(p5.profiles[0].x.in_units("kpc").d)
-                    pos_vel_profiles[time].append(
-                        p5.profiles[0]["particle_velocity_cylindrical_theta"]
-                        .in_units("km/s")
-                        .d
-                    )
-                grid_pos_vel_PDF[time][code].axes.add_line(line)
-
-            # Add velocity dispersion profile if requested
-            if draw_pos_vel_PDF >= 3 and time != 0:
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-                    # To calculate velocity dispersion -- residual velocity components other than the rotational velocity found above -- we will need a mass-weighted average of [v_i - v_rot_local]**2
-                    # Here we assumed that the disk is on x-y plane; i.e. the variable disk_normal_vector above needs to be [0.0, 0.0, 1.0]
-                    def _local_rotational_velocity_x(field, data):
-                        trans = np.zeros(data[("gas", "velocity_x")].shape)
-                        dr = 0.5 * (
-                            pos_vel_xs[time][code][1] - pos_vel_xs[time][code][0]
-                        )
-                        for radius, v_rot_local in zip(
-                            pos_vel_xs[time][code], pos_vel_profiles[time][code]
-                        ):
-                            ind = np.where(
-                                (
-                                    data[("index", "cylindrical_r")].in_units("kpc")
-                                    >= (radius - dr)
-                                )
-                                & (
-                                    data[("index", "cylindrical_r")].in_units("kpc")
-                                    < (radius + dr)
-                                )
-                            )
-                            trans[ind] = (
-                                -np.sin(data["index", "cylindrical_theta"][ind])
-                                * v_rot_local
-                                * 1e5
-                            )  # in cm/s
-                        return data.ds.arr(trans, "cm/s").in_base(
-                            data.ds.unit_system.name
-                        )
-
-                    pf.add_field(
-                        ("gas", "local_rotational_velocity_x"),
-                        function=_local_rotational_velocity_x,
-                        take_log=False,
-                        particle_type=False,
-                        units="cm/s",
-                    )
-
-                    def _local_rotational_velocity_y(field, data):
-                        trans = np.zeros(data[("gas", "velocity_y")].shape)
-                        dr = 0.5 * (
-                            pos_vel_xs[time][code][1] - pos_vel_xs[time][code][0]
-                        )
-                        for radius, v_rot_local in zip(
-                            pos_vel_xs[time][code], pos_vel_profiles[time][code]
-                        ):
-                            ind = np.where(
-                                (
-                                    data[("index", "cylindrical_r")].in_units("kpc")
-                                    >= (radius - dr)
-                                )
-                                & (
-                                    data[("index", "cylindrical_r")].in_units("kpc")
-                                    < (radius + dr)
-                                )
-                            )
-                            trans[ind] = (
-                                np.cos(data["index", "cylindrical_theta"][ind])
-                                * v_rot_local
-                                * 1e5
-                            )
-                        return data.ds.arr(trans, "cm/s").in_base(
-                            data.ds.unit_system.name
-                        )
-
-                    pf.add_field(
-                        ("gas", "local_rotational_velocity_y"),
-                        function=_local_rotational_velocity_y,
-                        take_log=False,
-                        particle_type=False,
-                        units="cm/s",
-                    )
-
-                    def _velocity_minus_local_rotational_velocity_squared(field, data):
-                        return (
-                            (
-                                data[("gas", "velocity_x")]
-                                - data[("gas", "local_rotational_velocity_x")]
-                            )
-                            ** 2
-                            + (
-                                data[("gas", "velocity_y")]
-                                - data[("gas", "local_rotational_velocity_y")]
-                            )
-                            ** 2
-                            + (data[("gas", "velocity_z")]) ** 2
-                        )
-
-                    pf.add_field(
-                        ("gas", "velocity_minus_local_rotational_velocity_squared"),
-                        function=_velocity_minus_local_rotational_velocity_squared,
-                        take_log=False,
-                        particle_type=False,
-                        units="cm**2/s**2",
-                    )
-                    # 					slc = SlicePlot(pf, 'z', ("gas", "local_rotational_velocity_y"), center = center, width = (figure_width, 'kpc'))
-                    # 					slc = SlicePlot(pf, 'z', ("gas", "velocity_minus_local_rotational_velocity_squared"), center = center, width = (figure_width, 'kpc')) # this should give zeros everywhere for IC at t=0
-                    # 					slc.save()
-
-                    p55 = ProfilePlot(
-                        sp_dense,
-                        ("index", "cylindrical_r"),
-                        ("gas", "velocity_minus_local_rotational_velocity_squared"),
-                        weight_field=("gas", "cell_mass"),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p55.set_log("cylindrical_r", False)
-                    p55.set_unit("cylindrical_r", "kpc")
-                    p55.set_xlim(1e-3, 14)
-                    pos_disp_xs[time].append(p55.profiles[0].x.in_units("kpc").d)
-                    pos_disp_profiles[time].append(
-                        np.sqrt(
-                            p55.profiles[0][
-                                "velocity_minus_local_rotational_velocity_squared"
-                            ]
-                        )
-                        .in_units("km/s")
-                        .d
-                    )
-                else:
-
-                    def _particle_local_rotational_velocity_x(field, data):
-                        trans = np.zeros(
-                            data[(PartType_Gas_to_use, "particle_velocity_x")].shape
-                        )
-                        dr = 0.5 * (
-                            pos_vel_xs[time][code][1] - pos_vel_xs[time][code][0]
-                        )
-                        for radius, v_rot_local in zip(
-                            pos_vel_xs[time][code], pos_vel_profiles[time][code]
-                        ):
-                            ind = np.where(
-                                (
-                                    data[(PartType_Gas_to_use, "radius")].in_units(
-                                        "kpc"
-                                    )
-                                    >= (radius - dr)
-                                )
-                                & (
-                                    data[(PartType_Gas_to_use, "radius")].in_units(
-                                        "kpc"
-                                    )
-                                    < (radius + dr)
-                                )
-                            )
-                            trans[ind] = (
-                                -np.sin(
-                                    data[
-                                        (
-                                            PartType_Gas_to_use,
-                                            "particle_position_cylindrical_theta",
-                                        )
-                                    ][ind]
-                                )
-                                * v_rot_local
-                                * 1e5
-                            )
-                        return data.ds.arr(trans, "cm/s").in_base(
-                            data.ds.unit_system.name
-                        )
-
-                    pf.add_field(
-                        (PartType_Gas_to_use, "particle_local_rotational_velocity_x"),
-                        function=_particle_local_rotational_velocity_x,
-                        take_log=False,
-                        particle_type=True,
-                        units="cm/s",
-                    )
-
-                    def _particle_local_rotational_velocity_y(field, data):
-                        trans = np.zeros(
-                            data[(PartType_Gas_to_use, "particle_velocity_y")].shape
-                        )
-                        dr = 0.5 * (
-                            pos_vel_xs[time][code][1] - pos_vel_xs[time][code][0]
-                        )
-                        for radius, v_rot_local in zip(
-                            pos_vel_xs[time][code], pos_vel_profiles[time][code]
-                        ):
-                            ind = np.where(
-                                (
-                                    data[(PartType_Gas_to_use, "radius")].in_units(
-                                        "kpc"
-                                    )
-                                    >= (radius - dr)
-                                )
-                                & (
-                                    data[(PartType_Gas_to_use, "radius")].in_units(
-                                        "kpc"
-                                    )
-                                    < (radius + dr)
-                                )
-                            )
-                            trans[ind] = (
-                                np.cos(
-                                    data[
-                                        (
-                                            PartType_Gas_to_use,
-                                            "particle_position_cylindrical_theta",
-                                        )
-                                    ][ind]
-                                )
-                                * v_rot_local
-                                * 1e5
-                            )
-                        return data.ds.arr(trans, "cm/s").in_base(
-                            data.ds.unit_system.name
-                        )
-
-                    pf.add_field(
-                        (PartType_Gas_to_use, "particle_local_rotational_velocity_y"),
-                        function=_particle_local_rotational_velocity_y,
-                        take_log=False,
-                        particle_type=True,
-                        units="cm/s",
-                    )
-
-                    def _particle_velocity_minus_local_rotational_velocity_squared(
-                        field, data
-                    ):
-                        return (
-                            (
-                                data[(PartType_Gas_to_use, "particle_velocity_x")]
-                                - data[
-                                    (
-                                        PartType_Gas_to_use,
-                                        "particle_local_rotational_velocity_x",
-                                    )
-                                ]
-                            )
-                            ** 2
-                            + (
-                                data[(PartType_Gas_to_use, "particle_velocity_y")]
-                                - data[
-                                    (
-                                        PartType_Gas_to_use,
-                                        "particle_local_rotational_velocity_y",
-                                    )
-                                ]
-                            )
-                            ** 2
-                            + (data[(PartType_Gas_to_use, "particle_velocity_z")]) ** 2
-                        )
-
-                    pf.add_field(
-                        (
-                            PartType_Gas_to_use,
-                            "particle_velocity_minus_local_rotational_velocity_squared",
-                        ),
-                        function=_particle_velocity_minus_local_rotational_velocity_squared,
-                        take_log=False,
-                        particle_type=True,
-                        units="cm**2/s**2",
-                    )
-
-                    p55 = ProfilePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (
-                            PartType_Gas_to_use,
-                            "particle_velocity_minus_local_rotational_velocity_squared",
-                        ),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p55.set_log("radius", False)
-                    p55.set_unit("radius", "kpc")
-                    p55.set_xlim(1e-3, 14)
-                    pos_disp_xs[time].append(p55.profiles[0].x.in_units("kpc").d)
-                    pos_disp_profiles[time].append(
-                        np.sqrt(
-                            p55.profiles[0][
-                                "particle_velocity_minus_local_rotational_velocity_squared"
-                            ]
-                        )
-                        .in_units("km/s")
-                        .d
-                    )
-
-                # Add vertical velocity dispersion profile if requested
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-
-                    def _velocity_z_squared(field, data):
-                        return (data[("gas", "velocity_z")]) ** 2
-
-                    pf.add_field(
-                        ("gas", "velocity_z_squared"),
-                        function=_velocity_z_squared,
-                        take_log=False,
-                        particle_type=False,
-                        units="cm**2/s**2",
-                    )
-
-                    p551 = ProfilePlot(
-                        sp_dense,
-                        ("index", "cylindrical_r"),
-                        ("gas", "velocity_z_squared"),
-                        weight_field=("gas", "cell_mass"),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p551.set_log("cylindrical_r", False)
-                    p551.set_unit("cylindrical_r", "kpc")
-                    p551.set_xlim(1e-3, 14)
-                    pos_disp_vert_xs[time].append(p551.profiles[0].x.in_units("kpc").d)
-                    pos_disp_vert_profiles[time].append(
-                        np.sqrt(p551.profiles[0]["velocity_z_squared"])
-                        .in_units("km/s")
-                        .d
-                    )
-                else:
-
-                    def _particle_velocity_z_squared(field, data):
-                        return (data[(PartType_Gas_to_use, "particle_velocity_z")]) ** 2
-
-                    pf.add_field(
-                        (PartType_Gas_to_use, "particle_velocity_z_squared"),
-                        function=_particle_velocity_z_squared,
-                        take_log=False,
-                        particle_type=True,
-                        units="cm**2/s**2",
-                    )
-
-                    p551 = ProfilePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (PartType_Gas_to_use, "particle_velocity_z_squared"),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p551.set_log("radius", False)
-                    p551.set_unit("radius", "kpc")
-                    p551.set_xlim(1e-3, 14)
-                    pos_disp_vert_xs[time].append(p551.profiles[0].x.in_units("kpc").d)
-                    pos_disp_vert_profiles[time].append(
-                        np.sqrt(p551.profiles[0]["particle_velocity_z_squared"])
-                        .in_units("km/s")
-                        .d
-                    )
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=4, prop=dict(size=10), frameon=True
-                )
-                grid_pos_vel_PDF[time][code].axes.add_artist(at)
-
-        # POSITION-VELOCITY PDF FOR NEW STARS
-        if draw_star_pos_vel_PDF >= 1 and time != 0:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            sp.set_field_parameter("normal", disk_normal_vector)
-            pf.field_info[(PartType_Star_to_use, "radius")].take_log = False
-            pf.field_info[
-                (PartType_Star_to_use, "particle_velocity_cylindrical_theta")
-            ].take_log = False
-            pf.field_info[
-                (PartType_Star_to_use, "particle_mass")
-            ].output_units = (
-                "code_mass"
-            )  # this turned out to be crucial!; otherwise wrong output_unit 'g' is assumed in ParticlePhasePlot->create_profile in visualizaiton/particle_plots.py for ART-I/ENZO/RAMSES
-            p41 = ParticlePhasePlot(
-                sp,
-                (PartType_Star_to_use, "radius"),
-                (PartType_Star_to_use, "particle_velocity_cylindrical_theta"),
-                (PartType_Star_to_use, "particle_mass"),
-                deposition="ngp",
-                weight_field=None,
-                fontsize=12,
-                x_bins=300,
-                y_bins=300,
-            )
-            p41.set_unit("radius", "kpc")
-            p41.set_unit("particle_velocity_cylindrical_theta", "km/s")
-            p41.set_unit(
-                "particle_mass", "Msun"
-            )  # requires a change in set_unit in visualization/profile_plotter.py: remove self.plots[field].zmin, self.plots[field].zmax = (None, None)
-            # 			p41.set_unit((PartType_Star_to_use, "particle_mass"), 'Msun') # Neither this nor above works without such change
-            p41.set_zlim((PartType_Star_to_use, "particle_mass"), 1e3, 1e7)
-            p41.set_cmap((PartType_Star_to_use, "particle_mass"), "algae")
-
-            p41.set_colorbar_label(
-                (PartType_Star_to_use, "particle_mass"),
-                "Newly Formed Stellar Mass ($\mathrm{M}_{\odot}$)",
-            )
-            plot41 = p41.plots[(PartType_Star_to_use, "particle_mass")]
-
-            p41.set_xlabel("Cylindrical Radius (kpc)")
-            p41.set_ylabel("Rotational Velocity (km/s)")
-            p41.set_xlim(0, 14)
-            p41.set_ylim(-100, 350)
-
-            plot41.figure = fig_star_pos_vel_PDF[time]
-            plot41.axes = grid_star_pos_vel_PDF[time][code].axes
-            if code == 0:
-                plot41.cax = grid_star_pos_vel_PDF[time].cbar_axes[0]
-            p41._setup_plots()
-
-            # Add 1D profile line if requested
-            if draw_star_pos_vel_PDF >= 2 and time != 0:
-                p51 = ProfilePlot(
-                    sp,
-                    (PartType_Star_to_use, "radius"),
-                    (PartType_Star_to_use, "particle_velocity_cylindrical_theta"),
-                    weight_field=(PartType_Star_to_use, "particle_mass"),
-                    n_bins=50,
-                    x_log=False,
-                )
-                p51.set_log(
-                    (PartType_Star_to_use, "particle_velocity_cylindrical_theta"), False
-                )
-                p51.set_log((PartType_Star_to_use, "radius"), False)
-                p51.set_unit("radius", "kpc")
-                p51.set_xlim(1e-3, 14)
-                p51.set_ylim("particle_velocity_cylindrical_theta", -100, 350)
-                line = ln.Line2D(
-                    p51.profiles[0].x.in_units("kpc"),
-                    p51.profiles[0]["particle_velocity_cylindrical_theta"].in_units(
-                        "km/s"
-                    ),
-                    linestyle="-",
-                    linewidth=2,
-                    color="k",
-                    alpha=0.7,
-                )
-                star_pos_vel_xs[time].append(p51.profiles[0].x.in_units("kpc").d)
-                star_pos_vel_profiles[time].append(
-                    p51.profiles[0]["particle_velocity_cylindrical_theta"]
-                    .in_units("km/s")
-                    .d
-                )
-                grid_star_pos_vel_PDF[time][code].axes.add_line(line)
-
-            # Add velocity dispersion profile if requested
-            if draw_star_pos_vel_PDF >= 3 and time != 0:
-
-                def _particle_local_rotational_velocity_x(field, data):
-                    trans = np.zeros(
-                        data[
-                            (PartType_StarBeforeFiltered_to_use, "particle_velocity_x")
-                        ].shape
-                    )
-                    dr = 0.5 * (
-                        star_pos_vel_xs[time][code][1] - star_pos_vel_xs[time][code][0]
-                    )
-                    for radius, v_rot_local in zip(
-                        star_pos_vel_xs[time][code], star_pos_vel_profiles[time][code]
-                    ):
-                        ind = np.where(
-                            (
-                                data[
-                                    (PartType_StarBeforeFiltered_to_use, "radius")
-                                ].in_units("kpc")
-                                >= (radius - dr)
-                            )
-                            & (
-                                data[
-                                    (PartType_StarBeforeFiltered_to_use, "radius")
-                                ].in_units("kpc")
-                                < (radius + dr)
-                            )
-                        )
-                        trans[ind] = (
-                            -np.sin(
-                                data[
-                                    (
-                                        PartType_StarBeforeFiltered_to_use,
-                                        "particle_position_cylindrical_theta",
-                                    )
-                                ][ind]
-                            )
-                            * v_rot_local
-                            * 1e5
-                        )
-                    return data.ds.arr(trans, "cm/s").in_base(data.ds.unit_system.name)
-
-                pf.add_field(
-                    (
-                        PartType_StarBeforeFiltered_to_use,
-                        "particle_local_rotational_velocity_x",
-                    ),
-                    function=_particle_local_rotational_velocity_x,
-                    take_log=False,
-                    particle_type=True,
-                    units="cm/s",
-                )
-
-                def _particle_local_rotational_velocity_y(field, data):
-                    trans = np.zeros(
-                        data[
-                            (PartType_StarBeforeFiltered_to_use, "particle_velocity_y")
-                        ].shape
-                    )
-                    dr = 0.5 * (
-                        star_pos_vel_xs[time][code][1] - star_pos_vel_xs[time][code][0]
-                    )
-                    for radius, v_rot_local in zip(
-                        star_pos_vel_xs[time][code], star_pos_vel_profiles[time][code]
-                    ):
-                        ind = np.where(
-                            (
-                                data[
-                                    (PartType_StarBeforeFiltered_to_use, "radius")
-                                ].in_units("kpc")
-                                >= (radius - dr)
-                            )
-                            & (
-                                data[
-                                    (PartType_StarBeforeFiltered_to_use, "radius")
-                                ].in_units("kpc")
-                                < (radius + dr)
-                            )
-                        )
-                        trans[ind] = (
-                            np.cos(
-                                data[
-                                    (
-                                        PartType_StarBeforeFiltered_to_use,
-                                        "particle_position_cylindrical_theta",
-                                    )
-                                ][ind]
-                            )
-                            * v_rot_local
-                            * 1e5
-                        )
-                    return data.ds.arr(trans, "cm/s").in_base(data.ds.unit_system.name)
-
-                pf.add_field(
-                    (
-                        PartType_StarBeforeFiltered_to_use,
-                        "particle_local_rotational_velocity_y",
-                    ),
-                    function=_particle_local_rotational_velocity_y,
-                    take_log=False,
-                    particle_type=True,
-                    units="cm/s",
-                )
-
-                def _particle_velocity_minus_local_rotational_velocity_squared(
-                    field, data
-                ):
-                    return (
-                        (
-                            data[
-                                (
-                                    PartType_StarBeforeFiltered_to_use,
-                                    "particle_velocity_x",
-                                )
-                            ]
-                            - data[
-                                (
-                                    PartType_StarBeforeFiltered_to_use,
-                                    "particle_local_rotational_velocity_x",
-                                )
-                            ]
-                        )
-                        ** 2
-                        + (
-                            data[
-                                (
-                                    PartType_StarBeforeFiltered_to_use,
-                                    "particle_velocity_y",
-                                )
-                            ]
-                            - data[
-                                (
-                                    PartType_StarBeforeFiltered_to_use,
-                                    "particle_local_rotational_velocity_y",
-                                )
-                            ]
-                        )
-                        ** 2
-                        + (
-                            data[
-                                (
-                                    PartType_StarBeforeFiltered_to_use,
-                                    "particle_velocity_z",
-                                )
-                            ]
-                        )
-                        ** 2
-                    )
-
-                pf.add_field(
-                    (
-                        PartType_StarBeforeFiltered_to_use,
-                        "particle_velocity_minus_local_rotational_velocity_squared",
-                    ),
-                    function=_particle_velocity_minus_local_rotational_velocity_squared,
-                    take_log=False,
-                    particle_type=True,
-                    units="cm**2/s**2",
-                )
-                pf.add_particle_filter(
-                    PartType_Star_to_use
-                )  # This is needed for a filtered particle type PartType_Star_to_use to work, because we have just created new particle fields.
-
-                p515 = ProfilePlot(
-                    sp,
-                    (PartType_Star_to_use, "radius"),
-                    (
-                        PartType_Star_to_use,
-                        "particle_velocity_minus_local_rotational_velocity_squared",
-                    ),
-                    weight_field=(PartType_Star_to_use, "particle_mass"),
-                    n_bins=50,
-                    x_log=False,
-                )
-                p515.set_log((PartType_Star_to_use, "radius"), False)
-                p515.set_unit("radius", "kpc")
-                p515.set_xlim(1e-3, 14)
-                star_pos_disp_xs[time].append(p515.profiles[0].x.in_units("kpc").d)
-                star_pos_disp_profiles[time].append(
-                    np.sqrt(
-                        p515.profiles[0][
-                            "particle_velocity_minus_local_rotational_velocity_squared"
-                        ]
-                    )
-                    .in_units("km/s")
-                    .d
-                )
-
-            # Add vertical velocity dispersion profile if requested
-            if draw_star_pos_vel_PDF >= 4 and time != 0:
-
-                def _particle_velocity_z_squared(field, data):
-                    return (
-                        data[
-                            (PartType_StarBeforeFiltered_to_use, "particle_velocity_z")
-                        ]
-                    ) ** 2
-
-                pf.add_field(
-                    (PartType_StarBeforeFiltered_to_use, "particle_velocity_z_squared"),
-                    function=_particle_velocity_z_squared,
-                    take_log=False,
-                    particle_type=True,
-                    units="cm**2/s**2",
-                )
-                pf.add_particle_filter(
-                    PartType_Star_to_use
-                )  # This is needed for a filtered particle type PartType_Star_to_use to work, because we have just created new particle fields.
-
-                p5151 = ProfilePlot(
-                    sp,
-                    (PartType_Star_to_use, "radius"),
-                    (PartType_Star_to_use, "particle_velocity_z_squared"),
-                    weight_field=(PartType_Star_to_use, "particle_mass"),
-                    n_bins=50,
-                    x_log=False,
-                )
-                p5151.set_log((PartType_Star_to_use, "radius"), False)
-                p5151.set_unit("radius", "kpc")
-                p5151.set_xlim(1e-3, 14)
-                star_pos_disp_vert_xs[time].append(
-                    p5151.profiles[0].x.in_units("kpc").d
-                )
-                star_pos_disp_vert_profiles[time].append(
-                    np.sqrt(p5151.profiles[0]["particle_velocity_z_squared"])
-                    .in_units("km/s")
-                    .d
-                )
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=4, prop=dict(size=10), frameon=True
-                )
-                grid_star_pos_vel_PDF[time][code].axes.add_artist(at)
-
-        # RADIUS-HEIGHT PDF
-        if draw_rad_height_PDF >= 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                if draw_rad_height_PDF == 1 or draw_rad_height_PDF == 2:
-                    p55 = PhasePlot(
-                        sp,
-                        ("index", "cylindrical_r"),
-                        ("index", "cylindrical_z_abs"),
-                        ("gas", "density"),
-                        weight_field=("gas", "cell_mass"),
-                        fontsize=12,
-                        x_bins=200,
-                        y_bins=200,
-                    )
-                    p55.set_zlim(("gas", "density"), 1e-26, 1e-21)
-                    p55.set_cmap(("gas", "density"), "algae")
-                    p55.set_log("cylindrical_r", False)
-                    p55.set_log("cylindrical_z_abs", False)
-                    p55.set_unit("cylindrical_r", "kpc")
-                    p55.set_unit("cylindrical_z_abs", "kpc")
-                    plot55 = p55.plots[("gas", "density")]
-                elif draw_rad_height_PDF == 3:
-                    p55 = PhasePlot(
-                        sp,
-                        ("index", "cylindrical_r"),
-                        ("index", "cylindrical_z_abs"),
-                        ("gas", "density_minus_analytic"),
-                        weight_field=("gas", "cell_mass"),
-                        fontsize=12,
-                        x_bins=200,
-                        y_bins=200,
-                    )
-                    p55.set_zlim(("gas", "density_minus_analytic"), -1e-24, 1e-24)
-                    p55.set_cmap(("gas", "density_minus_analytic"), "algae")
-                    p55.set_log("cylindrical_r", False)
-                    p55.set_log("cylindrical_z_abs", False)
-                    p55.set_unit("cylindrical_r", "kpc")
-                    p55.set_unit("cylindrical_z_abs", "kpc")
-                    plot55 = p55.plots[("gas", "density_minus_analytic")]
-            else:
-                # Because ParticlePhasePlot doesn't work for these newly created fields for some reason, I will do the following trick.
-                if draw_rad_height_PDF == 1 or draw_rad_height_PDF == 2:
-                    p55 = PhasePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (PartType_Gas_to_use, "particle_position_cylindrical_z_abs"),
-                        (PartType_Gas_to_use, "density"),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        fontsize=12,
-                        x_bins=200,
-                        y_bins=200,
-                    )
-                    p55.set_zlim((PartType_Gas_to_use, "density"), 1e-26, 1e-21)
-                    p55.set_cmap((PartType_Gas_to_use, "density"), "algae")
-                    p55.set_log("radius", False)
-                    p55.set_log("particle_position_cylindrical_z_abs", False)
-                    p55.set_unit("radius", "kpc")
-                    p55.set_unit("particle_position_cylindrical_z_abs", "kpc")
-                    plot55 = p55.plots[(PartType_Gas_to_use, "density")]
-                elif draw_rad_height_PDF == 3:
-                    p55 = PhasePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (PartType_Gas_to_use, "particle_position_cylindrical_z_abs"),
-                        (PartType_Gas_to_use, "Density_2_minus_analytic"),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        fontsize=12,
-                        x_bins=200,
-                        y_bins=200,
-                    )
-                    p55.set_zlim(
-                        (PartType_Gas_to_use, "Density_2_minus_analytic"), -1e-24, 1e-24
-                    )
-                    p55.set_cmap(
-                        (PartType_Gas_to_use, "Density_2_minus_analytic"), "algae"
-                    )
-                    p55.set_log("radius", False)
-                    p55.set_log("particle_position_cylindrical_z_abs", False)
-                    p55.set_unit("radius", "kpc")
-                    p55.set_unit("particle_position_cylindrical_z_abs", "kpc")
-                    plot55 = p55.plots[
-                        (PartType_Gas_to_use, "Density_2_minus_analytic")
-                    ]
-
-            p55.set_xlabel("Cylindrical Radius (kpc)")
-            p55.set_ylabel("Vertical Height (kpc)")
-            p55.set_xlim(0, 14)
-            p55.set_ylim(0, 1.4)
-
-            plot55.figure = fig_rad_height_PDF[time]
-            plot55.axes = grid_rad_height_PDF[time][code].axes
-            if code == 0:
-                plot55.cax = grid_rad_height_PDF[time].cbar_axes[0]
-            p55._setup_plots()
-
-            # Add 1D profile line if requested
-            if draw_rad_height_PDF == 2:
-                if (
-                    codes[code] == "ART-I"
-                    or codes[code] == "ART-II"
-                    or codes[code] == "ENZO"
-                    or codes[code] == "RAMSES"
-                ):
-                    p56 = ProfilePlot(
-                        sp,
-                        ("index", "cylindrical_r"),
-                        ("index", "cylindrical_z_abs"),
-                        weight_field=("gas", "cell_mass"),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p56.set_log("cylindrical_r", False)
-                    p56.set_log("cylindrical_z_abs", False)
-                    p56.set_unit("cylindrical_r", "kpc")
-                    p56.set_unit("cylindrical_z_abs", "kpc")
-                    p56.set_xlim(0, 14)
-                    p56.set_ylim("cylindrical_z_abs", 0, 1.4)
-                    line = ln.Line2D(
-                        p56.profiles[0].x.in_units("kpc"),
-                        p56.profiles[0]["cylindrical_z_abs"].in_units("kpc"),
-                        linestyle="-",
-                        linewidth=2,
-                        color="k",
-                        alpha=0.7,
-                    )
-                    rad_height_xs[time].append(p56.profiles[0].x.in_units("kpc").d)
-                    rad_height_profiles[time].append(
-                        p56.profiles[0]["cylindrical_z_abs"].in_units("kpc").d
-                    )
-                else:
-                    p56 = ProfilePlot(
-                        sp,
-                        (PartType_Gas_to_use, "radius"),
-                        (PartType_Gas_to_use, "particle_position_cylindrical_z_abs"),
-                        weight_field=(PartType_Gas_to_use, MassType_to_use),
-                        n_bins=50,
-                        x_log=False,
-                    )
-                    p56.set_log("radius", False)
-                    p56.set_log("particle_position_cylindrical_z_abs", False)
-                    p56.set_unit("radius", "kpc")
-                    p56.set_unit("particle_position_cylindrical_z_abs", "kpc")
-                    p56.set_xlim(0, 14)
-                    p56.set_ylim("particle_position_cylindrical_z_abs", 0, 1.4)
-                    line = ln.Line2D(
-                        p56.profiles[0].x.in_units("kpc"),
-                        p56.profiles[0]["particle_position_cylindrical_z_abs"].in_units(
-                            "kpc"
-                        ),
-                        linestyle="-",
-                        linewidth=2,
-                        color="k",
-                        alpha=0.7,
-                    )
-                    rad_height_xs[time].append(p56.profiles[0].x.in_units("kpc").d)
-                    rad_height_profiles[time].append(
-                        p56.profiles[0]["particle_position_cylindrical_z_abs"]
-                        .in_units("kpc")
-                        .d
-                    )
-                grid_rad_height_PDF[time][code].axes.add_line(line)
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=1, prop=dict(size=10), frameon=True
-                )
-                grid_rad_height_PDF[time][code].axes.add_artist(at)
-
-        # DENSITY-TEMPERATURE-METALLICITY PDF
-        if draw_metal_PDF == 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            my_cmap2 = copy.copy(matplotlib.cm.get_cmap("algae"))
-            my_cmap2.set_under("w")
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                pf.field_info[("gas", "metallicity")].take_log = False
-                p3 = PhasePlot(
-                    sp,
-                    ("gas", "density"),
-                    ("gas", "temperature"),
-                    ("gas", "metallicity"),
-                    weight_field=("gas", "cell_mass"),
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p3.set_zlim(("gas", "metallicity"), 0.01, 0.04)
-                p3.set_cmap(("gas", "metallicity"), my_cmap2)
-                p3.set_colorbar_label(
-                    ("gas", "metallicity"),
-                    "Metallicity (Mass-weighted average of mass fraction)",
-                )
-                plot3 = p3.plots[("gas", "metallicity")]
-            else:
-                # Because ParticlePhasePlot doesn't yet work for a log-log PDF for some reason, I will do the following trick.
-                pf.field_info[(PartType_Gas_to_use, "Metallicity_2")].take_log = False
-                p3 = ParticlePhasePlot(
-                    sp,
-                    (PartType_Gas_to_use, "density"),
-                    (PartType_Gas_to_use, "temperature"),
-                    (PartType_Gas_to_use, "Metallicity_2"),
-                    weight_field=(PartType_Gas_to_use, MassType_to_use),
-                    fontsize=12,
-                    x_bins=300,
-                    y_bins=300,
-                )
-                p3.set_zlim((PartType_Gas_to_use, "Metallicity_2"), 0.01, 0.04)
-                p3.set_cmap((PartType_Gas_to_use, "Metallicity_2"), my_cmap2)
-                plot3 = p3.plots[(PartType_Gas_to_use, "Metallicity_2")]
-
-            p3.set_unit("density", "g/cm**3")
-            p3.set_xlim(1e-29, 1e-21)
-            p3.set_unit("temperature", "K")
-            p3.set_ylim(10, 1e7)
-            p3.set_log("density", True)
-            p3.set_log("temperature", True)
-
-            plot3.figure = fig_metal_PDF[time]
-            plot3.axes = grid_metal_PDF[time][code].axes
-            if code == 0:
-                plot3.cax = grid_metal_PDF[time].cbar_axes[0]
-            p3._setup_plots()
-
-            if add_nametag == 1:
-                at = AnchoredText(
-                    "%s" % codes[code], loc=3, prop=dict(size=10), frameon=True
-                )
-                grid_metal_PDF[time][code].axes.add_artist(at)
-
-        # DENSITY DF (DISTRIBUTION FUNCTION)
-        if draw_density_DF >= 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                p6 = ProfilePlot(
-                    sp,
-                    ("gas", "density"),
-                    ("gas", "cell_mass"),
-                    weight_field=None,
-                    n_bins=50,
-                    x_log=True,
-                    accumulation=False,
-                )
-                # 				p6 = ProfilePlot(sp, ("gas", "density"),  ("gas", "cell_mass"), weight_field=None, n_bins=50, x_log=True, accumulation=True)
-                p6.set_log("cell_mass", True)
-                p6.set_xlim(1e-29, 1e-21)
-                density_DF_xs[time].append(p6.profiles[0].x.in_units("g/cm**3").d)
-                density_DF_profiles[time].append(
-                    p6.profiles[0]["cell_mass"].in_units("Msun").d
-                )
-            else:
-                # Because ParticleProfilePlot doesn't exist, I will do the following trick.
-                p6 = ProfilePlot(
-                    sp,
-                    (PartType_Gas_to_use, "density"),
-                    (PartType_Gas_to_use, MassType_to_use),
-                    weight_field=None,
-                    n_bins=50,
-                    x_log=True,
-                    accumulation=False,
-                )
-                # 				p6 = ProfilePlot(sp, (PartType_Gas_to_use, "density"),  (PartType_Gas_to_use, MassType_to_use), weight_field=None, n_bins=50, x_log=True, accumulation=True)
-                p6.set_log((PartType_Gas_to_use, MassType_to_use), True)
-                density_DF_xs[time].append(p6.profiles[0].x.in_units("g/cm**3").d)
-                density_DF_profiles[time].append(
-                    p6.profiles[0][MassType_to_use].in_units("Msun").d
-                )
-
-            # Add difference plot between 1st and 2nd datasets, if requested
-            if draw_density_DF == 2 and time != 0:
-                if dataset_num == 2:
-                    pf_1st = load_dataset(
-                        1, time, code, codes, filenames[0]
-                    )  # load 1st datasets
-                    v, cen = pf_1st.h.find_max(("gas", "density"))
-                    sp = pf_1st.sphere(cen, (30.0, "kpc"))
-                    cen2 = sp.quantities.center_of_mass(
-                        use_gas=True, use_particles=False
-                    ).in_units("kpc")
-                    sp2 = pf_1st.sphere(cen2, (1.0, "kpc"))
-                    cen3 = sp2.quantities.max_location(("gas", "density"))
-                    center_1st = pf_1st.arr(
-                        [cen3[1].d, cen3[2].d, cen3[3].d], "code_length"
-                    )
-                    if yt_version_pre_3_2_3 == 1:
-                        center_1st = pf_1st.arr(
-                            [cen3[2].d, cen3[3].d, cen3[4].d], "code_length"
-                        )  # for yt-3.2.3 or before
-                    sp_1st = pf_1st.sphere(center_1st, (0.5 * figure_width, "kpc"))
-                    if (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    ):
-                        p61 = ProfilePlot(
-                            sp_1st,
-                            ("gas", "density"),
-                            ("gas", "cell_mass"),
-                            weight_field=None,
-                            n_bins=50,
-                            x_log=True,
-                            accumulation=False,
-                        )
-                        p61.set_log("cell_mass", True)
-                        p61.set_xlim(1e-29, 1e-21)
-                        density_DF_1st_xs[time].append(
-                            p61.profiles[0].x.in_units("g/cm**3").d
-                        )
-                        density_DF_1st_profiles[time].append(
-                            p61.profiles[0]["cell_mass"].in_units("Msun").d
-                        )
-                    else:
-
-                        def _Density_2(field, data):
-                            return data[(PartType_Gas_to_use, "Density")].in_units(
-                                "g/cm**3"
-                            )
-
-                        pf_1st.add_field(
-                            (PartType_Gas_to_use, "density"),
-                            function=_Density_2,
-                            take_log=True,
-                            particle_type=False,
-                            display_name="Density",
-                            units="g/cm**3",
-                        )
-
-                        def _Mass_2(field, data):
-                            return data[
-                                (PartType_Gas_to_use, MassType_to_use)
-                            ].in_units("Msun")
-
-                        pf_1st.add_field(
-                            (PartType_Gas_to_use, MassType_to_use),
-                            function=_Mass_2,
-                            take_log=True,
-                            particle_type=False,
-                            display_name="Mass",
-                            units="Msun",
-                        )
-                        p61 = ProfilePlot(
-                            sp_1st,
-                            (PartType_Gas_to_use, "density"),
-                            (PartType_Gas_to_use, MassType_to_use),
-                            weight_field=None,
-                            n_bins=50,
-                            x_log=True,
-                            accumulation=False,
-                        )
-                        p61.set_log((PartType_Gas_to_use, MassType_to_use), True)
-                        p61.set_xlim(1e-29, 1e-21)
-                        density_DF_1st_xs[time].append(
-                            p61.profiles[0].x.in_units("g/cm**3").d
-                        )
-                        density_DF_1st_profiles[time].append(
-                            p61.profiles[0][MassType_to_use].in_units("Msun").d
-                        )
-                else:
-                    print("This won't work; consider setting dataset_num to 2...")
-                    continue
-
-        # CYLINDRICAL RADIUS DF + RADIALLY-BINNED GAS SURFACE DENSITY
-        if draw_radius_DF == 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            sp.set_field_parameter("normal", disk_normal_vector)
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                p7 = ProfilePlot(
-                    sp,
-                    ("index", "cylindrical_r"),
-                    ("gas", "cell_mass"),
-                    weight_field=None,
-                    n_bins=50,
-                    x_log=False,
-                    accumulation=False,
-                )
-                p7.set_log("cell_mass", True)
-                p7.set_log("cylindrical_r", False)
-                p7.set_unit("cylindrical_r", "kpc")
-                p7.set_xlim(1e-3, 15)
-                radius_DF_xs[time].append(p7.profiles[0].x.in_units("kpc").d)
-                radius_DF_profiles[time].append(
-                    p7.profiles[0]["cell_mass"].in_units("Msun").d
-                )
-            else:
-
-                p7 = ProfilePlot(
-                    sp,
-                    (PartType_Gas_to_use, "radius"),
-                    (PartType_Gas_to_use, MassType_to_use),
-                    weight_field=None,
-                    n_bins=50,
-                    x_log=False,
-                    accumulation=False,
-                )
-                p7.set_log(MassType_to_use, True)
-                p7.set_log("radius", False)
-                p7.set_unit("radius", "kpc")
-                p7.set_xlim(1e-3, 15)
-                radius_DF_xs[time].append(p7.profiles[0].x.in_units("kpc").d)
-                radius_DF_profiles[time].append(
-                    p7.profiles[0][MassType_to_use].in_units("Msun").d
-                )
-
-        # CYLINDRICAL RADIUS DF + RADIALLY-BINNED SURFACE DENSITY FOR NEW STARS
-        if draw_star_radius_DF >= 1 and time != 0:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            sp.set_field_parameter("normal", disk_normal_vector)
-            pf.field_info[(PartType_Star_to_use, "particle_mass")].take_log = True
-            pf.field_info[
-                (PartType_Star_to_use, "particle_mass")
-            ].output_units = (
-                "code_mass"
-            )  # this turned out to be crucial!; check output_units above
-            pf.field_info[(PartType_Star_to_use, "radius")].take_log = False
-            p71 = ProfilePlot(
-                sp,
-                (PartType_Star_to_use, "radius"),
-                (PartType_Star_to_use, "particle_mass"),
-                weight_field=None,
-                n_bins=50,
-                x_log=False,
-                accumulation=False,
-            )
-            p71.set_unit("radius", "kpc")
-            p71.set_xlim(1e-3, 15)
-            star_radius_DF_xs[time].append(p71.profiles[0].x.in_units("kpc").d)
-            star_radius_DF_profiles[time].append(
-                p71.profiles[0]["particle_mass"].in_units("Msun").d
-            )
-
-            # Add RADIALLY-BINNED SFR SURFACE DENSITY PROFILE if requested (SFR estimated using stars younger than 20 Myrs old)
-            if draw_star_radius_DF == 2 and time != 0:
-
-                def _particle_mass_young_stars_star_radius_DF(field, data):
-                    trans = np.zeros(
-                        data[
-                            (PartType_StarBeforeFiltered_to_use, "particle_mass")
-                        ].shape
-                    )
-                    ind = np.where(
-                        data[
-                            (
-                                PartType_StarBeforeFiltered_to_use,
-                                FormationTimeType_to_use,
-                            )
-                        ].in_units("Myr")
-                        > (
-                            pf.current_time.in_units("Myr").d
-                            - young_star_cutoff_star_radius_DF
-                        )
-                    )
-                    trans[ind] = data[
-                        (PartType_StarBeforeFiltered_to_use, "particle_mass")
-                    ][ind].in_units("code_mass")
-                    return data.ds.arr(trans, "code_mass").in_base(
-                        data.ds.unit_system.name
-                    )
-
-                pf.add_field(
-                    (
-                        PartType_StarBeforeFiltered_to_use,
-                        "particle_mass_young_stars_star_radius_DF",
-                    ),
-                    function=_particle_mass_young_stars_star_radius_DF,
-                    display_name="Young Stellar Mass",
-                    units="code_mass",
-                    particle_type=True,
-                    take_log=True,
-                )
-                pf.add_particle_filter(PartType_Star_to_use)
-
-                pf.field_info[
-                    (PartType_Star_to_use, "particle_mass_young_stars_star_radius_DF")
-                ].take_log = True
-                pf.field_info[
-                    (PartType_Star_to_use, "particle_mass_young_stars_star_radius_DF")
-                ].output_units = (
-                    "code_mass"
-                )  # this turned out to be crucial!; check output_units above
-                pf.field_info[(PartType_Star_to_use, "radius")].take_log = False
-                p72 = ProfilePlot(
-                    sp,
-                    (PartType_Star_to_use, "radius"),
-                    (PartType_Star_to_use, "particle_mass_young_stars_star_radius_DF"),
-                    weight_field=None,
-                    n_bins=50,
-                    x_log=False,
-                    accumulation=False,
-                )
-                p72.set_unit("radius", "kpc")
-                p72.set_xlim(1e-3, 15)
-                sfr_radius_DF_xs[time].append(p72.profiles[0].x.in_units("kpc").d)
-                sfr_radius_DF_profiles[time].append(
-                    p72.profiles[0]["particle_mass_young_stars_star_radius_DF"]
-                    .in_units("Msun")
-                    .d
-                    / young_star_cutoff_star_radius_DF
-                    / 1e6
-                )  # in Msun/yr
-
-        # VERTICAL HEIGHT DF + VERTICALLY-BINNED GAS SURFACE DENSITY
-        if draw_height_DF == 1:
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            sp.set_field_parameter("normal", disk_normal_vector)
-            if (
-                codes[code] == "ART-I"
-                or codes[code] == "ART-II"
-                or codes[code] == "ENZO"
-                or codes[code] == "RAMSES"
-            ):
-                p8 = ProfilePlot(
-                    sp,
-                    ("index", "cylindrical_z_abs"),
-                    ("gas", "cell_mass"),
-                    weight_field=None,
-                    n_bins=10,
-                    x_log=False,
-                    accumulation=False,
-                )
-                p8.set_log("cell_mass", True)
-                p8.set_log("cylindrical_z_abs", False)
-                p8.set_unit("cylindrical_z_abs", "kpc")
-                p8.set_xlim(1e-3, 1.4)
-                height_DF_xs[time].append(p8.profiles[0].x.in_units("kpc").d)
-                height_DF_profiles[time].append(
-                    p8.profiles[0]["cell_mass"].in_units("Msun").d
-                )
-            else:
-                p8 = ProfilePlot(
-                    sp,
-                    (PartType_Gas_to_use, "particle_position_cylindrical_z_abs"),
-                    (PartType_Gas_to_use, MassType_to_use),
-                    weight_field=None,
-                    n_bins=10,
-                    x_log=False,
-                    accumulation=False,
-                )
-                p8.set_log(MassType_to_use, True)
-                p8.set_log("particle_position_cylindrical_z_abs", False)
-                p8.set_unit("particle_position_cylindrical_z_abs", "kpc")
-                p8.set_xlim(1e-3, 1.4)
-                height_DF_xs[time].append(p8.profiles[0].x.in_units("kpc").d)
-                height_DF_profiles[time].append(
-                    p8.profiles[0][MassType_to_use].in_units("Msun").d
-                )
-
-        # STAR FORMATION RATE + CUMULATIVE STELLAR MASS GROWTH IN TIME
-        if draw_SFR >= 1 and time != 0:
-            from yt.units.dimensions import (
-                length,
-            )  # Below are tricks to make StarFormationRate() work, particularly with "volume" argument, as it currently works only with comoving datasets
-
-            pf.unit_registry.add(
-                "pccm", pf.unit_registry.lut["pc"][0], length, "\\rm{pc}/(1+z)"
-            )
-            pf.hubble_constant = 0.71
-            pf.omega_lambda = 0.73
-            pf.omega_matter = 0.27
-            pf.omega_curvature = 0.0
-
-            sp = pf.sphere(center, (0.5 * figure_width, "kpc"))
-            draw_SFR_mass = sp[(PartType_Star_to_use, "particle_mass")].in_units("Msun")
-            draw_SFR_ct = sp[(PartType_Star_to_use, FormationTimeType_to_use)].in_units(
-                "Myr"
-            )
-            sfr = StarFormationRate(
-                pf,
-                star_mass=draw_SFR_mass,
-                star_creation_time=draw_SFR_ct,
-                volume=sp.volume(),
-                bins=25,
-            )  # 25 bins hardcoded; see: http://yt-project.org/docs/dev/analyzing/analysis_modules/star_analysis.html
-
-            sfr_ts[time].append(sfr.time.in_units("Myr"))  # in Myr
-            sfr_cum_masses[time].append(sfr.Msol_cumulative)  # in Msun
-            sfr_sfrs[time].append(sfr.Msol_yr)  # in Msun/yr
-
-        # DENSITY ALONG THE ORTHO-RAY OBJECT CUTTING THROUGH THE CENTER
-        if draw_cut_through == 1:
-            ray = pf.ortho_ray(
-                2,
-                (center[0].in_units("code_length"), center[1].in_units("code_length")),
-            )  # see: http://yt-project.org/doc/visualizing/manual_plotting.html#line-plots
-            srt = np.argsort(ray["z"])
-            cut_through_zs[time].append(
-                np.array(ray["z"][srt].in_units("kpc").d - center[2].in_units("kpc").d)
-            )
-            cut_through_zvalues[time].append(
-                np.array(ray[("gas", "density")][srt].in_units("g/cm**3").d)
-            )
-
-            ray = pf.ortho_ray(
-                0,
-                (center[1].in_units("code_length"), center[2].in_units("code_length")),
-            )
-            srt = np.argsort(ray["x"])
-            cut_through_xs[time].append(
-                np.array(ray["x"][srt].in_units("kpc").d - center[2].in_units("kpc").d)
-            )
-            cut_through_xvalues[time].append(
-                np.array(ray[("gas", "density")][srt].in_units("g/cm**3").d)
-            )
-
-    ####################################
-    #        POST-ANALYSIS STEPS       #
-    ####################################
-
-    # SAVE FIGURES
-    if draw_density_map == 1:
-        fig_density_map[time].savefig(
-            "Sigma_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_temperature_map == 1:
-        fig_temperature_map[time].savefig(
-            "Temp_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_cellsize_map == 1 or draw_cellsize_map == 3:
-        fig_cellsize_map[time].savefig(
-            "Cell_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_cellsize_map == 2 or draw_cellsize_map == 3:
-        fig_cellsize_map_2[time].savefig(
-            "Resolution_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-    if draw_elevation_map == 1:
-        fig_elevation_map[time].savefig(
-            "Elevation_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-    if draw_metal_map >= 1:
-        fig_metal_map[time].savefig(
-            "Metal_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_zvel_map == 1:
-        fig_zvel_map[time].savefig(
-            "z-vel_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_star_map == 1 and time != 0:
-        fig_star_map[time].savefig(
-            "Star_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_star_clump_stats >= 1 and time != 0:
-        # if draw_star_clump_stats >= 2:
-        # fig_star_map_2[time].savefig("Star_with_clumps_HOP_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        # fig_star_map_3[time].savefig("Star_with_clumps_FOF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        if draw_star_clump_stats == 3:
-            pf_clump_ref = load_dataset(
-                2,
-                1,
-                0,
-                ["GIZMO"],
-                [
-                    [
-                        "dummy",
-                        "/lustre/ki/pfs/mornkr/080112_CHaRGe/pfs-hyades/AGORA-DISK-repository/Grackle+SF+ThermalFbck/GIZMO/AGORA_disk_second_ps1.5/snapshot_temp_100_last",
-                    ]
-                ],
-            )
-            PartType_Star_to_use = "Stars"
-            if (
-                os.path.exists(
-                    "./halo_catalogs/hop_%s_%05d_high_floor/hop_%s_%05d_high_floor.0.h5"
-                    % ("GIZMO", 500, "GIZMO", 500)
-                )
-                == False
-            ):
-                hc_clump_ref = HaloCatalog(
-                    data_ds=pf_clump_ref,
-                    finder_method="hop",
-                    output_dir="./halo_catalogs/hop_%s_%05d_high_floor"
-                    % ("GIZMO", 500),
-                    finder_kwargs={
-                        "threshold": 2e8,
-                        "dm_only": False,
-                        "ptype": PartType_Star_to_use,
-                    },
-                )
-                hc_clump_ref.add_filter(
-                    "quantity_value", "particle_mass", ">", 2.6e6, "Msun"
-                )
-                hc_clump_ref.add_filter(
-                    "quantity_value", "particle_mass", "<", 2.6e8, "Msun"
-                )
-                hc_clump_ref.create()
-            halo_ds_clump_ref = load(
-                "./halo_catalogs/hop_%s_%05d_high_floor/hop_%s_%05d_high_floor.0.h5"
-                % ("GIZMO", 500, "GIZMO", 500)
-            )
-            hc_clump_ref = HaloCatalog(
-                halos_ds=halo_ds_clump_ref,
-                output_dir="./halo_catalogs/hop_%s_%05d_high_floor" % ("GIZMO", 500),
-            )
-            hc_clump_ref.load()
-
-            halo_ad_clump_ref = hc_clump_ref.halos_ds.all_data()
-            star_clump_masses_hop_ref.append(
-                np.log10(halo_ad_clump_ref["particle_mass"][:].in_units("Msun"))
-            )
-
-            if (
-                os.path.exists(
-                    "./halo_catalogs/fof_%s_%05d_high_floor/fof_%s_%05d_high_floor.0.h5"
-                    % ("GIZMO", 500, "GIZMO", 500)
-                )
-                == False
-            ):
-                hc2_clump_ref = HaloCatalog(
-                    data_ds=pf_clump_ref,
-                    finder_method="fof",
-                    output_dir="./halo_catalogs/fof_%s_%05d_high_floor"
-                    % ("GIZMO", 500),
-                    finder_kwargs={
-                        "link": 0.0025,
-                        "dm_only": False,
-                        "ptype": PartType_Star_to_use,
-                    },
-                )
-                hc2_clump_ref.add_filter(
-                    "quantity_value", "particle_mass", ">", 2.6e6, "Msun"
-                )
-                hc2_clump_ref.add_filter(
-                    "quantity_value", "particle_mass", "<", 2.6e8, "Msun"
-                )
-                hc2_clump_ref.create()
-            halo_ds2_clump_ref = load(
-                "./halo_catalogs/fof_%s_%05d_high_floor/fof_%s_%05d_high_floor.0.h5"
-                % ("GIZMO", 500, "GIZMO", 500)
-            )
-            hc2_clump_ref = HaloCatalog(
-                halos_ds=halo_ds2_clump_ref,
-                output_dir="./halo_catalogs/fof_%s_%05d_high_floor" % ("GIZMO", 500),
-            )
-            hc2_clump_ref.load()
-
-            halo_ad2_clump_ref = hc2_clump_ref.halos_ds.all_data()
-            star_clump_masses_fof_ref.append(
-                np.log10(halo_ad2_clump_ref["particle_mass"][:].in_units("Msun"))
-            )
-        plt.clf()
-        fig = plt.figure(figsize=(8, 4))
-        gridspec.GridSpec(1, 2)
-        for star_clump_stats_i in range(1, 3, 1):
-            codes_plotted = []
-            # 			plt.subplot(1,2,star_clump_stats_i, aspect=0.25)
-            plt.subplot2grid((1, 2), (0, star_clump_stats_i - 1))
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                if (
-                    star_clump_stats_i == 1
-                    and (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    )
-                ) or (
-                    star_clump_stats_i == 2
-                    and (
-                        codes[code] == "CHANGA"
-                        or codes[code] == "GASOLINE"
-                        or codes[code] == "GADGET-3"
-                        or codes[code] == "GEAR"
-                        or codes[code] == "GIZMO"
-                        or codes[code] == "SWIFT"
-                    )
-                ):
-                    hist = np.histogram(
-                        star_clump_masses_hop[time][code], bins=10, range=(6.0, 8.5)
-                    )
-                    dbin = 0.5 * (hist[1][1] - hist[1][0])
-                    lines = plt.plot(
-                        hist[1][:-1] + dbin,
-                        hist[0],
-                        color=color_names[code],
-                        linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                        marker=marker_names[code],
-                        markeredgecolor="none",
-                        linewidth=1.2,
-                        alpha=0.8,
-                    )
-                    codes_plotted.append(codes[code])
-            plt.xlim(6, 8.5)
-            plt.ylim(-0.1, 15)
-            plt.grid(True)
-            plt.xlabel(
-                "$\mathrm{log[Newly\ Formed\ Stellar\ Clump\ Mass\ (M_{\odot})]}$"
-            )
-            if star_clump_stats_i == 1:
-                plt.ylabel("$\mathrm{Stellar\ Clump\ Counts, \ \ N_{clump}(M)}$")
-            plt.legend(codes_plotted, loc=1, frameon=True, ncol=1, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="xx-small")
-        # plt.savefig("star_clump_stats_HOP_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        plt.clf()
-        # Reiterate for cumulative plots
-        fig = plt.figure(figsize=(8, 4))
-        gridspec.GridSpec(1, 2)
-        for star_clump_stats_i in range(1, 3, 1):
-            codes_plotted = []
-            # 			plt.subplot(1,2,star_clump_stats_i, aspect=0.15)
-            plt.subplot2grid((1, 2), (0, star_clump_stats_i - 1))
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                if (
-                    star_clump_stats_i == 1
-                    and (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    )
-                ) or (
-                    star_clump_stats_i == 2
-                    and (
-                        codes[code] == "CHANGA"
-                        or codes[code] == "GASOLINE"
-                        or codes[code] == "GADGET-3"
-                        or codes[code] == "GEAR"
-                        or codes[code] == "GIZMO"
-                        or codes[code] == "SWIFT"
-                    )
-                ):
-                    hist = np.histogram(
-                        star_clump_masses_hop[time][code], bins=10, range=(6.0, 8.5)
-                    )
-                    dbin = 0.5 * (hist[1][1] - hist[1][0])
-                    lines = plt.plot(
-                        hist[1][:-1] + dbin,
-                        np.cumsum(hist[0][::-1])[::-1],
-                        color=color_names[code],
-                        linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                        marker=marker_names[code],
-                        markeredgecolor="none",
-                        linewidth=1.2,
-                        alpha=0.8,
-                    )
-                    codes_plotted.append(codes[code])
-            if draw_star_clump_stats == 3 and star_clump_stats_i == 2:
-                hist_clump_ref = np.histogram(
-                    star_clump_masses_hop_ref, bins=10, range=(6.0, 8.5)
-                )
-                dbin = 0.5 * (hist[1][1] - hist[1][0])
-                lines = plt.plot(
-                    hist_clump_ref[1][:-1] + dbin,
-                    np.cumsum(hist_clump_ref[0][::-1])[::-1],
-                    color="k",
-                    linestyle="--",
-                    marker="*",
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-                codes_plotted.append("GIZMO-ps2")
-            plt.xlim(6, 8.5)
-            # 			plt.ylim(-0.1, 30)
-            plt.ylim(0.9, 50)
-            plt.semilogy()
-            plt.grid(True)
-            plt.xlabel(
-                "$\mathrm{log[Newly\ Formed\ Stellar\ Clump\ Mass\ (M_{\odot})]}$"
-            )
-            if star_clump_stats_i == 1:
-                plt.ylabel("$\mathrm{Cumulative\ Clump\ Counts, \ \ N_{clump}(>M)}}$")
-            plt.legend(
-                codes_plotted,
-                loc=1,
-                frameon=True,
-                ncol=1,
-                fancybox=True,
-                labelspacing=0.15,
-                borderpad=0.3,
-            )
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="xx-small")
-        # plt.savefig("star_clump_stats_HOP_cumulative_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        plt.clf()
-
-        fig = plt.figure(figsize=(8, 4))
-        gridspec.GridSpec(1, 2)
-        for star_clump_stats_i in range(1, 3, 1):
-            codes_plotted = []
-            # 			plt.subplot(1,2,star_clump_stats_i, aspect=0.25)
-            plt.subplot2grid((1, 2), (0, star_clump_stats_i - 1))
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                if (
-                    star_clump_stats_i == 1
-                    and (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    )
-                ) or (
-                    star_clump_stats_i == 2
-                    and (
-                        codes[code] == "CHANGA"
-                        or codes[code] == "GASOLINE"
-                        or codes[code] == "GADGET-3"
-                        or codes[code] == "GEAR"
-                        or codes[code] == "GIZMO"
-                        or codes[code] == "SWIFT"
-                    )
-                ):
-                    hist = np.histogram(
-                        star_clump_masses_fof[time][code], bins=10, range=(6.0, 8.5)
-                    )
-                    dbin = 0.5 * (hist[1][1] - hist[1][0])
-                    lines = plt.plot(
-                        hist[1][:-1] + dbin,
-                        hist[0],
-                        color=color_names[code],
-                        linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                        marker=marker_names[code],
-                        markeredgecolor="none",
-                        linewidth=1.2,
-                        alpha=0.8,
-                    )
-                    codes_plotted.append(codes[code])
-            plt.xlim(6, 8.5)
-            plt.ylim(-0.1, 15)
-            plt.grid(True)
-            plt.xlabel(
-                "$\mathrm{log[Newly\ Formed\ Stellar\ Clump\ Mass\ (M_{\odot})]}$"
-            )
-            if star_clump_stats_i == 1:
-                plt.ylabel("$\mathrm{Stellar\ Clump\ Counts, \ \ N_{clump}(M)}$")
-            plt.legend(codes_plotted, loc=1, frameon=True, ncol=1, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="xx-small")
-        # plt.savefig("star_clump_stats_FOF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        plt.clf()
-        # Reiterate for cumulative plots
-        fig = plt.figure(figsize=(8, 4))
-        gridspec.GridSpec(1, 2)
-        for star_clump_stats_i in range(1, 3, 1):
-            codes_plotted = []
-            # 			plt.subplot(1,2,star_clump_stats_i, aspect=0.15)
-            plt.subplot2grid((1, 2), (0, star_clump_stats_i - 1))
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                if (
-                    star_clump_stats_i == 1
-                    and (
-                        codes[code] == "ART-I"
-                        or codes[code] == "ART-II"
-                        or codes[code] == "ENZO"
-                        or codes[code] == "RAMSES"
-                    )
-                ) or (
-                    star_clump_stats_i == 2
-                    and (
-                        codes[code] == "CHANGA"
-                        or codes[code] == "GASOLINE"
-                        or codes[code] == "GADGET-3"
-                        or codes[code] == "GEAR"
-                        or codes[code] == "GIZMO"
-                        or codes[code] == "SWIFT"
-                    )
-                ):
-                    hist = np.histogram(
-                        star_clump_masses_fof[time][code], bins=10, range=(6.0, 8.5)
-                    )
-                    dbin = 0.5 * (hist[1][1] - hist[1][0])
-                    lines = plt.plot(
-                        hist[1][:-1] + dbin,
-                        np.cumsum(hist[0][::-1])[::-1],
-                        color=color_names[code],
-                        linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                        marker=marker_names[code],
-                        markeredgecolor="none",
-                        linewidth=1.2,
-                        alpha=0.8,
-                    )
-                    codes_plotted.append(codes[code])
-            if draw_star_clump_stats == 3 and star_clump_stats_i == 2:
-                hist_clump_ref = np.histogram(
-                    star_clump_masses_fof_ref, bins=10, range=(6.0, 8.5)
-                )
-                dbin = 0.5 * (hist[1][1] - hist[1][0])
-                lines = plt.plot(
-                    hist_clump_ref[1][:-1] + dbin,
-                    np.cumsum(hist_clump_ref[0][::-1])[::-1],
-                    color="k",
-                    linestyle="--",
-                    marker="*",
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-                codes_plotted.append("GIZMO-ps2")
-            plt.xlim(6, 8.5)
-            # 			plt.ylim(-0.1, 30)
-            plt.ylim(0.9, 50)
-            plt.semilogy()
-            plt.grid(True)
-            plt.xlabel(
-                "$\mathrm{log[Newly\ Formed\ Stellar\ Clump\ Mass\ (M_{\odot})]}$"
-            )
-            if star_clump_stats_i == 1:
-                plt.ylabel("$\mathrm{Cumulative\ Clump\ Counts, \ \ N_{clump}(>M)}}$")
-            plt.legend(
-                codes_plotted,
-                loc=1,
-                frameon=True,
-                ncol=1,
-                fancybox=True,
-                labelspacing=0.15,
-                borderpad=0.3,
-            )
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="xx-small")
-        plt.savefig(
-            "star_clump_stats_FOF_cumulative_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-    if draw_SFR_map >= 1 and time != 0:
-        fig_degr_density_map[time].savefig(
-            "degraded_Sigma_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        fig_degr_sfr_map[time].savefig(
-            "degraded_SFR_map_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        if draw_SFR_map == 2 and time != 0:
-            # If requested, draw the local K-S plot using the degraded maps created above
-            plt.clf()
-            # 			plt.subplot(111)
-            fig = plt.figure(figsize=(8, 7))
-            Bigiel_surface_density = []
-            Bigiel_sfr_surface_density = []
-            for code in range(len(codes)):
-                # Remove bins where SFR surface density is zero
-                KS_x = np.array(surf_dens_SFR_map[time][code])
-                KS_x[np.where(np.array(sfr_surf_dens_SFR_map[time][code]) < 1e-10)] = 0
-                KS_x = np.log10(KS_x)
-                KS_y = np.log10(np.array(sfr_surf_dens_SFR_map[time][code]))
-                ind = np.logical_or(np.isinf(KS_x), np.isinf(KS_y))
-                ind2 = np.logical_or(np.isnan(KS_x), np.isnan(KS_y))
-                ind = np.logical_or(ind, ind2)
-                KS_x = KS_x[~ind]
-                KS_y = KS_y[~ind]
-                if codes[code] == "SWIFT":
-                    plt.scatter(
-                        KS_x,
-                        KS_y,
-                        color="k",
-                        edgecolor="k",
-                        s=20,
-                        linewidth=0.7,
-                        marker=marker_names[code],
-                        alpha=0.1,
-                    )
-                # Draw a 80% contour rather than scattering all the datapoints; see http://stackoverflow.com/questions/19390320/scatterplot-contours-in-matplotlib
-                Gaussian_density_estimation_nbins = 20
-                kernel = kde.gaussian_kde(np.vstack([KS_x, KS_y]))
-                xi, yi = np.mgrid[
-                    KS_x.min() : KS_x.max() : Gaussian_density_estimation_nbins * 1j,
-                    KS_y.min() : KS_y.max() : Gaussian_density_estimation_nbins * 1j,
-                ]
-                zi = np.reshape(
-                    kernel(np.vstack([xi.flatten(), yi.flatten()])), xi.shape
-                )
-                contours = plt.contour(
-                    xi,
-                    yi,
-                    zi,
-                    np.array([0.2]),
-                    colors=color_names[code],
-                    linewidths=1.2,
-                    alpha=1.0,
-                )  # 80%    percentile contour
-                # 				contours = plt.contour(xi, yi, zi, np.array([0.3173]), colors=color_names[code], linewidths=1.2, alpha=1.0) # 68.27% percentile contour (1-sigma)
-                contours.collections[0].set_label(
-                    codes[code]
-                )  # setting names for legend
-                plt.clabel(
-                    contours, fmt=codes[code], inline=True, fontsize=7
-                )  # setting labels
-            plt.xlim(0, 3)
-            plt.ylim(-4, 1)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{log[Gas\ Surface\ Density\ (M_{\odot}/pc^2)]}$")
-            plt.ylabel(
-                "$\mathrm{log[Star\ Formation\ Rate\ Surface\ Density\ (M_{\odot}/yr/kpc^2)]}$"
-            )
-            plt.legend(
-                loc=2, frameon=True, ncol=2, fancybox=True
-            )  # note difference from others since we want the legends to list contours, not scattered points
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-            t = np.arange(-2, 5, 0.01)
-            # for line in import_text("./Bigieletal2008_Fig8_Contour.txt", " "):
-            #         Bigiel_surface_density.append(float(line[0]) + np.log10(1.36)) # for the factor 1.36, see Section 2.3.1 of Bigiel et al. 2008
-            #         Bigiel_sfr_surface_density.append(float(line[1]))
-            # plt.fill(Bigiel_surface_density, Bigiel_sfr_surface_density, fill=True, color='b', alpha = 0.1, hatch='\\') # contour by Bigiel et al. 2008 (Fig 8), or Feldmann et al. 2012 (Fig 1)
-            plt.plot(
-                t, 1.37 * t - 3.78, "k--", linewidth=2, alpha=0.7
-            )  # observational fit by Kennicutt et al. 2007
-            # 			plt.axhline(y = np.log10(8.593e4/young_star_cutoff_SFR_map/1e6/(float(aperture_size_SFR_map)/1000.)**2),
-            #                                   color='k', linestyle ='-.', linewidth=1, alpha=0.7) # SFR surface density cutoff due to limited star particle mass resolution
-            plt.savefig(
-                "K-S_local_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-    if draw_PDF >= 1:
-        if draw_PDF == 3 and time != 0:
-            # If requested, find a 1D profile line from a specific snapshot as a reference (in this case ENZO or CHANGA noSF run at 500 Myr), then we add it to all panels
-            # pf_profile_ref = load_dataset(1, 1, 0, ['ENZO'], [['dummy', file_location[0]+'ENZO/DD0100/DD0100']])
-            pf_profile_ref = load_dataset(
-                1,
-                1,
-                0,
-                ["CHANGA"],
-                [["dummy", file_location[0] + "CHANGA/disklow/disklow.000500"]],
-            )
-
-            def _Density_2(field, data):
-                return data[(PartType_Gas_to_use, "Density")].in_units("g/cm**3")
-
-            pf_profile_ref.add_field(
-                (PartType_Gas_to_use, "density"),
-                function=_Density_2,
-                take_log=True,
-                particle_type=False,
-                display_name="Density",
-                units="g/cm**3",
-            )
-
-            def _Temperature_2(field, data):
-                return data[(PartType_Gas_to_use, "Temperature")].in_units("K")
-
-            pf_profile_ref.add_field(
-                (PartType_Gas_to_use, "temperature"),
-                function=_Temperature_2,
-                take_log=True,
-                particle_type=False,
-                display_name="Temperature",
-                units="K",
-            )
-
-            def _Mass_2(field, data):
-                return data[(PartType_Gas_to_use, MassType_to_use)].in_units("Msun")
-
-            pf_profile_ref.add_field(
-                (PartType_Gas_to_use, MassType_to_use),
-                function=_Mass_2,
-                take_log=True,
-                particle_type=False,
-                display_name="Mass",
-                units="Msun",
-            )
-
-            v, cen = pf_profile_ref.h.find_max(("gas", "density"))
-            sp = pf_profile_ref.sphere(cen, (30.0, "kpc"))
-            cen2 = sp.quantities.center_of_mass(
-                use_gas=True, use_particles=False
-            ).in_units("kpc")
-            sp2 = pf_profile_ref.sphere(cen2, (1.0, "kpc"))
-            cen3 = sp2.quantities.max_location(("gas", "density"))
-            center_profile_ref = pf_profile_ref.arr(
-                [cen3[1].d, cen3[2].d, cen3[3].d], "code_length"
-            )
-            if yt_version_pre_3_2_3 == 1:
-                center_profile_ref = pf_profile_ref.arr(
-                    [cen3[2].d, cen3[3].d, cen3[4].d], "code_length"
-                )
-            sp_profile_ref = pf_profile_ref.sphere(
-                center_profile_ref, (0.5 * figure_width, "kpc")
-            )
-
-            # p35 = ProfilePlot(sp_profile_ref, ("gas", "density"),  ("gas", "temperature"), weight_field=("gas", "cell_mass"), n_bins=30)
-            # p35.set_xlim(1e-29, 1e-21)
-            # p35.set_ylim("temperature", 10, 1e7)
-            p35 = ProfilePlot(
-                sp_profile_ref,
-                (PartType_Gas_to_use, "density"),
-                (PartType_Gas_to_use, "temperature"),
-                weight_field=(PartType_Gas_to_use, MassType_to_use),
-                n_bins=30,
-            )
-            p35.set_xlim(1e-26, 1e-21)
-            p35.set_ylim("temperature", 10, 1e7)
-            for code in range(len(codes)):
-                # 				line_profile_ref = ln.Line2D(p35.profiles[0].x.in_units('g/cm**3'), p35.profiles[0]["temperature"].in_units('K'), linestyle="--", linewidth=2, color='k', alpha=0.7)
-                line_profile_ref = ln.Line2D(
-                    p35.profiles[0].x.in_units("g/cm**3"),
-                    p35.profiles[0]["temperature"].in_units("K"),
-                    linestyle="--",
-                    linewidth=2,
-                    color="k",
-                    alpha=0.7,
-                )
-                grid_PDF[time][code].axes.add_line(line_profile_ref)
-        fig_PDF[time].savefig(
-            "PDF_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-    if draw_pos_vel_PDF >= 1:
-        # fig_pos_vel_PDF[time].savefig("pos_vel_PDF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        if draw_pos_vel_PDF >= 2 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.04)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_vel_xs[time][code],
-                    pos_vel_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 270)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel("$\mathrm{Rotational\ Velocity\ (km/s)}$", fontsize="large")
-            plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(pos_vel_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_vel_xs[time][code],
-                    (pos_vel_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-0.5, 0.5)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{v} - \mathrm{\bar v})/\mathrm{\bar v}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(pos_vel_profiles[time]), axis=0) / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < pos_vel_xs[time][0])
-                    & (pos_vel_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            # 				plt.text(12, 0.3, "mean dispersion = %.3f or %.3f dex " % (mean_fractional_dispersion, mean_fractional_dispersion_in_dex), ha="center", va="center", size=8, bbox=dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9))
-            plt.savefig(
-                "pos_vel_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-        if draw_pos_vel_PDF >= 3 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.064)
-            fig = plt.figure(figsize=(8, 10))
-            gridspec.GridSpec(5, 1)
-            plt.subplot2grid((5, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_disp_xs[time][code],
-                    pos_disp_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 170)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel("$\mathrm{Velocity\ Dispersion\ (km/s)}$", fontsize="large")
-            plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((5, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(pos_disp_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_disp_xs[time][code],
-                    (pos_disp_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{\sigma} - \mathrm{\bar \sigma})/\mathrm{\bar \sigma}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(pos_disp_profiles[time]), axis=0) / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < pos_disp_xs[time][0])
-                    & (pos_disp_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            plt.savefig(
-                "pos_disp_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.subplot2grid((5, 1), (4, 0), rowspan=1)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_disp_xs[time][code],
-                    pos_disp_vert_profiles[time][code] / pos_disp_profiles[time][code],
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Ratio,}\/\mathrm{\sigma}_{\perp}/\mathrm{\sigma}$",
-                fontsize="large",
-            )
-            plt.savefig(
-                "pos_disp_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-        if draw_pos_vel_PDF == 4 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.064)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_disp_vert_xs[time][code],
-                    pos_disp_vert_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 170)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                "$\mathrm{Vertical\ Velocity\ Dispersion\ (km/s)}$", fontsize="large"
-            )
-            plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(pos_disp_vert_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    pos_disp_vert_xs[time][code],
-                    (pos_disp_vert_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{\sigma} - \mathrm{\bar \sigma})/\mathrm{\bar \sigma}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(pos_disp_vert_profiles[time]), axis=0)
-                    / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < pos_disp_vert_xs[time][0])
-                    & (pos_disp_vert_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            # plt.savefig("pos_disp_vert_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-            plt.clf()
-    if draw_star_pos_vel_PDF >= 1 and time != 0:
-        # fig_star_pos_vel_PDF[time].savefig("star_pos_vel_PDF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        if draw_star_pos_vel_PDF >= 2 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.04)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_vel_xs[time][code],
-                    star_pos_vel_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 270)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel("$\mathrm{Rotational\ Velocity\ (km/s)}$", fontsize="large")
-            plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(star_pos_vel_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_vel_xs[time][code],
-                    (star_pos_vel_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-0.5, 0.5)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{v} - \mathrm{\bar v})/\mathrm{\bar v}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(star_pos_vel_profiles[time]), axis=0) / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < star_pos_vel_xs[time][0])
-                    & (star_pos_vel_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            plt.savefig(
-                "star_pos_vel_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-        if draw_star_pos_vel_PDF >= 3 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.064)
-            fig = plt.figure(figsize=(8, 10))
-            gridspec.GridSpec(5, 1)
-            plt.subplot2grid((5, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_disp_xs[time][code],
-                    star_pos_disp_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 170)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel("$\mathrm{Velocity\ Dispersion\ (km/s)}$", fontsize="large")
-            plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((5, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(star_pos_disp_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_disp_xs[time][code],
-                    (star_pos_disp_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{\sigma} - \mathrm{\bar \sigma})/\mathrm{\bar \sigma}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(star_pos_disp_profiles[time]), axis=0)
-                    / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < star_pos_disp_xs[time][0])
-                    & (star_pos_disp_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            plt.savefig(
-                "star_pos_disp_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.subplot2grid((5, 1), (4, 0), rowspan=1)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_disp_xs[time][code],
-                    star_pos_disp_vert_profiles[time][code]
-                    / star_pos_disp_profiles[time][code],
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Ratio,}\/\mathrm{\sigma}_{\perp}/\mathrm{\sigma}$",
-                fontsize="large",
-            )
-            plt.savefig(
-                "star_pos_disp_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-        if draw_star_pos_vel_PDF == 4 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=0.064)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_disp_vert_xs[time][code],
-                    star_pos_disp_vert_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 170)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                "$\mathrm{Vertical\ Velocity\ Dispersion\ (km/s)}$", fontsize="large"
-            )
-            plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(star_pos_disp_vert_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    star_pos_disp_vert_xs[time][code],
-                    (star_pos_disp_vert_profiles[time][code] - ave_profiles)
-                    / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{\sigma} - \mathrm{\bar \sigma})/\mathrm{\bar \sigma}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(star_pos_disp_vert_profiles[time]), axis=0)
-                    / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < star_pos_disp_vert_xs[time][0])
-                    & (star_pos_disp_vert_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            # plt.savefig("star_pos_disp_vert_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-            plt.clf()
-    if draw_rad_height_PDF >= 1:
-        # fig_rad_height_PDF[time].savefig("rad_height_PDF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-        if draw_rad_height_PDF == 2 and time != 0:
-            plt.clf()
-            # 			plt.subplot(111, aspect=18)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    rad_height_xs[time][code],
-                    rad_height_profiles[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(0, 0.45)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel("$\mathrm{Average\ Vertical\ Height\ (kpc)}$", fontsize="large")
-            plt.legend(codes, loc=2, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(rad_height_profiles[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    rad_height_xs[time][code],
-                    (rad_height_profiles[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 1.0)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{h} - \mathrm{\bar h})/\mathrm{\bar h}$",
-                fontsize="large",
-            )
-            if add_mean_fractional_dispersion == 1:
-                mean_fractional_dispersion = (
-                    np.std(np.array(rad_height_profiles[time]), axis=0) / ave_profiles
-                )[
-                    (mean_dispersion_radius_range[0] < rad_height_xs[time][0])
-                    & (rad_height_xs[time][0] < mean_dispersion_radius_range[1])
-                ].mean()
-                mean_fractional_dispersion_in_dex = np.log10(
-                    1.0 + mean_fractional_dispersion
-                )
-                plt.annotate(
-                    "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                    % (
-                        mean_dispersion_radius_range[0],
-                        mean_dispersion_radius_range[1],
-                        mean_fractional_dispersion,
-                        mean_fractional_dispersion_in_dex,
-                    ),
-                    xy=(0.35, 0.08),
-                    size=10,
-                    xycoords="axes fraction",
-                )
-            plt.savefig(
-                "rad_height_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-    if draw_metal_PDF == 1:
-        fig_metal_PDF[time].savefig(
-            "metal_PDF_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-    if draw_density_DF >= 1:
-        #                 plt.clf()
-        # 		plt.subplot(111, aspect=1)
-        fig = plt.figure(figsize=(8, 8))
-        gridspec.GridSpec(4, 1)
-        plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                density_DF_xs[time][code],
-                density_DF_profiles[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogx()
-        plt.semilogy()
-        plt.xlim(1e-28, 1e-21)
-        plt.ylim(1e4, 1e9)  # accumulation=False
-        # plt.ylim(1e5, 2e10) # accumulation=True
-        if time != 0 and dataset_num == 2:
-            plt.axvline(
-                x=1.67e-24 * 10, color="k", linestyle="--", linewidth=2, alpha=0.7
-            )  # SF threshold density
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Mass,}\/\mathrm{d}M\mathrm{/dlog}\/\mathrm{\rho}\/\mathrm{(M_{\odot})}$",
-            fontsize="large",
-        )
-        plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-
-        plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-        ave_profiles = np.mean(np.array(density_DF_profiles[time]), axis=0)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                density_DF_xs[time][code],
-                (density_DF_profiles[time][code] - ave_profiles) / ave_profiles,
-                color=color_names[code],
-                linestyle="none",
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogx()
-        plt.xlim(1e-28, 1e-21)
-        plt.ylim(-1.0, 3.0)
-        plt.grid(True)
-        plt.locator_params(axis="y", nbins=4)
-        plt.xlabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Residual,}\/(\mathrm{m} - \mathrm{\bar m})/\mathrm{\bar m}$",
-            fontsize="large",
-        )
-        if add_mean_fractional_dispersion == 1:
-            mean_fractional_dispersion = (
-                np.std(np.array(density_DF_profiles[time]), axis=0) / ave_profiles
-            )[
-                (mean_dispersion_density_range[0] < density_DF_xs[time][0])
-                & (density_DF_xs[time][0] < mean_dispersion_density_range[1])
-            ].mean()
-            mean_fractional_dispersion_in_dex = np.log10(
-                1.0 + mean_fractional_dispersion
-            )
-            plt.annotate(
-                "Mean fractional dispersion for %.1e < rho < %.1e = %.3f (%.3f dex) "
-                % (
-                    mean_dispersion_density_range[0],
-                    mean_dispersion_density_range[1],
-                    mean_fractional_dispersion,
-                    mean_fractional_dispersion_in_dex,
-                ),
-                xy=(0.27, 0.84),
-                size=10,
-                xycoords="axes fraction",
-            )
-        plt.savefig(
-            "density_DF_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-        if draw_density_DF == 2 and time != 0 and dataset_num == 2:
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(16, 1)
-            plt.subplot2grid((16, 1), (0, 0), rowspan=9)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    density_DF_xs[time][code],
-                    (
-                        density_DF_profiles[time][code]
-                        - density_DF_1st_profiles[time][code]
-                    )
-                    / 1e8,
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xscale("log")
-            plt.xlim(1e-28, 1e-21)
-            plt.ylim(-7, 3)
-            plt.axvline(
-                x=1.67e-24 * 10, color="k", linestyle="--", linewidth=2, alpha=0.7
-            )  # SF threshold density
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Mass\ Change,}\/\mathrm{\Delta}(\mathrm{d}M\mathrm{/dlog}\/\mathrm{\rho})\/\mathrm{(10^8 M_{\odot})}$",
-                fontsize="large",
-            )
-            plt.legend(codes, loc=3, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((16, 1), (9, 0), rowspan=7)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    density_DF_xs[time][code],
-                    (
-                        density_DF_profiles[time][code]
-                        - density_DF_1st_profiles[time][code]
-                    )
-                    / 1e8,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathtt{symlog}[\/\mathrm{\Delta}(\mathrm{d}M\mathrm{/dlog}\/\mathrm{\rho})\/\mathrm{(10^8 M_{\odot})}\/]$",
-                fontsize="large",
-            )
-            plt.xscale("log")
-            plt.yscale("symlog", linthreshy=0.01)
-            plt.xlim(1e-28, 1e-21)
-            plt.ylim(-10, 10)
-            plt.axvline(
-                x=1.67e-24 * 10, color="k", linestyle="--", linewidth=2, alpha=0.7
-            )  # SF threshold density
-            plt.grid(True)
-            plt.savefig(
-                "density_DF_change_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-    if draw_radius_DF == 1:
-        plt.clf()
-        # 		plt.subplot(111, aspect=1)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                radius_DF_xs[time][code],
-                np.add.accumulate(radius_DF_profiles[time][code]),
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 14)
-        plt.ylim(1e7, 2e10)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Mass\ (M_{\odot})}$", fontsize="large")
-        plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        # plt.savefig("radius_DF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-
-        plt.clf()
-        # 		plt.subplot(111, aspect=1)
-        fig = plt.figure(figsize=(8, 8))
-        gridspec.GridSpec(4, 1)
-        plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-        for code in range(len(codes)):
-            temp = []
-            dr = 0.5 * (
-                radius_DF_xs[time][code][1] - radius_DF_xs[time][code][0]
-            )  # Here we assume that ProfilePlot was made with linearly binned radius_DF_xs
-            for radius in range(len(radius_DF_profiles[time][code])):
-                surface_area = np.pi * (
-                    ((radius_DF_xs[time][code][radius] + dr) * 1e3) ** 2
-                    - ((radius_DF_xs[time][code][radius] - dr) * 1e3) ** 2
-                )
-                temp.append(radius_DF_profiles[time][code][radius] / surface_area)
-            surface_density[time].append(temp)
-            lines = plt.plot(
-                radius_DF_xs[time][code],
-                surface_density[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 14)
-        plt.ylim(1e-1, 2e3)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Surface\ Density\ (M_{\odot}/pc^2)}$", fontsize="large")
-        plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-
-        plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-        ave_profiles = np.mean(np.array(surface_density[time]), axis=0)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                radius_DF_xs[time][code],
-                (surface_density[time][code] - ave_profiles) / ave_profiles,
-                color=color_names[code],
-                linestyle="none",
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, 14)
-        plt.ylim(-1.0, 1.0)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Residual,}\/(\mathrm{\Sigma} - \mathrm{\bar \Sigma})/\mathrm{\bar \Sigma}$",
-            fontsize="large",
-        )
-        if add_mean_fractional_dispersion == 1:
-            mean_fractional_dispersion = (
-                np.std(np.array(surface_density[time]), axis=0) / ave_profiles
-            )[
-                (mean_dispersion_radius_range[0] < radius_DF_xs[time][0])
-                & (radius_DF_xs[time][0] < mean_dispersion_radius_range[1])
-            ].mean()
-            mean_fractional_dispersion_in_dex = np.log10(
-                1.0 + mean_fractional_dispersion
-            )
-            plt.annotate(
-                "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                % (
-                    mean_dispersion_radius_range[0],
-                    mean_dispersion_radius_range[1],
-                    mean_fractional_dispersion,
-                    mean_fractional_dispersion_in_dex,
-                ),
-                xy=(0.35, 0.08),
-                size=10,
-                xycoords="axes fraction",
-            )
-        plt.savefig(
-            "gas_surface_density_radial_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-    if draw_star_radius_DF >= 1 and time != 0:
-        plt.clf()
-        # 		plt.subplot(111, aspect=1)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                star_radius_DF_xs[time][code],
-                np.add.accumulate(star_radius_DF_profiles[time][code]),
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 14)
-        plt.ylim(1e7, 2e10)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel(
-            "$\mathrm{Newly\ Formed\ Stellar\ Mass\ (M_{\odot})}$", fontsize="large"
-        )
-        plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        # plt.savefig("star_radius_DF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-
-        plt.clf()
-        # 		plt.subplot(111, aspect=1)
-        fig = plt.figure(figsize=(8, 8))
-        gridspec.GridSpec(4, 1)
-        plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-        for code in range(len(codes)):
-            temp = []
-            dr = 0.5 * (
-                star_radius_DF_xs[time][code][1] - star_radius_DF_xs[time][code][0]
-            )
-            for radius in range(len(star_radius_DF_profiles[time][code])):
-                surface_area = np.pi * (
-                    ((star_radius_DF_xs[time][code][radius] + dr) * 1e3) ** 2
-                    - ((star_radius_DF_xs[time][code][radius] - dr) * 1e3) ** 2
-                )
-                temp.append(star_radius_DF_profiles[time][code][radius] / surface_area)
-            star_surface_density[time].append(temp)
-            lines = plt.plot(
-                star_radius_DF_xs[time][code],
-                star_surface_density[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 14)
-        plt.ylim(1e-1, 2e3)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel(
-            "$\mathrm{Newly\ Formed\ Stellar\ Surface\ Density\ (M_{\odot}/pc^2)}$",
-            fontsize="large",
-        )
-        plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-
-        plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-        ave_profiles = np.mean(np.array(star_surface_density[time]), axis=0)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                star_radius_DF_xs[time][code],
-                (star_surface_density[time][code] - ave_profiles) / ave_profiles,
-                color=color_names[code],
-                linestyle="none",
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, 14)
-        plt.ylim(-1.0, 3.0)
-        plt.grid(True)
-        plt.locator_params(axis="y", nbins=4)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Residual,}\/(\mathrm{\Sigma} - \mathrm{\bar \Sigma})/\mathrm{\bar \Sigma}$",
-            fontsize="large",
-        )
-        if add_mean_fractional_dispersion == 1:
-            mean_fractional_dispersion = (
-                np.std(np.array(star_surface_density[time]), axis=0) / ave_profiles
-            )[
-                (mean_dispersion_radius_range[0] < star_radius_DF_xs[time][0])
-                & (star_radius_DF_xs[time][0] < mean_dispersion_radius_range[1])
-            ].mean()
-            mean_fractional_dispersion_in_dex = np.log10(
-                1.0 + mean_fractional_dispersion
-            )
-            plt.annotate(
-                "Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) "
-                % (
-                    mean_dispersion_radius_range[0],
-                    mean_dispersion_radius_range[1],
-                    mean_fractional_dispersion,
-                    mean_fractional_dispersion_in_dex,
-                ),
-                xy=(0.02, 0.84),
-                size=10,
-                xycoords="axes fraction",
-            )
-        plt.savefig(
-            "star_surface_density_radial_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-
-        if draw_star_radius_DF == 2 and time != 0:
-            # 			plt.subplot(111, aspect=1)
-            fig = plt.figure(figsize=(8, 8))
-            gridspec.GridSpec(4, 1)
-            plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-            plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-            for code in range(len(codes)):
-                temp = []
-                dr = 0.5 * (
-                    sfr_radius_DF_xs[time][code][1] - sfr_radius_DF_xs[time][code][0]
-                )
-                for radius in range(len(sfr_radius_DF_profiles[time][code])):
-                    surface_area = np.pi * (
-                        (sfr_radius_DF_xs[time][code][radius] + dr) ** 2
-                        - (sfr_radius_DF_xs[time][code][radius] - dr) ** 2
-                    )
-                    temp.append(
-                        sfr_radius_DF_profiles[time][code][radius] / surface_area
-                    )
-                sfr_surface_density[time].append(temp)
-                lines = plt.plot(
-                    sfr_radius_DF_xs[time][code],
-                    sfr_surface_density[time][code],
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.semilogy()
-            plt.xlim(0, 14)
-            plt.ylim(1e-4, 1e1)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                "$\mathrm{Star\ Formation\ Rate\ Surface\ Density\ (M_{\odot}/yr/kpc^2)}$",
-                fontsize="large",
-            )
-            plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-
-            plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-            ave_profiles = np.mean(np.array(sfr_surface_density[time]), axis=0)
-            for code in range(len(codes)):
-                lines = plt.plot(
-                    sfr_radius_DF_xs[time][code],
-                    (sfr_surface_density[time][code] - ave_profiles) / ave_profiles,
-                    color=color_names[code],
-                    linestyle="none",
-                    marker=marker_names[code],
-                    markeredgecolor="none",
-                    linewidth=1.2,
-                    alpha=0.8,
-                )
-            plt.xlim(0, 14)
-            plt.ylim(-1.0, 3.0)
-            plt.grid(True)
-            plt.locator_params(axis="y", nbins=4)
-            plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-            plt.ylabel(
-                r"$\mathrm{Residual,}\/(\mathrm{\Sigma} - \mathrm{\bar \Sigma})/\mathrm{\bar \Sigma}$",
-                fontsize="large",
-            )
-            # if add_mean_fractional_dispersion == 1:
-            #       mean_fractional_dispersion = (np.std(np.array(sfr_surface_density[time]), axis=0)/ave_profiles)[(mean_dispersion_radius_range[0] < sfr_radius_DF_xs[time][0]) & (sfr_radius_DF_xs[time][0] < mean_dispersion_radius_range[1])].mean()
-            #       mean_fractional_dispersion_in_dex = np.log10(1.+mean_fractional_dispersion)
-            #       plt.annotate("Mean fractional dispersion for %d < r < %d kpc = %.3f (%.3f dex) " % (mean_dispersion_radius_range[0], mean_dispersion_radius_range[1], mean_fractional_dispersion, mean_fractional_dispersion_in_dex), xy=(0.02, 0.84), size=10, xycoords='axes fraction')
-            plt.savefig(
-                "sfr_surface_density_radial_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-
-            # Draw K-S plot; below assumes that surface_density (or radius_DF_profiles) and sfr_surface_density (or sfr_radius_DF_profiles) have the identical size (n_bins in ProfilePlot)
-            # 			plt.subplot(111)
-            fig = plt.figure(figsize=(8, 7))
-            KS_fit_t1 = []
-            KS_fit_t2 = []
-            Bigiel_surface_density = []
-            Bigiel_sfr_surface_density = []
-            for code in range(len(codes)):
-                # Remove bins where SFR surface density is zero
-                KS_x = np.array(surface_density[time][code])
-                KS_x[np.where(np.array(sfr_surface_density[time][code]) < 1e-10)] = 0
-                KS_x = np.log10(KS_x)
-                KS_y = np.log10(np.array(sfr_surface_density[time][code]))
-                KS_x = KS_x[~np.isinf(KS_x)]
-                KS_y = KS_y[~np.isinf(KS_y)]
-                t1, t2 = np.polyfit(KS_x, KS_y, 1)
-                KS_fit_t1.append(t1)
-                KS_fit_t2.append(t2)
-                plt.scatter(
-                    KS_x,
-                    KS_y,
-                    color=color_names[code],
-                    edgecolor=color_names[code],
-                    s=30,
-                    linewidth=0.7,
-                    marker=marker_names[code],
-                    alpha=0.8,
-                )
-            plt.xlim(0, 3)
-            plt.ylim(-4, 1)
-            plt.grid(True)
-            plt.xlabel("$\mathrm{log[Gas\ Surface\ Density\ (M_{\odot}/pc^2)]}$")
-            plt.ylabel(
-                "$\mathrm{log[Star\ Formation\ Rate\ Surface\ Density\ (M_{\odot}/yr/kpc^2)]}$"
-            )
-            plt.legend(codes, loc=2, frameon=True, ncol=2, fancybox=True)
-            leg = plt.gca().get_legend()
-            ltext = leg.get_texts()
-            plt.setp(ltext, fontsize="small")
-            t = np.arange(-2, 5, 0.01)
-            # for line in import_text("./Bigieletal2008_Fig8_Contour.txt", " "):
-            #         Bigiel_surface_density.append(float(line[0]) + np.log10(1.36)) # for the factor 1.36, see Section 2.3.1 of Bigiel et al. 2008
-            #         Bigiel_sfr_surface_density.append(float(line[1]))
-            # plt.fill(Bigiel_surface_density, Bigiel_sfr_surface_density, fill=True, color='b', alpha = 0.1, hatch='\\') # contour by Bigiel et al. 2008 (Fig 8), or Feldmann et al. 2012 (Fig 1)
-            # 			plt.plot(Bigiel_surface_density, Bigiel_sfr_surface_density, 'b-', linewidth = 0.7, alpha = 0.4)
-            plt.plot(
-                t, 1.37 * t - 3.78, "k--", linewidth=2, alpha=0.7
-            )  # observational fit by Kennicutt et al. 2007
-            # plt.savefig("K-S_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-            for code in range(len(codes)):
-                plt.plot(
-                    t,
-                    np.polyval([KS_fit_t1[code], KS_fit_t2[code]], t),
-                    color=color_names[code],
-                    linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                    alpha=0.7,
-                )  # linear fits
-            plt.savefig(
-                "K-S_with_fits_%dMyr" % times[time],
-                bbox_inches="tight",
-                pad_inches=0.03,
-                dpi=300,
-            )
-            plt.clf()
-    if draw_height_DF == 1:
-        plt.clf()
-        # 		plt.subplot(111, aspect=0.5)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                height_DF_xs[time][code],
-                np.add.accumulate(height_DF_profiles[time][code]),
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 1.4)
-        plt.ylim(1e9, 2e10)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Vertical\ Height\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Mass\ (M_{\odot})}$", fontsize="large")
-        plt.legend(codes, loc=4, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        # plt.savefig("height_DF_%dMyr" % times[time], bbox_inches='tight', pad_inches=0.03, dpi=300)
-
-        plt.clf()
-        # 		plt.subplot(111, aspect=0.8)
-        fig = plt.figure(figsize=(8, 8))
-        gridspec.GridSpec(4, 1)
-        plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-        for code in range(len(codes)):
-            temp = []
-            dh = height_DF_xs[time][code][1] - height_DF_xs[time][code][0]
-            for height in range(len(height_DF_profiles[time][code])):
-                surface_area = (
-                    2 * dh * 1e3 * figure_width * 1e3
-                )  # surface_area = 2*d(height)*figure_width in pc^2
-                temp.append(height_DF_profiles[time][code][height] / surface_area)
-            height_surface_density[time].append(temp)
-            lines = plt.plot(
-                height_DF_xs[time][code],
-                height_surface_density[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(0, 1.4)
-        plt.ylim(1e-1, 2e3)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Vertical\ Height\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Surface\ Density\ (M_{\odot}/pc^2)}$", fontsize="large")
-        plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-
-        plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-        ave_profiles = np.mean(np.array(height_surface_density[time]), axis=0)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                height_DF_xs[time][code],
-                (height_surface_density[time][code] - ave_profiles) / ave_profiles,
-                color=color_names[code],
-                linestyle="none",
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, 1.4)
-        plt.ylim(-1.0, 3.0)
-        plt.grid(True)
-        plt.locator_params(axis="y", nbins=4)
-        plt.xlabel("$\mathrm{Vertical\ Height\ (kpc)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Residual,}\/(\mathrm{\Sigma} - \mathrm{\bar \Sigma})/\mathrm{\bar \Sigma}$",
-            fontsize="large",
-        )
-        if add_mean_fractional_dispersion == 1:
-            mean_fractional_dispersion = (
-                np.std(np.array(height_surface_density[time]), axis=0) / ave_profiles
-            )[
-                (mean_dispersion_height_range[0] < height_DF_xs[time][0])
-                & (height_DF_xs[time][0] < mean_dispersion_height_range[1])
-            ].mean()
-            mean_fractional_dispersion_in_dex = np.log10(
-                1.0 + mean_fractional_dispersion
-            )
-            plt.annotate(
-                "Mean fractional dispersion for %.1f < z < %.1f kpc = %.3f (%.3f dex) "
-                % (
-                    mean_dispersion_height_range[0],
-                    mean_dispersion_height_range[1],
-                    mean_fractional_dispersion,
-                    mean_fractional_dispersion_in_dex,
-                ),
-                xy=(0.02, 0.84),
-                size=10,
-                xycoords="axes fraction",
-            )
-        plt.savefig(
-            "gas_surface_density_vertical_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-    if draw_SFR >= 1 and time != 0:
-        plt.clf()
-        # 		plt.subplot(111)#, aspect=1e-7)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                sfr_ts[time][code],
-                sfr_cum_masses[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, times[time])
-        plt.ylim(0, 2.5e9)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Time\ (Myr)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Stellar\ Mass\ (M_{\odot})}$", fontsize="large")
-        plt.legend(codes, loc=2, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        plt.savefig(
-            "Stellar_mass_evolution_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-        # 		plt.subplot(111, aspect=55)
-        fig = plt.figure(figsize=(8, 8))
-        gridspec.GridSpec(4, 1)
-        plt.subplot2grid((4, 1), (0, 0), rowspan=3)
-        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                sfr_ts[time][code],
-                sfr_sfrs[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, times[time])
-        plt.ylim(0, 8)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Time\ (Myr)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Star\ Formation\ Rate\ (M_{\odot}/yr)}$", fontsize="large")
-        if draw_SFR == 2:
-            pf_sfr_ref = load_dataset(
-                2,
-                1,
-                0,
-                ["GIZMO"],
-                [
-                    [
-                        "dummy",
-                        "/lustre/ki/pfs/mornkr/080112_CHaRGe/pfs-hyades/AGORA-DISK-repository/Grackle+SF+ThermalFbck/GIZMO/AGORA_disk_second_ps1.5/snapshot_temp_100_last",
-                    ]
-                ],
-            )
-            pf_sfr_ref.unit_registry.add(
-                "pccm", pf_sfr_ref.unit_registry.lut["pc"][0], length, "\\rm{pc}/(1+z)"
-            )
-            pf_sfr_ref.hubble_constant = 0.71
-            pf_sfr_ref.omega_lambda = 0.73
-            pf_sfr_ref.omega_matter = 0.27
-            pf_sfr_ref.omega_curvature = 0.0
-            sp_sfr_ref = pf_sfr_ref.sphere(center, (0.5 * figure_width, "kpc"))
-            draw_SFR_mass_ref = sp_sfr_ref[
-                (PartType_Star_to_use, "particle_mass")
-            ].in_units("Msun")
-            draw_SFR_ct_ref = sp_sfr_ref[
-                (PartType_Star_to_use, FormationTimeType_to_use)
-            ].in_units("Myr")
-            sfr_ref = StarFormationRate(
-                pf_sfr_ref,
-                star_mass=draw_SFR_mass_ref,
-                star_creation_time=draw_SFR_ct_ref,
-                volume=sp_sfr_ref.volume(),
-                bins=25,
-            )
-            lines = plt.plot(
-                sfr_ref.time.in_units("Myr"),
-                sfr_ref.Msol_yr,
-                color="k",
-                linestyle="--",
-                marker="*",
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.legend(codes + ["GIZMO-ps2"], loc=2, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        plt.subplot2grid((4, 1), (3, 0), rowspan=1)
-        ave_profiles = np.mean(np.array(sfr_sfrs[time]), axis=0)
-        for code in range(len(codes)):
-            lines = plt.plot(
-                sfr_ts[time][code],
-                (sfr_sfrs[time][code].d - ave_profiles) / ave_profiles,
-                color=color_names[code],
-                linestyle="none",
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.xlim(0, times[time])
-        plt.ylim(-1.0, 1.0)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Time\ (Myr)}$", fontsize="large")
-        plt.ylabel(
-            r"$\mathrm{Residual,}\/(\mathrm{\dot{\rho}_\star} - \mathrm{\bar{\dot{\rho}_\star}})/\mathrm{\bar{\dot{\rho}_\star}}$",
-            fontsize="large",
-        )
-        if add_mean_fractional_dispersion == 1:
-            mean_fractional_dispersion = (
-                np.std(np.array(sfr_sfrs[time]), axis=0) / ave_profiles
-            )[
-                (mean_dispersion_time_range[0] < sfr_ts[time][0])
-                & (sfr_ts[time][0] < mean_dispersion_time_range[1])
-            ].mean()
-            mean_fractional_dispersion_in_dex = np.log10(
-                1.0 + mean_fractional_dispersion
-            )
-            plt.annotate(
-                "Mean fractional dispersion for %d < t < %d Myr = %.3f (%.3f dex) "
-                % (
-                    mean_dispersion_time_range[0],
-                    mean_dispersion_time_range[1],
-                    mean_fractional_dispersion,
-                    mean_fractional_dispersion_in_dex,
-                ),
-                xy=(0.35, 0.08),
-                size=10,
-                xycoords="axes fraction",
-            )
-        plt.savefig(
-            "SFR_%dMyr" % times[time], bbox_inches="tight", pad_inches=0.03, dpi=300
-        )
-        plt.clf()
-    if draw_cut_through == 1:
-        plt.clf()
-        # 		plt.subplot(111, aspect=0.5)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                cut_through_zs[time][code],
-                cut_through_zvalues[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(-1.4, 1.4)
-        plt.ylim(1e-26, 1e-22)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Vertical\ Height\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-        plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        z = np.arange(-1.4, 1.4, 0.05)
-        plt.plot(
-            z,
-            rho_agora_disk(0, np.abs(z)),
-            linestyle="--",
-            linewidth=2,
-            color="k",
-            alpha=0.7,
-        )
-        plt.savefig(
-            "cut_through_z_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()
-        # 		plt.subplot(111, aspect=0.5)
-        fig = plt.figure(figsize=(8, 6))
-        for code in range(len(codes)):
-            lines = plt.plot(
-                cut_through_xs[time][code],
-                cut_through_xvalues[time][code],
-                color=color_names[code],
-                linestyle=linestyle_names[np.mod(code, len(linestyle_names))],
-                marker=marker_names[code],
-                markeredgecolor="none",
-                linewidth=1.2,
-                alpha=0.8,
-            )
-        plt.semilogy()
-        plt.xlim(-14, 14)
-        plt.ylim(1e-26, 1e-22)
-        plt.grid(True)
-        plt.xlabel("$\mathrm{Cylindrical\ Radius\ (kpc)}$", fontsize="large")
-        plt.ylabel("$\mathrm{Density\ (g/cm^3)}$", fontsize="large")
-        plt.legend(codes, loc=1, frameon=True, ncol=2, fancybox=True)
-        leg = plt.gca().get_legend()
-        ltext = leg.get_texts()
-        plt.setp(ltext, fontsize="small")
-        x = np.arange(-14, 14, 0.05)
-        plt.plot(
-            x,
-            rho_agora_disk(np.abs(x), 0),
-            linestyle="--",
-            linewidth=2,
-            color="k",
-            alpha=0.7,
-        )
-        plt.savefig(
-            "cut_through_x_%dMyr" % times[time],
-            bbox_inches="tight",
-            pad_inches=0.03,
-            dpi=300,
-        )
-        plt.clf()