diff --git a/notebooks/AGIPD/AGIPD_Correct_and_Verify.ipynb b/notebooks/AGIPD/AGIPD_Correct_and_Verify.ipynb index 3fdf35bc8046786557ac1830639e078f10be5c77..b3043673fe3100c0c78d70bb069a7d5cd988849c 100644 --- a/notebooks/AGIPD/AGIPD_Correct_and_Verify.ipynb +++ b/notebooks/AGIPD/AGIPD_Correct_and_Verify.ipynb @@ -140,6 +140,7 @@ " AgipdCorrections,\n", " get_acq_rate,\n", " get_gain_mode,\n", + " get_integration_time,\n", " get_gain_setting,\n", " get_num_cells,\n", ")\n", @@ -372,7 +373,10 @@ " gain_setting = 0\n", "\n", "# Evaluate gain mode (operation mode)\n", - "gain_mode = get_gain_mode(control_fn, h5path_ctrl)" + "gain_mode = get_gain_mode(control_fn, h5path_ctrl)\n", + "\n", + "# Evaluate integration time\n", + "integration_time = get_integration_time(control_fn, h5path_ctrl)" ] }, { @@ -388,6 +392,7 @@ "print(f\"• Acquisition rate: {acq_rate}\")\n", "print(f\"• Gain setting: {gain_setting}\")\n", "print(f\"• Gain mode: {gain_mode.name}\")\n", + "print(f\"• Integration time: {integration_time}\")\n", "print(f\"• Photon Energy: {photon_energy}\")" ] }, @@ -485,6 +490,7 @@ " photon_energy,\n", " gain_setting,\n", " acq_rate,\n", + " integration_time,\n", " mod,\n", " False,\n", " )\n", diff --git a/notebooks/AGIPD/AGIPD_Retrieve_Constants_Precorrection.ipynb b/notebooks/AGIPD/AGIPD_Retrieve_Constants_Precorrection.ipynb index c081527a552c1356823162f228bae82e571f6117..f6b3b4751c1b2a530b7892e7344a3c0c2e8cf3e6 100644 --- a/notebooks/AGIPD/AGIPD_Retrieve_Constants_Precorrection.ipynb +++ b/notebooks/AGIPD/AGIPD_Retrieve_Constants_Precorrection.ipynb @@ -161,6 +161,9 @@ "\n", "# Evaluate gain mode (operation mode)\n", "gain_mode = agipdlib.get_gain_mode(control_fn, h5path_ctrl)\n", + "\n", + "# Evaluate integration time\n", + "integration_time = agipblib.get_integration_time(control_fn, h5path_ctrl)\n", " \n", "print(f\"Gain setting: {gain_setting}\")\n", "print(f\"Gain mode: {gain_mode.name}\")\n", @@ -254,6 +257,7 @@ " gain_mode=gain_mode,\n", " beam_energy=None,\n", " only_dark=only_dark,\n", + " integration_time=integration_time\n", " )\n", "\n", " # Retrieve multiple constants through an input dictionary\n", @@ -384,6 +388,7 @@ " print(f\"• Acquisition rate: {acq_rate}\")\n", " print(f\"• Gain mode: {gain_mode.name}\")\n", " print(f\"• Gain setting: {gain_setting}\")\n", + " print(f\"• Integration time: {integration_time}\")\n", " print(f\"• Photon Energy: {photon_energy}\")\n", " print(\"Constant metadata is saved under \\\"retrieved-constants\\\" in calibration_metadata.yml\\n\")" ] diff --git a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb index 7661d99d8300ce7d9a9a02f211e7d91bc25ca983..595657407157648265d144b91ba0c2c437b82e2d 100644 --- a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb +++ b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb @@ -101,6 +101,7 @@ " get_bias_voltage,\n", " get_gain_mode,\n", " get_gain_setting,\n", + " get_integration_time,\n", " get_num_cells,\n", ")\n", "from cal_tools.enums import AgipdGainMode, BadPixels\n", @@ -185,6 +186,8 @@ "else:\n", " print(f'Something is clearly wrong; slow data indicates gain modes {run_gain_modes}')\n", "\n", + "integration_time = get_integration_time(fn, h5path_ctrl)\n", + "\n", "print(f\"Detector in use is {karabo_id}\")\n", "print(f\"Instrument {instrument}\")\n", "print(f\"Detector instance {dinstance}\")" @@ -254,6 +257,7 @@ "print(f\"Output: {out_folder}\")\n", "print(f\"Bias voltage: {bias_voltage}V\")\n", "print(f\"Gain setting: {gain_setting}\")\n", + "print(f\"Integration time: {integration_time}\")\n", "print(f\"Operation mode is {'fixed' if fixed_gain_mode else 'adaptive'} gain mode\")" ] }, @@ -589,7 +593,8 @@ " bias_voltage=bias_voltage,\n", " acquisition_rate=acq_rate,\n", " gain_setting=gain_setting,\n", - " gain_mode=fixed_gain_mode\n", + " gain_mode=fixed_gain_mode,\n", + " integration_time=integration_time\n", ")" ] }, @@ -645,7 +650,7 @@ " print(\"Constants parameter conditions are:\\n\")\n", " print(f\"• memory_cells: {max_cells}\\n• bias_voltage: {bias_voltage}\\n\"\n", " f\"• acquisition_rate: {acq_rate}\\n• gain_setting: {gain_setting}\\n\"\n", - " f\"• gain_mode: {fixed_gain_mode}\\n\"\n", + " f\"• gain_mode: {fixed_gain_mode}\\n• integration_time: {integration_time}\\n\"\n", " f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")" ] }, diff --git a/notebooks/AGIPD/Characterize_AGIPD_Gain_FlatFields_Summary.ipynb b/notebooks/AGIPD/Characterize_AGIPD_Gain_FlatFields_Summary.ipynb index f81a26a0df06649f5e847f3fe47d93647e0c2fb0..51f0de6dc64213e5058aeabc3992d39e51c16cf0 100644 --- a/notebooks/AGIPD/Characterize_AGIPD_Gain_FlatFields_Summary.ipynb +++ b/notebooks/AGIPD/Characterize_AGIPD_Gain_FlatFields_Summary.ipynb @@ -83,6 +83,7 @@ " get_acq_rate,\n", " get_bias_voltage,\n", " get_gain_setting,\n", + " get_integration_time,\n", " get_num_cells,\n", ")\n", "from cal_tools.agipdutils_ff import (\n", @@ -161,6 +162,9 @@ " print(e)\n", " print(\"Set gain settion to 0\")\n", " gain_setting = 0\n", + "\n", + "# Evaluate integration time\n", + "integration_time = get_integration_time(filename, h5path_ctrl)\n", " \n", "# Evaluate detector instance for mapping\n", "instrument = karabo_id.split(\"_\")[0]\n", @@ -171,7 +175,8 @@ "\n", "print(f\"Using {creation_time} as creation time\")\n", "print(f\"Operating conditions are:\\n• Bias voltage: {bias_voltage}\\n• Memory cells: {mem_cells}\\n\"\n", - " f\"• Acquisition rate: {acq_rate}\\n• Gain setting: {gain_setting}\\n• Photon Energy: {photon_energy}\\n\")" + " f\"• Acquisition rate: {acq_rate}\\n• Gain setting: {gain_setting}\\n• Integration time: {integration_time}\\n\"\n", + " f\"• Photon Energy: {photon_energy}\\n\")" ] }, { @@ -265,7 +270,8 @@ "# set the operating condition\n", "condition = Conditions.Illuminated.AGIPD(mem_cells, bias_voltage, 9.2,\n", " pixels_x=512, pixels_y=128, beam_energy=None,\n", - " acquisition_rate=acq_rate, gain_setting=gain_setting)\n", + " acquisition_rate=acq_rate, gain_setting=gain_setting,\n", + " integration_time=integration_time)\n", "\n", "# Retrieve a list of all modules corresponding to processed karabo_das\n", "db_modules = get_pdu_from_db(karabo_id, karabo_da, Constants.AGIPD.SlopesFF(),\n", diff --git a/notebooks/AGIPD/Chracterize_AGIPD_Gain_PC_NBC.ipynb b/notebooks/AGIPD/Chracterize_AGIPD_Gain_PC_NBC.ipynb index 8f7ffe5de01203fd761ee89c91d9e6f5e6042432..14e5d57474c9806b8c3c2c416daa7fe5bfc1ab35 100644 --- a/notebooks/AGIPD/Chracterize_AGIPD_Gain_PC_NBC.ipynb +++ b/notebooks/AGIPD/Chracterize_AGIPD_Gain_PC_NBC.ipynb @@ -96,7 +96,9 @@ "%matplotlib inline\n", "\n", "import XFELDetAna.xfelpyanatools as xana\n", - "from cal_tools.agipdlib import get_acq_rate, get_gain_setting, get_num_cells\n", + "from cal_tools.agipdlib import (\n", + " get_acq_rate, get_gain_setting, get_integration_time, get_num_cells\n", + ")\n", "from cal_tools.enums import BadPixels\n", "from cal_tools.plotting import plot_badpix_3d, show_overview\n", "from cal_tools.tools import (\n", @@ -239,7 +241,10 @@ " print(\"Gain setting is not found in the control information\")\n", " print(\"Data will not be processed\")\n", " sequences = []\n", - "print(f\"Gain setting: {gain_setting}\")" + "print(f\"Gain setting: {gain_setting}\")\n", + "\n", + "integration_time = get_integration_time(control_fname, h5path_ctrl)\n", + "print(f\"Integration time: {integration_time}\")" ] }, { @@ -584,7 +589,8 @@ " memory_cells=mem_cells,\n", " bias_voltage=bias_voltage,\n", " acquisition_rate=acq_rate,\n", - " gain_setting=gain_setting),\n", + " gain_setting=gain_setting,\n", + " integration_time=integration_time),\n", " np.zeros((128, 512, mem_cells, 3)),\n", " cal_db_interface,\n", " creation_time=creation_time)\n", @@ -596,7 +602,8 @@ " memory_cells=mem_cells,\n", " bias_voltage=bias_voltage,\n", " acquisition_rate=acq_rate,\n", - " gain_setting=gain_setting),\n", + " gain_setting=gain_setting,\n", + " integration_time=integration_time),\n", " np.zeros((128, 512, mem_cells, 3)),\n", " cal_db_interface, creation_time=creation_time)\n", " noises[mod] = np.array(noise.data)\n", @@ -607,7 +614,8 @@ " memory_cells=mem_cells,\n", " bias_voltage=bias_voltage,\n", " acquisition_rate=acq_rate,\n", - " gain_setting=gain_setting),\n", + " gain_setting=gain_setting,\n", + " integration_time=integration_time),\n", " np.zeros((128, 512, mem_cells, 3)),\n", " cal_db_interface, creation_time=creation_time)\n", " thresholds[mod] = np.array(threshold.data)" @@ -1482,6 +1490,7 @@ "print(\"Constants parameter conditions are:\\n\")\n", "print(f\"• memory_cells: {maxcells}\\n• bias_voltage: {bias_voltage}\\n\"\n", " f\"• acquisition_rate: {acq_rate}\\n• gain_setting: {gain_setting}\\n\"\n", + " f\"• integration_time: {integration_time}\\n\"\n", " f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")" ] }, diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py index 6c2142442f36ab3fec86f97888fec7bc11bd3166..7e3f3353cd2923033d3dcbf3a672aeaafd83d3e4 100644 --- a/src/cal_tools/agipdlib.py +++ b/src/cal_tools/agipdlib.py @@ -165,6 +165,24 @@ def get_bias_voltage(fname: str, karabo_id_control: str, return fin[voltage_path][0] +def get_integration_time(fname: str, h5path_ctrl: str) -> int: + """Read integration time from the FPGA device. + + The integration time is specified as an integer number of clock + cylces each spanning ~9ns. The default (and legacy) value is 12. + + :param fname: path to file with control information + :param h5path_ctrl: path to control information inside the file + :return: integration time + """ + h5path_run = h5path_ctrl.replace('CONTROL/', 'RUN/', 1) + h5path_gainmode = f'{h5path_run}/integrationTime/value' + with h5py.File(fname, 'r') as fd: + if h5path_gainmode in fd: + return int(fd[h5path_gainmode][0]) + return 12 + + class AgipdCorrections: def __init__( @@ -1311,8 +1329,8 @@ class AgipdCorrections: creation_time: 'datetime.datetime', memory_cells: float, bias_voltage: int, photon_energy: float, gain_setting: float, - acquisition_rate: float, module_idx: int, - only_dark: bool = False): + acquisition_rate: float, integration_time: int, + module_idx: int, only_dark: bool = False): """ Initialize calibration constants from the calibration database :param karabo_id: karabo identifier @@ -1324,6 +1342,7 @@ class AgipdCorrections: :param photon_energy: photon energy used for CCV conditions :param gain_setting: gain setting used for CCV conditions :param acquisition_rate: acquistion rate used for CCV conditions + :param integration_time: integration time used for CCV conditions :param module_idx: module index to save retrieved CCV in sharedmem :param only_dark: load only dark image derived constants. This implies that a `calfile` is used to load the remaining @@ -1377,6 +1396,7 @@ class AgipdCorrections: photon_energy, beam_energy=None, only_dark=only_dark, + integration_time=integration_time ) cons_data, when = self.retrieve_constant_and_time( diff --git a/src/cal_tools/agipdutils.py b/src/cal_tools/agipdutils.py index 8cf5b4f375d36437f9ccd4f1332d31f5a52fdd9a..e7cbd4667317e0a543ae865ed7e6d8ecaf33d1c6 100644 --- a/src/cal_tools/agipdutils.py +++ b/src/cal_tools/agipdutils.py @@ -20,6 +20,7 @@ def assemble_constant_dict( beam_energy=None, only_dark=False, gain_mode=AgipdGainMode.ADAPTIVE_GAIN, + integration_time=None ): """ Assemble a dictionary with the iCalibrationDB constant names and @@ -34,6 +35,7 @@ def assemble_constant_dict( :param gain_setting: (Float) Gain setting :param acquisition_rate: (Float) Acquisition rate :param photon_energy: (Float) Photon energy + :param integration_time: (Float) Integration time :param beam_energy: (Float) Beam Energy :param only_dark: (Bool) Indicating a retrieval for dark constants only from db :param gain_mode: Operation mode of the detector (default to adaptive gain) @@ -49,6 +51,7 @@ def assemble_constant_dict( "acquisition_rate": acquisition_rate, "gain_setting": gain_setting, "gain_mode": gain_mode, + "integration_time": integration_time, "pixels_x": 512, "pixels_y": 128, },