puda-drivers 0.0.10__py3-none-any.whl → 0.0.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- puda_drivers/labware/polyelectric_8_wellplate_30000ul.json +1 -1
- puda_drivers/labware/trash_bin.json +1 -1
- puda_drivers/machines/first.py +59 -8
- {puda_drivers-0.0.10.dist-info → puda_drivers-0.0.11.dist-info}/METADATA +3 -3
- {puda_drivers-0.0.10.dist-info → puda_drivers-0.0.11.dist-info}/RECORD +7 -7
- {puda_drivers-0.0.10.dist-info → puda_drivers-0.0.11.dist-info}/WHEEL +0 -0
- {puda_drivers-0.0.10.dist-info → puda_drivers-0.0.11.dist-info}/licenses/LICENSE +0 -0
puda_drivers/machines/first.py
CHANGED
|
@@ -185,14 +185,30 @@ class First:
|
|
|
185
185
|
self.qubot.home(axis="Z")
|
|
186
186
|
self._logger.debug("Z axis homed after tip attachment")
|
|
187
187
|
|
|
188
|
-
def drop_tip(self, slot: str, well: str):
|
|
189
|
-
"""
|
|
188
|
+
def drop_tip(self, slot: str, well: str, height_from_bottom: float = 0.0):
|
|
189
|
+
"""
|
|
190
|
+
Drop a tip into a slot.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
slot: Slot name (e.g., 'A1', 'B2')
|
|
194
|
+
well: Well name within the slot (e.g., 'A1' for a well in a tiprack)
|
|
195
|
+
height_from_bottom: Height from the bottom of the well in mm. Defaults to 0.0.
|
|
196
|
+
Positive values move up from the bottom. Negative values
|
|
197
|
+
may cause a ValueError if the resulting position is outside
|
|
198
|
+
the Z axis limits.
|
|
199
|
+
|
|
200
|
+
Raises:
|
|
201
|
+
ValueError: If no tip is attached, or if the resulting position is outside
|
|
202
|
+
the Z axis limits.
|
|
203
|
+
"""
|
|
190
204
|
if not self.pipette.is_tip_attached():
|
|
191
205
|
self._logger.error("Cannot drop tip: no tip attached")
|
|
192
206
|
raise ValueError("Tip not attached")
|
|
193
207
|
|
|
194
208
|
self._logger.info("Dropping tip into slot '%s', well '%s'", slot, well)
|
|
195
209
|
pos = self.get_absolute_z_position(slot, well)
|
|
210
|
+
# add height from bottom
|
|
211
|
+
pos += Position(z=height_from_bottom)
|
|
196
212
|
# move up by the tip length
|
|
197
213
|
pos += Position(z=self.TIP_LENGTH)
|
|
198
214
|
self._logger.debug("Moving to position %s (adjusted for tip length) for tip drop", pos)
|
|
@@ -204,31 +220,67 @@ class First:
|
|
|
204
220
|
self.pipette.set_tip_attached(attached=False)
|
|
205
221
|
self._logger.info("Tip dropped successfully")
|
|
206
222
|
|
|
207
|
-
def aspirate_from(self, slot:str, well:str, amount:int):
|
|
208
|
-
"""
|
|
223
|
+
def aspirate_from(self, slot:str, well:str, amount:int, height_from_bottom: float = 0.0):
|
|
224
|
+
"""
|
|
225
|
+
Aspirate a volume of liquid from a slot.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
slot: Slot name (e.g., 'A1', 'B2')
|
|
229
|
+
well: Well name within the slot (e.g., 'A1')
|
|
230
|
+
amount: Volume to aspirate in µL
|
|
231
|
+
height_from_bottom: Height from the bottom of the well in mm. Defaults to 0.0.
|
|
232
|
+
Positive values move up from the bottom. Negative values
|
|
233
|
+
may cause a ValueError if the resulting position is outside
|
|
234
|
+
the Z axis limits.
|
|
235
|
+
|
|
236
|
+
Raises:
|
|
237
|
+
ValueError: If no tip is attached, or if the resulting position is outside
|
|
238
|
+
the Z axis limits.
|
|
239
|
+
"""
|
|
209
240
|
if not self.pipette.is_tip_attached():
|
|
210
241
|
self._logger.error("Cannot aspirate: no tip attached")
|
|
211
242
|
raise ValueError("Tip not attached")
|
|
212
243
|
|
|
213
244
|
self._logger.info("Aspirating %d µL from slot '%s', well '%s'", amount, slot, well)
|
|
214
245
|
pos = self.get_absolute_z_position(slot, well)
|
|
246
|
+
# add height from bottom
|
|
247
|
+
pos += Position(z=height_from_bottom)
|
|
215
248
|
self._logger.debug("Moving Z axis to position %s", pos)
|
|
216
249
|
self.qubot.move_absolute(position=pos)
|
|
250
|
+
|
|
217
251
|
self._logger.debug("Aspirating %d µL", amount)
|
|
218
252
|
self.pipette.aspirate(amount=amount)
|
|
219
253
|
time.sleep(5)
|
|
220
254
|
self._logger.info("Aspiration completed: %d µL from slot '%s', well '%s'", amount, slot, well)
|
|
221
255
|
|
|
222
|
-
def dispense_to(self, slot:str, well:str, amount:int):
|
|
223
|
-
"""
|
|
256
|
+
def dispense_to(self, slot:str, well:str, amount:int, height_from_bottom: float = 0.0):
|
|
257
|
+
"""
|
|
258
|
+
Dispense a volume of liquid to a slot.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
slot: Slot name (e.g., 'A1', 'B2')
|
|
262
|
+
well: Well name within the slot (e.g., 'A1')
|
|
263
|
+
amount: Volume to dispense in µL
|
|
264
|
+
height_from_bottom: Height from the bottom of the well in mm. Defaults to 0.0.
|
|
265
|
+
Positive values move up from the bottom. Negative values
|
|
266
|
+
may cause a ValueError if the resulting position is outside
|
|
267
|
+
the Z axis limits.
|
|
268
|
+
|
|
269
|
+
Raises:
|
|
270
|
+
ValueError: If no tip is attached, or if the resulting position is outside
|
|
271
|
+
the Z axis limits.
|
|
272
|
+
"""
|
|
224
273
|
if not self.pipette.is_tip_attached():
|
|
225
274
|
self._logger.error("Cannot dispense: no tip attached")
|
|
226
275
|
raise ValueError("Tip not attached")
|
|
227
276
|
|
|
228
277
|
self._logger.info("Dispensing %d µL to slot '%s', well '%s'", amount, slot, well)
|
|
229
278
|
pos = self.get_absolute_z_position(slot, well)
|
|
279
|
+
# add height from bottom
|
|
280
|
+
pos += Position(z=height_from_bottom)
|
|
230
281
|
self._logger.debug("Moving Z axis to position %s", pos)
|
|
231
282
|
self.qubot.move_absolute(position=pos)
|
|
283
|
+
|
|
232
284
|
self._logger.debug("Dispensing %d µL", amount)
|
|
233
285
|
self.pipette.dispense(amount=amount)
|
|
234
286
|
time.sleep(5)
|
|
@@ -275,8 +327,7 @@ class First:
|
|
|
275
327
|
# the deck is rotated 90 degrees clockwise for this machine
|
|
276
328
|
pos += well_pos.swap_xy()
|
|
277
329
|
# get z
|
|
278
|
-
|
|
279
|
-
pos += z
|
|
330
|
+
pos += Position(z=self.deck[slot].get_height() - self.CEILING_HEIGHT)
|
|
280
331
|
self._logger.debug("Absolute Z position for slot '%s', well '%s': %s", slot, well, pos)
|
|
281
332
|
else:
|
|
282
333
|
self._logger.debug("Absolute Z position for slot '%s': %s", slot, pos)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: puda-drivers
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.11
|
|
4
4
|
Summary: Hardware drivers for the PUDA platform.
|
|
5
5
|
Project-URL: Homepage, https://github.com/zhao-bears/puda-drivers
|
|
6
6
|
Project-URL: Issues, https://github.com/zhao-bears/puda-drivers/issues
|
|
@@ -123,8 +123,8 @@ machine.camera.start_video_recording()
|
|
|
123
123
|
|
|
124
124
|
# Perform liquid handling operations
|
|
125
125
|
machine.attach_tip(slot="A3", well="G8")
|
|
126
|
-
machine.aspirate_from(slot="C2", well="A1", amount=100)
|
|
127
|
-
machine.dispense_to(slot="C2", well="B4", amount=100)
|
|
126
|
+
machine.aspirate_from(slot="C2", well="A1", amount=100, height_from_bottom=10.0)
|
|
127
|
+
machine.dispense_to(slot="C2", well="B4", amount=100, height_from_bottom=30.0)
|
|
128
128
|
machine.drop_tip(slot="C1", well="A1")
|
|
129
129
|
|
|
130
130
|
# Stop video recording
|
|
@@ -9,10 +9,10 @@ puda_drivers/cv/camera.py,sha256=Tzxt1h3W5Z8XFanud_z-PhhJ2UYsC4OEhcak9TVu8jM,164
|
|
|
9
9
|
puda_drivers/labware/__init__.py,sha256=RlRxrJn2zyzyxv4c1KGt8Gmxv2cRO8V4zZVnnyL-I00,288
|
|
10
10
|
puda_drivers/labware/labware.py,sha256=hZhOzSyb1GP_bm1LvQsREx4YSqLCWBTKNWDgDqfFavI,5317
|
|
11
11
|
puda_drivers/labware/opentrons_96_tiprack_300ul.json,sha256=jmNaworu688GEgFdxMxNRSaEp4ZOg9IumFk8bVHSzYY,19796
|
|
12
|
-
puda_drivers/labware/polyelectric_8_wellplate_30000ul.json,sha256=
|
|
13
|
-
puda_drivers/labware/trash_bin.json,sha256=
|
|
12
|
+
puda_drivers/labware/polyelectric_8_wellplate_30000ul.json,sha256=esu2tej0ORs7Pfd4HwoQVUpU5mPvp2AYzE3zsCC2FDk,3104
|
|
13
|
+
puda_drivers/labware/trash_bin.json,sha256=Hk4MXO48P28jG7F87DUd9Ja4c_P7kAy3karPQ965i9Y,580
|
|
14
14
|
puda_drivers/machines/__init__.py,sha256=zmIk_r2T8nbPA68h3Cko8N6oL7ncoBpmvhNcAqzHmc4,45
|
|
15
|
-
puda_drivers/machines/first.py,sha256=
|
|
15
|
+
puda_drivers/machines/first.py,sha256=F1D-Te25cUJamE-FG_BEcY2PgN0_6S81ImdhNDeupCk,14415
|
|
16
16
|
puda_drivers/move/__init__.py,sha256=NKIKckcqgyviPM0EGFcmIoaqkJM4qekR4babfdddRzM,96
|
|
17
17
|
puda_drivers/move/deck.py,sha256=yq2B4WMqj0hQvHt8HoJskP10u1DUyKwUnjP2c9gJ174,1397
|
|
18
18
|
puda_drivers/move/gcode.py,sha256=Aw7la4RkPw737hW5sKl6WiPCmmTnsjLvG4mOb-RwVSc,22592
|
|
@@ -23,7 +23,7 @@ puda_drivers/transfer/liquid/sartorius/__init__.py,sha256=QGpKz5YUwa8xCdSMXeZ0iR
|
|
|
23
23
|
puda_drivers/transfer/liquid/sartorius/api.py,sha256=jxwIJmY2k1K2ts6NC2ZgFTe4MOiH8TGnJeqYOqNa3rE,28250
|
|
24
24
|
puda_drivers/transfer/liquid/sartorius/constants.py,sha256=mcsjLrVBH-RSodH-pszstwcEL9wwbV0vOgHbGNxZz9w,2770
|
|
25
25
|
puda_drivers/transfer/liquid/sartorius/sartorius.py,sha256=bW838jYOAfLlbUqtsKRipZ-RLjrNTcZ7riYV6I4w8G8,13728
|
|
26
|
-
puda_drivers-0.0.
|
|
27
|
-
puda_drivers-0.0.
|
|
28
|
-
puda_drivers-0.0.
|
|
29
|
-
puda_drivers-0.0.
|
|
26
|
+
puda_drivers-0.0.11.dist-info/METADATA,sha256=b6LZSNkAD3RG4cjghtm2DcNwFEbK1nIgDJazlUfhYRQ,7041
|
|
27
|
+
puda_drivers-0.0.11.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
28
|
+
puda_drivers-0.0.11.dist-info/licenses/LICENSE,sha256=7EI8xVBu6h_7_JlVw-yPhhOZlpY9hP8wal7kHtqKT_E,1074
|
|
29
|
+
puda_drivers-0.0.11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|