Skip to content

Commit

Permalink
Add options for multiple electrometers
Browse files Browse the repository at this point in the history
  • Loading branch information
elanaku committed Nov 12, 2024
1 parent 2d78c13 commit adf36dd
Showing 1 changed file with 76 additions and 25 deletions.
101 changes: 76 additions & 25 deletions python/lsst/ts/observatory/control/maintel/mtcalsys.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ def __init__(
f"FiberSpectrograph:{self.fiberspectrograph_blue_index}",
f"FiberSpectrograph:{self.fiberspectrograph_red_index}",
f"Electrometer:{self.electrometer_projector_index}",
f"ElectrometerCBP:{self.electrometer_cbp_index}",
f"ElectrometerCBPCal:{self.electrometer_cbpcal_index}",
f"Electrometer:{self.electrometer_cbp_index}",
f"Electrometer:{self.electrometer_cbpcal_index}",
f"LinearStage:{self.linearstage_led_select_index}",
f"LinearStage:{self.linearstage_led_focus_index}",
f"LinearStage:{self.linearstage_laser_focus_index}",
Expand Down Expand Up @@ -568,6 +568,14 @@ async def run_calibration_sequence(
wavelengths=calibration_wavelengths, config_data=config_data
)

electrometers_to_scan = []
if config_data["use_cbpelectrometer"]:
electrometers_to_scan.append(self.electrometer_cbp)
if config_data["use_cbpcalelectrometer"]:
electrometers_to_scan.append(self.electrometer_cbp_cal)
if config_data["use_flatfieldelectrometer"]:
electrometers_to_scan.append(self.electrometer_flatfield)

for exposure in exposure_table:
self.log.debug(
f"Performing {calibration_type.name} calibration with {exposure.wavelength=}."
Expand All @@ -584,6 +592,7 @@ async def run_calibration_sequence(
fiber_spectrum_red_exposure_time=exposure.fiberspectrograph_red,
fiber_spectrum_blue_exposure_time=exposure.fiberspectrograph_blue,
electrometer_exposure_time=exposure.electrometer,
electrometers_to_scan=electrometers_to_scan,
)
mtcamera_exposure_info.update(exposure_info)

Expand All @@ -599,6 +608,7 @@ async def run_calibration_sequence(
fiber_spectrum_red_exposure_time=exposure.fiberspectrograph_red,
fiber_spectrum_blue_exposure_time=exposure.fiberspectrograph_blue,
electrometer_exposure_time=exposure.electrometer,
electrometers_to_scan=electrometers_to_scan,
)
mtcamera_exposure_info.update(exposure_info)

Expand Down Expand Up @@ -745,6 +755,7 @@ async def _take_data(
mtcamera_exptime: float,
mtcamera_filter: str,
exposure_metadata: dict,
electrometers_to_scan: list,
fiber_spectrum_red_exposure_time: float | None,
fiber_spectrum_blue_exposure_time: float | None,
electrometer_exposure_time: float | None,
Expand All @@ -770,34 +781,69 @@ async def _take_data(
exposure_time=fiber_spectrum_blue_exposure_time,
exposures_done=exposures_done,
)
electrometer_exposure_coroutine = self.take_electrometer_scan(
exposure_time=electrometer_exposure_time,
exposures_done=exposures_done,
)
if (len(electrometers_to_scan) == 0) or (len(electrometers_to_scan) == 1):
electrometer_exposure_coroutine = self.take_electrometer_scan(
exposure_time=electrometer_exposure_time,
exposures_done=exposures_done,
electrometer_to_scan=electrometers_to_scan,
)
else:
electrometer_exposure_coroutine_1 = self.take_electrometer_scan(
exposure_time=electrometer_exposure_time,
exposures_done=exposures_done,
electrometer_to_scan=electrometers_to_scan[0],
)
electrometer_exposure_coroutine_2 = self.take_electrometer_scan(
exposure_time=electrometer_exposure_time,
exposures_done=exposures_done,
electrometer_to_scan=electrometers_to_scan[1],
)

try:
fiber_spectrum_red_exposure_task = asyncio.create_task(
fiber_spectrum_red_exposure_coroutine
)
fiber_spectrum_blue_exposure_task = asyncio.create_task(
fiber_spectrum_blue_exposure_coroutine
)
electrometer_exposure_task = asyncio.create_task(
electrometer_exposure_coroutine
)
if (len(electrometers_to_scan) == 0) or (len(electrometers_to_scan) == 0):
electrometer_exposure_task = asyncio.create_task(
electrometer_exposure_coroutine
)
else:
electrometer_exposure_task_1 = asyncio.create_task(
electrometer_exposure_coroutine_1
)
electrometer_exposure_task_2 = asyncio.create_task(
electrometer_exposure_coroutine_2
)

mtcamera_exposure_id = await mtcamera_exposure_task
finally:
exposures_done.set_result(True)
(
fiber_spectrum_red_exposure_result,
fiber_spectrum_blue_exposure_result,
electrometer_exposure_result,
) = await asyncio.gather(
fiber_spectrum_red_exposure_task,
fiber_spectrum_blue_exposure_task,
electrometer_exposure_task,
)

if (len(electrometers_to_scan) == 0) or (len(electrometers_to_scan) == 0):
exposures_done.set_result(True)
(
fiber_spectrum_red_exposure_result,
fiber_spectrum_blue_exposure_result,
electrometer_exposure_result,
) = await asyncio.gather(
fiber_spectrum_red_exposure_task,
fiber_spectrum_blue_exposure_task,
electrometer_exposure_task,
)
else:
exposures_done.set_result(True)
(
fiber_spectrum_red_exposure_result,
fiber_spectrum_blue_exposure_result,
electrometer_exposure_result_1,
electrometer_exposure_result_2,
) = await asyncio.gather(
fiber_spectrum_red_exposure_task,
fiber_spectrum_blue_exposure_task,
electrometer_exposure_task_1,
electrometer_exposure_task_2,
)
return {
mtcamera_exposure_id[0]: dict(
fiber_spectrum_red_exposure_result=fiber_spectrum_red_exposure_result,
Expand All @@ -810,6 +856,7 @@ async def take_electrometer_scan(
self,
exposure_time: float | None,
exposures_done: asyncio.Future,
electrometer_to_scan: salobj,
) -> list[str]:
"""Perform an electrometer scan for the specified duration.
Expand All @@ -819,21 +866,23 @@ async def take_electrometer_scan(
Exposure time for the fiber spectrum (seconds).
exposures_done : `asyncio.Future`
A future indicating when the camera exposures where complete.
electrometer_to_scan : `salobj`
The electrometer that performs the scan.
Returns
-------
electrometer_exposures : `list`[`str`]
List of large file urls.
"""

self.electrometer.evt_largeFileObjectAvailable.flush()
electrometer_to_scan.evt_largeFileObjectAvailable.flush()

electrometer_exposures = list()

if exposure_time is not None:

try:
await self.electrometer.cmd_startScanDt.set_start(
await electrometer_to_scan.cmd_startScanDt.set_start(
scanDuration=exposure_time,
timeout=exposure_time + self.long_timeout,
)
Expand All @@ -842,7 +891,7 @@ async def take_electrometer_scan(

# Make sure that a new lfo was created
try:
lfo = await self.electrometer.evt_largeFileObjectAvailable.next(
lfo = await electrometer_to_scan.evt_largeFileObjectAvailable.next(
timeout=self.long_timeout, flush=False
)
electrometer_exposures.append(lfo.url)
Expand All @@ -853,7 +902,9 @@ async def take_electrometer_scan(
"Time out waiting for electrometer data. Making sure electrometer "
"is in enabled state and continuing."
)
await salobj.set_summary_state(self.electrometer, salobj.State.ENABLED)
await salobj.set_summary_state(
electrometer_to_scan, salobj.State.ENABLED
)
return electrometer_exposures

async def take_fiber_spectrum(
Expand Down Expand Up @@ -910,7 +961,7 @@ async def take_fiber_spectrum(
return fiber_spectrum_exposures

@property
def electrometer(self) -> salobj.Remote:
def electrometer_flatfield(self) -> salobj.Remote:
return getattr(self.rem, f"electrometer_{self.electrometer_projector_index}")

@property
Expand Down

0 comments on commit adf36dd

Please sign in to comment.