Diamond detector#

[1]:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from libra_toolbox.neutron_detection.diamond.process_data import DataProcessor

Fabricate data#

[2]:
total_time_s = 200  # s
total_time_ps = total_time_s * 1e12  # s to ps

# peak 1
nb_counts_peak1 = int(2e4)
size_peak1 = nb_counts_peak1
time_values_out_peak1 = np.random.rand(size_peak1) * total_time_ps
mean_energy_peak1 = 4e6
std_energy_peak1 = 0.5e6
energy_values_peak1 = np.random.normal(mean_energy_peak1, std_energy_peak1, size_peak1)

# peak 2
nb_counts_peak2 = int(7e4)
size_peak2 = nb_counts_peak2
time_values_out_peak2 = np.random.rand(size_peak2) * total_time_ps
mean_energy_peak2 = 14e6
std_energy_peak2 = 1e6

energy_values_peak2 = np.random.normal(mean_energy_peak2, std_energy_peak2, size_peak2)

time_values_out = np.concatenate((time_values_out_peak1, time_values_out_peak2))
energy_values = np.concatenate((energy_values_peak1, energy_values_peak2))

# remove values where t between 100 and 150 s
mask = (time_values_out > 100e12) & (time_values_out < 150e12)
time_values_out = time_values_out[~mask]
energy_values = energy_values[~mask]

# write data to files
# make data directory if it doesn't exist
import os

if not os.path.exists("data"):
    os.makedirs("data")

np.savetxt(
    "data/data.csv",
    np.column_stack((time_values_out, energy_values)),
    delimiter=",",
)

Read and process data#

[3]:
data_proc = DataProcessor()
data_proc.add_file("data/data.csv", time_column=0, energy_column=1, delimiter=",")
Added file: data/data.csv containing 67502 events
[4]:
res_avg = data_proc.get_avg_rate(0, 100)

Plot results#

[5]:
plt.hist(data_proc.energy_values, bins=100, alpha=0.5)
plt.xlabel("Energy channel")
plt.ylabel("Counts")
plt.show()
../_images/examples_diamond_detector_8_0.png
[6]:
rates, bins = data_proc.get_count_rate(bin_time=2)

plt.plot(
    bins[:-1],
    rates,
    label="All counts",
)

rates, bins = data_proc.get_count_rate(
    bin_time=2,
    energy_window=(
        mean_energy_peak1 - std_energy_peak1 * 2,
        mean_energy_peak1 + std_energy_peak1 * 2,
    ),
)

plt.plot(
    bins[:-1],
    rates,
    label="peak 1",
)

rates, bins = data_proc.get_count_rate(
    bin_time=2,
    energy_window=(
        mean_energy_peak2 - std_energy_peak2 * 2,
        mean_energy_peak2 + std_energy_peak2 * 2,
    ),
)

plt.plot(
    bins[:-1],
    rates,
    label="peak 2",
)

avg_count_rate, error = data_proc.get_avg_rate(0, 100)
plt.hlines(avg_count_rate, 0, 100, color="black", linestyle="--")

print(f"Average count rate: {avg_count_rate:.2f} +/- {error:.2f} count/s ")

plt.legend()
plt.xlabel("Time (s)")
plt.ylabel("Count rate (count/s)")
plt.show()
Average count rate: 450.19 +/- 2.12 count/s
../_images/examples_diamond_detector_9_1.png