Source code for ord_rxn_converter.workups_module
# 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
from ord_rxn_converter.inputs_module import extract_input_addition, extract_amount
from ord_rxn_converter.conditions_module import temperature_conditions, stirring_conditions
from ord_rxn_converter.identifiers_module import extract_compound_identifiers, generate_compound_table
#generate enums_data to be accessible here TODO - have importable object instead..?
enums_data = extract_all_enums(reaction_pb2)
[docs]
def extract_reaction_workups(workups, reactionID):
"""
Extracts workup details from an ORD reaction workup list.
This function parses a list of `ReactionWorkup` protobuf messages associated with a reaction
and extracts structured information including compound input components, input addition
details, temperature and stirring conditions, and metadata such as pH or automation status.
Args:
workups (list): A list of `ReactionWorkup` messages from `reaction_pb2.Reaction.workups`.
reactionID (str): A unique identifier for the reaction.
Returns:
list: A list of extracted workup information for the reaction. Each item in the list corresponds
to a single `ReactionWorkup` and contains the following fields:
[reactionID (str), workup_type (str), workup.details (str), workup.duration.value (float), workup_duration_unit (str), input_components (dict or None), input_addition_details (dict or None), temperature_conditions_list (list or None), keep_phase (str), stirring_conditions_list (list or None), target_ph (float or None), is_automated (bool or None)]
"""
# initialize lists
input_components = []
input_addition_details = []
compound_table = []
workups_list = []
for workup in workups:
# (enum) ReactionWorkupType type = 1
workup_type = enums_data['ReactionWorkup.ReactionWorkupType'][workup.type]
# string details = 2
# Time duration = 3
workup_duration_unit = enums_data['Time.TimeUnit'][workup.duration.units]
if workup.input:
components = workup.input.components
for component in components:
# identifiers = 1
if component.identifiers:
identifiers = component.identifiers
component_identifiers = extract_compound_identifiers(identifiers)
compound_table.append(generate_compound_table(identifiers))
else:
component_identifiers = None
compound_table = None
# Amount amount = 2
if component.amount and component.amount.WhichOneof('kind'):
amount_value, amount_unit = extract_amount(component)
else:
amount_value = None
amount_unit = None
# ReactionRole.ReactionRoleType reaction_role = 3
reaction_role = enums_data['ReactionRole.ReactionRoleType'][component.reaction_role] if component.reaction_role else None
# optional bool is_limiting = 4
# repeated CompoundPreparation preparations = 5
if hasattr(component, 'preparations') and component.preparations:
compound_preparation = []
for preparation in component.preparations:
preparation_type = enums_data['CompoundPreparation.CompoundPreparationType'][preparation.type]
preparation_dict = {'Type':preparation_type, 'Details':preparation.details}
compound_preparation.append(preparation_dict)
else: compound_preparation = None
# Source source = 6
component_source = {'Vendor':component.source.vendor, 'catalogID':component.source.catalog_id} if component.source else None
# map<string,Data> features = 7
feature_dict = {feature_key: feature for feature_key, feature in component.features} if component.features else None
# map<string, Analysis> analyses = 8
if hasattr(component, 'analyses') and component.analyses:
analyses = component.analyses
analyses_list = extract_analyses (analyses)
else: analyses_list = None
# Texture texture = 9
if component.texture:
texture_type = enums_data['Texture.TextureType'][component.texture.type]
texture = {texture_type:component.texture.details}
else: texture = None
input_components = {'compoundIdentifiers':component_identifiers, 'amountValue':amount_value, 'amountUnit':amount_unit, 'reactionRole':reaction_role, 'isLimiting':component.is_limiting, 'compoundPreparation':compound_preparation,
'componentSource':component_source, 'feautreDictionary':feature_dict, 'analysesList':analyses_list, 'texture':texture}
inputKey = workup.input
input = workup.input
addition_time_unit = enums_data['Time.TimeUnit'][input.addition_time.units]
addition_speed = enums_data['ReactionInput.AdditionSpeed.AdditionSpeedType'][input.addition_speed.type]
addition_duration_unit = enums_data['Time.TimeUnit'][input.addition_duration.units]
addition_flowrate_unit = enums_data['FlowRate.FlowRateUnit'][input.flow_rate.units]
addition_device = enums_data['ReactionInput.AdditionDevice.AdditionDeviceType'][input.addition_device.type]
addition_temperature_unit = enums_data['Temperature.TemperatureUnit'][input.addition_temperature.units]
reaction_texture = enums_data['Texture.TextureType'][input.texture.type]
input_addition_details = {'inputKey':inputKey, 'additionOrder':input.addition_order, 'additionTimeValue':input.addition_time.value, 'additoinTimeUnit':addition_time_unit, 'additionSpeed':addition_speed,
'additionDurationValue':input.addition_duration.value, 'additionDurationUnit':addition_duration_unit, 'additionDevice':addition_device, 'additionTemperatureValue':input.addition_temperature.value, 'additionTemperatureUnit':addition_temperature_unit,
'inputFlowRateValue':input.flow_rate.value, 'additionFlowRateUnit':addition_flowrate_unit, 'reactionTexture':reaction_texture, 'textureDetails':input.texture.details}
else:
input_components = None
input_addition_details = None
# TemperatureConditions temperature = 6
if hasattr(workup, 'temperature') and workup.temperature:
temperature = workup.temperature
temperature_conditions_list = temperature_conditions(temperature)
else: temperature_conditions_list = None
# string keep_phase = 7;
# StirringConditions stirring = 8
if hasattr(workup, 'stirring') and workup.stirring:
stirring = workup.stirring
stirring_conditions_list = stirring_conditions(stirring)
else: stirring_conditions_list = None
# optional float target_ph = 9
# optional bool is_automated = 10
workups_list.append([reactionID, workup_type, workup.details, workup.duration.value, workup_duration_unit,
input_components, input_addition_details, temperature_conditions_list, workup.keep_phase,
stirring_conditions_list, workup.target_ph, workup.is_automated])
return workups_list