Skip to content

Commit 11902ea

Browse files
committed
more logging
1 parent 0d608b3 commit 11902ea

2 files changed

Lines changed: 66 additions & 58 deletions

File tree

src/opentrons_resources.py

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from madsci.common.types.resource_types import Asset, Consumable, Grid, Pool, Container
77
from madsci.common.types.resource_types.definitions import ResourceDefinition
88

9-
from ot2_rest_node import OT2Node
109

1110
class Opentrons_Resources:
1211
def __init__(self):
@@ -25,6 +24,11 @@ def __init__(self):
2524
# dicts for pipette resources
2625
self.pipette_id_to_resource: Dict[str, Any] = {}
2726
self.pipette_id_to_info: Dict[str, Dict] = {}
27+
28+
self.logger = None
29+
30+
def initialize(self, logger):
31+
self.logger = logger
2832

2933

3034
def parse_logfile(self, ot_log):
@@ -33,66 +37,66 @@ def parse_logfile(self, ot_log):
3337
if not log_path.exists():
3438
raise FileNotFoundError(f"Log file not found: {log_path}")
3539

36-
OT2Node.logger.log("Log File" + log_path + " Grabbed")
40+
self.logger.log("Log File" + log_path + " Grabbed")
3741
with open(log_path, 'r') as file:
3842
ot_log = json.load(file)
3943

40-
OT2Node.logger.log(ot_log)
44+
self.logger.log(ot_log)
4145

4246
#two passes, one for all "load labware" commands, and one for all actions
4347

44-
OT2Node.logger.log("Processing setup commands")
48+
self.logger.log("Processing setup commands")
4549
self.process_setup_commands(ot_log)
46-
OT2Node.logger.log("Processing protocol commands")
50+
self.logger.log("Processing protocol commands")
4751
self.process_protocol_commands(ot_log)
4852

4953
def process_setup_commands(self, ot_log):
5054
"""process setup commands (loadLabware, loadPipette)"""
5155
commands = ot_log.get('commands', {}).get('data', [])
52-
OT2Node.logger.log("COMMANDS")
53-
OT2Node.logger.log(commands)
56+
self.logger.log("COMMANDS")
57+
self.logger.log(commands)
5458

5559
for command in commands:
5660
cmd_type = command.get('commandType')
57-
OT2Node.logger.log("COMMAND")
58-
OT2Node.logger.log(command)
59-
OT2Node.logger.log("COMMAND TYPE")
60-
OT2Node.logger.log(cmd_type)
61+
self.logger.log("COMMAND")
62+
self.logger.log(command)
63+
self.logger.log("COMMAND TYPE")
64+
self.logger.log(cmd_type)
6165

6266
if cmd_type == 'loadLabware':
63-
OT2Node.logger.log("LOADING LABWARE")
67+
self.logger.log("LOADING LABWARE")
6468
self.load_labware(command, ot_log)
6569
elif cmd_type == 'loadPipette':
66-
OT2Node.logger.log("LAODING PIPETTE")
70+
self.logger.log("LAODING PIPETTE")
6771
self.load_pipette(command, ot_log)
6872

6973

7074

7175
def process_protocol_commands(self, ot_log):
7276
"""process protocol actions"""
7377
commands = ot_log.get('commands', {}).get('data', [])
74-
OT2Node.logger.log("COMMANDS")
75-
OT2Node.logger.log(commands)
78+
self.logger.log("COMMANDS")
79+
self.logger.log(commands)
7680

7781
for command in commands:
7882
cmd_type = command.get('commandType')
79-
OT2Node.logger.log("COMMAND")
80-
OT2Node.logger.log(command)
81-
OT2Node.logger.log("COMMAND TYPE")
82-
OT2Node.logger.log(cmd_type)
83+
self.logger.log("COMMAND")
84+
self.logger.log(command)
85+
self.logger.log("COMMAND TYPE")
86+
self.logger.log(cmd_type)
8387

8488
try:
8589
if cmd_type == 'pickUpTip':
8690
self.pick_up_tip(command, ot_log)
87-
OT2Node.logger.log("PICKING UP TIP")
91+
self.logger.log("PICKING UP TIP")
8892
elif cmd_type == 'aspirate':
89-
OT2Node.logger.log("ASPIRATING")
93+
self.logger.log("ASPIRATING")
9094
self.aspirate(command, ot_log)
9195
elif cmd_type == 'dispense':
92-
OT2Node.logger.log("DISPENSING")
96+
self.logger.log("DISPENSING")
9397
self.dispense(command, ot_log)
9498
elif cmd_type == 'dropTip':
95-
OT2Node.logger.log("DROPPING TIP")
99+
self.logger.log("DROPPING TIP")
96100
self.drop_tip(command, ot_log)
97101
except Exception as e:
98102
error_msg = f"Error processing {cmd_type} at {command.get('id', 'unknown')}: {str(e)}"
@@ -102,9 +106,9 @@ def load_labware(self, command, ot_log):
102106
"""loads labware, tracks labware present in each deck slot"""
103107
params = command.get('params', {})
104108
result = command.get('result', {})
105-
OT2Node.logger.log("LABWARE PARAMS AND RESULT")
106-
OT2Node.logger.log("PARAMS", params)
107-
OT2Node.logger.log("RESULT", result)
109+
self.logger.log("LABWARE PARAMS AND RESULT")
110+
self.logger.log("PARAMS", params)
111+
self.logger.log("RESULT", result)
108112

109113
#get labware id
110114
location = params.get('location', {})
@@ -113,10 +117,10 @@ def load_labware(self, command, ot_log):
113117
#string number 1-11
114118
slot_name = location.get('slotName', 'unknown')
115119

116-
OT2Node.logger.log("LOCATION, LOADNAME, AND SLOT NAME")
117-
OT2Node.logger.log("LOCATION", location)
118-
OT2Node.logger.log("LOADNAME", load_name)
119-
OT2Node.logger.log("SLOTNAME", slot_name)
120+
self.logger.log("LOCATION, LOADNAME, AND SLOT NAME")
121+
self.logger.log("LOCATION", location)
122+
self.logger.log("LOADNAME", load_name)
123+
self.logger.log("SLOTNAME", slot_name)
120124

121125
#find matching id
122126
labware_id = None
@@ -125,19 +129,19 @@ def load_labware(self, command, ot_log):
125129
if (labware.get('loadName') == load_name and
126130
labware.get('location', {}).get('slotName') == slot_name):
127131
labware_id = labware.get('id')
128-
OT2Node.logger.log("MATCHING ID FOUND")
132+
self.logger.log("MATCHING ID FOUND")
129133
break
130134

131135
if not labware_id:
132-
OT2Node.logger.log("MATCHING ID NOT FOUND")
136+
self.logger.log("MATCHING ID NOT FOUND")
133137
#just in case not found
134138
labware_id = f"labware_{slot_name}_{load_name}"
135139

136140
slot_name = location.get('slotName', 'unknown')
137141

138142

139143
#store info
140-
OT2Node.logger.log("STORING LABWARE INFO")
144+
self.logger.log("STORING LABWARE INFO")
141145
self.labware_id_to_info[labware_id] = {
142146
'load_name': load_name,
143147
'display_name': display_name,
@@ -147,21 +151,21 @@ def load_labware(self, command, ot_log):
147151
}
148152

149153
#get or create labware in deck slot
150-
OT2Node.logger.log("LOOK FOR SLOT NAME IN DECK SLOTS")
151-
OT2Node.logger.log("SLOT NAME", slot_name)
152-
OT2Node.logger.log("DECK SLOTS", self.deck_slots)
154+
self.logger.log("LOOK FOR SLOT NAME IN DECK SLOTS")
155+
self.logger.log("SLOT NAME", slot_name)
156+
self.logger.log("DECK SLOTS", self.deck_slots)
153157
if slot_name in self.deck_slots:
154-
OT2Node.logger.log("FOUND SLOT RESOURCE", slot_resource)
158+
self.logger.log("FOUND SLOT RESOURCE", slot_resource)
155159
slot_resource = self.deck_slots[slot_name]
156160
try:
157161
# #check if slot already has labware (child)
158162
# # query for existing labware in slot
159163

160164
# # Grid resource if tip rack
161-
OT2Node.logger.log("CHECKING IF RESOURCE IS A TIP RACK")
162-
OT2Node.logger.log("LOAD NAME LOWER", load_name.lower())
165+
self.logger.log("CHECKING IF RESOURCE IS A TIP RACK")
166+
self.logger.log("LOAD NAME LOWER", load_name.lower())
163167
if 'tip' in load_name.lower():
164-
OT2Node.logger.log("IS TIP RACK")
168+
self.logger.log("IS TIP RACK")
165169
#tip rack always 8x12 grid
166170
# labware_resource = Grid(
167171
# resource_name = f"{self.node_name}_{display_name}_{slot_name}",
@@ -175,25 +179,25 @@ def load_labware(self, command, ot_log):
175179
# }
176180
# )
177181
# labware_resource = self.client.add_resource(labware_resource)
178-
OT2Node.logger.log("CREATING TIP RACK RESOURCE FROM TEMPLATE")
179-
OT2Node.logger.log("TEMPLATE NAME", load_name)
180-
OT2Node.logger.log("RESOURCE NAME", labware_id)
182+
self.logger.log("CREATING TIP RACK RESOURCE FROM TEMPLATE")
183+
self.logger.log("TEMPLATE NAME", load_name)
184+
self.logger.log("RESOURCE NAME", labware_id)
181185
labware_resource = self.client.create_resource_from_template(
182186
template_name = load_name,
183187
resource_name = labware_id
184188
)
185189

186190

187191
#set as child of the deck slot
188-
OT2Node.logger.log("LABWARE RESOURCE", labware_resource)
189-
OT2Node.logger.log("SETTING LABWARE RESOURCE AS CHILD OF DECK SLOT")
190-
OT2Node.logger.log("SLOT RESOURCE", slot_resource)
192+
self.logger.log("LABWARE RESOURCE", labware_resource)
193+
self.logger.log("SETTING LABWARE RESOURCE AS CHILD OF DECK SLOT")
194+
self.logger.log("SLOT RESOURCE", slot_resource)
191195
self.client.set_child(resource=slot_resource, key="labware", child=labware_resource)
192196
self.labware_id_to_resource[labware_id] = labware_resource
193197

194198
elif 'plate' in load_name.lower() or 'well' in load_name.loawer():
195-
OT2Node.logger.log("RESOURCE IS A PLATE")
196-
OT2Node.logger.log("LOAD NAME LOWER", load_name.lower())
199+
self.logger.log("RESOURCE IS A PLATE")
200+
self.logger.log("LOAD NAME LOWER", load_name.lower())
197201
#plate as grid, either 96 or 384
198202
if '96' in load_name:
199203
rows, cols = 8, 12
@@ -215,23 +219,23 @@ def load_labware(self, command, ot_log):
215219
# }
216220
# )
217221
# labware_resource = self.client.add_resource(labware_resource)
218-
OT2Node.logger.log("CREATING PLATE RESOURCE FROM TEMPLATE")
219-
OT2Node.logger.log("TEMPLATE NAME", load_name)
220-
OT2Node.logger.log("RESOURCE NAME", labware_id)
222+
self.logger.log("CREATING PLATE RESOURCE FROM TEMPLATE")
223+
self.logger.log("TEMPLATE NAME", load_name)
224+
self.logger.log("RESOURCE NAME", labware_id)
221225
labware_resource = self.client.create_resource_from_template(
222226
template_name = load_name,
223227
resource_name = labware_id
224228
)
225229

226-
OT2Node.logger.log("LABWARE RESOURCE", labware_resource)
227-
OT2Node.logger.log("SETTING LABWARE RESOURCE AS CHILD OF DECK SLOT")
228-
OT2Node.logger.log("SLOT RESOURCE", slot_resource)
230+
self.logger.log("LABWARE RESOURCE", labware_resource)
231+
self.logger.log("SETTING LABWARE RESOURCE AS CHILD OF DECK SLOT")
232+
self.logger.log("SLOT RESOURCE", slot_resource)
229233

230234
self.client.set_child(resource=slot_resource, key="labware", child=labware_resource)
231235
self.labware_id_to_resource[labware_id] = labware_resource
232236

233237
else:
234-
OT2Node.logger.log("REGISTERING AS NEITHER PLATE OR TIP RACK")
238+
self.logger.log("REGISTERING AS NEITHER PLATE OR TIP RACK")
235239
#TODO: add addional labware types, tuberacks and modules etc, generic container for now
236240
# labware_resource = Container(
237241
# resource_name=f"{self.node_name}_{display_name}_{slot_name}",
@@ -261,9 +265,9 @@ def load_pipette(self, command, ot_log):
261265
params = command.get('params', {})
262266
result = command.get('result', {})
263267

264-
OT2Node.logger.log("PIPETTE PARAMS AND RESULT")
265-
OT2Node.logger.log("PARAMS", params)
266-
OT2Node.logger.log("RESULT", result)
268+
self.logger.log("PIPETTE PARAMS AND RESULT")
269+
self.logger.log("PARAMS", params)
270+
self.logger.log("RESULT", result)
267271

268272
pipette_id = result.get('pipetteId', params.get('pipetteId'))
269273
mount = params.get('mount', 'unknown')

src/ot2_rest_node.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class OT2Node(RestNode):
3131
config: OT2NodeConfig = OT2NodeConfig()
3232
config_model = OT2NodeConfig
3333
resources = Opentrons_Resources()
34+
3435

3536
def startup_handler(self) -> None:
3637
"""Called to (re)initialize the node. Should be used to open connections to devices or initialize any other resources."""
@@ -95,6 +96,9 @@ def startup_handler(self) -> None:
9596

9697
self.run_id = None
9798
self.startup_has_run = True
99+
self.resources.initialize(
100+
logger=self.logger,
101+
)
98102
self.logger.info("OT2 node initialized!")
99103

100104
def _create_ot2_templates(self) -> None:

0 commit comments

Comments
 (0)