mx-bluesky 1.4.1__py3-none-any.whl → 1.4.2__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.
Files changed (22) hide show
  1. mx_bluesky/_version.py +2 -2
  2. mx_bluesky/beamlines/i24/serial/__init__.py +0 -6
  3. mx_bluesky/beamlines/i24/serial/extruder/i24ssx_Extruder_Collect_py3v2.py +18 -21
  4. mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl +2 -46
  5. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py +22 -95
  6. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py +50 -63
  7. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py +1 -19
  8. mx_bluesky/beamlines/i24/serial/parameters/__init__.py +5 -1
  9. mx_bluesky/beamlines/i24/serial/parameters/experiment_parameters.py +34 -2
  10. mx_bluesky/beamlines/i24/serial/parameters/utils.py +19 -0
  11. mx_bluesky/beamlines/i24/serial/write_nexus.py +2 -5
  12. mx_bluesky/common/parameters/components.py +3 -3
  13. mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py +6 -6
  14. mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py +14 -2
  15. mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py +7 -1
  16. mx_bluesky/hyperion/utils/validation.py +1 -1
  17. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/METADATA +2 -2
  18. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/RECORD +22 -22
  19. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/LICENSE +0 -0
  20. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/WHEEL +0 -0
  21. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/entry_points.txt +0 -0
  22. {mx_bluesky-1.4.1.dist-info → mx_bluesky-1.4.2.dist-info}/top_level.txt +0 -0
mx_bluesky/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.4.1'
16
- __version_tuple__ = version_tuple = (1, 4, 1)
15
+ __version__ = version = '1.4.2'
16
+ __version_tuple__ = version_tuple = (1, 4, 2)
@@ -18,9 +18,6 @@ from .fixed_target.i24ssx_Chip_Manager_py3v1 import (
18
18
  moveto,
19
19
  moveto_preset,
20
20
  pumpprobe_calc,
21
- save_screen_map,
22
- upload_parameters,
23
- write_parameter_file,
24
21
  )
25
22
  from .log import clean_up_log_config_at_end, setup_collection_logs
26
23
  from .setup_beamline.setup_detector import setup_detector_stage
@@ -44,9 +41,6 @@ __all__ = [
44
41
  "load_lite_map",
45
42
  "load_stock_map",
46
43
  "pumpprobe_calc",
47
- "save_screen_map",
48
- "upload_parameters",
49
- "write_parameter_file",
50
44
  "setup_collection_logs",
51
45
  "clean_up_log_config_at_end",
52
46
  ]
@@ -4,9 +4,7 @@ This version in python3 new Feb2021 by RLO
4
4
  - March 21 added logging and Eiger functionality
5
5
  """
6
6
 
7
- import json
8
7
  import re
9
- import shutil
10
8
  import sys
11
9
  import time
12
10
  from datetime import datetime
@@ -40,10 +38,6 @@ from mx_bluesky.beamlines.i24.serial.log import (
40
38
  log_on_entry,
41
39
  )
42
40
  from mx_bluesky.beamlines.i24.serial.parameters import ExtruderParameters
43
- from mx_bluesky.beamlines.i24.serial.parameters.constants import (
44
- PARAM_FILE_NAME,
45
- PARAM_FILE_PATH,
46
- )
47
41
  from mx_bluesky.beamlines.i24.serial.setup_beamline import Pilatus, caget, caput, pv
48
42
  from mx_bluesky.beamlines.i24.serial.setup_beamline import setup_beamline as sup
49
43
  from mx_bluesky.beamlines.i24.serial.setup_beamline.setup_detector import (
@@ -141,12 +135,20 @@ def enter_hutch(
141
135
 
142
136
 
143
137
  @log_on_entry
144
- def write_parameter_file(
145
- detector_stage: DetectorMotion, attenuator: ReadOnlyAttenuator
146
- ):
147
- """Writes a json parameter file that can later be parsed by the model."""
148
- param_file: Path = PARAM_FILE_PATH / PARAM_FILE_NAME
149
- SSX_LOGGER.debug(f"Writing Parameter File to: {param_file}\n")
138
+ def read_parameters(detector_stage: DetectorMotion, attenuator: ReadOnlyAttenuator):
139
+ """ Read the parameters from user input and create the parameter model for an \
140
+ extruder collection.
141
+
142
+ Args:
143
+ detector_stage (DetectorMotion): The detector stage device.
144
+ attenuator (ReadOnlyAttenuator): A read-only attenuator device to get the \
145
+ transmission value.
146
+
147
+ Returns:
148
+ ExtruderParameters: Parameter model for extruder collections
149
+
150
+ """
151
+ SSX_LOGGER.info("Creating parameter model from input.")
150
152
 
151
153
  det_type = yield from get_detector_type(detector_stage)
152
154
  SSX_LOGGER.warning(f"DETECTOR TYPE: {det_type}")
@@ -182,12 +184,11 @@ def write_parameter_file(
182
184
  "laser_dwell_s": pump_exp,
183
185
  "laser_delay_s": pump_delay,
184
186
  }
185
- with open(param_file, "w") as f:
186
- json.dump(params_dict, f, indent=4)
187
187
 
188
188
  SSX_LOGGER.info("Parameters \n")
189
189
  SSX_LOGGER.info(pformat(params_dict))
190
190
  yield from bps.null()
191
+ return ExtruderParameters(**params_dict)
191
192
 
192
193
 
193
194
  @log_on_entry
@@ -467,11 +468,6 @@ def collection_complete_plan(
467
468
  dcid.collection_complete(end_time, aborted=False)
468
469
  SSX_LOGGER.info(f"End Time = {end_time.ctime()}")
469
470
 
470
- # Copy parameter file
471
- shutil.copy2(
472
- PARAM_FILE_PATH / PARAM_FILE_NAME,
473
- collection_directory / PARAM_FILE_NAME,
474
- )
475
471
  yield from bps.null()
476
472
 
477
473
 
@@ -489,8 +485,9 @@ def run_extruder_plan(
489
485
  start_time = datetime.now()
490
486
  SSX_LOGGER.info(f"Collection start time: {start_time.ctime()}")
491
487
 
492
- yield from write_parameter_file(detector_stage, attenuator)
493
- parameters = ExtruderParameters.from_file(PARAM_FILE_PATH / PARAM_FILE_NAME)
488
+ parameters: ExtruderParameters = yield from read_parameters(
489
+ detector_stage, attenuator
490
+ )
494
491
 
495
492
  beam_center_device = sup.get_beam_center_device(parameters.detector_name)
496
493
 
@@ -3,8 +3,8 @@ beginScreenProperties
3
3
  major 4
4
4
  minor 0
5
5
  release 1
6
- x 1062
7
- y 369
6
+ x 308
7
+ y 339
8
8
  w 650
9
9
  h 400
10
10
  font "arial-medium-r-18.0"
@@ -179,50 +179,6 @@ font "arial-medium-r-18.0"
179
179
  colorPv "ME14E-MO-IOC-01:GP67"
180
180
  endObjectProperties
181
181
 
182
- # (Shell Command)
183
- object shellCmdClass
184
- beginObjectProperties
185
- major 4
186
- minor 3
187
- release 0
188
- x 40
189
- y 290
190
- w 194
191
- h 40
192
- fgColor index 0
193
- bgColor index 23
194
- topShadowColor index 1
195
- botShadowColor index 11
196
- font "arial-medium-r-18.0"
197
- buttonLabel "Save Screen Map"
198
- numCmds 1
199
- command {
200
- 0 "blueapi -c CONFIG_LOCATION controller run save_screen_map"
201
- }
202
- endObjectProperties
203
-
204
- # (Shell Command)
205
- object shellCmdClass
206
- beginObjectProperties
207
- major 4
208
- minor 3
209
- release 0
210
- x 12
211
- y 337
212
- w 244
213
- h 53
214
- fgColor index 13
215
- bgColor index 49
216
- topShadowColor index 1
217
- botShadowColor index 11
218
- font "arial-medium-r-18.0"
219
- buttonLabel "Upload Parameters"
220
- numCmds 1
221
- command {
222
- 0 "blueapi -c CONFIG_LOCATION controller run upload_parameters '\{\"pmac\":\"pmac\"\}'"
223
- }
224
- endObjectProperties
225
-
226
182
  # (Message Button)
227
183
  object activeMessageButtonClass
228
184
  beginObjectProperties
@@ -2,14 +2,12 @@
2
2
  Fixed target data collection
3
3
  """
4
4
 
5
- import shutil
6
5
  from datetime import datetime
7
6
  from pathlib import Path
8
7
  from time import sleep
9
8
 
10
9
  import bluesky.plan_stubs as bps
11
10
  import bluesky.preprocessors as bpp
12
- import numpy as np
13
11
  from bluesky.utils import MsgGenerator
14
12
  from dodal.common import inject
15
13
  from dodal.devices.attenuator import ReadOnlyAttenuator
@@ -35,18 +33,11 @@ from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import (
35
33
  PumpProbeSetting,
36
34
  )
37
35
  from mx_bluesky.beamlines.i24.serial.fixed_target.i24ssx_Chip_Manager_py3v1 import (
38
- write_parameter_file,
36
+ read_parameters,
37
+ upload_chip_map_to_geobrick,
39
38
  )
40
39
  from mx_bluesky.beamlines.i24.serial.log import SSX_LOGGER, log_on_entry
41
- from mx_bluesky.beamlines.i24.serial.parameters import (
42
- ChipDescription,
43
- FixedTargetParameters,
44
- )
45
- from mx_bluesky.beamlines.i24.serial.parameters.constants import (
46
- LITEMAP_PATH,
47
- PARAM_FILE_NAME,
48
- PARAM_FILE_PATH_FT,
49
- )
40
+ from mx_bluesky.beamlines.i24.serial.parameters import FixedTargetParameters
50
41
  from mx_bluesky.beamlines.i24.serial.setup_beamline import caget, cagetstring, caput, pv
51
42
  from mx_bluesky.beamlines.i24.serial.setup_beamline import setup_beamline as sup
52
43
  from mx_bluesky.beamlines.i24.serial.setup_beamline.setup_zebra_plans import (
@@ -107,19 +98,6 @@ def calculate_collection_timeout(parameters: FixedTargetParameters) -> float:
107
98
  return timeout
108
99
 
109
100
 
110
- def copy_files_to_data_location(
111
- dest_dir: Path | str,
112
- param_path: Path = PARAM_FILE_PATH_FT,
113
- map_file: Path = LITEMAP_PATH,
114
- map_type: MappingType = MappingType.Lite,
115
- ):
116
- if not isinstance(dest_dir, Path):
117
- dest_dir = Path(dest_dir)
118
- shutil.copy2(param_path / "parameters.txt", dest_dir / "parameters.txt")
119
- if map_type == MappingType.Lite:
120
- shutil.copy2(map_file / "currentchip.map", dest_dir / "currentchip.map")
121
-
122
-
123
101
  def write_userlog(
124
102
  parameters: FixedTargetParameters,
125
103
  filename: str,
@@ -308,50 +286,18 @@ def get_prog_num(
308
286
 
309
287
 
310
288
  @log_on_entry
311
- def datasetsizei24(
312
- n_exposures: int,
313
- chip_params: ChipDescription,
314
- map_type: MappingType,
315
- ) -> int:
316
- # Calculates how many images will be collected based on map type and N repeats
317
- SSX_LOGGER.info("Calculate total number of images expected in data collection.")
318
-
319
- if map_type == MappingType.NoMap:
320
- if chip_params.chip_type == ChipType.Custom:
321
- total_numb_imgs = chip_params.x_num_steps * chip_params.y_num_steps
322
- SSX_LOGGER.info(
323
- f"Map type: None \tCustom chip \tNumber of images {total_numb_imgs}"
324
- )
325
- else:
326
- chip_format = chip_params.chip_format[:4]
327
- total_numb_imgs = int(np.prod(chip_format))
328
- SSX_LOGGER.info(
329
- f"""Map type: None \tOxford chip {chip_params.chip_type} \t \
330
- Number of images {total_numb_imgs}"""
331
- )
332
-
333
- elif map_type == MappingType.Lite:
334
- SSX_LOGGER.info(f"Using Mapping Lite on chip type {chip_params.chip_type}")
335
- chip_format = chip_params.chip_format[2:4]
336
- block_count = 0
337
- with open(LITEMAP_PATH / "currentchip.map") as f:
338
- for line in f.readlines():
339
- entry = line.split()
340
- if entry[2] == "1":
341
- block_count += 1
342
-
343
- SSX_LOGGER.info(f"Block count={block_count}")
344
- SSX_LOGGER.info(f"Chip format={chip_format}")
345
-
346
- SSX_LOGGER.info(f"Number of exposures={n_exposures}")
347
-
348
- total_numb_imgs = int(np.prod(chip_format) * block_count * n_exposures)
349
- SSX_LOGGER.info(f"Calculated number of images: {total_numb_imgs}")
289
+ def set_datasize(
290
+ parameters: FixedTargetParameters,
291
+ ):
292
+ SSX_LOGGER.info("Setting PV to calculated total number of images")
350
293
 
351
- SSX_LOGGER.info("Set PV to calculated number of images.")
352
- caput(pv.me14e_gp10, int(total_numb_imgs))
294
+ SSX_LOGGER.debug(f"Map type: {parameters.map_type}")
295
+ SSX_LOGGER.debug(f"Chip type: {parameters.chip.chip_type}")
296
+ if parameters.map_type == MappingType.Lite:
297
+ SSX_LOGGER.debug(f"Num exposures: {parameters.num_exposures}")
298
+ SSX_LOGGER.debug(f"Block count: {len(parameters.chip_map)}")
353
299
 
354
- return int(total_numb_imgs)
300
+ caput(pv.me14e_gp10, parameters.total_num_images)
355
301
 
356
302
 
357
303
  @log_on_entry
@@ -622,9 +568,7 @@ def main_fixed_target_plan(
622
568
  parameters.checker_pattern,
623
569
  )
624
570
 
625
- parameters.total_num_images = datasetsizei24(
626
- parameters.num_exposures, parameters.chip, parameters.map_type
627
- )
571
+ set_datasize(parameters)
628
572
 
629
573
  start_time = yield from start_i24(
630
574
  zebra,
@@ -695,8 +639,7 @@ def collection_complete_plan(
695
639
  SSX_LOGGER.debug(f"Collection end time {end_time}")
696
640
  dcid.collection_complete(end_time, aborted=False)
697
641
 
698
- # Copy parameter file and eventual chip map to collection directory
699
- copy_files_to_data_location(collection_directory, map_type=map_type)
642
+ # NOTE no files to copy anymore but shoud write userlog here
700
643
  yield from bps.null()
701
644
 
702
645
 
@@ -749,29 +692,13 @@ def run_fixed_target_plan(
749
692
  mirrors: FocusMirrorsMode = inject("focus_mirrors"),
750
693
  attenuator: ReadOnlyAttenuator = inject("attenuator"),
751
694
  ) -> MsgGenerator:
752
- # in the first instance, write params here
753
- yield from write_parameter_file(detector_stage, attenuator)
754
-
755
- SSX_LOGGER.info("Getting parameters from file.")
756
- parameters = FixedTargetParameters.from_file(PARAM_FILE_PATH_FT / PARAM_FILE_NAME)
757
-
758
- log_msg = f"""
759
- Parameters for I24 serial collection: \n
760
- Chip name is {parameters.filename}
761
- visit = {parameters.visit}
762
- sub_dir = {parameters.directory}
763
- n_exposures = {parameters.num_exposures}
764
- chip_type = {str(parameters.chip.chip_type)}
765
- map_type = {str(parameters.map_type)}
766
- dcdetdist = {parameters.detector_distance_mm}
767
- exptime = {parameters.exposure_time_s}
768
- det_type = {parameters.detector_name}
769
- pump_repeat = {str(parameters.pump_repeat)}
770
- pumpexptime = {parameters.laser_dwell_s}
771
- pumpdelay = {parameters.laser_delay_s}
772
- prepumpexptime = {parameters.pre_pump_exposure_s}
773
- """
774
- SSX_LOGGER.info(log_msg)
695
+ # Read the parameters
696
+ parameters: FixedTargetParameters = yield from read_parameters(
697
+ detector_stage, attenuator
698
+ )
699
+
700
+ if parameters.chip_map:
701
+ upload_chip_map_to_geobrick(pmac, parameters.chip_map)
775
702
 
776
703
  beam_center_device = sup.get_beam_center_device(parameters.detector_name)
777
704
 
@@ -21,17 +21,24 @@ from dodal.devices.i24.dual_backlight import BacklightPositions, DualBacklight
21
21
  from dodal.devices.i24.i24_detector_motion import DetectorMotion
22
22
  from dodal.devices.i24.pmac import PMAC, EncReset, LaserSettings
23
23
 
24
- from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import ChipType, Fiducials
24
+ from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import (
25
+ ChipType,
26
+ Fiducials,
27
+ MappingType,
28
+ )
25
29
  from mx_bluesky.beamlines.i24.serial.log import (
26
30
  SSX_LOGGER,
27
31
  _read_visit_directory_from_file,
28
32
  log_on_entry,
29
33
  )
30
- from mx_bluesky.beamlines.i24.serial.parameters import get_chip_format
34
+ from mx_bluesky.beamlines.i24.serial.parameters import (
35
+ FixedTargetParameters,
36
+ get_chip_format,
37
+ get_chip_map,
38
+ )
31
39
  from mx_bluesky.beamlines.i24.serial.parameters.constants import (
32
40
  CS_FILES_PATH,
33
41
  LITEMAP_PATH,
34
- PARAM_FILE_NAME,
35
42
  PARAM_FILE_PATH_FT,
36
43
  PVAR_FILE_PATH,
37
44
  )
@@ -47,6 +54,8 @@ CHIP_MOVES = {
47
54
  ChipType.Custom: 25.40,
48
55
  ChipType.Minichip: 25.40,
49
56
  }
57
+ OXFORD_CHIP_WIDTH = 8
58
+ PVAR_TEMPLATE = f"P3%0{2}d1"
50
59
  CHIPTYPE_PV = pv.me14e_gp1
51
60
  MAPTYPE_PV = pv.me14e_gp2
52
61
  NUM_EXPOSURES_PV = pv.me14e_gp3
@@ -107,22 +116,35 @@ def initialise_stages(
107
116
 
108
117
 
109
118
  @log_on_entry
110
- def write_parameter_file(
119
+ def read_parameters(
111
120
  detector_stage: DetectorMotion,
112
121
  attenuator: ReadOnlyAttenuator,
113
122
  ) -> MsgGenerator:
114
- param_path: Path = PARAM_FILE_PATH_FT
115
- # Create directory if it doesn't yet exist.
116
- param_path.mkdir(parents=True, exist_ok=True)
123
+ """ Read the parameters from user input and create the parameter model for a fixed \
124
+ target collection.
117
125
 
118
- SSX_LOGGER.info(
119
- f"Writing Parameter File: {(param_path / PARAM_FILE_NAME).as_posix()}"
120
- )
126
+ Args:
127
+ detector_stage (DetectorMotion): The detector stage device.
128
+ attenuator (ReadOnlyAttenuator): A read-only attenuator device to get the \
129
+ transmission value.
130
+
131
+ Returns:
132
+ FixedTargetParameters: Parameter model for fixed target collections
133
+
134
+ """
135
+ SSX_LOGGER.info("Creating parameter model from input.")
121
136
 
122
137
  filename = caget(pv.me14e_chip_name)
123
138
  det_type = yield from get_detector_type(detector_stage)
124
139
  chip_params = get_chip_format(ChipType(int(caget(CHIPTYPE_PV))))
125
140
  map_type = int(caget(MAPTYPE_PV))
141
+ if map_type == MappingType.Lite and chip_params.chip_type in [
142
+ ChipType.Oxford,
143
+ ChipType.OxfordInner,
144
+ ]:
145
+ chip_map = get_chip_map()
146
+ else:
147
+ chip_map = []
126
148
  pump_repeat = int(caget(PUMP_REPEAT_PV))
127
149
 
128
150
  # If file name ends in a digit this causes processing/pilatus pain.
@@ -153,6 +175,7 @@ def write_parameter_file(
153
175
  "map_type": map_type,
154
176
  "pump_repeat": pump_repeat,
155
177
  "checker_pattern": bool(caget(pv.me14e_gp111)),
178
+ "chip_map": chip_map,
156
179
  "laser_dwell_s": float(caget(pv.me14e_gp103)) if pump_repeat != 0 else 0.0,
157
180
  "laser_delay_s": float(caget(pv.me14e_gp110)) if pump_repeat != 0 else 0.0,
158
181
  "pre_pump_exposure_s": float(caget(pv.me14e_gp109))
@@ -160,13 +183,11 @@ def write_parameter_file(
160
183
  else None,
161
184
  }
162
185
 
163
- with open(param_path / PARAM_FILE_NAME, "w") as f:
164
- json.dump(params_dict, f, indent=4)
165
-
166
- SSX_LOGGER.info("Information written to file \n")
186
+ SSX_LOGGER.info("Parameters for I24 serial collection: \n")
167
187
  SSX_LOGGER.info(pformat(params_dict))
168
188
 
169
189
  yield from bps.null()
190
+ return FixedTargetParameters(**params_dict)
170
191
 
171
192
 
172
193
  def scrape_pvar_file(fid: str, pvar_dir: Path = PVAR_FILE_PATH):
@@ -221,59 +242,25 @@ def define_current_chip(
221
242
 
222
243
 
223
244
  @log_on_entry
224
- def save_screen_map() -> MsgGenerator:
225
- litemap_path: Path = LITEMAP_PATH
226
- litemap_path.mkdir(parents=True, exist_ok=True)
227
-
228
- SSX_LOGGER.info(f"Saving {litemap_path.as_posix()} currentchip.map")
229
- with open(litemap_path / "currentchip.map", "w") as f:
230
- SSX_LOGGER.debug("Printing only blocks with block_val == 1")
231
- for x in range(1, 82):
232
- block_str = f"ME14E-MO-IOC-01:GP{x + 10:d}"
233
- block_val = int(caget(block_str))
234
- if block_val == 1:
235
- SSX_LOGGER.info(f"{block_str} {block_val:d}")
236
- line = f"{x:02d}status P3{x:02d}1 \t{block_val}\n"
237
- f.write(line)
238
- yield from bps.null()
245
+ def upload_chip_map_to_geobrick(pmac: PMAC, chip_map: list[int]) -> MsgGenerator:
246
+ """Upload the map parameters for an Oxford-type chip (width=8) to the geobrick.
239
247
 
248
+ Args:
249
+ pmac (PMAC): The PMAC device.
250
+ chip_map (list[int]): A list of selected blocks to be collected.
240
251
 
241
- @log_on_entry
242
- def upload_parameters(pmac: PMAC = inject("pmac")) -> MsgGenerator:
252
+ """
243
253
  SSX_LOGGER.info("Uploading Parameters for Oxford Chip to the GeoBrick")
244
- caput(CHIPTYPE_PV, 0)
245
- width = 8
246
-
247
- map_file: Path = LITEMAP_PATH / "currentchip.map"
248
- if not map_file.exists():
249
- raise FileNotFoundError(f"The file {map_file} has not yet been created")
250
-
251
- with open(map_file) as f:
252
- SSX_LOGGER.info(f"Chipid {ChipType.Oxford}")
253
- SSX_LOGGER.info(f"width {width}")
254
- x = 1
255
- for line in f.readlines()[: width**2]:
256
- cols = line.split()
257
- pvar = cols[1]
258
- value = cols[2]
259
- s = pvar + "=" + value
260
- if value != "1":
261
- s2 = pvar + " "
262
- sys.stdout.write(s2)
263
- else:
264
- sys.stdout.write(s + " ")
265
- sys.stdout.flush()
266
- if x == width:
267
- print()
268
- x = 1
269
- else:
270
- x += 1
271
- yield from bps.abs_set(pmac.pmac_string, s, wait=True)
272
- sleep(0.02)
273
-
274
- SSX_LOGGER.warning("Automatic Setting Mapping Type to Lite has been disabled")
254
+ SSX_LOGGER.info(f"Chipid {ChipType.Oxford}, width {OXFORD_CHIP_WIDTH}")
255
+ for block in range(1, 65):
256
+ value = 1 if block in chip_map else 0
257
+ pvar = PVAR_TEMPLATE % block
258
+ pvar_str = f"{pvar}={value}"
259
+ SSX_LOGGER.debug(f"Set {pvar_str} for block {block}")
260
+ yield from bps.abs_set(pmac.pmac_string, pvar_str, wait=True)
261
+ # Wait for PMAC to be done processing PVAR string
262
+ sleep(0.02)
275
263
  SSX_LOGGER.debug("Upload parameters done.")
276
- yield from bps.null()
277
264
 
278
265
 
279
266
  @log_on_entry
@@ -3,28 +3,10 @@ Startup utilities for chip
3
3
  """
4
4
 
5
5
  import string
6
- from pathlib import Path
7
6
 
8
7
  from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import ChipType
9
8
  from mx_bluesky.beamlines.i24.serial.log import SSX_LOGGER, log_on_entry
10
- from mx_bluesky.beamlines.i24.serial.parameters import (
11
- FixedTargetParameters,
12
- get_chip_format,
13
- )
14
- from mx_bluesky.beamlines.i24.serial.parameters.constants import (
15
- PARAM_FILE_NAME,
16
- PARAM_FILE_PATH_FT,
17
- )
18
-
19
-
20
- def read_parameter_file(
21
- param_path: Path | str = PARAM_FILE_PATH_FT,
22
- ) -> FixedTargetParameters:
23
- if not isinstance(param_path, Path):
24
- param_path = Path(param_path)
25
- params_file = param_path / PARAM_FILE_NAME
26
- params = FixedTargetParameters.from_file(params_file)
27
- return params
9
+ from mx_bluesky.beamlines.i24.serial.parameters import get_chip_format
28
10
 
29
11
 
30
12
  @log_on_entry
@@ -6,7 +6,10 @@ from mx_bluesky.beamlines.i24.serial.parameters.experiment_parameters import (
6
6
  FixedTargetParameters,
7
7
  SerialAndLaserExperiment,
8
8
  )
9
- from mx_bluesky.beamlines.i24.serial.parameters.utils import get_chip_format
9
+ from mx_bluesky.beamlines.i24.serial.parameters.utils import (
10
+ get_chip_format,
11
+ get_chip_map,
12
+ )
10
13
 
11
14
  __all__ = [
12
15
  "SSXType",
@@ -16,4 +19,5 @@ __all__ = [
16
19
  "FixedTargetParameters",
17
20
  "SerialAndLaserExperiment",
18
21
  "get_chip_format",
22
+ "get_chip_map",
19
23
  ]
@@ -3,7 +3,8 @@ from abc import abstractmethod
3
3
  from pathlib import Path
4
4
  from typing import Literal
5
5
 
6
- from pydantic import BaseModel, ConfigDict, field_validator
6
+ import numpy as np
7
+ from pydantic import BaseModel, ConfigDict, computed_field, field_validator
7
8
 
8
9
  from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import (
9
10
  ChipType,
@@ -56,6 +57,11 @@ class SerialAndLaserExperiment(SerialExperiment, LaserExperiment):
56
57
  def nexgen_experiment_type(self) -> str:
57
58
  pass
58
59
 
60
+ @property
61
+ @abstractmethod
62
+ def ispyb_experiment_type(self) -> SSXType:
63
+ pass
64
+
59
65
 
60
66
  class ExtruderParameters(SerialAndLaserExperiment):
61
67
  """Extruder parameter model."""
@@ -103,6 +109,10 @@ class ChipDescription(BaseModel):
103
109
  else:
104
110
  return ((self.y_num_steps - 1) * self.y_step_size) + self.b2b_vert
105
111
 
112
+ @property
113
+ def tot_num_blocks(self) -> int:
114
+ return self.x_blocks * self.y_blocks
115
+
106
116
 
107
117
  class FixedTargetParameters(SerialAndLaserExperiment):
108
118
  """Fixed target parameter model."""
@@ -112,7 +122,7 @@ class FixedTargetParameters(SerialAndLaserExperiment):
112
122
  map_type: MappingType
113
123
  pump_repeat: PumpProbeSetting
114
124
  checker_pattern: bool = False
115
- total_num_images: int = 0 # Calculated in the code for now
125
+ chip_map: list[int]
116
126
 
117
127
  @property
118
128
  def nexgen_experiment_type(self) -> str:
@@ -122,6 +132,28 @@ class FixedTargetParameters(SerialAndLaserExperiment):
122
132
  def ispyb_experiment_type(self) -> SSXType:
123
133
  return SSXType.FIXED
124
134
 
135
+ @computed_field # type: ignore # Mypy doesn't like it
136
+ @property
137
+ def total_num_images(self) -> int:
138
+ match self.map_type:
139
+ case MappingType.NoMap:
140
+ if self.chip.chip_type is ChipType.Custom:
141
+ num_images = (
142
+ self.chip.x_num_steps
143
+ * self.chip.y_num_steps
144
+ * self.num_exposures
145
+ )
146
+ else:
147
+ chip_format = self.chip.chip_format[:4]
148
+ num_images = int(np.prod(chip_format) * self.num_exposures)
149
+ case MappingType.Lite:
150
+ chip_format = self.chip.chip_format[2:4]
151
+ block_count = len(self.chip_map) # type: ignore
152
+ num_images = int(
153
+ np.prod(chip_format) * block_count * self.num_exposures
154
+ )
155
+ return num_images
156
+
125
157
 
126
158
  class BeamSettings(BaseModel):
127
159
  model_config = ConfigDict(frozen=True)
@@ -6,6 +6,12 @@ from mx_bluesky.beamlines.i24.serial.parameters.experiment_parameters import (
6
6
  )
7
7
  from mx_bluesky.beamlines.i24.serial.setup_beamline import caget, pv
8
8
 
9
+ OXFORD_BLOCKS_PVS = [f"ME14E-MO-IOC-01:GP{i}" for i in range(11, 75)]
10
+
11
+
12
+ class EmptyMapError(Exception):
13
+ pass
14
+
9
15
 
10
16
  def get_chip_format(chip_type: ChipType) -> ChipDescription:
11
17
  """Default parameter values."""
@@ -40,3 +46,16 @@ def get_chip_format(chip_type: ChipType) -> ChipDescription:
40
46
  defaults["b2b_horz"] = defaults["b2b_vert"] = 0.0
41
47
  chip_params: dict[str, Any] = {"chip_type": chip_type, **defaults}
42
48
  return ChipDescription(**chip_params)
49
+
50
+
51
+ def get_chip_map() -> list[int]:
52
+ """Return a list of blocks (the 'chip map') to be collected on an Oxford type chip \
53
+ when using lite mapping."""
54
+ chipmap = []
55
+ for n, block_pv in enumerate(OXFORD_BLOCKS_PVS):
56
+ block_val = int(caget(block_pv))
57
+ if block_val == 1:
58
+ chipmap.append(n + 1)
59
+ if len(chipmap) == 0:
60
+ raise EmptyMapError("No blocks selected for Lite map.")
61
+ return chipmap
@@ -45,11 +45,8 @@ def call_nexgen(
45
45
  parameters.map_type == MappingType.NoMap
46
46
  or parameters.chip.chip_type == ChipType.Custom
47
47
  ):
48
- # NOTE Nexgen server is still on nexgen v0.7.2 (fully working for ssx)
49
- # Will need to be updated, for correctness sake map needs to be None.
50
- current_chip_map = (
51
- "/dls_sw/i24/scripts/fastchips/litemaps/currentchip.map"
52
- )
48
+ # For nexgen >= 0.9.10
49
+ current_chip_map = parameters.chip_map
53
50
  pump_status = bool(parameters.pump_repeat)
54
51
  total_numb_imgs = parameters.total_num_images
55
52
  case ExtruderParameters():
@@ -103,12 +103,12 @@ class MxBlueskyParameters(BaseModel):
103
103
 
104
104
  @field_validator("parameter_model_version")
105
105
  @classmethod
106
- def _validate_version(cls, version: Version):
106
+ def _validate_version(cls, version: SemanticVersion):
107
107
  assert (
108
- version >= Version(major=PARAMETER_VERSION.major)
108
+ version >= SemanticVersion(major=PARAMETER_VERSION.major)
109
109
  ), f"Parameter version too old! This version of hyperion uses {PARAMETER_VERSION}"
110
110
  assert (
111
- version <= Version(major=PARAMETER_VERSION.major + 1)
111
+ version <= SemanticVersion(major=PARAMETER_VERSION.major + 1)
112
112
  ), f"Parameter version too new! This version of hyperion uses {PARAMETER_VERSION}"
113
113
  return version
114
114
 
@@ -78,11 +78,11 @@ def move_x_y_z(
78
78
  axes are optional."""
79
79
 
80
80
  LOGGER.info(f"Moving smargon to x, y, z: {(x_mm, y_mm, z_mm)}")
81
- if x_mm:
81
+ if x_mm is not None:
82
82
  yield from bps.abs_set(smargon.x, x_mm, group=group)
83
- if y_mm:
83
+ if y_mm is not None:
84
84
  yield from bps.abs_set(smargon.y, y_mm, group=group)
85
- if z_mm:
85
+ if z_mm is not None:
86
86
  yield from bps.abs_set(smargon.z, z_mm, group=group)
87
87
  if wait:
88
88
  yield from bps.wait(group)
@@ -100,11 +100,11 @@ def move_phi_chi_omega(
100
100
  axes are optional."""
101
101
 
102
102
  LOGGER.info(f"Moving smargon to phi, chi, omega: {(phi, chi, omega)}")
103
- if phi:
103
+ if phi is not None:
104
104
  yield from bps.abs_set(smargon.phi, phi, group=group)
105
- if chi:
105
+ if chi is not None:
106
106
  yield from bps.abs_set(smargon.chi, chi, group=group)
107
- if omega:
107
+ if omega is not None:
108
108
  yield from bps.abs_set(smargon.omega, omega, group=group)
109
109
  if wait:
110
110
  yield from bps.wait(group)
@@ -79,6 +79,8 @@ from mx_bluesky.hyperion.parameters.constants import CONST
79
79
  from mx_bluesky.hyperion.parameters.gridscan import HyperionThreeDGridScan
80
80
  from mx_bluesky.hyperion.utils.context import device_composite_from_context
81
81
 
82
+ ZOCALO_MIN_TOTAL_COUNT_THRESHOLD = 3
83
+
82
84
 
83
85
  class SmargonSpeedException(Exception):
84
86
  pass
@@ -247,10 +249,20 @@ def run_gridscan_and_fetch_results(
247
249
  LOGGER.info("Zocalo triggered and read, interpreting results.")
248
250
  xrc_results = yield from get_full_processing_results(fgs_composite.zocalo)
249
251
  LOGGER.info(f"Got xray centres, top 5: {xrc_results[:5]}")
250
- if xrc_results:
252
+ filtered_results = [
253
+ result
254
+ for result in xrc_results
255
+ if result["total_count"] >= ZOCALO_MIN_TOTAL_COUNT_THRESHOLD
256
+ ]
257
+ discarded_count = len(xrc_results) - len(filtered_results)
258
+ if discarded_count > 0:
259
+ LOGGER.info(
260
+ f"Removed {discarded_count} results because below threshold"
261
+ )
262
+ if filtered_results:
251
263
  flyscan_results = [
252
264
  _xrc_result_in_boxes_to_result_in_mm(xr, parameters)
253
- for xr in xrc_results
265
+ for xr in filtered_results
254
266
  ]
255
267
  else:
256
268
  LOGGER.warning("No X-ray centre received")
@@ -1,10 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from math import isclose
3
4
  from typing import cast
4
5
 
5
6
  import bluesky.preprocessors as bpp
6
7
  import pydantic
7
8
  from blueapi.core import BlueskyContext
9
+ from bluesky import plan_stubs as bps
8
10
  from bluesky.utils import MsgGenerator
9
11
  from dodal.devices.aperturescatterguard import ApertureScatterguard
10
12
  from dodal.devices.attenuator import Attenuator
@@ -174,7 +176,11 @@ def robot_load_then_xray_centre(
174
176
  yield from pin_already_loaded(composite.robot, sample_location)
175
177
  )
176
178
 
177
- doing_chi_change = parameters.chi_start_deg is not None
179
+ current_chi = yield from bps.rd(composite.smargon.chi)
180
+ LOGGER.info(f"Read back current smargon chi of {current_chi} degrees.")
181
+ doing_chi_change = parameters.chi_start_deg is not None and not isclose(
182
+ current_chi, parameters.chi_start_deg, abs_tol=0.001
183
+ )
178
184
 
179
185
  if doing_sample_load:
180
186
  LOGGER.info("Pin not loaded, loading and centring")
@@ -9,7 +9,7 @@ import bluesky.preprocessors as bpp
9
9
  from bluesky.run_engine import RunEngine
10
10
  from dodal.beamlines import i03
11
11
  from dodal.devices.oav.oav_parameters import OAVConfig
12
- from ophyd_async.core import set_mock_value
12
+ from ophyd_async.testing import set_mock_value
13
13
 
14
14
  from mx_bluesky.hyperion.device_setup_plans.read_hardware_for_setup import (
15
15
  read_hardware_during_collection,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mx-bluesky
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: Bluesky tools for MX Beamlines at DLS
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
6
6
  License: Apache License
@@ -239,7 +239,7 @@ Requires-Dist: daq-config-server>=0.1.1
239
239
  Requires-Dist: ophyd==1.9.0
240
240
  Requires-Dist: ophyd-async>=0.8a5
241
241
  Requires-Dist: bluesky>=1.13.0a4
242
- Requires-Dist: dls-dodal==1.36.2
242
+ Requires-Dist: dls-dodal==1.36.3
243
243
  Provides-Extra: dev
244
244
  Requires-Dist: black; extra == "dev"
245
245
  Requires-Dist: build; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  mx_bluesky/__init__.py,sha256=Ksms_WJF8LTkbm38gEpm1jBpGqcQ8NGvmb2ZJlOE1j8,198
2
2
  mx_bluesky/__main__.py,sha256=RVqPnxDisFMIn_aoEi0drlThNHgKTJULnSrotouIKI0,480
3
- mx_bluesky/_version.py,sha256=oFZsPxoSsCY6D2DiWMSueNvMDRRQN5ssWrPdQtlLJ_o,411
3
+ mx_bluesky/_version.py,sha256=tX44urJsC0QN5SJ51xsM0HeojA_8Xx7NXFEGAkYlNE4,411
4
4
  mx_bluesky/jupyter_example.ipynb,sha256=wpwvPrBvwtRMS5AIFk8F54cIlUoD0o4ji8tKK5cZHA4,1672
5
5
  mx_bluesky/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  mx_bluesky/beamlines/i04/__init__.py,sha256=jZjAMN5_oOEjQoR3iTrnMFW3ElxlHhQ7pEQZIv21Y4I,129
@@ -8,7 +8,7 @@ mx_bluesky/beamlines/i04/redis_to_murko_forwarder.py,sha256=10PKvDRKaaTtlOCfRG8T
8
8
  mx_bluesky/beamlines/i04/thawing_plan.py,sha256=YykXHXINBDnQ0wJ577v4XrXwcqlRRgoUSbaNuOKd1bc,5464
9
9
  mx_bluesky/beamlines/i04/callbacks/murko_callback.py,sha256=ZIwkY6gdcmIE-aMBvehN8DVcjGRtb9wwzpgHJNMZ39Q,2125
10
10
  mx_bluesky/beamlines/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- mx_bluesky/beamlines/i24/serial/__init__.py,sha256=9MDcY2aHUE1zZZkoNPSGxgYV1NIf5vsCM8jArR8d3fg,1226
11
+ mx_bluesky/beamlines/i24/serial/__init__.py,sha256=gSP8Vu9PMDeIgzge48XS3bOdmvb_a9k8RQP98BNcdZg,1080
12
12
  mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=gwOfjzZMbcvpVH71CCyHaxr8hgPYCJIWWWfg1zErtmM,245
13
13
  mx_bluesky/beamlines/i24/serial/dcid.py,sha256=iaReE06DJZSkxtdPqeHgRxN-JG7rW55ihKZzH9RWFHA,14525
14
14
  mx_bluesky/beamlines/i24/serial/log.py,sha256=oK7HHjIeuiWdy1vNZL6p-mU8Y3kzeCAgsifCxhAYqOQ,4799
@@ -18,23 +18,23 @@ mx_bluesky/beamlines/i24/serial/run_serial.py,sha256=Zrudosavh2HnnBXd2CLtOPs3lyQ
18
18
  mx_bluesky/beamlines/i24/serial/run_ssx.sh,sha256=0Ir5iQQ-xSN_5teHtxzht6G-mJ08mE1gxBS32vkh1eM,714
19
19
  mx_bluesky/beamlines/i24/serial/set_visit_directory.sh,sha256=WuN5PUBxTofzuESk1-3gWtTcbPjOx-26JaQSVCsZhZs,1660
20
20
  mx_bluesky/beamlines/i24/serial/start_blueapi.sh,sha256=4iBzQljTLXQiVIF4UO7drc9qUkP7KSRC6Mjh8hcGxpI,608
21
- mx_bluesky/beamlines/i24/serial/write_nexus.py,sha256=4Z15qBwrbkcoTFIZd3CRmzOtA0lFHSEgcpDpjrgM0hg,4161
21
+ mx_bluesky/beamlines/i24/serial/write_nexus.py,sha256=wb9tQwiWL5BH_XgLH-S9TS5_M2WYMasZzyOiiwjG5z8,3950
22
22
  mx_bluesky/beamlines/i24/serial/extruder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- mx_bluesky/beamlines/i24/serial/extruder/i24ssx_Extruder_Collect_py3v2.py,sha256=AqHONcB465E_X6sl7FQFplBQ_xzjlii9b6XbQMbr3JM,18458
23
+ mx_bluesky/beamlines/i24/serial/extruder/i24ssx_Extruder_Collect_py3v2.py,sha256=ovtS6oKdy--TKwUsK1ogSrFEtUQHNGoUox4bIYlFu1g,18352
24
24
  mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/DetStage.edl,sha256=9L1CgEdxZD4N3QvM5HLlAlJTcxpzd4ahB2nVJ9jHujw,2013
25
25
  mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/DiamondExtruder-I24-py3v1.edl,sha256=JaS-PvAHEOqHRuH3LbdpOk2T-TlO8Enq_uwzokQXzZU,31349
26
26
  mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/microdrop_alignment.edl,sha256=K79vmGAcf9qVEQLXTgr0g4bZDWaJ7nFoK4e0Ex7qAwM,14690
27
27
  mx_bluesky/beamlines/i24/serial/fixed_target/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  mx_bluesky/beamlines/i24/serial/fixed_target/ft_utils.py,sha256=puO1vg0x-TPgv8FbEFg73ohJqbwDpcG50_2cLUTa2FA,1210
29
- mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py,sha256=KFDCGh4JDhghVxF8BErg8joBjNcV83eEE_HoLkOUB0g,28712
30
- mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py,sha256=rO1nGhCTk8PXSJ1gvnRK52KROHSwcAYDVoCvXfHumxc,33716
31
- mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py,sha256=ZmwetrBxEr5qmeGKFDGHrRnPysA8KhcPr1O2rKzfsEs,3756
29
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py,sha256=N-AhNW3NGXJNAGLeNxalnU6_N2XBuz7copUsWByOrL8,25783
30
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py,sha256=WjTY49wgpuIGypM1-rQCp4KooUFO9A3NszdZMnMnQNQ,33185
31
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py,sha256=Vokr_Gl_lpqcUwG18C2h8TYMmyTx1HmUSDd9zgR9-7M,3275
32
32
  mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_moveonclick.py,sha256=qciUnif6yd5KwJ8_XvRgafHJOFnzJIMg5Bwfjp0VOzw,6418
33
33
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/CustomChip_py3v1.edl,sha256=H9BVU1S3oy8tAVHtKvJvp7YTHA-4X-jtOtiu3jJ7of4,10348
34
34
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/DetStage.edl,sha256=WBji5SaRQ5e0KFRgrPuv6IgaFxkal1jh7MZW8SqQN88,2016
35
35
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/DiamondChipI24-py3v1.edl,sha256=-O_kRA5-m741Mja8OXQlGJWrRu9uBUkTvJ_uqUBjuFY,56616
36
36
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/ME14E-GeneralPurpose.edl,sha256=cpKpXfU668mGjIz35jUMTF8KAi0RI7WlVO2AR-EnJ8U,60868
37
- mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl,sha256=CPMPU-imtWeKERXydJn30svgx-s2u6SuuamsFRsstyM,38860
37
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl,sha256=LI6Z5J1ugny0hX3NrfKx0CC3QdfnohokxYwcyPW-6XU,38124
38
38
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/PMAC_Command.edl,sha256=2KUy2iEcX9AC07zSH3Sp97b5qauGIm8_HjvoQ4pkyCU,1417
39
39
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/Shutter_Control.edl,sha256=o2PDoIFzeErIUijDbGdfWdrh3wd5GFAqEsDD2at2a4k,1601
40
40
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/microdrop_alignment.edl,sha256=8TWQTIBnX3OLa1kjsibsCnG5wCVotPYIOHwFam7rJe4,14679
@@ -42,10 +42,10 @@ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/nudgechip.edl,sha256=IgL
42
42
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/pumpprobe-py3v1.edl,sha256=CrCo1nSIzT3OcSy4OXq1vu4lz5OvI4U8-yl-ruQ57m4,22665
43
43
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/short1-laser.png,sha256=wDNuKCa_8hUPy4W01vdIrfdZtCyQKT8qVS5AS6kOTmo,9740
44
44
  mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/short2-laser.png,sha256=MrdiCFX7j-ODkfSdzc4NQ_8hj2Gs8i9gQqWyNXvdM5s,10189
45
- mx_bluesky/beamlines/i24/serial/parameters/__init__.py,sha256=s1PGsVlXnBcCFxlSysA2EDOvvzFRnhD-PHZVfrCi-RM,534
45
+ mx_bluesky/beamlines/i24/serial/parameters/__init__.py,sha256=NrTN0M-3PWZesh7GqcEr-UM-a2C8wLkhgtbVwJM48z4,581
46
46
  mx_bluesky/beamlines/i24/serial/parameters/constants.py,sha256=HhAtuc6-Bd3RRwxxbMyijP6rKgWiRB-605mLPZAca7U,1552
47
- mx_bluesky/beamlines/i24/serial/parameters/experiment_parameters.py,sha256=pFHuCioe2bvGAwlAdUmc12nXrBJDSioG5oeAHRkoBtY,3417
48
- mx_bluesky/beamlines/i24/serial/parameters/utils.py,sha256=IR1ulMWW0PEoF-kddqXtFVm8MoA7oB_MbS0XO7a-k4w,2118
47
+ mx_bluesky/beamlines/i24/serial/parameters/experiment_parameters.py,sha256=769v9zdv_02pWlEPK2iZUkBYSk1KZYJlXenI4D5gXmA,4513
48
+ mx_bluesky/beamlines/i24/serial/parameters/utils.py,sha256=VcCEBjC8WSrf85Q20A6dwnsy4IxvjcB4JSlbYKz_CVM,2673
49
49
  mx_bluesky/beamlines/i24/serial/parameters/fixed_target/cs/cs_maker.json,sha256=xT3y7SSWjVTAJ58dzwNnEgBdn10A6T8umR18n5xt508,142
50
50
  mx_bluesky/beamlines/i24/serial/parameters/fixed_target/cs/motor_direction.txt,sha256=oIPpcQpqCrKz5dPZ-qQ5gQ2Sdqtj6nsnf66pN8PGU50,199
51
51
  mx_bluesky/beamlines/i24/serial/parameters/fixed_target/pvar_files/minichip-oxford.pvar,sha256=SN4deU199dMcA1Bcx1BF6CBMvoSszxJWZC6vt7_5fHc,284
@@ -60,7 +60,7 @@ mx_bluesky/beamlines/i24/serial/setup_beamline/setup_zebra_plans.py,sha256=_nTQv
60
60
  mx_bluesky/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  mx_bluesky/common/device_setup_plans/read_hardware_for_setup.py,sha256=P018shGBEdO0QWBufwITOk3p-sPUCy4P6UIkf6aUuho,583
62
62
  mx_bluesky/common/external_interaction/config_server.py,sha256=7CwHr03idK5vAB_9acDgGPe6_1bX3bIelecnmsjC7V0,1937
63
- mx_bluesky/common/parameters/components.py,sha256=ktEM1MrKRocbRYLleihcUdu4FwfgYbs7WadiI6GJXHY,7216
63
+ mx_bluesky/common/parameters/components.py,sha256=00ZLzXvDri1q8pAXjMSmCOqLiLlLdrHio7agnvj_DgQ,7240
64
64
  mx_bluesky/common/parameters/constants.py,sha256=SmkLsh2yq-x9rHiWkBKCCrzqCtD8n8Z6u0OXz8svwuo,4023
65
65
  mx_bluesky/common/parameters/gridscan.py,sha256=AWGf_Wwx09i7I6DZty5nfzd8U-eUI2PUjlCb5BhM_WI,3232
66
66
  mx_bluesky/common/parameters/robot_load.py,sha256=HWkMxCyD6R3qWuBU1jk-Zel2XGotvgAusMpTsVxYUe0,453
@@ -74,7 +74,7 @@ mx_bluesky/hyperion/exceptions.py,sha256=p6v49xg2O5hud0QiCf0rwWD4OvVb8lJaT5UpLj3
74
74
  mx_bluesky/hyperion/log.py,sha256=DkTW9lH-v_F4Tda5D3OhiSYQe-6Nhma2tqHbnr1mPno,416
75
75
  mx_bluesky/hyperion/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py,sha256=oKv72jSX67OpahzCIPAXpX_a3lUplOh7LFexvYBd-uc,4565
77
- mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py,sha256=vJdlTs9LILfkifqNcn15sQgG4_OJbK30v70YzJq0B8c,3217
77
+ mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py,sha256=K4LRVxZ6O2A84iwLElX-gLK-v83wlvy8JCECT2978Jg,3289
78
78
  mx_bluesky/hyperion/device_setup_plans/position_detector.py,sha256=g2gJZFqOF2klH92uKQAMoyXRSD7ehloe9wToIVfV-CM,631
79
79
  mx_bluesky/hyperion/device_setup_plans/read_hardware_for_setup.py,sha256=-bf3lRpvIQVsmT3-jRjb5jqaHDD3F3LSENmJVItixhA,2186
80
80
  mx_bluesky/hyperion/device_setup_plans/setup_oav.py,sha256=pIXLM3FKpf7wYMEiEAOaGTm504XAt5N7nuuu9kKraBk,2914
@@ -86,7 +86,7 @@ mx_bluesky/hyperion/device_setup_plans/xbpm_feedback.py,sha256=3WfVaNjB6f6XGLiPl
86
86
  mx_bluesky/hyperion/experiment_plans/__init__.py,sha256=3ldTMxgz4yKHJH9iF3nw7uueyX2zQ5Z84V0dsCzW5us,1081
87
87
  mx_bluesky/hyperion/experiment_plans/change_aperture_then_move_plan.py,sha256=4if5QruC2Q-rd8iInV9oiq0BjzjQW8IzBhXRcjxcAfg,3258
88
88
  mx_bluesky/hyperion/experiment_plans/experiment_registry.py,sha256=uZaxI-Tib0caZpydXooWULyMzx1vGiyWk0_rcvprevs,3059
89
- mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py,sha256=eHwYhhuQ9eQhbB_jP0AOp3U5ddvdMhG96tHDCS00iQY,18643
89
+ mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py,sha256=iU1LRFgfpdvzghcer0lh7wmTZRk14lSwFubXzmTE-lw,19115
90
90
  mx_bluesky/hyperion/experiment_plans/grid_detect_then_xray_centre_plan.py,sha256=3yBIoWGlzw3R3MYL7OzpakuzCuDQ-XkIxay1asK9Nsc,8155
91
91
  mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=Vnxj7V8Poql-CHA5pJmpaqBRwzUL05za0ZAtZ4ut9Dw,4404
92
92
  mx_bluesky/hyperion/experiment_plans/oav_grid_detection_plan.py,sha256=UYFEPzW4QzpiyspMa9GnSjmrQ4qLSb0HllyPJ78ApvI,7642
@@ -95,7 +95,7 @@ mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py,sha256=ORE60Oy
95
95
  mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py,sha256=LR365Xmc8bO-6Sz2ApQIbfaAGvMQLnMQxByXAP9s-kA,5014
96
96
  mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=16psmBqV4Mz6QOHhiZqUBSvSIufyLu0Pda8UOX-5Djw,6166
97
97
  mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py,sha256=NA0-S23jyLP2lQ3T1DPttKNtdTIlpuTcDSFNxhwZn1k,8524
98
- mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=OVBTzyV-ua_KbzSxMmiJZONKTtg_ldjnUi3iT4FEdgo,7431
98
+ mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=Sb_VJHpxkI3Kp1u6jWtBjcuzr_QQ-44hFlz1-GNMKqQ,7713
99
99
  mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=hJaUCQts0JZK6scLb4TNGwBsUGQUlnMrOZ-RTWwC-74,16260
100
100
  mx_bluesky/hyperion/experiment_plans/set_energy_plan.py,sha256=LgOTk7D2RKImejRMW4yG2KQNnr86tTh4RYaCrDFXXL8,1823
101
101
  mx_bluesky/hyperion/experiment_plans/common/xrc_result.py,sha256=VwNbY9bzXoFUo-VYiQNscmF7l_6TFv1iRCYshHdla7w,1435
@@ -144,10 +144,10 @@ mx_bluesky/hyperion/parameters/rotation.py,sha256=eO5TAbH3jx0pj1AYMOA4jVf9z_qMui
144
144
  mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml,sha256=xrhgok-9X2VXdyLEWiYOUEeRCBqhYM6IJFAefnNdgzw,26521
145
145
  mx_bluesky/hyperion/utils/context.py,sha256=TYG3e4lu88ssngoNbsR5pfEXI0DveDemLWaBuThtvbI,2710
146
146
  mx_bluesky/hyperion/utils/utils.py,sha256=q2uCaK1E8zLVk1BFmj7qlTnQf3JRKjCjyadIVnL1-4M,1180
147
- mx_bluesky/hyperion/utils/validation.py,sha256=dTG7KmWsLSoR0c1mYuhhNByUT6Yj3_VBAreY9nUdQjQ,6483
148
- mx_bluesky-1.4.1.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
149
- mx_bluesky-1.4.1.dist-info/METADATA,sha256=3l5V3QL8BJbuzei0MmvBAe6VZx_lOhs2gm95seupDAw,17272
150
- mx_bluesky-1.4.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
151
- mx_bluesky-1.4.1.dist-info/entry_points.txt,sha256=Bt3iHCqzZtHYnnSKoh_qM2k3K4LbK1Uxr0gF8B34F98,528
152
- mx_bluesky-1.4.1.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
153
- mx_bluesky-1.4.1.dist-info/RECORD,,
147
+ mx_bluesky/hyperion/utils/validation.py,sha256=jHaJJcP50vOGkccMCwDaRa7lmInI6Qkebj-fig5pUio,6486
148
+ mx_bluesky-1.4.2.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
149
+ mx_bluesky-1.4.2.dist-info/METADATA,sha256=8vYpt8eeKbpKaR-BvPWZr20ZW-YkGCJtDSw02XQXxrI,17272
150
+ mx_bluesky-1.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
151
+ mx_bluesky-1.4.2.dist-info/entry_points.txt,sha256=Bt3iHCqzZtHYnnSKoh_qM2k3K4LbK1Uxr0gF8B34F98,528
152
+ mx_bluesky-1.4.2.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
153
+ mx_bluesky-1.4.2.dist-info/RECORD,,