Repository: zincware/MDSuite (language: python)

Issue:
`run_computation` autocomplete does not work outside of jupyter notebooks
already fixed in 9cbbc44 and beyond in #301 

removes the possiblity to run `run_computation('RadialDistributionFunction, **kwargs)` in favor of `run_computation.RadialDistributionFunction`



Discussion / hints:

Fix patch:
diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 00000000..7f5ac988
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,15 @@
+[run]
+branch = True
+
+[report]
+# Regexes for lines to exclude from consideration
+omit =
+# omit anything in a Temp directory anywhere
+    */Temp/*
+    */AppData/*
+    */CI/*
+
+ignore_errors = True
+
+[html]
+directory = coverage_html_report
diff --git a/.gitignore b/.gitignore
index d1fce637..f303af4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -166,3 +166,4 @@ log.lammps
 *.hdf5
 *.pdf
 ./tutorials/data/trajectory_files
+/coverage_html_report/
diff --git a/mdsuite/__init__.py b/mdsuite/__init__.py
index b70f45b1..43668d6b 100644
--- a/mdsuite/__init__.py
+++ b/mdsuite/__init__.py
@@ -13,7 +13,7 @@
 import os
 import sys
 from .project import Project
-from .experiment.experiment import Experiment
+from .experiment import Experiment
 from .graph_modules import adjacency_matrix
 from .utils.report_computer_characteristics import Report
 
diff --git a/mdsuite/calculators/__init__.py b/mdsuite/calculators/__init__.py
index 0176d715..b272b96a 100644
--- a/mdsuite/calculators/__init__.py
+++ b/mdsuite/calculators/__init__.py
@@ -9,3 +9,143 @@
 
 __init__ module for the analysis directory
 """
+from __future__ import annotations
+
+from .calculator import Calculator
+from .angular_distribution_function import AngularDistributionFunction
+from .coordination_number_calculation import CoordinationNumbers
+from .einstein_diffusion_coefficients import EinsteinDiffusionCoefficients
+from .einstein_distinct_diffusion_coefficients import EinsteinDistinctDiffusionCoefficients
+from .einstein_helfand_ionic_conductivity import EinsteinHelfandIonicConductivity
+from .einstein_helfand_thermal_conductivity import EinsteinHelfandThermalConductivity
+from .einstein_helfand_thermal_kinaci import EinsteinHelfandThermalKinaci
+from .green_kubo_viscosity_flux import GreenKuboViscosityFlux
+from .green_kubo_distinct_diffusion_coefficients import GreenKuboDistinctDiffusionCoefficients
+from .green_kubo_ionic_conductivity import GreenKuboIonicConductivity
+from .green_kubo_self_diffusion_coefficients import GreenKuboSelfDiffusionCoefficients
+from .green_kubo_thermal_conductivity import GreenKuboThermalConductivity
+from .green_kubo_viscosity import GreenKuboViscosity
+from .kirkwood_buff_integrals import KirkwoodBuffIntegral
+from .nernst_einstein_ionic_conductivity import NernstEinsteinIonicConductivity
+from .potential_of_mean_force import PotentialOfMeanForce
+from .radial_distribution_function import RadialDistributionFunction
+from .structure_factor import StructureFactor
+
+from typing import TYPE_CHECKING, List
+
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
+
+__all__ = ['Calculator', 'AngularDistributionFunction', 'CoordinationNumbers', 'EinsteinDiffusionCoefficients',
+           'EinsteinDistinctDiffusionCoefficients', 'EinsteinHelfandIonicConductivity',
+           'EinsteinHelfandThermalConductivity', 'EinsteinHelfandThermalKinaci', 'GreenKuboViscosityFlux',
+           'GreenKuboDistinctDiffusionCoefficients', 'GreenKuboIonicConductivity', 'GreenKuboSelfDiffusionCoefficients',
+           'GreenKuboThermalConductivity', 'GreenKuboViscosity', 'KirkwoodBuffIntegral',
+           'NernstEinsteinIonicConductivity', 'PotentialOfMeanForce', 'RadialDistributionFunction', 'StructureFactor']
+
+
+class RunComputation:
+    """Collection of all calculators that can be used by an experiment"""
+
+    def __init__(self, experiment: Experiment = None, experiments: List[Experiment] = None, load_data: bool = False):
+        """Collection of all calculators
+
+        Parameters
+        ----------
+        experiment: Experiment
+            Experiment to run the computations for
+        """
+        self.experiment = experiment
+        self.experiments = experiments
+
+        self.kwargs = {'experiment': experiment, 'experiments': experiments, 'load_data': load_data}
+
+    @property
+    def AngularDistributionFunction(self):
+        """Calculator Property"""
+        return AngularDistributionFunction(**self.kwargs)
+
+    @property
+    def CoordinationNumbers(self):
+        """Calculator Property"""
+        return CoordinationNumbers(**self.kwargs)
+
+    @property
+    def EinsteinDiffusionCoefficients(self):
+        """Calculator Property"""
+        return EinsteinDiffusionCoefficients(**self.kwargs)
+
+    @property
+    def EinsteinDistinctDiffusionCoefficients(self):
+        """Calculator Property"""
+        return EinsteinDistinctDiffusionCoefficients(**self.kwargs)
+
+    @property
+    def EinsteinHelfandIonicConductivity(self):
+        """Calculator Property"""
+        return EinsteinHelfandIonicConductivity(**self.kwargs)
+
+    @property
+    def EinsteinHelfandThermalKinaci(self):
+        """Calculator Property"""
+        return EinsteinHelfandThermalKinaci(**self.kwargs)
+
+    @property
+    def GreenKuboViscosityFlux(self):
+        """Calculator Property"""
+        return GreenKuboViscosityFlux(**self.kwargs)
+
+    @property
+    def GreenKuboDistinctDiffusionCoefficients(self):
+        """Calculator Property"""
+        return GreenKuboDistinctDiffusionCoefficients(**self.kwargs)
+
+    @property
+    def GreenKuboIonicConductivity(self):
+        """Calculator Property"""
+        return GreenKuboIonicConductivity(**self.kwargs)
+
+    @property
+    def GreenKuboSelfDiffusionCoefficients(self):
+        """Calculator Property"""
+        return GreenKuboSelfDiffusionCoefficients(**self.kwargs)
+
+    @property
+    def GreenKuboThermalConductivity(self):
+        """Calculator Property"""
+        return GreenKuboThermalConductivity(**self.kwargs)
+
+    @property
+    def GreenKuboViscosity(self):
+        """Calculator Property"""
+        return GreenKuboViscosity(**self.kwargs)
+
+    @property
+    def KirkwoodBuffIntegral(self):
+        """Calculator Property"""
+        return KirkwoodBuffIntegral(**self.kwargs)
+
+    @property
+    def NernstEinsteinIonicConductivity(self):
+        """Calculator Property"""
+        return NernstEinsteinIonicConductivity(**self.kwargs)
+
+    @property
+    def PotentialOfMeanForce(self):
+        """Calculator Property"""
+        return PotentialOfMeanForce(**self.kwargs)
+
+    @property
+    def RadialDistributionFunction(self):
+        """Calculator Property"""
+        return RadialDistributionFunction(**self.kwargs)
+
+    @property
+    def StructureFactor(self):
+        """Calculator Property"""
+        return StructureFactor(**self.kwargs)
+
+    @property
+    def EinsteinHelfandThermalConductivity(self):
+        """Calculator Property"""
+        return EinsteinHelfandThermalConductivity(**self.kwargs)
diff --git a/mdsuite/calculators/angular_distribution_function.py b/mdsuite/calculators/angular_distribution_function.py
index 27f12c91..4bd77db2 100644
--- a/mdsuite/calculators/angular_distribution_function.py
+++ b/mdsuite/calculators/angular_distribution_function.py
@@ -13,7 +13,7 @@
 import itertools
 import numpy as np
 from tqdm import tqdm
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.neighbour_list import get_neighbour_list, get_triu_indicies, get_triplets
 from mdsuite.utils.linalg import get_angles
 import matplotlib.pyplot as plt
@@ -63,7 +63,7 @@ class AngularDistributionFunction(Calculator, ABC):
                                                            use_tf_function = False)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Compute the Angular Distribution Function for all species combinations
 
@@ -72,7 +72,7 @@ def __init__(self, experiment):
         experiment : object
                 Experiment object from which to take attributes.
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'quadratic': {'outer_scale_factor': 10}}
         self.loaded_property = 'Positions'
 
@@ -98,6 +98,7 @@ def __init__(self, experiment):
         self.x_label = r'Angle ($\theta$)'
         self.y_label = 'ADF /a.u.'
 
+    @call
     def __call__(self, batch_size: int = 1,
                  n_minibatches: int = 50,
                  n_confs: int = 5,
@@ -163,12 +164,6 @@ def __call__(self, batch_size: int = 1,
         self.bin_range = [0.0, 3.15]  # from 0 to a chemists pi
         self.norm_power = norm_power
 
-        # Run the analysis and save it.
-        out = self.run_analysis()
-        self.experiment.save_class()
-
-        return out
-
     def _check_inputs(self):
         """
         Check the inputs and set defaults if necessary.
diff --git a/mdsuite/calculators/calculator.py b/mdsuite/calculators/calculator.py
index 6160d102..1aac583b 100644
--- a/mdsuite/calculators/calculator.py
+++ b/mdsuite/calculators/calculator.py
@@ -23,6 +23,7 @@
 import matplotlib.figure
 import matplotlib.pyplot as plt
 from matplotlib.axes._subplots import Axes
+from pathlib import Path
 import tensorflow as tf
 import pandas as pd
 from scipy.optimize import curve_fit
@@ -33,8 +34,7 @@
 from mdsuite.database.simulation_database import Database
 from mdsuite.calculators.transformations_reference import \
     switcher_transformations
-from mdsuite.database.properties_database import PropertiesDatabase
-from mdsuite.database.analysis_database import AnalysisDatabase
+from mdsuite.database.calculator_database import CalculatorDatabase
 from tqdm import tqdm
 from typing import Union, List, Any
 
@@ -46,7 +46,57 @@
 log = logging.getLogger(__file__)
 
 
-class Calculator(metaclass=abc.ABCMeta):
+def call(func):
+    """Decorator for the calculator call method
+
+    This decorator provides a unified approach for handling run_computation and load_data for a single or multiple
+    experiments.
+    It handles the `run_computation()` method, iterates over experiments and loads data if requested!
+    Therefore, the __call__ method does not and can not return any values anymore!
+
+    Parameters
+    ----------
+    func: Calculator.__call__ method
+
+    Returns
+    -------
+    decorated __call__ method
+
+    """
+
+    def inner(self, *args, **kwargs):
+        """Manage the call method
+
+        Parameters
+        ----------
+        self: Calculator
+
+
+        Returns
+        -------
+        data:
+            A dictionary of shape {name: data} for multiple len(experiments) > 1 or otherwise just data
+        """
+        out = {}
+        for experiment in self.experiments:
+            self.experiment = experiment
+            func(self, *args, **kwargs)
+            if self.load_data:
+                out[self.experiment.name] = self.experiment.export_property_data(
+                    {"Analysis": self.analysis_name, "experiment": self.experiment.name}
+                )
+            else:
+                out[self.experiment.name] = self.run_analysis()
+
+        if len(self.experiments) > 1:
+            return out
+        else:
+            return out[self.experiment.name]
+
+    return inner
+
+
+class Calculator(CalculatorDatabase):
     """
     Parent class for analysis modules
 
@@ -72,15 +122,10 @@ class Calculator(metaclass=abc.ABCMeta):
             parallel implementations
     """
 
-    def __init__(self,
-                 experiment: Experiment,
-                 plot: bool = True,
-                 save: bool = True,
-                 data_range: int = 500,
-                 correlation_time: int = 1,
-                 atom_selection: object = np.s_[:],
-                 export: bool = True,
-                 gpu: bool = False):
+    def __init__(self, experiment: Experiment = None, experiments: List[Experiment] = None, plot: bool = True,
+                 save: bool = True, data_range: int = 500,
+                 correlation_time: int = 1, atom_selection: object = np.s_[:], export: bool = True, gpu: bool = False,
+                 load_data: bool = False):
         """
         Constructor for the calculator class.
 
@@ -88,6 +133,8 @@ def __init__(self,
         ----------
         experiment : Experiment
                 Experiment object to update.
+        experiments: List[Experiment]:
+                List of experiments, for that the calculation should be executed
         plot : bool
                 If true, analysis is plotted.
         save : bool
@@ -97,7 +144,7 @@ def __init__(self,
         correlation_time : int
                 Correlation time to use in the analysis.
         atom_selection : np.s_
-                Atoms to peform the analysis on.
+                Atoms to perform the analysis on.
         export : bool
                 If true, analysis results are exported to a csv file.
         gpu : bool
@@ -105,17 +152,23 @@ def __init__(self,
                 GPU.
         """
         # Set upon instantiation of parent class
+        super().__init__(experiment)
         self.experiment: Experiment = experiment
+        self.experiments: List[Experiment] = experiments
+
+        # Setting the experiment value supersedes setting experiments
+        if self.experiment is not None:
+            self.experiments = [self.experiment]
+
         self.data_range = data_range
         self.plot = plot
         self.save = save
         self.export = export
         self.atom_selection = atom_selection
         self.correlation_time = correlation_time
-        self.database = Database(
-            name=os.path.join(self.experiment.database_path,
-                              "database.hdf5"))
+        self.database = None
         self.gpu = gpu
+        self.load_data = load_data
 
         # Set to default by class, over-written in child classes or during operations
         self.system_property = False
@@ -157,11 +210,6 @@ def __init__(self,
         # Properties
         self._dtype = tf.float64
 
-        # Prevent $DISPLAY warnings on clusters.
-        if self.experiment.cluster_mode:
-            import matplotlib
-            matplotlib.use('Agg')
-
     def update_user_args(self,
                          plot: bool = True,
                          save: bool = True,
@@ -170,7 +218,9 @@ def update_user_args(self,
                          atom_selection: object = np.s_[:],
                          tau_values: Union[int, List, Any] = np.s_[:],
                          export: bool = True,
-                         gpu: bool = False):
+                         gpu: bool = False,
+                         *args,
+                         **kwargs):
         """
         Update the user args that are given by the __call__ method of the
         calculator.
@@ -193,6 +243,15 @@ def update_user_args(self,
                 If true, reduce memory usage to what is allowed on the system
                 GPU.
         """
+        # everything related to self.experiment can not be in the __init__ because there can be multiple experiments
+        self.database = Database(
+            name=Path(self.experiment.database_path, "database.hdf5").as_posix())
+
+        # Prevent $DISPLAY warnings on clusters.
+        if self.experiment.cluster_mode:
+            import matplotlib
+            matplotlib.use('Agg')
+
         self.data_range = data_range
         self.plot = plot
         self.save = save
@@ -520,10 +579,10 @@ def _save_data(self, name: str, data: pd.DataFrame):
         data : pd.DataFrame
                 Data to be saved.
         """
-        database = AnalysisDatabase(
-            name=os.path.join(self.experiment.database_path,
-                              "analysis_database"))
-        database.add_data(name=name, data_frame=data)
+        # database = AnalysisDatabase(
+        #     name=os.path.join(self.experiment.database_path,
+        #                       "analysis_database"))
+        # database.add_data(name=name, data_frame=data)
 
     def _plot_fig(self,
                   fig: matplotlib.figure.Figure,
@@ -670,10 +729,15 @@ def _update_properties_file(self, parameters: dict,
         """
         Update the experiment properties YAML file.
         """
-        database = PropertiesDatabase(
-            name=os.path.join(self.experiment.database_path,
-                              'property_database'))
-        database.add_data(parameters, delete_duplicate)
+        log.warning("Using depreciated method `_update_properties_file` \t Please use `update_database` instead.")
+        self.update_database(parameters=parameters, delete_duplicate=delete_duplicate)
+        #
+        #
+        #
+        # database = PropertiesDatabase(
+        #     name=os.path.join(self.experiment.database_path,
+        #                       'property_database'))
+        # database.add_data(parameters, delete_duplicate)
 
     def _resolve_dependencies(self, dependency):
         """
@@ -880,3 +944,8 @@ def run_analysis(self):
     def dtype(self):
         """Get the dtype used for the calculator"""
         return self._dtype
+
+    # @property
+    # def data(self):
+    #     """Return the data that may have previously been generated with the same parameters"""
+    #     return self.experiment.export_property_data(parameters={"Analysis": self.name})
diff --git a/mdsuite/calculators/computations_dict.py b/mdsuite/calculators/computations_dict.py
index 4a6e55ae..3be62fb1 100644
--- a/mdsuite/calculators/computations_dict.py
+++ b/mdsuite/calculators/computations_dict.py
@@ -18,7 +18,7 @@
 from mdsuite.calculators.einstein_helfand_ionic_conductivity import EinsteinHelfandIonicConductivity
 from mdsuite.calculators.einstein_helfand_thermal_conductivity import EinsteinHelfandThermalConductivity
 from mdsuite.calculators.einstein_helfand_thermal_kinaci import EinsteinHelfandThermalKinaci
-from mdsuite.calculators.flux_viscosity import GreenKuboViscosityFlux
+from mdsuite.calculators.green_kubo_viscosity_flux import GreenKuboViscosityFlux
 from mdsuite.calculators.green_kubo_ionic_conductivity import GreenKuboIonicConductivity
 from mdsuite.calculators.green_kubo_self_diffusion_coefficients import GreenKuboSelfDiffusionCoefficients
 from mdsuite.calculators.green_kubo_thermal_conductivity import GreenKuboThermalConductivity
@@ -46,23 +46,13 @@
     'viscosity': {}
 }
 
-dict_classes_computations = {
-    'EinsteinDiffusionCoefficients': EinsteinDiffusionCoefficients,
-    'EinsteinDistinctDiffusionCoefficients': EinsteinDistinctDiffusionCoefficients,
-    'GreenKuboDiffusionCoefficients': GreenKuboSelfDiffusionCoefficients,
-    'GreenKuboDistinctDiffusionCoefficients': GreenKuboDistinctDiffusionCoefficients,
-    'GreenKuboIonicConductivity': GreenKuboIonicConductivity,
-    'EinsteinHelfandIonicConductivity': EinsteinHelfandIonicConductivity,
-    'RadialDistributionFunction': RadialDistributionFunction,
-    'CoordinationNumbers': CoordinationNumbers,
-    'PotentialOfMeanForce': PotentialOfMeanForce,
-    'KirkwoodBuffIntegral': KirkwoodBuffIntegral,
-    'GreenKuboThermalConductivity': GreenKuboThermalConductivity,
-    'StructureFactor': StructureFactor,
-    'EinsteinHelfandThermalConductivity': EinsteinHelfandThermalConductivity,
-    'GreenKuboViscosityFlux': GreenKuboViscosityFlux,
-    'GreenKuboViscosity': GreenKuboViscosity,
-    'AngularDistributionFunction': AngularDistributionFunction,
-    'NernstEinsteinIonicConductivity': NernstEinsteinIonicConductivity,
-    'EinsteinHelfandThermalKinaci': EinsteinHelfandThermalKinaci,
-}
+calculators = [EinsteinDiffusionCoefficients, EinsteinDistinctDiffusionCoefficients, GreenKuboSelfDiffusionCoefficients,
+               GreenKuboDistinctDiffusionCoefficients, GreenKuboIonicConductivity, EinsteinHelfandIonicConductivity,
+               RadialDistributionFunction, CoordinationNumbers, PotentialOfMeanForce, KirkwoodBuffIntegral,
+               GreenKuboThermalConductivity, StructureFactor, EinsteinHelfandThermalConductivity,
+               GreenKuboViscosityFlux,
+               GreenKuboViscosity, AngularDistributionFunction, NernstEinsteinIonicConductivity,
+               EinsteinHelfandThermalKinaci]
+
+dict_classes_computations = {calc.__name__: calc for calc in calculators}
+# TODO depreciate the dict_classes_computations and replace inside the modules with the respective .__name__ !
diff --git a/mdsuite/calculators/coordination_number_calculation.py b/mdsuite/calculators/coordination_number_calculation.py
index 1af2be8b..fa42710a 100644
--- a/mdsuite/calculators/coordination_number_calculation.py
+++ b/mdsuite/calculators/coordination_number_calculation.py
@@ -13,19 +13,15 @@
 -------
 """
 import logging
-import os
 import numpy as np
 import matplotlib.pyplot as plt
 from scipy.signal import find_peaks
 from typing import Union
 from mdsuite.utils.exceptions import NotApplicableToAnalysis, CannotPerformThisAnalysis
-from mdsuite.calculators.calculator import Calculator
-from mdsuite.database.properties_database import PropertiesDatabase
-from mdsuite.database.database_scheme import SystemProperty
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.meta_functions import golden_section_search
 from mdsuite.utils.meta_functions import apply_savgol_filter
 
-
 log = logging.getLogger(__file__)
 
 
@@ -69,7 +65,7 @@ class CoordinationNumbers(Calculator):
     experiment.run_computation.CoordinationNumbers(savgol_order = 2, savgol_window_length = 17)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor
 
@@ -79,7 +75,7 @@ def __init__(self, experiment):
                         Class object of the experiment.
         """
 
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.file_to_study = None
         self.rdf = None
         self.radii = None
@@ -96,33 +92,21 @@ def __init__(self, experiment):
         self.y_label = 'CN'
         self.analysis_name = 'Coordination_Numbers'
 
-        # Calculate the rdf if it has not been done already
-        if self.experiment.radial_distribution_function_state is False:
-            self.experiment.run_computation('RadialDistributionFunction', plot=True, n_batches=-1)
-
+    @call
     def __call__(self, plot: bool = True, save: bool = True, data_range: int = 1, export: bool = False,
                  savgol_order: int = 2, savgol_window_length: int = 17):
 
+        # TODO docstrings
+
+        # Calculate the rdf if it has not been done already
+        if self.experiment.radial_distribution_function_state is False:
+            self.experiment.run_computation.RadialDistributionFunction(plot=False, n_batches=-1)
+
         self.update_user_args(plot=plot, save=save, data_range=data_range, export=export)
 
         self.savgol_order = savgol_order
         self.savgol_window_length = savgol_window_length
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
-
-    def _get_rdf_data(self):
-        """
-        Fill the data_files list with filenames of the rdf tensor_values
-        """
-        database = PropertiesDatabase(name=os.path.join(self.experiment.database_path, 'property_database'))
-
-        return database.load_data({"property": "RDF"})
-
     def _get_density(self, species: str) -> float:
         """
         Use the species_tuple in front of the name to get information about the pair
@@ -133,24 +117,6 @@ def _get_density(self, species: str) -> float:
 
         return rdf_number_of_atoms / self.experiment.volume
 
-    def _load_rdf_from_file(self, system_property: SystemProperty):
-        """
-        Load the raw rdf tensor_values from a directory
-
-        Parameters
-        ----------
-        system_property: SystemProperty
-        """
-
-        radii = []
-        rdf = []
-        for _bin in system_property.data:
-            radii.append(_bin.x)
-            rdf.append(_bin.y)
-
-        self.radii = np.array(radii)
-        self.rdf = np.array(rdf)
-
     def _autocorrelation_time(self):
         """
         Not needed in this analysis
@@ -282,9 +248,9 @@ def run_post_generation_analysis(self):
             log.debug(f"Computing coordination numbers for {data.subjects}")
             self.data_range = data.data_range
             self._load_rdf_from_file(data)  # load the tensor_values from it
-            density = self._get_density(data.subjects[0].subject)  # calculate the density
+            density = self._get_density(data.subjects[0])  # calculate the density
 
-            self.species_tuple = "_".join([subject.subject for subject in data.subjects])
+            self.species_tuple = "_".join(data.subjects)
 
             self._integrate_rdf(density)  # integrate the rdf
             self._find_minimums()  # get the minimums of the rdf being studied
diff --git a/mdsuite/calculators/einstein_diffusion_coefficients.py b/mdsuite/calculators/einstein_diffusion_coefficients.py
index 80d08c2c..76b26424 100644
--- a/mdsuite/calculators/einstein_diffusion_coefficients.py
+++ b/mdsuite/calculators/einstein_diffusion_coefficients.py
@@ -16,6 +16,7 @@
 The methods in class can then be called by the Experiment.einstein_diffusion_coefficients method and all necessary
 calculations performed.
 """
+from __future__ import annotations
 import logging
 import matplotlib.pyplot as plt
 import numpy as np
@@ -23,9 +24,12 @@
 from typing import Union, Any, List
 from tqdm import tqdm
 import tensorflow as tf
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
-log = logging.getLogger(__name__)
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
 
 tqdm.monitor_interval = 0
 warnings.filterwarnings("ignore")
@@ -45,7 +49,7 @@ class EinsteinDiffusionCoefficients(Calculator):
 
     Attributes
     ----------
-    experiment :  object
+    experiment :  Experiment
             Experiment class to call from
     species : list
             Which species to perform the analysis on
@@ -67,16 +71,20 @@ class EinsteinDiffusionCoefficients(Calculator):
     experiment.run_computation.EinsteinDiffusionCoefficients(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
 
         Parameters
         ----------
-        experiment :  object
+        experiment :  Experiment
                 Experiment class to call from
+        experiments :  Experiment
+                Experiment classes to call from
+        load_data :  bool
+                whether to load data or not
         """
 
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'linear': {'scale_factor': 150}}
         self.loaded_property = 'Unwrapped_Positions'
         self.species = None
@@ -92,6 +100,7 @@ def __init__(self, experiment):
         self.species = list()
         log.info('starting Einstein Diffusion Computation')
 
+    @call
     def __call__(self, plot: bool = True,
                  species: list = None,
                  data_range: int = 100,
@@ -104,6 +113,8 @@ def __call__(self, plot: bool = True,
                  tau_values: Union[int, List, Any] = np.s_[:],
                  gpu: bool = False):
 
+        # TODO Docstrings!!
+
         self.update_user_args(plot=plot,
                               data_range=data_range,
                               save=save,
@@ -124,12 +135,6 @@ def __call__(self, plot: bool = True,
             else:
                 self.species = list(self.experiment.species)
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-
-        return out
-
     def _update_output_signatures(self):
         """
         After having run _prepare managers, update the output signatures.
diff --git a/mdsuite/calculators/einstein_distinct_diffusion_coefficients.py b/mdsuite/calculators/einstein_distinct_diffusion_coefficients.py
index 21b4001f..6fb320b5 100644
--- a/mdsuite/calculators/einstein_distinct_diffusion_coefficients.py
+++ b/mdsuite/calculators/einstein_distinct_diffusion_coefficients.py
@@ -23,7 +23,7 @@
 import tensorflow as tf
 import itertools
 import matplotlib.pyplot as plt
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.meta_functions import join_path
 
 # Set style preferences, turn off warning, and suppress the duplication of loading bars.
@@ -58,7 +58,7 @@ class EinsteinDistinctDiffusionCoefficients(Calculator):
     experiment.run_computation.EinsteinDistinctDiffusionCoefficients(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Constructor for the Green Kubo diffusion coefficients class.
 
@@ -67,7 +67,7 @@ def __init__(self, experiment):
         experiment :  object
                 Experiment class to call from
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
 
         self.scale_function = {'linear': {'scale_factor': 10}}
         self.loaded_property = 'Unwrapped_Positions'  # Property to be loaded for the analysis
@@ -80,11 +80,9 @@ def __init__(self, experiment):
 
         self.msd_array = np.zeros(self.data_range)  # define empty msd array
 
-        if self.species is None:
-            self.species = list(self.experiment.species)
-
-        self.combinations = list(itertools.combinations_with_replacement(self.species, 2))
+        self.combinations = []
 
+    @call
     def __call__(self, plot: bool = False, species: list = None, data_range: int = 500, save: bool = True,
                  correlation_time: int = 1, export: bool = False, atom_selection: dict = np.s_[:], gpu: bool = False):
         """
@@ -100,7 +98,12 @@ def __call__(self, plot: bool = False, species: list = None, data_range: int = 5
                 Number of configurations to use in each ensemble
         save :
                 If true, tensor_values will be saved after the analysis
+
         """
+        if self.species is None:
+            self.species = list(self.experiment.species)
+        self.combinations = list(itertools.combinations_with_replacement(self.species, 2))
+
         self.update_user_args(plot=plot, data_range=data_range, save=save, correlation_time=correlation_time,
                               atom_selection=atom_selection, export=export, gpu=gpu)
 
@@ -112,11 +115,6 @@ def __call__(self, plot: bool = False, species: list = None, data_range: int = 5
 
         self.combinations = list(itertools.combinations_with_replacement(self.species, 2))
 
-        out = self.run_analysis()
-        self.experiment.save_class()
-
-        return out
-
     def _compute_msd(self, data: dict, data_path: list, combination: tuple):
         """
         Compute the vacf on the given dictionary of data.
diff --git a/mdsuite/calculators/einstein_helfand_ionic_conductivity.py b/mdsuite/calculators/einstein_helfand_ionic_conductivity.py
index 0669240f..1b76527a 100644
--- a/mdsuite/calculators/einstein_helfand_ionic_conductivity.py
+++ b/mdsuite/calculators/einstein_helfand_ionic_conductivity.py
@@ -20,7 +20,7 @@
 import numpy as np
 import tensorflow as tf
 from tqdm import tqdm
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.units import elementary_charge, boltzmann_constant
 
 tqdm.monitor_interval = 0
@@ -53,7 +53,7 @@ class EinsteinHelfandIonicConductivity(Calculator):
     experiment.run_computation.EinsteinHelfandTIonicConductivity(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor
 
@@ -64,7 +64,7 @@ def __init__(self, experiment):
         """
 
         # parse to the experiment class
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'linear': {'scale_factor': 5}}
 
         self.loaded_property = 'Translational_Dipole_Moment'  # Property to be loaded for the analysis
@@ -77,6 +77,7 @@ def __init__(self, experiment):
         self.analysis_name = 'Einstein_Helfand_Ionic_Conductivity'
         self.prefactor: float
 
+    @call
     def __call__(self, plot=True, data_range=500, save=True, correlation_time=1,
                  export: bool = False, gpu: bool = False):
         """
@@ -96,19 +97,13 @@ def __call__(self, plot=True, data_range=500, save=True, correlation_time=1,
                 If true, export the results to a csv.
         gpu : bool
                 If true, reduce memory usage to the maximum GPU capability.
-        """
 
+        """
         # parse to the experiment class
         self.update_user_args(plot=plot, data_range=data_range, save=save, correlation_time=correlation_time,
                               export=export, gpu=gpu)
         self.msd_array = np.zeros(self.data_range)
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-
-        return out
-
     def _update_output_signatures(self):
         """
         Update the output signature for the IC.
@@ -136,7 +131,7 @@ def _calculate_prefactor(self, species: str = None):
         numerator = (self.experiment.units['length'] ** 2) * (elementary_charge ** 2)
         denominator = 6 * self.experiment.units['time'] * (
                 self.experiment.volume * self.experiment.units['length'] ** 3) * \
-            self.experiment.temperature * boltzmann_constant
+                      self.experiment.temperature * boltzmann_constant
         self.prefactor = numerator / denominator
 
     def _apply_averaging_factor(self):
diff --git a/mdsuite/calculators/einstein_helfand_thermal_conductivity.py b/mdsuite/calculators/einstein_helfand_thermal_conductivity.py
index 81bdd897..fd3814d5 100644
--- a/mdsuite/calculators/einstein_helfand_thermal_conductivity.py
+++ b/mdsuite/calculators/einstein_helfand_thermal_conductivity.py
@@ -17,7 +17,7 @@
 import numpy as np
 import tensorflow as tf
 from tqdm import tqdm
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 tqdm.monitor_interval = 0
 warnings.filterwarnings("ignore")
@@ -49,7 +49,7 @@ class EinsteinHelfandThermalConductivity(Calculator):
     experiment.run_computation.EinsteinHelfandTThermalConductivity(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor
 
@@ -60,7 +60,7 @@ def __init__(self, experiment):
         """
 
         # parse to the experiment class
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'linear': {'scale_factor': 5}}
 
         self.loaded_property = 'Integrated_Heat_Current'  # Property to be loaded for the analysis
@@ -75,6 +75,7 @@ def __init__(self, experiment):
 
         self.prefactor: float
 
+    @call
     def __call__(self, plot=True, data_range=500, save=True, correlation_time=1,
                  export: bool = False, gpu: bool = False):
         """
@@ -95,12 +96,6 @@ def __call__(self, plot=True, data_range=500, save=True, correlation_time=1,
                               export=export, gpu=gpu)
 
         self.msd_array = np.zeros(self.data_range)  # Initialize the msd array
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
 
     def _update_output_signatures(self):
         """
diff --git a/mdsuite/calculators/einstein_helfand_thermal_kinaci.py b/mdsuite/calculators/einstein_helfand_thermal_kinaci.py
index 8bf73384..5834c6c1 100644
--- a/mdsuite/calculators/einstein_helfand_thermal_kinaci.py
+++ b/mdsuite/calculators/einstein_helfand_thermal_kinaci.py
@@ -18,7 +18,7 @@
 import tensorflow as tf
 from tqdm import tqdm
 
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 tqdm.monitor_interval = 0
 warnings.filterwarnings("ignore")
@@ -51,7 +51,7 @@ class EinsteinHelfandThermalKinaci(Calculator):
 
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor
 
@@ -62,7 +62,7 @@ def __init__(self, experiment):
         """
 
         # parse to the experiment class
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'linear': {'scale_factor': 5}}
 
         self.loaded_property = 'Kinaci_Heat_Current'  # Property to be loaded for the analysis
@@ -77,6 +77,7 @@ def __init__(self, experiment):
 
         self.prefactor: float
 
+    @call
     def __call__(self, plot=True, data_range=500, save=True, correlation_time=1, export: bool = False,
                  gpu: bool = False):
         """
@@ -90,20 +91,13 @@ def __call__(self, plot=True, data_range=500, save=True, correlation_time=1, exp
                 Number of configurations to use in each ensemble
         save :
                 If true, tensor_values will be saved after the analysis
-        """
 
+        """
         # parse to the experiment class
         self.update_user_args(plot=plot, data_range=data_range, save=save, correlation_time=correlation_time,
                               export=export, gpu=gpu)
         self.msd_array = np.zeros(self.data_range)  # Initialize the msd array
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
-
     def _update_output_signatures(self):
         """
         Update the output signature for the IC.
diff --git a/mdsuite/calculators/green_kubo_distinct_diffusion_coefficients.py b/mdsuite/calculators/green_kubo_distinct_diffusion_coefficients.py
index 298e584b..faeef2e7 100644
--- a/mdsuite/calculators/green_kubo_distinct_diffusion_coefficients.py
+++ b/mdsuite/calculators/green_kubo_distinct_diffusion_coefficients.py
@@ -24,7 +24,7 @@ class can then be called by the Experiment.green_kubo_diffusion_coefficients
 from scipy import signal
 import tensorflow_probability as tfp
 import matplotlib.pyplot as plt
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.meta_functions import join_path
 
 
@@ -54,7 +54,7 @@ class GreenKuboDistinctDiffusionCoefficients(Calculator):
     plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Constructor for the Green Kubo diffusion coefficients class.
 
@@ -63,7 +63,7 @@ def __init__(self, experiment):
         experiment :  object
                 Experiment class to call from
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
 
         self.scale_function = {"linear": {"scale_factor": 5}}
         self.loaded_property = "Velocities"
@@ -74,6 +74,7 @@ def __init__(self, experiment):
         self.analysis_name = "Green_Kubo_Distinct_Diffusion_Coefficients"
         self.experimental = True
 
+    @call
     def __call__(
         self,
         plot: bool = False,
@@ -129,12 +130,6 @@ def __call__(
             itertools.combinations_with_replacement(self.species, 2)
         )
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-
-        return out
-
     def _compute_vacf(self, data: dict, data_path: list, combination: tuple):
         """
         Compute the vacf on the given dictionary of data.
diff --git a/mdsuite/calculators/green_kubo_ionic_conductivity.py b/mdsuite/calculators/green_kubo_ionic_conductivity.py
index b12515aa..7093c2e0 100644
--- a/mdsuite/calculators/green_kubo_ionic_conductivity.py
+++ b/mdsuite/calculators/green_kubo_ionic_conductivity.py
@@ -21,7 +21,7 @@
 import tensorflow as tf
 import tensorflow_probability as tfp
 from mdsuite.utils.units import boltzmann_constant, elementary_charge
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 
 class GreenKuboIonicConductivity(Calculator):
@@ -51,7 +51,7 @@ class GreenKuboIonicConductivity(Calculator):
     plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
 
         Attributes
@@ -61,7 +61,7 @@ def __init__(self, experiment):
         """
 
         # update experiment class
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {"linear": {"scale_factor": 5}}
 
         self.loaded_property = "Ionic_Current"
@@ -74,9 +74,10 @@ def __init__(self, experiment):
 
         self.prefactor: float
 
+    @call
     def __call__(
         self,
-        plot=False,
+        plot=True,
         data_range=500,
         save=True,
         correlation_time=1,
@@ -94,6 +95,12 @@ def __call__(
                 Number of configurations to use in each ensemble
         save :
                 If true, tensor_values will be saved after the analysis
+
+        Returns
+        -------
+        data:
+            A dictionary of shape {name: data} for multiple len(experiments) > 1 or otherwise just data
+
         """
 
         # update experiment class
@@ -113,12 +120,6 @@ def __call__(
         else:
             self.integration_range = integration_range
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-
-        return out
-
     def _update_output_signatures(self):
         """
         Update the output signature for the IC.
diff --git a/mdsuite/calculators/green_kubo_self_diffusion_coefficients.py b/mdsuite/calculators/green_kubo_self_diffusion_coefficients.py
index 878d0df4..ad16265e 100644
--- a/mdsuite/calculators/green_kubo_self_diffusion_coefficients.py
+++ b/mdsuite/calculators/green_kubo_self_diffusion_coefficients.py
@@ -19,7 +19,7 @@ class can then be called by the Experiment.green_kubo_diffusion_coefficients
 import numpy as np
 import tensorflow_probability as tfp
 import tensorflow as tf
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 
 class GreenKuboSelfDiffusionCoefficients(Calculator):
@@ -49,7 +49,7 @@ class GreenKuboSelfDiffusionCoefficients(Calculator):
     experiment.run_computation.GreenKuboSelfDiffusionCoefficients(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Constructor for the Green Kubo diffusion coefficients class.
 
@@ -58,7 +58,7 @@ def __init__(self, experiment):
         experiment :  object
                 Experiment class to call from
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
 
         self.loaded_property = "Velocities"
         self.scale_function = {"linear": {"scale_factor": 150}}
@@ -68,6 +68,7 @@ def __init__(self, experiment):
         self.y_label = "VACF $(m^{2}/s^{2})$"
         self.analysis_name = "Green_Kubo_Self_Diffusion_Coefficients"
 
+    @call
     def __call__(
         self,
         plot: bool = False,
@@ -125,11 +126,6 @@ def __call__(
             else:
                 self.species = list(self.experiment.species)
 
-        out = self.run_analysis()
-        self.experiment.save_class()
-
-        return out
-
     def _update_output_signatures(self):
         """
         After having run _prepare managers, update the output signatures.
diff --git a/mdsuite/calculators/green_kubo_thermal_conductivity.py b/mdsuite/calculators/green_kubo_thermal_conductivity.py
index f8939792..d63596b8 100644
--- a/mdsuite/calculators/green_kubo_thermal_conductivity.py
+++ b/mdsuite/calculators/green_kubo_thermal_conductivity.py
@@ -22,7 +22,7 @@ class can then be called by the Experiment.green_kubo_thermal_conductivity
 import numpy as np
 import tensorflow as tf
 from tqdm import tqdm
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 import tensorflow_probability as tfp
 
 tqdm.monitor_interval = 0
@@ -54,7 +54,7 @@ class GreenKuboThermalConductivity(Calculator):
     plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Class for the Green-Kubo Thermal conductivity implementation
 
@@ -63,7 +63,7 @@ def __init__(self, experiment):
         experiment :  object
                 Experiment class to call from
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {"linear": {"scale_factor": 5}}
 
         self.loaded_property = "Thermal_Flux"
@@ -74,6 +74,7 @@ def __init__(self, experiment):
         self.y_label = r"JACF ($C^{2}\cdot m^{2}/s^{2}$)"
         self.analysis_name = "Green_Kubo_Thermal_Conductivity"
 
+    @call
     def __call__(
         self,
         plot=False,
@@ -114,11 +115,6 @@ def __call__(
             self.integration_range = self.data_range
         else:
             self.integration_range = integration_range
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-
-        return out
 
     def _update_output_signatures(self):
         """
@@ -155,7 +151,7 @@ def _calculate_prefactor(self, species: str = None):
             * (self.data_range - 1)
             * self.experiment.temperature ** 2
             * self.experiment.units["boltzman"]
-            * self.experiment.volume
+                      * self.experiment.volume
         )
         prefactor_units = (
             self.experiment.units["energy"]
diff --git a/mdsuite/calculators/green_kubo_viscosity.py b/mdsuite/calculators/green_kubo_viscosity.py
index 8b5a8228..26817178 100644
--- a/mdsuite/calculators/green_kubo_viscosity.py
+++ b/mdsuite/calculators/green_kubo_viscosity.py
@@ -17,7 +17,7 @@
 import numpy as np
 import tensorflow as tf
 import tensorflow_probability as tfp
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 
 class GreenKuboViscosity(Calculator):
@@ -46,7 +46,7 @@ class GreenKuboViscosity(Calculator):
     correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
 
         Attributes
@@ -54,7 +54,7 @@ def __init__(self, experiment):
         experiment :  object
                 Experiment class to call from
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {"linear": {"scale_factor": 5}}
 
         self.loaded_property = "Momentum_Flux"
@@ -66,6 +66,7 @@ def __init__(self, experiment):
         self.analysis_name = "Green_Kubo_Viscosity"
         self.prefactor: float
 
+    @call
     def __call__(
         self,
         plot=False,
@@ -87,6 +88,7 @@ def __call__(
         save :
                 If true, tensor_values will be saved after the analysis
         """
+
         self.update_user_args(
             plot=plot,
             data_range=data_range,
@@ -104,11 +106,6 @@ def __call__(
         else:
             self.integration_range = integration_range
 
-        out = self.run_analysis()
-        self.experiment.save_class()
-
-        return out
-
     def _update_output_signatures(self):
         """
         Update the output signature for the IC.
diff --git a/mdsuite/calculators/flux_viscosity.py b/mdsuite/calculators/green_kubo_viscosity_flux.py
similarity index 95%
rename from mdsuite/calculators/flux_viscosity.py
rename to mdsuite/calculators/green_kubo_viscosity_flux.py
index cb76a848..07bb5a6a 100644
--- a/mdsuite/calculators/flux_viscosity.py
+++ b/mdsuite/calculators/green_kubo_viscosity_flux.py
@@ -23,7 +23,7 @@
 import tensorflow as tf
 from scipy import signal
 
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 
 tqdm.monitor_interval = 0
 warnings.filterwarnings("ignore")
@@ -52,7 +52,7 @@ class GreenKuboViscosityFlux(Calculator):
     experiment.run_computation.GreenKuboViscosityFlux(data_range=500, plot=True, correlation_time=10)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor for the experiment class.
 
@@ -61,7 +61,7 @@ def __init__(self, experiment):
         experiment : object
                 Experiment class to read and write to
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.scale_function = {'linear': {'scale_factor': 5}}
 
         self.loaded_property = 'Stress_visc'  # Property to be loaded for the analysis
@@ -76,6 +76,7 @@ def __init__(self, experiment):
         self.jacf = np.zeros(self.data_range)
         self.sigma = []
 
+    @call
     def __call__(self, plot=False, data_range=500, correlation_time=1, save=True, export: bool = False,
                  gpu: bool = False):
         """
@@ -88,19 +89,13 @@ def __call__(self, plot=False, data_range=500, correlation_time=1, save=True, ex
         data_range : int
                 Number of configurations to include in each ensemble
         """
+
         self.update_user_args(plot=plot, data_range=data_range, save=save, correlation_time=correlation_time,
                               export=export, gpu=gpu)
 
         self.jacf = np.zeros(self.data_range)
         self.sigma = []
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
-
     def _update_output_signatures(self):
         """
         Update the output signature for the IC.
diff --git a/mdsuite/calculators/kirkwood_buff_integrals.py b/mdsuite/calculators/kirkwood_buff_integrals.py
index d012f596..93503280 100644
--- a/mdsuite/calculators/kirkwood_buff_integrals.py
+++ b/mdsuite/calculators/kirkwood_buff_integrals.py
@@ -11,14 +11,10 @@
 """
 import logging
 import numpy as np
-import os
 import matplotlib.pyplot as plt
 from typing import Union
-from mdsuite.database.properties_database import PropertiesDatabase
-from mdsuite.database.database_scheme import SystemProperty
 from mdsuite.utils.exceptions import NotApplicableToAnalysis
-from mdsuite.calculators.calculator import Calculator
-from typing import Iterable
+from mdsuite.calculators.calculator import Calculator, call
 
 log = logging.getLogger(__file__)
 
@@ -60,7 +56,7 @@ class KirkwoodBuffIntegral(Calculator):
     experiment.run_computation.KirkwoodBuffIntegral()
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor for the class
 
@@ -70,20 +66,21 @@ def __init__(self, experiment):
                         Class object of the experiment.
         """
 
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.file_to_study = None
         self.data_files = []
         self.rdf = None
         self.radii = None
         self.species_tuple = None
         self.kb_integral = None
-        self.database_group = 'Kirkwood_Buff_Integral'
-        self.x_label = r'r ($\AA$)'
-        self.y_label = r'$G(\mathbf{r})$'
-        self.analysis_name = 'Kirkwood-Buff_Integral'
+        self.database_group = "Kirkwood_Buff_Integral"
+        self.x_label = r"r ($\AA$)"
+        self.y_label = r"$G(\mathbf{r})$"
+        self.analysis_name = "Kirkwood-Buff_Integral"
 
         self.post_generation = True
 
+    @call
     def __call__(self, plot=True, save=True, data_range=1, export: bool = False):
         """
         Doc string for this one.
@@ -97,19 +94,11 @@ def __call__(self, plot=True, save=True, data_range=1, export: bool = False):
                 Default to 1 for this analysis
         export : bool
                 If tue, csv files will be dumped after the analysis.
-
-        Returns
-        -------
-
         """
-        self.update_user_args(plot=plot, save=save, data_range=data_range, export=export)
-
-        out = self.run_analysis()
 
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
+        self.update_user_args(
+            plot=plot, save=save, data_range=data_range, export=export
+        )
 
     def _autocorrelation_time(self):
         """
@@ -117,32 +106,6 @@ def _autocorrelation_time(self):
         """
         raise NotApplicableToAnalysis
 
-    def _get_rdf_data(self) -> Iterable:
-        """
-        Fill the data_files list with filenames of the rdf tensor_values
-        """
-        database = PropertiesDatabase(name=os.path.join(self.experiment.database_path, 'property_database'))
-
-        return database.load_data({"property": "RDF"})
-
-    def _load_rdf_from_file(self, system_property: SystemProperty):
-        """
-        Load the raw rdf tensor_values from a directory
-
-        Parameters
-        ----------
-        system_property: SystemProperty
-        """
-
-        radii = []
-        rdf = []
-        for _bin in system_property.data:
-            radii.append(_bin.x)
-            rdf.append(_bin.y)
-
-        self.radii = np.array(radii)
-        self.rdf = np.array(rdf)
-
     def _calculate_kb_integral(self):
         """
         calculate the Kirkwood-Buff integral
@@ -152,7 +115,14 @@ def _calculate_kb_integral(self):
 
         for i in range(1, len(self.radii)):
             self.kb_integral.append(
-                4 * np.pi * (np.trapz((self.rdf[1:i] - 1) * (self.radii[1:i]) ** 2, x=self.radii[1:i])))
+                4
+                * np.pi
+                * (
+                    np.trapz(
+                        (self.rdf[1:i] - 1) * (self.radii[1:i]) ** 2, x=self.radii[1:i]
+                    )
+                )
+            )
 
     def run_post_generation_analysis(self):
         """
@@ -160,7 +130,7 @@ def run_post_generation_analysis(self):
         """
 
         for data in self._get_rdf_data():  # Loop over all existing RDFs
-            self.species_tuple = "_".join([subject.subject for subject in data.subjects])
+            self.species_tuple = "_".join(data.subjects)
             self.data_range = data.data_range
 
             self._load_rdf_from_file(data)  # load the tensor_values from it
@@ -169,19 +139,25 @@ def run_post_generation_analysis(self):
 
             # Plot if required
             if self.plot:
-                plt.plot(self.radii[1:], self.kb_integral, label=f"{self.species_tuple}")
+                plt.plot(
+                    self.radii[1:], self.kb_integral, label=f"{self.species_tuple}"
+                )
                 self._plot_data(title=f"{self.analysis_name}_{self.species_tuple}")
 
             if self.save or self.export:
-                data = [{"x": x, "y": y} for x, y in zip(self.radii[1:], self.kb_integral)]
+                data = [
+                    {"x": x, "y": y} for x, y in zip(self.radii[1:], self.kb_integral)
+                ]
                 log.debug(f"Writing {self.analysis_name} to database!")
-                self._update_properties_file({
-                    "Property": self.system_property,
-                    "Analysis": self.analysis_name,
-                    "subjects": self.species_tuple.split("_"),
-                    "data_range": self.data_range,
-                    "data": data
-                })
+                self._update_properties_file(
+                    {
+                        "Property": self.system_property,
+                        "Analysis": self.analysis_name,
+                        "subjects": self.species_tuple.split("_"),
+                        "data_range": self.data_range,
+                        "data": data,
+                    }
+                )
 
     def _calculate_prefactor(self, species: Union[str, tuple] = None):
         """
diff --git a/mdsuite/calculators/nernst_einstein_ionic_conductivity.py b/mdsuite/calculators/nernst_einstein_ionic_conductivity.py
index 3e2efc60..5c5b92c1 100644
--- a/mdsuite/calculators/nernst_einstein_ionic_conductivity.py
+++ b/mdsuite/calculators/nernst_einstein_ionic_conductivity.py
@@ -13,7 +13,7 @@
 import sys
 import operator
 from typing import Union
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.units import boltzmann_constant, elementary_charge
 
 log = logging.getLogger(__file__)
@@ -33,7 +33,7 @@ class NernstEinsteinIonicConductivity(Calculator):
 
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Standard constructor
 
@@ -42,11 +42,16 @@ def __init__(self, experiment):
         experiment : Experiment
                 Experiment class from which to read
         """
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.post_generation = True
 
+        # Properties
+        self._truth_table = None
+
         self.database_group = "Ionic_Conductivity"
+        self.analysis_name = "Nernst_Einstein_Ionic_Conductivity"
 
+    @call
     def __call__(self, corrected: bool = False, plot: bool = False, data_range: int = 1,
                  export: bool = False, species: list = None, save: bool = True):
         """
@@ -57,23 +62,16 @@ def __call__(self, corrected: bool = False, plot: bool = False, data_range: int
         corrected : bool
                 If true, the corrected Nernst Einstein will also be calculated
         """
+
         self.update_user_args(plot=plot, save=False, data_range=data_range, export=export)
         self.corrected = corrected
         self.data = self._load_data()  # tensor_values to be read in
-        self.truth_table = self._build_truth_table()  # build truth table for analysis
 
         if species is None:
             self.species = list(self.experiment.species)
         else:
             self.species = species
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
-
     def _load_data(self):
         """
         Load tensor_values from a yaml file
@@ -87,7 +85,8 @@ def _load_data(self):
         test = self.experiment.export_property_data({'property': 'Diffusion_Coefficients'})
         return test
 
-    def _build_truth_table(self):
+    @property
+    def truth_table(self):
         """
         Builds a truth table to communicate which tensor_values is available to the analysis.
 
@@ -96,18 +95,21 @@ def _build_truth_table(self):
         truth_table : list
                 A truth table communication which tensor_values is available for the analysis.
         """
-        log.warning('No support for different data ranges! This method always picks the first entry in the database!')
-        case_1 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
-                                                       "analysis": "Green_Kubo_Self_Diffusion_Coefficients"})
-        case_2 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
-                                                       "analysis": "Green_Kubo_Distinct_Diffusion_Coefficients"})
-        case_3 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
-                                                       "analysis": "Einstein_Self_Diffusion_Coefficients"})
-        case_4 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
-                                                       "analysis": "Einstein_Distinct_Diffusion_Coefficients"})
-        truth_table = [list(map(operator.not_, [not case_1, not case_2])),
-                       list(map(operator.not_, [not case_3, not case_4]))]
-        return truth_table
+        if self._truth_table is None:
+            log.warning(
+                'No support for different data ranges! This method always picks the first entry in the database!')
+            case_1 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
+                                                           "analysis": "Green_Kubo_Self_Diffusion_Coefficients"})
+            case_2 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
+                                                           "analysis": "Green_Kubo_Distinct_Diffusion_Coefficients"})
+            case_3 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
+                                                           "analysis": "Einstein_Self_Diffusion_Coefficients"})
+            case_4 = self.experiment.export_property_data({'property': 'Diffusion_Coefficients',
+                                                           "analysis": "Einstein_Distinct_Diffusion_Coefficients"})
+            truth_table = [list(map(operator.not_, [not case_1, not case_2])),
+                           list(map(operator.not_, [not case_3, not case_4]))]
+            self._truth_table = truth_table
+        return self._truth_table
 
     def _nernst_einstein(self, diffusion_information: list):
         """
@@ -126,15 +128,15 @@ def _nernst_einstein(self, diffusion_information: list):
         # evaluate the prefactor
         numerator = self.experiment.number_of_atoms * (elementary_charge ** 2)
         denominator = boltzmann_constant * self.experiment.temperature * \
-            (self.experiment.volume * (self.experiment.units['length'] ** 3))
+                      (self.experiment.volume * (self.experiment.units['length'] ** 3))
         prefactor = numerator / denominator
 
         conductivity = 0.0
         uncertainty = 0.0
         for item in diffusion_information:
             log.debug(f"Analysing: {item}")
-            diffusion_coefficient = item.data[0].x
-            diffusion_uncertainty = item.data[0].uncertainty
+            diffusion_coefficient = item.data_dict[0].x
+            diffusion_uncertainty = item.data_dict[0].uncertainty
             species = item.subjects[0].subject
             charge_term = self.experiment.species[species]['charge'][0] ** 2
             mass_fraction_term = len(self.experiment.species[species]['indices']) / self.experiment.number_of_atoms
@@ -163,7 +165,7 @@ def _corrected_nernst_einstein(self, self_diffusion_information: list, distinct_
         # evaluate the prefactor
         numerator = self.experiment.number_of_atoms * (elementary_charge ** 2)
         denominator = boltzmann_constant * self.experiment.temperature * \
-            (self.experiment.volume * (self.experiment.units['length'] ** 3))
+                      (self.experiment.volume * (self.experiment.units['length'] ** 3))
         prefactor = numerator / denominator
 
         conductivity = 0.0
@@ -182,10 +184,10 @@ def _corrected_nernst_einstein(self, self_diffusion_information: list, distinct_
             diffusion_uncertainty = item['uncertainty']
             constituents = item['Subject'].split("_")
             charge_term = self.experiment.species[constituents[0]]['charge'][0] * \
-                self.experiment.species[constituents[1]]['charge'][0]
+                          self.experiment.species[constituents[1]]['charge'][0]
             mass_fraction_term = (len(
                 self.experiment.species[constituents[0]]['indices']) / self.experiment.number_of_atoms) * \
-                (len(self.experiment.species[constituents[1]][
+                                 (len(self.experiment.species[constituents[1]][
                                           'indices']) / self.experiment.number_of_atoms)
             conductivity += diffusion_coefficient * charge_term * mass_fraction_term
             uncertainty += diffusion_uncertainty * charge_term * mass_fraction_term
@@ -229,8 +231,7 @@ def _run_nernst_einstein(self):
             self._update_properties_file(properties)
 
         if not any(ne_table):
-            print("There is no values to analyse, please run a diffusion calculation to proceed")
-            sys.exit(1)
+            ValueError("There is no values to analyse, please run a diffusion calculation to proceed")
 
     def _run_corrected_nernst_einstein(self):
         """
diff --git a/mdsuite/calculators/potential_of_mean_force.py b/mdsuite/calculators/potential_of_mean_force.py
index d5b47380..82f76f3b 100644
--- a/mdsuite/calculators/potential_of_mean_force.py
+++ b/mdsuite/calculators/potential_of_mean_force.py
@@ -26,14 +26,11 @@
 """
 import logging
 import numpy as np
-import os
 from scipy.signal import find_peaks
 import matplotlib.pyplot as plt
 from typing import Union
-from mdsuite.database.properties_database import PropertiesDatabase
-from mdsuite.database.database_scheme import SystemProperty
 from mdsuite.utils.exceptions import NotApplicableToAnalysis
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.meta_functions import golden_section_search
 from mdsuite.utils.meta_functions import apply_savgol_filter
 from mdsuite.utils.units import boltzmann_constant
@@ -80,7 +77,7 @@ class PotentialOfMeanForce(Calculator):
     experiment.run_computation.PotentialOfMeanForce(savgol_order = 2, savgol_window_length = 17)
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor for the class
 
@@ -88,9 +85,12 @@ def __init__(self, experiment):
         ----------
         experiment : class object
                         Class object of the experiment.
+        experiments : class object
+                        Class object of the experiment.
+        load_data : bool
         """
 
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.file_to_study = None
         self.rdf = None
         self.radii = None
@@ -103,6 +103,7 @@ def __init__(self, experiment):
         self.analysis_name = 'Potential_of_Mean_Force'
         self.post_generation = True
 
+    @call
     def __call__(self, plot=True, save=True, data_range=1, export: bool = False,
                  savgol_order: int = 2, savgol_window_length: int = 17):
         """
@@ -119,42 +120,11 @@ def __call__(self, plot=True, save=True, data_range=1, export: bool = False,
                             Range over which the property should be evaluated. This is not applicable to the current
                             analysis as the full rdf will be calculated.
         """
-
         self.update_user_args(plot=plot, save=save, data_range=data_range, export=export)
         self.data_files = []
         self.savgol_order = savgol_order
         self.savgol_window_length = savgol_window_length
 
-        out = self.run_analysis()
-
-        self.experiment.save_class()
-        # need to move save_class() to here, because it can't be done in the experiment any more!
-
-        return out
-
-    def _get_rdf_data(self):
-        """
-        Fill the data_files list with filenames of the rdf tensor_values
-        """
-
-        database = PropertiesDatabase(name=os.path.join(self.experiment.database_path, 'property_database'))
-
-        return database.load_data({"property": "RDF"})
-
-    def _load_rdf_from_file(self, system_property: SystemProperty):
-        """
-        Load the raw rdf tensor_values from a directory
-        """
-
-        radii = []
-        rdf = []
-        for _bin in system_property.data:
-            radii.append(_bin.x)
-            rdf.append(_bin.y)
-
-        self.radii = np.array(radii)[1:].astype(float)
-        self.rdf = np.array(rdf)[1:].astype(float)
-
     def _autocorrelation_time(self):
         """
         Not needed in this analysis
@@ -239,7 +209,7 @@ def run_post_generation_analysis(self):
 
         for data in self._get_rdf_data():
             self.file_to_study = data  # Set the correct tensor_values file in the class
-            self.species_tuple = "_".join([subject.subject for subject in data.subjects])
+            self.species_tuple = "_".join(data.subjects)
             self.data_range = data.data_range
             self._load_rdf_from_file(data)  # load up the tensor_values
             log.debug(f'rdf: {self.rdf} \t radii: {self.radii}')
diff --git a/mdsuite/calculators/radial_distribution_function.py b/mdsuite/calculators/radial_distribution_function.py
index fd0c8691..e451f291 100644
--- a/mdsuite/calculators/radial_distribution_function.py
+++ b/mdsuite/calculators/radial_distribution_function.py
@@ -32,7 +32,7 @@
 import itertools
 from mdsuite.utils.meta_functions import join_path
 
-from mdsuite.calculators.calculator import Calculator
+from mdsuite.calculators.calculator import Calculator, call
 from mdsuite.utils.meta_functions import split_array
 from mdsuite.utils.linalg import apply_minimum_image, get_partial_triu_indices, apply_system_cutoff
 
@@ -81,7 +81,7 @@ class RadialDistributionFunction(Calculator, ABC):
                                                            stop = 1000, number_of_bins = 100, use_tf_function = False)
     """
 
-    def __init__(self, experiment: Experiment):
+    def __init__(self, experiment: Experiment, experiments=None, load_data: bool = False):
         """
         Constructor for the RDF calculator.
 
@@ -89,8 +89,10 @@ def __init__(self, experiment: Experiment):
         ----------
         experiment :  Experiment
                 Experiment class to call from
+        load_data: bool, default False
+                Whether RunComputation or LoadData is being called
         """
-        super().__init__(experiment)
+        super().__init__(experiment, experiments=experiments, load_data=load_data)
 
         self.scale_function = {'quadratic': {'outer_scale_factor': 1}}
         self.loaded_property = 'Positions'
@@ -121,6 +123,7 @@ def __init__(self, experiment: Experiment):
         self.correct_minibatch_batching = None
         # split the minibatches into equal sized chunks to use maximum computing and memory resources
 
+    @call
     def __call__(self,
                  plot=True,
                  number_of_bins=None,
@@ -175,12 +178,6 @@ def __call__(self,
                     If true, tf.function is used in the calculation.
         """
         # Calculator arguments
-        self.update_user_args(plot=plot,
-                              save=save,
-                              data_range=data_range,
-                              export=export,
-                              gpu=gpu)
-
         # RDF arguments
         self.number_of_bins = number_of_bins
         self.cutoff = cutoff
@@ -191,6 +188,12 @@ def __call__(self,
         self.minibatch = minibatch
         self.species = species
 
+        self.update_user_args(plot=plot,
+                              save=save,
+                              data_range=data_range,
+                              export=export,
+                              gpu=gpu)
+
         # kwarg parsing
         self.use_tf_function = kwargs.pop("use_tf_function", False)
         self.override_n_batches = kwargs.get('batches')
@@ -202,11 +205,9 @@ def __call__(self,
         self._check_input()
         self._initialize_rdf_parameters()
 
-        # Perform analysis and save.
-        out = self.run_analysis()
-        self.experiment.save_class()
+        # # Perform analysis and save.
+        # return self.run_analysis()
 
-        return out
 
     def _initialize_rdf_parameters(self):
         """
@@ -355,7 +356,7 @@ def _calculate_radial_distribution_functions(self):
                         zip(np.linspace(0.0, self.cutoff, self.number_of_bins), self.rdf.get(names))]
                 log.debug("Writing RDF to database!")
                 self._update_properties_file({
-                    "Property": "RDF",
+                    "Property": "RDF",  # TODO this should be dynamic
                     "Analysis": self.analysis_name,
                     "subjects": names.split("_"),
                     "data_range": self.data_range,
diff --git a/mdsuite/calculators/structure_factor.py b/mdsuite/calculators/structure_factor.py
index 1d01ee85..a2e2bbe2 100644
--- a/mdsuite/calculators/structure_factor.py
+++ b/mdsuite/calculators/structure_factor.py
@@ -23,8 +23,9 @@
 from mdsuite.calculators.calculator import Calculator
 from mdsuite import data as static_data
 from importlib.resources import open_text
-from mdsuite.database.properties_database import PropertiesDatabase
+from mdsuite.database.property_database import PropertiesDatabase
 from mdsuite.database.database_scheme import SystemProperty
+
 plt.rcParams['figure.facecolor'] = 'white'
 
 log = logging.getLogger(__file__)
@@ -73,7 +74,7 @@ class StructureFactor(Calculator):
     If they are not correct, the structure factor will not work.
     """
 
-    def __init__(self, experiment):
+    def __init__(self, **kwargs):
         """
         Python constructor for the class
 
@@ -83,7 +84,7 @@ def __init__(self, experiment):
                         Class object of the experiment.
         """
 
-        super().__init__(experiment)
+        super().__init__(**kwargs)
         self.file_to_study = None
         self.data_files = []
         self.rdf = None
@@ -97,40 +98,34 @@ def __init__(self, experiment):
         self.y_label = r'S(Q)'
         self.analysis_name = 'total_structure_factor'
 
-        self.rho = self.experiment.number_of_atoms / (self.experiment.box_array[0] *
-                                                      self.experiment.box_array[1] * self.experiment.box_array[2])
+        self.rho = None
+
         with open_text(static_data, 'form_fac_coeffs.csv') as file:
             self.coeff_atomic_formfactor = pd.read_csv(file, sep=',')  # stores coefficients for atomic form factors
 
     def __call__(self, plot=True, save=True, data_range=1, export: bool = False):
-        self.update_user_args(plot=plot, save=save, data_range=data_range, export=export)
+        # TODO docstrings!
 
-        out = self.run_analysis()
+        out = {}
+        for experiment in self.experiments:
+            self.experiment = experiment
 
-        self.experiment.save_class()
+            self.update_user_args(plot=plot, save=save, data_range=data_range, export=export)
 
-        return out
+            self.rho = self.experiment.number_of_atoms / (self.experiment.box_array[0] *
+                                                          self.experiment.box_array[1] * self.experiment.box_array[2])
 
-    def _get_rdf_data(self):
-        """
-        Fill the data_files list with filenames of the rdf tensor_values
-        """
-        database = PropertiesDatabase(name=os.path.join(self.experiment.database_path, 'property_database'))
-
-        return database.load_data({"property": "RDF"})
-
-    def _load_rdf_from_file(self, system_property: SystemProperty):
-        """
-        Load the raw rdf tensor_values from a directory
-        """
-        radii = []
-        rdf = []
-        for _bin in system_property.data:
-            radii.append(_bin.x)
-            rdf.append(_bin.y)
+            if self.load_data:
+                out[self.experiment.name] = self.experiment.export_property_data(
+                    {"Analysis": self.analysis_name}
+                )
+            else:
+                out[self.experiment.name] = self.run_analysis()
 
-        self.radii = np.array(radii)[1:]
-        self.rdf = np.array(rdf)[1:]
+        if len(self.experiments) > 1:
+            return out
+        else:
+            return out[self.experiment.name]
 
     def _autocorrelation_time(self):
         """
@@ -175,20 +170,30 @@ def molar_fractions(self):
         Calculates the molar fractions for all elements in the species dictionary and add it to the species
         dictionary
         """
+        species = dict(self.experiment.species)
+
         for el in self.experiment.species:
-            self.experiment.species[el]['molar_fraction'] = len(
+            species[el]['molar_fraction'] = len(
                 self.experiment.species[el]['indices']) / self.experiment.number_of_atoms
 
+        self.experiment.species = species
+
     def species_densities(self):
-        """
-        Calculates the particle densities for all the speies in the species dictionary and add it to the species
+        """Calculates the particle densities
+
+        Calculates the particle densities for all the species in the species dictionary and add it to the species
         dictionary
         """
+        log.warning("Updating particle_density")
+        species = dict(self.experiment.species)
         for el in self.experiment.species:
-            self.experiment.species[el]['particle_density'] = len(self.experiment.species[el]['indices']) / (
-                        self.experiment.box_array[0] *
-                        self.experiment.box_array[1] *
-                        self.experiment.box_array[2])
+            species[el]['particle_density'] = len(self.experiment.species[el]['indices']) / (
+                    self.experiment.box_array[0] *
+                    self.experiment.box_array[1] *
+                    self.experiment.box_array[2])
+        self.experiment.species = species
+        log.warning(species)
+        log.warning(self.experiment.species)
 
     def average_atomic_form_factor(self, scattering_scalar):
         """
@@ -244,7 +249,7 @@ def total_structure_factor(self, scattering_scalar):
             log.debug(f"Loaded data: {data}")
             self._load_rdf_from_file(data)
             log.debug(f"Loaded RDF: {self.rdf.shape} and radii: {self.radii.shape}")
-            elements = [subject.subject for subject in data.subjects]
+            elements = data.subjects
             log.debug(f'Elements are: {elements}')
             s_12, _, _ = self.partial_structure_factor(scattering_scalar, elements)
             s_in = self.weight_factor(scattering_scalar, elements) * s_12
diff --git a/mdsuite/database/analysis_database.py b/mdsuite/database/analysis_database.py
deleted file mode 100644
index 682fae8b..00000000
--- a/mdsuite/database/analysis_database.py
+++ /dev/null
@@ -1,141 +0,0 @@
-"""
-This program and the accompanying materials are made available under the terms of the
-Eclipse Public License v2.0 which accompanies this distribution, and is available at
-https://www.eclipse.org/legal/epl-v20.html
-
-SPDX-License-Identifier: EPL-2.0
-
-Copyright Contributors to the MDSuite Project.
-
-Python module for the Analysis database class.
-"""
-import sqlalchemy as sql
-from sqlalchemy import select
-from sqlalchemy import column
-from sqlalchemy import and_
-import pandas as pd
-
-
-class AnalysisDatabase:
-    """
-    Class of the MDSuite Analysis database.
-    """
-
-    def __init__(self, name: str):
-        """
-        Constructor for the PropertiesDatabase class.
-
-        Parameters
-        ----------
-        name : str
-                Name of the database. Should be the full path to the name.
-        """
-        self.name = name
-        self.engine = sql.create_engine(f"sqlite+pysqlite:///{self.name}",
-                                        echo=False,
-                                        future=False)
-
-    def build_database(self):
-        """
-        Build a new database
-
-        Returns
-        -------
-        Constructs a new database
-        """
-        with self.engine.begin():  # as conn:
-            print("Constructed new database")
-
-    def _check_table_existence(self, parameters: dict):
-        """
-        Check if a row exists.
-
-        Parameters
-        ----------
-        parameters : dict
-                Parameters to be used in the addition, i.e.
-                {"Analysis": "Green_Kubo_Self_Diffusion", "Subject": "Na",
-                "data_range": 500, "data": 1.8e-9}
-        Returns
-        -------
-        result : bool
-                True or False depending on existence.
-        """
-        truth_table = []
-        with self.engine.begin() as conn:
-            stmt = select(self.table).where(column('Subject') == parameters['Subject'],
-                                            column('data_range') == parameters['data_range'])
-            for _ in conn.execute(stmt):
-                truth_table.append(True)
-
-        return any(truth_table)
-
-    def add_data(self, name: str, data_frame: pd.DataFrame):
-        """
-        Add data to the database
-
-        Parameters
-        ----------
-
-        Returns
-        -------
-        Updates the sql database
-        """
-        data_frame.to_sql(name, self.engine, if_exists='replace')
-
-    def get_tables(self, analysis: str) -> list:
-        """
-        Return a list of table names matching an input
-
-        Parameters
-        ----------
-        analysis : str
-                Name of the analysis string to look for.
-        Returns
-        -------
-        tables : list
-              A list of names matching the searched for table.
-        """
-        tables = []
-        primitive = self.engine.table_names()
-        for item in primitive:
-            check = [i in item.split("_") for i in analysis.split("_")]
-            if all(check):
-                tables.append(item)
-
-        return tables
-
-    def load_pandas(self, table_name: str) -> pd.DataFrame:
-        """
-        Load a pandas data frame from a table name
-        Returns
-        -------
-        data : pd.DataFrame
-                A pandas data frame of data.
-        """
-        return pd.read_sql_table(table_name, self.engine)
-
-    def load_data(self, parameters: dict):
-        """
-        Load some data from the database.
-
-        Parameters
-        ----------
-        parameters : dict
-                Parameters to be used in the addition, i.e.
-                {"Analysis": "Green_Kubo_Self_Diffusion", "Subject": "Na",
-                "data_range": 500}
-
-        Returns
-        -------
-        output : list
-                All rows matching the parameters represented as a dictionary.
-        """
-        output = []
-        with self.engine.begin() as conn:
-            cond = and_(*[column(item).ilike(parameters[item]) for item in parameters])
-            stmt = select(self.table).where(cond)
-            for i, row in enumerate(conn.execute(stmt)):
-                output.append(dict(row))
-
-        return output
diff --git a/mdsuite/database/calculator_database.py b/mdsuite/database/calculator_database.py
new file mode 100644
index 00000000..83364068
--- /dev/null
+++ b/mdsuite/database/calculator_database.py
@@ -0,0 +1,164 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: database management for the calculator class
+"""
+from __future__ import annotations
+
+import mdsuite.database.scheme as db
+from mdsuite.utils.database import get_or_create
+
+import logging
+import numpy as np
+from typing import TYPE_CHECKING, List
+
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
+
+log = logging.getLogger(__file__)
+
+
+class CalculatorDatabase:
+    def __init__(self, experiment):
+        self.experiment: Experiment = experiment
+
+    def update_database(self, parameters: dict, delete_duplicate: bool = True):
+        """
+        Add data to the database
+
+        Parameters
+        ----------
+        parameters : dict
+                Parameters to be used in the addition, i.e.
+                {"Analysis": "Green_Kubo_Self_Diffusion", "Subject": "Na", "data_range": 500, "data": 1.8e-9}
+        delete_duplicate : bool
+                If true, duplicate entries will be deleted.
+        Returns
+        -------
+        Updates the sql database
+        """
+        # allow subjects and Subject
+        if parameters.get("subjects") is None:
+            try:
+                log.warning("Using depreciated `Subject` \t Please use `subjects` instead.")
+                parameters['subjects'] = parameters['Subject']
+            except KeyError:
+                raise KeyError('Please add the key "subjects" to your calculator')
+
+        with self.experiment.project.session as ses:
+            experiment = ses.query(db.Experiment).filter(db.Experiment.name == self.experiment.name).first()
+            computation = db.Computation(experiment=experiment)
+            ses.add(computation)
+
+            computation_property = db.ComputationAttribute(computation=computation, name="Property",
+                                                           str_value=parameters['Property'])
+            ses.add(computation_property)
+
+            computation_analysis = db.ComputationAttribute(computation=computation, name="Analysis",
+                                                           str_value=parameters['Analysis'])
+            ses.add(computation_analysis)
+
+            computation_data_range = db.ComputationAttribute(computation=computation, name="data_range",
+                                                             value=parameters['data_range'])
+            ses.add(computation_data_range)
+
+            for subject in parameters['subjects']:
+                computation_subject = db.ComputationAttribute(computation=computation, name="subject",
+                                                              str_value=subject)
+                ses.add(computation_subject)
+
+            # data
+
+            for data in parameters['data']:
+                for key, val in data.items():
+                    computation_data = db.ComputationData(computation=computation, value=val, dimension=key)
+                    ses.add(computation_data)
+
+            ses.commit()
+
+    # TODO rename and potentially move to a RDF based parent class
+    def _get_rdf_data(self) -> List[db.Computation]:
+        """Fill the data_files list with filenames of the rdf tensor_values"""
+        with self.experiment.project.session as ses:
+            computations = ses.query(db.Computation).filter(
+                db.Computation.computation_attributes.any(str_value="RDF", name="Property")
+            ).all()
+
+            for computation in computations:
+                _ = computation.data_dict
+                _ = computation.data_range
+
+        return computations
+
+    # TODO rename and potentially move to a RDF based parent class
+    def _load_rdf_from_file(self, computation: db.Computation):
+        """Load the raw rdf tensor_values from a directory"""
+
+        self.radii = np.array(computation.data_dict['x']).astype(float)[1:]
+        self.rdf = np.array(computation.data_dict['y']).astype(float)[1:]
+
+    # @property
+    # def data(self) -> np.ndarray:
+    #     """
+    #
+    #     Returns
+    #     -------
+    #     object that contains `
+    #
+    #     """
+    #     with self.experiment.project.session as ses:
+    #         ses.query(db.Computation)
+    #
+    #     return 0
+        #
+        # # if delete_duplicate:
+        # #     self._delete_duplicate_rows(parameters)
+        # # else:
+        # #     if self._check_row_existence(parameters):
+        # #         log.info("Note, an entry with these parameters already exists in the database.")
+        #
+        # log.debug(f'Adding {parameters.get("Property")} to database!')
+        #
+        # with self.experiment.project.session as ses:
+        #     # Create a Data instance to store the value
+        #     # TODO use **parameters instead with parameters.pop
+        #
+        #     try:  # check if it is a list
+        #         data = [Data(**param) for param in parameters['data']]  # param is a dict
+        #     except TypeError:
+        #         try:  # check if it is a dictionary with keys [x, y, z, uncertainty]
+        #             data = [Data(parameters['data'])]
+        #         except TypeError:
+        #             data = [Data(x=parameters['data'])]
+        #
+        #     try:
+        #         subjects = [Subject(subject=param) for param in parameters['subjects']]  # param is a string
+        #     except TypeError:
+        #         subjects = [Subject(subject=parameters['subjects'])]  # param is a string
+        #
+        #     log.debug(f"Subjects are: {subjects}")
+        #
+        #     # Create s SystemProperty instance to store the values
+        #     system_property = SystemProperty(
+        #         property=parameters['Property'],
+        #         analysis=parameters['Analysis'],
+        #         data_range=parameters['data_range'],
+        #         subjects=subjects,
+        #         data=data,
+        #         information=parameters.get("information")
+        #     )
+        #
+        #     log.debug(f"Created: {system_property}")
+        #
+        #     # add to the session
+        #     ses.add(system_property)
+        #
+        #     # commit to the database
+        #     ses.commit()
+        #
+        # log.debug("Values successfully written to database. Closed database session.")
diff --git a/mdsuite/database/database_base.py b/mdsuite/database/database_base.py
new file mode 100644
index 00000000..a7f29c33
--- /dev/null
+++ b/mdsuite/database/database_base.py
@@ -0,0 +1,91 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Base class for accessing the database
+"""
+import logging
+
+import sqlalchemy as sa
+from sqlalchemy.orm import sessionmaker, declarative_base
+from sqlalchemy.orm.session import Session
+from sqlalchemy.engine import Engine
+from pathlib import Path
+
+from .scheme import Base
+
+log = logging.getLogger(__file__)
+
+
+class DatabaseBase:
+    """
+    Docstring
+    """
+
+    def __init__(self, database_name: str):
+        """
+
+        Parameters
+        ----------
+        database_name: str
+            name of the database
+        """
+        self.name = ""  # Name of the Project
+        self.database_name = database_name
+        self.storage_path = "./"
+
+        self._engine = None
+        self._Session = None
+
+    @property
+    def engine(self) -> Engine:
+        """Create a SQLAlchemy Engine
+
+        Returns
+        -------
+        a SQLAlchemy Engine connected to the Database
+
+        """
+        if self._engine is None:
+            self._engine = sa.create_engine(
+                f"sqlite+pysqlite:///{Path(self.storage_path, self.name, self.database_name)}",
+                echo=False,
+                future=True)
+        return self._engine
+
+    @property
+    def session(self) -> Session:
+        """
+
+        Notes
+        -------
+        Use with context manager like:
+        >>> with self.session as ses:
+        >>>     ses.add()
+
+        Returns
+            Session that can be used inside a context manager
+
+        """
+        return sessionmaker(bind=self.engine, future=True)()
+
+    @property
+    def base(self) -> declarative_base:
+        """
+
+        Returns
+        -------
+        Get the declarative base from the Database scheme
+
+        """
+        return Base
+
+    def build_database(self):
+        """Build the database and get create the tables
+        """
+        log.debug("Creating the database if it does not exist.")
+        self.base.metadata.create_all(self.engine)
diff --git a/mdsuite/database/database_scheme.py b/mdsuite/database/database_scheme.py
index 6db9eacf..59828035 100644
--- a/mdsuite/database/database_scheme.py
+++ b/mdsuite/database/database_scheme.py
@@ -63,7 +63,8 @@ def __init__(self, property, analysis, subjects, data_range, data, information=N
         self.information = information
 
     def data_array(self) -> np.array:
-        """Convert the one-to-many relationship data into a numpy array
+        """
+        Convert the one-to-many relationship data into a numpy array
 
         Returns
         -------
@@ -78,7 +79,8 @@ def data_array(self) -> np.array:
 
 
 class Data(Base):
-    """Class for the data associated with SystemProperty
+    """
+    Class for the data associated with SystemProperty
 
     Parameters
     ----------
@@ -112,7 +114,7 @@ def __repr__(self):
 
 class Subject(Base):
     """
-    Class for the subjects associated with SystemProperty
+    Class for the subjects tables associated with SystemProperty
 
     Parameters
     ---------
@@ -138,3 +140,4 @@ class Subject(Base):
     def __repr__(self):
         """Representation of the subject"""
         return f"{self.subject}"
+
diff --git a/mdsuite/database/experiment_database.py b/mdsuite/database/experiment_database.py
new file mode 100644
index 00000000..152f344e
--- /dev/null
+++ b/mdsuite/database/experiment_database.py
@@ -0,0 +1,438 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Module for the experiment database.
+"""
+from __future__ import annotations
+
+import logging
+
+import mdsuite.database.scheme as db
+from mdsuite.database.scheme import Project, Experiment, ExperimentData, Species, SpeciesData
+from mdsuite.utils.database import get_or_create
+
+from pathlib import Path
+from typing import TYPE_CHECKING, List
+
+if TYPE_CHECKING:
+    from mdsuite import Project
+
+log = logging.getLogger(__file__)
+
+
+class ExperimentDatabase:
+    def __init__(self, project: Project, experiment_name):
+        self.project = project
+        self.name = experiment_name
+
+    def export_property_data(self, parameters: dict) -> List[db.Computation]:
+        """
+        Export property data from the SQL database.
+
+        Parameters
+        ----------
+        parameters : dict
+                Parameters to be used in the addition, i.e.
+                {"Analysis": "Green_Kubo_Self_Diffusion", "Subject": "Na", "data_range": 500}
+        Returns
+        -------
+        output : list
+                A list of rows represented as dictionaries.
+        """
+        with self.project.session as ses:
+            subjects = parameters.pop('subjects', None)
+            experiment = parameters.pop('experiment', None)
+
+            query = ses.query(db.Computation)
+            for key, val in parameters.items():
+                if isinstance(val, str):
+                    query = query.filter(
+                        db.Computation.computation_attributes.any(name=key),
+                        db.Computation.computation_attributes.any(str_value=val)
+                    )
+                else:
+                    query = query.filter(
+                        db.Computation.computation_attributes.any(name=key),
+                        db.Computation.computation_attributes.any(value=val)
+                    )
+            if experiment is not None:
+                query = query.filter(db.Computation.experiment.has(name=experiment))
+            computations_all_subjects = query.all()
+
+            # Filter out subjects, this is easier to do this way around than via SQL statements (feel free to rewrite!)
+            computations = []
+            if subjects is not None:
+                for x in computations_all_subjects:
+                    if set(x.subjects).issubset(subjects):
+                        computations.append(x)
+            else:
+                computations = computations_all_subjects
+
+            for computation in computations:
+                _ = computation.data_dict
+
+        return computations
+
+    @property
+    def active(self):
+        """Get the state (activated or not) of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+        return experiment.active
+
+    @active.setter
+    def active(self, value):
+        """Set the state (activated or not) of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            experiment.active = value
+            ses.commit()
+
+    @property
+    def temperature(self):
+        """Get the temperature of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            temperature = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "temperature").first()
+        try:
+            return temperature.value
+        except AttributeError:
+            return None
+
+    @temperature.setter
+    def temperature(self, value):
+        """Set the temperature of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            temperature: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment, name="temperature")
+            temperature.value = value
+            ses.commit()
+
+    @property
+    def time_step(self):
+        """Get the time_step of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            time_step = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "time_step").first()
+        try:
+            return time_step.value
+        except AttributeError:
+            return None
+
+    @time_step.setter
+    def time_step(self, value):
+        """Set the time_step of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            time_step: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment, name="time_step")
+            time_step.value = value
+            ses.commit()
+
+    @property
+    def unit_system(self):
+        """Get the unit_system of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            unit_system = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "unit_system").first()
+        try:
+            return unit_system.str_value
+        except AttributeError:
+            return None
+
+    @unit_system.setter
+    def unit_system(self, value):
+        """Set the unit_system of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            unit_system: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment, name="unit_system")
+            unit_system.str_value = value
+            ses.commit()
+
+    @property
+    def number_of_configurations(self) -> int:
+        """Get the time_step of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            number_of_configurations = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "number_of_configurations").first()
+        try:
+            return int(number_of_configurations.value)
+        except AttributeError:
+            return None
+
+    @number_of_configurations.setter
+    def number_of_configurations(self, value):
+        """Set the time_step of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            number_of_configurations: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment,
+                                                                     name="number_of_configurations")
+            number_of_configurations.value = value
+            ses.commit()
+
+    @property
+    def number_of_atoms(self) -> int:
+        """Get the time_step of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            number_of_atoms = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "number_of_atoms").first()
+        try:
+            return int(number_of_atoms.value)
+        except AttributeError:
+            return None
+
+    @number_of_atoms.setter
+    def number_of_atoms(self, value):
+        """Set the time_step of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            number_of_atoms: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment,
+                                                            name="number_of_atoms")
+            number_of_atoms.value = value
+            ses.commit()
+
+    @property
+    def sample_rate(self):
+        """Get the sample_rate of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            sample_rate = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "sample_rate").first()
+        try:
+            return sample_rate.value
+        except AttributeError:
+            return None
+
+    @sample_rate.setter
+    def sample_rate(self, value):
+        """Set the time_step of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            sample_rate: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment, name="sample_rate")
+            sample_rate.value = value
+            ses.commit()
+
+    @property
+    def volume(self):
+        """Get the volume of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            volume = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "volume").first()
+        try:
+            return volume.value
+        except AttributeError:
+            return None
+
+    @volume.setter
+    def volume(self, value):
+        """Set the volume of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            volume: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment, name="volume")
+            volume.value = value
+            ses.commit()
+
+    @property
+    def box_array(self):
+        """Get the sample_rate of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            box_arrays = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name.startswith("box_array")).all()
+
+            box_array = [box_side.value for box_side in box_arrays]
+
+        return box_array
+
+    @box_array.setter
+    def box_array(self, value):
+        """Set the time_step of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            for idx, box_length in enumerate(value):
+                sample_rate: ExperimentData = get_or_create(
+                    ses, ExperimentData, experiment=experiment, name=f"box_array_{idx}")
+                sample_rate.value = box_length
+            ses.commit()
+
+    @property
+    def species(self):
+        species_dict = {}
+        with self.project.session as ses:
+            experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+            for species in experiment.species:
+                species_dict.update({
+                    species.name: {
+                        "indices": species.indices,
+                        "mass": species.mass,
+                        "charge": species.charge,
+                        "particle_density": species.particle_density,
+                        "molar_fraction": species.molar_fraction
+                    }
+                })
+
+        return species_dict
+
+    @species.setter
+    def species(self, value):
+        """
+
+        Parameters
+        ----------
+        value
+
+        Notes
+        -----
+
+        species = {C: {indices: [1, 2, 3], mass: [12.0], charge: [0]}}
+
+        """
+        if value is None:
+            return
+        with self.project.session as ses:
+            for species_name in value:
+                experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+                species = get_or_create(ses, Species, name=species_name, experiment=experiment)
+                for species_attr, species_values in value[species_name].items():
+                    try:
+                        for idx, species_value in enumerate(species_values):
+                            _ = get_or_create(
+                                ses, SpeciesData,
+                                name=species_attr, species=species, value=species_value
+                            )
+                    except TypeError:
+                        # e.g., float or int values that are not iterable
+                        if species_values is not None:
+                            log.warning(f"Updating {species_attr} with {species_values}")
+                            _ = get_or_create(
+                                ses, SpeciesData,
+                                name=species_attr, species=species, value=species_values
+                            )
+
+            ses.commit()
+
+    @property
+    def property_groups(self):
+        """Get the property groups from the database
+
+        Returns
+        -------
+        property_groups: dict
+                Example: {'Positions': [3, 4, 5], 'Velocities': [6, 7, 8], ...}
+        """
+        property_groups = {}
+        with self.project.session as ses:
+            experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+            for experiment_data in experiment.experiment_data:
+                if experiment_data.name.startswith('property_group_'):
+                    property_group = experiment_data.name.split('property_group_', 1)[1]
+                    # everything after, max 1 split
+                    group_values = property_groups.get(property_group, [])
+                    group_values.append(int(experiment_data.value))
+                    property_groups[property_group] = group_values
+
+        return property_groups
+
+    @property_groups.setter
+    def property_groups(self, value):
+        """Write the property groups to the database"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+            for group in value:
+                for group_value in value[group]:
+                    get_or_create(ses, ExperimentData, name=f"property_group_{group}", value=group_value,
+                                  experiment=experiment)
+
+            ses.commit()
+
+    @property
+    def read_files(self):
+        """
+
+        Returns
+        -------
+        read_files: list[Path]
+            A List of all files that were added to the database already
+
+        """
+        with self.project.session as ses:
+            experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+            read_files = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "read_file").all()
+            read_files = [Path(file.str_value) for file in read_files]
+        return read_files
+
+    @read_files.setter
+    def read_files(self, value):
+        """Add a file that has been read to the database
+
+        Does nothing if the file already  exists within the database
+
+        Parameters
+        ----------
+        value: str, Path
+            A filepath that will be added to the database
+
+        """
+        if value is None:
+            return
+        if isinstance(value, Path):
+            value = value.as_posix()
+        with self.project.session as ses:
+            experiment = ses.query(Experiment).filter(Experiment.name == self.name).first()
+            get_or_create(ses, ExperimentData, name="read_file", str_value=value, experiment=experiment)
+            ses.commit()
+
+    @property
+    def radial_distribution_function_state(self) -> bool:
+        """Get the radial_distribution_function_state of the experiment"""
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            rdf_state = ses.query(ExperimentData).filter(ExperimentData.experiment == experiment).filter(
+                ExperimentData.name == "radial_distribution_function_state").first()
+        try:
+            return rdf_state.value
+        except AttributeError:
+            return False
+
+    @radial_distribution_function_state.setter
+    def radial_distribution_function_state(self, value):
+        """Set the radial_distribution_function_state of the experiment"""
+        if value is None:
+            return
+        with self.project.session as ses:
+            experiment = get_or_create(ses, Experiment, name=self.name)
+            rdf_state: ExperimentData = get_or_create(ses, ExperimentData, experiment=experiment,
+                                                      name="radial_distribution_function_state")
+            rdf_state.value = value
+            ses.commit()
diff --git a/mdsuite/database/project_database.py b/mdsuite/database/project_database.py
new file mode 100644
index 00000000..bf039a5c
--- /dev/null
+++ b/mdsuite/database/project_database.py
@@ -0,0 +1,98 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Module for the project database.
+"""
+import logging
+from .scheme import Project, Experiment
+
+from .database_base import DatabaseBase
+from mdsuite.utils.database import get_or_create
+from pathlib import Path
+
+log = logging.getLogger(__file__)
+
+
+class ProjectDatabase(DatabaseBase):
+    """
+    Class for the management of the project database.
+    """
+
+    def __init__(self):
+        """
+        Constructor for the Project database class.
+        """
+        super().__init__(database_name="project.db")
+
+    @property
+    def project_id(self) -> int:
+        """The id of this project in the database"""
+        return 1
+
+    @property
+    def db_experiments(self):
+        """Get all experiments"""
+        # renamed to db_experiments because experiments contains the instances of the Experiment class
+        with self.session as ses:
+            experiments = ses.query(Experiment).all()
+        return experiments
+
+    @property
+    def description(self):
+        with self.session as ses:
+            project = get_or_create(ses, Project, id=self.project_id)
+            description = project.description
+            ses.commit()
+
+        return description
+
+    @description.setter
+    def description(self, value: str):
+        """
+        Allow users to add a short description to their project
+
+        Parameters
+        ----------
+        value : str
+                Description of the project. If the string ends in .txt, the contents of the txt file will be read. If
+                it ends in .md, same outcome. Anything else will be read as is.
+        """
+        if value is None:
+            return
+        if Path(value).exists():
+            value = Path(value).read_text()
+
+        with self.session as ses:
+            project = get_or_create(ses, Project, id=self.project_id)
+            project.description = value
+            ses.commit()
+
+        # self.name = name
+        #
+        # self._experiment_id = None
+    #
+    # @property
+    # def experiment(self) -> Experiment:
+    #     """Write an entry for the Experiment the database
+    #
+    #     Returns
+    #     -------
+    #
+    #     Experiment instance queried from the database
+    #
+    #     """
+    #     if self._experiment_id is None:
+    #         experiment = Experiment(name=self.name)
+    #         with self.session as ses:
+    #             ses.add(experiment)
+    #             ses.commit()
+    #             self._experiment_id = experiment.id
+    #
+    #     with self.session as ses:
+    #         experiment = ses.query(Experiment).get(self._experiment_id)
+    #     return experiment
diff --git a/mdsuite/database/properties_database.py b/mdsuite/database/property_database.py
similarity index 100%
rename from mdsuite/database/properties_database.py
rename to mdsuite/database/property_database.py
diff --git a/mdsuite/database/scheme.py b/mdsuite/database/scheme.py
new file mode 100644
index 00000000..614777a4
--- /dev/null
+++ b/mdsuite/database/scheme.py
@@ -0,0 +1,265 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Collection of all used SQLAlchemy Database schemes
+"""
+from sqlalchemy.orm import declarative_base
+from sqlalchemy import Column, Integer, String, Float, ForeignKey, Boolean
+from sqlalchemy.orm import relationship
+from sqlalchemy.orm.exc import DetachedInstanceError
+
+import numpy as np
+
+Base = declarative_base()
+
+
+class Project(Base):
+    __tablename__ = "projects"
+    id = Column(Integer, primary_key=True)
+    description = Column(String, nullable=True)
+
+    experiments = relationship("Experiment")
+
+
+class Experiment(Base):
+    """
+    Class for the experiment table associated with the Project table.
+    """
+    __tablename__ = 'experiments'
+
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+
+    active = Column(Boolean, default=False)
+    # Whether this experiment is currently loaded in the project class
+
+    project_id = Column(Integer, ForeignKey('projects.id', ondelete="CASCADE"))
+    project = relationship("Project")
+
+    experiment_data = relationship("ExperimentData",
+                                   cascade='all, delete',
+                                   back_populates='experiment')
+
+    computations = relationship("Computation")
+    species = relationship("Species")
+
+    def __repr__(self):
+        """
+        Representation of the experiment table.
+
+        Returns
+        -------
+        information : str
+                Experiment number and name as an fstring
+        """
+        return f"{self.id}: {self.name}"
+
+
+# TODO consider renaming ExperimentAttributes in accordance to ComputationAttributes
+class ExperimentData(Base):
+    """
+    Class for the experiment data table.
+
+    This table is arbitrarily defined and therefore anything can be added to it.
+
+    Attributes
+    ----------
+    id : int
+            Unique identifier of the row.
+    name : str
+            name of the property being recorded.
+    value : float
+            numeric value of the property.
+    str_value : str
+            String value of the property.
+    """
+    __tablename__ = 'experiment_data'
+
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+    value = Column(Float, nullable=True)
+    str_value = Column(String, nullable=True)
+
+    experiment_id = Column(Integer, ForeignKey('experiments.id', ondelete="CASCADE"))
+    experiment = relationship("Experiment", back_populates='experiment_data')
+
+    def __repr__(self):
+        if self.value is not None:
+            return f"{self.value}"
+        elif self.str_value is not None:
+            return self.str_value
+        else:
+            return None
+
+
+class Species(Base):
+    __tablename__ = 'species'
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+
+    experiment_id = Column(Integer, ForeignKey('experiments.id', ondelete="CASCADE"))
+    experiment = relationship("Experiment", back_populates='species')
+
+    species_data = relationship("SpeciesData")
+
+    @property
+    def indices(self) -> list:
+        indices = []
+        for species_data in self.species_data:
+            if species_data.name == "indices":
+                indices.append(int(species_data.value))
+        return indices
+
+    @property
+    def mass(self) -> list:
+        mass = []
+        for species_data in self.species_data:
+            if species_data.name == "mass":
+                mass.append(species_data.value)
+        return mass
+
+    @property
+    def charge(self) -> list:
+        charge = []
+        for species_data in self.species_data:
+            if species_data.name == "charge":
+                charge.append(species_data.value)
+        return charge
+
+    @property
+    def particle_density(self) -> float:
+        for species_data in self.species_data:
+            if species_data.name == "particle_density":
+                return species_data.value
+        return None
+
+    @property
+    def molar_fraction(self) -> float:
+        for species_data in self.species_data:
+            if species_data.name == "molar_fraction":
+                return species_data.value
+        return None
+
+
+#      TODO consider adding species data as a function here!
+
+
+class SpeciesData(Base):
+    __tablename__ = 'species_data'
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+    value = Column(Float, nullable=True)
+    str_value = Column(String, nullable=True)
+
+    species_id = Column(Integer, ForeignKey('species.id', ondelete="CASCADE"))
+    species = relationship("Species", back_populates='species_data')
+
+
+class Computation(Base):
+    """
+    Class for the computation table.
+    """
+    __tablename__ = 'computations'
+
+    id = Column(Integer, primary_key=True)
+
+    experiment_id = Column(Integer, ForeignKey('experiments.id', ondelete="CASCADE"))
+    experiment = relationship("Experiment")
+
+    computation_attributes = relationship('ComputationAttribute',
+                                          cascade='all, delete',
+                                          back_populates='computation')
+    computation_data = relationship('ComputationData',
+                                    cascade='all, delete',
+                                    back_populates='computation')
+
+    def __repr__(self):
+        """
+        Representation of the experiment table.
+
+        Returns
+        -------
+        information : str
+                Experiment number and name as an fstring
+        """
+        return f"{self.experiment_id}: Computation {self.id}"
+
+    @property
+    def data_dict(self) -> dict:
+        """
+
+        Returns
+        -------
+        data_dict: dict
+            A dictionary of the type {x: [1, 2, 3], y: [5, 6, 7], ...}
+            where the keys are defined by computation_data.dimension
+
+        """
+        data_dict = {}
+        for data in self.computation_data:
+            data_list = data_dict.get(data.dimension, [])
+            data_list.append(data.value)
+            data_dict[data.dimension] = data_list
+
+        return data_dict
+
+    @property
+    def data_range(self) -> int:
+        """Get the data_range stored in computation_attributes"""
+        for comp_attr in self.computation_attributes:
+            if comp_attr.name == "data_range":
+                return int(comp_attr.value)
+
+    @property
+    def subjects(self) -> list:
+        """Get the subjects stored in computation_attributes"""
+        subjects = []
+        for comp_attr in self.computation_attributes:
+            if comp_attr.name == "subject":
+                subjects.append(comp_attr.str_value)
+        return subjects
+
+
+class ComputationAttribute(Base):
+    """
+    Class for the meta data of a computation.
+    """
+    __tablename__ = 'computation_attributes'
+
+    # Table data
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+    value = Column(Float, nullable=True)
+    str_value = Column(String, nullable=True)
+
+    # Relation data
+    computation_id = Column(Integer, ForeignKey('computations.id', ondelete="CASCADE"))
+    computation = relationship("Computation", back_populates='computation_attributes')
+
+    def __repr__(self):
+        return f"{self.name}: {self.value} - {self.str_value}"
+
+
+class ComputationData(Base):
+    """
+    raw computation data of a calculation.
+    """
+    __tablename__ = 'computation_data'
+
+    id = Column(Integer, primary_key=True)
+
+    value = Column(Float)
+    uncertainty = Column(Float, nullable=True)
+    dimension = Column(String)
+
+    # Relation data
+    computation_id = Column(Integer, ForeignKey('computations.id', ondelete="CASCADE"))
+    computation = relationship("Computation", back_populates='computation_data')
+
+    def __repr__(self):
+        return f"{self.id}: {self.value} ({self.uncertainty}) - {self.dimension}"
diff --git a/mdsuite/experiment/__init__.py b/mdsuite/experiment/__init__.py
index 45b15aa7..cdea61f3 100644
--- a/mdsuite/experiment/__init__.py
+++ b/mdsuite/experiment/__init__.py
@@ -7,3 +7,7 @@
 
 Copyright Contributors to the MDSuite Project.
 """
+
+from .experiment import Experiment
+
+__all__ = ['Experiment']
diff --git a/mdsuite/experiment/add_files.py b/mdsuite/experiment/add_files.py
new file mode 100644
index 00000000..1ada0e1d
--- /dev/null
+++ b/mdsuite/experiment/add_files.py
@@ -0,0 +1,288 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Class to handle file additions
+"""
+import logging
+
+from mdsuite.database.simulation_database import Database
+from mdsuite.file_io.file_io_dict import dict_file_io
+from mdsuite.file_io.file_read import FileProcessor
+from mdsuite.utils.exceptions import ElementMassAssignedZero
+from mdsuite.database.property_database import PropertiesDatabase
+from mdsuite.utils.meta_functions import join_path
+
+from io import UnsupportedOperation
+from tqdm import tqdm
+from pathlib import Path
+import pubchempy as pcp
+import importlib.resources
+import json
+import numpy as np
+
+log = logging.getLogger(__file__)
+
+
+class ExperimentAddingFiles:
+    """Parent class that handles the file additions"""
+
+    def __init__(self):
+        self.database_path: str = ""
+        self.memory_requirements = None
+        self.number_of_configurations = None
+        self.batch_size = None
+        self.number_of_atoms = None
+        self.species = None
+        self.property_groups = None
+        self.read_files = None
+
+    def add_data(self,
+                 trajectory_file: str = None,
+                 file_format: str = 'lammps_traj',
+                 rename_cols: dict = None,
+                 sort: bool = False,
+                 force: bool = False):
+        """
+        Add tensor_values to the database_path
+
+        Parameters
+        ----------
+        file_format :
+                Format of the file being read in. Default is file_path
+        trajectory_file : str
+                Trajectory file to be process and added to the database_path.
+        rename_cols : dict
+                If this argument is given, the columns with names in the keys of the dictionary will be replaced with
+                the values.
+        sort : bool
+                If true, the tensor_values will be sorted when being entered into the database_path.
+        force : bool
+                If true, a file will be read regardless of if it has already
+                been seen.
+        """
+
+        # Check if there is a trajectory file.
+        if trajectory_file is None:
+            raise ValueError("No tensor_values has been given")
+
+        file_check = self._check_read_files(trajectory_file)
+        if file_check:
+            if force:
+                pass
+            else:
+                log.info('This file has already been read, skipping this now.'
+                         'If this is not desired, please add force=True'
+                         'to the command.')
+                return  # End the method.
+
+        # Load the file reader and the database_path object
+        trajectory_reader, file_type = self._load_trajectory_reader(file_format, trajectory_file, sort=sort)
+        database = Database(name=Path(self.database_path, "database.hdf5").as_posix(), architecture='simulation')
+
+        # Check to see if a database_path exists
+        database_path = Path(self.database_path, 'database.hdf5')  # get theoretical path.
+
+        if file_type == 'flux':
+            flux = True
+        else:
+            flux = False
+
+        if database_path.exists():
+            self._update_database(trajectory_reader,
+                                  trajectory_file,
+                                  database,
+                                  rename_cols,
+                                  sort=sort)
+        else:
+            self._build_new_database(trajectory_reader,
+                                     trajectory_file,
+                                     database,
+                                     rename_cols=rename_cols,
+                                     flux=flux,
+                                     sort=sort)
+
+        self.build_species_dictionary()
+        self.memory_requirements = database.get_memory_information()
+
+    def _check_read_files(self, file_path: str):
+        """
+        Check if a file has been read before and add it to the hidden file.
+
+        Parameters
+        ----------
+        file_path : str
+                Path to the file.
+
+        Returns
+        -------
+
+        """
+        file_path = Path(file_path)
+        if file_path in self.read_files:
+            return True
+        else:
+            self.read_files = file_path
+            return False
+
+    def _load_trajectory_reader(self, file_format, trajectory_file, sort: bool = False):
+        try:
+            class_file_io, file_type = dict_file_io[file_format]  # file type is per atoms or flux.
+        except KeyError:
+            raise ValueError(f'{file_format} not found! \n'
+                             f'Available io formats are are: {[key for key in dict_file_io.keys()]}')
+        return class_file_io(self, file_path=trajectory_file, sort=sort), file_type
+
+    def _update_database(self, trajectory_reader: FileProcessor, trajectory_file: str, database: Database,
+                         rename_cols: dict, flux: bool = False, sort: bool = False):
+        """
+        Update the database rather than build a new database.
+
+        Returns
+        -------
+        Updates the current database.
+        """
+        counter = self.number_of_configurations
+        architecture, line_length = trajectory_reader.process_trajectory_file(rename_cols=rename_cols,
+                                                                              update_class=False)
+        number_of_new_configurations = self.number_of_configurations - counter
+        database.resize_dataset(architecture)  # initialize the database_path
+        batch_range = int(number_of_new_configurations / self.batch_size)  # calculate the batch range
+        remainder = number_of_new_configurations - (batch_range * self.batch_size)
+        structure = trajectory_reader.build_file_structure()  # build the file structure
+        with open(trajectory_file, 'r') as f_object:
+            for _ in tqdm(range(batch_range), ncols=70):
+                database.add_data(data=trajectory_reader.read_configurations(self.batch_size, f_object, line_length),
+                                  structure=structure,
+                                  start_index=counter,
+                                  batch_size=self.batch_size,
+                                  flux=flux,
+                                  n_atoms=self.number_of_atoms,
+                                  sort=sort)
+                counter += self.batch_size
+
+            if remainder > 0:
+                structure = trajectory_reader.build_file_structure(batch_size=remainder)  # build the file structure
+                database.add_data(data=trajectory_reader.read_configurations(remainder, f_object, line_length),
+                                  structure=structure,
+                                  start_index=counter,
+                                  batch_size=remainder,
+                                  flux=flux)
+
+    def _build_new_database(self, trajectory_reader: FileProcessor, trajectory_file: str, database: Database,
+                            rename_cols: dict, flux: bool = False, sort: bool = False):
+        """
+        Build a new database_path
+        """
+        # get properties of the trajectory file
+        architecture, line_length = trajectory_reader.process_trajectory_file(rename_cols=rename_cols)
+        database.initialize_database(architecture)  # initialize the database_path
+
+        batch_range = int(self.number_of_configurations / self.batch_size)  # calculate the batch range
+        remainder = self.number_of_configurations - batch_range * self.batch_size
+        counter = 0  # instantiate counter
+        structure = trajectory_reader.build_file_structure()  # build the file structure
+
+        with open(trajectory_file, 'r') as f_object:
+            for _ in tqdm(range(batch_range), ncols=70):
+                database.add_data(data=trajectory_reader.read_configurations(self.batch_size, f_object, line_length),
+                                  structure=structure,
+                                  start_index=counter,
+                                  batch_size=self.batch_size,
+                                  flux=flux,
+                                  n_atoms=self.number_of_atoms,
+                                  sort=sort)
+                counter += self.batch_size
+
+            if remainder > 0:
+                structure = trajectory_reader.build_file_structure(batch_size=remainder)  # build the file structure
+                database.add_data(data=trajectory_reader.read_configurations(remainder, f_object, line_length),
+                                  structure=structure,
+                                  start_index=counter,
+                                  batch_size=remainder,
+                                  flux=flux,
+                                  n_atoms=self.number_of_atoms,
+                                  sort=sort)
+
+        # analysis_database = AnalysisDatabase(name=os.path.join(self.database_path, "analysis_database"))
+        # analysis_database.build_database()
+        property_database = PropertiesDatabase(name=Path(self.database_path, "property_database").as_posix())
+        property_database.build_database()
+
+        # self.save_class()  # Update the class state
+
+    def build_species_dictionary(self):
+        """
+        Add information to the species dictionary
+
+        A fundamental part of this package is species specific analysis. Therefore, the Pubchempy package is
+        used to add important species specific information to the class. This will include the charge of the ions which
+        will be used in conductivity calculations.
+
+        """
+        with importlib.resources.open_text("mdsuite.data", 'PubChemElements_all.json') as json_file:
+            pse = json.loads(json_file.read())
+
+        # Try to get the species tensor_values from the Periodic System of Elements file
+        species = dict(self.species)
+        for element in self.species:
+            species[element]['charge'] = [0.0]
+            for entry in pse:
+                if pse[entry][1] == element:
+                    species[element]['mass'] = [float(pse[entry][3])]
+
+        # If gathering the tensor_values from the PSE file was not successful try to get it from Pubchem via pubchempy
+        for element in self.species:
+            if 'mass' not in self.species[element]:
+                try:
+                    temp = pcp.get_compounds(element, 'name')
+                    temp[0].to_dict(properties=['atoms', 'bonds', 'exact_mass', 'molecular_weight', 'elements'])
+                    species[element]['mass'] = [temp[0].molecular_weight]
+                    log.debug(temp[0].exact_mass)
+                except (ElementMassAssignedZero, IndexError):
+                    species[element]['mass'] = [0.0]
+                    log.warning(f'WARNING element {element} has been assigned mass=0.0')
+        # self.save_class()
+        self.species = species
+
+    def load_matrix(self, identifier: str = None, species: dict = None, select_slice: np.s_ = None, path: list = None):
+        """
+        Load a desired property matrix.
+
+        Parameters
+        ----------
+        identifier : str
+                Name of the matrix to be loaded, e.g. Unwrapped_Positions, Velocities
+        species : list
+                List of species to be loaded
+        select_slice : np.slice
+                A slice to select from the database_path.
+        path : str
+                optional path to the database_path.
+
+        Returns
+        -------
+        property_matrix : np.array, tf.tensor
+                Tensor of the property to be studied. Format depends on kwargs.
+        """
+        database = Database(name=Path(self.database_path, 'database.hdf5').as_posix())
+
+        if path is not None:
+            return database.load_data(path_list=path, select_slice=select_slice)
+
+        else:
+            # If no species list is given, use all species in the Experiment class instance.
+            if species is None:
+                species = list(self.species.keys())  # get list of all species available.
+            # If no slice is given, load all configurations.
+            if select_slice is None:
+                select_slice = np.s_[:]  # set the numpy slice object.
+
+        path_list = []
+        for item in species:
+            path_list.append(join_path(item, identifier))
+        return database.load_data(path_list=path_list, select_slice=select_slice)
diff --git a/mdsuite/experiment/experiment.py b/mdsuite/experiment/experiment.py
index cca448f4..8656a2da 100644
--- a/mdsuite/experiment/experiment.py
+++ b/mdsuite/experiment/experiment.py
@@ -14,41 +14,32 @@
 The experiment class is the main class involved in characterizing and analyzing a simulation.
 """
 import logging
-import json
 import os
 import pickle
 import sys
 from pathlib import Path
-import numpy as np
-import pubchempy as pcp
 import yaml
-from io import UnsupportedOperation
-from tqdm import tqdm
-import importlib.resources
 from datetime import datetime
-from mdsuite.calculators.computations_dict import dict_classes_computations, dict_classes_db
+from mdsuite.calculators.computations_dict import dict_classes_computations, dict_classes_db, calculators
+from mdsuite.calculators import RunComputation
 from mdsuite.time_series import time_series_dict
 from mdsuite.transformations.transformation_dict import transformations_dict
-from mdsuite.file_io.file_io_dict import dict_file_io
 from mdsuite.utils.units import units_dict
-from mdsuite.utils.meta_functions import join_path
-from mdsuite.utils.exceptions import ElementMassAssignedZero
-from mdsuite.database.simulation_database import Database
-from mdsuite.file_io.file_read import FileProcessor
-from mdsuite.database.properties_database import PropertiesDatabase
-from mdsuite.database.analysis_database import AnalysisDatabase
+from mdsuite.database.experiment_database import ExperimentDatabase
+
+from .add_files import ExperimentAddingFiles
 from .run_module import RunModule
 
 log = logging.getLogger(__file__)
 
 
-class Experiment:
+class Experiment(ExperimentDatabase, ExperimentAddingFiles):
     """
     The central experiment class fundamental to all analysis.
 
     Attributes
     ----------
-    analysis_name : str
+    name : str
             The name of the analysis being performed e.g. NaCl_1400K
     storage_path : str
             Path to where the tensor_values should be stored (best to have  drive capable of storing large files)
@@ -69,14 +60,14 @@ class Experiment:
             The total number of atoms in the simulation
    """
 
-    def __init__(self, analysis_name, storage_path='./', time_step=1.0, temperature=0, units='real',
+    def __init__(self, project, experiment_name, storage_path='./', time_step=None, temperature=None, units=None,
                  cluster_mode=False):
         """
         Initialise the experiment class.
 
         Attributes
         ----------
-        analysis_name : str
+        experiment_name : str
                 The name of the analysis being performed e.g. NaCl_1400K
         storage_path : str
                 Path to where the tensor_values should be stored (best to have  drive capable of storing large files)
@@ -90,16 +81,29 @@ def __init__(self, analysis_name, storage_path='./', time_step=1.0, temperature=
         """
 
         # Taken upon instantiation
-        self.analysis_name = analysis_name  # Name of the experiment.
+        super().__init__(project=project, experiment_name=experiment_name)
+        self.name = experiment_name  # Name of the experiment.
         self.storage_path = os.path.abspath(storage_path)  # Where to store the tensor_values
+        self.cluster_mode = cluster_mode  # whether or not the script will run on a cluster
+
+        # ExperimentDatabase stored properties:
+        # ------- #
+        # set default values
+        if units is None and self.unit_system is None:
+            units = "real"
+        if self.number_of_configurations is None:
+            self.number_of_configurations = 0  # Number of configurations in the trajectory.
+        # update database (None values are ignored)
         self.temperature = temperature  # Temperature of the experiment.
         self.time_step = time_step  # Timestep chosen for the simulation.
-        self.cluster_mode = cluster_mode  # whether or not the script will run on a cluster
+        self.unit_system = units
 
-        # Added from trajectory file
-        self.units = self.units_to_si(units)  # Units used during the simulation.
-        self.number_of_configurations = 0  # Number of configurations in the trajectory.
+        # Available properties that aren't set on default
         self.number_of_atoms = None  # Number of atoms in the simulation.
+        # ------- #
+
+        # Added from trajectory file
+        self.units = self.units_to_si(self.unit_system)  # Units used during the simulation.
         self.species = None  # Species dictionary.
         self.molecules = {}  # molecules
         self.box_array = None  # Box vectors.
@@ -118,7 +122,7 @@ def __init__(self, analysis_name, storage_path='./', time_step=1.0, temperature=
         self.logfile_path: str
         self._create_internal_file_paths()  # fill the path attributes
 
-        self.radial_distribution_function_state = False  # Set true if this has been calculated
+        # self.radial_distribution_function_state = False  # Set true if this has been calculated
         self.kirkwood_buff_integral_state = False  # Set true if it has been calculated
         self.structure_factor_state = False
 
@@ -131,93 +135,48 @@ def __init__(self, analysis_name, storage_path='./', time_step=1.0, temperature=
         self._load_or_build()
 
         # Run Computations
-        self.run_computation = RunModule(self, dict_classes_computations)
+        # self.run_computation = RunModule(self, dict_classes_computations)
+        self.run_computation = RunComputation(experiment=self)
+        self.load_data = RunComputation(experiment=self, load_data=True)
         self.analyse_time_series = RunModule(self, time_series_dict)
 
-        self._start_logging()
+        # self._start_logging()
 
         self._simulation_data: dict = {}
-        self.simulation_data_file = Path(self.storage_path) / self.analysis_name / "simulation_data.yaml"
+        self.simulation_data_file = Path(self.storage_path) / self.name / "simulation_data.yaml"
 
-    def _start_logging(self):
-        logfile_name = datetime.now().replace(microsecond=0).isoformat().replace(':', '-') + ".log"
-        logfile = os.path.join(self.logfile_path, logfile_name)
-
-        # there is a good chance, that the root logger is already defined so we have to make some changes to it!
-        root = logging.getLogger()
-
-        # Logging to the logfile
-        file_handler = logging.FileHandler(filename=logfile)
-        file_handler.setLevel(logging.INFO)  # <- file log loglevel
-
-        formatter = logging.Formatter('%(asctime)s - %(name)s (%(levelname)s) - %(message)s')
-        file_handler.setFormatter(formatter)
-        # attaching the stdout handler to the configured logging
-        root.addHandler(file_handler)
-        # get the file specific logger to get information where the log was written!
-        log.info(f"Created logfile {logfile_name} in experiment path {self.logfile_path}")
+    def __repr__(self):
+        return f"exp_{self.name}"
 
     def _create_internal_file_paths(self):
         """
         Create or update internal file paths
         """
-        self.experiment_path = os.path.join(self.storage_path, self.analysis_name)  # path to the experiment files
-        self.database_path = os.path.join(self.experiment_path, 'databases')  # path to the databases
-        self.figures_path = os.path.join(self.experiment_path, 'figures')  # path to the figures directory
-        self.logfile_path = os.path.join(self.experiment_path, 'logfiles')
+        self.experiment_path = Path(self.storage_path, self.name)  # path to the experiment files
+        self.database_path = Path(self.experiment_path, 'databases')  # path to the databases
+        self.figures_path = Path(self.experiment_path, 'figures')  # path to the figures directory
+        self.logfile_path = Path(self.experiment_path, 'logfiles')
 
-    def _load_or_build(self) -> bool:
-        """
-        Check if the experiment already exists and decide whether to load it or build a new one.
-        """
-
-        # Check if the experiment exists and load if it does.
-        if Path(self.experiment_path).exists():
-            print("This experiment already exists! I'll load it up now.")
-            # Can not log this to a file, because we don't know the file path yet!
-            self.load_class()
-            return True
-        else:
-            print("Creating a new experiment! How exciting!")
-            # Can not log this to a file, because we don't know the file path yet!
-            self._build_model()
-            return False
-
-    def load_class(self):
+    def _build_model(self):
         """
-        Load class instance
+        Build the 'experiment' for the analysis
 
-        A function to load a class instance given the project name.
+        A method to build the database_path in the hdf5 format. Within this method, several other are called to develop
+        the database_path skeleton, get configurations, and process and store the configurations. The method is
+        accompanied by a loading bar which should be customized to make it more interesting.
         """
 
-        storage_path = self.storage_path  # store the new storage path
-
-        with open(f'{self.storage_path}/{self.analysis_name}/{self.analysis_name}.bin', 'rb') as f:
-            update_dict: dict = pickle.loads(f.read())
-            for pop_item in ['run_computation', 'analyse_time_series', 'RunComputation']:
-                try:
-                    update_dict.pop(pop_item)
-                    # remove keys that should not be updated!
-                except KeyError:
-                    pass
-            self.__dict__.update(update_dict)
-
-        self.storage_path = storage_path  # set the one form the database to the new one
-        self._create_internal_file_paths()  # force rebuild every time
-
-        self._start_logging()
-        # TODO Why is this necessary? What does it exactly?
-
-    def save_class(self):
-        """
-        Saves class instance
+        # Create new analysis directory and change into it
+        try:
+            self.experiment_path.mkdir()
+            self.figures_path.mkdir()
+            self.database_path.mkdir()
+            self.logfile_path.mkdir()
+        except FileExistsError:  # throw exception if the file exits
+            return
 
-        In order to keep properties of a class the state must be stored. This method will store the instance of the
-        class for later re-loading
-        """
-        filename = os.path.join(self.experiment_path, f"{self.analysis_name}.bin")
-        with open(filename, 'wb') as save_file:
-            save_file.write(pickle.dumps(self.__dict__))  # write to file
+        # self.save_class()  # save the class state.
+        log.info(f"** An experiment has been added titled {self.name} **")
 
     @staticmethod
     def units_to_si(units_system):
@@ -243,35 +202,54 @@ def units_to_si(units_system):
             try:
                 units = units_dict[units_system]()  # executes the function to return the appropriate dictionary.
             except KeyError:
-                print('The unit experiment provided is not implemented...')
-                print('The available systems are: ')
-                [print(key) for key, _ in units_dict.items()]
-                sys.exit(-1)
+                raise KeyError(
+                    f"The unit '{units_system}' is not implemented."
+                    f" The available units are: {[x for x in units_dict]}"
+                )
         return units
 
-    def map_elements(self, mapping: dict = None):
+    #
+    def _load_or_build(self) -> bool:
         """
-        Map numerical keys to element names in the Experiment class and database_path.
-
-        Returns
-        -------
-        Updates the class
+        Check if the experiment already exists and decide whether to load it or build a new one.
         """
 
-        if mapping is None:
-            log.info("Must provide a mapping")
-            return
-
-        # rename keys in species dictionary
-        for item in mapping:
-            self.species[mapping[item]] = self.species.pop(item)
-
-        # rename database_path groups
-        db_object = Database(name=os.path.join(self.database_path, "database_path.hdf5"))
-        db_object.change_key_names(mapping)
-
-        self.save_class()  # update the class state
+        # Check if the experiment exists and load if it does.
+        if Path(self.experiment_path).exists():
+            log.info("This experiment already exists! I'll load it up now.")
+            # self.load_class()
+            return True
+        else:
+            log.info("Creating a new experiment!")
+            self._build_model()
+            return False
 
+    def save_class(self):
+        log.warning("Using depreciated method `save_class`!")
+
+    # def map_elements(self, mapping: dict = None):
+    #     """
+    #     Map numerical keys to element names in the Experiment class and database_path.
+    #
+    #     Returns
+    #     -------
+    #     Updates the class
+    #     """
+    #
+    #     if mapping is None:
+    #         log.info("Must provide a mapping")
+    #         return
+    #
+    #     # rename keys in species dictionary
+    #     for item in mapping:
+    #         self.species[mapping[item]] = self.species.pop(item)
+    #
+    #     # rename database_path groups
+    #     db_object = Database(name=os.path.join(self.database_path, "database_path.hdf5"))
+    #     db_object.change_key_names(mapping)
+    #
+    #     self.save_class()  # update the class state
+    #
     def perform_transformation(self, transformation_name, **kwargs):
         """
         Perform a transformation on the experiment.
@@ -291,538 +269,215 @@ def perform_transformation(self, transformation_name, **kwargs):
         try:
             transformation = transformations_dict[transformation_name]
         except KeyError:
-            print(f'{transformation_name} not found')
-            print('Available transformations are:')
-            [print(key) for key in transformations_dict.keys()]
-            sys.exit(1)
+            raise ValueError(
+                f'{transformation_name} not found! \n'
+                f'Available transformations are: {[key for key in transformations_dict]}'
+            )
 
         transformation_run = transformation(self, **kwargs)
         transformation_run.run_transformation()  # perform the transformation
 
-    def _build_model(self):
-        """
-        Build the 'experiment' for the analysis
-
-        A method to build the database_path in the hdf5 format. Within this method, several other are called to develop
-        the database_path skeleton, get configurations, and process and store the configurations. The method is
-        accompanied by a loading bar which should be customized to make it more interesting.
-        """
-
-        # Create new analysis directory and change into it
-        try:
-            os.mkdir(self.experiment_path)  # Make the experiment directory
-            os.mkdir(self.figures_path)  # Create a directory to save images
-            os.mkdir(self.database_path)  # Create a directory for tensor_values
-            os.mkdir(self.logfile_path)
-
-        except FileExistsError:  # throw exception if the file exits
-            return
-
-        self.save_class()  # save the class state.
-        print(f"** An experiment has been added titled {self.analysis_name} **")
-
-    def print_class_attributes(self):
-        """
-        Print all attributes of the class
-
-        Returns
-        -------
-        attributes : list
-                List of class attribute tuples of (key, value)
-        """
-
-        attributes = []  # define empty array
-        for item in vars(self).items():  # loop over class attributes
-            attributes.append(item)  # append to the attributes array
-        for tuple_attributes in attributes:  # Split the key and value terms
-            log.info(f"{tuple_attributes[0]}: {tuple_attributes[1]}")
-
-        return attributes
-
-    def _check_read_files(self, file_path: str) -> bool:
-        """
-        Check if a file has been read before and add it to the hidden file.
-
-        Parameters
-        ----------
-        file_path : str
-                Path to the file.
-
-        Returns
-        -------
-        already_read : bool
-            True if the file has been read before, else False.
-
-        """
-
-        read_files = Path(self.experiment_path, ".read_files.txt")
-
-        with open(read_files, mode="a+") as file_:
-            file_.seek(0)
-            data = [line.strip() for line in file_]
-            already_read = file_path in data
-
-            if not already_read:
-                file_.write(f'{file_path}\n')
-            return already_read
-
-    def add_data(self,
-                 trajectory_file: str = None,
-                 file_format: str = 'lammps_traj',
-                 rename_cols: dict = None,
-                 sort: bool = False,
-                 force: bool = False):
-        """
-        Add tensor_values to the database_path
-
-        Parameters
-        ----------
-        file_format :
-                Format of the file being read in. Default is file_path
-        trajectory_file : str
-                Trajectory file to be process and added to the database_path.
-        rename_cols : dict
-                If this argument is given, the columns with names in the keys of the dictionary will be replaced with
-                the values.
-        sort : bool
-                If true, the tensor_values will be sorted when being entered into the database_path.
-        force : bool
-                If true, a file will be read regardless of if it has already
-                been seen.
-        """
-
-        # Check if there is a trajectory file.
-        if trajectory_file is None:
-            print("No tensor_values has been given")
-            sys.exit(1)
-
-        already_read = self._check_read_files(trajectory_file)
-        if already_read and not force:
-            log.info('This file has already been read, skipping this now. '
-                     'If this is not desired, please add force=True '
-                     'to the command.')
-            return  # End the method.
-
-        # Load the file reader and the database_path object
-        trajectory_reader, file_type = self._load_trajectory_reader(file_format, trajectory_file, sort=sort)
-        database = Database(name=os.path.join(self.database_path, "database.hdf5"), architecture='simulation')
-
-        # Check to see if a database_path exists
-        database_path = Path(os.path.join(self.database_path, 'database.hdf5'))  # get theoretical path.
-
-        if file_type == 'flux':
-            flux = True
-        else:
-            flux = False
-
-        if database_path.exists():
-            self._update_database(trajectory_reader,
-                                  trajectory_file,
-                                  database,
-                                  rename_cols,
-                                  sort=sort)
-        else:
-            self._build_new_database(trajectory_reader,
-                                     trajectory_file,
-                                     database,
-                                     rename_cols=rename_cols,
-                                     flux=flux,
-                                     sort=sort)
-
-        self.build_species_dictionary()
-        self.memory_requirements = database.get_memory_information()
-        self.save_class()  # Update the class state.
-
-    def _build_new_database(self, trajectory_reader: FileProcessor, trajectory_file: str, database: Database,
-                            rename_cols: dict, flux: bool = False, sort: bool = False):
-        """
-        Build a new database_path
-        """
-        # get properties of the trajectory file
-        architecture, line_length = trajectory_reader.process_trajectory_file(rename_cols=rename_cols)
-        database.initialize_database(architecture)  # initialize the database_path
-
-        batch_range = int(self.number_of_configurations / self.batch_size)  # calculate the batch range
-        remainder = self.number_of_configurations - batch_range * self.batch_size
-        counter = 0  # instantiate counter
-        structure = trajectory_reader.build_file_structure()  # build the file structure
-
-        with open(trajectory_file, 'r') as f_object:
-            for _ in tqdm(range(batch_range), ncols=70):
-                database.add_data(data=trajectory_reader.read_configurations(self.batch_size, f_object, line_length),
-                                  structure=structure,
-                                  start_index=counter,
-                                  batch_size=self.batch_size,
-                                  flux=flux,
-                                  n_atoms=self.number_of_atoms,
-                                  sort=sort)
-                counter += self.batch_size
-
-            if remainder > 0:
-                structure = trajectory_reader.build_file_structure(batch_size=remainder)  # build the file structure
-                database.add_data(data=trajectory_reader.read_configurations(remainder, f_object, line_length),
-                                  structure=structure,
-                                  start_index=counter,
-                                  batch_size=remainder,
-                                  flux=flux,
-                                  n_atoms=self.number_of_atoms,
-                                  sort=sort)
-
-        analysis_database = AnalysisDatabase(name=os.path.join(self.database_path, "analysis_database"))
-        analysis_database.build_database()
-        property_database = PropertiesDatabase(name=os.path.join(self.database_path, "property_database"))
-        property_database.build_database()
-
-        self.save_class()  # Update the class state
-
-    def _update_database(self, trajectory_reader: FileProcessor, trajectory_file: str, database: Database,
-                         rename_cols: dict, flux: bool = False, sort: bool = False):
-        """
-        Update the database rather than build a new database.
-
-        Returns
-        -------
-        Updates the current database.
-        """
-        counter = self.number_of_configurations
-        architecture, line_length = trajectory_reader.process_trajectory_file(rename_cols=rename_cols,
-                                                                              update_class=False)
-        number_of_new_configurations = self.number_of_configurations - counter
-        database.resize_dataset(architecture)  # initialize the database_path
-        batch_range = int(number_of_new_configurations / self.batch_size)  # calculate the batch range
-        remainder = number_of_new_configurations - (batch_range * self.batch_size)
-        structure = trajectory_reader.build_file_structure()  # build the file structure
-        f_object = open(trajectory_file, 'r')  # open the trajectory file
-        for _ in tqdm(range(batch_range), ncols=70):
-            database.add_data(data=trajectory_reader.read_configurations(self.batch_size, f_object, line_length),
-                              structure=structure,
-                              start_index=counter,
-                              batch_size=self.batch_size,
-                              flux=flux,
-                              n_atoms=self.number_of_atoms,
-                              sort=sort)
-            counter += self.batch_size
-
-        if remainder > 0:
-            structure = trajectory_reader.build_file_structure(batch_size=remainder)  # build the file structure
-            database.add_data(data=trajectory_reader.read_configurations(remainder, f_object, line_length),
-                              structure=structure,
-                              start_index=counter,
-                              batch_size=remainder,
-                              flux=flux)
-
-        f_object.close()
-
-    def _load_trajectory_reader(self, file_format, trajectory_file, sort: bool = False):
-        try:
-            class_file_io, file_type = dict_file_io[file_format]  # file type is per atoms or flux.
-        except KeyError:
-            print(f'{file_format} not found')
-            print('Available io formats are are:')
-            [print(key) for key in dict_file_io.keys()]
-            sys.exit(1)
-        return class_file_io(self, file_path=trajectory_file, sort=sort), file_type
-
-    def build_species_dictionary(self):
-        """
-        Add information to the species dictionary
-
-        A fundamental part of this package is species specific analysis. Therefore, the Pubchempy package is
-        used to add important species specific information to the class. This will include the charge of the ions which
-        will be used in conductivity calculations.
-
-        """
-        with importlib.resources.open_text("mdsuite.data", 'PubChemElements_all.json') as json_file:
-            pse = json.loads(json_file.read())
-
-        # Try to get the species tensor_values from the Periodic System of Elements file
-        for element in self.species:
-            self.species[element]['charge'] = [0.0]
-            for entry in pse:
-                if pse[entry][1] == element:
-                    self.species[element]['mass'] = [float(pse[entry][3])]
-
-        # If gathering the tensor_values from the PSE file was not successful try to get it from Pubchem via pubchempy
-        for element in self.species:
-            if 'mass' not in self.species[element]:
-                try:
-                    temp = pcp.get_compounds(element, 'name')
-                    temp[0].to_dict(properties=['atoms', 'bonds', 'exact_mass', 'molecular_weight', 'elements'])
-                    self.species[element]['mass'] = temp[0].molecular_weight
-                    print(temp[0].exact_mass)
-                except (ElementMassAssignedZero, IndexError):
-                    self.species[element]['mass'] = [0.0]
-                    print(f'WARNING element {element} has been assigned mass=0.0')
-        self.save_class()
-
-    def set_element(self, old_name, new_name):
-        """
-        Change the name of the element in the self.species dictionary
-
-        Parameters
-        ----------
-        old_name : str
-                Name of the element you want to change
-        new_name : str
-                New name of the element
-        """
-        # Check if the new name is new
-        if new_name != old_name:
-            self.species[new_name] = self.species[old_name]  # update dict
-            del self.species[old_name]  # remove old entry
-
-    def set_charge(self, element: str, charge: float):
-        """
-        Set the charge/s of an element
-
-        Parameters
-        ----------
-        element : str
-                Name of the element whose charge you want to change
-        charge : list
-                New charge/s of the element
-        """
-        self.species[element]['charge'] = [charge]  # update entry
-        self.save_class()
-
-    def set_mass(self, element: str, mass: float):
-        """
-        Set the mass/es of an element
-
-        Parameters
-        ----------
-        element : str
-                Name of the element whose mass you want to change
-        mass : list
-                New mass/es of the element
-        """
-        self.species[element]['mass'] = mass  # update the mass
-
-    def load_matrix(self, identifier: str = None, species: dict = None, select_slice: np.s_ = None, path: list = None):
-        """
-        Load a desired property matrix.
-
-        Parameters
-        ----------
-        identifier : str
-                Name of the matrix to be loaded, e.g. Unwrapped_Positions, Velocities
-        species : list
-                List of species to be loaded
-        select_slice : np.slice
-                A slice to select from the database_path.
-        path : str
-                optional path to the database_path.
-
-        Returns
-        -------
-        property_matrix : np.array, tf.tensor
-                Tensor of the property to be studied. Format depends on kwargs.
-        """
-        database = Database(name=os.path.join(self.database_path, 'database.hdf5'))
-
-        if path is not None:
-            return database.load_data(path_list=path, select_slice=select_slice)
-
-        else:
-            # If no species list is given, use all species in the Experiment class instance.
-            if species is None:
-                species = list(self.species.keys())  # get list of all species available.
-            # If no slice is given, load all configurations.
-            if select_slice is None:
-                select_slice = np.s_[:]  # set the numpy slice object.
-
-        path_list = []
-        for item in species:
-            path_list.append(join_path(item, identifier))
-        return database.load_data(path_list=path_list, select_slice=select_slice)
-
-    @property
-    def results(self):
-        """
-        Property to get access to the results in a dictionary
-
-        Returns
-        -------
-        self._results: dict
-            the actual dictionary with the results
-        """
-        return self._results
-
-    @results.getter
-    def results(self):
-        """
-        Getter to retrieve the results from the YAML file in a dictionary
-        :return: dict
-
-        Returns
-        -------
-        self._results: dict
-            the actual dictionary with the results from the YAML file
-        """
-
-        with open(os.path.join(self.database_path, 'system_properties.yaml')) as pfr:
-            self._results = yaml.load(pfr, Loader=yaml.Loader)  # collect the data in the yaml file
-
-        return self._results
-
-    @results.setter
-    def results(self, result_dict: dict):
-        """
-        Setter to dump the results to the YAML file
-
-        Parameters
-        ----------
-        result_dict: dict
-            dictionary with the results. It will store them in the system_properties.yaml file.
-
-        """
-
-        with open(os.path.join(self.database_path, 'system_properties.yaml'), 'w') as pfw:
-            yaml.dump(result_dict, pfw)
-
-    def write_xyz(self, dump_property: str = "Positions", species: list = None, name: str = 'dump.xyz'):
-        """
-        Write an xyz file from a database dataset
-        """
-        if species is None:
-            species = list(self.species)
-
-        database = Database(name=os.path.join(self.database_path, "database.hdf5"), architecture='simulation')
-
-        path_list = [join_path(s, dump_property) for s in species]
-        if len(species) == 1:
-            data_matrix = [database.load_data(path_list=path_list, select_slice=np.s_[:, 0:500])]
-        else:
-            data_matrix = database.load_data(path_list=path_list, select_slice=np.s_[:, 0:500])
-        n_atoms = sum(len(self.species[s]['indices']) for s in species)
-
-        with open(f"{name}.xyz", 'w') as f:
-            for i in tqdm(range(500), ncols=70):
-                f.write(f"{n_atoms}\n")
-                f.write("Generated by the mdsuite xyz writer\n")
-                for j, atom_species in enumerate(species):
-                    for atom in data_matrix[j].numpy():
-                        f.write(
-                            f"{atom_species:<2}    {atom[i][0]:>9.4f}    {atom[i][1]:>9.4f}    {atom[i][2]:>9.4f}\n")
-
-    def export_data(self, group: str, key: str = None, sub_key: str = None):
-        """
-        Export data from the analysis database.
-
-        Parameters
-        ----------
-        group : str
-                Group in the database from which data should be loaded
-        key  : str
-                Additional identifier.
-        sub_key : str
-                Additional identifier
-        Returns
-        -------
-        saves a csv to the working directory.
-        """
-        database = Database(name=os.path.join(self.database_path, 'analysis_data.hdf5'), architecture='analysis')
-        database.export_csv(group=group, key=key, sub_key=sub_key)
-
-    def summarise(self):
-        """
-        Summarise the properties of the experiment.
-        """
-        database = Database(name=os.path.join(self.database_path, 'database.hdf5'))
-        print(f"MDSuite {self.analysis_name} Summary\n")
-        print("==================================================================================\n")
-        print(f"Name: {self.analysis_name}\n")
-        print(f"Temperature: {self.temperature} K\n")
-        print(f"Number of Configurations: {self.number_of_configurations}\n")
-        print(f"Number of Atoms: {self.number_of_atoms}\n")
-        print("Species Summary\n")
-        print("---------------\n")
-        print("Atomic Species\n")
-        print("***************\n")
-        for item in self.species:
-            try:
-                print(f"{item}: {len(self.species[item]['indices'])}\n")
-            except ValueError:
-                pass
-        print("Molecule Species\n")
-        print("*****************\n")
-        for item in self.molecules:
-            try:
-                print(f"{item}: {len(self.molecules[item]['indices'])}\n")
-            except ValueError:
-                pass
-        print("Database Information\n")
-        print("---------------\n")
-        print(f"Database Path: {self.database_path}/database.hdf5\n")
-        print(f"Database Size: {os.path.getsize(os.path.join(self.database_path, 'database.hdf5')) * 1e-9: 6.3f}GB\n")
-        print(f"Data Groups: {database.get_database_summary()}\n")
-        print("==================================================================================\n")
-
-    def export_property_data(self, parameters: dict):
-        """
-        Export property data from the SQL database.
-
-        Parameters
-        ----------
-        parameters : dict
-                Parameters to be used in the addition, i.e.
-                {"Analysis": "Green_Kubo_Self_Diffusion", "Subject": "Na", "data_range": 500}
-        Returns
-        -------
-        output : list
-                A list of rows represneted as dictionaries.
-        """
-        database = PropertiesDatabase(name=os.path.join(self.database_path, 'property_database'))
-        output = database.load_data(parameters)
-
-        return output
-
-    @property
-    def simulation_data(self):
-        """
-        Load simulation data from internals.
-        If not available try to read them from file
-
-        Returns
-        -------
-        dict: A dictionary containing all simulation_data
-
-        """
-        if len(self._simulation_data) == 0:
-            try:
-                with open(self.simulation_data_file) as f:
-                    self._simulation_data = yaml.safe_load(f)
-            except FileNotFoundError:
-                log.debug(f"Could not find any data in from {self.simulation_data_file} or self._simulation_data. ")
-        return self._simulation_data
-
-    @simulation_data.setter
-    def simulation_data(self, value: dict):
-        """Update simulation data
-
-        Try to load the data from self.simulation_data_file, update the internals and update the yaml file.
-
-        Parameters
-        ----------
-        value: dict
-            A dictionary containing the (new) simulation data
-
-        Returns
-        -------
-        Updates the internal simulation_data
-
-        """
-        try:
-            with open(self.simulation_data_file) as f:
-                log.debug("Load simulation data from yaml file")
-                simulation_data = yaml.safe_load(f)
-                if simulation_data is None:
-                    simulation_data = dict()
-        except FileNotFoundError:
-            simulation_data = {}
-        simulation_data.update(value)
-        log.debug("Updating yaml file")
-        self._simulation_data = simulation_data
-
-        with open(self.simulation_data_file, "w") as f:
-            yaml.safe_dump(simulation_data, f)
+    #
+    # def print_class_attributes(self):
+    #     """
+    #     Print all attributes of the class
+    #
+    #     Returns
+    #     -------
+    #     attributes : list
+    #             List of class attribute tuples of (key, value)
+    #     """
+    #
+    #     attributes = []  # define empty array
+    #     for item in vars(self).items():  # loop over class attributes
+    #         attributes.append(item)  # append to the attributes array
+    #     for tuple_attributes in attributes:  # Split the key and value terms
+    #         log.info(f"{tuple_attributes[0]}: {tuple_attributes[1]}")
+    #
+    #     return attributes
+    #
+    #
+    #
+    #
+    #
+    # def set_element(self, old_name, new_name):
+    #     """
+    #     Change the name of the element in the self.species dictionary
+    #
+    #     Parameters
+    #     ----------
+    #     old_name : str
+    #             Name of the element you want to change
+    #     new_name : str
+    #             New name of the element
+    #     """
+    #     # Check if the new name is new
+    #     if new_name != old_name:
+    #         self.species[new_name] = self.species[old_name]  # update dict
+    #         del self.species[old_name]  # remove old entry
+    #
+    # def set_charge(self, element: str, charge: float):
+    #     """
+    #     Set the charge/s of an element
+    #
+    #     Parameters
+    #     ----------
+    #     element : str
+    #             Name of the element whose charge you want to change
+    #     charge : list
+    #             New charge/s of the element
+    #     """
+    #     self.species[element]['charge'] = [charge]  # update entry
+    #     self.save_class()
+    #
+    # def set_mass(self, element: str, mass: float):
+    #     """
+    #     Set the mass/es of an element
+    #
+    #     Parameters
+    #     ----------
+    #     element : str
+    #             Name of the element whose mass you want to change
+    #     mass : list
+    #             New mass/es of the element
+    #     """
+    #     self.species[element]['mass'] = mass  # update the mass
+    #
+    #
+    # @property
+    # def results(self):
+    #     """
+    #     Property to get access to the results in a dictionary
+    #
+    #     Returns
+    #     -------
+    #     self._results: dict
+    #         the actual dictionary with the results
+    #     """
+    #     return self._results
+    #
+    # @results.getter
+    # def results(self):
+    #     """
+    #     Getter to retrieve the results from the YAML file in a dictionary
+    #     :return: dict
+    #
+    #     Returns
+    #     -------
+    #     self._results: dict
+    #         the actual dictionary with the results from the YAML file
+    #     """
+    #
+    #     with open(os.path.join(self.database_path, 'system_properties.yaml')) as pfr:
+    #         self._results = yaml.load(pfr, Loader=yaml.Loader)  # collect the data in the yaml file
+    #
+    #     return self._results
+    #
+    # @results.setter
+    # def results(self, result_dict: dict):
+    #     """
+    #     Setter to dump the results to the YAML file
+    #
+    #     Parameters
+    #     ----------
+    #     result_dict: dict
+    #         dictionary with the results. It will store them in the system_properties.yaml file.
+    #
+    #     """
+    #
+    #     with open(os.path.join(self.database_path, 'system_properties.yaml'), 'w') as pfw:
+    #         yaml.dump(result_dict, pfw)
+    #
+    # def write_xyz(self, dump_property: str = "Positions", species: list = None, name: str = 'dump.xyz'):
+    #     """
+    #     Write an xyz file from a database dataset
+    #     """
+    #     if species is None:
+    #         species = list(self.species)
+    #
+    #     database = Database(name=os.path.join(self.database_path, "database.hdf5"), architecture='simulation')
+    #
+    #     path_list = [join_path(s, dump_property) for s in species]
+    #     if len(species) == 1:
+    #         data_matrix = [database.load_data(path_list=path_list, select_slice=np.s_[:, 0:500])]
+    #     else:
+    #         data_matrix = database.load_data(path_list=path_list, select_slice=np.s_[:, 0:500])
+    #     n_atoms = sum(len(self.species[s]['indices']) for s in species)
+    #
+    #     with open(f"{name}.xyz", 'w') as f:
+    #         for i in tqdm(range(500), ncols=70):
+    #             f.write(f"{n_atoms}\n")
+    #             f.write("Generated by the mdsuite xyz writer\n")
+    #             for j, atom_species in enumerate(species):
+    #                 for atom in data_matrix[j].numpy():
+    #                     f.write(
+    #                         f"{atom_species:<2}    {atom[i][0]:>9.4f}    {atom[i][1]:>9.4f}    {atom[i][2]:>9.4f}\n")
+    #
+    # def export_data(self, group: str, key: str = None, sub_key: str = None):
+    #     """
+    #     Export data from the analysis database.
+    #
+    #     Parameters
+    #     ----------
+    #     group : str
+    #             Group in the database from which data should be loaded
+    #     key  : str
+    #             Additional identifier.
+    #     sub_key : str
+    #             Additional identifier
+    #     Returns
+    #     -------
+    #     saves a csv to the working directory.
+    #     """
+    #     database = Database(name=os.path.join(self.database_path, 'analysis_data.hdf5'), architecture='analysis')
+    #     database.export_csv(group=group, key=key, sub_key=sub_key)
+    #
+    # @property
+    # def simulation_data(self):
+    #     """
+    #     Load simulation data from internals.
+    #     If not available try to read them from file
+    #
+    #     Returns
+    #     -------
+    #     dict: A dictionary containing all simulation_data
+    #
+    #     """
+    #     if len(self._simulation_data) == 0:
+    #         try:
+    #             with open(self.simulation_data_file) as f:
+    #                 self._simulation_data = yaml.safe_load(f)
+    #         except FileNotFoundError:
+    #             log.debug(f"Could not find any data in from {self.simulation_data_file} or self._simulation_data. ")
+    #     return self._simulation_data
+    #
+    # @simulation_data.setter
+    # def simulation_data(self, value: dict):
+    #     """Update simulation data
+    #
+    #     Try to load the data from self.simulation_data_file, update the internals and update the yaml file.
+    #
+    #     Parameters
+    #     ----------
+    #     value: dict
+    #         A dictionary containing the (new) simulation data
+    #
+    #     Returns
+    #     -------
+    #     Updates the internal simulation_data
+    #
+    #     """
+    #     try:
+    #         with open(self.simulation_data_file) as f:
+    #             log.debug("Load simulation data from yaml file")
+    #             simulation_data = yaml.safe_load(f)
+    #             if simulation_data is None:
+    #                 simulation_data = dict()
+    #     except FileNotFoundError:
+    #         simulation_data = {}
+    #     simulation_data.update(value)
+    #     log.debug("Updating yaml file")
+    #     self._simulation_data = simulation_data
+    #
+    #     with open(self.simulation_data_file, "w") as f:
+    #         yaml.safe_dump(simulation_data, f)
diff --git a/mdsuite/experiment/run_module.py b/mdsuite/experiment/run_module.py
index 69161e65..2497e5f3 100644
--- a/mdsuite/experiment/run_module.py
+++ b/mdsuite/experiment/run_module.py
@@ -24,7 +24,7 @@ class RunModule:
     attributes of the `experiment.run_computation` helper class.
     """
 
-    def __init__(self, parent, module_dict):
+    def __init__(self, parent, module_dict, **kwargs):
         """Initialize the attributes
         Parameters
         ----------
@@ -32,8 +32,11 @@ def __init__(self, parent, module_dict):
             the experiment to be passed to the calculator afterwards
         module_dict: dict
             A dictionary containing all the modules / calculators / Time series operations with their names as keys
+        kwargs:
+            Additional parameters to be passed to the module_dict
         """
         self.parent: Experiment = parent
+        self._kwargs = kwargs
         self._module_dict = module_dict
         for key in self._module_dict:
             self.__setattr__(key, self._module_dict[key])
@@ -55,4 +58,4 @@ def __getattribute__(self, item):
         except KeyError:
             return super().__getattribute__(item)
 
-        return class_compute(experiment=self.parent)
+        return class_compute(experiment=self.parent, **self._kwargs)
diff --git a/mdsuite/file_io/file_read.py b/mdsuite/file_io/file_read.py
index 5d10e624..1abe8cbf 100644
--- a/mdsuite/file_io/file_read.py
+++ b/mdsuite/file_io/file_read.py
@@ -12,8 +12,12 @@
 Summary
 -------
 """
+from __future__ import annotations
 import abc
-from typing import TextIO
+from typing import TextIO, TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
 
 
 class FileProcessor(metaclass=abc.ABCMeta):
@@ -22,20 +26,20 @@ class FileProcessor(metaclass=abc.ABCMeta):
 
     Attributes
     ----------
-    obj, experiment : object
+    obj, experiment : Experiment
 
             File object to be opened and read in.
     header_lines : int
             Number of header lines in the file format being read.
     """
 
-    def __init__(self, obj, header_lines, file_path):
+    def __init__(self, obj: Experiment, header_lines, file_path):
         """
         Python constructor
 
         Parameters
         ----------
-        obj : object
+        obj : Experiment
                 Experiment class instance to add to.
 
         header_lines : int
diff --git a/mdsuite/file_io/flux_files.py b/mdsuite/file_io/flux_files.py
index 01ade995..bf9725a4 100644
--- a/mdsuite/file_io/flux_files.py
+++ b/mdsuite/file_io/flux_files.py
@@ -50,7 +50,7 @@ def build_database_skeleton(self):
         """
         We need to override the method because the flux files have a different structure
         """
-        # database_path = hf.File('{0}/{1}/{1}.hdf5'.format(self.project.storage_path, self.project.analysis_name), 'w',
+        # database_path = hf.File('{0}/{1}/{1}.hdf5'.format(self.project.storage_path, self.project.name), 'w',
         #                    libver='latest')
         axis_names = ('x', 'y', 'z', 'xy', 'xz', 'yz', 'yx', 'zx', 'zy')
 
diff --git a/mdsuite/file_io/lammps_trajectory_files.py b/mdsuite/file_io/lammps_trajectory_files.py
index deefbeae..55193b1f 100644
--- a/mdsuite/file_io/lammps_trajectory_files.py
+++ b/mdsuite/file_io/lammps_trajectory_files.py
@@ -146,8 +146,7 @@ def _get_species_information(self, number_of_atoms: int):
             else:
                 raise NoElementInDump
         except NoElementInDump:
-            print("Insufficient species or type identification available.")
-            sys.exit(1)
+            raise ValueError("Insufficient species or type identification available.")
 
         column_dict_properties = self._get_column_properties(header[8], skip_words=2)  # get properties
 
diff --git a/mdsuite/file_io/trajectory_files.py b/mdsuite/file_io/trajectory_files.py
index ee55cae5..eb266342 100644
--- a/mdsuite/file_io/trajectory_files.py
+++ b/mdsuite/file_io/trajectory_files.py
@@ -104,7 +104,6 @@ def read_configurations(self, number_of_configurations: int, file_object: TextIO
 
             # Read the tensor_values into the arrays.
             for k in range(self.experiment.number_of_atoms):
-
                 configurations_data[counter] = np.array(list(file_object.readline().split()))
                 counter += 1  # update the counter
         return configurations_data
diff --git a/mdsuite/project.py b/mdsuite/project.py
deleted file mode 100644
index d72a5211..00000000
--- a/mdsuite/project.py
+++ /dev/null
@@ -1,352 +0,0 @@
-"""
-This program and the accompanying materials are made available under the terms of the
-Eclipse Public License v2.0 which accompanies this distribution, and is available at
-https://www.eclipse.org/legal/epl-v20.html
-
-SPDX-License-Identifier: EPL-2.0
-
-Copyright Contributors to the MDSuite Project.
-
-Module for the Project class
-
-Summary
--------
-Module containing all the code for the Project class. The project class is the governing class in the
-mdsuite program. Within the project class include all of the method required to add a new experiment and
-compare the results of the analysis on that experiment.
-"""
-import logging
-import os
-import pickle
-from datetime import datetime
-from pathlib import Path
-from typing import Union
-import shutil
-from mdsuite.experiment.experiment import Experiment
-from mdsuite.utils.meta_functions import simple_file_read, find_item
-
-log = logging.getLogger(__file__)
-
-
-class Project:
-    """
-    Class for the main container of all experiments.
-
-    The Project class acts as the encompassing class for analysis with MDSuite. It contains all method required to add
-    and analyze new experiments. These experiments may then be compared with one another quickly. The state of the class
-    is saved and updated after each operation in order to retain the most current state of the analysis.
-
-    Attributes
-    ----------
-    name : str
-            The name of the project
-
-    description : str
-            A short description of the project
-
-    storage_path : str
-            Where to store the tensor_values and databases. This may not simply be the current directory if the
-            databases are expected to be quite large.
-
-    experiments : dict
-            A dict of class objects. Class objects are instances of the experiment class for different
-            experiments.
-    """
-
-    def __init__(self, name: str = "My_Project", storage_path: str = "./"):
-        """
-        Project class constructor
-
-        The constructor will check to see if the project already exists, if so, it will load the state of each of the
-        classes so that they can be used again. If the project is new, the constructor will build the necessary file
-        structure for the project.
-
-        Parameters
-        ----------
-        name : str
-                The name of the project.
-        storage_path : str
-                Where to store the tensor_values and databases. This should be a place with sufficient storage space
-                for the full analysis.
-        """
-        self.name = f"{name}_MDSuite_Project"
-        self.description = None
-        self.storage_path = storage_path
-
-        self.experiments = {}
-
-        # Check for project directory, if none exist, create a new one
-        test_dir = Path(f"{self.storage_path}/{self.name}")
-        if test_dir.exists():
-            print("Loading the class state")
-            self._load_class()
-
-            # load the class state for each experiment attached to the Project.
-            for experiment in self.experiments.values():
-                experiment.load_class()
-
-            # List the experiments available to the user
-            self.__str__()
-        else:
-            os.mkdir(f"{self.storage_path}/{self.name}")
-            self._save_class()
-
-    def __str__(self):
-        return self.list_experiments()
-
-    def add_description(self, description: str):
-        """
-        Allow users to add a short description to their project
-
-        Parameters
-        ----------
-        description : str
-                Description of the project. If the string ends in .txt, the contents of the txt file will be read. If
-                it ends in .md, same outcome. Anything else will be read as is.
-        """
-
-        # Check the file type and read accordingly
-        if description[-3:] == "txt":
-            self.description = simple_file_read(description)
-        elif description[-2:] == "md":
-            self.description = simple_file_read(description)
-        else:
-            self.description = description
-
-        self._save_class()  # Update the class state
-
-    def list_experiments(self):
-        """
-        List the available experiments as a numerical list.
-
-        Returns
-        -------
-        str: per-line list of experiments
-        """
-        list_experiments = []
-        for idx, experiment in enumerate(self.experiments):
-            list_experiments.append(f"{idx}.) {experiment}")
-        return '\n'.join(list_experiments)
-
-    def _load_class(self):
-        """
-        Load the class state of the Project class from a saved file.
-        """
-
-        class_file = open(f'{self.storage_path}/{self.name}/{self.name}_state.bin', 'rb')  # Open the class state file
-        pickle_data = class_file.read()  # Read in the tensor_values
-        class_file.close()  # Close the state file
-
-        self.__dict__.update(pickle.loads(pickle_data))  # Initialize the class with the loaded parameters
-
-    def _save_class(self):
-        """
-        Saves class instance
-
-        In order to keep properties of a class the state must be stored. This method will store the instance of the
-        class for later re-loading
-        """
-        self.__dict__.update(self.experiments)  # updates the dictionary with the new experiments added
-
-        save_file = open(f"{self.storage_path}/{self.name}/{self.name}_state.bin", 'wb')  # Open the class state file
-        save_file.write(pickle.dumps(self.__dict__))  # write the current state of the class
-        save_file.close()  # Close the state file
-
-    def add_experiment(self, experiment: Union[str, dict] = None, timestep: float = None, temperature: float = None,
-                       units: str = None, cluster_mode: bool = None):
-        """
-        Add an experiment to the project
-
-        Parameters
-        ----------
-        cluster_mode : bool
-                If true, cluster mode is parsed to the experiment class.
-        experiment : str
-                Name to use for the experiment class.
-        timestep : float
-                Timestep used during the simulation.
-        temperature : float
-                Temperature the simulation was performed at and is to be used in calculation.
-        units : str
-                LAMMPS units used
-        """
-
-        if type(experiment) is str:
-            # Set a name in case none is given
-            if experiment is None:
-                experiment = f"Experiment_{datetime.now()}"  # set the experiment name to the current date and time
-
-            # Run a check to see if that experiment already exists
-            test_file = Path(f"{self.storage_path}/{self.name}/{experiment}")
-
-            # Check if the file exists, if so, return the method without changing the class state
-            if test_file.exists():
-                print("This experiment already exists")
-                return
-
-            # If the experiment does not exists, instantiate a new Experiment
-            new_experiment = Experiment(experiment,
-                                        storage_path=f"{self.storage_path}/{self.name}",
-                                        time_step=timestep,
-                                        units=units,
-                                        temperature=temperature,
-                                        cluster_mode=cluster_mode)
-
-            self.experiments[new_experiment.analysis_name] = new_experiment  # add the new experiment to the dictionary
-        else:
-            for item in experiment:
-                # Run a check to see if that experiment already exists
-                test_file = Path(f"{self.storage_path}/{self.name}/{item}")
-
-                # Check if the file exists, if so, return the method without changing the class state
-                if test_file.exists():
-                    print("This experiment already exists, aborting addition")
-                    continue
-
-                # If the experiment does not exists, instantiate a new Experiment
-                new_experiment = Experiment(item,
-                                            storage_path=f"{self.storage_path}/{self.name}",
-                                            **experiment[item])
-
-                self.experiments[
-                    new_experiment.analysis_name] = new_experiment  # add the new experiment to the dictionary
-
-        self._save_class()  # Save the class state
-
-    def add_data(self, data_sets: dict, file_format='lammps_traj'):
-        """
-        Add data to an experiment. This is a method so that parallelization is possible amongst data addition to
-        different experiments at the same time.
-
-        Parameters
-        ----------
-        data_sets: dict
-            Dictionary containing the name of the experiment as key and the data path as value
-        file_format: dict or str
-            Dictionary containing the name of the experiment as key and the file_format as value.
-            Alternativly only a string of the file_format if all files have the same format.
-
-        Returns
-        -------
-        Updates the experiment classes.
-        """
-        if isinstance(file_format, dict):
-            try:
-                assert file_format.keys() == data_sets.keys()
-            except AssertionError:
-                log.error("Keys of the data_sets do not match keys of the file_format")
-
-            for item in data_sets:
-                self.experiments[item].add_data(data_sets[item], file_format=file_format[item])
-        else:
-            for item in data_sets:
-                self.experiments[item].add_data(data_sets[item], file_format=file_format)
-
-    def get_results(self, key_to_find):
-        """
-        Gets the results from the experiments and puts them in a dict
-
-        Parameters
-        ----------
-        key_to_find : str
-            name of the parameter to search in the results.
-
-        Returns
-        -------
-        results: dict
-            collects the results from the different experiments
-        """
-
-        results = {}
-        for experiment_name, experiment_class in self.experiments.items():
-            results_yaml = experiment_class.results  # this is a dict with the results from the yaml file
-            result = find_item(results_yaml, key_to_find)
-
-            if isinstance(result, str):
-                if result.startswith('['):
-                    result = list(result.replace('[', '').replace(']', '').split(','))
-                else:
-                    result = float(result)
-
-            if isinstance(result, list):
-                result = [float(res) for res in result]  # convert results to floats
-            results[experiment_name] = result
-
-        return results
-
-    def get_properties(self, parameters: dict, experiments: list = None):
-        """
-        Get some property of each experiment.
-
-        Parameters
-        ----------
-        parameters : dict
-                Parameters to be used in the addition, i.e.
-
-                .. code-block:: python
-
-                   {"Analysis": "Green_Kubo_Self_Diffusion",  "Subject": "Na", "data_range": 500}
-
-        experiments : list
-                List of experiments to fetch information for. If None, all will be searched.
-
-        Returns
-        -------
-        properties_dict : dict
-                A dictionary of lists of properties for each system
-        """
-        if experiments is None:
-            experiments = list(self.experiments)
-
-        properties_dict = {}
-        for item in experiments:
-            properties_dict[item] = self.experiments[item].export_property_data(parameters.copy())
-
-        return properties_dict
-
-    def get_attribute(self, attribute):
-        """
-        Get an attribute from the experiments. Equivalent to get_results but for system parameters such as:
-        temperature, time_step, etc.
-
-        Parameters
-        ----------
-        attribute : str
-            name of the parameter to search in the experiment.
-
-        Returns
-        -------
-        results: dict
-            collects the results from the different experiments
-        """
-
-        results = {}
-        for experiment_name, experiment_class in self.experiments.items():
-            value_attr = experiment_class.__getattribute__(attribute)
-            results[experiment_name] = value_attr
-
-        return results
-
-    def remove_experiment(self, experiment_name: str):
-        """
-        Delete an experiment from the project
-        Parameters
-        ----------
-        experiment_name
-
-        Returns
-        -------
-        Updates the class state.
-        """
-        if experiment_name not in list(self.experiments):
-            print("Experiment does not exist")
-            return
-        else:
-            try:
-                dir_path = os.path.join(self.storage_path, self.name, experiment_name)
-                shutil.rmtree(dir_path)
-                self.experiments.pop(experiment_name, None)
-                self._save_class()
-            except InterruptedError:
-                print("You are likely using a notebook of some kind such as jupyter. Please restart the kernel and try"
-                      "to do this again.")
diff --git a/mdsuite/project/__init__.py b/mdsuite/project/__init__.py
new file mode 100644
index 00000000..5097a781
--- /dev/null
+++ b/mdsuite/project/__init__.py
@@ -0,0 +1,14 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: 
+"""
+
+from .project import Project
+
+__all__ = ['Project']
diff --git a/mdsuite/project/project.py b/mdsuite/project/project.py
new file mode 100644
index 00000000..d471bd69
--- /dev/null
+++ b/mdsuite/project/project.py
@@ -0,0 +1,417 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the MDSuite Project.
+
+Module for the Project class
+
+Summary
+-------
+Module containing all the code for the Project class. The project class is the governing class in the
+mdsuite program. Within the project class include all of the method required to add a new experiment and
+compare the results of the analysis on that experiment.
+"""
+from __future__ import annotations
+import logging
+import os
+import pickle
+from datetime import datetime
+from pathlib import Path
+from typing import Union
+import shutil
+from mdsuite.experiment import Experiment
+from mdsuite.utils.meta_functions import DotDict, simple_file_read, find_item
+from mdsuite.calculators import RunComputation
+from mdsuite.database.project_database import ProjectDatabase
+import mdsuite.database.scheme as db
+from dataclasses import make_dataclass
+
+from typing import TYPE_CHECKING, Dict, List
+
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
+
+log = logging.getLogger(__file__)
+
+
+class Project(ProjectDatabase):
+    """
+    Class for the main container of all experiments.
+
+    The Project class acts as the encompassing class for analysis with MDSuite. It contains all method required to add
+    and analyze new experiments. These experiments may then be compared with one another quickly. The state of the class
+    is saved and updated after each operation in order to retain the most current state of the analysis.
+
+    Attributes
+    ----------
+    name : str
+            The name of the project
+
+    description : str
+            A short description of the project
+
+    storage_path : str
+            Where to store the tensor_values and databases. This may not simply be the current directory if the
+            databases are expected to be quite large.
+
+    experiments : dict
+            A dict of class objects. Class objects are instances of the experiment class for different
+            experiments.
+    """
+
+    def __init__(self, name: str = None, storage_path: str = "./", description: str = None):
+        """
+        Project class constructor
+
+        The constructor will check to see if the project already exists, if so, it will load the state of each of the
+        classes so that they can be used again. If the project is new, the constructor will build the necessary file
+        structure for the project.
+
+        Parameters
+        ----------
+        name : str
+                The name of the project.
+        storage_path : str
+                Where to store the tensor_values and databases. This should be a place with sufficient storage space
+                for the full analysis.
+        """
+        super().__init__()
+        if name is None:
+            self.name = f"MDSuite_Project"
+        else:
+            self.name = f"MDSuite_Project_{name}"
+        self.storage_path = storage_path
+
+        # Properties
+        self._experiments = {}
+
+        # Check for project directory, if none exist, create a new one
+        project_dir = Path(f"{self.storage_path}/{self.name}")
+        if project_dir.exists():
+            log.info("Loading the class state")
+            log.info(f"Available experiments are: {self.db_experiments}")
+        else:
+            project_dir.mkdir(parents=True, exist_ok=True)
+
+        self.build_database()
+
+        # Database Properties
+        self.description = description
+
+    def __str__(self):
+        """
+
+        Returns
+        -------
+        str:
+            A list of all available experiments like "1.) Exp01\n2.) Exp02\n3.) Exp03"
+
+        """
+        return "\n".join([f"{exp.id}.) {exp.name}" for exp in self.db_experiments])
+
+    def add_experiment(self, experiment: str = None, timestep: float = None, temperature: float = None,
+                       units: str = None, cluster_mode: bool = None, active: bool = True,
+                       data: Union[str, list, dict] = None):
+        """
+        Add an experiment to the project
+
+        Parameters
+        ----------
+        data:
+            data that should be added to the experiment. If dict, {file:<file>, format:<format>}
+        active: bool, default = True
+                Activate the experiment when added
+        cluster_mode : bool
+                If true, cluster mode is parsed to the experiment class.
+        experiment : str
+                Name to use for the experiment class.
+        timestep : float
+                Timestep used during the simulation.
+        temperature : float
+                Temperature the simulation was performed at and is to be used in calculation.
+        units : str
+                LAMMPS units used
+        """
+
+        if experiment is None:
+            experiment = f"Experiment_{datetime.now().strftime('%Y%m%d-%H%M%S')}"
+            # set the experiment name to the current date and time if None is provided
+
+        # Run a query to see if that experiment already exists
+        with self.session as ses:
+            experiments = ses.query(db.Experiment).filter(db.Experiment.name == experiment).all()
+        if len(experiments) > 0:
+            log.info("This experiment already exists")
+            self.load_experiments(experiment)
+            return
+
+        # If the experiment does not exists, instantiate a new Experiment
+        new_experiment = Experiment(
+            project=self,
+            experiment_name=experiment,
+            storage_path=f"{self.storage_path}/{self.name}",
+            time_step=timestep,
+            units=units,
+            temperature=temperature,
+            cluster_mode=cluster_mode
+        )
+
+        new_experiment.active = active
+
+        if data is not None:
+            def handle_file_format(inp):
+                """Run experiment.add_data
+
+                Parameters
+                ----------
+                inp: str, dict, list
+                    If dict, {file:<file>, format:<format>}
+                """
+                if isinstance(inp, str):
+                    self.experiments[experiment].add_data(trajectory_file=inp)
+                if isinstance(inp, dict):
+                    try:
+                        self.experiments[experiment].add_data(trajectory_file=inp['file'], file_format=inp['format'])
+                    except KeyError:
+                        raise KeyError(
+                            f'passed dictionary does not contain `file` and `format`, but {[x for x in inp]}')
+                if isinstance(inp, list):
+                    for obj in inp:
+                        handle_file_format(obj)
+
+            handle_file_format(data)
+
+    def load_experiments(self, names: Union[str, list]):
+        """Alias for activate_experiments"""
+        self.activate_experiments(names)
+
+    def activate_experiments(self, names: Union[str, list]):
+        """Load experiments, such that they are used for the computations
+
+        Parameters
+        ----------
+        names: Name or list of names of experiments that should be instantiated and loaded into self.experiments
+
+        Returns
+        -------
+
+        """
+
+        if isinstance(names, str):
+            names = [names]
+
+        for name in names:
+            self.experiments[name].active = True
+
+    def disable_experiments(self, names: Union[str, list]):
+        """Disable experiments
+
+        Parameters
+        ----------
+        names: Name or list of names of experiments that should be instantiated and loaded into self.experiments
+
+        Returns
+        -------
+
+        """
+
+        if isinstance(names, str):
+            names = [names]
+
+        for name in names:
+            self.experiments[name].active = False
+
+    def add_data(self, data_sets: dict, file_format='lammps_traj'):
+        """
+        Add data to an experiment. This is a method so that parallelization is possible amongst data addition to
+        different experiments at the same time.
+
+        Parameters
+        ----------
+        data_sets: dict
+            Dictionary containing the name of the experiment as key and the data path as value
+        file_format: dict or str
+            Dictionary containing the name of the experiment as key and the file_format as value.
+            Alternativly only a string of the file_format if all files have the same format.
+
+        Returns
+        -------
+        Updates the experiment classes.
+        """
+        if isinstance(file_format, dict):
+            try:
+                assert file_format.keys() == data_sets.keys()
+            except AssertionError:
+                log.error("Keys of the data_sets do not match keys of the file_format")
+
+            for item in data_sets:
+                self.experiments[item].add_data(data_sets[item], file_format=file_format[item])
+        else:
+            for item in data_sets:
+                self.experiments[item].add_data(data_sets[item], file_format=file_format)
+
+    @property
+    def run_computation(self) -> RunComputation:
+        """Method to access the available calculators
+
+        Returns
+        -------
+        RunComputation:
+            class that has all available calculators as properties
+        """
+        return RunComputation(experiments=[x for x in self.experiments.values()])
+
+    @property
+    def load_data(self) -> RunComputation:
+        """Method to access the available calculators results
+
+        Returns
+        -------
+        RunComputation:
+            if called, return List[db.Computation]
+
+        """
+        return RunComputation(experiments=[x for x in self.experiments.values()], load_data=True)
+
+    # def get_results(self, key_to_find):
+    #     """
+    #     Gets the results from the experiments and puts them in a dict
+    #
+    #     Parameters
+    #     ----------
+    #     key_to_find : str
+    #         name of the parameter to search in the results.
+    #
+    #     Returns
+    #     -------
+    #     results: dict
+    #         collects the results from the different experiments
+    #     """
+    #
+    #     results = {}
+    #     for name, experiment_class in self.experiments.items():
+    #         results_yaml = experiment_class.results  # this is a dict with the results from the yaml file
+    #         result = find_item(results_yaml, key_to_find)
+    #
+    #         if isinstance(result, str):
+    #             if result.startswith('['):
+    #                 result = list(result.replace('[', '').replace(']', '').split(','))
+    #             else:
+    #                 result = float(result)
+    #
+    #         if isinstance(result, list):
+    #             result = [float(res) for res in result]  # convert results to floats
+    #         results[name] = result
+    #
+    #     return results
+
+    # def get_properties(self, parameters: dict, experiments: list = None):
+    #     """
+    #     Get some property of each experiment.
+    #
+    #     Parameters
+    #     ----------
+    #     parameters : dict
+    #             Parameters to be used in the addition, i.e.
+    #
+    #             .. code-block:: python
+    #
+    #                {"Analysis": "Green_Kubo_Self_Diffusion",  "Subject": "Na", "data_range": 500}
+    #
+    #     experiments : list
+    #             List of experiments to fetch information for. If None, all will be searched.
+    #
+    #     Returns
+    #     -------
+    #     properties_dict : dict
+    #             A dictionary of lists of properties for each system
+    #     """
+    #     if experiments is None:
+    #         experiments = list(self.experiments)
+    #
+    #     properties_dict = {}
+    #     for item in experiments:
+    #         properties_dict[item] = self.experiments[item].export_property_data(parameters.copy())
+    #
+    #     return properties_dict
+
+    # def get_attribute(self, attribute):
+    #     """
+    #     Get an attribute from the experiments. Equivalent to get_results but for system parameters such as:
+    #     temperature, time_step, etc.
+    #
+    #     Parameters
+    #     ----------
+    #     attribute : str
+    #         name of the parameter to search in the experiment.
+    #
+    #     Returns
+    #     -------
+    #     results: dict
+    #         collects the results from the different experiments
+    #     """
+    #
+    #     results = {}
+    #     for name, experiment_class in self.experiments.items():
+    #         value_attr = experiment_class.__getattribute__(attribute)
+    #         results[name] = value_attr
+    #
+    #     return results
+
+    # def remove_experiment(self, name: str):
+    #     """
+    #     Delete an experiment from the project
+    #     Parameters
+    #     ----------
+    #     name
+    #
+    #     Returns
+    #     -------
+    #     Updates the class state.
+    #     """
+    #     if name not in list(self.experiments):
+    #         print("Experiment does not exist")
+    #         return
+    #     else:
+    #         try:
+    #             dir_path = os.path.join(self.storage_path, self.name, name)
+    #             shutil.rmtree(dir_path)
+    #             self.experiments.pop(name, None)
+    #             # self._save_class()
+    #         except InterruptedError:
+    #             print("You are likely using a notebook of some kind such as jupyter. Please restart the kernel and try"
+    #                   "to do this again.")
+
+    @property
+    def experiments(self) -> Dict[str, Experiment]:
+        """Get a DotDict of instantiated experiments!
+
+        Examples
+        --------
+        Either use
+            >>> Project().experiments.<experiment_name>.run_compution.<Computation>
+        Or use
+            >>> Project.experiments["<experiment_name"].run_computation.<Computation>
+        """
+
+        with self.session as ses:
+            db_experiments = ses.query(db.Experiment).all()
+
+        for exp in db_experiments:
+            exp: db.Experiment
+            if exp.name not in self._experiments:
+                self._experiments[exp.name] = Experiment(project=self, experiment_name=exp.name)
+
+        return DotDict(self._experiments)
+
+    @property
+    def active_experiments(self) -> Dict[str, Experiment]:
+        """Get a DotDict of instantiated experiments that are currently selected!"""
+
+        active_experiment = {key: val for key, val in self._experiments.items() if val.active}
+
+        return DotDict(active_experiment)
diff --git a/mdsuite/transformations/transformations.py b/mdsuite/transformations/transformations.py
index aebbd7ca..27ee6a99 100644
--- a/mdsuite/transformations/transformations.py
+++ b/mdsuite/transformations/transformations.py
@@ -9,6 +9,7 @@
 
 Parent class for MDSuite transformations
 """
+from __future__ import annotations
 import time
 from typing import Union
 import os
@@ -19,6 +20,10 @@
 from mdsuite.database.simulation_database import Database
 from mdsuite.utils.meta_functions import join_path
 
+from typing import TYPE_CHECKING
+if TYPE_CHECKING:
+    from mdsuite.experiment import Experiment
+
 switcher_transformations = {
     'Translational_Dipole_Moment': 'TranslationalDipoleMoment',
     'Ionic_Current': 'IonicCurrent',
@@ -51,7 +56,7 @@ class Transformations:
             memory manager for the computation.
     """
 
-    def __init__(self, experiment: object):
+    def __init__(self, experiment: Experiment):
         """
         Constructor for the experiment class
 
diff --git a/mdsuite/transformations/wrap_coordinates.py b/mdsuite/transformations/wrap_coordinates.py
index 7aef7cbc..b7856d51 100644
--- a/mdsuite/transformations/wrap_coordinates.py
+++ b/mdsuite/transformations/wrap_coordinates.py
@@ -81,7 +81,7 @@ def __init__(self,
         self.scale_function = {'linear': {'scale_factor': 5}}
 
         self.storage_path = self.experiment.storage_path
-        self.analysis_name = self.experiment.analysis_name
+        self.analysis_name = self.experiment.name
         self.center_box = center_box
 
         self.box_array = self.experiment.box_array
diff --git a/mdsuite/utils/database.py b/mdsuite/utils/database.py
new file mode 100644
index 00000000..94f4dd87
--- /dev/null
+++ b/mdsuite/utils/database.py
@@ -0,0 +1,33 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Helper functions for the database
+"""
+
+
+def get_or_create(session, model, **kwargs):
+    """Query or create an instance of a model
+
+    Parameters
+    ----------
+    session: a SQLAlchemy session
+    model: a SQLAlchemy base model
+    kwargs: kwargs for the model to be filterd
+
+    Returns
+    -------
+    instance of the model
+
+    """
+    instance = session.query(model).filter_by(**kwargs).first()
+    if instance:
+        return instance
+    else:
+        instance = model(**kwargs)
+        session.add(instance)
+        return instance
diff --git a/mdsuite/utils/meta_functions.py b/mdsuite/utils/meta_functions.py
index f8c665f2..eb2cf644 100644
--- a/mdsuite/utils/meta_functions.py
+++ b/mdsuite/utils/meta_functions.py
@@ -452,3 +452,16 @@ def find_item(obj, key):
             item = find_item(v, key)
             if item is not None:
                 return item
+
+
+class DotDict(dict):
+    """dot.notation access to dictionary attributes
+
+    References
+    ----------
+    https://stackoverflow.com/questions/2352181/how-to-use-a-dot-to-access-members-of-dictionary
+    """
+    __getattr__ = dict.get
+    __setattr__ = dict.__setitem__
+    __delattr__ = dict.__delitem__
+    __dir__ = dict.keys


Test patch:
diff --git a/CI/integration_tests/NaCl/test_nacl_liquid.py b/CI/integration_tests/NaCl/tmp_nacl_liquid.py
similarity index 99%
rename from CI/integration_tests/NaCl/test_nacl_liquid.py
rename to CI/integration_tests/NaCl/tmp_nacl_liquid.py
index 2af1a026..e1bfe1b9 100644
--- a/CI/integration_tests/NaCl/test_nacl_liquid.py
+++ b/CI/integration_tests/NaCl/tmp_nacl_liquid.py
@@ -17,6 +17,7 @@
 import numpy as np
 import shutil
 
+# TODO run in temporary directory!
 
 class TestLiquidNaCl(unittest.TestCase):
     """
diff --git a/CI/integration_tests/calculators/_test_einstein_distinct_diffusion_coefficients.py b/CI/integration_tests/calculators/_test_einstein_distinct_diffusion_coefficients.py
new file mode 100644
index 00000000..85a554d5
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_einstein_distinct_diffusion_coefficients.py
@@ -0,0 +1,97 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the einstein_distinct_diffusion_coefficients
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'einstein_distinct_diffusion_coefficients.json'
+    return json.loads(data.read_bytes())
+
+
+def test_eddc_project(traj_files, true_values, tmp_path):
+    """Test the EinsteinDistinctDiffusionCoefficients called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.EinsteinDistinctDiffusionCoefficients(plot=False, data_range=300, correlation_time=1)
+
+    data_dict = project.load_data.EinsteinDistinctDiffusionCoefficients()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\einstein_distinct_diffusion_coefficients.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_eddc_experiment(traj_files, true_values, tmp_path):
+    """Test the EinsteinDistinctDiffusionCoefficients called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.EinsteinDiffusionCoefficients(plot=False, data_range=300,
+                                                                              correlation_time=1)
+
+    data_dict = project.experiments['NaCl'].load_data.EinsteinDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_einstein_helfand_thermal_kinaci.py b/CI/integration_tests/calculators/_test_einstein_helfand_thermal_kinaci.py
new file mode 100644
index 00000000..9c385971
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_einstein_helfand_thermal_kinaci.py
@@ -0,0 +1,98 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the einstein_helfand_thermal_kinaci
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'einstein_helfand_thermal_kinaci.json'
+    return json.loads(data.read_bytes())
+
+
+def test_project(traj_files, true_values, tmp_path):
+    """Test the einstein_helfand_thermal_kinaci called from the project class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.EinsteinHelfandThermalKinaci(plot=False)
+
+    data_dict = project.load_data.EinsteinHelfandThermalKinaci()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\einstein_helfand_thermal_kinaci.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_experiment(traj_files, true_values, tmp_path):
+    """Test the einstein_helfand_thermal_kinaci called from the experiment class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.EinsteinHelfandThermalKinaci(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.EinsteinHelfandThermalKinaci()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_green_kubo_distinct_diffusion_coefficients.py b/CI/integration_tests/calculators/_test_green_kubo_distinct_diffusion_coefficients.py
new file mode 100644
index 00000000..aa62dd6b
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_green_kubo_distinct_diffusion_coefficients.py
@@ -0,0 +1,96 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the green_kubo_distinct_diffusion_coefficients
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_distinct_diffusion_coefficients.json'
+    return json.loads(data.read_bytes())
+
+
+def test_project(traj_files, true_values, tmp_path):
+    """Test the green_kubo_distinct_diffusion_coefficients called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboDistinctDiffusionCoefficients(plot=False)
+
+    data_dict = project.load_data.GreenKuboDistinctDiffusionCoefficients()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\green_kubo_distinct_diffusion_coefficients.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_experiment(traj_files, true_values, tmp_path):
+    """Test the green_kubo_distinct_diffusion_coefficients called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.GreenKuboDistinctDiffusionCoefficients(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.GreenKuboDistinctDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_green_kubo_thermal_conductivity.py b/CI/integration_tests/calculators/_test_green_kubo_thermal_conductivity.py
new file mode 100644
index 00000000..b3127ebf
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_green_kubo_thermal_conductivity.py
@@ -0,0 +1,95 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the green_kubo_thermal_conductivity
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        # "NaCl_gk_i_q.lammpstraj",
+        "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_thermal_conductivity.json'
+    return json.loads(data.read_bytes())
+
+
+def test_roject(traj_files, true_values, tmp_path):
+    """Test the green_kubo_thermal_conductivity called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboThermalConductivity(plot=False)
+
+    data_dict = project.load_data.GreenKuboThermalConductivity()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\green_kubo_thermal_conductivity.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_experiment(traj_files, true_values, tmp_path):
+    """Test the green_kubo_thermal_conductivity called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.GreenKuboThermalConductivity(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.GreenKuboThermalConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_green_kubo_viscosity.py b/CI/integration_tests/calculators/_test_green_kubo_viscosity.py
new file mode 100644
index 00000000..9835873f
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_green_kubo_viscosity.py
@@ -0,0 +1,96 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the GK viscosity
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        # "NaCl_gk_i_q.lammpstraj",
+        "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_viscosity.json'
+    return json.loads(data.read_bytes())
+
+
+def test_gkv_project(traj_files, true_values, tmp_path):
+    """Test the gkv called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboViscosity(plot=False)
+
+    data_dict = project.load_data.GreenKuboViscosity()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\green_kubo_viscosity.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_gkv_experiment(traj_files, true_values, tmp_path):
+    """Test the gkv called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.experiments['NaCl'].run_computation.PotentialOfMeanForce(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.PotentialOfMeanForce()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_green_kubo_viscosity_flux.py b/CI/integration_tests/calculators/_test_green_kubo_viscosity_flux.py
new file mode 100644
index 00000000..8c9df8be
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_green_kubo_viscosity_flux.py
@@ -0,0 +1,96 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the green_kubo_viscosity_flux
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_viscosity_flux.json'
+    return json.loads(data.read_bytes())
+
+
+def test_project(traj_files, true_values, tmp_path):
+    """Test the green_kubo_viscosity_flux called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboViscosityFlux(plot=False)
+
+    data_dict = project.load_data.GreenKuboViscosityFlux()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\green_kubo_viscosity_flux.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_experiment(traj_files, true_values, tmp_path):
+    """Test the green_kubo_viscosity_flux called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.GreenKuboViscosityFlux(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.GreenKuboViscosityFlux()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_nernst_einstein_ionic_conductivity.py b/CI/integration_tests/calculators/_test_nernst_einstein_ionic_conductivity.py
new file mode 100644
index 00000000..37d0cf1f
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_nernst_einstein_ionic_conductivity.py
@@ -0,0 +1,98 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the nernst_einstein_ionic_conductivity
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'nernst_einstein_ionic_conductivity.json'
+    return json.loads(data.read_bytes())
+
+
+def test_neic_project(traj_files, true_values, tmp_path):
+    """Test the nernst_einstein_ionic_conductivity called from the project class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.NernstEinsteinIonicConductivity(plot=False)
+
+    data_dict = project.load_data.NernstEinsteinIonicConductivity()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\nernst_einstein_ionic_conductivity.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_neic_experiment(traj_files, true_values, tmp_path):
+    """Test the nernst_einstein_ionic_conductivity called from the experiment class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.NernstEinsteinIonicConductivity(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.NernstEinsteinIonicConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/_test_structure_factor.py b/CI/integration_tests/calculators/_test_structure_factor.py
new file mode 100644
index 00000000..8715aa03
--- /dev/null
+++ b/CI/integration_tests/calculators/_test_structure_factor.py
@@ -0,0 +1,99 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the RDF
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'structure_factor.json'
+    return json.loads(data.read_bytes())
+
+
+def test_structure_factor_project(traj_files, true_values, tmp_path):
+    """Test the structure_factor called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.run_computation.StructureFactor(plot=False)
+
+    data_dict = project.load_data.StructureFactor()[0].data_dict
+
+    data = Path(
+        r'C:\Users\fabia\Nextcloud\DATA\JupyterProjects\MDSuite\CI\integration_tests\calculators\data\structure_factor.json')
+
+    data.write_text(json.dumps(data_dict))
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_structure_factor_experiment(traj_files, true_values, tmp_path):
+    """Test the structure_factor called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.experiments['NaCl'].run_computation.StructureFactor(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.StructureFactor()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/data/__init__.py b/CI/integration_tests/calculators/data/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/CI/integration_tests/calculators/data/angular_distribution_function.json b/CI/integration_tests/calculators/data/angular_distribution_function.json
new file mode 100644
index 00000000..d17bcb8a
--- /dev/null
+++ b/CI/integration_tests/calculators/data/angular_distribution_function.json
@@ -0,0 +1,1006 @@
+{
+  "x": [
+    0.0,
+    0.36168709000543686,
+    0.7233741800108737,
+    1.0850612700163107,
+    1.4467483600217474,
+    1.8084354500271842,
+    2.1701225400326214,
+    2.531809630038058,
+    2.893496720043495,
+    3.2551838100489316,
+    3.6168709000543684,
+    3.9785579900598056,
+    4.340245080065243,
+    4.7019321700706795,
+    5.063619260076116,
+    5.425306350081553,
+    5.78699344008699,
+    6.1486805300924265,
+    6.510367620097863,
+    6.8720547101033,
+    7.233741800108737,
+    7.595428890114174,
+    7.957115980119611,
+    8.318803070125048,
+    8.680490160130486,
+    9.042177250135921,
+    9.403864340141359,
+    9.765551430146795,
+    10.127238520152233,
+    10.488925610157668,
+    10.850612700163106,
+    11.212299790168542,
+    11.57398688017398,
+    11.935673970179417,
+    12.297361060184853,
+    12.65904815019029,
+    13.020735240195727,
+    13.382422330201164,
+    13.7441094202066,
+    14.105796510212038,
+    14.467483600217474,
+    14.829170690222911,
+    15.190857780228349,
+    15.552544870233785,
+    15.914231960239222,
+    16.27591905024466,
+    16.637606140250096,
+    16.99929323025553,
+    17.36098032026097,
+    17.722667410266407,
+    18.084354500271843,
+    18.44604159027728,
+    18.807728680282718,
+    19.169415770288154,
+    19.53110286029359,
+    19.892789950299026,
+    20.254477040304465,
+    20.6161641303099,
+    20.977851220315337,
+    21.339538310320776,
+    21.701225400326212,
+    22.062912490331648,
+    22.424599580337084,
+    22.786286670342523,
+    23.14797376034796,
+    23.509660850353395,
+    23.871347940358834,
+    24.23303503036427,
+    24.594722120369706,
+    24.956409210375142,
+    25.31809630038058,
+    25.679783390386017,
+    26.041470480391453,
+    26.403157570396893,
+    26.76484466040233,
+    27.126531750407764,
+    27.4882188404132,
+    27.84990593041864,
+    28.211593020424075,
+    28.57328011042951,
+    28.934967200434947,
+    29.296654290440387,
+    29.658341380445822,
+    30.02002847045126,
+    30.381715560456698,
+    30.743402650462134,
+    31.10508974046757,
+    31.466776830473005,
+    31.828463920478445,
+    32.19015101048388,
+    32.55183810048932,
+    32.91352519049475,
+    33.27521228050019,
+    33.63689937050563,
+    33.99858646051106,
+    34.3602735505165,
+    34.72196064052194,
+    35.083647730527375,
+    35.445334820532814,
+    35.807021910538246,
+    36.168709000543686,
+    36.530396090549125,
+    36.89208318055456,
+    37.25377027056,
+    37.615457360565436,
+    37.97714445057087,
+    38.33883154057631,
+    38.70051863058175,
+    39.06220572058718,
+    39.42389281059262,
+    39.78557990059805,
+    40.14726699060349,
+    40.50895408060893,
+    40.87064117061436,
+    41.2323282606198,
+    41.59401535062524,
+    41.955702440630674,
+    42.31738953063611,
+    42.67907662064155,
+    43.040763710646985,
+    43.402450800652424,
+    43.764137890657864,
+    44.125824980663296,
+    44.487512070668735,
+    44.84919916067417,
+    45.21088625067961,
+    45.57257334068505,
+    45.93426043069048,
+    46.29594752069592,
+    46.65763461070136,
+    47.01932170070679,
+    47.38100879071223,
+    47.74269588071767,
+    48.1043829707231,
+    48.46607006072854,
+    48.82775715073397,
+    49.18944424073941,
+    49.55113133074485,
+    49.912818420750284,
+    50.27450551075572,
+    50.63619260076116,
+    50.997879690766595,
+    51.359566780772035,
+    51.721253870777474,
+    52.082940960782906,
+    52.444628050788346,
+    52.806315140793785,
+    53.16800223079922,
+    53.52968932080466,
+    53.89137641081009,
+    54.25306350081553,
+    54.61475059082097,
+    54.9764376808264,
+    55.33812477083184,
+    55.69981186083728,
+    56.06149895084271,
+    56.42318604084815,
+    56.78487313085359,
+    57.14656022085902,
+    57.50824731086446,
+    57.869934400869894,
+    58.231621490875334,
+    58.59330858088077,
+    58.954995670886206,
+    59.316682760891645,
+    59.678369850897084,
+    60.04005694090252,
+    60.401744030907956,
+    60.763431120913395,
+    61.12511821091883,
+    61.48680530092427,
+    61.84849239092971,
+    62.21017948093514,
+    62.57186657094058,
+    62.93355366094601,
+    63.29524075095145,
+    63.65692784095689,
+    64.01861493096233,
+    64.38030202096776,
+    64.7419891109732,
+    65.10367620097864,
+    65.46536329098407,
+    65.8270503809895,
+    66.18873747099495,
+    66.55042456100038,
+    66.91211165100582,
+    67.27379874101126,
+    67.6354858310167,
+    67.99717292102213,
+    68.35886001102757,
+    68.720547101033,
+    69.08223419103844,
+    69.44392128104388,
+    69.80560837104932,
+    70.16729546105475,
+    70.52898255106018,
+    70.89066964106563,
+    71.25235673107106,
+    71.61404382107649,
+    71.97573091108194,
+    72.33741800108737,
+    72.6991050910928,
+    73.06079218109825,
+    73.42247927110368,
+    73.78416636110911,
+    74.14585345111456,
+    74.50754054112,
+    74.86922763112543,
+    75.23091472113087,
+    75.5926018111363,
+    75.95428890114174,
+    76.31597599114718,
+    76.67766308115262,
+    77.03935017115805,
+    77.4010372611635,
+    77.76272435116893,
+    78.12441144117436,
+    78.4860985311798,
+    78.84778562118524,
+    79.20947271119067,
+    79.5711598011961,
+    79.93284689120155,
+    80.29453398120698,
+    80.65622107121241,
+    81.01790816121786,
+    81.3795952512233,
+    81.74128234122873,
+    82.10296943123417,
+    82.4646565212396,
+    82.82634361124504,
+    83.18803070125048,
+    83.54971779125592,
+    83.91140488126135,
+    84.2730919712668,
+    84.63477906127223,
+    84.99646615127766,
+    85.3581532412831,
+    85.71984033128854,
+    86.08152742129397,
+    86.44321451129942,
+    86.80490160130485,
+    87.16658869131028,
+    87.52827578131573,
+    87.88996287132116,
+    88.25164996132659,
+    88.61333705133202,
+    88.97502414133747,
+    89.3367112313429,
+    89.69839832134834,
+    90.06008541135378,
+    90.42177250135921,
+    90.78345959136465,
+    91.1451466813701,
+    91.50683377137553,
+    91.86852086138096,
+    92.2302079513864,
+    92.59189504139184,
+    92.95358213139727,
+    93.31526922140272,
+    93.67695631140815,
+    94.03864340141358,
+    94.40033049141903,
+    94.76201758142446,
+    95.12370467142989,
+    95.48539176143534,
+    95.84707885144077,
+    96.2087659414462,
+    96.57045303145165,
+    96.93214012145708,
+    97.29382721146251,
+    97.65551430146795,
+    98.01720139147339,
+    98.37888848147882,
+    98.74057557148426,
+    99.1022626614897,
+    99.46394975149514,
+    99.82563684150057,
+    100.18732393150601,
+    100.54901102151145,
+    100.91069811151688,
+    101.27238520152233,
+    101.63407229152776,
+    101.99575938153319,
+    102.35744647153864,
+    102.71913356154407,
+    103.0808206515495,
+    103.44250774155495,
+    103.80419483156038,
+    104.16588192156581,
+    104.52756901157126,
+    104.88925610157669,
+    105.25094319158212,
+    105.61263028158757,
+    105.974317371593,
+    106.33600446159844,
+    106.69769155160387,
+    107.05937864160931,
+    107.42106573161475,
+    107.78275282162018,
+    108.14443991162562,
+    108.50612700163106,
+    108.86781409163649,
+    109.22950118164194,
+    109.59118827164737,
+    109.9528753616528,
+    110.31456245165825,
+    110.67624954166368,
+    111.03793663166911,
+    111.39962372167456,
+    111.76131081167999,
+    112.12299790168542,
+    112.48468499169087,
+    112.8463720816963,
+    113.20805917170173,
+    113.56974626170718,
+    113.93143335171261,
+    114.29312044171805,
+    114.65480753172349,
+    115.01649462172892,
+    115.37818171173436,
+    115.73986880173979,
+    116.10155589174524,
+    116.46324298175067,
+    116.8249300717561,
+    117.18661716176155,
+    117.54830425176698,
+    117.90999134177241,
+    118.27167843177786,
+    118.63336552178329,
+    118.99505261178872,
+    119.35673970179417,
+    119.7184267917996,
+    120.08011388180503,
+    120.44180097181048,
+    120.80348806181591,
+    121.16517515182134,
+    121.52686224182679,
+    121.88854933183222,
+    122.25023642183766,
+    122.6119235118431,
+    122.97361060184853,
+    123.33529769185397,
+    123.69698478185941,
+    124.05867187186485,
+    124.42035896187028,
+    124.78204605187572,
+    125.14373314188116,
+    125.50542023188659,
+    125.86710732189202,
+    126.22879441189747,
+    126.5904815019029,
+    126.95216859190833,
+    127.31385568191378,
+    127.67554277191921,
+    128.03722986192466,
+    128.3989169519301,
+    128.76060404193552,
+    129.12229113194095,
+    129.4839782219464,
+    129.84566531195182,
+    130.20735240195728,
+    130.5690394919627,
+    130.93072658196814,
+    131.29241367197358,
+    131.654100761979,
+    132.01578785198444,
+    132.3774749419899,
+    132.73916203199533,
+    133.10084912200077,
+    133.4625362120062,
+    133.82422330201163,
+    134.18591039201706,
+    134.54759748202252,
+    134.90928457202796,
+    135.2709716620334,
+    135.63265875203882,
+    135.99434584204425,
+    136.3560329320497,
+    136.71772002205515,
+    137.07940711206058,
+    137.441094202066,
+    137.80278129207144,
+    138.16446838207688,
+    138.5261554720823,
+    138.88784256208777,
+    139.2495296520932,
+    139.61121674209863,
+    139.97290383210407,
+    140.3345909221095,
+    140.69627801211493,
+    141.05796510212036,
+    141.41965219212582,
+    141.78133928213126,
+    142.1430263721367,
+    142.50471346214212,
+    142.86640055214755,
+    143.22808764215299,
+    143.58977473215845,
+    143.95146182216388,
+    144.3131489121693,
+    144.67483600217474,
+    145.03652309218018,
+    145.3982101821856,
+    145.75989727219107,
+    146.1215843621965,
+    146.48327145220193,
+    146.84495854220737,
+    147.2066456322128,
+    147.56833272221823,
+    147.9300198122237,
+    148.29170690222912,
+    148.65339399223456,
+    149.01508108224,
+    149.37676817224542,
+    149.73845526225085,
+    150.10014235225628,
+    150.46182944226175,
+    150.82351653226718,
+    151.1852036222726,
+    151.54689071227804,
+    151.90857780228347,
+    152.2702648922889,
+    152.63195198229437,
+    152.9936390722998,
+    153.35532616230523,
+    153.71701325231066,
+    154.0787003423161,
+    154.44038743232153,
+    154.802074522327,
+    155.16376161233242,
+    155.52544870233785,
+    155.8871357923433,
+    156.24882288234872,
+    156.61050997235415,
+    156.9721970623596,
+    157.33388415236504,
+    157.69557124237048,
+    158.0572583323759,
+    158.41894542238134,
+    158.78063251238677,
+    159.1423196023922,
+    159.50400669239767,
+    159.8656937824031,
+    160.22738087240853,
+    160.58906796241396,
+    160.9507550524194,
+    161.31244214242483,
+    161.6741292324303,
+    162.03581632243572,
+    162.39750341244115,
+    162.7591905024466,
+    163.12087759245202,
+    163.48256468245745,
+    163.8442517724629,
+    164.20593886246834,
+    164.56762595247378,
+    164.9293130424792,
+    165.29100013248464,
+    165.65268722249007,
+    166.01437431249553,
+    166.37606140250097,
+    166.7377484925064,
+    167.09943558251183,
+    167.46112267251726,
+    167.8228097625227,
+    168.18449685252813,
+    168.5461839425336,
+    168.90787103253902,
+    169.26955812254445,
+    169.63124521254989,
+    169.99293230255532,
+    170.35461939256075,
+    170.7163064825662,
+    171.07799357257164,
+    171.43968066257708,
+    171.8013677525825,
+    172.16305484258794,
+    172.52474193259337,
+    172.88642902259883,
+    173.24811611260427,
+    173.6098032026097,
+    173.97149029261513,
+    174.33317738262056,
+    174.694864472626,
+    175.05655156263145,
+    175.4182386526369,
+    175.77992574264232,
+    176.14161283264775,
+    176.50329992265318,
+    176.86498701265862,
+    177.22667410266405,
+    177.5883611926695,
+    177.95004828267494,
+    178.31173537268037,
+    178.6734224626858,
+    179.03510955269124,
+    179.39679664269667,
+    179.75848373270213,
+    180.12017082270756,
+    180.481857912713
+  ],
+  "y": [
+    0.0,
+    0.0,
+    0.0,
+    0.001600652001798153,
+    0.004911334719508886,
+    0.0,
+    0.004230995662510395,
+    0.019939880818128586,
+    0.0,
+    0.0,
+    0.026268569752573967,
+    0.006430375389754772,
+    0.017550086602568626,
+    0.015569698065519333,
+    0.0316549688577652,
+    0.018162250518798828,
+    0.009670164436101913,
+    0.009187072515487671,
+    0.0,
+    0.007641773670911789,
+    0.01325667928904295,
+    0.00764016667380929,
+    0.028513770550489426,
+    0.018887978047132492,
+    0.015307798981666565,
+    0.025405725464224815,
+    0.009625556878745556,
+    0.003964812029153109,
+    0.005896343849599361,
+    0.017389927059412003,
+    0.02524435706436634,
+    0.007840334437787533,
+    0.0,
+    0.00676795793697238,
+    0.022161342203617096,
+    0.016289515420794487,
+    0.028475895524024963,
+    0.02352927438914776,
+    0.036618076264858246,
+    0.035155314952135086,
+    0.04017064720392227,
+    0.01959657110273838,
+    0.020483126863837242,
+    0.007546861656010151,
+    0.02622946910560131,
+    0.020914917811751366,
+    0.03573653846979141,
+    0.042329929769039154,
+    0.03329688310623169,
+    0.019966039806604385,
+    0.020650118589401245,
+    0.045961540192365646,
+    0.04224458709359169,
+    0.012897866778075695,
+    0.04196177423000336,
+    0.027578342705965042,
+    0.03493528813123703,
+    0.055824704468250275,
+    0.06959129869937897,
+    0.07317602634429932,
+    0.04560534656047821,
+    0.16357848048210144,
+    0.07747222483158112,
+    0.09462128579616547,
+    0.09173697233200073,
+    0.07362041622400284,
+    0.10652551054954529,
+    0.06820385903120041,
+    0.06500664353370667,
+    0.08241061121225357,
+    0.11479470133781433,
+    0.1298433095216751,
+    0.10551496595144272,
+    0.1183171346783638,
+    0.14942491054534912,
+    0.13288863003253937,
+    0.14425185322761536,
+    0.12581555545330048,
+    0.15664920210838318,
+    0.1250922977924347,
+    0.17793689668178558,
+    0.1668885350227356,
+    0.20713621377944946,
+    0.22333861887454987,
+    0.2245582491159439,
+    0.22485563158988953,
+    0.2863384783267975,
+    0.3020980954170227,
+    0.22532542049884796,
+    0.27114278078079224,
+    0.323876291513443,
+    0.35155248641967773,
+    0.38576361536979675,
+    0.3903842270374298,
+    0.39026936888694763,
+    0.4195598065853119,
+    0.435444176197052,
+    0.48172104358673096,
+    0.5379682183265686,
+    0.44770514965057373,
+    0.6840656399726868,
+    0.6599547266960144,
+    0.7200648188591003,
+    0.6920669078826904,
+    0.7714085578918457,
+    0.7808195948600769,
+    0.7762649655342102,
+    0.8813873529434204,
+    0.8174227476119995,
+    0.8860973119735718,
+    0.9416007399559021,
+    1.0320079326629639,
+    0.9720733761787415,
+    1.132299542427063,
+    1.1294605731964111,
+    1.1186838150024414,
+    1.1923608779907227,
+    1.4982922077178955,
+    1.500689148902893,
+    1.4947394132614136,
+    1.6287102699279785,
+    1.5883632898330688,
+    1.33858060836792,
+    1.5839955806732178,
+    1.5894725322723389,
+    1.6531301736831665,
+    1.7960256338119507,
+    1.713362216949463,
+    1.6641424894332886,
+    1.6755406856536865,
+    1.9401452541351318,
+    1.959455132484436,
+    1.9183993339538574,
+    1.9610607624053955,
+    2.0106618404388428,
+    1.9838013648986816,
+    2.195918083190918,
+    2.2333273887634277,
+    2.059236526489258,
+    2.1948933601379395,
+    2.069852590560913,
+    2.098423719406128,
+    2.2532835006713867,
+    2.2196643352508545,
+    2.2741754055023193,
+    2.1823856830596924,
+    2.2891571521759033,
+    2.221947193145752,
+    2.407322406768799,
+    2.4167423248291016,
+    2.3585736751556396,
+    2.4121861457824707,
+    2.046372413635254,
+    2.4809727668762207,
+    2.3292617797851562,
+    2.4741125106811523,
+    2.3687312602996826,
+    2.5027754306793213,
+    2.4825823307037354,
+    2.406984806060791,
+    2.644460678100586,
+    2.653965711593628,
+    2.4032692909240723,
+    2.75588059425354,
+    2.4196245670318604,
+    2.53798770904541,
+    2.53869366645813,
+    2.558218479156494,
+    2.5898284912109375,
+    2.5498709678649902,
+    2.9005494117736816,
+    2.512981414794922,
+    2.8111319541931152,
+    2.686844825744629,
+    2.6042773723602295,
+    2.457376480102539,
+    2.730653762817383,
+    2.6403307914733887,
+    2.5395054817199707,
+    2.650785446166992,
+    2.8626973628997803,
+    2.6564245223999023,
+    2.337247848510742,
+    2.623920440673828,
+    2.8925540447235107,
+    2.7612404823303223,
+    3.030447006225586,
+    2.6975481510162354,
+    2.8424010276794434,
+    2.565709114074707,
+    2.5626437664031982,
+    2.369471549987793,
+    2.5989081859588623,
+    2.4029719829559326,
+    2.6931118965148926,
+    2.537043571472168,
+    2.798220157623291,
+    2.733973979949951,
+    2.8670730590820312,
+    2.593240737915039,
+    2.726287603378296,
+    2.441145181655884,
+    2.4853997230529785,
+    2.5489566326141357,
+    2.58953857421875,
+    2.3570990562438965,
+    2.7839877605438232,
+    2.6664319038391113,
+    2.451073169708252,
+    2.4165842533111572,
+    2.8226873874664307,
+    2.483943462371826,
+    2.6459426879882812,
+    2.8194966316223145,
+    2.9925575256347656,
+    3.024606466293335,
+    2.5780186653137207,
+    2.562302589416504,
+    2.793253183364868,
+    2.7496180534362793,
+    2.724498748779297,
+    2.8197271823883057,
+    3.052762746810913,
+    2.605008125305176,
+    2.684688091278076,
+    2.6232948303222656,
+    2.8531594276428223,
+    2.8273138999938965,
+    2.579639434814453,
+    3.0180904865264893,
+    2.7427053451538086,
+    3.025895357131958,
+    2.9524099826812744,
+    2.6946358680725098,
+    2.793757915496826,
+    3.356538772583008,
+    2.54980731010437,
+    2.9806697368621826,
+    2.6238772869110107,
+    2.6267926692962646,
+    3.324321985244751,
+    2.6571552753448486,
+    2.872965097427368,
+    3.344036817550659,
+    2.6816329956054688,
+    2.555556535720825,
+    2.951611042022705,
+    2.9767303466796875,
+    2.6781740188598633,
+    2.818758010864258,
+    2.970280408859253,
+    3.3918988704681396,
+    3.01507306098938,
+    3.0470144748687744,
+    3.0206611156463623,
+    2.954531192779541,
+    2.601611375808716,
+    3.2214748859405518,
+    3.3886051177978516,
+    2.803828239440918,
+    2.8815054893493652,
+    3.0055510997772217,
+    2.4984209537506104,
+    3.889130115509033,
+    2.7673330307006836,
+    2.6920034885406494,
+    2.7047054767608643,
+    2.5410099029541016,
+    3.164426803588867,
+    3.2736544609069824,
+    2.695065498352051,
+    2.5002198219299316,
+    2.872870922088623,
+    3.1744089126586914,
+    2.839507818222046,
+    2.624886989593506,
+    2.685697555541992,
+    2.76230525970459,
+    2.767826795578003,
+    2.620154857635498,
+    2.4525625705718994,
+    2.8133208751678467,
+    2.6362667083740234,
+    2.836129665374756,
+    2.72979998588562,
+    2.5686488151550293,
+    2.417842149734497,
+    2.5148706436157227,
+    2.6384456157684326,
+    3.046665668487549,
+    2.8310537338256836,
+    2.6096303462982178,
+    2.4335412979125977,
+    2.646084785461426,
+    2.2185797691345215,
+    2.4838509559631348,
+    2.302177906036377,
+    2.9938859939575195,
+    2.5540778636932373,
+    2.4861669540405273,
+    2.5620198249816895,
+    2.782641887664795,
+    2.0414438247680664,
+    2.570307731628418,
+    2.3178162574768066,
+    2.7533011436462402,
+    3.034275770187378,
+    2.723923921585083,
+    2.352768659591675,
+    2.850294589996338,
+    2.6245357990264893,
+    2.6360621452331543,
+    2.48866868019104,
+    2.1644887924194336,
+    2.2553470134735107,
+    2.53904128074646,
+    2.399904251098633,
+    2.5830535888671875,
+    2.542200803756714,
+    2.614015579223633,
+    2.6811702251434326,
+    2.374035120010376,
+    2.3723156452178955,
+    2.2367701530456543,
+    2.2366604804992676,
+    2.115833044052124,
+    1.9436237812042236,
+    2.7350680828094482,
+    2.1679868698120117,
+    2.3525662422180176,
+    1.9444410800933838,
+    2.160470485687256,
+    2.1456854343414307,
+    2.168272018432617,
+    2.5189151763916016,
+    2.4282479286193848,
+    2.3726255893707275,
+    2.3538897037506104,
+    2.4501397609710693,
+    2.1067512035369873,
+    2.1688575744628906,
+    2.4801933765411377,
+    2.1075339317321777,
+    2.0033621788024902,
+    2.2113070487976074,
+    2.5495996475219727,
+    2.527372360229492,
+    2.107016086578369,
+    2.3226125240325928,
+    2.2363219261169434,
+    2.3472907543182373,
+    2.0882468223571777,
+    2.4700372219085693,
+    1.9459065198898315,
+    2.2644684314727783,
+    1.9148385524749756,
+    1.9975242614746094,
+    2.202174186706543,
+    1.9708795547485352,
+    2.0653090476989746,
+    1.9575610160827637,
+    2.3627259731292725,
+    2.250105381011963,
+    1.9559214115142822,
+    1.980554223060608,
+    2.2665791511535645,
+    2.422996759414673,
+    2.2750163078308105,
+    2.002016544342041,
+    2.035966157913208,
+    2.0012030601501465,
+    1.9037576913833618,
+    1.8832789659500122,
+    2.36210036277771,
+    1.9064065217971802,
+    2.1052324771881104,
+    1.8604334592819214,
+    1.8097143173217773,
+    1.8975794315338135,
+    1.587221622467041,
+    1.8477089405059814,
+    2.0763731002807617,
+    2.372790813446045,
+    2.16257643699646,
+    1.9638965129852295,
+    1.5651309490203857,
+    1.82825767993927,
+    1.6181309223175049,
+    1.472574234008789,
+    1.6909890174865723,
+    1.8273817300796509,
+    1.7103486061096191,
+    1.8046334981918335,
+    1.774908423423767,
+    1.6485402584075928,
+    1.591095209121704,
+    1.5502698421478271,
+    1.7284529209136963,
+    1.3032234907150269,
+    1.659402847290039,
+    1.5459942817687988,
+    1.433272123336792,
+    1.3231465816497803,
+    1.3671213388442993,
+    1.5878024101257324,
+    1.4647092819213867,
+    1.7827116250991821,
+    1.207082986831665,
+    1.474880576133728,
+    1.250454306602478,
+    1.3616201877593994,
+    1.4552667140960693,
+    1.4233489036560059,
+    1.353947401046753,
+    1.3064395189285278,
+    1.4184495210647583,
+    1.2800196409225464,
+    1.177224040031433,
+    1.3941375017166138,
+    1.4012250900268555,
+    1.3233168125152588,
+    1.2974374294281006,
+    1.527478814125061,
+    1.3085899353027344,
+    1.2666343450546265,
+    1.4435198307037354,
+    0.9987432360649109,
+    1.2126177549362183,
+    1.1495455503463745,
+    0.9436071515083313,
+    1.2326290607452393,
+    1.1269416809082031,
+    1.093946099281311,
+    1.2739193439483643,
+    0.9942349195480347,
+    1.062682867050171,
+    1.131354570388794,
+    1.02915358543396,
+    1.0052719116210938,
+    0.9956269860267639,
+    0.842444896697998,
+    0.9321096539497375,
+    0.9191840291023254,
+    0.9050828218460083,
+    0.872301459312439,
+    0.7708895802497864,
+    1.0798320770263672,
+    0.6895140409469604,
+    0.6412638425827026,
+    0.6592952013015747,
+    1.0338897705078125,
+    0.87666916847229,
+    1.048370361328125,
+    0.6726852059364319,
+    0.7792536020278931,
+    0.8729381561279297,
+    0.6528324484825134,
+    0.6074752807617188,
+    0.84234619140625,
+    0.7661612033843994,
+    0.4835044741630554,
+    0.5534850358963013,
+    0.6099311113357544,
+    0.6263619661331177,
+    0.5781559348106384,
+    0.5867174863815308,
+    0.4157564640045166,
+    0.630603015422821,
+    0.5447350740432739,
+    0.5202270746231079,
+    0.4276602268218994,
+    0.7006953358650208,
+    0.6158550977706909,
+    0.4555320143699646,
+    0.36315128207206726,
+    0.45986461639404297,
+    0.24371668696403503,
+    0.5697780847549438,
+    0.31265032291412354,
+    0.3286770284175873,
+    0.3233088254928589,
+    0.46373313665390015,
+    0.30413633584976196,
+    0.2936036288738251,
+    0.28702080249786377,
+    0.22594162821769714,
+    0.19358153641223907,
+    0.17534299194812775,
+    0.14627060294151306,
+    0.18883207440376282,
+    0.17286835610866547,
+    0.13842524588108063,
+    0.08551988005638123,
+    0.13705158233642578,
+    0.08591895550489426,
+    0.061827726662158966,
+    0.03967079147696495,
+    0.04447402432560921,
+    0.0,
+    0.0
+  ]
+}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/coordination_numbers.json b/CI/integration_tests/calculators/data/coordination_numbers.json
new file mode 100644
index 00000000..6571ab9e
--- /dev/null
+++ b/CI/integration_tests/calculators/data/coordination_numbers.json
@@ -0,0 +1,1 @@
+{"x": [1.0, 2.0], "y": [2.412625438618138, 0.679260779765575], "uncertainty": [0.01451453705244969, 0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/einstein_diffusion_coefficients.json b/CI/integration_tests/calculators/data/einstein_diffusion_coefficients.json
new file mode 100644
index 00000000..1cb02578
--- /dev/null
+++ b/CI/integration_tests/calculators/data/einstein_diffusion_coefficients.json
@@ -0,0 +1,1 @@
+{"x": [1.780223204577946e-05], "uncertainty": [1.7053935949942446e-07]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/einstein_distinct_diffusion_coefficients.json b/CI/integration_tests/calculators/data/einstein_distinct_diffusion_coefficients.json
new file mode 100644
index 00000000..872313f2
--- /dev/null
+++ b/CI/integration_tests/calculators/data/einstein_distinct_diffusion_coefficients.json
@@ -0,0 +1,3246 @@
+{
+  "x": [
+    0.020018507094386177,
+    0.030027760641579266,
+    0.040037014188772355,
+    0.05004626773596545,
+    0.06005552128315853,
+    0.07006477483035162,
+    0.08007402837754471,
+    0.0900832819247378,
+    0.1000925354719309,
+    0.11010178901912397,
+    0.12011104256631706,
+    0.13012029611351014,
+    0.14012954966070323,
+    0.15013880320789633,
+    0.16014805675508942,
+    0.1701573103022825,
+    0.1801665638494756,
+    0.1901758173966687,
+    0.2001850709438618,
+    0.21019432449105485,
+    0.22020357803824794,
+    0.23021283158544104,
+    0.24022208513263413,
+    0.2502313386798272,
+    0.2602405922270203,
+    0.2702498457742134,
+    0.28025909932140647,
+    0.2902683528685996,
+    0.30027760641579265,
+    0.3102868599629858,
+    0.32029611351017884,
+    0.3303053670573719,
+    0.340314620604565,
+    0.3503238741517581,
+    0.3603331276989512,
+    0.37034238124614427,
+    0.3803516347933374,
+    0.39036088834053045,
+    0.4003701418877236,
+    0.41037939543491664,
+    0.4203886489821097,
+    0.4303979025293028,
+    0.4404071560764959,
+    0.450416409623689,
+    0.46042566317088207,
+    0.4704349167180752,
+    0.48044417026526826,
+    0.4904534238124613,
+    0.5004626773596544,
+    0.5104719309068475,
+    0.5204811844540406,
+    0.5304904380012337,
+    0.5404996915484268,
+    0.5505089450956199,
+    0.5605181986428129,
+    0.570527452190006,
+    0.5805367057371992,
+    0.5905459592843922,
+    0.6005552128315853,
+    0.6105644663787784,
+    0.6205737199259715,
+    0.6305829734731646,
+    0.6405922270203577,
+    0.6506014805675507,
+    0.6606107341147438,
+    0.670619987661937,
+    0.68062924120913,
+    0.6906384947563231,
+    0.7006477483035162,
+    0.7106570018507093,
+    0.7206662553979024,
+    0.7306755089450955,
+    0.7406847624922885,
+    0.7506940160394816,
+    0.7607032695866748,
+    0.7707125231338678,
+    0.7807217766810609,
+    0.790731030228254,
+    0.8007402837754471,
+    0.8107495373226402,
+    0.8207587908698333,
+    0.8307680444170263,
+    0.8407772979642194,
+    0.8507865515114126,
+    0.8607958050586056,
+    0.8708050586057987,
+    0.8808143121529918,
+    0.8908235657001848,
+    0.900832819247378,
+    0.9108420727945711,
+    0.9208513263417641,
+    0.9308605798889572,
+    0.9408698334361504,
+    0.9508790869833434,
+    0.9608883405305365,
+    0.9708975940777296,
+    0.9809068476249226,
+    0.9909161011721158,
+    1.0009253547193089,
+    1.010934608266502,
+    1.020943861813695,
+    1.0309531153608882,
+    1.0409623689080811,
+    1.0509716224552743,
+    1.0609808760024675,
+    1.0709901295496604,
+    1.0809993830968536,
+    1.0910086366440466,
+    1.1010178901912397,
+    1.111027143738433,
+    1.1210363972856259,
+    1.131045650832819,
+    1.141054904380012,
+    1.1510641579272052,
+    1.1610734114743984,
+    1.1710826650215913,
+    1.1810919185687845,
+    1.1911011721159777,
+    1.2011104256631706,
+    1.2111196792103638,
+    1.2211289327575567,
+    1.23113818630475,
+    1.241147439851943,
+    1.251156693399136,
+    1.2611659469463292,
+    1.2711752004935222,
+    1.2811844540407153,
+    1.2911937075879085,
+    1.3012029611351015,
+    1.3112122146822947,
+    1.3212214682294876,
+    1.3312307217766808,
+    1.341239975323874,
+    1.351249228871067,
+    1.36125848241826,
+    1.371267735965453,
+    1.3812769895126462,
+    1.3912862430598394,
+    1.4012954966070323,
+    1.4113047501542255,
+    1.4213140037014187,
+    1.4313232572486116,
+    1.4413325107958048,
+    1.4513417643429978,
+    1.461351017890191,
+    1.4713602714373841,
+    1.481369524984577,
+    1.4913787785317703,
+    1.5013880320789632,
+    1.5113972856261564,
+    1.5214065391733496,
+    1.5314157927205425,
+    1.5414250462677357,
+    1.5514342998149286,
+    1.5614435533621218,
+    1.571452806909315,
+    1.581462060456508,
+    1.5914713140037011,
+    1.6014805675508943,
+    1.6114898210980872,
+    1.6214990746452804,
+    1.6315083281924734,
+    1.6415175817396666,
+    1.6515268352868597,
+    1.6615360888340527,
+    1.6715453423812459,
+    1.6815545959284388,
+    1.691563849475632,
+    1.7015731030228252,
+    1.7115823565700181,
+    1.7215916101172113,
+    1.7316008636644042,
+    1.7416101172115974,
+    1.7516193707587906,
+    1.7616286243059835,
+    1.7716378778531767,
+    1.7816471314003697,
+    1.7916563849475629,
+    1.801665638494756,
+    1.811674892041949,
+    1.8216841455891422,
+    1.8316933991363353,
+    1.8417026526835283,
+    1.8517119062307215,
+    1.8617211597779144,
+    1.8717304133251076,
+    1.8817396668723008,
+    1.8917489204194937,
+    1.901758173966687,
+    1.9117674275138798,
+    1.921776681061073,
+    1.9317859346082662,
+    1.9417951881554592,
+    1.9518044417026523,
+    1.9618136952498453,
+    1.9718229487970385,
+    1.9818322023442316,
+    1.9918414558914246,
+    2.0018507094386178,
+    2.011859962985811,
+    2.021869216533004,
+    2.031878470080197,
+    2.04188772362739,
+    2.051896977174583,
+    2.0619062307217764,
+    2.0719154842689695,
+    2.0819247378161623,
+    2.0919339913633554,
+    2.1019432449105486,
+    2.111952498457742,
+    2.121961752004935,
+    2.1319710055521277,
+    2.141980259099321,
+    2.151989512646514,
+    2.1619987661937072,
+    2.1720080197409004,
+    2.182017273288093,
+    2.1920265268352863,
+    2.2020357803824795,
+    2.2120450339296727,
+    2.222054287476866,
+    2.2320635410240586,
+    2.2420727945712517,
+    2.252082048118445,
+    2.262091301665638,
+    2.2721005552128313,
+    2.282109808760024,
+    2.292119062307217,
+    2.3021283158544104,
+    2.3121375694016035,
+    2.3221468229487967,
+    2.3321560764959894,
+    2.3421653300431826,
+    2.352174583590376,
+    2.362183837137569,
+    2.372193090684762,
+    2.3822023442319553,
+    2.392211597779148,
+    2.4022208513263412,
+    2.4122301048735344,
+    2.4222393584207276,
+    2.4322486119679207,
+    2.4422578655151135,
+    2.4522671190623067,
+    2.4622763726095,
+    2.472285626156693,
+    2.482294879703886,
+    2.492304133251079,
+    2.502313386798272,
+    2.5123226403454653,
+    2.5223318938926584,
+    2.5323411474398516,
+    2.5423504009870443,
+    2.5523596545342375,
+    2.5623689080814307,
+    2.572378161628624,
+    2.582387415175817,
+    2.59239666872301,
+    2.602405922270203,
+    2.612415175817396,
+    2.6224244293645893,
+    2.6324336829117825,
+    2.642442936458975,
+    2.6524521900061684,
+    2.6624614435533616,
+    2.6724706971005547,
+    2.682479950647748,
+    2.6924892041949406,
+    2.702498457742134,
+    2.712507711289327,
+    2.72251696483652,
+    2.7325262183837133,
+    2.742535471930906,
+    2.7525447254780993,
+    2.7625539790252924,
+    2.7725632325724856,
+    2.782572486119679,
+    2.792581739666872,
+    2.8025909932140647,
+    2.812600246761258,
+    2.822609500308451,
+    2.832618753855644,
+    2.8426280074028374,
+    2.85263726095003,
+    2.8626465144972233,
+    2.8726557680444165,
+    2.8826650215916096,
+    2.892674275138803,
+    2.9026835286859956,
+    2.9126927822331887,
+    2.922702035780382,
+    2.932711289327575,
+    2.9427205428747683,
+    2.952729796421961,
+    2.962739049969154,
+    2.9727483035163473,
+    2.9827575570635405,
+    2.9927668106107337,
+    3.0027760641579264,
+    3.0127853177051196,
+    3.0227945712523128,
+    3.032803824799506,
+    3.042813078346699,
+    3.052822331893892,
+    3.062831585441085,
+    3.072840838988278,
+    3.0828500925354714,
+    3.0928593460826646,
+    3.1028685996298573,
+    3.1128778531770505,
+    3.1228871067242436,
+    3.132896360271437,
+    3.14290561381863,
+    3.1529148673658227,
+    3.162924120913016,
+    3.172933374460209,
+    3.1829426280074022,
+    3.1929518815545954,
+    3.2029611351017886,
+    3.2129703886489813,
+    3.2229796421961745,
+    3.2329888957433677,
+    3.242998149290561,
+    3.253007402837754,
+    3.2630166563849468,
+    3.27302590993214,
+    3.283035163479333,
+    3.2930444170265263,
+    3.3030536705737195,
+    3.313062924120912,
+    3.3230721776681054,
+    3.3330814312152985,
+    3.3430906847624917,
+    3.353099938309685,
+    3.3631091918568776,
+    3.373118445404071,
+    3.383127698951264,
+    3.393136952498457,
+    3.4031462060456503,
+    3.413155459592843,
+    3.4231647131400362,
+    3.4331739666872294,
+    3.4431832202344226,
+    3.4531924737816158,
+    3.4632017273288085,
+    3.4732109808760017,
+    3.483220234423195,
+    3.493229487970388,
+    3.503238741517581,
+    3.513247995064774,
+    3.523257248611967,
+    3.5332665021591603,
+    3.5432757557063534,
+    3.5532850092535466,
+    3.5632942628007394,
+    3.5733035163479325,
+    3.5833127698951257,
+    3.593322023442319,
+    3.603331276989512,
+    3.613340530536705,
+    3.623349784083898,
+    3.633359037631091,
+    3.6433682911782843,
+    3.6533775447254775,
+    3.6633867982726707,
+    3.6733960518198634,
+    3.6834053053670566,
+    3.6934145589142497,
+    3.703423812461443,
+    3.713433066008636,
+    3.723442319555829,
+    3.733451573103022,
+    3.743460826650215,
+    3.7534700801974084,
+    3.7634793337446015,
+    3.7734885872917943,
+    3.7834978408389874,
+    3.7935070943861806,
+    3.803516347933374,
+    3.813525601480567,
+    3.8235348550277597,
+    3.833544108574953,
+    3.843553362122146,
+    3.853562615669339,
+    3.8635718692165324,
+    3.873581122763725,
+    3.8835903763109183,
+    3.8935996298581115,
+    3.9036088834053047,
+    3.913618136952498,
+    3.9236273904996906,
+    3.9336366440468837,
+    3.943645897594077,
+    3.95365515114127,
+    3.9636644046884633,
+    3.973673658235656,
+    3.983682911782849,
+    3.9936921653300423,
+    4.0037014188772355,
+    4.013710672424429,
+    4.023719925971622,
+    4.033729179518815,
+    4.043738433066008,
+    4.0537476866132005,
+    4.063756940160394,
+    4.073766193707587,
+    4.08377544725478,
+    4.093784700801973,
+    4.103793954349166,
+    4.11380320789636,
+    4.123812461443553,
+    4.133821714990746,
+    4.143830968537939,
+    4.153840222085131,
+    4.1638494756323245,
+    4.173858729179518,
+    4.183867982726711,
+    4.193877236273904,
+    4.203886489821097,
+    4.21389574336829,
+    4.223904996915484,
+    4.233914250462677,
+    4.24392350400987,
+    4.253932757557062,
+    4.263942011104255,
+    4.273951264651449,
+    4.283960518198642,
+    4.293969771745835,
+    4.303979025293028,
+    4.313988278840221,
+    4.3239975323874145,
+    4.334006785934608,
+    4.344016039481801,
+    4.354025293028994,
+    4.364034546576186,
+    4.3740438001233795,
+    4.384053053670573,
+    4.394062307217766,
+    4.404071560764959,
+    4.414080814312152,
+    4.424090067859345,
+    4.4340993214065385,
+    4.444108574953732,
+    4.454117828500925,
+    4.464127082048117,
+    4.47413633559531,
+    4.4841455891425035,
+    4.494154842689697,
+    4.50416409623689,
+    4.514173349784083,
+    4.524182603331276,
+    4.534191856878469,
+    4.5442011104256625,
+    4.554210363972856,
+    4.564219617520048,
+    4.574228871067241,
+    4.584238124614434,
+    4.5942473781616275,
+    4.604256631708821,
+    4.614265885256014,
+    4.624275138803207,
+    4.6342843923504,
+    4.644293645897593,
+    4.654302899444787,
+    4.664312152991979,
+    4.674321406539172,
+    4.684330660086365,
+    4.694339913633558,
+    4.704349167180752,
+    4.714358420727945,
+    4.724367674275138,
+    4.734376927822331,
+    4.744386181369524,
+    4.7543954349167175,
+    4.764404688463911,
+    4.774413942011103,
+    4.784423195558296,
+    4.794432449105489,
+    4.8044417026526824,
+    4.814450956199876,
+    4.824460209747069,
+    4.834469463294262,
+    4.844478716841455,
+    4.854487970388648,
+    4.8644972239358415,
+    4.874506477483034,
+    4.884515731030227,
+    4.89452498457742,
+    4.904534238124613,
+    4.9145434916718065,
+    4.924552745219,
+    4.934561998766193,
+    4.944571252313386,
+    4.954580505860579,
+    4.964589759407772,
+    4.974599012954965,
+    4.984608266502158,
+    4.994617520049351,
+    5.004626773596544,
+    5.014636027143737,
+    5.0246452806909305,
+    5.034654534238124,
+    5.044663787785317,
+    5.05467304133251,
+    5.064682294879703,
+    5.0746915484268955,
+    5.084700801974089,
+    5.094710055521282,
+    5.104719309068475,
+    5.114728562615668,
+    5.124737816162861,
+    5.134747069710055,
+    5.144756323257248,
+    5.154765576804441,
+    5.164774830351634,
+    5.174784083898827,
+    5.18479333744602,
+    5.194802590993213,
+    5.204811844540406,
+    5.214821098087599,
+    5.224830351634792,
+    5.234839605181985,
+    5.244848858729179,
+    5.254858112276372,
+    5.264867365823565,
+    5.274876619370758,
+    5.28488587291795,
+    5.294895126465144,
+    5.304904380012337,
+    5.31491363355953,
+    5.324922887106723,
+    5.334932140653916,
+    5.3449413942011095,
+    5.354950647748303,
+    5.364959901295496,
+    5.374969154842689,
+    5.384978408389881,
+    5.3949876619370745,
+    5.404996915484268,
+    5.415006169031461,
+    5.425015422578654,
+    5.435024676125847,
+    5.44503392967304,
+    5.4550431832202335,
+    5.465052436767427,
+    5.47506169031462,
+    5.485070943861812,
+    5.495080197409005,
+    5.5050894509561985,
+    5.515098704503392,
+    5.525107958050585,
+    5.535117211597778,
+    5.545126465144971,
+    5.555135718692164,
+    5.565144972239358,
+    5.575154225786551,
+    5.585163479333744,
+    5.595172732880936,
+    5.605181986428129,
+    5.6151912399753225,
+    5.625200493522516,
+    5.635209747069709,
+    5.645219000616902,
+    5.655228254164095,
+    5.665237507711288,
+    5.675246761258482,
+    5.685256014805675,
+    5.695265268352867,
+    5.70527452190006,
+    5.715283775447253,
+    5.725293028994447,
+    5.73530228254164,
+    5.745311536088833,
+    5.755320789636026,
+    5.765330043183219,
+    5.7753392967304125,
+    5.785348550277606,
+    5.795357803824798,
+    5.805367057371991,
+    5.815376310919184,
+    5.8253855644663775,
+    5.835394818013571,
+    5.845404071560764,
+    5.855413325107957,
+    5.86542257865515,
+    5.875431832202343,
+    5.8854410857495365,
+    5.895450339296729,
+    5.905459592843922,
+    5.915468846391115,
+    5.925478099938308,
+    5.9354873534855015,
+    5.945496607032695,
+    5.955505860579888,
+    5.965515114127081,
+    5.975524367674274,
+    5.985533621221467,
+    5.9955428747686605,
+    6.005552128315853,
+    6.015561381863046,
+    6.025570635410239,
+    6.035579888957432,
+    6.0455891425046255,
+    6.055598396051819,
+    6.065607649599012,
+    6.075616903146205,
+    6.085626156693398,
+    6.095635410240591,
+    6.105644663787784,
+    6.115653917334977,
+    6.12566317088217,
+    6.135672424429363,
+    6.145681677976556,
+    6.15569093152375,
+    6.165700185070943,
+    6.175709438618136,
+    6.185718692165329,
+    6.195727945712522,
+    6.205737199259715,
+    6.215746452806908,
+    6.225755706354101,
+    6.235764959901294,
+    6.245774213448487,
+    6.25578346699568,
+    6.265792720542874,
+    6.275801974090067,
+    6.28581122763726,
+    6.295820481184453,
+    6.305829734731645,
+    6.315838988278839,
+    6.325848241826032,
+    6.335857495373225,
+    6.345866748920418,
+    6.355876002467611,
+    6.3658852560148045,
+    6.375894509561998,
+    6.385903763109191,
+    6.395913016656384,
+    6.405922270203577,
+    6.4159315237507695,
+    6.425940777297963,
+    6.435950030845156,
+    6.445959284392349,
+    6.455968537939542,
+    6.465977791486735,
+    6.4759870450339285,
+    6.485996298581122,
+    6.496005552128315,
+    6.506014805675508,
+    6.5160240592227,
+    6.5260333127698935,
+    6.536042566317087,
+    6.54605181986428,
+    6.556061073411473,
+    6.566070326958666,
+    6.576079580505859,
+    6.586088834053053,
+    6.596098087600246,
+    6.606107341147439,
+    6.616116594694631,
+    6.626125848241824,
+    6.6361351017890176,
+    6.646144355336211,
+    6.656153608883404,
+    6.666162862430597,
+    6.67617211597779,
+    6.686181369524983,
+    6.696190623072177,
+    6.70619987661937,
+    6.716209130166562,
+    6.726218383713755,
+    6.736227637260948,
+    6.746236890808142,
+    6.756246144355335,
+    6.766255397902528,
+    6.776264651449721,
+    6.786273904996914,
+    6.7962831585441075,
+    6.806292412091301,
+    6.816301665638493,
+    6.826310919185686,
+    6.836320172732879,
+    6.8463294262800725,
+    6.856338679827266,
+    6.866347933374459,
+    6.876357186921652,
+    6.886366440468845,
+    6.896375694016038,
+    6.9063849475632315,
+    6.916394201110425,
+    6.926403454657617,
+    6.93641270820481,
+    6.946421961752003,
+    6.9564312152991965,
+    6.96644046884639,
+    6.976449722393583,
+    6.986458975940776,
+    6.996468229487969,
+    7.006477483035162,
+    7.0164867365823556,
+    7.026495990129548,
+    7.036505243676741,
+    7.046514497223934,
+    7.056523750771127,
+    7.0665330043183205,
+    7.076542257865514,
+    7.086551511412707,
+    7.0965607649599,
+    7.106570018507093,
+    7.116579272054286,
+    7.126588525601479,
+    7.136597779148672,
+    7.146607032695865,
+    7.156616286243058,
+    7.166625539790251,
+    7.176634793337445,
+    7.186644046884638,
+    7.196653300431831,
+    7.206662553979024,
+    7.216671807526217,
+    7.22668106107341,
+    7.236690314620603,
+    7.246699568167796,
+    7.256708821714989,
+    7.266718075262182,
+    7.2767273288093755,
+    7.286736582356569,
+    7.296745835903762,
+    7.306755089450955,
+    7.316764342998148,
+    7.326773596545341,
+    7.336782850092534,
+    7.346792103639727,
+    7.35680135718692,
+    7.366810610734113,
+    7.376819864281306,
+    7.3868291178284995,
+    7.396838371375693,
+    7.406847624922886,
+    7.416856878470079,
+    7.426866132017272,
+    7.4368753855644645,
+    7.446884639111658,
+    7.456893892658851,
+    7.466903146206044,
+    7.476912399753237,
+    7.48692165330043,
+    7.4969309068476235,
+    7.506940160394817,
+    7.51694941394201,
+    7.526958667489203,
+    7.536967921036395,
+    7.5469771745835885,
+    7.556986428130782,
+    7.566995681677975,
+    7.577004935225168,
+    7.587014188772361,
+    7.597023442319554,
+    7.607032695866748,
+    7.617041949413941,
+    7.627051202961134,
+    7.637060456508326,
+    7.647069710055519,
+    7.657078963602713,
+    7.667088217149906,
+    7.677097470697099,
+    7.687106724244292,
+    7.697115977791485,
+    7.707125231338678,
+    7.717134484885872,
+    7.727143738433065,
+    7.737152991980258,
+    7.74716224552745,
+    7.757171499074643,
+    7.767180752621837,
+    7.77719000616903,
+    7.787199259716223,
+    7.797208513263416,
+    7.807217766810609,
+    7.8172270203578025,
+    7.827236273904996,
+    7.837245527452189,
+    7.847254780999381,
+    7.857264034546574,
+    7.8672732880937675,
+    7.877282541640961,
+    7.887291795188154,
+    7.897301048735347,
+    7.90731030228254,
+    7.917319555829733,
+    7.9273288093769265,
+    7.93733806292412,
+    7.947347316471312,
+    7.957356570018505,
+    7.967365823565698,
+    7.9773750771128915,
+    7.987384330660085,
+    7.997393584207278,
+    8.007402837754471,
+    8.017412091301663,
+    8.027421344848857,
+    8.03743059839605,
+    8.047439851943244,
+    8.057449105490436,
+    8.06745835903763,
+    8.077467612584822,
+    8.087476866132016,
+    8.097486119679209,
+    8.107495373226401,
+    8.117504626773595,
+    8.127513880320787,
+    8.137523133867981,
+    8.147532387415174,
+    8.157541640962368,
+    8.16755089450956,
+    8.177560148056754,
+    8.187569401603946,
+    8.19757865515114,
+    8.207587908698333,
+    8.217597162245525,
+    8.22760641579272,
+    8.237615669339911,
+    8.247624922887105,
+    8.257634176434298,
+    8.267643429981492,
+    8.277652683528684,
+    8.287661937075878,
+    8.29767119062307,
+    8.307680444170263,
+    8.317689697717457,
+    8.327698951264649,
+    8.337708204811843,
+    8.347717458359035,
+    8.35772671190623,
+    8.367735965453422,
+    8.377745219000616,
+    8.387754472547808,
+    8.397763726095002,
+    8.407772979642194,
+    8.417782233189387,
+    8.42779148673658,
+    8.437800740283773,
+    8.447809993830967,
+    8.45781924737816,
+    8.467828500925354,
+    8.477837754472546,
+    8.48784700801974,
+    8.497856261566932,
+    8.507865515114124,
+    8.517874768661319,
+    8.52788402220851,
+    8.537893275755705,
+    8.547902529302897,
+    8.557911782850091,
+    8.567921036397284,
+    8.577930289944478,
+    8.58793954349167,
+    8.597948797038864,
+    8.607958050586056,
+    8.617967304133249,
+    8.627976557680443,
+    8.637985811227635,
+    8.647995064774829,
+    8.658004318322021,
+    8.668013571869215,
+    8.678022825416408,
+    8.688032078963602,
+    8.698041332510794,
+    8.708050586057988,
+    8.71805983960518,
+    8.728069093152373,
+    8.738078346699567,
+    8.748087600246759,
+    8.758096853793953,
+    8.768106107341145,
+    8.77811536088834,
+    8.788124614435532,
+    8.798133867982726,
+    8.808143121529918,
+    8.81815237507711,
+    8.828161628624304,
+    8.838170882171497,
+    8.84818013571869,
+    8.858189389265883,
+    8.868198642813077,
+    8.87820789636027,
+    8.888217149907463,
+    8.898226403454656,
+    8.90823565700185,
+    8.918244910549042,
+    8.928254164096234,
+    8.938263417643428,
+    8.94827267119062,
+    8.958281924737815,
+    8.968291178285007,
+    8.978300431832201,
+    8.988309685379393,
+    8.998318938926587,
+    9.00832819247378,
+    9.018337446020974,
+    9.028346699568166,
+    9.038355953115358,
+    9.048365206662552,
+    9.058374460209745,
+    9.068383713756939,
+    9.078392967304131,
+    9.088402220851325,
+    9.098411474398517,
+    9.108420727945711,
+    9.118429981492904,
+    9.128439235040096,
+    9.13844848858729,
+    9.148457742134482,
+    9.158466995681676,
+    9.168476249228869,
+    9.178485502776063,
+    9.188494756323255,
+    9.19850400987045,
+    9.208513263417641,
+    9.218522516964835,
+    9.228531770512028,
+    9.23854102405922,
+    9.248550277606414,
+    9.258559531153606,
+    9.2685687847008,
+    9.278578038247993,
+    9.288587291795187,
+    9.29859654534238,
+    9.308605798889573,
+    9.318615052436765,
+    9.328624305983958,
+    9.338633559531152,
+    9.348642813078344,
+    9.358652066625538,
+    9.36866132017273,
+    9.378670573719925,
+    9.388679827267117,
+    9.39868908081431,
+    9.408698334361503,
+    9.418707587908697,
+    9.42871684145589,
+    9.438726095003082,
+    9.448735348550276,
+    9.458744602097468,
+    9.468753855644662,
+    9.478763109191854,
+    9.488772362739049,
+    9.49878161628624,
+    9.508790869833435,
+    9.518800123380627,
+    9.528809376927821,
+    9.538818630475014,
+    9.548827884022206,
+    9.5588371375694,
+    9.568846391116592,
+    9.578855644663786,
+    9.588864898210979,
+    9.598874151758173,
+    9.608883405305365,
+    9.618892658852559,
+    9.628901912399751,
+    9.638911165946944,
+    9.648920419494138,
+    9.65892967304133,
+    9.668938926588524,
+    9.678948180135716,
+    9.68895743368291,
+    9.698966687230103,
+    9.708975940777297,
+    9.718985194324489,
+    9.728994447871683,
+    9.739003701418875,
+    9.749012954966068,
+    9.759022208513262,
+    9.769031462060454,
+    9.779040715607648,
+    9.78904996915484,
+    9.799059222702034,
+    9.809068476249227,
+    9.81907772979642,
+    9.829086983343613,
+    9.839096236890807,
+    9.849105490438,
+    9.859114743985192,
+    9.869123997532386,
+    9.879133251079578,
+    9.889142504626772,
+    9.899151758173964,
+    9.909161011721158,
+    9.91917026526835,
+    9.929179518815545,
+    9.939188772362737,
+    9.94919802590993,
+    9.959207279457123,
+    9.969216533004316,
+    9.97922578655151,
+    9.989235040098702,
+    9.999244293645896,
+    10.009253547193088,
+    10.019262800740282,
+    10.029272054287475,
+    10.039281307834669,
+    10.049290561381861,
+    10.059299814929053,
+    10.069309068476247,
+    10.07931832202344,
+    10.089327575570634,
+    10.099336829117826,
+    10.10934608266502,
+    10.119355336212212,
+    10.129364589759406,
+    10.139373843306599,
+    10.149383096853791,
+    10.159392350400985,
+    10.169401603948177,
+    10.179410857495371,
+    10.189420111042564,
+    10.199429364589758,
+    10.20943861813695,
+    10.219447871684144,
+    10.229457125231336,
+    10.23946637877853,
+    10.249475632325723,
+    10.259484885872915,
+    10.26949413942011,
+    10.279503392967301,
+    10.289512646514495,
+    10.299521900061688,
+    10.309531153608882,
+    10.319540407156074,
+    10.329549660703268,
+    10.33955891425046,
+    10.349568167797655,
+    10.359577421344847,
+    10.36958667489204,
+    10.379595928439233,
+    10.389605181986425,
+    10.39961443553362,
+    10.409623689080812,
+    10.419632942628006,
+    10.429642196175198,
+    10.439651449722392,
+    10.449660703269585,
+    10.459669956816777,
+    10.46967921036397,
+    10.479688463911163,
+    10.489697717458357,
+    10.49970697100555,
+    10.509716224552744,
+    10.519725478099936,
+    10.52973473164713,
+    10.539743985194322,
+    10.549753238741516,
+    10.559762492288709,
+    10.5697717458359,
+    10.579780999383095,
+    10.589790252930287,
+    10.599799506477481,
+    10.609808760024674,
+    10.619818013571868,
+    10.62982726711906,
+    10.639836520666254,
+    10.649845774213446,
+    10.659855027760639,
+    10.669864281307833,
+    10.679873534855025,
+    10.689882788402219,
+    10.699892041949411,
+    10.709901295496605,
+    10.719910549043798,
+    10.729919802590992,
+    10.739929056138184,
+    10.749938309685378,
+    10.75994756323257,
+    10.769956816779763,
+    10.779966070326957,
+    10.789975323874149,
+    10.799984577421343,
+    10.809993830968535,
+    10.82000308451573,
+    10.830012338062922,
+    10.840021591610116,
+    10.850030845157308,
+    10.860040098704502,
+    10.870049352251694,
+    10.880058605798887,
+    10.89006785934608,
+    10.900077112893273,
+    10.910086366440467,
+    10.92009561998766,
+    10.930104873534853,
+    10.940114127082046,
+    10.95012338062924,
+    10.960132634176432,
+    10.970141887723624,
+    10.980151141270818,
+    10.99016039481801,
+    11.000169648365205,
+    11.010178901912397,
+    11.020188155459591,
+    11.030197409006783,
+    11.040206662553977,
+    11.05021591610117,
+    11.060225169648364,
+    11.070234423195556,
+    11.080243676742748,
+    11.090252930289942,
+    11.100262183837135,
+    11.110271437384329,
+    11.120280690931521,
+    11.130289944478715,
+    11.140299198025907,
+    11.150308451573101,
+    11.160317705120294,
+    11.170326958667488,
+    11.18033621221468,
+    11.190345465761872,
+    11.200354719309066,
+    11.210363972856259,
+    11.220373226403453,
+    11.230382479950645,
+    11.24039173349784,
+    11.250400987045031,
+    11.260410240592226,
+    11.270419494139418,
+    11.28042874768661,
+    11.290438001233804,
+    11.300447254780996,
+    11.31045650832819,
+    11.320465761875383,
+    11.330475015422577,
+    11.34048426896977,
+    11.350493522516963,
+    11.360502776064155,
+    11.37051202961135,
+    11.380521283158542,
+    11.390530536705734,
+    11.400539790252928,
+    11.41054904380012,
+    11.420558297347315,
+    11.430567550894507,
+    11.4405768044417,
+    11.450586057988893,
+    11.460595311536087,
+    11.47060456508328,
+    11.480613818630472,
+    11.490623072177666,
+    11.500632325724858,
+    11.510641579272052,
+    11.520650832819245,
+    11.530660086366439,
+    11.54066933991363,
+    11.550678593460825,
+    11.560687847008017,
+    11.570697100555211,
+    11.580706354102404,
+    11.590715607649596,
+    11.60072486119679,
+    11.610734114743982,
+    11.620743368291176,
+    11.630752621838369,
+    11.640761875385563,
+    11.650771128932755,
+    11.660780382479949,
+    11.670789636027141,
+    11.680798889574335,
+    11.690808143121528,
+    11.70081739666872,
+    11.710826650215914,
+    11.720835903763106,
+    11.7308451573103,
+    11.740854410857493,
+    11.750863664404687,
+    11.760872917951879,
+    11.770882171499073,
+    11.780891425046265,
+    11.790900678593458,
+    11.800909932140652,
+    11.810919185687844,
+    11.820928439235038,
+    11.83093769278223,
+    11.840946946329424,
+    11.850956199876617,
+    11.86096545342381,
+    11.870974706971003,
+    11.880983960518197,
+    11.89099321406539,
+    11.901002467612582,
+    11.911011721159776,
+    11.921020974706968,
+    11.931030228254162,
+    11.941039481801354,
+    11.951048735348548,
+    11.96105798889574,
+    11.971067242442935,
+    11.981076495990127,
+    11.991085749537321,
+    12.001095003084513,
+    12.011104256631706,
+    12.0211135101789,
+    12.031122763726092,
+    12.041132017273286,
+    12.051141270820478,
+    12.061150524367672,
+    12.071159777914865,
+    12.081169031462059,
+    12.091178285009251,
+    12.101187538556443,
+    12.111196792103637,
+    12.12120604565083,
+    12.131215299198024,
+    12.141224552745216,
+    12.15123380629241,
+    12.161243059839602,
+    12.171252313386796,
+    12.181261566933989,
+    12.191270820481183,
+    12.201280074028375,
+    12.211289327575567,
+    12.221298581122761,
+    12.231307834669954,
+    12.241317088217148,
+    12.25132634176434,
+    12.261335595311534,
+    12.271344848858726,
+    12.28135410240592,
+    12.291363355953113,
+    12.301372609500305,
+    12.3113818630475,
+    12.321391116594691,
+    12.331400370141886,
+    12.341409623689078,
+    12.351418877236272,
+    12.361428130783464,
+    12.371437384330658,
+    12.38144663787785,
+    12.391455891425045,
+    12.401465144972237,
+    12.41147439851943,
+    12.421483652066623,
+    12.431492905613815,
+    12.44150215916101,
+    12.451511412708202,
+    12.461520666255396,
+    12.471529919802588,
+    12.481539173349782,
+    12.491548426896975,
+    12.501557680444169,
+    12.51156693399136,
+    12.521576187538553,
+    12.531585441085747,
+    12.54159469463294,
+    12.551603948180134,
+    12.561613201727326,
+    12.57162245527452,
+    12.581631708821712,
+    12.591640962368906,
+    12.601650215916099,
+    12.61165946946329,
+    12.621668723010485,
+    12.631677976557677,
+    12.641687230104871,
+    12.651696483652064,
+    12.661705737199258,
+    12.67171499074645,
+    12.681724244293644,
+    12.691733497840836,
+    12.70174275138803,
+    12.711752004935223,
+    12.721761258482415,
+    12.731770512029609,
+    12.741779765576801,
+    12.751789019123995,
+    12.761798272671188,
+    12.771807526218382,
+    12.781816779765574,
+    12.791826033312768,
+    12.80183528685996,
+    12.811844540407154,
+    12.821853793954347,
+    12.831863047501539,
+    12.841872301048733,
+    12.851881554595925,
+    12.86189080814312,
+    12.871900061690312,
+    12.881909315237506,
+    12.891918568784698,
+    12.901927822331892,
+    12.911937075879084,
+    12.921946329426277,
+    12.93195558297347,
+    12.941964836520663,
+    12.951974090067857,
+    12.96198334361505,
+    12.971992597162243,
+    12.982001850709436,
+    12.99201110425663,
+    13.002020357803822,
+    13.012029611351016,
+    13.022038864898208,
+    13.0320481184454,
+    13.042057371992595,
+    13.052066625539787,
+    13.062075879086981,
+    13.072085132634173,
+    13.082094386181367,
+    13.09210363972856,
+    13.102112893275754,
+    13.112122146822946,
+    13.122131400370138,
+    13.132140653917332,
+    13.142149907464525,
+    13.152159161011719,
+    13.162168414558911,
+    13.172177668106105,
+    13.182186921653297,
+    13.192196175200491,
+    13.202205428747684,
+    13.212214682294878,
+    13.22222393584207,
+    13.232233189389262,
+    13.242242442936456,
+    13.252251696483649,
+    13.262260950030843,
+    13.272270203578035,
+    13.28227945712523,
+    13.292288710672421,
+    13.302297964219616,
+    13.312307217766808,
+    13.322316471314002,
+    13.332325724861194,
+    13.342334978408386,
+    13.35234423195558,
+    13.362353485502773,
+    13.372362739049967,
+    13.38237199259716,
+    13.392381246144353,
+    13.402390499691546,
+    13.41239975323874,
+    13.422409006785932,
+    13.432418260333124,
+    13.442427513880318,
+    13.45243676742751,
+    13.462446020974705,
+    13.472455274521897,
+    13.482464528069091,
+    13.492473781616283,
+    13.502483035163477,
+    13.51249228871067,
+    13.522501542257864,
+    13.532510795805056,
+    13.542520049352248,
+    13.552529302899442,
+    13.562538556446635,
+    13.572547809993829,
+    13.58255706354102,
+    13.592566317088215,
+    13.602575570635407,
+    13.612584824182601,
+    13.622594077729794,
+    13.632603331276986,
+    13.64261258482418,
+    13.652621838371372,
+    13.662631091918566,
+    13.672640345465759,
+    13.682649599012953,
+    13.692658852560145,
+    13.702668106107339,
+    13.712677359654531,
+    13.722686613201725,
+    13.732695866748918,
+    13.74270512029611,
+    13.752714373843304,
+    13.762723627390496,
+    13.77273288093769,
+    13.782742134484883,
+    13.792751388032077,
+    13.802760641579269,
+    13.812769895126463,
+    13.822779148673655,
+    13.83278840222085,
+    13.842797655768042,
+    13.852806909315234,
+    13.862816162862428,
+    13.87282541640962,
+    13.882834669956814,
+    13.892843923504007,
+    13.9028531770512,
+    13.912862430598393,
+    13.922871684145587,
+    13.93288093769278,
+    13.942890191239972,
+    13.952899444787166,
+    13.962908698334358,
+    13.972917951881552,
+    13.982927205428744,
+    13.992936458975938,
+    14.00294571252313,
+    14.012954966070325,
+    14.022964219617517,
+    14.032973473164711,
+    14.042982726711903,
+    14.052991980259096,
+    14.06300123380629,
+    14.073010487353482,
+    14.083019740900676,
+    14.093028994447868,
+    14.103038247995062,
+    14.113047501542255,
+    14.123056755089449,
+    14.133066008636641,
+    14.143075262183835,
+    14.153084515731027,
+    14.16309376927822,
+    14.173103022825414,
+    14.183112276372606,
+    14.1931215299198,
+    14.203130783466992,
+    14.213140037014186,
+    14.223149290561379,
+    14.233158544108573,
+    14.243167797655765,
+    14.253177051202957,
+    14.263186304750151,
+    14.273195558297344,
+    14.283204811844538,
+    14.29321406539173,
+    14.303223318938924,
+    14.313232572486116,
+    14.32324182603331,
+    14.333251079580503,
+    14.343260333127697,
+    14.35326958667489,
+    14.363278840222081,
+    14.373288093769276,
+    14.383297347316468,
+    14.393306600863662,
+    14.403315854410854,
+    14.413325107958048,
+    14.42333436150524,
+    14.433343615052435,
+    14.443352868599627,
+    14.45336212214682,
+    14.463371375694013,
+    14.473380629241205,
+    14.4833898827884,
+    14.493399136335592,
+    14.503408389882786,
+    14.513417643429978,
+    14.523426896977172,
+    14.533436150524365,
+    14.543445404071559,
+    14.553454657618751,
+    14.563463911165943,
+    14.573473164713137,
+    14.58348241826033,
+    14.593491671807524,
+    14.603500925354716,
+    14.61351017890191,
+    14.623519432449102,
+    14.633528685996296,
+    14.643537939543489,
+    14.653547193090683,
+    14.663556446637875,
+    14.673565700185067,
+    14.683574953732261,
+    14.693584207279454,
+    14.703593460826648,
+    14.71360271437384,
+    14.723611967921034,
+    14.733621221468226,
+    14.74363047501542,
+    14.753639728562613,
+    14.763648982109805,
+    14.773658235656999,
+    14.783667489204191,
+    14.793676742751385,
+    14.803685996298578,
+    14.813695249845772,
+    14.823704503392964,
+    14.833713756940158,
+    14.84372301048735,
+    14.853732264034544,
+    14.863741517581737,
+    14.873750771128929,
+    14.883760024676123,
+    14.893769278223315,
+    14.90377853177051,
+    14.913787785317702,
+    14.923797038864896,
+    14.933806292412088,
+    14.943815545959282,
+    14.953824799506474,
+    14.963834053053668,
+    14.97384330660086,
+    14.983852560148053,
+    14.993861813695247,
+    15.00387106724244,
+    15.013880320789633,
+    15.023889574336826,
+    15.03389882788402,
+    15.043908081431212,
+    15.053917334978406,
+    15.063926588525598,
+    15.07393584207279,
+    15.083945095619985,
+    15.093954349167177,
+    15.103963602714371,
+    15.113972856261563,
+    15.123982109808757,
+    15.13399136335595,
+    15.144000616903144,
+    15.154009870450336,
+    15.16401912399753,
+    15.174028377544722,
+    15.184037631091915,
+    15.194046884639109,
+    15.204056138186301,
+    15.214065391733495,
+    15.224074645280687,
+    15.234083898827881,
+    15.244093152375074,
+    15.254102405922268,
+    15.26411165946946,
+    15.274120913016652,
+    15.284130166563846,
+    15.294139420111039,
+    15.304148673658233,
+    15.314157927205425,
+    15.32416718075262,
+    15.334176434299811,
+    15.344185687847006,
+    15.354194941394198,
+    15.364204194941392,
+    15.374213448488584,
+    15.384222702035776,
+    15.39423195558297,
+    15.404241209130163,
+    15.414250462677357,
+    15.42425971622455,
+    15.434268969771743,
+    15.444278223318936,
+    15.45428747686613,
+    15.464296730413322,
+    15.474305983960516,
+    15.484315237507708,
+    15.4943244910549,
+    15.504333744602095,
+    15.514342998149287,
+    15.524352251696481,
+    15.534361505243673,
+    15.544370758790867,
+    15.55438001233806,
+    15.564389265885254,
+    15.574398519432446,
+    15.584407772979638,
+    15.594417026526832,
+    15.604426280074025,
+    15.614435533621219,
+    15.624444787168411,
+    15.634454040715605,
+    15.644463294262797,
+    15.654472547809991,
+    15.664481801357184,
+    15.674491054904378,
+    15.68450030845157,
+    15.694509561998762,
+    15.704518815545956,
+    15.714528069093149,
+    15.724537322640343,
+    15.734546576187535,
+    15.744555829734729,
+    15.754565083281921,
+    15.764574336829115,
+    15.774583590376308,
+    15.7845928439235,
+    15.794602097470694,
+    15.804611351017886,
+    15.81462060456508,
+    15.824629858112273,
+    15.834639111659467,
+    15.844648365206659,
+    15.854657618753853,
+    15.864666872301045,
+    15.87467612584824,
+    15.884685379395432,
+    15.894694632942624,
+    15.904703886489818,
+    15.91471314003701,
+    15.924722393584204,
+    15.934731647131397,
+    15.94474090067859,
+    15.954750154225783,
+    15.964759407772977,
+    15.97476866132017,
+    15.984777914867363,
+    15.994787168414556,
+    16.00479642196175,
+    16.014805675508942,
+    16.024814929056134,
+    16.034824182603327,
+    16.044833436150522,
+    16.054842689697715,
+    16.064851943244907,
+    16.0748611967921,
+    16.084870450339295,
+    16.094879703886487,
+    16.10488895743368,
+    16.114898210980872,
+    16.124907464528064,
+    16.13491671807526,
+    16.144925971622452,
+    16.154935225169645,
+    16.164944478716837,
+    16.174953732264033,
+    16.184962985811225,
+    16.194972239358417,
+    16.20498149290561,
+    16.214990746452802,
+    16.224999999999998
+  ],
+  "y": [
+    0.0,
+    0.0,
+    -8.190837171673445e-05,
+    -0.000239424471171993,
+    -0.0004977508742786172,
+    -0.000882090156949448,
+    -0.0014176448950973268,
+    -0.002129617664635096,
+    -0.003043211041475596,
+    -0.004183627601531669,
+    -0.005576069920716153,
+    -0.007245740574941894,
+    -0.009217842140121729,
+    -0.011517577192168504,
+    -0.01417014830699506,
+    -0.017200758060514236,
+    -0.020634609028638874,
+    -0.02449690378728182,
+    -0.028812844912355907,
+    -0.033607634979773975,
+    -0.038906476565448864,
+    -0.04473457224529343,
+    -0.05111712459522051,
+    -0.05807933619114294,
+    -0.06564640960897355,
+    -0.07384354742462519,
+    -0.08269595221401076,
+    -0.09222882655304299,
+    -0.10246737301763484,
+    -0.11343679418369902,
+    -0.1251622926271485,
+    -0.13766907092389602,
+    -0.15098233164985445,
+    -0.16512727738093666,
+    -0.18012911069305546,
+    -0.1960130341621238,
+    -0.2128042503640543,
+    -0.23052796187476005,
+    -0.2492093712701537,
+    -0.26887368112614823,
+    -0.2895460940186563,
+    -0.3112518125235909,
+    -0.3340160392168649,
+    -0.357863976674391,
+    -0.3828208274720823,
+    -0.4089117941858512,
+    -0.436162079391611,
+    -0.4645968856652742,
+    -0.4942414155827538,
+    -0.5251208717199629,
+    -0.5572604566528138,
+    -0.5906853729572196,
+    -0.6254208232090934,
+    -0.6614920099843475,
+    -0.6989241358588951,
+    -0.7377424034086489,
+    -0.777972015209522,
+    -0.8196381738374273,
+    -0.862766081868277,
+    -0.9073809418779843,
+    -0.9535079564424621,
+    -1.0011723281376237,
+    -1.050399259539381,
+    -1.1012139532236473,
+    -1.1536416117663353,
+    -1.2077074377433583,
+    -1.2634366337306293,
+    -1.32085440230406,
+    -1.379985946039564,
+    -1.440856467513054,
+    -1.5034911693004436,
+    -1.5679152539776442,
+    -1.6341539241205694,
+    -1.702232382305132,
+    -1.7721758311072449,
+    -1.8440094731028218,
+    -1.917758510867774,
+    -1.9934481469780145,
+    -2.0711035840094567,
+    -2.1507500245380142,
+    -2.232412671139598,
+    -2.3161167263901223,
+    -2.4018873928654996,
+    -2.4897498731416423,
+    -2.579729369794465,
+    -2.6718510853998785,
+    -2.766140222533796,
+    -2.8626219837721307,
+    -2.9613215716907955,
+    -3.0622641888657043,
+    -3.165475037872768,
+    -3.2709793212879,
+    -3.378802241687013,
+    -3.488969001646022,
+    -3.601504803740837,
+    -3.7164348505473717,
+    -3.8337843446415385,
+    -3.953578488599251,
+    -4.075842484996424,
+    -4.200601536408967,
+    -4.327880845412795,
+    -4.457705614583817,
+    -4.590101046497952,
+    -4.725092343731107,
+    -4.862704708859201,
+    -5.002963344458142,
+    -5.145893453103842,
+    -5.291520237372219,
+    -5.439868899839179,
+    -5.590964643080643,
+    -5.744832669672519,
+    -5.901498182190717,
+    -6.060986383211157,
+    -6.223322475309744,
+    -6.388531661062399,
+    -6.556639143045031,
+    -6.727670123833548,
+    -6.901649806003871,
+    -7.078603392131909,
+    -7.258556084793572,
+    -7.44153308656478,
+    -7.627559600021439,
+    -7.816660827739468,
+    -8.008861972294778,
+    -8.204188236263272,
+    -8.402664822220878,
+    -8.604316932743497,
+    -8.80916977040705,
+    -9.017248537787449,
+    -9.228578437460602,
+    -9.443184672002428,
+    -9.66109244398883,
+    -9.882326955995731,
+    -10.106913410599041,
+    -10.334877010374667,
+    -10.56624295789853,
+    -10.801036455746535,
+    -11.039282706494603,
+    -11.281006912718645,
+    -11.526234276994566,
+    -11.774990001898292,
+    -12.027299290005727,
+    -12.28318734389278,
+    -12.542679366135376,
+    -12.805800559309416,
+    -13.072576125990821,
+    -13.343031268755505,
+    -13.617191190179367,
+    -13.895081092838337,
+    -14.17672617930831,
+    -14.462151652165224,
+    -14.751382713984972,
+    -15.044444567343467,
+    -15.341362414816627,
+    -15.642161458980363,
+    -15.946866902410594,
+    -16.25550394768323,
+    -16.568097797374175,
+    -16.88467365405936,
+    -17.20525672031468,
+    -17.529872198716053,
+    -17.858266674988755,
+    -18.190743968559328,
+    -18.52705066515306,
+    -18.867490584196496,
+    -19.212367545116187,
+    -19.561149516786774,
+    -19.9141403186348,
+    -20.271086536385543,
+    -20.632570606316204,
+    -20.99778188045075,
+    -21.367302795066397,
+    -21.742273020141624,
+    -22.121324673999137,
+    -22.50448295921484,
+    -22.892330312065923,
+    -23.28489193512832,
+    -23.68191441412729,
+    -24.082865717937462,
+    -24.48832828283603,
+    -24.898884545100188,
+    -25.31288800620201,
+    -25.73064248556803,
+    -26.153566270027376,
+    -26.58084871160405,
+    -27.012515012873955,
+    -27.449147610114295,
+    -27.88993585534905,
+    -28.335183568004766,
+    -28.78519456750802,
+    -29.239436822733413,
+    -29.69877138680881,
+    -30.16322346231012,
+    -30.63198240126131,
+    -31.10479478938767,
+    -31.58196444611574,
+    -32.06435242457338,
+    -32.55059084308327,
+    -33.040983521071965,
+    -33.537227362219255,
+    -34.03934756910104,
+    -34.54541902633873,
+    -35.05435246910564,
+    -35.5697951190361,
+    -36.09093632815407,
+    -36.615293747379674,
+    -37.14512151409396,
+    -37.68128068142475,
+    -38.222681984545446,
+    -38.76684307437612,
+    -39.31490362089527,
+    -39.87078946258784,
+    -40.430067932419384,
+    -40.992206999264596,
+    -41.55973941735516,
+    -42.1340834735202,
+    -42.714985753484996,
+    -43.30052114187092,
+    -43.88904314015006,
+    -44.47806939924253,
+    -45.074311926139686,
+    -45.67668145601487,
+    -46.283810107190746,
+    -46.899345101301655,
+    -47.518017920761245,
+    -48.1384606838922,
+    -48.76654954713397,
+    -49.399523544556,
+    -50.0346217102278,
+    -50.6757698826343,
+    -51.31992847899431,
+    -51.96294344912408,
+    -52.61096956631367,
+    -53.26765405219743,
+    -53.92354913642933,
+    -54.58313789119559,
+    -55.25368955718887,
+    -55.92937838312157,
+    -56.60772201991377,
+    -57.28986013754402,
+    -57.97748963969206,
+    -58.671192962635075,
+    -59.36932360784515,
+    -60.06689167458656,
+    -60.770330553000086,
+    -61.477436510856464,
+    -62.183498264270646,
+    -62.89244165172759,
+    -63.61042144651732,
+    -64.33439806585875,
+    -65.05743129106162,
+    -65.78734759651991,
+    -66.52305771740696,
+    -67.26235792149346,
+    -68.00778096301123,
+    -68.74486396830262,
+    -69.47920447695647,
+    -70.22447991723021,
+    -70.97179975247913,
+    -71.72704013914273,
+    -72.49106213034882,
+    -73.24996008614112,
+    -74.00654537760197,
+    -74.77170926448235,
+    -75.53906876179347,
+    -76.30419120250089,
+    -77.06849487343372,
+    -77.8300546592134,
+    -78.59781150163639,
+    -79.37151198642803,
+    -80.14839514765777,
+    -80.9335012912131,
+    -81.7271342365206,
+    -82.51873174583166,
+    -83.31166242392999,
+    -84.11263827780692,
+    -84.9021813304933,
+    -85.69006837433757,
+    -86.47771769616887,
+    -87.25735322674502,
+    -88.04543856283004,
+    -88.83642656998688,
+    -89.63257138559666,
+    -90.43891331554686,
+    -91.22900896160216,
+    -92.0031621431892,
+    -92.78090124242894,
+    -93.55445019007927,
+    -94.3277348246251,
+    -95.10690991935645,
+    -95.88559248928456,
+    -96.65544923146595,
+    -97.42597832139843,
+    -98.19999113016438,
+    -98.95856691449583,
+    -99.70117364326752,
+    -100.45709128837292,
+    -101.2188223974206,
+    -101.96382420808423,
+    -102.71162510248486,
+    -103.4692157044645,
+    -104.22519792572265,
+    -104.97513909922493,
+    -105.70624805241762,
+    -106.42050030583111,
+    -107.14271796174867,
+    -107.86428910037624,
+    -108.56824329640048,
+    -109.26937244548137,
+    -109.98051812532445,
+    -110.6705004512336,
+    -111.3215131473434,
+    -111.97314500902127,
+    -112.61761996702508,
+    -113.23573866123628,
+    -113.84563638952271,
+    -114.44622388705764,
+    -115.04978549784536,
+    -115.67306343550042,
+    -116.2862708995798,
+    -116.874109165874,
+    -117.4368820538096,
+    -117.97377891541056,
+    -118.5110149372133,
+    -119.01936055247619,
+    -119.51778690961885,
+    -120.00938399657434,
+    -120.49891350237951,
+    -120.99893838788923,
+    -121.45348186869998,
+    -121.862290530537,
+    -122.27804816074799,
+    -122.69994411135684,
+    -123.0915047775052,
+    -123.45442706287274,
+    -123.79263680594447,
+    -124.13123472585421,
+    -124.45213592988607,
+    -124.74617126454466,
+    -125.0278540086394,
+    -125.29358734568781,
+    -125.54033169290877,
+    -125.76170406531334,
+    -125.96135168453581,
+    -126.13790666889889,
+    -126.30030996019907,
+    -126.42267539390238,
+    -126.54180559686976,
+    -126.66051194018357,
+    -126.77464037366003,
+    -126.8705638741935,
+    -126.90679373361397,
+    -126.89756461388016,
+    -126.8813508429569,
+    -126.86597889523809,
+    -126.81720410067044,
+    -126.72725039001182,
+    -126.59168509622785,
+    -126.44591776192624,
+    -126.29972517945546,
+    -126.13502245609952,
+    -125.96381531901208,
+    -125.77247674508745,
+    -125.48079028391605,
+    -125.1915907559615,
+    -124.94669589139626,
+    -124.67006849257046,
+    -124.39628225153986,
+    -124.1211831181207,
+    -123.81916354462965,
+    -123.48105437757137,
+    -123.13418527088493,
+    -122.78638269896419,
+    -122.46191153039116,
+    -122.11008870092452,
+    -121.66769338804396,
+    -121.19799681942165,
+    -120.72414939623691,
+    -120.21441400009225,
+    -119.64624786866138,
+    -119.05366746029885,
+    -118.46316657839172,
+    -117.85526724597082,
+    -117.2272084971056,
+    -116.56006958852825,
+    -115.881737407879,
+    -115.1888937555261,
+    -114.48657893735701,
+    -113.76116593026612,
+    -113.00404281445935,
+    -112.25869902121309,
+    -111.47417286943544,
+    -110.69952612741558,
+    -109.95261547617069,
+    -109.19223082438138,
+    -108.42870619809734,
+    -107.64925042476494,
+    -106.82017606803207,
+    -105.96825554813653,
+    -105.14505818502334,
+    -104.33249908597661,
+    -103.50608517071552,
+    -102.67141397882888,
+    -101.81736603886685,
+    -100.92864262662,
+    -100.01390606703404,
+    -99.05339976628925,
+    -98.04464137530572,
+    -97.07430593720969,
+    -96.07889401263022,
+    -95.04617166271488,
+    -94.03662394662933,
+    -93.05696287136497,
+    -92.15374265355526,
+    -91.23532355191428,
+    -90.29337226349848,
+    -89.35103918948728,
+    -88.43091749735883,
+    -87.5104644247868,
+    -86.5311956357119,
+    -85.5569395915075,
+    -84.61530456296329,
+    -83.68124023609721,
+    -82.72245225881048,
+    -81.73478658091942,
+    -80.76173263370022,
+    -79.8194753970663,
+    -78.81665374658228,
+    -77.82406156488764,
+    -76.88240211475238,
+    -75.89892118748791,
+    -74.8580414420341,
+    -73.78291327957028,
+    -72.75380355565788,
+    -71.77129470657408,
+    -70.76937974129227,
+    -69.75449204995296,
+    -68.75145373483952,
+    -67.79149508579994,
+    -66.85235195735866,
+    -65.86411672257991,
+    -64.88838890803193,
+    -63.96280699112762,
+    -63.04003130983337,
+    -62.098633569225484,
+    -61.1734660782105,
+    -60.25396659903969,
+    -59.337374165782606,
+    -58.3835931545224,
+    -57.42329662140582,
+    -56.51056143803376,
+    -55.61894420617094,
+    -54.72005120962757,
+    -53.78465288166194,
+    -52.820018462966715,
+    -51.80639135972216,
+    -50.856915215865506,
+    -49.92257866825938,
+    -48.954370353766365,
+    -48.04509488622682,
+    -47.10840624451702,
+    -46.14460824806353,
+    -45.25096338031701,
+    -44.367036987263624,
+    -43.47335109193422,
+    -42.563522709339985,
+    -41.609715356992204,
+    -40.701111629673015,
+    -39.828542373887075,
+    -38.971972378963905,
+    -38.140621203550694,
+    -37.34510149054781,
+    -36.51550561301953,
+    -35.672476420489396,
+    -34.80210827300115,
+    -33.928387422286086,
+    -33.13380965871082,
+    -32.377164890955804,
+    -31.621143663610727,
+    -30.80391823840851,
+    -29.94250944581436,
+    -29.112726271779355,
+    -28.328246144560996,
+    -27.488234966802032,
+    -26.606370166759937,
+    -25.770719871814148,
+    -24.998026295579287,
+    -24.265189442027662,
+    -23.550502399385035,
+    -22.79631668214402,
+    -22.050300974340622,
+    -21.327525788485545,
+    -20.614642718323783,
+    -19.904990162015796,
+    -19.15317877548251,
+    -18.432788609869885,
+    -17.80040408843463,
+    -17.190296837000545,
+    -16.603606525546162,
+    -16.082150884244022,
+    -15.56911727813863,
+    -15.063137825552717,
+    -14.545291783218344,
+    -13.95653758137491,
+    -13.388008132758964,
+    -12.903253281893264,
+    -12.394473510154446,
+    -11.885376452423145,
+    -11.401898678385164,
+    -10.911188602240449,
+    -10.49295584584914,
+    -10.113512972859182,
+    -9.657259192829201,
+    -9.164897768529151,
+    -8.736198735065525,
+    -8.345833161605624,
+    -7.973487220628358,
+    -7.613892394547391,
+    -7.256486445614132,
+    -6.893493304586493,
+    -6.5873483485846585,
+    -6.296841486289205,
+    -5.974911672517185,
+    -5.701825762830048,
+    -5.4366522827589945,
+    -5.1927900437108665,
+    -4.970821481962836,
+    -4.762134677720906,
+    -4.603253640995314,
+    -4.5184432403680015,
+    -4.479031142798576,
+    -4.462753202811412,
+    -4.45765409840472,
+    -4.4618087141998934,
+    -4.525114669038177,
+    -4.585744224652463,
+    -4.612238879495894,
+    -4.645301896338447,
+    -4.6799433744444,
+    -4.69111299983172,
+    -4.704468725335559,
+    -4.779938376420303,
+    -4.869067823649828,
+    -4.966031315736489,
+    -5.107074245839924,
+    -5.257116093354937,
+    -5.42788396858444,
+    -5.632776682935277,
+    -5.8113595823936155,
+    -6.003500079177478,
+    -6.165480530311633,
+    -6.31097836405356,
+    -6.481532693725143,
+    -6.639834063915977,
+    -6.772812685221718,
+    -6.908076828432046,
+    -7.097474430342646,
+    -7.342423777782666,
+    -7.627347529691918,
+    -7.938061429263525,
+    -8.277098230729177,
+    -8.645876220917977,
+    -9.057236977535524,
+    -9.456039566730146,
+    -9.792158157961856,
+    -10.175392992960333,
+    -10.585708861055084,
+    -10.979109502420311,
+    -11.389889992261056,
+    -11.717216233220192,
+    -12.112123760922659,
+    -12.63565486823542,
+    -13.12038603049732,
+    -13.605627426225057,
+    -14.135982954097617,
+    -14.66550603633465,
+    -15.203137614732668,
+    -15.713518551835792,
+    -16.251004336095463,
+    -16.854626529177857,
+    -17.452527186192693,
+    -18.02104907741113,
+    -18.59588036229151,
+    -19.209365798084484,
+    -19.790483290451697,
+    -20.35095994969613,
+    -20.968833696574034,
+    -21.64719451901839,
+    -22.327279464119176,
+    -22.98097343253736,
+    -23.61666013236812,
+    -24.210125100181354,
+    -24.83801317248006,
+    -25.516230712326884,
+    -26.20050284304532,
+    -26.90172082438641,
+    -27.592605407562935,
+    -28.313302621643576,
+    -29.029010562873708,
+    -29.69573297142746,
+    -30.390950534359874,
+    -31.14199290560994,
+    -31.931053809312345,
+    -32.75397919528335,
+    -33.57568854291773,
+    -34.387012698720106,
+    -35.25261597461584,
+    -36.117078819902666,
+    -37.01608939403894,
+    -37.965832676937836,
+    -38.904759547183126,
+    -39.818685747967756,
+    -40.727975511964694,
+    -41.64352009892493,
+    -42.5355327084055,
+    -43.43468639655314,
+    -44.31286606402872,
+    -45.22665613408889,
+    -46.23877060070448,
+    -47.27595843473193,
+    -48.3209705940074,
+    -49.36185175652901,
+    -50.357949064678664,
+    -51.37002619447265,
+    -52.37526176673409,
+    -53.28118018962504,
+    -54.210398080004836,
+    -55.13062108577467,
+    -55.98420072142713,
+    -56.88483786460081,
+    -57.81389038887865,
+    -58.81066847277728,
+    -59.85597275617818,
+    -60.86317860110696,
+    -61.812808030594454,
+    -62.6968063585479,
+    -63.55114036127629,
+    -64.44158881810753,
+    -65.40161095369483,
+    -66.33928840990154,
+    -67.2070029078434,
+    -68.10814650168537,
+    -68.98924995867966,
+    -69.88377250347949,
+    -70.83687526846508,
+    -71.77809339299941,
+    -72.71859675368414,
+    -73.65144513182909,
+    -74.570534159296,
+    -75.47087393534922,
+    -76.3845306003886,
+    -77.27447331585458,
+    -78.12540335753755,
+    -79.01591587989509,
+    -79.95578767527562,
+    -80.87260356508759,
+    -81.69729177294721,
+    -82.52822924970776,
+    -83.38717331229535,
+    -84.16883199374244,
+    -84.90610728500091,
+    -85.6483395712108,
+    -86.41923648725266,
+    -87.2129722818389,
+    -88.0368161956622,
+    -88.859031110325,
+    -89.65205916018952,
+    -90.48836592899907,
+    -91.36156843176478,
+    -92.18197724515518,
+    -93.00339062392038,
+    -93.8197041999223,
+    -94.62509222187323,
+    -95.41345032163497,
+    -96.13911053827773,
+    -96.78649553074139,
+    -97.31160903920012,
+    -97.85044128934412,
+    -98.48325913673477,
+    -99.13235368261832,
+    -99.8325772359011,
+    -100.55247129503637,
+    -101.20485398834845,
+    -101.88559471503473,
+    -102.53286573682819,
+    -103.21021689825155,
+    -103.93076839386104,
+    -104.51873819347615,
+    -105.05049251674927,
+    -105.57760068362545,
+    -106.1346363861605,
+    -106.58510257011464,
+    -106.90171998670081,
+    -107.29264062592596,
+    -107.71080344260717,
+    -108.09883856808767,
+    -108.4759957676378,
+    -108.89997393191685,
+    -109.33708562457272,
+    -109.80045104016165,
+    -110.23855126389037,
+    -110.57924973401798,
+    -110.94934232016348,
+    -111.28226479759883,
+    -111.59392352938664,
+    -111.95929165092608,
+    -112.27307719524964,
+    -112.56149534889374,
+    -112.8889318069331,
+    -113.19355883110062,
+    -113.47623747452415,
+    -113.75900367098048,
+    -114.04048953879233,
+    -114.33130772086008,
+    -114.64374256118796,
+    -114.92627514498275,
+    -115.11986390248383,
+    -115.27886432214267,
+    -115.42001861757387,
+    -115.56675580680742,
+    -115.73442501920464,
+    -115.84782490766757,
+    -115.97858520538763,
+    -116.15459280000516,
+    -116.34355333942135,
+    -116.46330005527213,
+    -116.48265306286125,
+    -116.57633033011847,
+    -116.73181930134069,
+    -116.80621473472348,
+    -116.79536258008304,
+    -116.73049312726745,
+    -116.59881520372299,
+    -116.48143151556296,
+    -116.38561130348003,
+    -116.23253120131785,
+    -116.10747316794946,
+    -116.07788768380652,
+    -116.02705949104522,
+    -115.86446331578207,
+    -115.67928175279913,
+    -115.54565208694358,
+    -115.3922736070265,
+    -115.1896381294555,
+    -114.98820050677308,
+    -114.75288021837402,
+    -114.4452533414453,
+    -114.21858434641712,
+    -114.02664803865844,
+    -113.76861032081206,
+    -113.51080720590714,
+    -113.26022931778571,
+    -113.03138993525724,
+    -112.81456267112495,
+    -112.59612050228333,
+    -112.32287281283523,
+    -112.05697636305018,
+    -111.7945557195951,
+    -111.53953672095491,
+    -111.19637898993457,
+    -110.78321782440192,
+    -110.36694647108742,
+    -109.81803329701754,
+    -109.20560048372784,
+    -108.68096218369395,
+    -108.26253231163435,
+    -107.81548551441323,
+    -107.3515489023335,
+    -106.89443011027585,
+    -106.42632286237503,
+    -106.06928654178895,
+    -105.67345048544706,
+    -105.14828941946598,
+    -104.62533569992561,
+    -104.01657160459831,
+    -103.37635262193558,
+    -102.80723495555038,
+    -102.19974738571548,
+    -101.52688928049437,
+    -100.91044140619435,
+    -100.3607377888652,
+    -99.81372175543467,
+    -99.29087200597831,
+    -98.79806469693558,
+    -98.27848719335091,
+    -97.72909991244316,
+    -97.13181796149642,
+    -96.41004690915948,
+    -95.60086799914389,
+    -94.80349403285486,
+    -94.10571452082117,
+    -93.42731301263323,
+    -92.70395421836822,
+    -91.98219235465963,
+    -91.1344461064883,
+    -90.32596046886212,
+    -89.68464577880263,
+    -88.89875498301502,
+    -88.02738005641179,
+    -87.30709190776561,
+    -86.57938275163602,
+    -85.85012874446225,
+    -85.11601168661274,
+    -84.31771139147594,
+    -83.50512547789336,
+    -82.73121635006297,
+    -81.96173933793177,
+    -81.17247997806935,
+    -80.3913251581163,
+    -79.55895469146124,
+    -78.72749513175033,
+    -77.86214457522932,
+    -76.91333442505912,
+    -76.01621905637838,
+    -75.24354266978075,
+    -74.48945606459773,
+    -73.73308817960664,
+    -72.96331954335791,
+    -72.21249491310189,
+    -71.49317724969372,
+    -70.77836592119672,
+    -70.07031506499185,
+    -69.28240004310497,
+    -68.41548190866364,
+    -67.54369794651537,
+    -66.6835117534238,
+    -65.86671085293855,
+    -65.03007442253906,
+    -64.17502074905472,
+    -63.33500905713862,
+    -62.527896027807714,
+    -61.81277363597475,
+    -61.08017066191227,
+    -60.39057216478618,
+    -59.68967306129657,
+    -58.90394370544957,
+    -58.06907225670327,
+    -57.27089790763224,
+    -56.55541764116836,
+    -55.817339490344374,
+    -55.10823277510521,
+    -54.40053962981287,
+    -53.72298279265989,
+    -53.00091815024931,
+    -52.315727025545364,
+    -51.72789447771348,
+    -51.101759303066146,
+    -50.43734670417904,
+    -49.709606367070364,
+    -49.058707770189834,
+    -48.39663319130975,
+    -47.62561331843022,
+    -46.83510936318361,
+    -46.033783650516085,
+    -45.279056454235956,
+    -44.53473278633568,
+    -43.79972338198833,
+    -43.05343579682243,
+    -42.25772472487537,
+    -41.56167538381789,
+    -40.844393263046285,
+    -40.0930871900067,
+    -39.43093101525996,
+    -38.75541894034474,
+    -38.09666678770674,
+    -37.54190683417326,
+    -36.97470243875115,
+    -36.357186912328565,
+    -35.72727734916921,
+    -35.119547441328656,
+    -34.6566138056664,
+    -34.26299647823371,
+    -33.81167137771275,
+    -33.33526187820494,
+    -32.859147315694635,
+    -32.39895543639396,
+    -31.932422094827174,
+    -31.48827002918667,
+    -31.066803058898856,
+    -30.605078978294234,
+    -30.16692624874613,
+    -29.823695986595247,
+    -29.499072377341214,
+    -29.20924040089713,
+    -28.930264210683642,
+    -28.612296593011276,
+    -28.37071012662268,
+    -28.191599171561485,
+    -28.020658644528087,
+    -27.848440775176424,
+    -27.728743818256778,
+    -27.568534948229914,
+    -27.337191514100873,
+    -27.071794759581305,
+    -26.781564243318282,
+    -26.536457997399463,
+    -26.277991685765425,
+    -25.962726282291673,
+    -25.67872991435759,
+    -25.485930407427627,
+    -25.270677289014856,
+    -25.055842343448074,
+    -24.942588690086925,
+    -24.884969751151058,
+    -24.8621144654181,
+    -24.811080627218413,
+    -24.808234456204357,
+    -24.792305447810165,
+    -24.750781046332772,
+    -24.820208711163676,
+    -24.81199003699275,
+    -24.745374789090377,
+    -24.728212891231692,
+    -24.719851485798586,
+    -24.664592405238153,
+    -24.62375655926801,
+    -24.597926384165348,
+    -24.635327797667504,
+    -24.723169627220777,
+    -24.70517302218975,
+    -24.765250306575425,
+    -24.871107128278968,
+    -24.914108118125153,
+    -24.99402331122046,
+    -25.089981646342473,
+    -25.14015538522415,
+    -25.171316948103215,
+    -25.247573413203728,
+    -25.39653305131534,
+    -25.633823608650086,
+    -25.921857012946834,
+    -26.24059805353518,
+    -26.57279768825116,
+    -26.78669534931596,
+    -26.944169180148545,
+    -27.156133889881097,
+    -27.35602525378567,
+    -27.53383826781491,
+    -27.823891456555238,
+    -28.191382916251975,
+    -28.607083080163545,
+    -29.130641156903497,
+    -29.63363998090095,
+    -30.114433053628023,
+    -30.620410442269975,
+    -31.108133120702348,
+    -31.55700864455331,
+    -32.011919529352596,
+    -32.47651299673432,
+    -32.91710161034664,
+    -33.454630285944816,
+    -33.9668114286722,
+    -34.388752514904475,
+    -34.81632294383918,
+    -35.23589569237074,
+    -35.72049357794365,
+    -36.26902733573142,
+    -36.818554760064245,
+    -37.40002752393969,
+    -37.948831720584074,
+    -38.4435390550739,
+    -38.95577926060041,
+    -39.41257992487089,
+    -39.8967154551026,
+    -40.474243247473936,
+    -41.03875686761495,
+    -41.62315830647736,
+    -42.19459597826128,
+    -42.711859791647136,
+    -43.27973488505316,
+    -43.92638676297011,
+    -44.587480135475374,
+    -45.27975721618326,
+    -45.999342571760764,
+    -46.761585331569385,
+    -47.48097532503703,
+    -48.10042130035783,
+    -48.74031093958571,
+    -49.40122667899809,
+    -50.070377346041035,
+    -50.702930830336975,
+    -51.243188964332816,
+    -51.740213516318015,
+    -52.32553684237228,
+    -52.92952993241061,
+    -53.532436192613304,
+    -54.188889728282284,
+    -54.85963076605288,
+    -55.51626558973508,
+    -56.13012186628868,
+    -56.736330521470535,
+    -57.41432256029034,
+    -58.16913828863534,
+    -58.904680095609386,
+    -59.58391714265287,
+    -60.253403646399,
+    -60.956071804423125,
+    -61.70364872702795,
+    -62.50396088860769,
+    -63.26258237936965,
+    -63.9541842684814,
+    -64.62810694108259,
+    -65.35375119555977,
+    -66.12556989747569,
+    -66.80790184314277,
+    -67.55206118503675,
+    -68.43524999336167,
+    -69.33350897215715,
+    -70.13597381744246,
+    -70.89393523231234,
+    -71.68515252067208,
+    -72.53500501850647,
+    -73.36689829446404,
+    -74.21847082595778,
+    -75.09086228296636,
+    -75.86930772560002,
+    -76.60119722104447,
+    -77.29463586054398,
+    -78.09397237530843,
+    -78.89642235002572,
+    -79.67777132126606,
+    -80.44500991287119,
+    -81.19036205559922,
+    -82.02390660803025,
+    -82.77487664329547,
+    -83.426023119231,
+    -84.1060922234101,
+    -84.7696946117539,
+    -85.3998598589488,
+    -85.99020498000615,
+    -86.50286328581402,
+    -87.04484884959587,
+    -87.68194045067939,
+    -88.34032982622003,
+    -88.99496666223553,
+    -89.6762453980221,
+    -90.37806166544162,
+    -90.96196809229964,
+    -91.48371325130117,
+    -91.98595072317039,
+    -92.44251572652291,
+    -92.89745492633622,
+    -93.42323390635383,
+    -93.9794784258081,
+    -94.44668705834874,
+    -94.93326696145229,
+    -95.46236853629794,
+    -95.90696770156808,
+    -96.2943941112016,
+    -96.72302471605188,
+    -97.12740975879336,
+    -97.53794367872231,
+    -98.04130151896477,
+    -98.48733399959966,
+    -98.83733858096323,
+    -99.18467711059725,
+    -99.4817313096175,
+    -99.74189998943073,
+    -100.05018649205942,
+    -100.40800910433255,
+    -100.71091170983463,
+    -100.93189367662903,
+    -101.2016515102438,
+    -101.54890794887105,
+    -101.89623271060775,
+    -102.29909575130802,
+    -102.7527857870867,
+    -103.18321593824854,
+    -103.53886729000011,
+    -103.83703928965748,
+    -104.17415857011916,
+    -104.4914621784754,
+    -104.79259733636033,
+    -105.12049624134913,
+    -105.38741978806476,
+    -105.64103666054329,
+    -105.85546069425082,
+    -106.0861618450413,
+    -106.32619989422466,
+    -106.44520735827531,
+    -106.52790896236499,
+    -106.59216138751083,
+    -106.71126606800813,
+    -106.97329113123628,
+    -107.21527092214451,
+    -107.56567301145556,
+    -107.96517721255817,
+    -108.21236874501268,
+    -108.42791390772379,
+    -108.54942772872322,
+    -108.68253119698088,
+    -108.81554760734575,
+    -108.96828395878937,
+    -109.19871775882167,
+    -109.3472267545995,
+    -109.48878408152203,
+    -109.52199840853075,
+    -109.52072840362221,
+    -109.67195117615454,
+    -109.84251307409572,
+    -109.81121752061036,
+    -109.64662946353276,
+    -109.55773674342191,
+    -109.48689087477038,
+    -109.48677564492579,
+    -109.57385465065211,
+    -109.64116422387784,
+    -109.66281820006911,
+    -109.66781793426874,
+    -109.60854514759252,
+    -109.54242011384903,
+    -109.47531898947778,
+    -109.35655871023738,
+    -109.28590931123436,
+    -109.27370481851844,
+    -109.16422361515548,
+    -109.03522500505122,
+    -109.0539043011678,
+    -109.04113607111714,
+    -108.96406872909915,
+    -108.90993455194129,
+    -108.90578457673192,
+    -108.85412810832162,
+    -108.72712866422185,
+    -108.6290141491494,
+    -108.46898067237024,
+    -108.23145089282421,
+    -108.01062250860484,
+    -107.8093068907946,
+    -107.66486389995563,
+    -107.54472056713854,
+    -107.49961036173639,
+    -107.3894142104512,
+    -107.17236478826221,
+    -107.01426432387863,
+    -106.89145558757158,
+    -106.77164422724226,
+    -106.52697031102102,
+    -106.23045665635235,
+    -105.94453864035665,
+    -105.62299106840273,
+    -105.3725493968633,
+    -105.24896219844304,
+    -105.07059648909795,
+    -104.81936737611204,
+    -104.66135570504512,
+    -104.5667746754542,
+    -104.34284662926946,
+    -104.05562896266953,
+    -103.72437144092466,
+    -103.32068034784518,
+    -102.98667547983534,
+    -102.64799134034922,
+    -102.22496871267845,
+    -101.85081165400686,
+    -101.52387366580642,
+    -101.1881779636737,
+    -100.96857009927305,
+    -100.86981176164134,
+    -100.80778586446006,
+    -100.6788721418654,
+    -100.52488832403,
+    -100.36006907291257,
+    -100.15769237342722,
+    -99.95651117038933,
+    -99.73147514981694,
+    -99.6118877329847,
+    -99.59136593490379,
+    -99.48381890191986,
+    -99.31351150261484,
+    -99.1570885734918,
+    -98.96108088180296,
+    -98.70461736632596,
+    -98.31361114736534,
+    -97.85829887385941,
+    -97.42201218672652,
+    -96.97747183717962,
+    -96.54253450623575,
+    -96.00048493605091,
+    -95.3956484084536,
+    -94.81692890137494,
+    -94.23370376382024,
+    -93.67664605193605,
+    -93.17921499037575,
+    -92.83588689408344,
+    -92.52409555135178,
+    -92.0318387414164,
+    -91.46585192065007,
+    -90.90779502886731,
+    -90.3560215675401,
+    -89.85429958479563,
+    -89.44277510970237,
+    -89.01476309103974,
+    -88.52793897008561,
+    -88.03303621623327,
+    -87.52395046134426,
+    -86.95779991299553,
+    -86.42293131541695,
+    -86.00016875787139,
+    -85.66919841283764,
+    -85.37850136552244,
+    -85.05009010032143,
+    -84.68343258610919,
+    -84.31951070250642,
+    -83.93410998608285,
+    -83.50218012285654,
+    -83.10565966949267,
+    -82.68216365402299,
+    -82.09213023685068,
+    -81.54984097869685,
+    -81.11828849038312,
+    -80.6517813615984,
+    -80.16176808579519,
+    -79.69452426275613,
+    -79.14503654236452,
+    -78.64845929975846,
+    -78.30818458910294,
+    -77.94035049154864,
+    -77.43660025477115,
+    -76.90701273735068,
+    -76.40064970757639,
+    -75.90611307714796,
+    -75.56803019412544,
+    -75.24043103134736,
+    -74.86232370109848,
+    -74.46298817527246,
+    -74.01486658823131,
+    -73.52132754475883,
+    -73.02753217723519,
+    -72.57696991693666,
+    -72.17969617306255,
+    -71.74434982117734,
+    -71.28154350418158,
+    -70.78907348984588,
+    -70.22740138795484,
+    -69.6210706839409,
+    -69.00939155632096,
+    -68.51052275234382,
+    -68.08325418069023,
+    -67.60474101280202,
+    -67.11150725868939,
+    -66.58936866154556,
+    -66.04643031261494,
+    -65.44900477554573,
+    -64.80436129103036,
+    -64.17214906768281,
+    -63.60365880859725,
+    -63.15547493703056,
+    -62.810069793967884,
+    -62.44348408344871,
+    -62.04404110032179,
+    -61.630990609857434,
+    -61.1764961295673,
+    -60.88230146189343,
+    -60.65871718350447,
+    -60.34277763934948,
+    -59.906924963790736,
+    -59.40551464527959,
+    -59.029145812232606,
+    -58.66834724492252,
+    -58.35239891524286,
+    -58.047892003692304,
+    -57.671266657653476,
+    -57.38275276882272,
+    -57.007125540720736,
+    -56.506518284235945,
+    -56.10162074765424,
+    -55.774348038259795,
+    -55.435289349571676,
+    -55.10397306371095,
+    -54.74894067913075,
+    -54.422597366327956,
+    -54.16982564083232,
+    -53.832953567755126,
+    -53.50840777999522,
+    -53.28927150824351,
+    -53.0710886360845,
+    -52.84942649648371,
+    -52.708173964060975,
+    -52.597483825126886,
+    -52.51933160021191,
+    -52.54311808770228,
+    -52.53429655131285,
+    -52.593194259851366,
+    -52.72122950014702,
+    -52.85963931928978,
+    -53.054699317062514,
+    -53.1877439176667,
+    -53.17354156738123,
+    -53.1625705681298,
+    -53.204728538753564,
+    -53.21311222442755,
+    -53.1406605799688,
+    -52.99854348197897,
+    -52.87956554429849,
+    -52.87374521226125,
+    -53.0003322511376,
+    -53.08410186444842,
+    -53.1172779829515,
+    -53.2667773027586,
+    -53.39805308758451,
+    -53.5835709211726,
+    -53.870442253857696,
+    -54.19377456201553,
+    -54.605415782441945,
+    -54.95911727112461,
+    -55.30004016044387,
+    -55.65300655268286,
+    -55.963154130840714,
+    -56.238866603012575,
+    -56.628114719466375,
+    -56.976848564371934,
+    -57.10538547163966,
+    -57.24500262988012,
+    -57.466772538583356,
+    -57.78632294396144,
+    -58.126223564111136,
+    -58.413780603590375,
+    -58.80002959802404,
+    -59.256298214371824,
+    -59.63383025696558,
+    -60.10901539483896,
+    -60.6963669068015,
+    -61.20923670549736,
+    -61.636783936327554,
+    -61.99380049495196,
+    -62.3591601526789,
+    -62.88807769789287,
+    -63.47721148158102,
+    -64.10680490992331,
+    -64.72923970403576,
+    -65.26513526406056,
+    -65.80033078257202,
+    -66.38639557951531,
+    -66.98741328373309,
+    -67.47357364540134,
+    -67.96414987917143,
+    -68.46641122573621,
+    -68.89484751452368,
+    -69.34867154693919,
+    -69.79893237309153,
+    -70.29747792977649,
+    -70.90757944466624,
+    -71.53313930686434,
+    -72.13099710709707,
+    -72.73656238797193,
+    -73.24315009826836,
+    -73.82770714072105,
+    -74.56966452033969,
+    -75.31469370444312,
+    -76.05947649339979,
+    -76.71404484702735,
+    -77.27647364994733,
+    -77.87160845382425,
+    -78.61537907110176,
+    -79.4097375729293,
+    -80.17781091110476,
+    -80.90708652992534,
+    -81.63213812144653,
+    -82.41790861444461,
+    -83.21482941208056,
+    -84.0101093418008,
+    -84.86785548182952,
+    -85.7245683927955,
+    -86.49891715688688,
+    -87.17003071288102,
+    -87.79895135364508,
+    -88.44059180133164,
+    -89.05569228257605,
+    -89.57936027375392,
+    -90.08406135860882,
+    -90.66733663744189,
+    -91.33199748133558,
+    -92.04937155724959,
+    -92.66122969659375,
+    -93.17400528950903,
+    -93.70920048545194,
+    -94.32228524027677,
+    -95.02610113168885,
+    -95.65461771928044,
+    -96.31847109533294,
+    -97.0792607864148,
+    -97.8280728064999,
+    -98.57245501313164,
+    -99.25865955671176,
+    -99.95775893673014,
+    -100.72995959550211,
+    -101.40923109261946,
+    -101.95297025250976,
+    -102.47738550446732,
+    -102.89306604201148,
+    -103.434075222259,
+    -104.0887363400588,
+    -104.61384208737472,
+    -105.08826623551462,
+    -105.52512897903492,
+    -106.04648970109345,
+    -106.56154451095637,
+    -107.08090605152387,
+    -107.64973545517636,
+    -108.07163304478553,
+    -108.59180685149425,
+    -109.26934885021474,
+    -109.97528464167486,
+    -110.76619864913137,
+    -111.60784620253071,
+    -112.29574773607631,
+    -112.7078942717618,
+    -113.21737897517562,
+    -113.82617736684799,
+    -114.39612069143564,
+    -115.03199408735641,
+    -115.68840821053145,
+    -116.28291767574581,
+    -116.81164704966648,
+    -117.22029124899389,
+    -117.70223557065074,
+    -118.31322858734198,
+    -118.78303715651853,
+    -119.16685261718403,
+    -119.60568029834015,
+    -120.03379182581092,
+    -120.56683839518941,
+    -121.18506341265582,
+    -121.53799208267601,
+    -121.64069491776053,
+    -121.72667804132506,
+    -121.77924964490683,
+    -121.93690750585188,
+    -122.28994868634472,
+    -122.69184592552261,
+    -123.14262442596134,
+    -123.5615105035502,
+    -124.04409494063583,
+    -124.654763432293,
+    -125.15142313788806,
+    -125.52629798817868,
+    -125.84572399619425,
+    -126.08492946480322,
+    -126.40609460365646,
+    -126.87583404263364,
+    -127.34399850181374,
+    -127.67687709546333,
+    -127.99541473933795,
+    -128.36873361497328,
+    -128.74949406033562,
+    -129.10595895702758,
+    -129.45459190181296,
+    -129.75585450447633,
+    -130.0295537639892,
+    -130.35400621795864,
+    -130.75124780016128,
+    -131.15917215547952,
+    -131.3719066338632,
+    -131.5778214289237,
+    -131.92070803816927,
+    -132.20918188778333,
+    -132.41707819638123,
+    -132.52519760384448,
+    -132.6112994140787,
+    -132.71887305836017,
+    -132.75237815949404,
+    -132.92442457709757,
+    -133.2381022991037,
+    -133.43460147384013,
+    -133.58360151654364,
+    -133.71549686651048,
+    -133.72750310842886,
+    -133.6881851901331,
+    -133.79677936240967,
+    -133.75296186284015,
+    -133.5288962089361,
+    -133.53668192537592,
+    -133.55456520162284,
+    -133.4716817336965,
+    -133.42207142933262,
+    -133.40548087425643,
+    -133.30630927802656,
+    -133.14102023740693,
+    -132.9444660613039,
+    -132.7888337166103,
+    -132.66634713408394,
+    -132.5544635513986,
+    -132.5362359926221,
+    -132.46012209358,
+    -132.39803020431435,
+    -132.32128799178474,
+    -132.1438280517181,
+    -132.09469863791975,
+    -131.97945039121598,
+    -131.7557587528849,
+    -131.65685122949142,
+    -131.52505588614696,
+    -131.47658115214603,
+    -131.54265731733662,
+    -131.54471618303185,
+    -131.39919789661437,
+    -131.1476415714061,
+    -130.93356008806464,
+    -130.7307886652053,
+    -130.64355520754495,
+    -130.59637975113492,
+    -130.4090223961844,
+    -130.23084697721458,
+    -130.03039499267857,
+    -129.80852749570414,
+    -129.67170132581333,
+    -129.4134865992548,
+    -129.10077656275897,
+    -128.834455718835,
+    -128.61761405541577,
+    -128.47173027257685,
+    -128.35420119474563,
+    -128.30405838358814,
+    -128.3433377728812,
+    -128.37789206968304,
+    -128.3617746962133,
+    -128.3248228580668,
+    -128.15645086811375,
+    -127.95280674240229,
+    -127.72840375974181,
+    -127.48131680475373,
+    -127.21017799576073,
+    -127.06267946618007,
+    -127.10710754699542,
+    -127.09106057409923,
+    -126.94630262165957,
+    -126.8040874289058,
+    -126.75248312321723,
+    -126.71238772158698,
+    -126.68187610863633,
+    -126.65484391622715,
+    -126.59593200690348,
+    -126.45417869957339,
+    -126.31820935531759,
+    -126.16492397810859,
+    -126.07542527405964,
+    -126.07760013081115,
+    -126.05501190736973,
+    -125.97146561572758,
+    -125.90304885868649,
+    -126.07351616988953,
+    -126.29594084513037,
+    -126.35386279403463,
+    -126.3208620677482,
+    -126.26048851079378,
+    -126.14295532272845,
+    -126.0125877853805,
+    -125.8903073651241,
+    -125.82545444709923,
+    -125.72778237427308,
+    -125.5688974304559,
+    -125.48116782227952,
+    -125.3077574654072,
+    -124.93640897160539,
+    -124.63545557062021,
+    -124.3806827990215,
+    -123.98655703685621,
+    -123.71110269039674,
+    -123.42088749076038,
+    -123.17695373081419,
+    -123.08185761417106,
+    -122.91691011565133,
+    -122.80277753415977,
+    -122.81471162194617,
+    -122.76885046016143,
+    -122.60448077794102,
+    -122.5091369183443,
+    -122.4881378041094,
+    -122.360129068043,
+    -122.18782470411588,
+    -122.14120619379685,
+    -121.99851972654916,
+    -121.72858541767658,
+    -121.41027703848731,
+    -121.0870840202577,
+    -120.89471797182738,
+    -120.71952842070937,
+    -120.68468921746435,
+    -120.78409599395405,
+    -120.7692477219799,
+    -120.4938957575296,
+    -120.31553072255551,
+    -120.35899816872197,
+    -120.33929826039609,
+    -120.31440850508773,
+    -120.22277978138047,
+    -120.08171153659016,
+    -119.9842870014078,
+    -119.81239783373626,
+    -119.60368251098834,
+    -119.54288920771702,
+    -119.45451451059246,
+    -119.45922471851938,
+    -119.64285902407217,
+    -119.68224708307953,
+    -119.58995185639643,
+    -119.54709949951737,
+    -119.5637454216415,
+    -119.54351339502185,
+    -119.49813052996141,
+    -119.52987441322246,
+    -119.47410768865021,
+    -119.37905627398206,
+    -119.40634314516747,
+    -119.61199549176176,
+    -119.82106713413651,
+    -119.90263335506476,
+    -120.12614185169528,
+    -120.33698547449656,
+    -120.29502170078935,
+    -120.28390768710518,
+    -120.16686776235375,
+    -119.96538062661055,
+    -119.92799771322599,
+    -119.8911961334479,
+    -119.97397048507726,
+    -120.14681258452164,
+    -120.28297696731397,
+    -120.38694670564045
+  ]
+}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/einstein_helfand_ionic_conductivity.json b/CI/integration_tests/calculators/data/einstein_helfand_ionic_conductivity.json
new file mode 100644
index 00000000..dcecdbdd
--- /dev/null
+++ b/CI/integration_tests/calculators/data/einstein_helfand_ionic_conductivity.json
@@ -0,0 +1,1 @@
+{"x": [1847985.6839540186], "uncertainty": [153550.66782329167]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/einstein_helfand_thermal_kinaci.json b/CI/integration_tests/calculators/data/einstein_helfand_thermal_kinaci.json
new file mode 100644
index 00000000..6571ab9e
--- /dev/null
+++ b/CI/integration_tests/calculators/data/einstein_helfand_thermal_kinaci.json
@@ -0,0 +1,1 @@
+{"x": [1.0, 2.0], "y": [2.412625438618138, 0.679260779765575], "uncertainty": [0.01451453705244969, 0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_distinct_diffusion_coefficients.json b/CI/integration_tests/calculators/data/green_kubo_distinct_diffusion_coefficients.json
new file mode 100644
index 00000000..5870fa43
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_distinct_diffusion_coefficients.json
@@ -0,0 +1,1 @@
+{"x": [2147684.0253798524], "uncertainty": [0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_ionic_conductivity.json b/CI/integration_tests/calculators/data/green_kubo_ionic_conductivity.json
new file mode 100644
index 00000000..5870fa43
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_ionic_conductivity.json
@@ -0,0 +1,1 @@
+{"x": [2147684.0253798524], "uncertainty": [0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_self_diffusion.json b/CI/integration_tests/calculators/data/green_kubo_self_diffusion.json
new file mode 100644
index 00000000..b256a4d1
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_self_diffusion.json
@@ -0,0 +1,1 @@
+{"x": [3.5533796363266394e-05], "uncertainty": [0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_thermal_conductivity.json b/CI/integration_tests/calculators/data/green_kubo_thermal_conductivity.json
new file mode 100644
index 00000000..1cb02578
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_thermal_conductivity.json
@@ -0,0 +1,1 @@
+{"x": [1.780223204577946e-05], "uncertainty": [1.7053935949942446e-07]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_viscosity.json b/CI/integration_tests/calculators/data/green_kubo_viscosity.json
new file mode 100644
index 00000000..1cb02578
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_viscosity.json
@@ -0,0 +1,1 @@
+{"x": [1.780223204577946e-05], "uncertainty": [1.7053935949942446e-07]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/green_kubo_viscosity_flux.json b/CI/integration_tests/calculators/data/green_kubo_viscosity_flux.json
new file mode 100644
index 00000000..d17bcb8a
--- /dev/null
+++ b/CI/integration_tests/calculators/data/green_kubo_viscosity_flux.json
@@ -0,0 +1,1006 @@
+{
+  "x": [
+    0.0,
+    0.36168709000543686,
+    0.7233741800108737,
+    1.0850612700163107,
+    1.4467483600217474,
+    1.8084354500271842,
+    2.1701225400326214,
+    2.531809630038058,
+    2.893496720043495,
+    3.2551838100489316,
+    3.6168709000543684,
+    3.9785579900598056,
+    4.340245080065243,
+    4.7019321700706795,
+    5.063619260076116,
+    5.425306350081553,
+    5.78699344008699,
+    6.1486805300924265,
+    6.510367620097863,
+    6.8720547101033,
+    7.233741800108737,
+    7.595428890114174,
+    7.957115980119611,
+    8.318803070125048,
+    8.680490160130486,
+    9.042177250135921,
+    9.403864340141359,
+    9.765551430146795,
+    10.127238520152233,
+    10.488925610157668,
+    10.850612700163106,
+    11.212299790168542,
+    11.57398688017398,
+    11.935673970179417,
+    12.297361060184853,
+    12.65904815019029,
+    13.020735240195727,
+    13.382422330201164,
+    13.7441094202066,
+    14.105796510212038,
+    14.467483600217474,
+    14.829170690222911,
+    15.190857780228349,
+    15.552544870233785,
+    15.914231960239222,
+    16.27591905024466,
+    16.637606140250096,
+    16.99929323025553,
+    17.36098032026097,
+    17.722667410266407,
+    18.084354500271843,
+    18.44604159027728,
+    18.807728680282718,
+    19.169415770288154,
+    19.53110286029359,
+    19.892789950299026,
+    20.254477040304465,
+    20.6161641303099,
+    20.977851220315337,
+    21.339538310320776,
+    21.701225400326212,
+    22.062912490331648,
+    22.424599580337084,
+    22.786286670342523,
+    23.14797376034796,
+    23.509660850353395,
+    23.871347940358834,
+    24.23303503036427,
+    24.594722120369706,
+    24.956409210375142,
+    25.31809630038058,
+    25.679783390386017,
+    26.041470480391453,
+    26.403157570396893,
+    26.76484466040233,
+    27.126531750407764,
+    27.4882188404132,
+    27.84990593041864,
+    28.211593020424075,
+    28.57328011042951,
+    28.934967200434947,
+    29.296654290440387,
+    29.658341380445822,
+    30.02002847045126,
+    30.381715560456698,
+    30.743402650462134,
+    31.10508974046757,
+    31.466776830473005,
+    31.828463920478445,
+    32.19015101048388,
+    32.55183810048932,
+    32.91352519049475,
+    33.27521228050019,
+    33.63689937050563,
+    33.99858646051106,
+    34.3602735505165,
+    34.72196064052194,
+    35.083647730527375,
+    35.445334820532814,
+    35.807021910538246,
+    36.168709000543686,
+    36.530396090549125,
+    36.89208318055456,
+    37.25377027056,
+    37.615457360565436,
+    37.97714445057087,
+    38.33883154057631,
+    38.70051863058175,
+    39.06220572058718,
+    39.42389281059262,
+    39.78557990059805,
+    40.14726699060349,
+    40.50895408060893,
+    40.87064117061436,
+    41.2323282606198,
+    41.59401535062524,
+    41.955702440630674,
+    42.31738953063611,
+    42.67907662064155,
+    43.040763710646985,
+    43.402450800652424,
+    43.764137890657864,
+    44.125824980663296,
+    44.487512070668735,
+    44.84919916067417,
+    45.21088625067961,
+    45.57257334068505,
+    45.93426043069048,
+    46.29594752069592,
+    46.65763461070136,
+    47.01932170070679,
+    47.38100879071223,
+    47.74269588071767,
+    48.1043829707231,
+    48.46607006072854,
+    48.82775715073397,
+    49.18944424073941,
+    49.55113133074485,
+    49.912818420750284,
+    50.27450551075572,
+    50.63619260076116,
+    50.997879690766595,
+    51.359566780772035,
+    51.721253870777474,
+    52.082940960782906,
+    52.444628050788346,
+    52.806315140793785,
+    53.16800223079922,
+    53.52968932080466,
+    53.89137641081009,
+    54.25306350081553,
+    54.61475059082097,
+    54.9764376808264,
+    55.33812477083184,
+    55.69981186083728,
+    56.06149895084271,
+    56.42318604084815,
+    56.78487313085359,
+    57.14656022085902,
+    57.50824731086446,
+    57.869934400869894,
+    58.231621490875334,
+    58.59330858088077,
+    58.954995670886206,
+    59.316682760891645,
+    59.678369850897084,
+    60.04005694090252,
+    60.401744030907956,
+    60.763431120913395,
+    61.12511821091883,
+    61.48680530092427,
+    61.84849239092971,
+    62.21017948093514,
+    62.57186657094058,
+    62.93355366094601,
+    63.29524075095145,
+    63.65692784095689,
+    64.01861493096233,
+    64.38030202096776,
+    64.7419891109732,
+    65.10367620097864,
+    65.46536329098407,
+    65.8270503809895,
+    66.18873747099495,
+    66.55042456100038,
+    66.91211165100582,
+    67.27379874101126,
+    67.6354858310167,
+    67.99717292102213,
+    68.35886001102757,
+    68.720547101033,
+    69.08223419103844,
+    69.44392128104388,
+    69.80560837104932,
+    70.16729546105475,
+    70.52898255106018,
+    70.89066964106563,
+    71.25235673107106,
+    71.61404382107649,
+    71.97573091108194,
+    72.33741800108737,
+    72.6991050910928,
+    73.06079218109825,
+    73.42247927110368,
+    73.78416636110911,
+    74.14585345111456,
+    74.50754054112,
+    74.86922763112543,
+    75.23091472113087,
+    75.5926018111363,
+    75.95428890114174,
+    76.31597599114718,
+    76.67766308115262,
+    77.03935017115805,
+    77.4010372611635,
+    77.76272435116893,
+    78.12441144117436,
+    78.4860985311798,
+    78.84778562118524,
+    79.20947271119067,
+    79.5711598011961,
+    79.93284689120155,
+    80.29453398120698,
+    80.65622107121241,
+    81.01790816121786,
+    81.3795952512233,
+    81.74128234122873,
+    82.10296943123417,
+    82.4646565212396,
+    82.82634361124504,
+    83.18803070125048,
+    83.54971779125592,
+    83.91140488126135,
+    84.2730919712668,
+    84.63477906127223,
+    84.99646615127766,
+    85.3581532412831,
+    85.71984033128854,
+    86.08152742129397,
+    86.44321451129942,
+    86.80490160130485,
+    87.16658869131028,
+    87.52827578131573,
+    87.88996287132116,
+    88.25164996132659,
+    88.61333705133202,
+    88.97502414133747,
+    89.3367112313429,
+    89.69839832134834,
+    90.06008541135378,
+    90.42177250135921,
+    90.78345959136465,
+    91.1451466813701,
+    91.50683377137553,
+    91.86852086138096,
+    92.2302079513864,
+    92.59189504139184,
+    92.95358213139727,
+    93.31526922140272,
+    93.67695631140815,
+    94.03864340141358,
+    94.40033049141903,
+    94.76201758142446,
+    95.12370467142989,
+    95.48539176143534,
+    95.84707885144077,
+    96.2087659414462,
+    96.57045303145165,
+    96.93214012145708,
+    97.29382721146251,
+    97.65551430146795,
+    98.01720139147339,
+    98.37888848147882,
+    98.74057557148426,
+    99.1022626614897,
+    99.46394975149514,
+    99.82563684150057,
+    100.18732393150601,
+    100.54901102151145,
+    100.91069811151688,
+    101.27238520152233,
+    101.63407229152776,
+    101.99575938153319,
+    102.35744647153864,
+    102.71913356154407,
+    103.0808206515495,
+    103.44250774155495,
+    103.80419483156038,
+    104.16588192156581,
+    104.52756901157126,
+    104.88925610157669,
+    105.25094319158212,
+    105.61263028158757,
+    105.974317371593,
+    106.33600446159844,
+    106.69769155160387,
+    107.05937864160931,
+    107.42106573161475,
+    107.78275282162018,
+    108.14443991162562,
+    108.50612700163106,
+    108.86781409163649,
+    109.22950118164194,
+    109.59118827164737,
+    109.9528753616528,
+    110.31456245165825,
+    110.67624954166368,
+    111.03793663166911,
+    111.39962372167456,
+    111.76131081167999,
+    112.12299790168542,
+    112.48468499169087,
+    112.8463720816963,
+    113.20805917170173,
+    113.56974626170718,
+    113.93143335171261,
+    114.29312044171805,
+    114.65480753172349,
+    115.01649462172892,
+    115.37818171173436,
+    115.73986880173979,
+    116.10155589174524,
+    116.46324298175067,
+    116.8249300717561,
+    117.18661716176155,
+    117.54830425176698,
+    117.90999134177241,
+    118.27167843177786,
+    118.63336552178329,
+    118.99505261178872,
+    119.35673970179417,
+    119.7184267917996,
+    120.08011388180503,
+    120.44180097181048,
+    120.80348806181591,
+    121.16517515182134,
+    121.52686224182679,
+    121.88854933183222,
+    122.25023642183766,
+    122.6119235118431,
+    122.97361060184853,
+    123.33529769185397,
+    123.69698478185941,
+    124.05867187186485,
+    124.42035896187028,
+    124.78204605187572,
+    125.14373314188116,
+    125.50542023188659,
+    125.86710732189202,
+    126.22879441189747,
+    126.5904815019029,
+    126.95216859190833,
+    127.31385568191378,
+    127.67554277191921,
+    128.03722986192466,
+    128.3989169519301,
+    128.76060404193552,
+    129.12229113194095,
+    129.4839782219464,
+    129.84566531195182,
+    130.20735240195728,
+    130.5690394919627,
+    130.93072658196814,
+    131.29241367197358,
+    131.654100761979,
+    132.01578785198444,
+    132.3774749419899,
+    132.73916203199533,
+    133.10084912200077,
+    133.4625362120062,
+    133.82422330201163,
+    134.18591039201706,
+    134.54759748202252,
+    134.90928457202796,
+    135.2709716620334,
+    135.63265875203882,
+    135.99434584204425,
+    136.3560329320497,
+    136.71772002205515,
+    137.07940711206058,
+    137.441094202066,
+    137.80278129207144,
+    138.16446838207688,
+    138.5261554720823,
+    138.88784256208777,
+    139.2495296520932,
+    139.61121674209863,
+    139.97290383210407,
+    140.3345909221095,
+    140.69627801211493,
+    141.05796510212036,
+    141.41965219212582,
+    141.78133928213126,
+    142.1430263721367,
+    142.50471346214212,
+    142.86640055214755,
+    143.22808764215299,
+    143.58977473215845,
+    143.95146182216388,
+    144.3131489121693,
+    144.67483600217474,
+    145.03652309218018,
+    145.3982101821856,
+    145.75989727219107,
+    146.1215843621965,
+    146.48327145220193,
+    146.84495854220737,
+    147.2066456322128,
+    147.56833272221823,
+    147.9300198122237,
+    148.29170690222912,
+    148.65339399223456,
+    149.01508108224,
+    149.37676817224542,
+    149.73845526225085,
+    150.10014235225628,
+    150.46182944226175,
+    150.82351653226718,
+    151.1852036222726,
+    151.54689071227804,
+    151.90857780228347,
+    152.2702648922889,
+    152.63195198229437,
+    152.9936390722998,
+    153.35532616230523,
+    153.71701325231066,
+    154.0787003423161,
+    154.44038743232153,
+    154.802074522327,
+    155.16376161233242,
+    155.52544870233785,
+    155.8871357923433,
+    156.24882288234872,
+    156.61050997235415,
+    156.9721970623596,
+    157.33388415236504,
+    157.69557124237048,
+    158.0572583323759,
+    158.41894542238134,
+    158.78063251238677,
+    159.1423196023922,
+    159.50400669239767,
+    159.8656937824031,
+    160.22738087240853,
+    160.58906796241396,
+    160.9507550524194,
+    161.31244214242483,
+    161.6741292324303,
+    162.03581632243572,
+    162.39750341244115,
+    162.7591905024466,
+    163.12087759245202,
+    163.48256468245745,
+    163.8442517724629,
+    164.20593886246834,
+    164.56762595247378,
+    164.9293130424792,
+    165.29100013248464,
+    165.65268722249007,
+    166.01437431249553,
+    166.37606140250097,
+    166.7377484925064,
+    167.09943558251183,
+    167.46112267251726,
+    167.8228097625227,
+    168.18449685252813,
+    168.5461839425336,
+    168.90787103253902,
+    169.26955812254445,
+    169.63124521254989,
+    169.99293230255532,
+    170.35461939256075,
+    170.7163064825662,
+    171.07799357257164,
+    171.43968066257708,
+    171.8013677525825,
+    172.16305484258794,
+    172.52474193259337,
+    172.88642902259883,
+    173.24811611260427,
+    173.6098032026097,
+    173.97149029261513,
+    174.33317738262056,
+    174.694864472626,
+    175.05655156263145,
+    175.4182386526369,
+    175.77992574264232,
+    176.14161283264775,
+    176.50329992265318,
+    176.86498701265862,
+    177.22667410266405,
+    177.5883611926695,
+    177.95004828267494,
+    178.31173537268037,
+    178.6734224626858,
+    179.03510955269124,
+    179.39679664269667,
+    179.75848373270213,
+    180.12017082270756,
+    180.481857912713
+  ],
+  "y": [
+    0.0,
+    0.0,
+    0.0,
+    0.001600652001798153,
+    0.004911334719508886,
+    0.0,
+    0.004230995662510395,
+    0.019939880818128586,
+    0.0,
+    0.0,
+    0.026268569752573967,
+    0.006430375389754772,
+    0.017550086602568626,
+    0.015569698065519333,
+    0.0316549688577652,
+    0.018162250518798828,
+    0.009670164436101913,
+    0.009187072515487671,
+    0.0,
+    0.007641773670911789,
+    0.01325667928904295,
+    0.00764016667380929,
+    0.028513770550489426,
+    0.018887978047132492,
+    0.015307798981666565,
+    0.025405725464224815,
+    0.009625556878745556,
+    0.003964812029153109,
+    0.005896343849599361,
+    0.017389927059412003,
+    0.02524435706436634,
+    0.007840334437787533,
+    0.0,
+    0.00676795793697238,
+    0.022161342203617096,
+    0.016289515420794487,
+    0.028475895524024963,
+    0.02352927438914776,
+    0.036618076264858246,
+    0.035155314952135086,
+    0.04017064720392227,
+    0.01959657110273838,
+    0.020483126863837242,
+    0.007546861656010151,
+    0.02622946910560131,
+    0.020914917811751366,
+    0.03573653846979141,
+    0.042329929769039154,
+    0.03329688310623169,
+    0.019966039806604385,
+    0.020650118589401245,
+    0.045961540192365646,
+    0.04224458709359169,
+    0.012897866778075695,
+    0.04196177423000336,
+    0.027578342705965042,
+    0.03493528813123703,
+    0.055824704468250275,
+    0.06959129869937897,
+    0.07317602634429932,
+    0.04560534656047821,
+    0.16357848048210144,
+    0.07747222483158112,
+    0.09462128579616547,
+    0.09173697233200073,
+    0.07362041622400284,
+    0.10652551054954529,
+    0.06820385903120041,
+    0.06500664353370667,
+    0.08241061121225357,
+    0.11479470133781433,
+    0.1298433095216751,
+    0.10551496595144272,
+    0.1183171346783638,
+    0.14942491054534912,
+    0.13288863003253937,
+    0.14425185322761536,
+    0.12581555545330048,
+    0.15664920210838318,
+    0.1250922977924347,
+    0.17793689668178558,
+    0.1668885350227356,
+    0.20713621377944946,
+    0.22333861887454987,
+    0.2245582491159439,
+    0.22485563158988953,
+    0.2863384783267975,
+    0.3020980954170227,
+    0.22532542049884796,
+    0.27114278078079224,
+    0.323876291513443,
+    0.35155248641967773,
+    0.38576361536979675,
+    0.3903842270374298,
+    0.39026936888694763,
+    0.4195598065853119,
+    0.435444176197052,
+    0.48172104358673096,
+    0.5379682183265686,
+    0.44770514965057373,
+    0.6840656399726868,
+    0.6599547266960144,
+    0.7200648188591003,
+    0.6920669078826904,
+    0.7714085578918457,
+    0.7808195948600769,
+    0.7762649655342102,
+    0.8813873529434204,
+    0.8174227476119995,
+    0.8860973119735718,
+    0.9416007399559021,
+    1.0320079326629639,
+    0.9720733761787415,
+    1.132299542427063,
+    1.1294605731964111,
+    1.1186838150024414,
+    1.1923608779907227,
+    1.4982922077178955,
+    1.500689148902893,
+    1.4947394132614136,
+    1.6287102699279785,
+    1.5883632898330688,
+    1.33858060836792,
+    1.5839955806732178,
+    1.5894725322723389,
+    1.6531301736831665,
+    1.7960256338119507,
+    1.713362216949463,
+    1.6641424894332886,
+    1.6755406856536865,
+    1.9401452541351318,
+    1.959455132484436,
+    1.9183993339538574,
+    1.9610607624053955,
+    2.0106618404388428,
+    1.9838013648986816,
+    2.195918083190918,
+    2.2333273887634277,
+    2.059236526489258,
+    2.1948933601379395,
+    2.069852590560913,
+    2.098423719406128,
+    2.2532835006713867,
+    2.2196643352508545,
+    2.2741754055023193,
+    2.1823856830596924,
+    2.2891571521759033,
+    2.221947193145752,
+    2.407322406768799,
+    2.4167423248291016,
+    2.3585736751556396,
+    2.4121861457824707,
+    2.046372413635254,
+    2.4809727668762207,
+    2.3292617797851562,
+    2.4741125106811523,
+    2.3687312602996826,
+    2.5027754306793213,
+    2.4825823307037354,
+    2.406984806060791,
+    2.644460678100586,
+    2.653965711593628,
+    2.4032692909240723,
+    2.75588059425354,
+    2.4196245670318604,
+    2.53798770904541,
+    2.53869366645813,
+    2.558218479156494,
+    2.5898284912109375,
+    2.5498709678649902,
+    2.9005494117736816,
+    2.512981414794922,
+    2.8111319541931152,
+    2.686844825744629,
+    2.6042773723602295,
+    2.457376480102539,
+    2.730653762817383,
+    2.6403307914733887,
+    2.5395054817199707,
+    2.650785446166992,
+    2.8626973628997803,
+    2.6564245223999023,
+    2.337247848510742,
+    2.623920440673828,
+    2.8925540447235107,
+    2.7612404823303223,
+    3.030447006225586,
+    2.6975481510162354,
+    2.8424010276794434,
+    2.565709114074707,
+    2.5626437664031982,
+    2.369471549987793,
+    2.5989081859588623,
+    2.4029719829559326,
+    2.6931118965148926,
+    2.537043571472168,
+    2.798220157623291,
+    2.733973979949951,
+    2.8670730590820312,
+    2.593240737915039,
+    2.726287603378296,
+    2.441145181655884,
+    2.4853997230529785,
+    2.5489566326141357,
+    2.58953857421875,
+    2.3570990562438965,
+    2.7839877605438232,
+    2.6664319038391113,
+    2.451073169708252,
+    2.4165842533111572,
+    2.8226873874664307,
+    2.483943462371826,
+    2.6459426879882812,
+    2.8194966316223145,
+    2.9925575256347656,
+    3.024606466293335,
+    2.5780186653137207,
+    2.562302589416504,
+    2.793253183364868,
+    2.7496180534362793,
+    2.724498748779297,
+    2.8197271823883057,
+    3.052762746810913,
+    2.605008125305176,
+    2.684688091278076,
+    2.6232948303222656,
+    2.8531594276428223,
+    2.8273138999938965,
+    2.579639434814453,
+    3.0180904865264893,
+    2.7427053451538086,
+    3.025895357131958,
+    2.9524099826812744,
+    2.6946358680725098,
+    2.793757915496826,
+    3.356538772583008,
+    2.54980731010437,
+    2.9806697368621826,
+    2.6238772869110107,
+    2.6267926692962646,
+    3.324321985244751,
+    2.6571552753448486,
+    2.872965097427368,
+    3.344036817550659,
+    2.6816329956054688,
+    2.555556535720825,
+    2.951611042022705,
+    2.9767303466796875,
+    2.6781740188598633,
+    2.818758010864258,
+    2.970280408859253,
+    3.3918988704681396,
+    3.01507306098938,
+    3.0470144748687744,
+    3.0206611156463623,
+    2.954531192779541,
+    2.601611375808716,
+    3.2214748859405518,
+    3.3886051177978516,
+    2.803828239440918,
+    2.8815054893493652,
+    3.0055510997772217,
+    2.4984209537506104,
+    3.889130115509033,
+    2.7673330307006836,
+    2.6920034885406494,
+    2.7047054767608643,
+    2.5410099029541016,
+    3.164426803588867,
+    3.2736544609069824,
+    2.695065498352051,
+    2.5002198219299316,
+    2.872870922088623,
+    3.1744089126586914,
+    2.839507818222046,
+    2.624886989593506,
+    2.685697555541992,
+    2.76230525970459,
+    2.767826795578003,
+    2.620154857635498,
+    2.4525625705718994,
+    2.8133208751678467,
+    2.6362667083740234,
+    2.836129665374756,
+    2.72979998588562,
+    2.5686488151550293,
+    2.417842149734497,
+    2.5148706436157227,
+    2.6384456157684326,
+    3.046665668487549,
+    2.8310537338256836,
+    2.6096303462982178,
+    2.4335412979125977,
+    2.646084785461426,
+    2.2185797691345215,
+    2.4838509559631348,
+    2.302177906036377,
+    2.9938859939575195,
+    2.5540778636932373,
+    2.4861669540405273,
+    2.5620198249816895,
+    2.782641887664795,
+    2.0414438247680664,
+    2.570307731628418,
+    2.3178162574768066,
+    2.7533011436462402,
+    3.034275770187378,
+    2.723923921585083,
+    2.352768659591675,
+    2.850294589996338,
+    2.6245357990264893,
+    2.6360621452331543,
+    2.48866868019104,
+    2.1644887924194336,
+    2.2553470134735107,
+    2.53904128074646,
+    2.399904251098633,
+    2.5830535888671875,
+    2.542200803756714,
+    2.614015579223633,
+    2.6811702251434326,
+    2.374035120010376,
+    2.3723156452178955,
+    2.2367701530456543,
+    2.2366604804992676,
+    2.115833044052124,
+    1.9436237812042236,
+    2.7350680828094482,
+    2.1679868698120117,
+    2.3525662422180176,
+    1.9444410800933838,
+    2.160470485687256,
+    2.1456854343414307,
+    2.168272018432617,
+    2.5189151763916016,
+    2.4282479286193848,
+    2.3726255893707275,
+    2.3538897037506104,
+    2.4501397609710693,
+    2.1067512035369873,
+    2.1688575744628906,
+    2.4801933765411377,
+    2.1075339317321777,
+    2.0033621788024902,
+    2.2113070487976074,
+    2.5495996475219727,
+    2.527372360229492,
+    2.107016086578369,
+    2.3226125240325928,
+    2.2363219261169434,
+    2.3472907543182373,
+    2.0882468223571777,
+    2.4700372219085693,
+    1.9459065198898315,
+    2.2644684314727783,
+    1.9148385524749756,
+    1.9975242614746094,
+    2.202174186706543,
+    1.9708795547485352,
+    2.0653090476989746,
+    1.9575610160827637,
+    2.3627259731292725,
+    2.250105381011963,
+    1.9559214115142822,
+    1.980554223060608,
+    2.2665791511535645,
+    2.422996759414673,
+    2.2750163078308105,
+    2.002016544342041,
+    2.035966157913208,
+    2.0012030601501465,
+    1.9037576913833618,
+    1.8832789659500122,
+    2.36210036277771,
+    1.9064065217971802,
+    2.1052324771881104,
+    1.8604334592819214,
+    1.8097143173217773,
+    1.8975794315338135,
+    1.587221622467041,
+    1.8477089405059814,
+    2.0763731002807617,
+    2.372790813446045,
+    2.16257643699646,
+    1.9638965129852295,
+    1.5651309490203857,
+    1.82825767993927,
+    1.6181309223175049,
+    1.472574234008789,
+    1.6909890174865723,
+    1.8273817300796509,
+    1.7103486061096191,
+    1.8046334981918335,
+    1.774908423423767,
+    1.6485402584075928,
+    1.591095209121704,
+    1.5502698421478271,
+    1.7284529209136963,
+    1.3032234907150269,
+    1.659402847290039,
+    1.5459942817687988,
+    1.433272123336792,
+    1.3231465816497803,
+    1.3671213388442993,
+    1.5878024101257324,
+    1.4647092819213867,
+    1.7827116250991821,
+    1.207082986831665,
+    1.474880576133728,
+    1.250454306602478,
+    1.3616201877593994,
+    1.4552667140960693,
+    1.4233489036560059,
+    1.353947401046753,
+    1.3064395189285278,
+    1.4184495210647583,
+    1.2800196409225464,
+    1.177224040031433,
+    1.3941375017166138,
+    1.4012250900268555,
+    1.3233168125152588,
+    1.2974374294281006,
+    1.527478814125061,
+    1.3085899353027344,
+    1.2666343450546265,
+    1.4435198307037354,
+    0.9987432360649109,
+    1.2126177549362183,
+    1.1495455503463745,
+    0.9436071515083313,
+    1.2326290607452393,
+    1.1269416809082031,
+    1.093946099281311,
+    1.2739193439483643,
+    0.9942349195480347,
+    1.062682867050171,
+    1.131354570388794,
+    1.02915358543396,
+    1.0052719116210938,
+    0.9956269860267639,
+    0.842444896697998,
+    0.9321096539497375,
+    0.9191840291023254,
+    0.9050828218460083,
+    0.872301459312439,
+    0.7708895802497864,
+    1.0798320770263672,
+    0.6895140409469604,
+    0.6412638425827026,
+    0.6592952013015747,
+    1.0338897705078125,
+    0.87666916847229,
+    1.048370361328125,
+    0.6726852059364319,
+    0.7792536020278931,
+    0.8729381561279297,
+    0.6528324484825134,
+    0.6074752807617188,
+    0.84234619140625,
+    0.7661612033843994,
+    0.4835044741630554,
+    0.5534850358963013,
+    0.6099311113357544,
+    0.6263619661331177,
+    0.5781559348106384,
+    0.5867174863815308,
+    0.4157564640045166,
+    0.630603015422821,
+    0.5447350740432739,
+    0.5202270746231079,
+    0.4276602268218994,
+    0.7006953358650208,
+    0.6158550977706909,
+    0.4555320143699646,
+    0.36315128207206726,
+    0.45986461639404297,
+    0.24371668696403503,
+    0.5697780847549438,
+    0.31265032291412354,
+    0.3286770284175873,
+    0.3233088254928589,
+    0.46373313665390015,
+    0.30413633584976196,
+    0.2936036288738251,
+    0.28702080249786377,
+    0.22594162821769714,
+    0.19358153641223907,
+    0.17534299194812775,
+    0.14627060294151306,
+    0.18883207440376282,
+    0.17286835610866547,
+    0.13842524588108063,
+    0.08551988005638123,
+    0.13705158233642578,
+    0.08591895550489426,
+    0.061827726662158966,
+    0.03967079147696495,
+    0.04447402432560921,
+    0.0,
+    0.0
+  ]
+}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/kirkwood_buff_integrals.json b/CI/integration_tests/calculators/data/kirkwood_buff_integrals.json
new file mode 100644
index 00000000..872313f2
--- /dev/null
+++ b/CI/integration_tests/calculators/data/kirkwood_buff_integrals.json
@@ -0,0 +1,3246 @@
+{
+  "x": [
+    0.020018507094386177,
+    0.030027760641579266,
+    0.040037014188772355,
+    0.05004626773596545,
+    0.06005552128315853,
+    0.07006477483035162,
+    0.08007402837754471,
+    0.0900832819247378,
+    0.1000925354719309,
+    0.11010178901912397,
+    0.12011104256631706,
+    0.13012029611351014,
+    0.14012954966070323,
+    0.15013880320789633,
+    0.16014805675508942,
+    0.1701573103022825,
+    0.1801665638494756,
+    0.1901758173966687,
+    0.2001850709438618,
+    0.21019432449105485,
+    0.22020357803824794,
+    0.23021283158544104,
+    0.24022208513263413,
+    0.2502313386798272,
+    0.2602405922270203,
+    0.2702498457742134,
+    0.28025909932140647,
+    0.2902683528685996,
+    0.30027760641579265,
+    0.3102868599629858,
+    0.32029611351017884,
+    0.3303053670573719,
+    0.340314620604565,
+    0.3503238741517581,
+    0.3603331276989512,
+    0.37034238124614427,
+    0.3803516347933374,
+    0.39036088834053045,
+    0.4003701418877236,
+    0.41037939543491664,
+    0.4203886489821097,
+    0.4303979025293028,
+    0.4404071560764959,
+    0.450416409623689,
+    0.46042566317088207,
+    0.4704349167180752,
+    0.48044417026526826,
+    0.4904534238124613,
+    0.5004626773596544,
+    0.5104719309068475,
+    0.5204811844540406,
+    0.5304904380012337,
+    0.5404996915484268,
+    0.5505089450956199,
+    0.5605181986428129,
+    0.570527452190006,
+    0.5805367057371992,
+    0.5905459592843922,
+    0.6005552128315853,
+    0.6105644663787784,
+    0.6205737199259715,
+    0.6305829734731646,
+    0.6405922270203577,
+    0.6506014805675507,
+    0.6606107341147438,
+    0.670619987661937,
+    0.68062924120913,
+    0.6906384947563231,
+    0.7006477483035162,
+    0.7106570018507093,
+    0.7206662553979024,
+    0.7306755089450955,
+    0.7406847624922885,
+    0.7506940160394816,
+    0.7607032695866748,
+    0.7707125231338678,
+    0.7807217766810609,
+    0.790731030228254,
+    0.8007402837754471,
+    0.8107495373226402,
+    0.8207587908698333,
+    0.8307680444170263,
+    0.8407772979642194,
+    0.8507865515114126,
+    0.8607958050586056,
+    0.8708050586057987,
+    0.8808143121529918,
+    0.8908235657001848,
+    0.900832819247378,
+    0.9108420727945711,
+    0.9208513263417641,
+    0.9308605798889572,
+    0.9408698334361504,
+    0.9508790869833434,
+    0.9608883405305365,
+    0.9708975940777296,
+    0.9809068476249226,
+    0.9909161011721158,
+    1.0009253547193089,
+    1.010934608266502,
+    1.020943861813695,
+    1.0309531153608882,
+    1.0409623689080811,
+    1.0509716224552743,
+    1.0609808760024675,
+    1.0709901295496604,
+    1.0809993830968536,
+    1.0910086366440466,
+    1.1010178901912397,
+    1.111027143738433,
+    1.1210363972856259,
+    1.131045650832819,
+    1.141054904380012,
+    1.1510641579272052,
+    1.1610734114743984,
+    1.1710826650215913,
+    1.1810919185687845,
+    1.1911011721159777,
+    1.2011104256631706,
+    1.2111196792103638,
+    1.2211289327575567,
+    1.23113818630475,
+    1.241147439851943,
+    1.251156693399136,
+    1.2611659469463292,
+    1.2711752004935222,
+    1.2811844540407153,
+    1.2911937075879085,
+    1.3012029611351015,
+    1.3112122146822947,
+    1.3212214682294876,
+    1.3312307217766808,
+    1.341239975323874,
+    1.351249228871067,
+    1.36125848241826,
+    1.371267735965453,
+    1.3812769895126462,
+    1.3912862430598394,
+    1.4012954966070323,
+    1.4113047501542255,
+    1.4213140037014187,
+    1.4313232572486116,
+    1.4413325107958048,
+    1.4513417643429978,
+    1.461351017890191,
+    1.4713602714373841,
+    1.481369524984577,
+    1.4913787785317703,
+    1.5013880320789632,
+    1.5113972856261564,
+    1.5214065391733496,
+    1.5314157927205425,
+    1.5414250462677357,
+    1.5514342998149286,
+    1.5614435533621218,
+    1.571452806909315,
+    1.581462060456508,
+    1.5914713140037011,
+    1.6014805675508943,
+    1.6114898210980872,
+    1.6214990746452804,
+    1.6315083281924734,
+    1.6415175817396666,
+    1.6515268352868597,
+    1.6615360888340527,
+    1.6715453423812459,
+    1.6815545959284388,
+    1.691563849475632,
+    1.7015731030228252,
+    1.7115823565700181,
+    1.7215916101172113,
+    1.7316008636644042,
+    1.7416101172115974,
+    1.7516193707587906,
+    1.7616286243059835,
+    1.7716378778531767,
+    1.7816471314003697,
+    1.7916563849475629,
+    1.801665638494756,
+    1.811674892041949,
+    1.8216841455891422,
+    1.8316933991363353,
+    1.8417026526835283,
+    1.8517119062307215,
+    1.8617211597779144,
+    1.8717304133251076,
+    1.8817396668723008,
+    1.8917489204194937,
+    1.901758173966687,
+    1.9117674275138798,
+    1.921776681061073,
+    1.9317859346082662,
+    1.9417951881554592,
+    1.9518044417026523,
+    1.9618136952498453,
+    1.9718229487970385,
+    1.9818322023442316,
+    1.9918414558914246,
+    2.0018507094386178,
+    2.011859962985811,
+    2.021869216533004,
+    2.031878470080197,
+    2.04188772362739,
+    2.051896977174583,
+    2.0619062307217764,
+    2.0719154842689695,
+    2.0819247378161623,
+    2.0919339913633554,
+    2.1019432449105486,
+    2.111952498457742,
+    2.121961752004935,
+    2.1319710055521277,
+    2.141980259099321,
+    2.151989512646514,
+    2.1619987661937072,
+    2.1720080197409004,
+    2.182017273288093,
+    2.1920265268352863,
+    2.2020357803824795,
+    2.2120450339296727,
+    2.222054287476866,
+    2.2320635410240586,
+    2.2420727945712517,
+    2.252082048118445,
+    2.262091301665638,
+    2.2721005552128313,
+    2.282109808760024,
+    2.292119062307217,
+    2.3021283158544104,
+    2.3121375694016035,
+    2.3221468229487967,
+    2.3321560764959894,
+    2.3421653300431826,
+    2.352174583590376,
+    2.362183837137569,
+    2.372193090684762,
+    2.3822023442319553,
+    2.392211597779148,
+    2.4022208513263412,
+    2.4122301048735344,
+    2.4222393584207276,
+    2.4322486119679207,
+    2.4422578655151135,
+    2.4522671190623067,
+    2.4622763726095,
+    2.472285626156693,
+    2.482294879703886,
+    2.492304133251079,
+    2.502313386798272,
+    2.5123226403454653,
+    2.5223318938926584,
+    2.5323411474398516,
+    2.5423504009870443,
+    2.5523596545342375,
+    2.5623689080814307,
+    2.572378161628624,
+    2.582387415175817,
+    2.59239666872301,
+    2.602405922270203,
+    2.612415175817396,
+    2.6224244293645893,
+    2.6324336829117825,
+    2.642442936458975,
+    2.6524521900061684,
+    2.6624614435533616,
+    2.6724706971005547,
+    2.682479950647748,
+    2.6924892041949406,
+    2.702498457742134,
+    2.712507711289327,
+    2.72251696483652,
+    2.7325262183837133,
+    2.742535471930906,
+    2.7525447254780993,
+    2.7625539790252924,
+    2.7725632325724856,
+    2.782572486119679,
+    2.792581739666872,
+    2.8025909932140647,
+    2.812600246761258,
+    2.822609500308451,
+    2.832618753855644,
+    2.8426280074028374,
+    2.85263726095003,
+    2.8626465144972233,
+    2.8726557680444165,
+    2.8826650215916096,
+    2.892674275138803,
+    2.9026835286859956,
+    2.9126927822331887,
+    2.922702035780382,
+    2.932711289327575,
+    2.9427205428747683,
+    2.952729796421961,
+    2.962739049969154,
+    2.9727483035163473,
+    2.9827575570635405,
+    2.9927668106107337,
+    3.0027760641579264,
+    3.0127853177051196,
+    3.0227945712523128,
+    3.032803824799506,
+    3.042813078346699,
+    3.052822331893892,
+    3.062831585441085,
+    3.072840838988278,
+    3.0828500925354714,
+    3.0928593460826646,
+    3.1028685996298573,
+    3.1128778531770505,
+    3.1228871067242436,
+    3.132896360271437,
+    3.14290561381863,
+    3.1529148673658227,
+    3.162924120913016,
+    3.172933374460209,
+    3.1829426280074022,
+    3.1929518815545954,
+    3.2029611351017886,
+    3.2129703886489813,
+    3.2229796421961745,
+    3.2329888957433677,
+    3.242998149290561,
+    3.253007402837754,
+    3.2630166563849468,
+    3.27302590993214,
+    3.283035163479333,
+    3.2930444170265263,
+    3.3030536705737195,
+    3.313062924120912,
+    3.3230721776681054,
+    3.3330814312152985,
+    3.3430906847624917,
+    3.353099938309685,
+    3.3631091918568776,
+    3.373118445404071,
+    3.383127698951264,
+    3.393136952498457,
+    3.4031462060456503,
+    3.413155459592843,
+    3.4231647131400362,
+    3.4331739666872294,
+    3.4431832202344226,
+    3.4531924737816158,
+    3.4632017273288085,
+    3.4732109808760017,
+    3.483220234423195,
+    3.493229487970388,
+    3.503238741517581,
+    3.513247995064774,
+    3.523257248611967,
+    3.5332665021591603,
+    3.5432757557063534,
+    3.5532850092535466,
+    3.5632942628007394,
+    3.5733035163479325,
+    3.5833127698951257,
+    3.593322023442319,
+    3.603331276989512,
+    3.613340530536705,
+    3.623349784083898,
+    3.633359037631091,
+    3.6433682911782843,
+    3.6533775447254775,
+    3.6633867982726707,
+    3.6733960518198634,
+    3.6834053053670566,
+    3.6934145589142497,
+    3.703423812461443,
+    3.713433066008636,
+    3.723442319555829,
+    3.733451573103022,
+    3.743460826650215,
+    3.7534700801974084,
+    3.7634793337446015,
+    3.7734885872917943,
+    3.7834978408389874,
+    3.7935070943861806,
+    3.803516347933374,
+    3.813525601480567,
+    3.8235348550277597,
+    3.833544108574953,
+    3.843553362122146,
+    3.853562615669339,
+    3.8635718692165324,
+    3.873581122763725,
+    3.8835903763109183,
+    3.8935996298581115,
+    3.9036088834053047,
+    3.913618136952498,
+    3.9236273904996906,
+    3.9336366440468837,
+    3.943645897594077,
+    3.95365515114127,
+    3.9636644046884633,
+    3.973673658235656,
+    3.983682911782849,
+    3.9936921653300423,
+    4.0037014188772355,
+    4.013710672424429,
+    4.023719925971622,
+    4.033729179518815,
+    4.043738433066008,
+    4.0537476866132005,
+    4.063756940160394,
+    4.073766193707587,
+    4.08377544725478,
+    4.093784700801973,
+    4.103793954349166,
+    4.11380320789636,
+    4.123812461443553,
+    4.133821714990746,
+    4.143830968537939,
+    4.153840222085131,
+    4.1638494756323245,
+    4.173858729179518,
+    4.183867982726711,
+    4.193877236273904,
+    4.203886489821097,
+    4.21389574336829,
+    4.223904996915484,
+    4.233914250462677,
+    4.24392350400987,
+    4.253932757557062,
+    4.263942011104255,
+    4.273951264651449,
+    4.283960518198642,
+    4.293969771745835,
+    4.303979025293028,
+    4.313988278840221,
+    4.3239975323874145,
+    4.334006785934608,
+    4.344016039481801,
+    4.354025293028994,
+    4.364034546576186,
+    4.3740438001233795,
+    4.384053053670573,
+    4.394062307217766,
+    4.404071560764959,
+    4.414080814312152,
+    4.424090067859345,
+    4.4340993214065385,
+    4.444108574953732,
+    4.454117828500925,
+    4.464127082048117,
+    4.47413633559531,
+    4.4841455891425035,
+    4.494154842689697,
+    4.50416409623689,
+    4.514173349784083,
+    4.524182603331276,
+    4.534191856878469,
+    4.5442011104256625,
+    4.554210363972856,
+    4.564219617520048,
+    4.574228871067241,
+    4.584238124614434,
+    4.5942473781616275,
+    4.604256631708821,
+    4.614265885256014,
+    4.624275138803207,
+    4.6342843923504,
+    4.644293645897593,
+    4.654302899444787,
+    4.664312152991979,
+    4.674321406539172,
+    4.684330660086365,
+    4.694339913633558,
+    4.704349167180752,
+    4.714358420727945,
+    4.724367674275138,
+    4.734376927822331,
+    4.744386181369524,
+    4.7543954349167175,
+    4.764404688463911,
+    4.774413942011103,
+    4.784423195558296,
+    4.794432449105489,
+    4.8044417026526824,
+    4.814450956199876,
+    4.824460209747069,
+    4.834469463294262,
+    4.844478716841455,
+    4.854487970388648,
+    4.8644972239358415,
+    4.874506477483034,
+    4.884515731030227,
+    4.89452498457742,
+    4.904534238124613,
+    4.9145434916718065,
+    4.924552745219,
+    4.934561998766193,
+    4.944571252313386,
+    4.954580505860579,
+    4.964589759407772,
+    4.974599012954965,
+    4.984608266502158,
+    4.994617520049351,
+    5.004626773596544,
+    5.014636027143737,
+    5.0246452806909305,
+    5.034654534238124,
+    5.044663787785317,
+    5.05467304133251,
+    5.064682294879703,
+    5.0746915484268955,
+    5.084700801974089,
+    5.094710055521282,
+    5.104719309068475,
+    5.114728562615668,
+    5.124737816162861,
+    5.134747069710055,
+    5.144756323257248,
+    5.154765576804441,
+    5.164774830351634,
+    5.174784083898827,
+    5.18479333744602,
+    5.194802590993213,
+    5.204811844540406,
+    5.214821098087599,
+    5.224830351634792,
+    5.234839605181985,
+    5.244848858729179,
+    5.254858112276372,
+    5.264867365823565,
+    5.274876619370758,
+    5.28488587291795,
+    5.294895126465144,
+    5.304904380012337,
+    5.31491363355953,
+    5.324922887106723,
+    5.334932140653916,
+    5.3449413942011095,
+    5.354950647748303,
+    5.364959901295496,
+    5.374969154842689,
+    5.384978408389881,
+    5.3949876619370745,
+    5.404996915484268,
+    5.415006169031461,
+    5.425015422578654,
+    5.435024676125847,
+    5.44503392967304,
+    5.4550431832202335,
+    5.465052436767427,
+    5.47506169031462,
+    5.485070943861812,
+    5.495080197409005,
+    5.5050894509561985,
+    5.515098704503392,
+    5.525107958050585,
+    5.535117211597778,
+    5.545126465144971,
+    5.555135718692164,
+    5.565144972239358,
+    5.575154225786551,
+    5.585163479333744,
+    5.595172732880936,
+    5.605181986428129,
+    5.6151912399753225,
+    5.625200493522516,
+    5.635209747069709,
+    5.645219000616902,
+    5.655228254164095,
+    5.665237507711288,
+    5.675246761258482,
+    5.685256014805675,
+    5.695265268352867,
+    5.70527452190006,
+    5.715283775447253,
+    5.725293028994447,
+    5.73530228254164,
+    5.745311536088833,
+    5.755320789636026,
+    5.765330043183219,
+    5.7753392967304125,
+    5.785348550277606,
+    5.795357803824798,
+    5.805367057371991,
+    5.815376310919184,
+    5.8253855644663775,
+    5.835394818013571,
+    5.845404071560764,
+    5.855413325107957,
+    5.86542257865515,
+    5.875431832202343,
+    5.8854410857495365,
+    5.895450339296729,
+    5.905459592843922,
+    5.915468846391115,
+    5.925478099938308,
+    5.9354873534855015,
+    5.945496607032695,
+    5.955505860579888,
+    5.965515114127081,
+    5.975524367674274,
+    5.985533621221467,
+    5.9955428747686605,
+    6.005552128315853,
+    6.015561381863046,
+    6.025570635410239,
+    6.035579888957432,
+    6.0455891425046255,
+    6.055598396051819,
+    6.065607649599012,
+    6.075616903146205,
+    6.085626156693398,
+    6.095635410240591,
+    6.105644663787784,
+    6.115653917334977,
+    6.12566317088217,
+    6.135672424429363,
+    6.145681677976556,
+    6.15569093152375,
+    6.165700185070943,
+    6.175709438618136,
+    6.185718692165329,
+    6.195727945712522,
+    6.205737199259715,
+    6.215746452806908,
+    6.225755706354101,
+    6.235764959901294,
+    6.245774213448487,
+    6.25578346699568,
+    6.265792720542874,
+    6.275801974090067,
+    6.28581122763726,
+    6.295820481184453,
+    6.305829734731645,
+    6.315838988278839,
+    6.325848241826032,
+    6.335857495373225,
+    6.345866748920418,
+    6.355876002467611,
+    6.3658852560148045,
+    6.375894509561998,
+    6.385903763109191,
+    6.395913016656384,
+    6.405922270203577,
+    6.4159315237507695,
+    6.425940777297963,
+    6.435950030845156,
+    6.445959284392349,
+    6.455968537939542,
+    6.465977791486735,
+    6.4759870450339285,
+    6.485996298581122,
+    6.496005552128315,
+    6.506014805675508,
+    6.5160240592227,
+    6.5260333127698935,
+    6.536042566317087,
+    6.54605181986428,
+    6.556061073411473,
+    6.566070326958666,
+    6.576079580505859,
+    6.586088834053053,
+    6.596098087600246,
+    6.606107341147439,
+    6.616116594694631,
+    6.626125848241824,
+    6.6361351017890176,
+    6.646144355336211,
+    6.656153608883404,
+    6.666162862430597,
+    6.67617211597779,
+    6.686181369524983,
+    6.696190623072177,
+    6.70619987661937,
+    6.716209130166562,
+    6.726218383713755,
+    6.736227637260948,
+    6.746236890808142,
+    6.756246144355335,
+    6.766255397902528,
+    6.776264651449721,
+    6.786273904996914,
+    6.7962831585441075,
+    6.806292412091301,
+    6.816301665638493,
+    6.826310919185686,
+    6.836320172732879,
+    6.8463294262800725,
+    6.856338679827266,
+    6.866347933374459,
+    6.876357186921652,
+    6.886366440468845,
+    6.896375694016038,
+    6.9063849475632315,
+    6.916394201110425,
+    6.926403454657617,
+    6.93641270820481,
+    6.946421961752003,
+    6.9564312152991965,
+    6.96644046884639,
+    6.976449722393583,
+    6.986458975940776,
+    6.996468229487969,
+    7.006477483035162,
+    7.0164867365823556,
+    7.026495990129548,
+    7.036505243676741,
+    7.046514497223934,
+    7.056523750771127,
+    7.0665330043183205,
+    7.076542257865514,
+    7.086551511412707,
+    7.0965607649599,
+    7.106570018507093,
+    7.116579272054286,
+    7.126588525601479,
+    7.136597779148672,
+    7.146607032695865,
+    7.156616286243058,
+    7.166625539790251,
+    7.176634793337445,
+    7.186644046884638,
+    7.196653300431831,
+    7.206662553979024,
+    7.216671807526217,
+    7.22668106107341,
+    7.236690314620603,
+    7.246699568167796,
+    7.256708821714989,
+    7.266718075262182,
+    7.2767273288093755,
+    7.286736582356569,
+    7.296745835903762,
+    7.306755089450955,
+    7.316764342998148,
+    7.326773596545341,
+    7.336782850092534,
+    7.346792103639727,
+    7.35680135718692,
+    7.366810610734113,
+    7.376819864281306,
+    7.3868291178284995,
+    7.396838371375693,
+    7.406847624922886,
+    7.416856878470079,
+    7.426866132017272,
+    7.4368753855644645,
+    7.446884639111658,
+    7.456893892658851,
+    7.466903146206044,
+    7.476912399753237,
+    7.48692165330043,
+    7.4969309068476235,
+    7.506940160394817,
+    7.51694941394201,
+    7.526958667489203,
+    7.536967921036395,
+    7.5469771745835885,
+    7.556986428130782,
+    7.566995681677975,
+    7.577004935225168,
+    7.587014188772361,
+    7.597023442319554,
+    7.607032695866748,
+    7.617041949413941,
+    7.627051202961134,
+    7.637060456508326,
+    7.647069710055519,
+    7.657078963602713,
+    7.667088217149906,
+    7.677097470697099,
+    7.687106724244292,
+    7.697115977791485,
+    7.707125231338678,
+    7.717134484885872,
+    7.727143738433065,
+    7.737152991980258,
+    7.74716224552745,
+    7.757171499074643,
+    7.767180752621837,
+    7.77719000616903,
+    7.787199259716223,
+    7.797208513263416,
+    7.807217766810609,
+    7.8172270203578025,
+    7.827236273904996,
+    7.837245527452189,
+    7.847254780999381,
+    7.857264034546574,
+    7.8672732880937675,
+    7.877282541640961,
+    7.887291795188154,
+    7.897301048735347,
+    7.90731030228254,
+    7.917319555829733,
+    7.9273288093769265,
+    7.93733806292412,
+    7.947347316471312,
+    7.957356570018505,
+    7.967365823565698,
+    7.9773750771128915,
+    7.987384330660085,
+    7.997393584207278,
+    8.007402837754471,
+    8.017412091301663,
+    8.027421344848857,
+    8.03743059839605,
+    8.047439851943244,
+    8.057449105490436,
+    8.06745835903763,
+    8.077467612584822,
+    8.087476866132016,
+    8.097486119679209,
+    8.107495373226401,
+    8.117504626773595,
+    8.127513880320787,
+    8.137523133867981,
+    8.147532387415174,
+    8.157541640962368,
+    8.16755089450956,
+    8.177560148056754,
+    8.187569401603946,
+    8.19757865515114,
+    8.207587908698333,
+    8.217597162245525,
+    8.22760641579272,
+    8.237615669339911,
+    8.247624922887105,
+    8.257634176434298,
+    8.267643429981492,
+    8.277652683528684,
+    8.287661937075878,
+    8.29767119062307,
+    8.307680444170263,
+    8.317689697717457,
+    8.327698951264649,
+    8.337708204811843,
+    8.347717458359035,
+    8.35772671190623,
+    8.367735965453422,
+    8.377745219000616,
+    8.387754472547808,
+    8.397763726095002,
+    8.407772979642194,
+    8.417782233189387,
+    8.42779148673658,
+    8.437800740283773,
+    8.447809993830967,
+    8.45781924737816,
+    8.467828500925354,
+    8.477837754472546,
+    8.48784700801974,
+    8.497856261566932,
+    8.507865515114124,
+    8.517874768661319,
+    8.52788402220851,
+    8.537893275755705,
+    8.547902529302897,
+    8.557911782850091,
+    8.567921036397284,
+    8.577930289944478,
+    8.58793954349167,
+    8.597948797038864,
+    8.607958050586056,
+    8.617967304133249,
+    8.627976557680443,
+    8.637985811227635,
+    8.647995064774829,
+    8.658004318322021,
+    8.668013571869215,
+    8.678022825416408,
+    8.688032078963602,
+    8.698041332510794,
+    8.708050586057988,
+    8.71805983960518,
+    8.728069093152373,
+    8.738078346699567,
+    8.748087600246759,
+    8.758096853793953,
+    8.768106107341145,
+    8.77811536088834,
+    8.788124614435532,
+    8.798133867982726,
+    8.808143121529918,
+    8.81815237507711,
+    8.828161628624304,
+    8.838170882171497,
+    8.84818013571869,
+    8.858189389265883,
+    8.868198642813077,
+    8.87820789636027,
+    8.888217149907463,
+    8.898226403454656,
+    8.90823565700185,
+    8.918244910549042,
+    8.928254164096234,
+    8.938263417643428,
+    8.94827267119062,
+    8.958281924737815,
+    8.968291178285007,
+    8.978300431832201,
+    8.988309685379393,
+    8.998318938926587,
+    9.00832819247378,
+    9.018337446020974,
+    9.028346699568166,
+    9.038355953115358,
+    9.048365206662552,
+    9.058374460209745,
+    9.068383713756939,
+    9.078392967304131,
+    9.088402220851325,
+    9.098411474398517,
+    9.108420727945711,
+    9.118429981492904,
+    9.128439235040096,
+    9.13844848858729,
+    9.148457742134482,
+    9.158466995681676,
+    9.168476249228869,
+    9.178485502776063,
+    9.188494756323255,
+    9.19850400987045,
+    9.208513263417641,
+    9.218522516964835,
+    9.228531770512028,
+    9.23854102405922,
+    9.248550277606414,
+    9.258559531153606,
+    9.2685687847008,
+    9.278578038247993,
+    9.288587291795187,
+    9.29859654534238,
+    9.308605798889573,
+    9.318615052436765,
+    9.328624305983958,
+    9.338633559531152,
+    9.348642813078344,
+    9.358652066625538,
+    9.36866132017273,
+    9.378670573719925,
+    9.388679827267117,
+    9.39868908081431,
+    9.408698334361503,
+    9.418707587908697,
+    9.42871684145589,
+    9.438726095003082,
+    9.448735348550276,
+    9.458744602097468,
+    9.468753855644662,
+    9.478763109191854,
+    9.488772362739049,
+    9.49878161628624,
+    9.508790869833435,
+    9.518800123380627,
+    9.528809376927821,
+    9.538818630475014,
+    9.548827884022206,
+    9.5588371375694,
+    9.568846391116592,
+    9.578855644663786,
+    9.588864898210979,
+    9.598874151758173,
+    9.608883405305365,
+    9.618892658852559,
+    9.628901912399751,
+    9.638911165946944,
+    9.648920419494138,
+    9.65892967304133,
+    9.668938926588524,
+    9.678948180135716,
+    9.68895743368291,
+    9.698966687230103,
+    9.708975940777297,
+    9.718985194324489,
+    9.728994447871683,
+    9.739003701418875,
+    9.749012954966068,
+    9.759022208513262,
+    9.769031462060454,
+    9.779040715607648,
+    9.78904996915484,
+    9.799059222702034,
+    9.809068476249227,
+    9.81907772979642,
+    9.829086983343613,
+    9.839096236890807,
+    9.849105490438,
+    9.859114743985192,
+    9.869123997532386,
+    9.879133251079578,
+    9.889142504626772,
+    9.899151758173964,
+    9.909161011721158,
+    9.91917026526835,
+    9.929179518815545,
+    9.939188772362737,
+    9.94919802590993,
+    9.959207279457123,
+    9.969216533004316,
+    9.97922578655151,
+    9.989235040098702,
+    9.999244293645896,
+    10.009253547193088,
+    10.019262800740282,
+    10.029272054287475,
+    10.039281307834669,
+    10.049290561381861,
+    10.059299814929053,
+    10.069309068476247,
+    10.07931832202344,
+    10.089327575570634,
+    10.099336829117826,
+    10.10934608266502,
+    10.119355336212212,
+    10.129364589759406,
+    10.139373843306599,
+    10.149383096853791,
+    10.159392350400985,
+    10.169401603948177,
+    10.179410857495371,
+    10.189420111042564,
+    10.199429364589758,
+    10.20943861813695,
+    10.219447871684144,
+    10.229457125231336,
+    10.23946637877853,
+    10.249475632325723,
+    10.259484885872915,
+    10.26949413942011,
+    10.279503392967301,
+    10.289512646514495,
+    10.299521900061688,
+    10.309531153608882,
+    10.319540407156074,
+    10.329549660703268,
+    10.33955891425046,
+    10.349568167797655,
+    10.359577421344847,
+    10.36958667489204,
+    10.379595928439233,
+    10.389605181986425,
+    10.39961443553362,
+    10.409623689080812,
+    10.419632942628006,
+    10.429642196175198,
+    10.439651449722392,
+    10.449660703269585,
+    10.459669956816777,
+    10.46967921036397,
+    10.479688463911163,
+    10.489697717458357,
+    10.49970697100555,
+    10.509716224552744,
+    10.519725478099936,
+    10.52973473164713,
+    10.539743985194322,
+    10.549753238741516,
+    10.559762492288709,
+    10.5697717458359,
+    10.579780999383095,
+    10.589790252930287,
+    10.599799506477481,
+    10.609808760024674,
+    10.619818013571868,
+    10.62982726711906,
+    10.639836520666254,
+    10.649845774213446,
+    10.659855027760639,
+    10.669864281307833,
+    10.679873534855025,
+    10.689882788402219,
+    10.699892041949411,
+    10.709901295496605,
+    10.719910549043798,
+    10.729919802590992,
+    10.739929056138184,
+    10.749938309685378,
+    10.75994756323257,
+    10.769956816779763,
+    10.779966070326957,
+    10.789975323874149,
+    10.799984577421343,
+    10.809993830968535,
+    10.82000308451573,
+    10.830012338062922,
+    10.840021591610116,
+    10.850030845157308,
+    10.860040098704502,
+    10.870049352251694,
+    10.880058605798887,
+    10.89006785934608,
+    10.900077112893273,
+    10.910086366440467,
+    10.92009561998766,
+    10.930104873534853,
+    10.940114127082046,
+    10.95012338062924,
+    10.960132634176432,
+    10.970141887723624,
+    10.980151141270818,
+    10.99016039481801,
+    11.000169648365205,
+    11.010178901912397,
+    11.020188155459591,
+    11.030197409006783,
+    11.040206662553977,
+    11.05021591610117,
+    11.060225169648364,
+    11.070234423195556,
+    11.080243676742748,
+    11.090252930289942,
+    11.100262183837135,
+    11.110271437384329,
+    11.120280690931521,
+    11.130289944478715,
+    11.140299198025907,
+    11.150308451573101,
+    11.160317705120294,
+    11.170326958667488,
+    11.18033621221468,
+    11.190345465761872,
+    11.200354719309066,
+    11.210363972856259,
+    11.220373226403453,
+    11.230382479950645,
+    11.24039173349784,
+    11.250400987045031,
+    11.260410240592226,
+    11.270419494139418,
+    11.28042874768661,
+    11.290438001233804,
+    11.300447254780996,
+    11.31045650832819,
+    11.320465761875383,
+    11.330475015422577,
+    11.34048426896977,
+    11.350493522516963,
+    11.360502776064155,
+    11.37051202961135,
+    11.380521283158542,
+    11.390530536705734,
+    11.400539790252928,
+    11.41054904380012,
+    11.420558297347315,
+    11.430567550894507,
+    11.4405768044417,
+    11.450586057988893,
+    11.460595311536087,
+    11.47060456508328,
+    11.480613818630472,
+    11.490623072177666,
+    11.500632325724858,
+    11.510641579272052,
+    11.520650832819245,
+    11.530660086366439,
+    11.54066933991363,
+    11.550678593460825,
+    11.560687847008017,
+    11.570697100555211,
+    11.580706354102404,
+    11.590715607649596,
+    11.60072486119679,
+    11.610734114743982,
+    11.620743368291176,
+    11.630752621838369,
+    11.640761875385563,
+    11.650771128932755,
+    11.660780382479949,
+    11.670789636027141,
+    11.680798889574335,
+    11.690808143121528,
+    11.70081739666872,
+    11.710826650215914,
+    11.720835903763106,
+    11.7308451573103,
+    11.740854410857493,
+    11.750863664404687,
+    11.760872917951879,
+    11.770882171499073,
+    11.780891425046265,
+    11.790900678593458,
+    11.800909932140652,
+    11.810919185687844,
+    11.820928439235038,
+    11.83093769278223,
+    11.840946946329424,
+    11.850956199876617,
+    11.86096545342381,
+    11.870974706971003,
+    11.880983960518197,
+    11.89099321406539,
+    11.901002467612582,
+    11.911011721159776,
+    11.921020974706968,
+    11.931030228254162,
+    11.941039481801354,
+    11.951048735348548,
+    11.96105798889574,
+    11.971067242442935,
+    11.981076495990127,
+    11.991085749537321,
+    12.001095003084513,
+    12.011104256631706,
+    12.0211135101789,
+    12.031122763726092,
+    12.041132017273286,
+    12.051141270820478,
+    12.061150524367672,
+    12.071159777914865,
+    12.081169031462059,
+    12.091178285009251,
+    12.101187538556443,
+    12.111196792103637,
+    12.12120604565083,
+    12.131215299198024,
+    12.141224552745216,
+    12.15123380629241,
+    12.161243059839602,
+    12.171252313386796,
+    12.181261566933989,
+    12.191270820481183,
+    12.201280074028375,
+    12.211289327575567,
+    12.221298581122761,
+    12.231307834669954,
+    12.241317088217148,
+    12.25132634176434,
+    12.261335595311534,
+    12.271344848858726,
+    12.28135410240592,
+    12.291363355953113,
+    12.301372609500305,
+    12.3113818630475,
+    12.321391116594691,
+    12.331400370141886,
+    12.341409623689078,
+    12.351418877236272,
+    12.361428130783464,
+    12.371437384330658,
+    12.38144663787785,
+    12.391455891425045,
+    12.401465144972237,
+    12.41147439851943,
+    12.421483652066623,
+    12.431492905613815,
+    12.44150215916101,
+    12.451511412708202,
+    12.461520666255396,
+    12.471529919802588,
+    12.481539173349782,
+    12.491548426896975,
+    12.501557680444169,
+    12.51156693399136,
+    12.521576187538553,
+    12.531585441085747,
+    12.54159469463294,
+    12.551603948180134,
+    12.561613201727326,
+    12.57162245527452,
+    12.581631708821712,
+    12.591640962368906,
+    12.601650215916099,
+    12.61165946946329,
+    12.621668723010485,
+    12.631677976557677,
+    12.641687230104871,
+    12.651696483652064,
+    12.661705737199258,
+    12.67171499074645,
+    12.681724244293644,
+    12.691733497840836,
+    12.70174275138803,
+    12.711752004935223,
+    12.721761258482415,
+    12.731770512029609,
+    12.741779765576801,
+    12.751789019123995,
+    12.761798272671188,
+    12.771807526218382,
+    12.781816779765574,
+    12.791826033312768,
+    12.80183528685996,
+    12.811844540407154,
+    12.821853793954347,
+    12.831863047501539,
+    12.841872301048733,
+    12.851881554595925,
+    12.86189080814312,
+    12.871900061690312,
+    12.881909315237506,
+    12.891918568784698,
+    12.901927822331892,
+    12.911937075879084,
+    12.921946329426277,
+    12.93195558297347,
+    12.941964836520663,
+    12.951974090067857,
+    12.96198334361505,
+    12.971992597162243,
+    12.982001850709436,
+    12.99201110425663,
+    13.002020357803822,
+    13.012029611351016,
+    13.022038864898208,
+    13.0320481184454,
+    13.042057371992595,
+    13.052066625539787,
+    13.062075879086981,
+    13.072085132634173,
+    13.082094386181367,
+    13.09210363972856,
+    13.102112893275754,
+    13.112122146822946,
+    13.122131400370138,
+    13.132140653917332,
+    13.142149907464525,
+    13.152159161011719,
+    13.162168414558911,
+    13.172177668106105,
+    13.182186921653297,
+    13.192196175200491,
+    13.202205428747684,
+    13.212214682294878,
+    13.22222393584207,
+    13.232233189389262,
+    13.242242442936456,
+    13.252251696483649,
+    13.262260950030843,
+    13.272270203578035,
+    13.28227945712523,
+    13.292288710672421,
+    13.302297964219616,
+    13.312307217766808,
+    13.322316471314002,
+    13.332325724861194,
+    13.342334978408386,
+    13.35234423195558,
+    13.362353485502773,
+    13.372362739049967,
+    13.38237199259716,
+    13.392381246144353,
+    13.402390499691546,
+    13.41239975323874,
+    13.422409006785932,
+    13.432418260333124,
+    13.442427513880318,
+    13.45243676742751,
+    13.462446020974705,
+    13.472455274521897,
+    13.482464528069091,
+    13.492473781616283,
+    13.502483035163477,
+    13.51249228871067,
+    13.522501542257864,
+    13.532510795805056,
+    13.542520049352248,
+    13.552529302899442,
+    13.562538556446635,
+    13.572547809993829,
+    13.58255706354102,
+    13.592566317088215,
+    13.602575570635407,
+    13.612584824182601,
+    13.622594077729794,
+    13.632603331276986,
+    13.64261258482418,
+    13.652621838371372,
+    13.662631091918566,
+    13.672640345465759,
+    13.682649599012953,
+    13.692658852560145,
+    13.702668106107339,
+    13.712677359654531,
+    13.722686613201725,
+    13.732695866748918,
+    13.74270512029611,
+    13.752714373843304,
+    13.762723627390496,
+    13.77273288093769,
+    13.782742134484883,
+    13.792751388032077,
+    13.802760641579269,
+    13.812769895126463,
+    13.822779148673655,
+    13.83278840222085,
+    13.842797655768042,
+    13.852806909315234,
+    13.862816162862428,
+    13.87282541640962,
+    13.882834669956814,
+    13.892843923504007,
+    13.9028531770512,
+    13.912862430598393,
+    13.922871684145587,
+    13.93288093769278,
+    13.942890191239972,
+    13.952899444787166,
+    13.962908698334358,
+    13.972917951881552,
+    13.982927205428744,
+    13.992936458975938,
+    14.00294571252313,
+    14.012954966070325,
+    14.022964219617517,
+    14.032973473164711,
+    14.042982726711903,
+    14.052991980259096,
+    14.06300123380629,
+    14.073010487353482,
+    14.083019740900676,
+    14.093028994447868,
+    14.103038247995062,
+    14.113047501542255,
+    14.123056755089449,
+    14.133066008636641,
+    14.143075262183835,
+    14.153084515731027,
+    14.16309376927822,
+    14.173103022825414,
+    14.183112276372606,
+    14.1931215299198,
+    14.203130783466992,
+    14.213140037014186,
+    14.223149290561379,
+    14.233158544108573,
+    14.243167797655765,
+    14.253177051202957,
+    14.263186304750151,
+    14.273195558297344,
+    14.283204811844538,
+    14.29321406539173,
+    14.303223318938924,
+    14.313232572486116,
+    14.32324182603331,
+    14.333251079580503,
+    14.343260333127697,
+    14.35326958667489,
+    14.363278840222081,
+    14.373288093769276,
+    14.383297347316468,
+    14.393306600863662,
+    14.403315854410854,
+    14.413325107958048,
+    14.42333436150524,
+    14.433343615052435,
+    14.443352868599627,
+    14.45336212214682,
+    14.463371375694013,
+    14.473380629241205,
+    14.4833898827884,
+    14.493399136335592,
+    14.503408389882786,
+    14.513417643429978,
+    14.523426896977172,
+    14.533436150524365,
+    14.543445404071559,
+    14.553454657618751,
+    14.563463911165943,
+    14.573473164713137,
+    14.58348241826033,
+    14.593491671807524,
+    14.603500925354716,
+    14.61351017890191,
+    14.623519432449102,
+    14.633528685996296,
+    14.643537939543489,
+    14.653547193090683,
+    14.663556446637875,
+    14.673565700185067,
+    14.683574953732261,
+    14.693584207279454,
+    14.703593460826648,
+    14.71360271437384,
+    14.723611967921034,
+    14.733621221468226,
+    14.74363047501542,
+    14.753639728562613,
+    14.763648982109805,
+    14.773658235656999,
+    14.783667489204191,
+    14.793676742751385,
+    14.803685996298578,
+    14.813695249845772,
+    14.823704503392964,
+    14.833713756940158,
+    14.84372301048735,
+    14.853732264034544,
+    14.863741517581737,
+    14.873750771128929,
+    14.883760024676123,
+    14.893769278223315,
+    14.90377853177051,
+    14.913787785317702,
+    14.923797038864896,
+    14.933806292412088,
+    14.943815545959282,
+    14.953824799506474,
+    14.963834053053668,
+    14.97384330660086,
+    14.983852560148053,
+    14.993861813695247,
+    15.00387106724244,
+    15.013880320789633,
+    15.023889574336826,
+    15.03389882788402,
+    15.043908081431212,
+    15.053917334978406,
+    15.063926588525598,
+    15.07393584207279,
+    15.083945095619985,
+    15.093954349167177,
+    15.103963602714371,
+    15.113972856261563,
+    15.123982109808757,
+    15.13399136335595,
+    15.144000616903144,
+    15.154009870450336,
+    15.16401912399753,
+    15.174028377544722,
+    15.184037631091915,
+    15.194046884639109,
+    15.204056138186301,
+    15.214065391733495,
+    15.224074645280687,
+    15.234083898827881,
+    15.244093152375074,
+    15.254102405922268,
+    15.26411165946946,
+    15.274120913016652,
+    15.284130166563846,
+    15.294139420111039,
+    15.304148673658233,
+    15.314157927205425,
+    15.32416718075262,
+    15.334176434299811,
+    15.344185687847006,
+    15.354194941394198,
+    15.364204194941392,
+    15.374213448488584,
+    15.384222702035776,
+    15.39423195558297,
+    15.404241209130163,
+    15.414250462677357,
+    15.42425971622455,
+    15.434268969771743,
+    15.444278223318936,
+    15.45428747686613,
+    15.464296730413322,
+    15.474305983960516,
+    15.484315237507708,
+    15.4943244910549,
+    15.504333744602095,
+    15.514342998149287,
+    15.524352251696481,
+    15.534361505243673,
+    15.544370758790867,
+    15.55438001233806,
+    15.564389265885254,
+    15.574398519432446,
+    15.584407772979638,
+    15.594417026526832,
+    15.604426280074025,
+    15.614435533621219,
+    15.624444787168411,
+    15.634454040715605,
+    15.644463294262797,
+    15.654472547809991,
+    15.664481801357184,
+    15.674491054904378,
+    15.68450030845157,
+    15.694509561998762,
+    15.704518815545956,
+    15.714528069093149,
+    15.724537322640343,
+    15.734546576187535,
+    15.744555829734729,
+    15.754565083281921,
+    15.764574336829115,
+    15.774583590376308,
+    15.7845928439235,
+    15.794602097470694,
+    15.804611351017886,
+    15.81462060456508,
+    15.824629858112273,
+    15.834639111659467,
+    15.844648365206659,
+    15.854657618753853,
+    15.864666872301045,
+    15.87467612584824,
+    15.884685379395432,
+    15.894694632942624,
+    15.904703886489818,
+    15.91471314003701,
+    15.924722393584204,
+    15.934731647131397,
+    15.94474090067859,
+    15.954750154225783,
+    15.964759407772977,
+    15.97476866132017,
+    15.984777914867363,
+    15.994787168414556,
+    16.00479642196175,
+    16.014805675508942,
+    16.024814929056134,
+    16.034824182603327,
+    16.044833436150522,
+    16.054842689697715,
+    16.064851943244907,
+    16.0748611967921,
+    16.084870450339295,
+    16.094879703886487,
+    16.10488895743368,
+    16.114898210980872,
+    16.124907464528064,
+    16.13491671807526,
+    16.144925971622452,
+    16.154935225169645,
+    16.164944478716837,
+    16.174953732264033,
+    16.184962985811225,
+    16.194972239358417,
+    16.20498149290561,
+    16.214990746452802,
+    16.224999999999998
+  ],
+  "y": [
+    0.0,
+    0.0,
+    -8.190837171673445e-05,
+    -0.000239424471171993,
+    -0.0004977508742786172,
+    -0.000882090156949448,
+    -0.0014176448950973268,
+    -0.002129617664635096,
+    -0.003043211041475596,
+    -0.004183627601531669,
+    -0.005576069920716153,
+    -0.007245740574941894,
+    -0.009217842140121729,
+    -0.011517577192168504,
+    -0.01417014830699506,
+    -0.017200758060514236,
+    -0.020634609028638874,
+    -0.02449690378728182,
+    -0.028812844912355907,
+    -0.033607634979773975,
+    -0.038906476565448864,
+    -0.04473457224529343,
+    -0.05111712459522051,
+    -0.05807933619114294,
+    -0.06564640960897355,
+    -0.07384354742462519,
+    -0.08269595221401076,
+    -0.09222882655304299,
+    -0.10246737301763484,
+    -0.11343679418369902,
+    -0.1251622926271485,
+    -0.13766907092389602,
+    -0.15098233164985445,
+    -0.16512727738093666,
+    -0.18012911069305546,
+    -0.1960130341621238,
+    -0.2128042503640543,
+    -0.23052796187476005,
+    -0.2492093712701537,
+    -0.26887368112614823,
+    -0.2895460940186563,
+    -0.3112518125235909,
+    -0.3340160392168649,
+    -0.357863976674391,
+    -0.3828208274720823,
+    -0.4089117941858512,
+    -0.436162079391611,
+    -0.4645968856652742,
+    -0.4942414155827538,
+    -0.5251208717199629,
+    -0.5572604566528138,
+    -0.5906853729572196,
+    -0.6254208232090934,
+    -0.6614920099843475,
+    -0.6989241358588951,
+    -0.7377424034086489,
+    -0.777972015209522,
+    -0.8196381738374273,
+    -0.862766081868277,
+    -0.9073809418779843,
+    -0.9535079564424621,
+    -1.0011723281376237,
+    -1.050399259539381,
+    -1.1012139532236473,
+    -1.1536416117663353,
+    -1.2077074377433583,
+    -1.2634366337306293,
+    -1.32085440230406,
+    -1.379985946039564,
+    -1.440856467513054,
+    -1.5034911693004436,
+    -1.5679152539776442,
+    -1.6341539241205694,
+    -1.702232382305132,
+    -1.7721758311072449,
+    -1.8440094731028218,
+    -1.917758510867774,
+    -1.9934481469780145,
+    -2.0711035840094567,
+    -2.1507500245380142,
+    -2.232412671139598,
+    -2.3161167263901223,
+    -2.4018873928654996,
+    -2.4897498731416423,
+    -2.579729369794465,
+    -2.6718510853998785,
+    -2.766140222533796,
+    -2.8626219837721307,
+    -2.9613215716907955,
+    -3.0622641888657043,
+    -3.165475037872768,
+    -3.2709793212879,
+    -3.378802241687013,
+    -3.488969001646022,
+    -3.601504803740837,
+    -3.7164348505473717,
+    -3.8337843446415385,
+    -3.953578488599251,
+    -4.075842484996424,
+    -4.200601536408967,
+    -4.327880845412795,
+    -4.457705614583817,
+    -4.590101046497952,
+    -4.725092343731107,
+    -4.862704708859201,
+    -5.002963344458142,
+    -5.145893453103842,
+    -5.291520237372219,
+    -5.439868899839179,
+    -5.590964643080643,
+    -5.744832669672519,
+    -5.901498182190717,
+    -6.060986383211157,
+    -6.223322475309744,
+    -6.388531661062399,
+    -6.556639143045031,
+    -6.727670123833548,
+    -6.901649806003871,
+    -7.078603392131909,
+    -7.258556084793572,
+    -7.44153308656478,
+    -7.627559600021439,
+    -7.816660827739468,
+    -8.008861972294778,
+    -8.204188236263272,
+    -8.402664822220878,
+    -8.604316932743497,
+    -8.80916977040705,
+    -9.017248537787449,
+    -9.228578437460602,
+    -9.443184672002428,
+    -9.66109244398883,
+    -9.882326955995731,
+    -10.106913410599041,
+    -10.334877010374667,
+    -10.56624295789853,
+    -10.801036455746535,
+    -11.039282706494603,
+    -11.281006912718645,
+    -11.526234276994566,
+    -11.774990001898292,
+    -12.027299290005727,
+    -12.28318734389278,
+    -12.542679366135376,
+    -12.805800559309416,
+    -13.072576125990821,
+    -13.343031268755505,
+    -13.617191190179367,
+    -13.895081092838337,
+    -14.17672617930831,
+    -14.462151652165224,
+    -14.751382713984972,
+    -15.044444567343467,
+    -15.341362414816627,
+    -15.642161458980363,
+    -15.946866902410594,
+    -16.25550394768323,
+    -16.568097797374175,
+    -16.88467365405936,
+    -17.20525672031468,
+    -17.529872198716053,
+    -17.858266674988755,
+    -18.190743968559328,
+    -18.52705066515306,
+    -18.867490584196496,
+    -19.212367545116187,
+    -19.561149516786774,
+    -19.9141403186348,
+    -20.271086536385543,
+    -20.632570606316204,
+    -20.99778188045075,
+    -21.367302795066397,
+    -21.742273020141624,
+    -22.121324673999137,
+    -22.50448295921484,
+    -22.892330312065923,
+    -23.28489193512832,
+    -23.68191441412729,
+    -24.082865717937462,
+    -24.48832828283603,
+    -24.898884545100188,
+    -25.31288800620201,
+    -25.73064248556803,
+    -26.153566270027376,
+    -26.58084871160405,
+    -27.012515012873955,
+    -27.449147610114295,
+    -27.88993585534905,
+    -28.335183568004766,
+    -28.78519456750802,
+    -29.239436822733413,
+    -29.69877138680881,
+    -30.16322346231012,
+    -30.63198240126131,
+    -31.10479478938767,
+    -31.58196444611574,
+    -32.06435242457338,
+    -32.55059084308327,
+    -33.040983521071965,
+    -33.537227362219255,
+    -34.03934756910104,
+    -34.54541902633873,
+    -35.05435246910564,
+    -35.5697951190361,
+    -36.09093632815407,
+    -36.615293747379674,
+    -37.14512151409396,
+    -37.68128068142475,
+    -38.222681984545446,
+    -38.76684307437612,
+    -39.31490362089527,
+    -39.87078946258784,
+    -40.430067932419384,
+    -40.992206999264596,
+    -41.55973941735516,
+    -42.1340834735202,
+    -42.714985753484996,
+    -43.30052114187092,
+    -43.88904314015006,
+    -44.47806939924253,
+    -45.074311926139686,
+    -45.67668145601487,
+    -46.283810107190746,
+    -46.899345101301655,
+    -47.518017920761245,
+    -48.1384606838922,
+    -48.76654954713397,
+    -49.399523544556,
+    -50.0346217102278,
+    -50.6757698826343,
+    -51.31992847899431,
+    -51.96294344912408,
+    -52.61096956631367,
+    -53.26765405219743,
+    -53.92354913642933,
+    -54.58313789119559,
+    -55.25368955718887,
+    -55.92937838312157,
+    -56.60772201991377,
+    -57.28986013754402,
+    -57.97748963969206,
+    -58.671192962635075,
+    -59.36932360784515,
+    -60.06689167458656,
+    -60.770330553000086,
+    -61.477436510856464,
+    -62.183498264270646,
+    -62.89244165172759,
+    -63.61042144651732,
+    -64.33439806585875,
+    -65.05743129106162,
+    -65.78734759651991,
+    -66.52305771740696,
+    -67.26235792149346,
+    -68.00778096301123,
+    -68.74486396830262,
+    -69.47920447695647,
+    -70.22447991723021,
+    -70.97179975247913,
+    -71.72704013914273,
+    -72.49106213034882,
+    -73.24996008614112,
+    -74.00654537760197,
+    -74.77170926448235,
+    -75.53906876179347,
+    -76.30419120250089,
+    -77.06849487343372,
+    -77.8300546592134,
+    -78.59781150163639,
+    -79.37151198642803,
+    -80.14839514765777,
+    -80.9335012912131,
+    -81.7271342365206,
+    -82.51873174583166,
+    -83.31166242392999,
+    -84.11263827780692,
+    -84.9021813304933,
+    -85.69006837433757,
+    -86.47771769616887,
+    -87.25735322674502,
+    -88.04543856283004,
+    -88.83642656998688,
+    -89.63257138559666,
+    -90.43891331554686,
+    -91.22900896160216,
+    -92.0031621431892,
+    -92.78090124242894,
+    -93.55445019007927,
+    -94.3277348246251,
+    -95.10690991935645,
+    -95.88559248928456,
+    -96.65544923146595,
+    -97.42597832139843,
+    -98.19999113016438,
+    -98.95856691449583,
+    -99.70117364326752,
+    -100.45709128837292,
+    -101.2188223974206,
+    -101.96382420808423,
+    -102.71162510248486,
+    -103.4692157044645,
+    -104.22519792572265,
+    -104.97513909922493,
+    -105.70624805241762,
+    -106.42050030583111,
+    -107.14271796174867,
+    -107.86428910037624,
+    -108.56824329640048,
+    -109.26937244548137,
+    -109.98051812532445,
+    -110.6705004512336,
+    -111.3215131473434,
+    -111.97314500902127,
+    -112.61761996702508,
+    -113.23573866123628,
+    -113.84563638952271,
+    -114.44622388705764,
+    -115.04978549784536,
+    -115.67306343550042,
+    -116.2862708995798,
+    -116.874109165874,
+    -117.4368820538096,
+    -117.97377891541056,
+    -118.5110149372133,
+    -119.01936055247619,
+    -119.51778690961885,
+    -120.00938399657434,
+    -120.49891350237951,
+    -120.99893838788923,
+    -121.45348186869998,
+    -121.862290530537,
+    -122.27804816074799,
+    -122.69994411135684,
+    -123.0915047775052,
+    -123.45442706287274,
+    -123.79263680594447,
+    -124.13123472585421,
+    -124.45213592988607,
+    -124.74617126454466,
+    -125.0278540086394,
+    -125.29358734568781,
+    -125.54033169290877,
+    -125.76170406531334,
+    -125.96135168453581,
+    -126.13790666889889,
+    -126.30030996019907,
+    -126.42267539390238,
+    -126.54180559686976,
+    -126.66051194018357,
+    -126.77464037366003,
+    -126.8705638741935,
+    -126.90679373361397,
+    -126.89756461388016,
+    -126.8813508429569,
+    -126.86597889523809,
+    -126.81720410067044,
+    -126.72725039001182,
+    -126.59168509622785,
+    -126.44591776192624,
+    -126.29972517945546,
+    -126.13502245609952,
+    -125.96381531901208,
+    -125.77247674508745,
+    -125.48079028391605,
+    -125.1915907559615,
+    -124.94669589139626,
+    -124.67006849257046,
+    -124.39628225153986,
+    -124.1211831181207,
+    -123.81916354462965,
+    -123.48105437757137,
+    -123.13418527088493,
+    -122.78638269896419,
+    -122.46191153039116,
+    -122.11008870092452,
+    -121.66769338804396,
+    -121.19799681942165,
+    -120.72414939623691,
+    -120.21441400009225,
+    -119.64624786866138,
+    -119.05366746029885,
+    -118.46316657839172,
+    -117.85526724597082,
+    -117.2272084971056,
+    -116.56006958852825,
+    -115.881737407879,
+    -115.1888937555261,
+    -114.48657893735701,
+    -113.76116593026612,
+    -113.00404281445935,
+    -112.25869902121309,
+    -111.47417286943544,
+    -110.69952612741558,
+    -109.95261547617069,
+    -109.19223082438138,
+    -108.42870619809734,
+    -107.64925042476494,
+    -106.82017606803207,
+    -105.96825554813653,
+    -105.14505818502334,
+    -104.33249908597661,
+    -103.50608517071552,
+    -102.67141397882888,
+    -101.81736603886685,
+    -100.92864262662,
+    -100.01390606703404,
+    -99.05339976628925,
+    -98.04464137530572,
+    -97.07430593720969,
+    -96.07889401263022,
+    -95.04617166271488,
+    -94.03662394662933,
+    -93.05696287136497,
+    -92.15374265355526,
+    -91.23532355191428,
+    -90.29337226349848,
+    -89.35103918948728,
+    -88.43091749735883,
+    -87.5104644247868,
+    -86.5311956357119,
+    -85.5569395915075,
+    -84.61530456296329,
+    -83.68124023609721,
+    -82.72245225881048,
+    -81.73478658091942,
+    -80.76173263370022,
+    -79.8194753970663,
+    -78.81665374658228,
+    -77.82406156488764,
+    -76.88240211475238,
+    -75.89892118748791,
+    -74.8580414420341,
+    -73.78291327957028,
+    -72.75380355565788,
+    -71.77129470657408,
+    -70.76937974129227,
+    -69.75449204995296,
+    -68.75145373483952,
+    -67.79149508579994,
+    -66.85235195735866,
+    -65.86411672257991,
+    -64.88838890803193,
+    -63.96280699112762,
+    -63.04003130983337,
+    -62.098633569225484,
+    -61.1734660782105,
+    -60.25396659903969,
+    -59.337374165782606,
+    -58.3835931545224,
+    -57.42329662140582,
+    -56.51056143803376,
+    -55.61894420617094,
+    -54.72005120962757,
+    -53.78465288166194,
+    -52.820018462966715,
+    -51.80639135972216,
+    -50.856915215865506,
+    -49.92257866825938,
+    -48.954370353766365,
+    -48.04509488622682,
+    -47.10840624451702,
+    -46.14460824806353,
+    -45.25096338031701,
+    -44.367036987263624,
+    -43.47335109193422,
+    -42.563522709339985,
+    -41.609715356992204,
+    -40.701111629673015,
+    -39.828542373887075,
+    -38.971972378963905,
+    -38.140621203550694,
+    -37.34510149054781,
+    -36.51550561301953,
+    -35.672476420489396,
+    -34.80210827300115,
+    -33.928387422286086,
+    -33.13380965871082,
+    -32.377164890955804,
+    -31.621143663610727,
+    -30.80391823840851,
+    -29.94250944581436,
+    -29.112726271779355,
+    -28.328246144560996,
+    -27.488234966802032,
+    -26.606370166759937,
+    -25.770719871814148,
+    -24.998026295579287,
+    -24.265189442027662,
+    -23.550502399385035,
+    -22.79631668214402,
+    -22.050300974340622,
+    -21.327525788485545,
+    -20.614642718323783,
+    -19.904990162015796,
+    -19.15317877548251,
+    -18.432788609869885,
+    -17.80040408843463,
+    -17.190296837000545,
+    -16.603606525546162,
+    -16.082150884244022,
+    -15.56911727813863,
+    -15.063137825552717,
+    -14.545291783218344,
+    -13.95653758137491,
+    -13.388008132758964,
+    -12.903253281893264,
+    -12.394473510154446,
+    -11.885376452423145,
+    -11.401898678385164,
+    -10.911188602240449,
+    -10.49295584584914,
+    -10.113512972859182,
+    -9.657259192829201,
+    -9.164897768529151,
+    -8.736198735065525,
+    -8.345833161605624,
+    -7.973487220628358,
+    -7.613892394547391,
+    -7.256486445614132,
+    -6.893493304586493,
+    -6.5873483485846585,
+    -6.296841486289205,
+    -5.974911672517185,
+    -5.701825762830048,
+    -5.4366522827589945,
+    -5.1927900437108665,
+    -4.970821481962836,
+    -4.762134677720906,
+    -4.603253640995314,
+    -4.5184432403680015,
+    -4.479031142798576,
+    -4.462753202811412,
+    -4.45765409840472,
+    -4.4618087141998934,
+    -4.525114669038177,
+    -4.585744224652463,
+    -4.612238879495894,
+    -4.645301896338447,
+    -4.6799433744444,
+    -4.69111299983172,
+    -4.704468725335559,
+    -4.779938376420303,
+    -4.869067823649828,
+    -4.966031315736489,
+    -5.107074245839924,
+    -5.257116093354937,
+    -5.42788396858444,
+    -5.632776682935277,
+    -5.8113595823936155,
+    -6.003500079177478,
+    -6.165480530311633,
+    -6.31097836405356,
+    -6.481532693725143,
+    -6.639834063915977,
+    -6.772812685221718,
+    -6.908076828432046,
+    -7.097474430342646,
+    -7.342423777782666,
+    -7.627347529691918,
+    -7.938061429263525,
+    -8.277098230729177,
+    -8.645876220917977,
+    -9.057236977535524,
+    -9.456039566730146,
+    -9.792158157961856,
+    -10.175392992960333,
+    -10.585708861055084,
+    -10.979109502420311,
+    -11.389889992261056,
+    -11.717216233220192,
+    -12.112123760922659,
+    -12.63565486823542,
+    -13.12038603049732,
+    -13.605627426225057,
+    -14.135982954097617,
+    -14.66550603633465,
+    -15.203137614732668,
+    -15.713518551835792,
+    -16.251004336095463,
+    -16.854626529177857,
+    -17.452527186192693,
+    -18.02104907741113,
+    -18.59588036229151,
+    -19.209365798084484,
+    -19.790483290451697,
+    -20.35095994969613,
+    -20.968833696574034,
+    -21.64719451901839,
+    -22.327279464119176,
+    -22.98097343253736,
+    -23.61666013236812,
+    -24.210125100181354,
+    -24.83801317248006,
+    -25.516230712326884,
+    -26.20050284304532,
+    -26.90172082438641,
+    -27.592605407562935,
+    -28.313302621643576,
+    -29.029010562873708,
+    -29.69573297142746,
+    -30.390950534359874,
+    -31.14199290560994,
+    -31.931053809312345,
+    -32.75397919528335,
+    -33.57568854291773,
+    -34.387012698720106,
+    -35.25261597461584,
+    -36.117078819902666,
+    -37.01608939403894,
+    -37.965832676937836,
+    -38.904759547183126,
+    -39.818685747967756,
+    -40.727975511964694,
+    -41.64352009892493,
+    -42.5355327084055,
+    -43.43468639655314,
+    -44.31286606402872,
+    -45.22665613408889,
+    -46.23877060070448,
+    -47.27595843473193,
+    -48.3209705940074,
+    -49.36185175652901,
+    -50.357949064678664,
+    -51.37002619447265,
+    -52.37526176673409,
+    -53.28118018962504,
+    -54.210398080004836,
+    -55.13062108577467,
+    -55.98420072142713,
+    -56.88483786460081,
+    -57.81389038887865,
+    -58.81066847277728,
+    -59.85597275617818,
+    -60.86317860110696,
+    -61.812808030594454,
+    -62.6968063585479,
+    -63.55114036127629,
+    -64.44158881810753,
+    -65.40161095369483,
+    -66.33928840990154,
+    -67.2070029078434,
+    -68.10814650168537,
+    -68.98924995867966,
+    -69.88377250347949,
+    -70.83687526846508,
+    -71.77809339299941,
+    -72.71859675368414,
+    -73.65144513182909,
+    -74.570534159296,
+    -75.47087393534922,
+    -76.3845306003886,
+    -77.27447331585458,
+    -78.12540335753755,
+    -79.01591587989509,
+    -79.95578767527562,
+    -80.87260356508759,
+    -81.69729177294721,
+    -82.52822924970776,
+    -83.38717331229535,
+    -84.16883199374244,
+    -84.90610728500091,
+    -85.6483395712108,
+    -86.41923648725266,
+    -87.2129722818389,
+    -88.0368161956622,
+    -88.859031110325,
+    -89.65205916018952,
+    -90.48836592899907,
+    -91.36156843176478,
+    -92.18197724515518,
+    -93.00339062392038,
+    -93.8197041999223,
+    -94.62509222187323,
+    -95.41345032163497,
+    -96.13911053827773,
+    -96.78649553074139,
+    -97.31160903920012,
+    -97.85044128934412,
+    -98.48325913673477,
+    -99.13235368261832,
+    -99.8325772359011,
+    -100.55247129503637,
+    -101.20485398834845,
+    -101.88559471503473,
+    -102.53286573682819,
+    -103.21021689825155,
+    -103.93076839386104,
+    -104.51873819347615,
+    -105.05049251674927,
+    -105.57760068362545,
+    -106.1346363861605,
+    -106.58510257011464,
+    -106.90171998670081,
+    -107.29264062592596,
+    -107.71080344260717,
+    -108.09883856808767,
+    -108.4759957676378,
+    -108.89997393191685,
+    -109.33708562457272,
+    -109.80045104016165,
+    -110.23855126389037,
+    -110.57924973401798,
+    -110.94934232016348,
+    -111.28226479759883,
+    -111.59392352938664,
+    -111.95929165092608,
+    -112.27307719524964,
+    -112.56149534889374,
+    -112.8889318069331,
+    -113.19355883110062,
+    -113.47623747452415,
+    -113.75900367098048,
+    -114.04048953879233,
+    -114.33130772086008,
+    -114.64374256118796,
+    -114.92627514498275,
+    -115.11986390248383,
+    -115.27886432214267,
+    -115.42001861757387,
+    -115.56675580680742,
+    -115.73442501920464,
+    -115.84782490766757,
+    -115.97858520538763,
+    -116.15459280000516,
+    -116.34355333942135,
+    -116.46330005527213,
+    -116.48265306286125,
+    -116.57633033011847,
+    -116.73181930134069,
+    -116.80621473472348,
+    -116.79536258008304,
+    -116.73049312726745,
+    -116.59881520372299,
+    -116.48143151556296,
+    -116.38561130348003,
+    -116.23253120131785,
+    -116.10747316794946,
+    -116.07788768380652,
+    -116.02705949104522,
+    -115.86446331578207,
+    -115.67928175279913,
+    -115.54565208694358,
+    -115.3922736070265,
+    -115.1896381294555,
+    -114.98820050677308,
+    -114.75288021837402,
+    -114.4452533414453,
+    -114.21858434641712,
+    -114.02664803865844,
+    -113.76861032081206,
+    -113.51080720590714,
+    -113.26022931778571,
+    -113.03138993525724,
+    -112.81456267112495,
+    -112.59612050228333,
+    -112.32287281283523,
+    -112.05697636305018,
+    -111.7945557195951,
+    -111.53953672095491,
+    -111.19637898993457,
+    -110.78321782440192,
+    -110.36694647108742,
+    -109.81803329701754,
+    -109.20560048372784,
+    -108.68096218369395,
+    -108.26253231163435,
+    -107.81548551441323,
+    -107.3515489023335,
+    -106.89443011027585,
+    -106.42632286237503,
+    -106.06928654178895,
+    -105.67345048544706,
+    -105.14828941946598,
+    -104.62533569992561,
+    -104.01657160459831,
+    -103.37635262193558,
+    -102.80723495555038,
+    -102.19974738571548,
+    -101.52688928049437,
+    -100.91044140619435,
+    -100.3607377888652,
+    -99.81372175543467,
+    -99.29087200597831,
+    -98.79806469693558,
+    -98.27848719335091,
+    -97.72909991244316,
+    -97.13181796149642,
+    -96.41004690915948,
+    -95.60086799914389,
+    -94.80349403285486,
+    -94.10571452082117,
+    -93.42731301263323,
+    -92.70395421836822,
+    -91.98219235465963,
+    -91.1344461064883,
+    -90.32596046886212,
+    -89.68464577880263,
+    -88.89875498301502,
+    -88.02738005641179,
+    -87.30709190776561,
+    -86.57938275163602,
+    -85.85012874446225,
+    -85.11601168661274,
+    -84.31771139147594,
+    -83.50512547789336,
+    -82.73121635006297,
+    -81.96173933793177,
+    -81.17247997806935,
+    -80.3913251581163,
+    -79.55895469146124,
+    -78.72749513175033,
+    -77.86214457522932,
+    -76.91333442505912,
+    -76.01621905637838,
+    -75.24354266978075,
+    -74.48945606459773,
+    -73.73308817960664,
+    -72.96331954335791,
+    -72.21249491310189,
+    -71.49317724969372,
+    -70.77836592119672,
+    -70.07031506499185,
+    -69.28240004310497,
+    -68.41548190866364,
+    -67.54369794651537,
+    -66.6835117534238,
+    -65.86671085293855,
+    -65.03007442253906,
+    -64.17502074905472,
+    -63.33500905713862,
+    -62.527896027807714,
+    -61.81277363597475,
+    -61.08017066191227,
+    -60.39057216478618,
+    -59.68967306129657,
+    -58.90394370544957,
+    -58.06907225670327,
+    -57.27089790763224,
+    -56.55541764116836,
+    -55.817339490344374,
+    -55.10823277510521,
+    -54.40053962981287,
+    -53.72298279265989,
+    -53.00091815024931,
+    -52.315727025545364,
+    -51.72789447771348,
+    -51.101759303066146,
+    -50.43734670417904,
+    -49.709606367070364,
+    -49.058707770189834,
+    -48.39663319130975,
+    -47.62561331843022,
+    -46.83510936318361,
+    -46.033783650516085,
+    -45.279056454235956,
+    -44.53473278633568,
+    -43.79972338198833,
+    -43.05343579682243,
+    -42.25772472487537,
+    -41.56167538381789,
+    -40.844393263046285,
+    -40.0930871900067,
+    -39.43093101525996,
+    -38.75541894034474,
+    -38.09666678770674,
+    -37.54190683417326,
+    -36.97470243875115,
+    -36.357186912328565,
+    -35.72727734916921,
+    -35.119547441328656,
+    -34.6566138056664,
+    -34.26299647823371,
+    -33.81167137771275,
+    -33.33526187820494,
+    -32.859147315694635,
+    -32.39895543639396,
+    -31.932422094827174,
+    -31.48827002918667,
+    -31.066803058898856,
+    -30.605078978294234,
+    -30.16692624874613,
+    -29.823695986595247,
+    -29.499072377341214,
+    -29.20924040089713,
+    -28.930264210683642,
+    -28.612296593011276,
+    -28.37071012662268,
+    -28.191599171561485,
+    -28.020658644528087,
+    -27.848440775176424,
+    -27.728743818256778,
+    -27.568534948229914,
+    -27.337191514100873,
+    -27.071794759581305,
+    -26.781564243318282,
+    -26.536457997399463,
+    -26.277991685765425,
+    -25.962726282291673,
+    -25.67872991435759,
+    -25.485930407427627,
+    -25.270677289014856,
+    -25.055842343448074,
+    -24.942588690086925,
+    -24.884969751151058,
+    -24.8621144654181,
+    -24.811080627218413,
+    -24.808234456204357,
+    -24.792305447810165,
+    -24.750781046332772,
+    -24.820208711163676,
+    -24.81199003699275,
+    -24.745374789090377,
+    -24.728212891231692,
+    -24.719851485798586,
+    -24.664592405238153,
+    -24.62375655926801,
+    -24.597926384165348,
+    -24.635327797667504,
+    -24.723169627220777,
+    -24.70517302218975,
+    -24.765250306575425,
+    -24.871107128278968,
+    -24.914108118125153,
+    -24.99402331122046,
+    -25.089981646342473,
+    -25.14015538522415,
+    -25.171316948103215,
+    -25.247573413203728,
+    -25.39653305131534,
+    -25.633823608650086,
+    -25.921857012946834,
+    -26.24059805353518,
+    -26.57279768825116,
+    -26.78669534931596,
+    -26.944169180148545,
+    -27.156133889881097,
+    -27.35602525378567,
+    -27.53383826781491,
+    -27.823891456555238,
+    -28.191382916251975,
+    -28.607083080163545,
+    -29.130641156903497,
+    -29.63363998090095,
+    -30.114433053628023,
+    -30.620410442269975,
+    -31.108133120702348,
+    -31.55700864455331,
+    -32.011919529352596,
+    -32.47651299673432,
+    -32.91710161034664,
+    -33.454630285944816,
+    -33.9668114286722,
+    -34.388752514904475,
+    -34.81632294383918,
+    -35.23589569237074,
+    -35.72049357794365,
+    -36.26902733573142,
+    -36.818554760064245,
+    -37.40002752393969,
+    -37.948831720584074,
+    -38.4435390550739,
+    -38.95577926060041,
+    -39.41257992487089,
+    -39.8967154551026,
+    -40.474243247473936,
+    -41.03875686761495,
+    -41.62315830647736,
+    -42.19459597826128,
+    -42.711859791647136,
+    -43.27973488505316,
+    -43.92638676297011,
+    -44.587480135475374,
+    -45.27975721618326,
+    -45.999342571760764,
+    -46.761585331569385,
+    -47.48097532503703,
+    -48.10042130035783,
+    -48.74031093958571,
+    -49.40122667899809,
+    -50.070377346041035,
+    -50.702930830336975,
+    -51.243188964332816,
+    -51.740213516318015,
+    -52.32553684237228,
+    -52.92952993241061,
+    -53.532436192613304,
+    -54.188889728282284,
+    -54.85963076605288,
+    -55.51626558973508,
+    -56.13012186628868,
+    -56.736330521470535,
+    -57.41432256029034,
+    -58.16913828863534,
+    -58.904680095609386,
+    -59.58391714265287,
+    -60.253403646399,
+    -60.956071804423125,
+    -61.70364872702795,
+    -62.50396088860769,
+    -63.26258237936965,
+    -63.9541842684814,
+    -64.62810694108259,
+    -65.35375119555977,
+    -66.12556989747569,
+    -66.80790184314277,
+    -67.55206118503675,
+    -68.43524999336167,
+    -69.33350897215715,
+    -70.13597381744246,
+    -70.89393523231234,
+    -71.68515252067208,
+    -72.53500501850647,
+    -73.36689829446404,
+    -74.21847082595778,
+    -75.09086228296636,
+    -75.86930772560002,
+    -76.60119722104447,
+    -77.29463586054398,
+    -78.09397237530843,
+    -78.89642235002572,
+    -79.67777132126606,
+    -80.44500991287119,
+    -81.19036205559922,
+    -82.02390660803025,
+    -82.77487664329547,
+    -83.426023119231,
+    -84.1060922234101,
+    -84.7696946117539,
+    -85.3998598589488,
+    -85.99020498000615,
+    -86.50286328581402,
+    -87.04484884959587,
+    -87.68194045067939,
+    -88.34032982622003,
+    -88.99496666223553,
+    -89.6762453980221,
+    -90.37806166544162,
+    -90.96196809229964,
+    -91.48371325130117,
+    -91.98595072317039,
+    -92.44251572652291,
+    -92.89745492633622,
+    -93.42323390635383,
+    -93.9794784258081,
+    -94.44668705834874,
+    -94.93326696145229,
+    -95.46236853629794,
+    -95.90696770156808,
+    -96.2943941112016,
+    -96.72302471605188,
+    -97.12740975879336,
+    -97.53794367872231,
+    -98.04130151896477,
+    -98.48733399959966,
+    -98.83733858096323,
+    -99.18467711059725,
+    -99.4817313096175,
+    -99.74189998943073,
+    -100.05018649205942,
+    -100.40800910433255,
+    -100.71091170983463,
+    -100.93189367662903,
+    -101.2016515102438,
+    -101.54890794887105,
+    -101.89623271060775,
+    -102.29909575130802,
+    -102.7527857870867,
+    -103.18321593824854,
+    -103.53886729000011,
+    -103.83703928965748,
+    -104.17415857011916,
+    -104.4914621784754,
+    -104.79259733636033,
+    -105.12049624134913,
+    -105.38741978806476,
+    -105.64103666054329,
+    -105.85546069425082,
+    -106.0861618450413,
+    -106.32619989422466,
+    -106.44520735827531,
+    -106.52790896236499,
+    -106.59216138751083,
+    -106.71126606800813,
+    -106.97329113123628,
+    -107.21527092214451,
+    -107.56567301145556,
+    -107.96517721255817,
+    -108.21236874501268,
+    -108.42791390772379,
+    -108.54942772872322,
+    -108.68253119698088,
+    -108.81554760734575,
+    -108.96828395878937,
+    -109.19871775882167,
+    -109.3472267545995,
+    -109.48878408152203,
+    -109.52199840853075,
+    -109.52072840362221,
+    -109.67195117615454,
+    -109.84251307409572,
+    -109.81121752061036,
+    -109.64662946353276,
+    -109.55773674342191,
+    -109.48689087477038,
+    -109.48677564492579,
+    -109.57385465065211,
+    -109.64116422387784,
+    -109.66281820006911,
+    -109.66781793426874,
+    -109.60854514759252,
+    -109.54242011384903,
+    -109.47531898947778,
+    -109.35655871023738,
+    -109.28590931123436,
+    -109.27370481851844,
+    -109.16422361515548,
+    -109.03522500505122,
+    -109.0539043011678,
+    -109.04113607111714,
+    -108.96406872909915,
+    -108.90993455194129,
+    -108.90578457673192,
+    -108.85412810832162,
+    -108.72712866422185,
+    -108.6290141491494,
+    -108.46898067237024,
+    -108.23145089282421,
+    -108.01062250860484,
+    -107.8093068907946,
+    -107.66486389995563,
+    -107.54472056713854,
+    -107.49961036173639,
+    -107.3894142104512,
+    -107.17236478826221,
+    -107.01426432387863,
+    -106.89145558757158,
+    -106.77164422724226,
+    -106.52697031102102,
+    -106.23045665635235,
+    -105.94453864035665,
+    -105.62299106840273,
+    -105.3725493968633,
+    -105.24896219844304,
+    -105.07059648909795,
+    -104.81936737611204,
+    -104.66135570504512,
+    -104.5667746754542,
+    -104.34284662926946,
+    -104.05562896266953,
+    -103.72437144092466,
+    -103.32068034784518,
+    -102.98667547983534,
+    -102.64799134034922,
+    -102.22496871267845,
+    -101.85081165400686,
+    -101.52387366580642,
+    -101.1881779636737,
+    -100.96857009927305,
+    -100.86981176164134,
+    -100.80778586446006,
+    -100.6788721418654,
+    -100.52488832403,
+    -100.36006907291257,
+    -100.15769237342722,
+    -99.95651117038933,
+    -99.73147514981694,
+    -99.6118877329847,
+    -99.59136593490379,
+    -99.48381890191986,
+    -99.31351150261484,
+    -99.1570885734918,
+    -98.96108088180296,
+    -98.70461736632596,
+    -98.31361114736534,
+    -97.85829887385941,
+    -97.42201218672652,
+    -96.97747183717962,
+    -96.54253450623575,
+    -96.00048493605091,
+    -95.3956484084536,
+    -94.81692890137494,
+    -94.23370376382024,
+    -93.67664605193605,
+    -93.17921499037575,
+    -92.83588689408344,
+    -92.52409555135178,
+    -92.0318387414164,
+    -91.46585192065007,
+    -90.90779502886731,
+    -90.3560215675401,
+    -89.85429958479563,
+    -89.44277510970237,
+    -89.01476309103974,
+    -88.52793897008561,
+    -88.03303621623327,
+    -87.52395046134426,
+    -86.95779991299553,
+    -86.42293131541695,
+    -86.00016875787139,
+    -85.66919841283764,
+    -85.37850136552244,
+    -85.05009010032143,
+    -84.68343258610919,
+    -84.31951070250642,
+    -83.93410998608285,
+    -83.50218012285654,
+    -83.10565966949267,
+    -82.68216365402299,
+    -82.09213023685068,
+    -81.54984097869685,
+    -81.11828849038312,
+    -80.6517813615984,
+    -80.16176808579519,
+    -79.69452426275613,
+    -79.14503654236452,
+    -78.64845929975846,
+    -78.30818458910294,
+    -77.94035049154864,
+    -77.43660025477115,
+    -76.90701273735068,
+    -76.40064970757639,
+    -75.90611307714796,
+    -75.56803019412544,
+    -75.24043103134736,
+    -74.86232370109848,
+    -74.46298817527246,
+    -74.01486658823131,
+    -73.52132754475883,
+    -73.02753217723519,
+    -72.57696991693666,
+    -72.17969617306255,
+    -71.74434982117734,
+    -71.28154350418158,
+    -70.78907348984588,
+    -70.22740138795484,
+    -69.6210706839409,
+    -69.00939155632096,
+    -68.51052275234382,
+    -68.08325418069023,
+    -67.60474101280202,
+    -67.11150725868939,
+    -66.58936866154556,
+    -66.04643031261494,
+    -65.44900477554573,
+    -64.80436129103036,
+    -64.17214906768281,
+    -63.60365880859725,
+    -63.15547493703056,
+    -62.810069793967884,
+    -62.44348408344871,
+    -62.04404110032179,
+    -61.630990609857434,
+    -61.1764961295673,
+    -60.88230146189343,
+    -60.65871718350447,
+    -60.34277763934948,
+    -59.906924963790736,
+    -59.40551464527959,
+    -59.029145812232606,
+    -58.66834724492252,
+    -58.35239891524286,
+    -58.047892003692304,
+    -57.671266657653476,
+    -57.38275276882272,
+    -57.007125540720736,
+    -56.506518284235945,
+    -56.10162074765424,
+    -55.774348038259795,
+    -55.435289349571676,
+    -55.10397306371095,
+    -54.74894067913075,
+    -54.422597366327956,
+    -54.16982564083232,
+    -53.832953567755126,
+    -53.50840777999522,
+    -53.28927150824351,
+    -53.0710886360845,
+    -52.84942649648371,
+    -52.708173964060975,
+    -52.597483825126886,
+    -52.51933160021191,
+    -52.54311808770228,
+    -52.53429655131285,
+    -52.593194259851366,
+    -52.72122950014702,
+    -52.85963931928978,
+    -53.054699317062514,
+    -53.1877439176667,
+    -53.17354156738123,
+    -53.1625705681298,
+    -53.204728538753564,
+    -53.21311222442755,
+    -53.1406605799688,
+    -52.99854348197897,
+    -52.87956554429849,
+    -52.87374521226125,
+    -53.0003322511376,
+    -53.08410186444842,
+    -53.1172779829515,
+    -53.2667773027586,
+    -53.39805308758451,
+    -53.5835709211726,
+    -53.870442253857696,
+    -54.19377456201553,
+    -54.605415782441945,
+    -54.95911727112461,
+    -55.30004016044387,
+    -55.65300655268286,
+    -55.963154130840714,
+    -56.238866603012575,
+    -56.628114719466375,
+    -56.976848564371934,
+    -57.10538547163966,
+    -57.24500262988012,
+    -57.466772538583356,
+    -57.78632294396144,
+    -58.126223564111136,
+    -58.413780603590375,
+    -58.80002959802404,
+    -59.256298214371824,
+    -59.63383025696558,
+    -60.10901539483896,
+    -60.6963669068015,
+    -61.20923670549736,
+    -61.636783936327554,
+    -61.99380049495196,
+    -62.3591601526789,
+    -62.88807769789287,
+    -63.47721148158102,
+    -64.10680490992331,
+    -64.72923970403576,
+    -65.26513526406056,
+    -65.80033078257202,
+    -66.38639557951531,
+    -66.98741328373309,
+    -67.47357364540134,
+    -67.96414987917143,
+    -68.46641122573621,
+    -68.89484751452368,
+    -69.34867154693919,
+    -69.79893237309153,
+    -70.29747792977649,
+    -70.90757944466624,
+    -71.53313930686434,
+    -72.13099710709707,
+    -72.73656238797193,
+    -73.24315009826836,
+    -73.82770714072105,
+    -74.56966452033969,
+    -75.31469370444312,
+    -76.05947649339979,
+    -76.71404484702735,
+    -77.27647364994733,
+    -77.87160845382425,
+    -78.61537907110176,
+    -79.4097375729293,
+    -80.17781091110476,
+    -80.90708652992534,
+    -81.63213812144653,
+    -82.41790861444461,
+    -83.21482941208056,
+    -84.0101093418008,
+    -84.86785548182952,
+    -85.7245683927955,
+    -86.49891715688688,
+    -87.17003071288102,
+    -87.79895135364508,
+    -88.44059180133164,
+    -89.05569228257605,
+    -89.57936027375392,
+    -90.08406135860882,
+    -90.66733663744189,
+    -91.33199748133558,
+    -92.04937155724959,
+    -92.66122969659375,
+    -93.17400528950903,
+    -93.70920048545194,
+    -94.32228524027677,
+    -95.02610113168885,
+    -95.65461771928044,
+    -96.31847109533294,
+    -97.0792607864148,
+    -97.8280728064999,
+    -98.57245501313164,
+    -99.25865955671176,
+    -99.95775893673014,
+    -100.72995959550211,
+    -101.40923109261946,
+    -101.95297025250976,
+    -102.47738550446732,
+    -102.89306604201148,
+    -103.434075222259,
+    -104.0887363400588,
+    -104.61384208737472,
+    -105.08826623551462,
+    -105.52512897903492,
+    -106.04648970109345,
+    -106.56154451095637,
+    -107.08090605152387,
+    -107.64973545517636,
+    -108.07163304478553,
+    -108.59180685149425,
+    -109.26934885021474,
+    -109.97528464167486,
+    -110.76619864913137,
+    -111.60784620253071,
+    -112.29574773607631,
+    -112.7078942717618,
+    -113.21737897517562,
+    -113.82617736684799,
+    -114.39612069143564,
+    -115.03199408735641,
+    -115.68840821053145,
+    -116.28291767574581,
+    -116.81164704966648,
+    -117.22029124899389,
+    -117.70223557065074,
+    -118.31322858734198,
+    -118.78303715651853,
+    -119.16685261718403,
+    -119.60568029834015,
+    -120.03379182581092,
+    -120.56683839518941,
+    -121.18506341265582,
+    -121.53799208267601,
+    -121.64069491776053,
+    -121.72667804132506,
+    -121.77924964490683,
+    -121.93690750585188,
+    -122.28994868634472,
+    -122.69184592552261,
+    -123.14262442596134,
+    -123.5615105035502,
+    -124.04409494063583,
+    -124.654763432293,
+    -125.15142313788806,
+    -125.52629798817868,
+    -125.84572399619425,
+    -126.08492946480322,
+    -126.40609460365646,
+    -126.87583404263364,
+    -127.34399850181374,
+    -127.67687709546333,
+    -127.99541473933795,
+    -128.36873361497328,
+    -128.74949406033562,
+    -129.10595895702758,
+    -129.45459190181296,
+    -129.75585450447633,
+    -130.0295537639892,
+    -130.35400621795864,
+    -130.75124780016128,
+    -131.15917215547952,
+    -131.3719066338632,
+    -131.5778214289237,
+    -131.92070803816927,
+    -132.20918188778333,
+    -132.41707819638123,
+    -132.52519760384448,
+    -132.6112994140787,
+    -132.71887305836017,
+    -132.75237815949404,
+    -132.92442457709757,
+    -133.2381022991037,
+    -133.43460147384013,
+    -133.58360151654364,
+    -133.71549686651048,
+    -133.72750310842886,
+    -133.6881851901331,
+    -133.79677936240967,
+    -133.75296186284015,
+    -133.5288962089361,
+    -133.53668192537592,
+    -133.55456520162284,
+    -133.4716817336965,
+    -133.42207142933262,
+    -133.40548087425643,
+    -133.30630927802656,
+    -133.14102023740693,
+    -132.9444660613039,
+    -132.7888337166103,
+    -132.66634713408394,
+    -132.5544635513986,
+    -132.5362359926221,
+    -132.46012209358,
+    -132.39803020431435,
+    -132.32128799178474,
+    -132.1438280517181,
+    -132.09469863791975,
+    -131.97945039121598,
+    -131.7557587528849,
+    -131.65685122949142,
+    -131.52505588614696,
+    -131.47658115214603,
+    -131.54265731733662,
+    -131.54471618303185,
+    -131.39919789661437,
+    -131.1476415714061,
+    -130.93356008806464,
+    -130.7307886652053,
+    -130.64355520754495,
+    -130.59637975113492,
+    -130.4090223961844,
+    -130.23084697721458,
+    -130.03039499267857,
+    -129.80852749570414,
+    -129.67170132581333,
+    -129.4134865992548,
+    -129.10077656275897,
+    -128.834455718835,
+    -128.61761405541577,
+    -128.47173027257685,
+    -128.35420119474563,
+    -128.30405838358814,
+    -128.3433377728812,
+    -128.37789206968304,
+    -128.3617746962133,
+    -128.3248228580668,
+    -128.15645086811375,
+    -127.95280674240229,
+    -127.72840375974181,
+    -127.48131680475373,
+    -127.21017799576073,
+    -127.06267946618007,
+    -127.10710754699542,
+    -127.09106057409923,
+    -126.94630262165957,
+    -126.8040874289058,
+    -126.75248312321723,
+    -126.71238772158698,
+    -126.68187610863633,
+    -126.65484391622715,
+    -126.59593200690348,
+    -126.45417869957339,
+    -126.31820935531759,
+    -126.16492397810859,
+    -126.07542527405964,
+    -126.07760013081115,
+    -126.05501190736973,
+    -125.97146561572758,
+    -125.90304885868649,
+    -126.07351616988953,
+    -126.29594084513037,
+    -126.35386279403463,
+    -126.3208620677482,
+    -126.26048851079378,
+    -126.14295532272845,
+    -126.0125877853805,
+    -125.8903073651241,
+    -125.82545444709923,
+    -125.72778237427308,
+    -125.5688974304559,
+    -125.48116782227952,
+    -125.3077574654072,
+    -124.93640897160539,
+    -124.63545557062021,
+    -124.3806827990215,
+    -123.98655703685621,
+    -123.71110269039674,
+    -123.42088749076038,
+    -123.17695373081419,
+    -123.08185761417106,
+    -122.91691011565133,
+    -122.80277753415977,
+    -122.81471162194617,
+    -122.76885046016143,
+    -122.60448077794102,
+    -122.5091369183443,
+    -122.4881378041094,
+    -122.360129068043,
+    -122.18782470411588,
+    -122.14120619379685,
+    -121.99851972654916,
+    -121.72858541767658,
+    -121.41027703848731,
+    -121.0870840202577,
+    -120.89471797182738,
+    -120.71952842070937,
+    -120.68468921746435,
+    -120.78409599395405,
+    -120.7692477219799,
+    -120.4938957575296,
+    -120.31553072255551,
+    -120.35899816872197,
+    -120.33929826039609,
+    -120.31440850508773,
+    -120.22277978138047,
+    -120.08171153659016,
+    -119.9842870014078,
+    -119.81239783373626,
+    -119.60368251098834,
+    -119.54288920771702,
+    -119.45451451059246,
+    -119.45922471851938,
+    -119.64285902407217,
+    -119.68224708307953,
+    -119.58995185639643,
+    -119.54709949951737,
+    -119.5637454216415,
+    -119.54351339502185,
+    -119.49813052996141,
+    -119.52987441322246,
+    -119.47410768865021,
+    -119.37905627398206,
+    -119.40634314516747,
+    -119.61199549176176,
+    -119.82106713413651,
+    -119.90263335506476,
+    -120.12614185169528,
+    -120.33698547449656,
+    -120.29502170078935,
+    -120.28390768710518,
+    -120.16686776235375,
+    -119.96538062661055,
+    -119.92799771322599,
+    -119.8911961334479,
+    -119.97397048507726,
+    -120.14681258452164,
+    -120.28297696731397,
+    -120.38694670564045
+  ]
+}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/nernst_einstein_ionic_conductivity.json b/CI/integration_tests/calculators/data/nernst_einstein_ionic_conductivity.json
new file mode 100644
index 00000000..1cb02578
--- /dev/null
+++ b/CI/integration_tests/calculators/data/nernst_einstein_ionic_conductivity.json
@@ -0,0 +1,1 @@
+{"x": [1.780223204577946e-05], "uncertainty": [1.7053935949942446e-07]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/potential_of_mean_force.json b/CI/integration_tests/calculators/data/potential_of_mean_force.json
new file mode 100644
index 00000000..1c40623f
--- /dev/null
+++ b/CI/integration_tests/calculators/data/potential_of_mean_force.json
@@ -0,0 +1,1 @@
+{"x": [9.050819353507031e-20], "uncertainty": [6.991180350494913e-23]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/radial_distribution_function.json b/CI/integration_tests/calculators/data/radial_distribution_function.json
new file mode 100644
index 00000000..5f652326
--- /dev/null
+++ b/CI/integration_tests/calculators/data/radial_distribution_function.json
@@ -0,0 +1,3250 @@
+{
+  "x": [
+    0.0,
+    0.010009253547193089,
+    0.020018507094386177,
+    0.030027760641579266,
+    0.040037014188772355,
+    0.05004626773596545,
+    0.06005552128315853,
+    0.07006477483035162,
+    0.08007402837754471,
+    0.0900832819247378,
+    0.1000925354719309,
+    0.11010178901912397,
+    0.12011104256631706,
+    0.13012029611351014,
+    0.14012954966070323,
+    0.15013880320789633,
+    0.16014805675508942,
+    0.1701573103022825,
+    0.1801665638494756,
+    0.1901758173966687,
+    0.2001850709438618,
+    0.21019432449105485,
+    0.22020357803824794,
+    0.23021283158544104,
+    0.24022208513263413,
+    0.2502313386798272,
+    0.2602405922270203,
+    0.2702498457742134,
+    0.28025909932140647,
+    0.2902683528685996,
+    0.30027760641579265,
+    0.3102868599629858,
+    0.32029611351017884,
+    0.3303053670573719,
+    0.340314620604565,
+    0.3503238741517581,
+    0.3603331276989512,
+    0.37034238124614427,
+    0.3803516347933374,
+    0.39036088834053045,
+    0.4003701418877236,
+    0.41037939543491664,
+    0.4203886489821097,
+    0.4303979025293028,
+    0.4404071560764959,
+    0.450416409623689,
+    0.46042566317088207,
+    0.4704349167180752,
+    0.48044417026526826,
+    0.4904534238124613,
+    0.5004626773596544,
+    0.5104719309068475,
+    0.5204811844540406,
+    0.5304904380012337,
+    0.5404996915484268,
+    0.5505089450956199,
+    0.5605181986428129,
+    0.570527452190006,
+    0.5805367057371992,
+    0.5905459592843922,
+    0.6005552128315853,
+    0.6105644663787784,
+    0.6205737199259715,
+    0.6305829734731646,
+    0.6405922270203577,
+    0.6506014805675507,
+    0.6606107341147438,
+    0.670619987661937,
+    0.68062924120913,
+    0.6906384947563231,
+    0.7006477483035162,
+    0.7106570018507093,
+    0.7206662553979024,
+    0.7306755089450955,
+    0.7406847624922885,
+    0.7506940160394816,
+    0.7607032695866748,
+    0.7707125231338678,
+    0.7807217766810609,
+    0.790731030228254,
+    0.8007402837754471,
+    0.8107495373226402,
+    0.8207587908698333,
+    0.8307680444170263,
+    0.8407772979642194,
+    0.8507865515114126,
+    0.8607958050586056,
+    0.8708050586057987,
+    0.8808143121529918,
+    0.8908235657001848,
+    0.900832819247378,
+    0.9108420727945711,
+    0.9208513263417641,
+    0.9308605798889572,
+    0.9408698334361504,
+    0.9508790869833434,
+    0.9608883405305365,
+    0.9708975940777296,
+    0.9809068476249226,
+    0.9909161011721158,
+    1.0009253547193089,
+    1.010934608266502,
+    1.020943861813695,
+    1.0309531153608882,
+    1.0409623689080811,
+    1.0509716224552743,
+    1.0609808760024675,
+    1.0709901295496604,
+    1.0809993830968536,
+    1.0910086366440466,
+    1.1010178901912397,
+    1.111027143738433,
+    1.1210363972856259,
+    1.131045650832819,
+    1.141054904380012,
+    1.1510641579272052,
+    1.1610734114743984,
+    1.1710826650215913,
+    1.1810919185687845,
+    1.1911011721159777,
+    1.2011104256631706,
+    1.2111196792103638,
+    1.2211289327575567,
+    1.23113818630475,
+    1.241147439851943,
+    1.251156693399136,
+    1.2611659469463292,
+    1.2711752004935222,
+    1.2811844540407153,
+    1.2911937075879085,
+    1.3012029611351015,
+    1.3112122146822947,
+    1.3212214682294876,
+    1.3312307217766808,
+    1.341239975323874,
+    1.351249228871067,
+    1.36125848241826,
+    1.371267735965453,
+    1.3812769895126462,
+    1.3912862430598394,
+    1.4012954966070323,
+    1.4113047501542255,
+    1.4213140037014187,
+    1.4313232572486116,
+    1.4413325107958048,
+    1.4513417643429978,
+    1.461351017890191,
+    1.4713602714373841,
+    1.481369524984577,
+    1.4913787785317703,
+    1.5013880320789632,
+    1.5113972856261564,
+    1.5214065391733496,
+    1.5314157927205425,
+    1.5414250462677357,
+    1.5514342998149286,
+    1.5614435533621218,
+    1.571452806909315,
+    1.581462060456508,
+    1.5914713140037011,
+    1.6014805675508943,
+    1.6114898210980872,
+    1.6214990746452804,
+    1.6315083281924734,
+    1.6415175817396666,
+    1.6515268352868597,
+    1.6615360888340527,
+    1.6715453423812459,
+    1.6815545959284388,
+    1.691563849475632,
+    1.7015731030228252,
+    1.7115823565700181,
+    1.7215916101172113,
+    1.7316008636644042,
+    1.7416101172115974,
+    1.7516193707587906,
+    1.7616286243059835,
+    1.7716378778531767,
+    1.7816471314003697,
+    1.7916563849475629,
+    1.801665638494756,
+    1.811674892041949,
+    1.8216841455891422,
+    1.8316933991363353,
+    1.8417026526835283,
+    1.8517119062307215,
+    1.8617211597779144,
+    1.8717304133251076,
+    1.8817396668723008,
+    1.8917489204194937,
+    1.901758173966687,
+    1.9117674275138798,
+    1.921776681061073,
+    1.9317859346082662,
+    1.9417951881554592,
+    1.9518044417026523,
+    1.9618136952498453,
+    1.9718229487970385,
+    1.9818322023442316,
+    1.9918414558914246,
+    2.0018507094386178,
+    2.011859962985811,
+    2.021869216533004,
+    2.031878470080197,
+    2.04188772362739,
+    2.051896977174583,
+    2.0619062307217764,
+    2.0719154842689695,
+    2.0819247378161623,
+    2.0919339913633554,
+    2.1019432449105486,
+    2.111952498457742,
+    2.121961752004935,
+    2.1319710055521277,
+    2.141980259099321,
+    2.151989512646514,
+    2.1619987661937072,
+    2.1720080197409004,
+    2.182017273288093,
+    2.1920265268352863,
+    2.2020357803824795,
+    2.2120450339296727,
+    2.222054287476866,
+    2.2320635410240586,
+    2.2420727945712517,
+    2.252082048118445,
+    2.262091301665638,
+    2.2721005552128313,
+    2.282109808760024,
+    2.292119062307217,
+    2.3021283158544104,
+    2.3121375694016035,
+    2.3221468229487967,
+    2.3321560764959894,
+    2.3421653300431826,
+    2.352174583590376,
+    2.362183837137569,
+    2.372193090684762,
+    2.3822023442319553,
+    2.392211597779148,
+    2.4022208513263412,
+    2.4122301048735344,
+    2.4222393584207276,
+    2.4322486119679207,
+    2.4422578655151135,
+    2.4522671190623067,
+    2.4622763726095,
+    2.472285626156693,
+    2.482294879703886,
+    2.492304133251079,
+    2.502313386798272,
+    2.5123226403454653,
+    2.5223318938926584,
+    2.5323411474398516,
+    2.5423504009870443,
+    2.5523596545342375,
+    2.5623689080814307,
+    2.572378161628624,
+    2.582387415175817,
+    2.59239666872301,
+    2.602405922270203,
+    2.612415175817396,
+    2.6224244293645893,
+    2.6324336829117825,
+    2.642442936458975,
+    2.6524521900061684,
+    2.6624614435533616,
+    2.6724706971005547,
+    2.682479950647748,
+    2.6924892041949406,
+    2.702498457742134,
+    2.712507711289327,
+    2.72251696483652,
+    2.7325262183837133,
+    2.742535471930906,
+    2.7525447254780993,
+    2.7625539790252924,
+    2.7725632325724856,
+    2.782572486119679,
+    2.792581739666872,
+    2.8025909932140647,
+    2.812600246761258,
+    2.822609500308451,
+    2.832618753855644,
+    2.8426280074028374,
+    2.85263726095003,
+    2.8626465144972233,
+    2.8726557680444165,
+    2.8826650215916096,
+    2.892674275138803,
+    2.9026835286859956,
+    2.9126927822331887,
+    2.922702035780382,
+    2.932711289327575,
+    2.9427205428747683,
+    2.952729796421961,
+    2.962739049969154,
+    2.9727483035163473,
+    2.9827575570635405,
+    2.9927668106107337,
+    3.0027760641579264,
+    3.0127853177051196,
+    3.0227945712523128,
+    3.032803824799506,
+    3.042813078346699,
+    3.052822331893892,
+    3.062831585441085,
+    3.072840838988278,
+    3.0828500925354714,
+    3.0928593460826646,
+    3.1028685996298573,
+    3.1128778531770505,
+    3.1228871067242436,
+    3.132896360271437,
+    3.14290561381863,
+    3.1529148673658227,
+    3.162924120913016,
+    3.172933374460209,
+    3.1829426280074022,
+    3.1929518815545954,
+    3.2029611351017886,
+    3.2129703886489813,
+    3.2229796421961745,
+    3.2329888957433677,
+    3.242998149290561,
+    3.253007402837754,
+    3.2630166563849468,
+    3.27302590993214,
+    3.283035163479333,
+    3.2930444170265263,
+    3.3030536705737195,
+    3.313062924120912,
+    3.3230721776681054,
+    3.3330814312152985,
+    3.3430906847624917,
+    3.353099938309685,
+    3.3631091918568776,
+    3.373118445404071,
+    3.383127698951264,
+    3.393136952498457,
+    3.4031462060456503,
+    3.413155459592843,
+    3.4231647131400362,
+    3.4331739666872294,
+    3.4431832202344226,
+    3.4531924737816158,
+    3.4632017273288085,
+    3.4732109808760017,
+    3.483220234423195,
+    3.493229487970388,
+    3.503238741517581,
+    3.513247995064774,
+    3.523257248611967,
+    3.5332665021591603,
+    3.5432757557063534,
+    3.5532850092535466,
+    3.5632942628007394,
+    3.5733035163479325,
+    3.5833127698951257,
+    3.593322023442319,
+    3.603331276989512,
+    3.613340530536705,
+    3.623349784083898,
+    3.633359037631091,
+    3.6433682911782843,
+    3.6533775447254775,
+    3.6633867982726707,
+    3.6733960518198634,
+    3.6834053053670566,
+    3.6934145589142497,
+    3.703423812461443,
+    3.713433066008636,
+    3.723442319555829,
+    3.733451573103022,
+    3.743460826650215,
+    3.7534700801974084,
+    3.7634793337446015,
+    3.7734885872917943,
+    3.7834978408389874,
+    3.7935070943861806,
+    3.803516347933374,
+    3.813525601480567,
+    3.8235348550277597,
+    3.833544108574953,
+    3.843553362122146,
+    3.853562615669339,
+    3.8635718692165324,
+    3.873581122763725,
+    3.8835903763109183,
+    3.8935996298581115,
+    3.9036088834053047,
+    3.913618136952498,
+    3.9236273904996906,
+    3.9336366440468837,
+    3.943645897594077,
+    3.95365515114127,
+    3.9636644046884633,
+    3.973673658235656,
+    3.983682911782849,
+    3.9936921653300423,
+    4.0037014188772355,
+    4.013710672424429,
+    4.023719925971622,
+    4.033729179518815,
+    4.043738433066008,
+    4.0537476866132005,
+    4.063756940160394,
+    4.073766193707587,
+    4.08377544725478,
+    4.093784700801973,
+    4.103793954349166,
+    4.11380320789636,
+    4.123812461443553,
+    4.133821714990746,
+    4.143830968537939,
+    4.153840222085131,
+    4.1638494756323245,
+    4.173858729179518,
+    4.183867982726711,
+    4.193877236273904,
+    4.203886489821097,
+    4.21389574336829,
+    4.223904996915484,
+    4.233914250462677,
+    4.24392350400987,
+    4.253932757557062,
+    4.263942011104255,
+    4.273951264651449,
+    4.283960518198642,
+    4.293969771745835,
+    4.303979025293028,
+    4.313988278840221,
+    4.3239975323874145,
+    4.334006785934608,
+    4.344016039481801,
+    4.354025293028994,
+    4.364034546576186,
+    4.3740438001233795,
+    4.384053053670573,
+    4.394062307217766,
+    4.404071560764959,
+    4.414080814312152,
+    4.424090067859345,
+    4.4340993214065385,
+    4.444108574953732,
+    4.454117828500925,
+    4.464127082048117,
+    4.47413633559531,
+    4.4841455891425035,
+    4.494154842689697,
+    4.50416409623689,
+    4.514173349784083,
+    4.524182603331276,
+    4.534191856878469,
+    4.5442011104256625,
+    4.554210363972856,
+    4.564219617520048,
+    4.574228871067241,
+    4.584238124614434,
+    4.5942473781616275,
+    4.604256631708821,
+    4.614265885256014,
+    4.624275138803207,
+    4.6342843923504,
+    4.644293645897593,
+    4.654302899444787,
+    4.664312152991979,
+    4.674321406539172,
+    4.684330660086365,
+    4.694339913633558,
+    4.704349167180752,
+    4.714358420727945,
+    4.724367674275138,
+    4.734376927822331,
+    4.744386181369524,
+    4.7543954349167175,
+    4.764404688463911,
+    4.774413942011103,
+    4.784423195558296,
+    4.794432449105489,
+    4.8044417026526824,
+    4.814450956199876,
+    4.824460209747069,
+    4.834469463294262,
+    4.844478716841455,
+    4.854487970388648,
+    4.8644972239358415,
+    4.874506477483034,
+    4.884515731030227,
+    4.89452498457742,
+    4.904534238124613,
+    4.9145434916718065,
+    4.924552745219,
+    4.934561998766193,
+    4.944571252313386,
+    4.954580505860579,
+    4.964589759407772,
+    4.974599012954965,
+    4.984608266502158,
+    4.994617520049351,
+    5.004626773596544,
+    5.014636027143737,
+    5.0246452806909305,
+    5.034654534238124,
+    5.044663787785317,
+    5.05467304133251,
+    5.064682294879703,
+    5.0746915484268955,
+    5.084700801974089,
+    5.094710055521282,
+    5.104719309068475,
+    5.114728562615668,
+    5.124737816162861,
+    5.134747069710055,
+    5.144756323257248,
+    5.154765576804441,
+    5.164774830351634,
+    5.174784083898827,
+    5.18479333744602,
+    5.194802590993213,
+    5.204811844540406,
+    5.214821098087599,
+    5.224830351634792,
+    5.234839605181985,
+    5.244848858729179,
+    5.254858112276372,
+    5.264867365823565,
+    5.274876619370758,
+    5.28488587291795,
+    5.294895126465144,
+    5.304904380012337,
+    5.31491363355953,
+    5.324922887106723,
+    5.334932140653916,
+    5.3449413942011095,
+    5.354950647748303,
+    5.364959901295496,
+    5.374969154842689,
+    5.384978408389881,
+    5.3949876619370745,
+    5.404996915484268,
+    5.415006169031461,
+    5.425015422578654,
+    5.435024676125847,
+    5.44503392967304,
+    5.4550431832202335,
+    5.465052436767427,
+    5.47506169031462,
+    5.485070943861812,
+    5.495080197409005,
+    5.5050894509561985,
+    5.515098704503392,
+    5.525107958050585,
+    5.535117211597778,
+    5.545126465144971,
+    5.555135718692164,
+    5.565144972239358,
+    5.575154225786551,
+    5.585163479333744,
+    5.595172732880936,
+    5.605181986428129,
+    5.6151912399753225,
+    5.625200493522516,
+    5.635209747069709,
+    5.645219000616902,
+    5.655228254164095,
+    5.665237507711288,
+    5.675246761258482,
+    5.685256014805675,
+    5.695265268352867,
+    5.70527452190006,
+    5.715283775447253,
+    5.725293028994447,
+    5.73530228254164,
+    5.745311536088833,
+    5.755320789636026,
+    5.765330043183219,
+    5.7753392967304125,
+    5.785348550277606,
+    5.795357803824798,
+    5.805367057371991,
+    5.815376310919184,
+    5.8253855644663775,
+    5.835394818013571,
+    5.845404071560764,
+    5.855413325107957,
+    5.86542257865515,
+    5.875431832202343,
+    5.8854410857495365,
+    5.895450339296729,
+    5.905459592843922,
+    5.915468846391115,
+    5.925478099938308,
+    5.9354873534855015,
+    5.945496607032695,
+    5.955505860579888,
+    5.965515114127081,
+    5.975524367674274,
+    5.985533621221467,
+    5.9955428747686605,
+    6.005552128315853,
+    6.015561381863046,
+    6.025570635410239,
+    6.035579888957432,
+    6.0455891425046255,
+    6.055598396051819,
+    6.065607649599012,
+    6.075616903146205,
+    6.085626156693398,
+    6.095635410240591,
+    6.105644663787784,
+    6.115653917334977,
+    6.12566317088217,
+    6.135672424429363,
+    6.145681677976556,
+    6.15569093152375,
+    6.165700185070943,
+    6.175709438618136,
+    6.185718692165329,
+    6.195727945712522,
+    6.205737199259715,
+    6.215746452806908,
+    6.225755706354101,
+    6.235764959901294,
+    6.245774213448487,
+    6.25578346699568,
+    6.265792720542874,
+    6.275801974090067,
+    6.28581122763726,
+    6.295820481184453,
+    6.305829734731645,
+    6.315838988278839,
+    6.325848241826032,
+    6.335857495373225,
+    6.345866748920418,
+    6.355876002467611,
+    6.3658852560148045,
+    6.375894509561998,
+    6.385903763109191,
+    6.395913016656384,
+    6.405922270203577,
+    6.4159315237507695,
+    6.425940777297963,
+    6.435950030845156,
+    6.445959284392349,
+    6.455968537939542,
+    6.465977791486735,
+    6.4759870450339285,
+    6.485996298581122,
+    6.496005552128315,
+    6.506014805675508,
+    6.5160240592227,
+    6.5260333127698935,
+    6.536042566317087,
+    6.54605181986428,
+    6.556061073411473,
+    6.566070326958666,
+    6.576079580505859,
+    6.586088834053053,
+    6.596098087600246,
+    6.606107341147439,
+    6.616116594694631,
+    6.626125848241824,
+    6.6361351017890176,
+    6.646144355336211,
+    6.656153608883404,
+    6.666162862430597,
+    6.67617211597779,
+    6.686181369524983,
+    6.696190623072177,
+    6.70619987661937,
+    6.716209130166562,
+    6.726218383713755,
+    6.736227637260948,
+    6.746236890808142,
+    6.756246144355335,
+    6.766255397902528,
+    6.776264651449721,
+    6.786273904996914,
+    6.7962831585441075,
+    6.806292412091301,
+    6.816301665638493,
+    6.826310919185686,
+    6.836320172732879,
+    6.8463294262800725,
+    6.856338679827266,
+    6.866347933374459,
+    6.876357186921652,
+    6.886366440468845,
+    6.896375694016038,
+    6.9063849475632315,
+    6.916394201110425,
+    6.926403454657617,
+    6.93641270820481,
+    6.946421961752003,
+    6.9564312152991965,
+    6.96644046884639,
+    6.976449722393583,
+    6.986458975940776,
+    6.996468229487969,
+    7.006477483035162,
+    7.0164867365823556,
+    7.026495990129548,
+    7.036505243676741,
+    7.046514497223934,
+    7.056523750771127,
+    7.0665330043183205,
+    7.076542257865514,
+    7.086551511412707,
+    7.0965607649599,
+    7.106570018507093,
+    7.116579272054286,
+    7.126588525601479,
+    7.136597779148672,
+    7.146607032695865,
+    7.156616286243058,
+    7.166625539790251,
+    7.176634793337445,
+    7.186644046884638,
+    7.196653300431831,
+    7.206662553979024,
+    7.216671807526217,
+    7.22668106107341,
+    7.236690314620603,
+    7.246699568167796,
+    7.256708821714989,
+    7.266718075262182,
+    7.2767273288093755,
+    7.286736582356569,
+    7.296745835903762,
+    7.306755089450955,
+    7.316764342998148,
+    7.326773596545341,
+    7.336782850092534,
+    7.346792103639727,
+    7.35680135718692,
+    7.366810610734113,
+    7.376819864281306,
+    7.3868291178284995,
+    7.396838371375693,
+    7.406847624922886,
+    7.416856878470079,
+    7.426866132017272,
+    7.4368753855644645,
+    7.446884639111658,
+    7.456893892658851,
+    7.466903146206044,
+    7.476912399753237,
+    7.48692165330043,
+    7.4969309068476235,
+    7.506940160394817,
+    7.51694941394201,
+    7.526958667489203,
+    7.536967921036395,
+    7.5469771745835885,
+    7.556986428130782,
+    7.566995681677975,
+    7.577004935225168,
+    7.587014188772361,
+    7.597023442319554,
+    7.607032695866748,
+    7.617041949413941,
+    7.627051202961134,
+    7.637060456508326,
+    7.647069710055519,
+    7.657078963602713,
+    7.667088217149906,
+    7.677097470697099,
+    7.687106724244292,
+    7.697115977791485,
+    7.707125231338678,
+    7.717134484885872,
+    7.727143738433065,
+    7.737152991980258,
+    7.74716224552745,
+    7.757171499074643,
+    7.767180752621837,
+    7.77719000616903,
+    7.787199259716223,
+    7.797208513263416,
+    7.807217766810609,
+    7.8172270203578025,
+    7.827236273904996,
+    7.837245527452189,
+    7.847254780999381,
+    7.857264034546574,
+    7.8672732880937675,
+    7.877282541640961,
+    7.887291795188154,
+    7.897301048735347,
+    7.90731030228254,
+    7.917319555829733,
+    7.9273288093769265,
+    7.93733806292412,
+    7.947347316471312,
+    7.957356570018505,
+    7.967365823565698,
+    7.9773750771128915,
+    7.987384330660085,
+    7.997393584207278,
+    8.007402837754471,
+    8.017412091301663,
+    8.027421344848857,
+    8.03743059839605,
+    8.047439851943244,
+    8.057449105490436,
+    8.06745835903763,
+    8.077467612584822,
+    8.087476866132016,
+    8.097486119679209,
+    8.107495373226401,
+    8.117504626773595,
+    8.127513880320787,
+    8.137523133867981,
+    8.147532387415174,
+    8.157541640962368,
+    8.16755089450956,
+    8.177560148056754,
+    8.187569401603946,
+    8.19757865515114,
+    8.207587908698333,
+    8.217597162245525,
+    8.22760641579272,
+    8.237615669339911,
+    8.247624922887105,
+    8.257634176434298,
+    8.267643429981492,
+    8.277652683528684,
+    8.287661937075878,
+    8.29767119062307,
+    8.307680444170263,
+    8.317689697717457,
+    8.327698951264649,
+    8.337708204811843,
+    8.347717458359035,
+    8.35772671190623,
+    8.367735965453422,
+    8.377745219000616,
+    8.387754472547808,
+    8.397763726095002,
+    8.407772979642194,
+    8.417782233189387,
+    8.42779148673658,
+    8.437800740283773,
+    8.447809993830967,
+    8.45781924737816,
+    8.467828500925354,
+    8.477837754472546,
+    8.48784700801974,
+    8.497856261566932,
+    8.507865515114124,
+    8.517874768661319,
+    8.52788402220851,
+    8.537893275755705,
+    8.547902529302897,
+    8.557911782850091,
+    8.567921036397284,
+    8.577930289944478,
+    8.58793954349167,
+    8.597948797038864,
+    8.607958050586056,
+    8.617967304133249,
+    8.627976557680443,
+    8.637985811227635,
+    8.647995064774829,
+    8.658004318322021,
+    8.668013571869215,
+    8.678022825416408,
+    8.688032078963602,
+    8.698041332510794,
+    8.708050586057988,
+    8.71805983960518,
+    8.728069093152373,
+    8.738078346699567,
+    8.748087600246759,
+    8.758096853793953,
+    8.768106107341145,
+    8.77811536088834,
+    8.788124614435532,
+    8.798133867982726,
+    8.808143121529918,
+    8.81815237507711,
+    8.828161628624304,
+    8.838170882171497,
+    8.84818013571869,
+    8.858189389265883,
+    8.868198642813077,
+    8.87820789636027,
+    8.888217149907463,
+    8.898226403454656,
+    8.90823565700185,
+    8.918244910549042,
+    8.928254164096234,
+    8.938263417643428,
+    8.94827267119062,
+    8.958281924737815,
+    8.968291178285007,
+    8.978300431832201,
+    8.988309685379393,
+    8.998318938926587,
+    9.00832819247378,
+    9.018337446020974,
+    9.028346699568166,
+    9.038355953115358,
+    9.048365206662552,
+    9.058374460209745,
+    9.068383713756939,
+    9.078392967304131,
+    9.088402220851325,
+    9.098411474398517,
+    9.108420727945711,
+    9.118429981492904,
+    9.128439235040096,
+    9.13844848858729,
+    9.148457742134482,
+    9.158466995681676,
+    9.168476249228869,
+    9.178485502776063,
+    9.188494756323255,
+    9.19850400987045,
+    9.208513263417641,
+    9.218522516964835,
+    9.228531770512028,
+    9.23854102405922,
+    9.248550277606414,
+    9.258559531153606,
+    9.2685687847008,
+    9.278578038247993,
+    9.288587291795187,
+    9.29859654534238,
+    9.308605798889573,
+    9.318615052436765,
+    9.328624305983958,
+    9.338633559531152,
+    9.348642813078344,
+    9.358652066625538,
+    9.36866132017273,
+    9.378670573719925,
+    9.388679827267117,
+    9.39868908081431,
+    9.408698334361503,
+    9.418707587908697,
+    9.42871684145589,
+    9.438726095003082,
+    9.448735348550276,
+    9.458744602097468,
+    9.468753855644662,
+    9.478763109191854,
+    9.488772362739049,
+    9.49878161628624,
+    9.508790869833435,
+    9.518800123380627,
+    9.528809376927821,
+    9.538818630475014,
+    9.548827884022206,
+    9.5588371375694,
+    9.568846391116592,
+    9.578855644663786,
+    9.588864898210979,
+    9.598874151758173,
+    9.608883405305365,
+    9.618892658852559,
+    9.628901912399751,
+    9.638911165946944,
+    9.648920419494138,
+    9.65892967304133,
+    9.668938926588524,
+    9.678948180135716,
+    9.68895743368291,
+    9.698966687230103,
+    9.708975940777297,
+    9.718985194324489,
+    9.728994447871683,
+    9.739003701418875,
+    9.749012954966068,
+    9.759022208513262,
+    9.769031462060454,
+    9.779040715607648,
+    9.78904996915484,
+    9.799059222702034,
+    9.809068476249227,
+    9.81907772979642,
+    9.829086983343613,
+    9.839096236890807,
+    9.849105490438,
+    9.859114743985192,
+    9.869123997532386,
+    9.879133251079578,
+    9.889142504626772,
+    9.899151758173964,
+    9.909161011721158,
+    9.91917026526835,
+    9.929179518815545,
+    9.939188772362737,
+    9.94919802590993,
+    9.959207279457123,
+    9.969216533004316,
+    9.97922578655151,
+    9.989235040098702,
+    9.999244293645896,
+    10.009253547193088,
+    10.019262800740282,
+    10.029272054287475,
+    10.039281307834669,
+    10.049290561381861,
+    10.059299814929053,
+    10.069309068476247,
+    10.07931832202344,
+    10.089327575570634,
+    10.099336829117826,
+    10.10934608266502,
+    10.119355336212212,
+    10.129364589759406,
+    10.139373843306599,
+    10.149383096853791,
+    10.159392350400985,
+    10.169401603948177,
+    10.179410857495371,
+    10.189420111042564,
+    10.199429364589758,
+    10.20943861813695,
+    10.219447871684144,
+    10.229457125231336,
+    10.23946637877853,
+    10.249475632325723,
+    10.259484885872915,
+    10.26949413942011,
+    10.279503392967301,
+    10.289512646514495,
+    10.299521900061688,
+    10.309531153608882,
+    10.319540407156074,
+    10.329549660703268,
+    10.33955891425046,
+    10.349568167797655,
+    10.359577421344847,
+    10.36958667489204,
+    10.379595928439233,
+    10.389605181986425,
+    10.39961443553362,
+    10.409623689080812,
+    10.419632942628006,
+    10.429642196175198,
+    10.439651449722392,
+    10.449660703269585,
+    10.459669956816777,
+    10.46967921036397,
+    10.479688463911163,
+    10.489697717458357,
+    10.49970697100555,
+    10.509716224552744,
+    10.519725478099936,
+    10.52973473164713,
+    10.539743985194322,
+    10.549753238741516,
+    10.559762492288709,
+    10.5697717458359,
+    10.579780999383095,
+    10.589790252930287,
+    10.599799506477481,
+    10.609808760024674,
+    10.619818013571868,
+    10.62982726711906,
+    10.639836520666254,
+    10.649845774213446,
+    10.659855027760639,
+    10.669864281307833,
+    10.679873534855025,
+    10.689882788402219,
+    10.699892041949411,
+    10.709901295496605,
+    10.719910549043798,
+    10.729919802590992,
+    10.739929056138184,
+    10.749938309685378,
+    10.75994756323257,
+    10.769956816779763,
+    10.779966070326957,
+    10.789975323874149,
+    10.799984577421343,
+    10.809993830968535,
+    10.82000308451573,
+    10.830012338062922,
+    10.840021591610116,
+    10.850030845157308,
+    10.860040098704502,
+    10.870049352251694,
+    10.880058605798887,
+    10.89006785934608,
+    10.900077112893273,
+    10.910086366440467,
+    10.92009561998766,
+    10.930104873534853,
+    10.940114127082046,
+    10.95012338062924,
+    10.960132634176432,
+    10.970141887723624,
+    10.980151141270818,
+    10.99016039481801,
+    11.000169648365205,
+    11.010178901912397,
+    11.020188155459591,
+    11.030197409006783,
+    11.040206662553977,
+    11.05021591610117,
+    11.060225169648364,
+    11.070234423195556,
+    11.080243676742748,
+    11.090252930289942,
+    11.100262183837135,
+    11.110271437384329,
+    11.120280690931521,
+    11.130289944478715,
+    11.140299198025907,
+    11.150308451573101,
+    11.160317705120294,
+    11.170326958667488,
+    11.18033621221468,
+    11.190345465761872,
+    11.200354719309066,
+    11.210363972856259,
+    11.220373226403453,
+    11.230382479950645,
+    11.24039173349784,
+    11.250400987045031,
+    11.260410240592226,
+    11.270419494139418,
+    11.28042874768661,
+    11.290438001233804,
+    11.300447254780996,
+    11.31045650832819,
+    11.320465761875383,
+    11.330475015422577,
+    11.34048426896977,
+    11.350493522516963,
+    11.360502776064155,
+    11.37051202961135,
+    11.380521283158542,
+    11.390530536705734,
+    11.400539790252928,
+    11.41054904380012,
+    11.420558297347315,
+    11.430567550894507,
+    11.4405768044417,
+    11.450586057988893,
+    11.460595311536087,
+    11.47060456508328,
+    11.480613818630472,
+    11.490623072177666,
+    11.500632325724858,
+    11.510641579272052,
+    11.520650832819245,
+    11.530660086366439,
+    11.54066933991363,
+    11.550678593460825,
+    11.560687847008017,
+    11.570697100555211,
+    11.580706354102404,
+    11.590715607649596,
+    11.60072486119679,
+    11.610734114743982,
+    11.620743368291176,
+    11.630752621838369,
+    11.640761875385563,
+    11.650771128932755,
+    11.660780382479949,
+    11.670789636027141,
+    11.680798889574335,
+    11.690808143121528,
+    11.70081739666872,
+    11.710826650215914,
+    11.720835903763106,
+    11.7308451573103,
+    11.740854410857493,
+    11.750863664404687,
+    11.760872917951879,
+    11.770882171499073,
+    11.780891425046265,
+    11.790900678593458,
+    11.800909932140652,
+    11.810919185687844,
+    11.820928439235038,
+    11.83093769278223,
+    11.840946946329424,
+    11.850956199876617,
+    11.86096545342381,
+    11.870974706971003,
+    11.880983960518197,
+    11.89099321406539,
+    11.901002467612582,
+    11.911011721159776,
+    11.921020974706968,
+    11.931030228254162,
+    11.941039481801354,
+    11.951048735348548,
+    11.96105798889574,
+    11.971067242442935,
+    11.981076495990127,
+    11.991085749537321,
+    12.001095003084513,
+    12.011104256631706,
+    12.0211135101789,
+    12.031122763726092,
+    12.041132017273286,
+    12.051141270820478,
+    12.061150524367672,
+    12.071159777914865,
+    12.081169031462059,
+    12.091178285009251,
+    12.101187538556443,
+    12.111196792103637,
+    12.12120604565083,
+    12.131215299198024,
+    12.141224552745216,
+    12.15123380629241,
+    12.161243059839602,
+    12.171252313386796,
+    12.181261566933989,
+    12.191270820481183,
+    12.201280074028375,
+    12.211289327575567,
+    12.221298581122761,
+    12.231307834669954,
+    12.241317088217148,
+    12.25132634176434,
+    12.261335595311534,
+    12.271344848858726,
+    12.28135410240592,
+    12.291363355953113,
+    12.301372609500305,
+    12.3113818630475,
+    12.321391116594691,
+    12.331400370141886,
+    12.341409623689078,
+    12.351418877236272,
+    12.361428130783464,
+    12.371437384330658,
+    12.38144663787785,
+    12.391455891425045,
+    12.401465144972237,
+    12.41147439851943,
+    12.421483652066623,
+    12.431492905613815,
+    12.44150215916101,
+    12.451511412708202,
+    12.461520666255396,
+    12.471529919802588,
+    12.481539173349782,
+    12.491548426896975,
+    12.501557680444169,
+    12.51156693399136,
+    12.521576187538553,
+    12.531585441085747,
+    12.54159469463294,
+    12.551603948180134,
+    12.561613201727326,
+    12.57162245527452,
+    12.581631708821712,
+    12.591640962368906,
+    12.601650215916099,
+    12.61165946946329,
+    12.621668723010485,
+    12.631677976557677,
+    12.641687230104871,
+    12.651696483652064,
+    12.661705737199258,
+    12.67171499074645,
+    12.681724244293644,
+    12.691733497840836,
+    12.70174275138803,
+    12.711752004935223,
+    12.721761258482415,
+    12.731770512029609,
+    12.741779765576801,
+    12.751789019123995,
+    12.761798272671188,
+    12.771807526218382,
+    12.781816779765574,
+    12.791826033312768,
+    12.80183528685996,
+    12.811844540407154,
+    12.821853793954347,
+    12.831863047501539,
+    12.841872301048733,
+    12.851881554595925,
+    12.86189080814312,
+    12.871900061690312,
+    12.881909315237506,
+    12.891918568784698,
+    12.901927822331892,
+    12.911937075879084,
+    12.921946329426277,
+    12.93195558297347,
+    12.941964836520663,
+    12.951974090067857,
+    12.96198334361505,
+    12.971992597162243,
+    12.982001850709436,
+    12.99201110425663,
+    13.002020357803822,
+    13.012029611351016,
+    13.022038864898208,
+    13.0320481184454,
+    13.042057371992595,
+    13.052066625539787,
+    13.062075879086981,
+    13.072085132634173,
+    13.082094386181367,
+    13.09210363972856,
+    13.102112893275754,
+    13.112122146822946,
+    13.122131400370138,
+    13.132140653917332,
+    13.142149907464525,
+    13.152159161011719,
+    13.162168414558911,
+    13.172177668106105,
+    13.182186921653297,
+    13.192196175200491,
+    13.202205428747684,
+    13.212214682294878,
+    13.22222393584207,
+    13.232233189389262,
+    13.242242442936456,
+    13.252251696483649,
+    13.262260950030843,
+    13.272270203578035,
+    13.28227945712523,
+    13.292288710672421,
+    13.302297964219616,
+    13.312307217766808,
+    13.322316471314002,
+    13.332325724861194,
+    13.342334978408386,
+    13.35234423195558,
+    13.362353485502773,
+    13.372362739049967,
+    13.38237199259716,
+    13.392381246144353,
+    13.402390499691546,
+    13.41239975323874,
+    13.422409006785932,
+    13.432418260333124,
+    13.442427513880318,
+    13.45243676742751,
+    13.462446020974705,
+    13.472455274521897,
+    13.482464528069091,
+    13.492473781616283,
+    13.502483035163477,
+    13.51249228871067,
+    13.522501542257864,
+    13.532510795805056,
+    13.542520049352248,
+    13.552529302899442,
+    13.562538556446635,
+    13.572547809993829,
+    13.58255706354102,
+    13.592566317088215,
+    13.602575570635407,
+    13.612584824182601,
+    13.622594077729794,
+    13.632603331276986,
+    13.64261258482418,
+    13.652621838371372,
+    13.662631091918566,
+    13.672640345465759,
+    13.682649599012953,
+    13.692658852560145,
+    13.702668106107339,
+    13.712677359654531,
+    13.722686613201725,
+    13.732695866748918,
+    13.74270512029611,
+    13.752714373843304,
+    13.762723627390496,
+    13.77273288093769,
+    13.782742134484883,
+    13.792751388032077,
+    13.802760641579269,
+    13.812769895126463,
+    13.822779148673655,
+    13.83278840222085,
+    13.842797655768042,
+    13.852806909315234,
+    13.862816162862428,
+    13.87282541640962,
+    13.882834669956814,
+    13.892843923504007,
+    13.9028531770512,
+    13.912862430598393,
+    13.922871684145587,
+    13.93288093769278,
+    13.942890191239972,
+    13.952899444787166,
+    13.962908698334358,
+    13.972917951881552,
+    13.982927205428744,
+    13.992936458975938,
+    14.00294571252313,
+    14.012954966070325,
+    14.022964219617517,
+    14.032973473164711,
+    14.042982726711903,
+    14.052991980259096,
+    14.06300123380629,
+    14.073010487353482,
+    14.083019740900676,
+    14.093028994447868,
+    14.103038247995062,
+    14.113047501542255,
+    14.123056755089449,
+    14.133066008636641,
+    14.143075262183835,
+    14.153084515731027,
+    14.16309376927822,
+    14.173103022825414,
+    14.183112276372606,
+    14.1931215299198,
+    14.203130783466992,
+    14.213140037014186,
+    14.223149290561379,
+    14.233158544108573,
+    14.243167797655765,
+    14.253177051202957,
+    14.263186304750151,
+    14.273195558297344,
+    14.283204811844538,
+    14.29321406539173,
+    14.303223318938924,
+    14.313232572486116,
+    14.32324182603331,
+    14.333251079580503,
+    14.343260333127697,
+    14.35326958667489,
+    14.363278840222081,
+    14.373288093769276,
+    14.383297347316468,
+    14.393306600863662,
+    14.403315854410854,
+    14.413325107958048,
+    14.42333436150524,
+    14.433343615052435,
+    14.443352868599627,
+    14.45336212214682,
+    14.463371375694013,
+    14.473380629241205,
+    14.4833898827884,
+    14.493399136335592,
+    14.503408389882786,
+    14.513417643429978,
+    14.523426896977172,
+    14.533436150524365,
+    14.543445404071559,
+    14.553454657618751,
+    14.563463911165943,
+    14.573473164713137,
+    14.58348241826033,
+    14.593491671807524,
+    14.603500925354716,
+    14.61351017890191,
+    14.623519432449102,
+    14.633528685996296,
+    14.643537939543489,
+    14.653547193090683,
+    14.663556446637875,
+    14.673565700185067,
+    14.683574953732261,
+    14.693584207279454,
+    14.703593460826648,
+    14.71360271437384,
+    14.723611967921034,
+    14.733621221468226,
+    14.74363047501542,
+    14.753639728562613,
+    14.763648982109805,
+    14.773658235656999,
+    14.783667489204191,
+    14.793676742751385,
+    14.803685996298578,
+    14.813695249845772,
+    14.823704503392964,
+    14.833713756940158,
+    14.84372301048735,
+    14.853732264034544,
+    14.863741517581737,
+    14.873750771128929,
+    14.883760024676123,
+    14.893769278223315,
+    14.90377853177051,
+    14.913787785317702,
+    14.923797038864896,
+    14.933806292412088,
+    14.943815545959282,
+    14.953824799506474,
+    14.963834053053668,
+    14.97384330660086,
+    14.983852560148053,
+    14.993861813695247,
+    15.00387106724244,
+    15.013880320789633,
+    15.023889574336826,
+    15.03389882788402,
+    15.043908081431212,
+    15.053917334978406,
+    15.063926588525598,
+    15.07393584207279,
+    15.083945095619985,
+    15.093954349167177,
+    15.103963602714371,
+    15.113972856261563,
+    15.123982109808757,
+    15.13399136335595,
+    15.144000616903144,
+    15.154009870450336,
+    15.16401912399753,
+    15.174028377544722,
+    15.184037631091915,
+    15.194046884639109,
+    15.204056138186301,
+    15.214065391733495,
+    15.224074645280687,
+    15.234083898827881,
+    15.244093152375074,
+    15.254102405922268,
+    15.26411165946946,
+    15.274120913016652,
+    15.284130166563846,
+    15.294139420111039,
+    15.304148673658233,
+    15.314157927205425,
+    15.32416718075262,
+    15.334176434299811,
+    15.344185687847006,
+    15.354194941394198,
+    15.364204194941392,
+    15.374213448488584,
+    15.384222702035776,
+    15.39423195558297,
+    15.404241209130163,
+    15.414250462677357,
+    15.42425971622455,
+    15.434268969771743,
+    15.444278223318936,
+    15.45428747686613,
+    15.464296730413322,
+    15.474305983960516,
+    15.484315237507708,
+    15.4943244910549,
+    15.504333744602095,
+    15.514342998149287,
+    15.524352251696481,
+    15.534361505243673,
+    15.544370758790867,
+    15.55438001233806,
+    15.564389265885254,
+    15.574398519432446,
+    15.584407772979638,
+    15.594417026526832,
+    15.604426280074025,
+    15.614435533621219,
+    15.624444787168411,
+    15.634454040715605,
+    15.644463294262797,
+    15.654472547809991,
+    15.664481801357184,
+    15.674491054904378,
+    15.68450030845157,
+    15.694509561998762,
+    15.704518815545956,
+    15.714528069093149,
+    15.724537322640343,
+    15.734546576187535,
+    15.744555829734729,
+    15.754565083281921,
+    15.764574336829115,
+    15.774583590376308,
+    15.7845928439235,
+    15.794602097470694,
+    15.804611351017886,
+    15.81462060456508,
+    15.824629858112273,
+    15.834639111659467,
+    15.844648365206659,
+    15.854657618753853,
+    15.864666872301045,
+    15.87467612584824,
+    15.884685379395432,
+    15.894694632942624,
+    15.904703886489818,
+    15.91471314003701,
+    15.924722393584204,
+    15.934731647131397,
+    15.94474090067859,
+    15.954750154225783,
+    15.964759407772977,
+    15.97476866132017,
+    15.984777914867363,
+    15.994787168414556,
+    16.00479642196175,
+    16.014805675508942,
+    16.024814929056134,
+    16.034824182603327,
+    16.044833436150522,
+    16.054842689697715,
+    16.064851943244907,
+    16.0748611967921,
+    16.084870450339295,
+    16.094879703886487,
+    16.10488895743368,
+    16.114898210980872,
+    16.124907464528064,
+    16.13491671807526,
+    16.144925971622452,
+    16.154935225169645,
+    16.164944478716837,
+    16.174953732264033,
+    16.184962985811225,
+    16.194972239358417,
+    16.20498149290561,
+    16.214990746452802,
+    16.224999999999998
+  ],
+  "y": [
+    null,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0,
+    0.0016849709181294362,
+    0.0,
+    0.003288249314053312,
+    0.0,
+    0.0016047458548188755,
+    0.001585584882046288,
+    0.0015667650501484172,
+    0.0030965566174425913,
+    0.0,
+    0.006049092271179363,
+    0.0,
+    0.0,
+    0.001460575266725754,
+    0.0014439306702167813,
+    0.0,
+    0.0,
+    0.0,
+    0.0027602369948122054,
+    0.0,
+    0.0,
+    0.0053399802892632455,
+    0.003961334477773799,
+    0.0026122623331397052,
+    0.005168195970827049,
+    0.0038345800186775003,
+    0.0037936781242290827,
+    0.006255711970262128,
+    0.004951751269604874,
+    0.006124705924569105,
+    0.007272888918953254,
+    0.0047982179660795285,
+    0.005935780393485587,
+    0.007049693396012691,
+    0.009303432326183077,
+    0.009208741519239678,
+    0.007976052911121714,
+    0.013535468862990185,
+    0.01116647983015301,
+    0.009949584774462509,
+    0.007661756823537104,
+    0.014088444713264777,
+    0.016096135592487907,
+    0.008500649130217018,
+    0.013679117146461776,
+    0.015630729843313082,
+    0.012384058468217857,
+    0.011243161624659723,
+    0.01214817704046765,
+    0.020054592641899745,
+    0.016885209343492098,
+    0.010822893924200744,
+    0.02339238340296975,
+    0.019311894827228983,
+    0.02295920048911486,
+    0.014216942121717122,
+    0.018781616418012244,
+    0.01674873289194935,
+    0.026738202424600805,
+    0.03289118933706615,
+    0.02082407538408193,
+    0.03050671232779855,
+    0.023119905812707123,
+    0.021151328177003638,
+    0.030572112338540496,
+    0.032899489338726204,
+    0.02402861591940247,
+    0.03487679762601851,
+    0.03457286184075335,
+    0.033436957864188224,
+    0.04226381093954078,
+    0.05340228318966038,
+    0.04398497570172601,
+    0.04441742864063101,
+    0.06245702831109708,
+    0.050019458073281786,
+    0.04723642234192056,
+    0.051524342687233764,
+    0.0557389949025403,
+    0.056810900718381616,
+    0.056340419093658514,
+    0.05587575782697188,
+    0.05991007708904661,
+    0.07278952102909358,
+    0.05967264504467312,
+    0.07818726146748986,
+    0.077555447802236,
+    0.08555906666674172,
+    0.06918237685219153,
+    0.08490312340874676,
+    0.08633365094796652,
+    0.08216812263000589,
+    0.08635577960792412,
+    0.08773340298917762,
+    0.08568654323258755,
+    0.122129641667868,
+    0.10645187523333949,
+    0.10961423844629489,
+    0.11536151720596094,
+    0.10466361366955962,
+    0.10840714201920044,
+    0.13012814096830844,
+    0.1272225271191198,
+    0.12372264507576969,
+    0.1353845639972748,
+    0.14186818825277417,
+    0.1501119552756263,
+    0.1606916676650773,
+    0.14911032093524,
+    0.16013963605902165,
+    0.1547451264453773,
+    0.15480479001981148,
+    0.14892611695611935,
+    0.17140137516167858,
+    0.15846244107279872,
+    0.16660428658024343,
+    0.19421948641720954,
+    0.18195331264652034,
+    0.20621519211554554,
+    0.2098211755158761,
+    0.20049005060205968,
+    0.2151964917770172,
+    0.20153126550483788,
+    0.20614537873867086,
+    0.24444381867835807,
+    0.2481435881938423,
+    0.2480279482600212,
+    0.26656766478219596,
+    0.25890212333622903,
+    0.2655325834907421,
+    0.26997714709174525,
+    0.291988085528992,
+    0.2786663075339889,
+    0.29519132536673853,
+    0.3165675924282368,
+    0.3336110875699882,
+    0.3017908242785219,
+    0.33213584195739404,
+    0.34079976284653385,
+    0.33607486349295584,
+    0.3323812825911398,
+    0.34763837274630355,
+    0.3516090475447278,
+    0.38853603208985255,
+    0.3888445923382763,
+    0.38300146914477784,
+    0.397870316985112,
+    0.42046276618528444,
+    0.41033560418297443,
+    0.41137374440372226,
+    0.45262324632329115,
+    0.4824338442581263,
+    0.4585930529432285,
+    0.5005268011007956,
+    0.5076040226471958,
+    0.5198958734007633,
+    0.5285023485878266,
+    0.5212480629352438,
+    0.5036449787509534,
+    0.5428223985025769,
+    0.5488869663116862,
+    0.5868527298612628,
+    0.5938209688803677,
+    0.5914247922634321,
+    0.6422159334764177,
+    0.6112361538169141,
+    0.6567157489485324,
+    0.619012933370536,
+    0.645487341258068,
+    0.6899028479466096,
+    0.7160116136174366,
+    0.683621734152841,
+    0.7106269459887191,
+    0.7305582344028272,
+    0.7545735934494969,
+    0.7684982570977986,
+    0.7569355409606151,
+    0.7958150506827459,
+    0.7968987417602569,
+    0.815169748342161,
+    0.8210437944123693,
+    0.8430922352956237,
+    0.8573526287912534,
+    0.8740489899746039,
+    0.8897946009414532,
+    0.894262522747307,
+    0.9438361610240893,
+    0.8997143643030645,
+    0.9450303424958532,
+    0.9067884608961386,
+    0.9691075339774039,
+    0.9843088128431905,
+    1.0273575003791937,
+    0.9933317423371305,
+    1.025989936054253,
+    1.035237484949651,
+    1.0769802000079032,
+    1.0913287018238758,
+    1.0886884452193037,
+    1.0908375351151112,
+    1.1102514008415574,
+    1.09771439860154,
+    1.1332878929830872,
+    1.2168480084158622,
+    1.1288684662270427,
+    1.1619914468136479,
+    1.1648605067903093,
+    1.156905680789247,
+    1.1646085965624864,
+    1.1864239875529845,
+    1.2044535605737614,
+    1.1944716758180414,
+    1.2033317746237127,
+    1.1659237435130714,
+    1.2320386574647029,
+    1.2658433171825416,
+    1.2600702596959465,
+    1.2676483250188477,
+    1.296986566194287,
+    1.3290611856314958,
+    1.3205704929100173,
+    1.3233627462112025,
+    1.3360559405853454,
+    1.3417016987649881,
+    1.374419131753866,
+    1.3500932504982968,
+    1.3859373340522783,
+    1.3564785042827752,
+    1.4062057020715668,
+    1.3859206843410854,
+    1.3898320288704535,
+    1.422462791550054,
+    1.375722150391028,
+    1.3898272197629584,
+    1.3856332129778979,
+    1.3890774920643676,
+    1.3978003609881904,
+    1.4348926581746617,
+    1.4165986492200648,
+    1.4020623211346754,
+    1.401953226664839,
+    1.4116786947367115,
+    1.4060429266118775,
+    1.4264550272180587,
+    1.4355952222462802,
+    1.4473108586912045,
+    1.4751782507639608,
+    1.4889418242145747,
+    1.4340872185513298,
+    1.5078596054522866,
+    1.4649287444135213,
+    1.4812721648179699,
+    1.4326272772942281,
+    1.4058486373608148,
+    1.442473953979591,
+    1.4235375775222572,
+    1.4385882454805952,
+    1.3993181428488672,
+    1.4347108191034192,
+    1.448442953561209,
+    1.426101599788554,
+    1.415129530125904,
+    1.415366417923603,
+    1.433049545508944,
+    1.4368409206630186,
+    1.4162138785214604,
+    1.4059503653666159,
+    1.4648072226453184,
+    1.393352377570652,
+    1.4167739968491293,
+    1.4254424563338317,
+    1.4617385991478822,
+    1.450513455022118,
+    1.4187163501755997,
+    1.4072934809955984,
+    1.4310861771010057,
+    1.4143555307095685,
+    1.4173552302488823,
+    1.3751107456629321,
+    1.3965050806029335,
+    1.4117796566162755,
+    1.382763875232136,
+    1.3675150785473322,
+    1.3770640219143773,
+    1.3791442846347781,
+    1.3607398411498106,
+    1.371256822767292,
+    1.3552272876744726,
+    1.397234140997453,
+    1.3571834156002085,
+    1.356606659153234,
+    1.3376239744297889,
+    1.359092029698395,
+    1.3627657885718258,
+    1.3783557122646286,
+    1.3969858756421683,
+    1.3263000546856163,
+    1.382071233097433,
+    1.3489795545655503,
+    1.3345525807544125,
+    1.3664306787751757,
+    1.3518204234338411,
+    1.3113320263711052,
+    1.3416296684417754,
+    1.3158233514757887,
+    1.3505016613604024,
+    1.345129646740231,
+    1.3147558877626777,
+    1.3161915373564923,
+    1.3005875414653774,
+    1.29546940675192,
+    1.2725188321738474,
+    1.3171497250297988,
+    1.2797134086131978,
+    1.3337159621341679,
+    1.2797163446976962,
+    1.2757167356849153,
+    1.2510307744792377,
+    1.2729877772562181,
+    1.2911044903126794,
+    1.3010321735732144,
+    1.2670884118462322,
+    1.2677232097261388,
+    1.3025092196152228,
+    1.2937597320362488,
+    1.2689703203423686,
+    1.249221122470078,
+    1.2402071707992757,
+    1.2351399353583445,
+    1.264360210591608,
+    1.227849569789629,
+    1.2469772120959948,
+    1.2195449704604093,
+    1.2428804123260204,
+    1.2450826624769238,
+    1.2206546675080736,
+    1.1865667132261493,
+    1.2046292216840362,
+    1.170148162348897,
+    1.1615808571359165,
+    1.1634669512259654,
+    1.1558531682810071,
+    1.1696135765166564,
+    1.1989234333746834,
+    1.1556859570942741,
+    1.1454230607195055,
+    1.1692941849309608,
+    1.1444753878217135,
+    1.152271928897336,
+    1.1477576455619019,
+    1.1070293196668113,
+    1.1231203787633497,
+    1.1525201080005347,
+    1.14385552727145,
+    1.113241420413882,
+    1.1198921361263128,
+    1.10166706803241,
+    1.1114258171957152,
+    1.099595277867082,
+    1.1138498010990165,
+    1.0655924657211662,
+    1.1038703293631758,
+    1.0833247837409605,
+    1.0748455604238745,
+    1.0781349004285299,
+    1.062052377772049,
+    1.065031380412476,
+    1.054021764780115,
+    1.0362928623504084,
+    1.011763480012192,
+    1.0104655876657795,
+    0.9987020477001459,
+    1.0041418378678302,
+    0.9935612576972496,
+    0.971311062230309,
+    0.9950877695926483,
+    0.9903116951387342,
+    0.9915225234320774,
+    0.9895211341583001,
+    1.0043606151694133,
+    0.9884129986729387,
+    0.9707697669710489,
+    0.9811452806846704,
+    0.9667828102588613,
+    0.9577297661680902,
+    0.962234781568074,
+    0.947044288028409,
+    0.944474587875435,
+    0.961283833273109,
+    0.9377643537656861,
+    0.9773311950977096,
+    0.9467999700779687,
+    0.96449062353248,
+    0.9535197040868642,
+    0.9777939654806397,
+    0.952680080366215,
+    0.9502601199730473,
+    0.9247018704299703,
+    0.9303117851050363,
+    0.9121862798469103,
+    0.9165245334943076,
+    0.897865010133386,
+    0.8957943498410644,
+    0.9048539825430265,
+    0.9276963372692604,
+    0.8821824094804239,
+    0.9148360470595006,
+    0.8913320465010482,
+    0.9069137474513068,
+    0.9328607645999255,
+    0.8746667131571895,
+    0.8709353389548582,
+    0.8942959707749925,
+    0.8715873896107021,
+    0.8733733394125966,
+    0.8728758183293007,
+    0.8703841630171106,
+    0.8867000635119622,
+    0.8584457511289825,
+    0.8562768558706407,
+    0.8621087731071855,
+    0.8710287840406791,
+    0.8601070080587964,
+    0.8539225272175583,
+    0.876073210715573,
+    0.8644579124194397,
+    0.8504782406150944,
+    0.837611780687509,
+    0.8507031704594007,
+    0.8507436462648081,
+    0.8598944662275981,
+    0.8708713034826242,
+    0.8453013450462377,
+    0.8491000143218379,
+    0.8436252375989741,
+    0.8425394971392964,
+    0.8492728270821928,
+    0.8303593641199111,
+    0.8524846534858188,
+    0.8530847686252113,
+    0.8409438735500361,
+    0.829610991313201,
+    0.8254022787515292,
+    0.8160047159442523,
+    0.8270820282885394,
+    0.8217055275497338,
+    0.804838245335876,
+    0.8233662281017411,
+    0.7913337179803126,
+    0.8028832719551939,
+    0.7972960430169824,
+    0.8147636062170505,
+    0.8005748829812223,
+    0.8133351350161458,
+    0.8117445328878984,
+    0.8115583990339026,
+    0.8217073393481326,
+    0.7979777042971388,
+    0.7821294270732426,
+    0.7889264930427089,
+    0.7803103507057645,
+    0.7919763822661829,
+    0.8000316536944703,
+    0.7867941791479046,
+    0.8040891807631042,
+    0.8283788389902166,
+    0.7959305623921208,
+    0.833090083373412,
+    0.8239606552105753,
+    0.8153306052967908,
+    0.8137479578192609,
+    0.7895863222091659,
+    0.7957016952063926,
+    0.8059550802985882,
+    0.819649317426392,
+    0.8329255435200551,
+    0.8323830499876056,
+    0.8198897011720115,
+    0.806387438974596,
+    0.8296718640597261,
+    0.8346188358506264,
+    0.8178587459331478,
+    0.8433390112781547,
+    0.8138529954634846,
+    0.8219606360292834,
+    0.8195237996646617,
+    0.8233306416904109,
+    0.823529536235762,
+    0.8296025348447019,
+    0.8316570742183206,
+    0.8256607261985053,
+    0.8415419476478616,
+    0.8412479483358818,
+    0.8278216312706075,
+    0.823955927842105,
+    0.8373732393818888,
+    0.8589007246277897,
+    0.8360695214459721,
+    0.8495204796826705,
+    0.86522100839449,
+    0.8665522278647172,
+    0.8642389332910576,
+    0.8570062714830627,
+    0.8568339898573534,
+    0.8470593287677533,
+    0.858275445849731,
+    0.8583875389867108,
+    0.8437293553588809,
+    0.846149031538563,
+    0.8633267588761607,
+    0.8467106908980478,
+    0.8659314586539033,
+    0.8514489155213443,
+    0.8726758133631577,
+    0.8741683042324896,
+    0.9006141387043186,
+    0.9172518474799164,
+    0.8964629858116651,
+    0.8853839420216754,
+    0.8914843259086843,
+    0.8685581841660204,
+    0.8854076953870306,
+    0.8922962954897887,
+    0.8764567598538473,
+    0.9042453304062164,
+    0.8670312040614747,
+    0.8902746157475295,
+    0.9122582713875595,
+    0.9097052786551434,
+    0.9143150367085247,
+    0.900279346473589,
+    0.9501308443357127,
+    0.9450887919029338,
+    0.9259326540785934,
+    0.9364530490874251,
+    0.9362287459712084,
+    0.9403710356673982,
+    0.9213410494309839,
+    0.9364455629336602,
+    0.9132861489121142,
+    0.9449679111730728,
+    0.9451490421651847,
+    0.9358407489418301,
+    0.9573634483146696,
+    0.942994363346607,
+    0.940502319647654,
+    0.9596951224458169,
+    0.9488700018275467,
+    0.9476027512965272,
+    0.9563391144719106,
+    0.9547880553001163,
+    0.9565566447554663,
+    0.9554410644647336,
+    0.953894270255067,
+    0.948978930222098,
+    0.9634089685955476,
+    0.9767226653060878,
+    0.9742612165774386,
+    0.9823309821989792,
+    0.972694746083642,
+    0.9760380637941458,
+    0.9893690470671672,
+    0.9708993842911698,
+    0.9757273850465271,
+    0.9671485401376859,
+    0.9967027071838226,
+    0.9974766416150995,
+    0.9744629655985225,
+    0.9790305097635036,
+    0.9987548411870543,
+    1.0044650213987751,
+    1.014761848723055,
+    1.0241757575400576,
+    1.0104705255845192,
+    1.0177091849662838,
+    1.0271905293092785,
+    1.0094251543038122,
+    0.9992218347667681,
+    1.0155477733266582,
+    1.0316203676143056,
+    1.0219923495434837,
+    1.0165890048134234,
+    1.027551889913195,
+    1.0306232671033007,
+    1.027061622470229,
+    1.040122354056022,
+    1.047482997975106,
+    1.0169428421761584,
+    1.0374034604945335,
+    1.0355036495740855,
+    1.0371384873162366,
+    1.0332872246880471,
+    1.030856547633443,
+    1.029757417784854,
+    1.0311429289916576,
+    1.0448195178866284,
+    1.0289425580064464,
+    1.0436231804886382,
+    1.026751029364972,
+    1.067612801476452,
+    1.0457957496200743,
+    1.068108486912514,
+    1.081717483511341,
+    1.0850241155963385,
+    1.0574807517989975,
+    1.0558519701940823,
+    1.06490190667671,
+    1.0601062818806959,
+    1.0627349364124918,
+    1.0627359566073822,
+    1.0327542864182058,
+    1.0727439116126827,
+    1.0669359511769005,
+    1.0717836648082169,
+    1.0892661384256055,
+    1.0797046041830687,
+    1.0701154072248182,
+    1.0893564642346805,
+    1.0868529311713049,
+    1.0741830183489038,
+    1.069041587789851,
+    1.0731065196897778,
+    1.0624332680923632,
+    1.064976568041445,
+    1.0690104309675346,
+    1.0723045543708631,
+    1.080933182609056,
+    1.1037575363346022,
+    1.1028083380928726,
+    1.100230749188014,
+    1.0770253878256684,
+    1.094822038761654,
+    1.0879840302979213,
+    1.093942915996177,
+    1.1191790623774716,
+    1.083637077017411,
+    1.0768121798679111,
+    1.1192518151043631,
+    1.097680471615158,
+    1.0811882121582594,
+    1.0990290352732492,
+    1.0811649883548087,
+    1.0997333504497255,
+    1.0965205368256807,
+    1.1027372226230239,
+    1.0865929142866673,
+    1.1011484857043656,
+    1.0909739374834413,
+    1.098683608454026,
+    1.1029145641708042,
+    1.0979776730846007,
+    1.1105662886500303,
+    1.1175367886483283,
+    1.0976410011905022,
+    1.0872264264652438,
+    1.0927318811608657,
+    1.0873423292585473,
+    1.0954575914611449,
+    1.0824337823384347,
+    1.0875555781299924,
+    1.0809715553328114,
+    1.0855420426906306,
+    1.0992925212769553,
+    1.1035946549789175,
+    1.0999463416820345,
+    1.100395671095793,
+    1.0893954318189873,
+    1.1045032146341802,
+    1.093217956166553,
+    1.1005347072347849,
+    1.0852085843430432,
+    1.0789602263664928,
+    1.0887982619806913,
+    1.0687690911602565,
+    1.090945822243128,
+    1.0877047474097883,
+    1.101644857053142,
+    1.0789927091527864,
+    1.0825156979170982,
+    1.0837000498866574,
+    1.0756225065338831,
+    1.0829864449408968,
+    1.0685335657785753,
+    1.0925102913092553,
+    1.0600132612829483,
+    1.0704836108322133,
+    1.0682039527208194,
+    1.0785997694913696,
+    1.0818271951026823,
+    1.0613502472830723,
+    1.0838923284280595,
+    1.084882697977834,
+    1.0877494691873122,
+    1.0868406201137049,
+    1.0772223516516208,
+    1.0841818455349022,
+    1.0748495350858172,
+    1.086221376254962,
+    1.0851321043257212,
+    1.064433974759666,
+    1.0892829156268033,
+    1.071402828213843,
+    1.0698712877626935,
+    1.0739122655192073,
+    1.065993432320078,
+    1.0515632909294492,
+    1.0683168733892119,
+    1.0619243307846735,
+    1.070607656624794,
+    1.0569891090240935,
+    1.0399911979796628,
+    1.0422596905885981,
+    1.051825859118667,
+    1.0472784015253276,
+    1.0515280712786688,
+    1.04376952697585,
+    1.0526019146382735,
+    1.038962365486694,
+    1.047702901153666,
+    1.0470361938966057,
+    1.0426665541896503,
+    1.027456808396649,
+    1.038685912286146,
+    1.020266519497275,
+    1.0363114248297285,
+    1.0280585839301704,
+    1.0207395850851246,
+    1.015357598174854,
+    1.0190055709431778,
+    1.0155445952797624,
+    1.0084202810517462,
+    1.0235560224822766,
+    1.0225403100865034,
+    1.0302131229796232,
+    1.0273602094691028,
+    1.0211574819621625,
+    1.029873690692017,
+    1.0322423653899548,
+    1.023600328029755,
+    1.014229826831081,
+    1.0278855406085836,
+    1.0140852182083748,
+    1.0079900309220944,
+    1.0032179808223418,
+    1.0012181153478983,
+    1.0086522939607996,
+    0.9919158871356459,
+    1.0111327395369987,
+    0.9968678430160798,
+    0.9898187464178351,
+    1.0117306517259896,
+    1.0010066245467628,
+    1.0022632540526617,
+    0.9993302495374262,
+    1.0111438299000217,
+    0.9966049045863505,
+    1.0082630215337955,
+    0.9847109973929172,
+    0.9987480916008954,
+    1.0046238480788678,
+    0.984145157762702,
+    0.9960565949896096,
+    0.9959238025579453,
+    0.9892114278606486,
+    0.992965491875001,
+    0.9977324490404976,
+    0.9965072705045527,
+    0.989431341136121,
+    0.9831521208913168,
+    0.9732675364739319,
+    0.9739328288215262,
+    0.9677712825113559,
+    0.9715905958674823,
+    0.9894326791800787,
+    0.9819556456754557,
+    0.9796061989288256,
+    0.9842151403613055,
+    0.983675758711672,
+    0.9640785495109013,
+    0.9698355381736782,
+    0.9555901364310099,
+    0.9506720215651014,
+    0.959447746923926,
+    0.9548357264346112,
+    0.9551433023940843,
+    0.9582639787478575,
+    0.962207596483688,
+    0.9573740307361962,
+    0.9606603497114531,
+    0.9617748207469354,
+    0.943813565990454,
+    0.9663741773327197,
+    0.959819036557931,
+    0.9655333246317275,
+    0.9613789432333673,
+    0.9543851340734438,
+    0.950460301669305,
+    0.9544035538187422,
+    0.945153750348023,
+    0.9602193793718352,
+    0.9546787481256025,
+    0.9573777225544632,
+    0.9643549653972322,
+    0.9528858888095539,
+    0.9485851931221448,
+    0.9552942652836884,
+    0.9454220640961187,
+    0.9576746229583956,
+    0.9548042131081433,
+    0.9493117127070688,
+    0.9417292473206347,
+    0.9470940702319205,
+    0.9367407740023017,
+    0.9427424329088555,
+    0.9298780610019983,
+    0.9501167901163639,
+    0.9467830104256901,
+    0.9469282885166047,
+    0.9435183856457554,
+    0.9457837977335113,
+    0.9497841121442879,
+    0.9611949070944282,
+    0.9570894006663473,
+    0.9468787920592683,
+    0.9542093928413954,
+    0.9472715036106402,
+    0.9456707299879977,
+    0.9451617190104274,
+    0.948179174263953,
+    0.9523104709704462,
+    0.9496240597190584,
+    0.9409250509111895,
+    0.9374612784077975,
+    0.9442586193288056,
+    0.9467388259196927,
+    0.9460422576894723,
+    0.9416541653090239,
+    0.9391020613903426,
+    0.933500966335599,
+    0.9459622999791202,
+    0.9443821339664806,
+    0.9489725519047035,
+    0.9364438159329445,
+    0.9419053960893238,
+    0.9507583495996101,
+    0.9324399926354396,
+    0.9291935481717228,
+    0.9303537910284089,
+    0.9444078145327155,
+    0.9375534838722791,
+    0.9394636072222085,
+    0.92871323179342,
+    0.942480098750334,
+    0.9259564440769306,
+    0.9394992422623338,
+    0.9406922833199958,
+    0.9468810791225069,
+    0.9468138731411269,
+    0.9309028516414105,
+    0.9465472806496651,
+    0.9343859645116529,
+    0.9489004184523574,
+    0.9379615124474174,
+    0.9357509043398906,
+    0.9506775968834837,
+    0.9510517293020887,
+    0.9465172817673361,
+    0.9537150708798245,
+    0.9517370089884494,
+    0.9598518582181698,
+    0.9635237289936159,
+    0.9556368606363346,
+    0.949519199480537,
+    0.9526467028829592,
+    0.9502700864612504,
+    0.948889679560888,
+    0.9474305851339967,
+    0.9664552703498824,
+    0.9567718834026936,
+    0.969446721614296,
+    0.9636269322344949,
+    0.9698015515117111,
+    0.9534309791770249,
+    0.9654808228409105,
+    0.9665494592630741,
+    0.9628026786403956,
+    0.9605206592892286,
+    0.9751558088652321,
+    0.9689172441967999,
+    0.969318680753582,
+    0.9725191385889778,
+    0.9685534099772185,
+    0.959336696700677,
+    0.9768625768688358,
+    0.9731840067502096,
+    0.9773295867107115,
+    0.9804286717671346,
+    0.9826451912970441,
+    0.9736928080738363,
+    0.975713404250127,
+    0.9815349935611426,
+    0.987332936077901,
+    0.974753417767556,
+    0.9765156129733905,
+    0.9748385910130926,
+    0.9688466647572225,
+    0.9678471627649821,
+    0.9721997681939257,
+    0.9783531167165825,
+    0.9802717814301433,
+    0.9730448256085152,
+    0.9830820702843379,
+    0.9753740835252146,
+    0.979462430284125,
+    0.9838400062927203,
+    0.9813628550486825,
+    0.9892627539656026,
+    0.9792088657627879,
+    0.9880296786130983,
+    0.9957546262050672,
+    0.9930049924334124,
+    0.9982714438217326,
+    0.9856082627275192,
+    0.9789736671571122,
+    0.9883637823814763,
+    0.9644604117644366,
+    0.9818109347194733,
+    0.985012717963897,
+    0.9861129739687009,
+    0.9976289698573562,
+    0.9846184604124009,
+    0.9976492341808962,
+    0.9820548263363079,
+    0.9873542645514659,
+    0.992964637351658,
+    0.9883188829393438,
+    1.0072792942108306,
+    0.9929011510494146,
+    0.9872141514799101,
+    0.990390256704992,
+    1.0136898334801798,
+    1.0078454850191656,
+    1.00376532232553,
+    1.0054670283097311,
+    0.9945578403437527,
+    0.9941338885735833,
+    0.9971379236788495,
+    1.0000574593633913,
+    0.9992974374906066,
+    1.0083365680582357,
+    1.0001810540493992,
+    1.0084318913756343,
+    1.006799093756035,
+    1.0022486273617033,
+    0.999313467396933,
+    1.014636974016175,
+    1.0017986613115475,
+    0.9958326790058017,
+    1.0057782749686957,
+    1.003983044135106,
+    1.0028612131243602,
+    0.9976670933736519,
+    1.00882975508827,
+    1.0071404881326231,
+    1.005176114134253,
+    1.0148662198907994,
+    1.0148416126439221,
+    1.012730260074658,
+    1.0123594131073963,
+    1.0056161804399277,
+    1.0093007215934942,
+    0.9963029394503724,
+    1.0173150715872663,
+    1.0095039029290993,
+    1.0099913802808271,
+    1.0051300522841478,
+    1.0095882717837479,
+    1.0204145492784207,
+    1.0158966897272856,
+    1.019048987416223,
+    1.0201846531663084,
+    1.0103288902133964,
+    1.004703163938179,
+    1.0169359441544215,
+    1.0135076610643479,
+    1.0056115761734157,
+    1.0058083781934744,
+    1.0211691798356988,
+    1.0133968231651032,
+    1.0263808585991219,
+    1.0220280000435038,
+    1.017955269887011,
+    1.022510289967539,
+    1.0279445496154698,
+    1.0166186805527657,
+    1.0222398254221352,
+    1.0175996146606439,
+    1.0084231357377182,
+    1.0032600793182906,
+    1.0040615127961194,
+    1.0111247117555568,
+    1.0069943988565468,
+    1.0123579402233216,
+    1.0113699025724132,
+    1.012175744555422,
+    1.0141157315181217,
+    0.9998451136946925,
+    1.0025421289216467,
+    1.0099528521131984,
+    1.0098100504044547,
+    1.0083118289462507,
+    1.0143505103721029,
+    1.0152571116202482,
+    1.029794782292994,
+    1.0225977143017422,
+    1.0275100997248856,
+    1.023466584868501,
+    1.0263184376305783,
+    1.0356170397463178,
+    1.0333861246009628,
+    1.0325245762134814,
+    1.0337850800914976,
+    1.029447087717139,
+    1.0269202870500156,
+    1.0119301303568502,
+    1.0232711053224484,
+    1.0322185738407066,
+    1.0314841908298606,
+    1.0312200084252992,
+    1.0306742149908106,
+    1.0255149800407577,
+    1.0204960886228402,
+    1.0272681149431224,
+    1.0269749463792666,
+    1.0280747948690763,
+    1.0284585005786002,
+    1.034302190224663,
+    1.0249042039017016,
+    1.0218111256890088,
+    1.0147041040202613,
+    1.0173070890395466,
+    1.0187981772768981,
+    1.021444017570701,
+    1.0184362610671618,
+    1.0237206420720713,
+    1.0234526118805796,
+    1.0197844790522157,
+    1.0263089616607224,
+    1.0378022324316605,
+    1.021046415728979,
+    1.025693008413538,
+    1.0247537318039452,
+    1.0281439186812116,
+    1.0222201826852058,
+    1.0368936592186748,
+    1.0164679183114222,
+    1.020023072316645,
+    1.0193623055405578,
+    1.0344744831567385,
+    1.022054005274224,
+    1.0318891737207427,
+    1.020724903682676,
+    1.0151834307640655,
+    1.0195466050554036,
+    1.020475900196064,
+    1.021724427129754,
+    1.0255522646787139,
+    1.026433866850669,
+    1.0254961019254138,
+    1.0218125135110199,
+    1.0198320582001867,
+    1.025722880341277,
+    1.0226345166406678,
+    1.0287313576621289,
+    1.029762390669091,
+    1.0332780800310128,
+    1.030220983215475,
+    1.0214884991921602,
+    1.0227208519936921,
+    1.0267088000009008,
+    1.0241647154931124,
+    1.0295968609826687,
+    1.0262236535270697,
+    1.035089928965587,
+    1.0309743235812359,
+    1.0337065214995627,
+    1.0243711851205104,
+    1.0213390230401116,
+    1.013836526866688,
+    1.0234222495690333,
+    1.0171245275777303,
+    1.024725274059414,
+    1.0212595223968954,
+    1.008467419039932,
+    1.014076467834017,
+    1.0177322226459782,
+    1.0260768328805527,
+    1.0242506028689244,
+    1.0134736631732568,
+    1.0226171031315379,
+    1.0089543435926487,
+    1.021405286075377,
+    1.0161015480648796,
+    1.0125846746362288,
+    1.0246907723652592,
+    1.0249211710654325,
+    1.0151501224556034,
+    1.017179998968161,
+    1.0162640079338539,
+    1.0163640569411887,
+    1.0185429238427446,
+    1.0134984227048893,
+    1.0112791337247986,
+    1.021679902282509,
+    1.0100403291330824,
+    1.011336716660335,
+    1.0099161125152065,
+    1.011639358624959,
+    1.0020835564481316,
+    1.0086423953082637,
+    0.998929984738755,
+    0.9987713025664443,
+    1.0020773448310254,
+    0.9922558850534852,
+    0.9954254597291139,
+    0.9912843108787264,
+    0.9900114237598912,
+    0.9972444735451292,
+    1.0041079077434913,
+    0.9969448203126414,
+    0.9990358485519998,
+    1.000165537119838,
+    1.0067127835397085,
+    1.0067683706223327,
+    1.0045021709625326,
+    0.9960547616498587,
+    0.9919958568601477,
+    1.000100448864924,
+    0.996779219064522,
+    0.9891758127910077,
+    0.9984979212339998,
+    0.9841306147254836,
+    0.9890278395813925,
+    0.9807760510998595,
+    0.9808314688941979,
+    0.9862263299647727,
+    0.982077351782267,
+    0.985151163852854,
+    0.9860982389577772,
+    0.9883812085388923,
+    0.9756562628253941,
+    0.9921521621722887,
+    0.9960023818226155,
+    0.9911575036705469,
+    0.9884742840728559,
+    0.9822233798858923,
+    0.9866471227015866,
+    0.9870597087287412,
+    0.9776841719439255,
+    0.9807208561359931,
+    0.9849128955302724,
+    0.9719108904677505,
+    0.9747876070736453,
+    0.9787392403023859,
+    0.9825770867969653,
+    0.9851699045232578,
+    0.9818775952452977,
+    0.9704951298556965,
+    0.9765210838992356,
+    0.9669535720911551,
+    0.9772329322876696,
+    0.974794138768406,
+    0.977363727897381,
+    0.9703327642974778,
+    0.9760998876930806,
+    0.9806347000180651,
+    0.9757792632928948,
+    0.9796566073053173,
+    0.982386746175942,
+    0.9774732538382501,
+    0.9827537286043831,
+    0.9732851489533615,
+    0.9729885763294773,
+    0.9720063486897329,
+    0.9754992750102658,
+    0.9714142698324154,
+    0.984229959009962,
+    0.9646888432105113,
+    0.9705490154065248,
+    0.9645258806997316,
+    0.9706575742228841,
+    0.9724639289684163,
+    0.9787327636914457,
+    0.9697137904763615,
+    0.9659467768433155,
+    0.9654364766182928,
+    0.9683125911790161,
+    0.9688772495213902,
+    0.9687687862450325,
+    0.9637584386855013,
+    0.9679051071500938,
+    0.9640051862903135,
+    0.9626625796463686,
+    0.9641988075476664,
+    0.9697878870216656,
+    0.9730845158054343,
+    0.9734598102783154,
+    0.9720844021251868,
+    0.9757848455511476,
+    0.979897538742182,
+    0.9774569794252517,
+    0.9733310902210655,
+    0.970670543483016,
+    0.9689770654663177,
+    0.9796136412475318,
+    0.9773728658736967,
+    0.9777962032444691,
+    0.9709282762381961,
+    0.970287999327885,
+    0.9772879740194125,
+    0.9674332689145425,
+    0.969298293388458,
+    0.9685212932549898,
+    0.9697540151415577,
+    0.973425760647251,
+    0.9687758624131666,
+    0.9674713742135072,
+    0.9765215378066355,
+    0.9787144330497013,
+    0.9781764313458662,
+    0.987694862424089,
+    0.967973436533951,
+    0.9784343091992236,
+    0.9786467128039911,
+    0.9826295925787922,
+    0.9817668994613925,
+    0.9758075240526665,
+    0.9823311240052138,
+    0.9755274026688971,
+    0.9783758361554801,
+    0.9874782692907087,
+    0.9705021121820586,
+    0.9748252570550389,
+    0.9682999443657561,
+    0.9680645292478224,
+    0.9643168287153016,
+    0.9804814985782438,
+    0.9864947778463321,
+    0.9727551387107344,
+    0.9786046561977703,
+    0.9759298008980837,
+    0.973416795696072,
+    0.9743650409676227,
+    0.9784059925045642,
+    0.9796517637258189,
+    0.9879725146864218,
+    0.9739151426006365,
+    0.977820124585643,
+    0.9851171337812072,
+    0.9846512085093174,
+    0.9808349944440113,
+    0.9855354672504592,
+    0.9726640201092598,
+    0.9789091561742688,
+    0.9934762986125053,
+    0.9984985414230405,
+    0.9947977267330409,
+    1.0011032323889508,
+    0.9866446396719116,
+    0.9859355657099652,
+    0.9828953033623566,
+    0.9821915187711837,
+    0.9854079769805424,
+    0.977324784078183,
+    0.975576596489417,
+    0.9861628492416505,
+    0.985004942223135,
+    0.9904571963498763,
+    0.9911952349107761,
+    0.9842104692022329,
+    0.9798635172627131,
+    0.9843744530439128,
+    0.9902311050613231,
+    0.9855092947185814,
+    0.9860941240721062,
+    0.9849844890645845,
+    0.9879741779468395,
+    0.9856187939948848,
+    0.9915881917383763,
+    0.9877391460178789,
+    0.9877853766320721,
+    0.9822933056721372,
+    0.9870158827414306,
+    0.9969955570077109,
+    0.9875628268743232,
+    0.986749092123429,
+    0.991665095712962,
+    0.9928015066499442,
+    0.9991272724232078,
+    0.9944605936769653,
+    0.9975331056062472,
+    0.9999756304438497,
+    0.9872666463533789,
+    0.989487709476842,
+    0.9959667755922726,
+    0.9930241564287661,
+    0.997239215497106,
+    1.0018727847385296,
+    1.0010215223897696,
+    0.9910038345604888,
+    1.012197874836928,
+    1.0042311923969178,
+    0.9952050317431426,
+    1.0034820914548586,
+    1.0025690570860488,
+    1.0010486399412422,
+    1.0001598009810848,
+    1.0070457388665004,
+    1.0049566458058228,
+    1.0092921459590918,
+    1.0019821202985073,
+    1.0068718559558723,
+    1.001211601354116,
+    1.0001036691700675,
+    1.0053745220499837,
+    0.9990955593167137,
+    1.0064116496046536,
+    1.006317621880746,
+    0.9972078195172459,
+    1.011027478375734,
+    1.004957478133365,
+    1.0021010747270835,
+    1.0072859011939053,
+    0.9961707539753418,
+    0.9991319143098468,
+    1.000720916447033,
+    1.0095860201079068,
+    1.008218852087262,
+    1.0069134716507802,
+    1.0073991434457272,
+    0.9987559226970789,
+    1.004561299420871,
+    1.0086081610794446,
+    1.003904927527722,
+    1.010146252132051,
+    1.0053931898786905,
+    1.0041761631124464,
+    1.0138509753090625,
+    1.0079634567895421,
+    1.0105852344247912,
+    1.004502783996992,
+    1.005631048854521,
+    1.0025249834717904,
+    1.0009502891511262,
+    0.9963348101220854,
+    1.0012740908821578,
+    0.9998391617714302,
+    1.0027057422874766,
+    1.008879440282654,
+    1.005121661339833,
+    1.0102802682611776,
+    1.0066624025347728,
+    1.0118990357456594,
+    0.998195931405513,
+    0.9987696773473173,
+    1.0023224129657173,
+    1.0075338759118608,
+    1.0021434856241005,
+    1.001362687406496,
+    1.0013575772081647,
+    1.0007101934177791,
+    1.0011187444015446,
+    1.002861347377867,
+    1.0067032547924408,
+    1.002464291592441,
+    1.007850689343861,
+    0.9981724241842045,
+    1.0016792739032883,
+    0.9998365382668778,
+    1.0057543950347778,
+    0.998825766272738,
+    0.9897941480902858,
+    0.9953651876997947,
+    1.00077257434167,
+    1.0014226526103411,
+    1.0025882498834058,
+    1.0052097152127994,
+    1.0034316211709986,
+    1.0046613297055296,
+    0.9996289959090002,
+    1.006814619866232,
+    1.0036633801042025,
+    1.0021145592522696,
+    1.0092850960885957,
+    1.0151013548956331,
+    1.0046465976744154,
+    1.0120391693477564,
+    1.013746313457754,
+    1.0042588840937834,
+    1.014673758840604,
+    1.0012334721339695,
+    1.0049541902850205,
+    1.005768397039713,
+    1.0016444227838868,
+    0.9975843289083547,
+    1.005380673722977,
+    1.0052504538208928,
+    1.0009110655189222,
+    1.0004439441949429,
+    1.0077990529977885,
+    1.0032913626291777,
+    0.9997069377717944,
+    1.0094452036913009,
+    1.0078595292140515,
+    1.012516273304234,
+    1.0081517235383441,
+    1.0041352677377458,
+    1.007036270986031,
+    0.9951904213206221,
+    0.9984834954635169,
+    1.0024574033602858,
+    1.0150075534653413,
+    0.9963083968849714,
+    1.000937347833075,
+    1.000308408589429,
+    1.0012624490307993,
+    1.0045133550335732,
+    1.0043709037028252,
+    1.0017586020217946,
+    1.0090347988773631,
+    1.0040632214145637,
+    0.9997488972933867,
+    1.0057780673063526,
+    0.9939349559131175,
+    0.9946010589863523,
+    1.0029379554257547,
+    1.0028093264877005,
+    0.9998575874075157,
+    0.9991089355646636,
+    1.0021442886722516,
+    1.0006685055533626,
+    0.9973691941201047,
+    1.0060720004649688,
+    0.9997991760873588,
+    0.9985193762757829,
+    0.988823911623658,
+    0.9983129139750483,
+    0.9966782682189629,
+    0.9896151925236073,
+    0.9974619843679701,
+    1.0051011131109384,
+    0.9955840358552149,
+    1.0115501968714549,
+    1.0007400671784157,
+    1.0015356486700921,
+    1.00070290531227,
+    0.9942734874492205,
+    0.9952407325827318,
+    0.9965084996185559,
+    0.9971994887673633,
+    1.007194411120184
+  ]
+}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/data/structure_factor.json b/CI/integration_tests/calculators/data/structure_factor.json
new file mode 100644
index 00000000..6571ab9e
--- /dev/null
+++ b/CI/integration_tests/calculators/data/structure_factor.json
@@ -0,0 +1,1 @@
+{"x": [1.0, 2.0], "y": [2.412625438618138, 0.679260779765575], "uncertainty": [0.01451453705244969, 0.0]}
\ No newline at end of file
diff --git a/CI/integration_tests/calculators/test_angular_distribution_function.py b/CI/integration_tests/calculators/test_angular_distribution_function.py
new file mode 100644
index 00000000..ca2163ae
--- /dev/null
+++ b/CI/integration_tests/calculators/test_angular_distribution_function.py
@@ -0,0 +1,90 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the ADF
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'angular_distribution_function.json'
+    return json.loads(data.read_bytes())
+
+
+def test_adf_project(traj_files, true_values, tmp_path):
+    """Test the ADF called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.AngularDistributionFunction(plot=False)
+
+    data_dict = project.load_data.AngularDistributionFunction()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=2)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=2)
+
+
+def test_adf_experiment(traj_files, true_values, tmp_path):
+    """Test the ADF called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.AngularDistributionFunction(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.AngularDistributionFunction()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=2)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=2)
diff --git a/CI/integration_tests/calculators/test_coordination_numbers.py b/CI/integration_tests/calculators/test_coordination_numbers.py
new file mode 100644
index 00000000..ca7d6d0d
--- /dev/null
+++ b/CI/integration_tests/calculators/test_coordination_numbers.py
@@ -0,0 +1,93 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the RDF
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'coordination_numbers.json'
+    return json.loads(data.read_bytes())
+
+
+def test_cn_project(traj_files, true_values, tmp_path):
+    """Test the CN called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    # project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.run_computation.CoordinationNumbers(plot=False)
+
+    data_dict = project.load_data.CoordinationNumbers(plot=False)[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_cn_experiment(traj_files, true_values, tmp_path):
+    """Test the CN called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.CoordinationNumbers(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.CoordinationNumbers(plot=False)[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/test_einstein_diffusion_coefficients.py b/CI/integration_tests/calculators/test_einstein_diffusion_coefficients.py
new file mode 100644
index 00000000..6c9a8515
--- /dev/null
+++ b/CI/integration_tests/calculators/test_einstein_diffusion_coefficients.py
@@ -0,0 +1,92 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the einstein_diffusion_coefficients
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'einstein_diffusion_coefficients.json'
+    return json.loads(data.read_bytes())
+
+
+def test_rdf_project(traj_files, true_values, tmp_path):
+    """Test the EinsteinDiffusionCoefficients called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.EinsteinDiffusionCoefficients(plot=False, data_range=300, correlation_time=1)
+
+    data_dict = project.load_data.EinsteinDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_rdf_experiment(traj_files, true_values, tmp_path):
+    """Test the EinsteinDiffusionCoefficients called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.EinsteinDiffusionCoefficients(plot=False, data_range=300,
+                                                                              correlation_time=1)
+
+    data_dict = project.experiments['NaCl'].load_data.EinsteinDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/test_einstein_helfand_ionic_conductivity.py b/CI/integration_tests/calculators/test_einstein_helfand_ionic_conductivity.py
new file mode 100644
index 00000000..5c15b3a5
--- /dev/null
+++ b/CI/integration_tests/calculators/test_einstein_helfand_ionic_conductivity.py
@@ -0,0 +1,101 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the Einstein_Helfand_Ionic_Conductivity
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'einstein_helfand_ionic_conductivity.json'
+    return json.loads(data.read_bytes())
+
+
+def test_ehic_project(traj_files, true_values, tmp_path):
+    """Test the Einstein_Helfand_Ionic_Conductivity called from the project class
+
+    Notes
+    ------
+    Test uncertainty is very high!
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.EinsteinHelfandIonicConductivity(plot=False)
+
+    data_dict = project.load_data.EinsteinHelfandIonicConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=-5)
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'], decimal=-5)
+
+
+def test_ehic_experiment(traj_files, true_values, tmp_path):
+    """Test the Einstein_Helfand_Ionic_Conductivity called from the experiment class
+
+    Notes
+    ------
+    Test uncertainty is very high!
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.EinsteinHelfandIonicConductivity(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.EinsteinHelfandIonicConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=-5)
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'], decimal=-5)
diff --git a/CI/integration_tests/calculators/test_green_kubo_ionic_conductivity.py b/CI/integration_tests/calculators/test_green_kubo_ionic_conductivity.py
new file mode 100644
index 00000000..f47eb209
--- /dev/null
+++ b/CI/integration_tests/calculators/test_green_kubo_ionic_conductivity.py
@@ -0,0 +1,93 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test for the green_kubo_ionic_conductivity
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_ionic_conductivity.json'
+    return json.loads(data.read_bytes())
+
+
+def test_gkic_project(traj_files, true_values, tmp_path):
+    """Test the green_kubo_ionic_conductivity called from the project class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboIonicConductivity(plot=False)
+
+    data_dict = project.load_data.GreenKuboIonicConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_gkic_experiment(traj_files, true_values, tmp_path):
+    """Test the green_kubo_ionic_conductivity called from the experiment class
+    """
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.GreenKuboIonicConductivity(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.GreenKuboIonicConductivity()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/test_green_kubo_self_diffusion_coefficients.py b/CI/integration_tests/calculators/test_green_kubo_self_diffusion_coefficients.py
new file mode 100644
index 00000000..4df95fcb
--- /dev/null
+++ b/CI/integration_tests/calculators/test_green_kubo_self_diffusion_coefficients.py
@@ -0,0 +1,90 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the GK self diffusion
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'green_kubo_self_diffusion.json'
+    return json.loads(data.read_bytes())
+
+
+def test_gksd_project(traj_files, true_values, tmp_path):
+    """Test the green_kubo_self_diffusion called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.GreenKuboSelfDiffusionCoefficients(plot=False)
+
+    data_dict = project.load_data.GreenKuboSelfDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_gksd_experiment(traj_files, true_values, tmp_path):
+    """Test the green_kubo_self_diffusion called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.GreenKuboSelfDiffusionCoefficients(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.GreenKuboSelfDiffusionCoefficients()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/test_kirkwood_buff_integrals.py b/CI/integration_tests/calculators/test_kirkwood_buff_integrals.py
new file mode 100644
index 00000000..f4575a24
--- /dev/null
+++ b/CI/integration_tests/calculators/test_kirkwood_buff_integrals.py
@@ -0,0 +1,92 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the Kirkwood Buff integrals
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'kirkwood_buff_integrals.json'
+    return json.loads(data.read_bytes())
+
+
+def test_project(traj_files, true_values, tmp_path):
+    """Test the kbi called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.run_computation.KirkwoodBuffIntegral(plot=False)
+
+    data_dict = project.load_data.KirkwoodBuffIntegral()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=2)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=2)
+
+
+def test_experiment(traj_files, true_values, tmp_path):
+    """Test the rdf called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.experiments['NaCl'].run_computation.KirkwoodBuffIntegral()
+
+    data_dict = project.experiments['NaCl'].load_data.KirkwoodBuffIntegral()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=2)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=2)
diff --git a/CI/integration_tests/calculators/test_potential_of_mean_force.py b/CI/integration_tests/calculators/test_potential_of_mean_force.py
new file mode 100644
index 00000000..ef0709cb
--- /dev/null
+++ b/CI/integration_tests/calculators/test_potential_of_mean_force.py
@@ -0,0 +1,92 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the RDF
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'potential_of_mean_force.json'
+    return json.loads(data.read_bytes())
+
+
+def test_pomf_project(traj_files, true_values, tmp_path):
+    """Test the pomf called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.run_computation.PotentialOfMeanForce(plot=False)
+
+    data_dict = project.load_data.PotentialOfMeanForce()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
+
+
+def test_pomf_experiment(traj_files, true_values, tmp_path):
+    """Test the pomf called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+    project.experiments['NaCl'].run_computation.PotentialOfMeanForce(plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.PotentialOfMeanForce()[0].data_dict
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'])
+    np.testing.assert_array_almost_equal(data_dict['uncertainty'], true_values['uncertainty'])
diff --git a/CI/integration_tests/calculators/test_radial_distribution_function.py b/CI/integration_tests/calculators/test_radial_distribution_function.py
new file mode 100644
index 00000000..7fb5ade8
--- /dev/null
+++ b/CI/integration_tests/calculators/test_radial_distribution_function.py
@@ -0,0 +1,102 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test the RDF
+"""
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import data as static_data
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        # "NaCl_gk_ni_nq.lammpstraj",
+        # "NaCl_i_q.lammpstraj",
+        # "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def true_values() -> dict:
+    """Values to compare to"""
+    static_path = Path(static_data.__file__).parent
+    data = static_path / 'radial_distribution_function.json'
+    return json.loads(data.read_bytes())
+
+
+def test_rdf_project(traj_files, true_values, tmp_path):
+    """Test the rdf called from the project class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+
+    data_dict = project.load_data.RadialDistributionFunction()[0].data_dict
+
+    data_dict['x'][data_dict['x'] is None] = 0
+    data_dict['y'][data_dict['y'] is None] = 0
+
+    true_values['x'][true_values['x'] is None] = 0
+    true_values['y'][true_values['y'] is None] = 0
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=3)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=3)
+
+
+def test_rdf_experiment(traj_files, true_values, tmp_path):
+    """Test the rdf called from the experiment class"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.002, temperature=1400)
+
+    project.experiments['NaCl'].run_computation.RadialDistributionFunction(number_of_configurations=-1, plot=False)
+
+    data_dict = project.experiments['NaCl'].load_data.RadialDistributionFunction()[0].data_dict
+
+    data_dict['x'][data_dict['x'] is None] = 0
+    data_dict['y'][data_dict['y'] is None] = 0
+
+    true_values['x'][true_values['x'] is None] = 0
+    true_values['y'][true_values['y'] is None] = 0
+
+    np.testing.assert_array_almost_equal(data_dict['x'], true_values['x'], decimal=3)
+    np.testing.assert_array_almost_equal(data_dict['y'], true_values['y'], decimal=3)
diff --git a/CI/integration_tests/project/test_run_load_multiple_experiments.py b/CI/integration_tests/project/test_run_load_multiple_experiments.py
new file mode 100644
index 00000000..72e564e5
--- /dev/null
+++ b/CI/integration_tests/project/test_run_load_multiple_experiments.py
@@ -0,0 +1,90 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Test run_computation and load_data if multiple experiments have been selected
+"""
+
+import json
+import os
+
+import pytest
+
+import numpy as np
+import urllib.request
+import gzip
+import shutil
+from pathlib import Path
+
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        "NaCl_gk_ni_nq.lammpstraj",
+        "NaCl_i_q.lammpstraj",
+        "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+@pytest.fixture(scope="session")
+def project(tmp_path_factory) -> mds.Project:
+    """Create a project in a temporary directory"""
+    os.chdir(tmp_path_factory.getbasetemp())
+    project = mds.Project()
+
+    return project
+
+
+def test_add_run_load_data(project, traj_files):
+    """Add data and run RDF on all of them
+
+    Test the run_computation and load_data method on multiple experiments
+    """
+    project.add_experiment("NaCl0", data=traj_files[0], timestep=0.002, temperature=1400)
+    project.add_experiment("NaCl1", data=traj_files[1], timestep=0.002, temperature=1400)
+    project.add_experiment("NaCl2", data=traj_files[2], timestep=0.002, temperature=1400)
+    project.add_experiment("NaCl3", data=traj_files[3], timestep=0.002, temperature=1400)
+
+    # Check that 4 experiments have been created
+    assert len(project.experiments) == 4
+
+    project.run_computation.RadialDistributionFunction(plot=False)
+
+    loaded_data = project.load_data.RadialDistributionFunction()
+
+    # Check that data for 4 experiments has been loaded
+    assert len(loaded_data) == 4
+    # Check the keys
+    assert {x for x in loaded_data} == {'NaCl0', 'NaCl1', 'NaCl2', 'NaCl3'}#
+
+    # Each loaded data should contain 3 entries, Na-Na, Na-Cl, Cl-Cl
+    for data in loaded_data.values():
+        assert len(data) == 3
diff --git a/CI/unit_tests/database/test_experiment_database.py b/CI/unit_tests/database/test_experiment_database.py
new file mode 100644
index 00000000..01451745
--- /dev/null
+++ b/CI/unit_tests/database/test_experiment_database.py
@@ -0,0 +1,104 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Tests for the experiment database
+"""
+import os
+from tempfile import TemporaryDirectory
+import pytest
+import mdsuite as mds
+import numpy as np
+
+temp_dir = TemporaryDirectory()
+cwd = os.getcwd()
+
+
+@pytest.fixture(autouse=True)
+def prepare_env():
+    """Prepare temporary environment"""
+    temp_dir = TemporaryDirectory()
+    os.chdir(temp_dir.name)
+
+    yield
+
+    os.chdir(cwd)
+    temp_dir.cleanup()
+
+
+def test_project_temperature():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].temperature = 9000
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    assert project_2.experiments['Exp01'].temperature == 9000
+
+
+def test_project_time_step():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].time_step = 1
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    assert project_2.experiments['Exp01'].time_step == 1
+
+
+def test_project_unit_system():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].unit_system = "real"
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    assert project_2.experiments['Exp01'].unit_system == "real"
+
+
+def test_project_number_of_configurations():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].number_of_configurations = 100
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    assert project_2.experiments['Exp01'].number_of_configurations == 100
+
+
+def test_project_number_of_atoms():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].number_of_atoms = 100
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    assert project_2.experiments['Exp01'].number_of_atoms == 100
+
+
+def test_project_box_array():
+    """Test that the project description is stored correctly in the database"""
+
+    box_array = np.array([1.0, 1.414, 1.732])
+
+    project_1 = mds.Project()
+    project_1.add_experiment(experiment="Exp01")
+    project_1.experiments['Exp01'].box_array = box_array
+
+    project_2 = mds.Project()
+    project_2.load_experiments('Exp01')
+    np.testing.assert_array_equal(project_2.experiments['Exp01'].box_array, box_array)
diff --git a/CI/unit_tests/project/test_project_add_experiment.py b/CI/unit_tests/project/test_project_add_experiment.py
new file mode 100644
index 00000000..fbe370dc
--- /dev/null
+++ b/CI/unit_tests/project/test_project_add_experiment.py
@@ -0,0 +1,83 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Tests for adding data to an experiment
+"""
+import os
+
+import pytest
+
+import urllib.request
+import gzip
+import shutil
+
+import mdsuite as mds
+
+
+@pytest.fixture(scope="session")
+def traj_files(tmp_path_factory) -> list:
+    """Download files into a temporary directory and keep them for all tests"""
+    time_step = 0.002
+    temperature = 1400.0
+    base_url = "https://github.com/zincware/ExampleData/raw/main/"
+
+    files_in_url = [
+        "NaCl_gk_i_q.lammpstraj",
+        "NaCl_gk_ni_nq.lammpstraj",
+        "NaCl_i_q.lammpstraj",
+        "NaCl_ni_nq.lammpstraj",
+    ]
+
+    files = []
+    temporary_path = tmp_path_factory.getbasetemp()
+
+    for item in files_in_url:
+        filename, headers = urllib.request.urlretrieve(
+            f"{base_url}{item}.gz", filename=f"{temporary_path / item}.gz"
+        )
+        with gzip.open(filename, "rb") as f_in:
+            new_file = temporary_path / item
+            with open(new_file, "wb") as f_out:
+                shutil.copyfileobj(f_in, f_out)
+
+            files.append(new_file.as_posix())
+
+    return files
+
+
+def test_add_file_from_list(traj_files, tmp_path):
+    """Check that adding files from lists does not raise an error"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[:1], timestep=0.1, temperature=1600)
+
+    print(project.experiments)
+    assert list(project.experiments) == ["NaCl"]
+
+
+def test_add_file_from_str(traj_files, tmp_path):
+    """Check that adding files from str does not raise an error"""
+    os.chdir(tmp_path)
+    project = mds.Project()
+    project.add_experiment("NaCl", data=traj_files[0], timestep=0.1, temperature=1600)
+
+    print(project.experiments)
+    assert list(project.experiments) == ["NaCl"]
+
+
+def test_add_file_from_dict(traj_files, tmp_path):
+    """Check that adding files from dicts does not raise an error"""
+    os.chdir(tmp_path)
+
+    data = {"file": traj_files[0], "format": "lammps_traj"}
+
+    project = mds.Project()
+    project.add_experiment("NaCl", data=data, timestep=0.1, temperature=1600)
+
+    print(project.experiments)
+    assert list(project.experiments) == ["NaCl"]
diff --git a/CI/unit_tests/project/test_project_database.py b/CI/unit_tests/project/test_project_database.py
new file mode 100644
index 00000000..fd8acef7
--- /dev/null
+++ b/CI/unit_tests/project/test_project_database.py
@@ -0,0 +1,51 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: Integration tests for the project class
+"""
+import os
+from tempfile import TemporaryDirectory
+import pytest
+import mdsuite as mds
+from pathlib import Path
+
+temp_dir = TemporaryDirectory()
+cwd = os.getcwd()
+
+
+@pytest.fixture(autouse=True)
+def prepare_env():
+    """Prepare temporary environment"""
+    temp_dir = TemporaryDirectory()
+    os.chdir(temp_dir.name)
+
+    yield
+
+    os.chdir(cwd)
+    temp_dir.cleanup()
+
+def test_project_description():
+    """Test that the project description is stored correctly in the database"""
+
+    project_1 = mds.Project()
+    project_1.description = "HelloWorld"
+
+    project_2 = mds.Project()
+    assert project_2.description == "HelloWorld"
+
+def test_project_description_from_file():
+    """Test that the project description is stored correctly in the database if read from file"""
+
+    desc = Path('desc.md')
+    desc.write_text("HelloWorld")
+
+    project_1 = mds.Project()
+    project_1.description = "desc.md"
+
+    project_2 = mds.Project()
+    assert project_2.description == "HelloWorld"
diff --git a/CI/unit_tests/project/test_project_load_experiments.py b/CI/unit_tests/project/test_project_load_experiments.py
new file mode 100644
index 00000000..c845ba62
--- /dev/null
+++ b/CI/unit_tests/project/test_project_load_experiments.py
@@ -0,0 +1,49 @@
+"""
+This program and the accompanying materials are made available under the terms of the
+Eclipse Public License v2.0 which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-v20.html
+SPDX-License-Identifier: EPL-2.0
+
+Copyright Contributors to the Zincware Project.
+
+Description: 
+"""
+import os
+from tempfile import TemporaryDirectory
+import pytest
+import mdsuite as mds
+from pathlib import Path
+
+temp_dir = TemporaryDirectory()
+cwd = os.getcwd()
+
+
+@pytest.fixture(autouse=True)
+def prepare_env():
+    """Prepare temporary environment"""
+    temp_dir = TemporaryDirectory()
+    os.chdir(temp_dir.name)
+
+    yield
+
+    os.chdir(cwd)
+    temp_dir.cleanup()
+
+
+def test_project_load_experiments():
+    """Test that the project loads experiments"""
+
+    project_1 = mds.Project()
+    project_1.description = "HelloWorld"
+    project_1.add_experiment("Exp01", active=False)
+    project_1.add_experiment("Exp02", active=False)
+
+    project_2 = mds.Project()
+    project_2.load_experiments("Exp01")
+
+    assert len(project_2.active_experiments) == 1
+
+    project_3 = mds.Project()
+    project_3.load_experiments(["Exp01", "Exp02"])
+
+    assert len(project_3.active_experiments) == 2
diff --git a/CI/unit_tests/utils/test_meta_functions.py b/CI/unit_tests/utils/test_meta_functions.py
index eed66a03..abbb2701 100644
--- a/CI/unit_tests/utils/test_meta_functions.py
+++ b/CI/unit_tests/utils/test_meta_functions.py
@@ -141,10 +141,9 @@ def func(x: np.ndarray):
             return x**2
         x_dat = np.linspace(-10, 10, 1000)
         data = [x_dat, func(x_dat)]
-        output = golden_section_search(data, 10, -10, tol=0.1)
-
-        self.assertEqual(output[0], -0.03003003003003002)
-        self.assertEqual(output[1], 0.05005005005005003)
+        output = golden_section_search(data, 10, -10)
+        self.assertEqual(output[0], 0.010010010010010006)
+        self.assertEqual(output[1], 0.03003003003003002)
 
     def test_round_down(self):
         """