# import requirements:
from ord_schema.proto import dataset_pb2, reaction_pb2
from google.protobuf.message import Message
from ord_rxn_converter.utility_functions_module import extract_all_enums
#generate enums_data to be accessible here TODO - have importable object instead..?
enums_data = extract_all_enums(reaction_pb2)
[docs]
def temperature_conditions(temperature) -> dict:
"""
Extracts temperature condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing temperature conditions.
Returns:
Optional[Dict[str, Union[str, float]]]: A dictionary with temperature
condition details, or None if no temperature condition is found. Keys
may include "value", "units", "setpoint", and "control".
"""
# temperature control = 1
if temperature.control:
control_type = enums_data['TemperatureConditions.TemperatureControl.TemperatureControlType'][temperature.control.type]
temperature_control = {control_type:temperature.control.details}
else: temperature_control = None
# temperature setpoint = 2
if temperature.setpoint:
setpoint_value = temperature.setpoint.value
setpoint_unit = enums_data['Temperature.TemperatureUnit'][temperature.setpoint.units]
else:
setpoint_value = None
setpoint_unit = None
# temperature measurements = 3
if temperature.measurements:
temperature_measurement = temperature.measurements
temperature_measurement_list = []
for measurement in temperature_measurement:
measurement_type = enums_data['TemperatureConditions.TemperatureMeasurement.TemperatureMeasurementType'][measurement.type]
measurement_time_unit = enums_data['Time.TimeUnit'][measurement.time.units]
measurement_temperature_unit = enums_data['Temperature.TemperatureUnit'][measurement.temperature.units]
temperature_measurement_list.append([measurement_type, measurement.details, measurement.time.value, measurement_time_unit, measurement.temperature.value, measurement_temperature_unit])
else: temperature_measurement_list = None
temperature_condition = {'temperatureControl': temperature_control, 'temperatureSetpoint': setpoint_value, 'temperatureUnit': setpoint_unit, 'temperatureMeasurements':temperature_measurement_list}
return temperature_condition
[docs]
def pressure_conditions(pressure) -> dict:
"""
Extracts pressure condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing pressure conditions.
Returns:
Optional[Dict[str, Union[str, float]]]: A dictionary with pressure
condition details, or None if no pressure condition is found. Keys may
include "value", "units", and "control".
"""
# pressure control = 1
if pressure.control:
control_type = enums_data['PressureConditions.PressureControl.PressureControlType'][pressure.control.type]
pressure_control = {control_type:pressure.control.details}
else: pressure_control = None
# pressure setpoint = 2
if pressure.setpoint:
pressure_setpoint = pressure.setpoint.value
pressure_unit = enums_data['Pressure.PressureUnit'][pressure.setpoint.units]
else:
pressure_setpoint = None
pressure_unit = None
# atmosphere = 3
atmosphere = enums_data['PressureConditions.Atmosphere.AtmosphereType'][pressure.atmosphere.type] if pressure.atmosphere else None
# pressure measurements = 4
if pressure.measurements:
pressure_measurements = pressure.measurements
pressure_measurement_list = []
for measurement in pressure_measurements:
measurement_type = enums_data['PressureConditions.PressureMeasurement.PressureMeasurementType'][measurement.type]
measurement_time_unit = enums_data['Time.TimeUnit'][measurement.time.units]
measurement_pressure_unit = enums_data['Pressure.PressureUnit'][measurement.pressure.units]
pressure_measurement_list.append([measurement_type, measurement.details, measurement.time.value, measurement_time_unit, measurement.pressure.value, measurement_pressure_unit])
else:
pressure_measurement_list = None
pressure_condition = {'pressureControl':pressure_control, 'pressureSetpoint':pressure_setpoint, 'pressureUnit':pressure_unit, 'reactionAtmosphere':atmosphere, 'pressureMeasurements':pressure_measurement_list}
return pressure_condition
[docs]
def stirring_conditions(stirring) -> dict:
"""
Extracts stirring condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing stirring conditions.
Returns:
Optional[Dict[str, Union[str, float, bool]]]: A dictionary with stirring
condition details, or None if no stirring condition is found. Keys may
include "type", "rate", "units", and "control".
"""
# stirring method type = 1
stirring_method = enums_data['StirringConditions.StirringMethodType'][stirring.type]
# details = 2
# stirring rate = 3
rate_type = enums_data['StirringConditions.StirringRate.StirringRateType'][stirring.rate.type] if stirring.rate else None
stirring_condition = {'stirringMethod':stirring_method, 'stirringDetails':stirring.details, 'stirringRate': rate_type, 'rateDetails':stirring.rate.details if stirring.rate else None, 'rpm':stirring.rate.rpm if stirring.rate else None}
return stirring_condition
[docs]
def illumination_conditions(illumination) -> dict:
"""
Extracts illumination condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing illumination conditions.
Returns:
Optional[Dict[str, Union[str, float]]]: A dictionary with illumination
condition details, or None if no illumination condition is found. Keys
may include "type", "wavelength", and "wavelength_units".
"""
# type = 1
illumination_type = enums_data['IlluminationConditions.IlluminationType'][illumination.type]
# details = 2
# peak wavelength = 3
if illumination.peak_wavelength:
peak_Wavelength = illumination.peak_wavelength.value
wavelength_unit = enums_data['Wavelength.WavelengthUnit'][illumination.peak_wavelength.units]
else:
peak_Wavelength = None
wavelength_unit = None
# color = 4
# distance_to_vessel = 5
if illumination.distance_to_vessel:
distance_to_vessel = illumination.distance_to_vessel.value
distance_unit = enums_data['Length.LengthUnit'][illumination.distance_to_vessel.units]
else:
distance_to_vessle = None
distance_unit = None
illumination_condition = {'illuminationType':illumination_type, 'illuminationDetails':illumination.details, 'peakWavelength': peak_Wavelength, 'wavelengthUnit': wavelength_unit,
'illuminationColor': illumination.color if illumination.color else None, 'distanceToVessel':distance_to_vessel, 'distanceUnit':distance_unit}
return illumination_condition
[docs]
def electrochemistry_conditions(electrochemistry) -> dict:
"""
Extracts electrochemistry condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing electrochemistry conditions.
Returns:
Optional[Dict[str, Union[str, float]]]: A dictionary with electrochemistry
condition details, or None if no electrochemistry condition is found.
Keys may include "type", "current", "potential", "cell_type", "anode",
and "cathode".
"""
# type = 1
electrochemistry_type = enums_data['ElectrochemistryConditions.ElectrochemistryType'][electrochemistry.type]
# details = 2
# current = 3
if electrochemistry.current:
current = electrochemistry.current.value
current_unit = enums_data["Current.CurrentUnit"][electrochemistry.current.units]
else:
current = None
current_unit = None
#voltage = 4
if electrochemistry.voltage:
voltage = electrochemistry.voltage.value
voltage_unit = enums_data["Voltage.VoltageUnit"][electrochemistry.voltage.units]
else:
voltage = None
voltage_unit = None
# anodeMaterial (string) = 5
anode_material = electrochemistry.anode_material
# cathodeMaterial (string) = 6
cathode_material = electrochemistry.cathode_material
# electrode_separation = 7
if electrochemistry.electrode_separation:
electrode_separation = electrochemistry.electrode_separation.value
separation_unit = enums_data["Length.LengthUnit"][electrochemistry.electrode_separation.units]
else:
electrode_separation = None
separation_unit = None
# measurements = 8
if electrochemistry.measurements:
electrochemistry_measurements = electrochemistry.measurements
meausurement_list = []
for measurement in electrochemistry_measurements:
measurement_time = measurement.time.value
time_unit = enums_data['Time.TimeUnit'][measurement.time.units]
measurement_current = measurement.current.value
current_unit = enums_data['Current.CurrentUnit'][measurement.current.units]
measurement_voltage = measurement.voltage.value
voltage_unit = enums_data['Voltage.VoltageUnit'][measurement.voltage.units]
measurement_list.append([measurement_time, time_unit, measurement_current, current_unit, measurement_voltage, voltage_unit])
else: measurement_list = None
# cell = 9
cell_type = enums_data['ElectrochemistryConditions.ElectrochemistryCell.ElectrochemistryCellType'][electrochemistry.cell.type]
electrochem_cell = dict(zip(cell_type, electrochemistry.cell.details))
# Create a list to store all of the electrochemistry conditions:
electrochemistry_condition = {'electrochemistryType':electrochemistry_type, 'electrochemistryDetails':electrochemistry.details, 'current':current, 'currentUnit':current_unit,
'voltage':voltage, 'voltageUnit':voltage_unit, 'anodeMaterial':anode_material, 'cathodeMaterial':cathode_material, 'electrodeSeparation': electrode_separation, 'separationUnit':separation_unit,
'electrochemistryMeasurements':measurement_list, 'electrochemistryCell':electrochem_cell}
return electrochemistry_condition
[docs]
def flow_conditions(flow) -> dict:
"""
Extracts flow condition from an ORD reaction message.
Args:
reaction (message.Reaction): The reaction message containing flow conditions.
Returns:
Optional[Dict[str, Union[str, float]]]: A dictionary with flow
condition details, or None if no flow condition is found. Keys may
include "flow_rate", "flow_rate_units", "residence_time",
"residence_time_units", and "slug_diameter".
"""
# type = 1
flow_type = enums_data['FlowConditions.FlowType'][flow.type]
# details = 2
# pump_type = 3
# tubing = 4
if flow.tubing:
tubing_type = enums_data['FlowConditions.Tubing.TubingType'][flow.tubing.type]
tubing_diameter = flow.tubing.diameter.value
diameter_unit = enums_data['Length.LengthUnit'][flow.tubing.diameter.units]
else:
tubing_type = None
tubing_diameter = None
diameter_unit = None
flow_condition = {'flowType':flow_type, 'flowDetails':flow.details, 'pumpType':flow.pump_type, 'tubingType':tubing_type, 'tubingDetails':flow.tubing.details, 'tubingDiameter':tubing_diameter, 'diameterUnit':diameter_unit}
return flow_condition