From 1030e5203b4f0e7abe59234251442b61a20a59ba Mon Sep 17 00:00:00 2001 From: Guenter Quast Date: Mon, 1 Dec 2025 19:21:52 +0100 Subject: [PATCH 1/7] Calibration for RC-110 --- src/radiacode/examples/show-spectrum.py | 47 ++++++++++++++++++++----- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 99456e3..9ec1613 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -52,12 +52,38 @@ mpl.use('Qt5Agg') plt.style.use('dark_background') -# some constants -rho_CsJ = 4.51 # density of CsJ in g/cm^3 -m_sensor = rho_CsJ * 1e-3 # Volume is 1 cm^3, mass in kg -keV2J = 1.602e-16 # conversion factor keV to Joule -depositedE2doserate = keV2J * 3600 * 1e6 / m_sensor # dose rate in µGy/h -depositedE2dose = keV2J * 1e6 / m_sensor # dose rate in µGy/h + +class Constants: + # some universal constants + rho_CsJ = 4.51 # density of CsJ in g/cm^3 + rho_GAGG = 6.63 # density of gadolinium aluminum gallium garnet + keV2J = 1.602e-16 # conversion factor keV to Joule + + +class device_constants: + """Conversion from counts to dose and dose rate""" + + def __init__(self, device_type): + if device_type == '101' or device_type == '102': + # CsJ, 1 cm³ + rho = Constants.rho_CsJ + Vol = 1e-3 # Volume is 1 cm^3 + elif device_type == '110': + # csJ, 2.567cm³ + rho = Constants.rho_CsJ + Vol = 2.567e-3 # Volume is 2.567 cm^3 + elif device_type == '103G': + # GAGG, 1 cm³ + rho = Constants.rho_GAAG + Vol = 1e-3 # Volume is 1 cm^3 + else: + print('!!! unknown sensor ', device_id, " - assuming 1cm³ CsJ") + rho = Constants.rho_CsJ + Vol = 1e-3 # Volume is 1 cm^3 + + self.m_sensor = rho * Vol # mass in kg + self.depositedE2doserate = Constants.keV2J * 3600 * 1e6 / self.m_sensor # dose rate in µGy/h + self.depositedE2dose = Constants.keV2J * 1e6 / self.m_sensor # dose rate in µGy/h class appColors: @@ -150,6 +176,8 @@ def on_mpl_window_closed(ax): # ------ rc = RadiaCode(bluetooth_mac=bluetooth_mac, serial_number=serial_number) serial = rc.serial_number() + device_type = serial.split('-')[1] + dev_const = device_constants(device_type) fw_version = rc.fw_version() status_flags = eval(rc.status().split(':')[1])[0] a0, a1, a2 = rc.energy_calib() @@ -167,6 +195,7 @@ def on_mpl_window_closed(ax): t_start = _t0 # start time of acquisition from device print(f'### Found device with serial number: {serial}') + print(f' Device {serial[:6]}') print(f' Firmware: {fw_version}') print(f' Status flags: 0x{status_flags:x}') print(f' Calibration coefficientes: a0={a0:.6f}, a1={a1:.6f}, a2={a2:.6f}') @@ -302,11 +331,11 @@ def on_mpl_window_closed(ax): rate_av = countsum / total_time hrates[icount % num_history_points] = rate depE = np.sum(counts_diff * Energies) # in keV - doserate = depE * depositedE2doserate / dt_wait + doserate = depE * dev_const.depositedE2doserate / dt_wait # dose in µGy/h = µJ/(kg*h) deposited_energy = np.sum(counts * Energies) # in keV - total_dose = deposited_energy * depositedE2dose - av_doserate = deposited_energy * depositedE2doserate / total_time + total_dose = deposited_energy * dev_const.depositedE2dose + av_doserate = deposited_energy * dev_const.depositedE2doserate / total_time countsum0 = countsum # update graphics From 9a74c47b237f8e3b56b22d356b61c63050d973f0 Mon Sep 17 00:00:00 2001 From: Guenter Quast Date: Tue, 2 Dec 2025 08:49:05 +0100 Subject: [PATCH 2/7] fix ruff errors --- src/radiacode/examples/show-spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 9ec1613..64b8434 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -77,7 +77,7 @@ def __init__(self, device_type): rho = Constants.rho_GAAG Vol = 1e-3 # Volume is 1 cm^3 else: - print('!!! unknown sensor ', device_id, " - assuming 1cm³ CsJ") + print('!!! unknown sensor ', device_type, ' - assuming 1cm³ CsJ') rho = Constants.rho_CsJ Vol = 1e-3 # Volume is 1 cm^3 From 067a34d6fe640c7abacbf9de72adb85e48a2b5c6 Mon Sep 17 00:00:00 2001 From: GuenterQuast Date: Wed, 3 Dec 2025 16:16:03 +0100 Subject: [PATCH 3/7] added device type to file output --- src/radiacode/examples/show-spectrum.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 64b8434..40cdc95 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -198,7 +198,7 @@ def on_mpl_window_closed(ax): print(f' Device {serial[:6]}') print(f' Firmware: {fw_version}') print(f' Status flags: 0x{status_flags:x}') - print(f' Calibration coefficientes: a0={a0:.6f}, a1={a1:.6f}, a2={a2:.6f}') + print(f' Calibration coefficients: a0={a0:.6f}, a1={a1:.6f}, a2={a2:.6f}') print(f' Number of spectrum channels: {NChannels}') print(f' Spectrum accumulation since {spectrum.duration}') @@ -391,6 +391,7 @@ def on_mpl_window_closed(ax): rates=rate_history[: icount + 1].tolist() if icount < NHistory else np.concatenate((rate_history[icount + 1 :], rate_history[: icount + 1])).tolist(), + device=device_type, ecal=[a0, a1, a2], spectrum=counts.tolist(), ) From a3e303f55946d9156a883f90132ec5bf23cb286a Mon Sep 17 00:00:00 2001 From: Guenter Quast Date: Wed, 3 Dec 2025 18:47:23 +0100 Subject: [PATCH 4/7] improved doc strings --- src/radiacode/examples/show-spectrum.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 40cdc95..55cd9e9 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -1,9 +1,9 @@ #! /usr/bin/env python3 """script show-spectrum.py -Reads spectrum data from Radiacode 102 device and displays and stores -the count rate history and the spectrum of deposited energies. -Data is stored in a file in human-readable yaml format. +Reads spectrum data from Radiacode 10x and 110 devices and displays +and stores the count rate history and the spectrum of deposited energies. +Data is saved in a file in human-readable yaml format. Calculates and shows in an animated display: @@ -18,13 +18,13 @@ Usage: show-spectrum.py [-h] [-b BLUETOOTH_MAC] [-r] [-R] [-q] [-i INTERVAL] [-f FILE] [-t TIME] [-H HISTORY] - Read and display gamma energy spectrum from RadioCode 102, - show differential and updated cumulative spectrum, - optionally store data to file in yaml format. + Read and display gamma energy spectrum from RadioCode 10x or 110, + show differential and updated cumulative spectrum, optionally + save data to file in yaml format. Options: -h, --help show this help message and exit - -b BLUETOOTH_MAC, --bluetooth-mac BLUETOOTH_MAC bluetooth MAC address of device + -b BLUETOOTH_MAC, --bluetooth-mac BLUETOOTH_MAC Bluetooth MAC address of device -s SERIAL_NUMBER, --serial-number SERIAL_NUMBER serial number of device -r, --restart restart spectrum accumulation -R, --Reset reset spectrum stored in device @@ -134,9 +134,9 @@ def on_mpl_window_closed(ax): # parse command line arguments # ------ parser = argparse.ArgumentParser( - description='Read and display gamma energy spectrum from RadioCode 102, ' + description='Read and display gamma energy spectrum from RadioCode 10x or 110, ' + 'show differential and updated cumulative spectrum, ' - + 'optionally store data to file in yaml format.' + + 'and optionally save data to file in yaml format.' ) parser.add_argument('-b', '--bluetooth-mac', type=str, required=False, help='bluetooth MAC address of device') parser.add_argument('-s', '--serial-number', type=str, required=False, help='serial number of device') @@ -373,7 +373,7 @@ def on_mpl_window_closed(ax): end='\r', ) itoggle = itoggle + 1 if itoggle < 3 else 0 - # wait for corrected wait interval) + # wait for corrected wait interval fig.canvas.start_event_loop(max(0.9 * dt_wait, dt_wait * (icount + 2) - (time.time() - t_start))) # --> end while true From 9e3d45a74258b4d76ff3b77e9e7757aafd3faa52 Mon Sep 17 00:00:00 2001 From: Guenter Quast Date: Thu, 4 Dec 2025 08:49:03 +0100 Subject: [PATCH 5/7] correct crystal volume for RC-110 --- src/radiacode/examples/show-spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 55cd9e9..a884bbf 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -71,7 +71,7 @@ def __init__(self, device_type): elif device_type == '110': # csJ, 2.567cm³ rho = Constants.rho_CsJ - Vol = 2.567e-3 # Volume is 2.567 cm^3 + Vol = 2.74e-3 # Volume is 2.74 cm^3 elif device_type == '103G': # GAGG, 1 cm³ rho = Constants.rho_GAAG From 985e590dacb78a507e199cb118b60e7707be1d76 Mon Sep 17 00:00:00 2001 From: GuenterQuast Date: Fri, 5 Dec 2025 14:25:40 +0100 Subject: [PATCH 6/7] added RC-103 --- src/radiacode/examples/show-spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index a884bbf..6c4feba 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -64,7 +64,7 @@ class device_constants: """Conversion from counts to dose and dose rate""" def __init__(self, device_type): - if device_type == '101' or device_type == '102': + if device_type == '101' or device_type == '102' or device_type == '103': # CsJ, 1 cm³ rho = Constants.rho_CsJ Vol = 1e-3 # Volume is 1 cm^3 From 524c9ac921391b5cd11d20f0aa9c26fb19b0c006 Mon Sep 17 00:00:00 2001 From: Guenter Quast Date: Fri, 12 Dec 2025 20:34:33 +0100 Subject: [PATCH 7/7] constants in device_constants --- src/radiacode/examples/show-spectrum.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/radiacode/examples/show-spectrum.py b/src/radiacode/examples/show-spectrum.py index 6c4feba..5553b8a 100755 --- a/src/radiacode/examples/show-spectrum.py +++ b/src/radiacode/examples/show-spectrum.py @@ -53,37 +53,35 @@ plt.style.use('dark_background') -class Constants: +class device_constants: + """Conversion from counts to dose and dose rate""" + # some universal constants rho_CsJ = 4.51 # density of CsJ in g/cm^3 rho_GAGG = 6.63 # density of gadolinium aluminum gallium garnet keV2J = 1.602e-16 # conversion factor keV to Joule - -class device_constants: - """Conversion from counts to dose and dose rate""" - def __init__(self, device_type): if device_type == '101' or device_type == '102' or device_type == '103': # CsJ, 1 cm³ - rho = Constants.rho_CsJ + rho = device_constants.rho_CsJ Vol = 1e-3 # Volume is 1 cm^3 elif device_type == '110': # csJ, 2.567cm³ - rho = Constants.rho_CsJ + rho = device_constants.rho_CsJ Vol = 2.74e-3 # Volume is 2.74 cm^3 elif device_type == '103G': # GAGG, 1 cm³ - rho = Constants.rho_GAAG + rho = device_constants.rho_GAAG Vol = 1e-3 # Volume is 1 cm^3 else: print('!!! unknown sensor ', device_type, ' - assuming 1cm³ CsJ') - rho = Constants.rho_CsJ + rho = device_constants.rho_CsJ Vol = 1e-3 # Volume is 1 cm^3 self.m_sensor = rho * Vol # mass in kg - self.depositedE2doserate = Constants.keV2J * 3600 * 1e6 / self.m_sensor # dose rate in µGy/h - self.depositedE2dose = Constants.keV2J * 1e6 / self.m_sensor # dose rate in µGy/h + self.depositedE2doserate = device_constants.keV2J * 3600 * 1e6 / self.m_sensor # dose rate in µGy/h + self.depositedE2dose = device_constants.keV2J * 1e6 / self.m_sensor # dose rate in µGy/h class appColors: