diff --git a/src/daq_queuing_service/plugins/i15_1/i15_1_converter.py b/src/daq_queuing_service/plugins/i15_1/i15_1_converter.py index bd82c4c..97db4b3 100644 --- a/src/daq_queuing_service/plugins/i15_1/i15_1_converter.py +++ b/src/daq_queuing_service/plugins/i15_1/i15_1_converter.py @@ -38,7 +38,6 @@ def construct_blueapi_calls( history: list[TaskWithPosition], call_history: list[BlueapiCall], ) -> list[BlueapiCall]: - call_list: list[BlueapiCall] = [] for task in queue: @@ -70,6 +69,46 @@ def _construct_blueapi_tasks_from_experiment( # Assume sample name is of form test_8_1 to load from position 8 on puck 1 _, position, puck = sample_name.split("_") + # Assume colelctions with lists of temperatures are blowers, see + # https://github.com/DiamondLightSource/crystallography-bluesky/issues/125 + if "list_of_temperatures" in experiment.experiment_definition.data.keys(): + data_collection = TaskRequest( + name="blower_collection", + params={ + "time_per_collection": experiment.experiment_definition.data[ + "time_per_pdf" + ], + "exposure_time_per_frame": 0.1, + "ramp_rate_c_per_min": experiment.experiment_definition.data[ + "ramp_rate" + ], + "settle_time": experiment.experiment_definition.data["settle_time"], + "temperatures_celsius": experiment.experiment_definition.data[ + "list_of_temperatures" + ], + "metadata": { + "sample": experiment.sample, + "experiment_definition": experiment.experiment_definition, + }, + }, + instrument_session=experiment.instrument_session, + ) + else: + data_collection = TaskRequest( + name="data_collection", + params={ + "full_collection_time": experiment.experiment_definition.data[ + "time_per_pdf" + ], + "exposure_time_per_frame": 0.1, + "metadata": { + "sample": experiment.sample, + "experiment_definition": experiment.experiment_definition, + }, + }, + instrument_session=experiment.instrument_session, + ) + # For air calibration scans, we need to not to robot load/unload. # https://github.com/DiamondLightSource/daq-queuing-service/issues/83 return [ @@ -93,6 +132,7 @@ def _construct_blueapi_tasks_from_experiment( }, instrument_session=experiment.instrument_session, ), + data_collection, TaskRequest( name="robot_unload", params={}, diff --git a/tests/unit_tests/plugins/i15-1/test_i15_1_converter.py b/tests/unit_tests/plugins/i15-1/test_i15_1_converter.py index 9d10227..366eb39 100644 --- a/tests/unit_tests/plugins/i15-1/test_i15_1_converter.py +++ b/tests/unit_tests/plugins/i15-1/test_i15_1_converter.py @@ -72,7 +72,9 @@ def tasks_and_calls( def test_given_sample_name_in_correct_format_then_correct_sample_loaded(): experiment = Experiment( name="test_experiment", - experiment_definition=ExperimentDefinition(name=" ", id="", data={}), + experiment_definition=ExperimentDefinition( + name=" ", id="", data={"time_per_pdf": 100} + ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1", ) @@ -85,7 +87,9 @@ def test_given_sample_name_in_correct_format_then_correct_sample_loaded(): def test_sample_centre_uses_expected_params(): experiment = Experiment( name="test_experiment", - experiment_definition=ExperimentDefinition(name=" ", id="", data={}), + experiment_definition=ExperimentDefinition( + name=" ", id="", data={"time_per_pdf": 100} + ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1", ) @@ -97,7 +101,9 @@ def test_sample_centre_uses_expected_params(): "steps": 20, "exposure_time": 0.01, "metadata": { - "experiment_definition": ExperimentDefinition(name=" ", id="", data={}), + "experiment_definition": ExperimentDefinition( + name=" ", id="", data={"time_per_pdf": 100} + ), "sample": Sample(name="test_8_1", id="", data={}), }, } @@ -106,12 +112,14 @@ def test_sample_centre_uses_expected_params(): def test_session_and_number_of_tasks_per_experiment_is_expected(): experiment = Experiment( name="test_experiment", - experiment_definition=ExperimentDefinition(name=" ", id="", data={}), + experiment_definition=ExperimentDefinition( + name=" ", id="", data={"time_per_pdf": 100} + ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1", ) tasks = I151Converter()._construct_blueapi_tasks_from_experiment(experiment) - assert len(tasks) == 3 + assert len(tasks) == 4 for task in tasks: assert task.instrument_session == "cm12345-1" @@ -120,7 +128,7 @@ def test_experiment_with_correct_experiment_type_are_converted(): experiment = Experiment( name="test_experiment", experiment_definition=ExperimentDefinition( - name="run_full_collection", id="", data={} + name="run_full_collection", id="", data={"time_per_pdf": 100} ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1", @@ -135,14 +143,66 @@ def test_experiment_with_correct_experiment_type_are_converted(): user=None, ) call_list = I151Converter().construct_blueapi_calls([task], [], []) - assert len(call_list) == 3 + assert len(call_list) == 4 + + +def test_experiment_with_no_temperatures_runs_a_room_temperature_collection(): + experiment = Experiment( + name="test_experiment", + experiment_definition=ExperimentDefinition( + name="", id="", data={"time_per_pdf": 100} + ), + sample=Sample(name="test_8_1", id="", data={}), + instrument_session="cm12345-1", + ) + tasks = I151Converter()._construct_blueapi_tasks_from_experiment(experiment) + assert tasks[2].name == "data_collection" + assert tasks[2].params["full_collection_time"] == 100 + assert tasks[2].params["exposure_time_per_frame"] == 0.1 + assert tasks[2].params["metadata"] == { + "experiment_definition": ExperimentDefinition( + name="", id="", data={"time_per_pdf": 100} + ), + "sample": Sample(name="test_8_1", id="", data={}), + } + + +def test_experiment_with_temperatures_runs_a_blower_collection(): + experiment_definition = ExperimentDefinition( + name="", + id="", + data={ + "list_of_temperatures": [100, 120], + "time_per_pdf": 100, + "settle_time": 5, + "ramp_rate": 10, + }, + ) + + experiment = Experiment( + name="test_experiment", + experiment_definition=experiment_definition, + sample=Sample(name="test_8_1", id="", data={}), + instrument_session="cm12345-1", + ) + tasks = I151Converter()._construct_blueapi_tasks_from_experiment(experiment) + assert tasks[2].name == "blower_collection" + assert tasks[2].params["time_per_collection"] == 100 + assert tasks[2].params["exposure_time_per_frame"] == 0.1 + assert tasks[2].params["ramp_rate_c_per_min"] == 10 + assert tasks[2].params["settle_time"] == 5 + assert tasks[2].params["temperatures_celsius"] == [100, 120] + assert tasks[2].params["metadata"] == { + "experiment_definition": experiment_definition, + "sample": Sample(name="test_8_1", id="", data={}), + } def test_mix_of_experiments_with_correct_experiment_type_are_converted(): good_experiment = Experiment( name="test_experiment", experiment_definition=ExperimentDefinition( - name="run_full_collection", id="", data={} + name="run_full_collection", id="", data={"time_per_pdf": 100} ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1", @@ -167,7 +227,7 @@ class BadExperiment: plan_task.kind = TaskKind.PLAN tasks = [good_task, bad_task, plan_task, good_task] call_list = I151Converter().construct_blueapi_calls(tasks, [], []) - assert len(call_list) == 7 + assert len(call_list) == 9 def test_if_no_background_found_in_tiled_then_background_scan_added_to_tasks( @@ -176,7 +236,7 @@ def test_if_no_background_found_in_tiled_then_background_scan_added_to_tasks( experiment = Experiment( name="test_experiment", experiment_definition=ExperimentDefinition( - name="run_full_collection", id="", data={} + name="run_full_collection", id="", data={"time_per_pdf": 100} ), sample=Sample(name="test_8_1", id="", data={}), instrument_session="cm12345-1",