update data structures to allow for experiment creation

This commit is contained in:
Hunter 2024-07-29 17:25:40 -04:00
parent 42b3a9cf12
commit 8d9b371af4
4 changed files with 104 additions and 38 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__/

View File

@ -30,11 +30,56 @@ class Experiment:
experiment: str experiment: str
date: str date: str
measurements: List[Measurement] = field(default_factory=list) measurements: dict[str, Measurement] = field(default_factory=dict)
variables: List[Variable] = field(default_factory=list) variables: dict[str, Variable] = field(default_factory=dict)
def to_json(self): def to_json(self):
# Convert the data class to a dictionary, which can be easily converted to JSON. # Convert the data class to a dictionary, which can be easily converted to JSON.
import json import json
return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4) return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)
def from_json(self, json_str):
# Convert a JSON string to a data class.
import json
data = json.loads(json_str)
self.__dict__.update(data)
def add_measurement(self, measurement: Measurement):
# Add a measurement to the experiment.
if measurement.name in self.measurements:
raise ValueError(
f"Measurement {measurement.name} already exists in the experiment."
)
self.measurements[measurement.name] = measurement
def add_measurements(self, measurements: List[Measurement]):
# Add a list of measurements to the experiment.
for measurement in measurements:
self.add_measurement(measurement)
def take_measurement(self, source: str, value: float):
# Add a measurement to the experiment.
if source not in self.measurements:
raise ValueError(f"Measurement {source} not found in the experiment.")
self.measurements[source].values.append(value)
def add_variable(self, variable: Variable):
# Add a variable to the experiment.
if variable.name in self.variables:
raise ValueError(
f"Variable {variable.name} already exists in the experiment."
)
self.variables[variable.name] = variable
def add_variables(self, variables: List[Variable]):
# Add a list of variables to the experiment.
for variable in variables:
self.add_variable(variable)
def set_variable(self, source: str, value: Any):
# Set a variable in the experiment.
if source not in self.variables:
raise ValueError(f"Variable {source} not found in the experiment.")
self.variables[source].value = value

View File

@ -5,15 +5,22 @@ from experiment import Experiment, Measurement, Variable
@dataclass @dataclass
class MoistureExperiment(Experiment): class MoistureExperiment(Experiment):
def __init__(self, date: str): def __init__(
super().__init__( self,
experiment="Moisture Analysis", date: str,
date=date, cold_soak_time: float | None,
variables=[ cold_soak_temp: float | None,
Variable("cold-soak-time", "hour", (5, 45)), hot_soak_time: float | None,
Variable("cold-soak-temp", "degF", (69, 72)), hot_soak_temp: float | None,
Variable("hot-soak-time", "minute", (5, 20)), ):
Variable("hot-soak-temp", "degF", (180, 200)), super().__init__(experiment="Moisture Analysis", date=date)
], variables = [
measurements=[Measurement("moisture-content", "%", (0.06, 0.08))], Variable("cold-soak-time", "hour", (5, 45), cold_soak_time),
) Variable("cold-soak-temp", "degF", (69, 72), cold_soak_temp),
Variable("hot-soak-time", "minute", (5, 20), hot_soak_time),
Variable("hot-soak-temp", "degF", (180, 200), hot_soak_temp),
]
self.add_variables(variables)
measurement = Measurement("moisture-content", "%", (0.06, 0.08))
self.add_measurement(measurement)

View File

@ -5,27 +5,39 @@ from experiment import Experiment, Measurement, Variable
@dataclass @dataclass
class ShellingExperiment(Experiment): class ShellingExperiment(Experiment):
def __init__(self, date: str): def __init__(
super().__init__( self,
experiment="Shelling Analysis", date: str,
date=date, drum_rpm: int,
variables=[ paddle_shaft_rpm: int,
Variable("drum-rpm", "rpm", (30, 40)), ring_gap: float,
Variable("paddle-shaft-rpm", "rpm", (400, 800)), tilt_angle: float,
Variable("ring-gap", "in"), moisture_content: float,
Variable("tilt-angle", "deg", (2, 5)), feed_rate: int = 500,
Variable("feed-rate", "lb/hr", (300, 500), 500), pecan_variety: str = "desirable",
Variable("moisture-content", "%", (5, 9)), ):
Variable("pecan-variety", "", None, "desirable"),
], super().__init__(experiment="Shelling Analysis", date=date)
measurements=[
Measurement("bin1-weight", "lb"), variables = [
Measurement("bin2-weight", "lb"), Variable("drum-rpm", "rpm", (30, 40), drum_rpm),
Measurement("bin3-weight", "lb"), Variable("paddle-shaft-rpm", "rpm", (400, 800), paddle_shaft_rpm),
Measurement("recirculated-weight", "lb"), Variable("ring-gap", "in", value=ring_gap),
Measurement("final-discharge-weight", "lb"), Variable("tilt-angle", "deg", (2, 5), tilt_angle),
Measurement("bin1-half-yield", "%"), Variable("feed-rate", "lb/hr", (300, 500), feed_rate),
Measurement("bin2-half-yield", "%"), Variable("moisture-content", "%", (5, 9), moisture_content),
Measurement("bin3-half-yield", "%"), Variable("pecan-variety", "", value=pecan_variety),
], ]
) self.add_variables(variables)
measurements = [
Measurement("bin1-weight", "lb"),
Measurement("bin2-weight", "lb"),
Measurement("bin3-weight", "lb"),
Measurement("recirculated-weight", "lb"),
Measurement("final-discharge-weight", "lb"),
Measurement("bin1-half-yield", "%"),
Measurement("bin2-half-yield", "%"),
Measurement("bin3-half-yield", "%"),
]
self.add_measurements(measurements)