Skip to content
Snippets Groups Projects
Commit 016b6b30 authored by David Hammer's avatar David Hammer
Browse files

Merge branch 'jungfrau-gainmode-enums' into 'master'

JUNGFRAU: More user-friendly gain mode / gain setting parameters

See merge request !45
parents 86c81474 d4790a4f
No related branches found
No related tags found
1 merge request!45JUNGFRAU: More user-friendly gain mode / gain setting parameters
import collections
import operator import operator
from karabo.middlelayer import AccessMode, Assignment, String from karabo.middlelayer import AccessMode, Assignment, String
from .. import base_condition from .. import base_condition
from ..corrections.JungfrauCorrection import GainModes from ..corrections.JungfrauCorrection import GainModes, GainSettings
def old_settings_to_gain_mode(setting): def gain_mode_translator(gain_mode_string):
gain_mode = GainModes(setting) if gain_mode_string in {"dynamic", "forceswitchg1", "forceswitchg2"}:
if gain_mode in (GainModes.FIX_GAIN_1, GainModes.FIX_GAIN_2): return GainModes.ADAPTIVE_GAIN.name
return 1 elif gain_mode_string in {"fixg1", "fixg2"}:
return GainModes.FIXED_GAIN.name
else: else:
return 0 raise ValueError(f"Unknown gain mode {gain_mode_string}")
def old_settings_to_gain_setting(setting): def gain_setting_translator(setting):
gain_mode = GainModes(setting)
if gain_mode is GainModes.DYNAMIC_GAIN_HG0:
return 1
else:
return 0
def new_settings_to_gain_setting(setting):
if setting == "gain0": if setting == "gain0":
return 0 return GainSettings.LOW_CDS.name
elif setting == "highgain0": elif setting == "highgain0":
return 1 return GainSettings.HIGH_CDS.name
else: else:
raise ValueError(f"Unknown gain setting {setting}") raise ValueError(f"Unknown gain setting {setting}")
def new_gain_mode_to_gain_mode(gain_mode):
if gain_mode in {"dynamic", "forceswitchg1", "forceswitchg2"}:
return 0
elif gain_mode in {"fixg1", "fixg2"}:
return 1
else:
raise ValueError(f"Unknown gain_mode {gain_mode}")
class JungfrauCondition(base_condition.ConditionBase): class JungfrauCondition(base_condition.ConditionBase):
detectorFirmwareVersion = String(
displayedName="Firmware version",
assignment=Assignment.OPTIONAL,
accessMode=AccessMode.INITONLY,
defaultValue="new",
options=["old", "new"],
)
controlDeviceId = String( controlDeviceId = String(
displayedName="Control device ID", displayedName="Control device ID",
assignment=Assignment.MANDATORY, assignment=Assignment.MANDATORY,
...@@ -56,29 +32,17 @@ class JungfrauCondition(base_condition.ConditionBase): ...@@ -56,29 +32,17 @@ class JungfrauCondition(base_condition.ConditionBase):
@property @property
def keys_to_get(self): def keys_to_get(self):
key_map = [ return {
# cells: 1.0 or 16.0 self.controlDeviceId.value: [
("storageCells", "memoryCells", lambda n: n + 1), # cells: 1.0 or 16.0
( ("storageCells", "memoryCells", lambda n: n + 1),
"exposureTime", (
"integrationTime", "exposureTime",
lambda n: n * 1e6, "integrationTime",
), lambda n: n * 1e6,
] ),
if self.detectorFirmwareVersion.value == "old":
key_map += [
# note: control device parameter is a vector
("vHighVoltage", "biasVoltage", operator.itemgetter(0)),
# gain mode: omitted or 1.0
("settings", "gainMode", old_settings_to_gain_mode),
# gain setting: 0.0 or 1.0 (derived from gain mode on device)
("settings", "gainSetting", old_settings_to_gain_setting),
]
else:
key_map += [
("highVoltage", "biasVoltage", operator.itemgetter(0)), ("highVoltage", "biasVoltage", operator.itemgetter(0)),
("settings", "gainSetting", new_settings_to_gain_setting), ("settings", "gainSetting", gain_setting_translator),
("gainMode", "gainMode", new_gain_mode_to_gain_mode), ("gainMode", "gainMode", gain_mode_translator),
] ]
}
return {self.controlDeviceId.value: key_map}
...@@ -42,12 +42,13 @@ bad_pixel_constants = { ...@@ -42,12 +42,13 @@ bad_pixel_constants = {
# from pycalibration (TOOD: move to common shared lib) # from pycalibration (TOOD: move to common shared lib)
class GainModes(enum.Enum): class GainModes(enum.Enum):
DYNAMIC_GAIN = "dynamicgain" ADAPTIVE_GAIN = 0
DYNAMIC_GAIN_HG0 = "dynamichg0" FIXED_GAIN = 1
FIX_GAIN_1 = "fixgain1"
FIX_GAIN_2 = "fixgain2"
FORCE_SWITCH_HG1 = "forceswitchg1" class GainSettings(enum.Enum):
FORCE_SWITCH_HG2 = "forceswitchg2" LOW_CDS = 0
HIGH_CDS = 1
class CorrectionFlags(enum.IntFlag): class CorrectionFlags(enum.IntFlag):
...@@ -380,7 +381,7 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend): ...@@ -380,7 +381,7 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend):
.reconfigurable() .reconfigurable()
.commit(), .commit(),
DOUBLE_ELEMENT(schema) STRING_ELEMENT(schema)
.key("constantParameters.gainMode") .key("constantParameters.gainMode")
.displayedName("Gain mode") .displayedName("Gain mode")
.description( .description(
...@@ -390,16 +391,18 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend): ...@@ -390,16 +391,18 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend):
"for fixed gain (omitted otherwise)." "for fixed gain (omitted otherwise)."
) )
.assignmentOptional() .assignmentOptional()
.defaultValue(0) .defaultValue(GainModes.ADAPTIVE_GAIN.name)
.options(",".join(gain_mode.name for gain_mode in GainModes))
.reconfigurable() .reconfigurable()
.commit(), .commit(),
DOUBLE_ELEMENT(schema) STRING_ELEMENT(schema)
.key("constantParameters.gainSetting") .key("constantParameters.gainSetting")
.displayedName("Gain setting") .displayedName("Gain setting")
.description("See description of gainMode") .description("See description of gainMode")
.assignmentOptional() .assignmentOptional()
.defaultValue(0) .defaultValue(GainSettings.LOW_CDS.name)
.options(",".join(gain_setting.name for gain_setting in GainSettings))
.reconfigurable() .reconfigurable()
.commit(), .commit(),
) )
...@@ -421,10 +424,13 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend): ...@@ -421,10 +424,13 @@ class JungfrauCalcatFriend(base_calcat.BaseCalcatFriend):
res["Integration Time"] = self._get_param("integrationTime") res["Integration Time"] = self._get_param("integrationTime")
res["Sensor Temperature"] = self._get_param("sensorTemperature") res["Sensor Temperature"] = self._get_param("sensorTemperature")
if self._get_param("gainMode") != 0: if (
# NOTE: always include if CalCat is updated for this gain_mode := GainModes[self._get_param("gainMode")]
res["Gain mode"] = self._get_param("gainMode") ) is not GainModes.ADAPTIVE_GAIN:
res["Gain Setting"] = self._get_param("gainSetting") # NOTE: currently only including if parameter for CalCat is 1
# change if conditions are tidied up in the database
res["Gain mode"] = gain_mode.value
res["Gain Setting"] = GainSettings[self._get_param("gainSetting")].value
return res return res
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment