|
|
|
|
|
|
|
""" |
|
Verification code using Sarno any spectrum for a breast with a diamter 16 cm, radius of 2xradius, and glandularity of 50%. Using the defined keV, I, and coefficients the normalized glandular dose can be computed. The correct value for these parameters |
|
is 0.03614995451146596. The mean glandular dose was computed using the parameters of 300 projections, 0.5 mAs, and an input air kerma of 5 mR. |
|
|
|
""" |
|
|
|
import sys |
|
import numpy as np |
|
from dose_equations import ( |
|
Sarno_mono_dgn, |
|
Sarno_poly_dgn, |
|
sarno_dgnct, |
|
Hernandez_hetero_mono_dgn, |
|
exposure_per_fluence, |
|
Sechopoulos_poly_dgn, |
|
) |
|
|
|
|
|
def exposure_per_fluence(E): |
|
exposure = np.zeros(len(E)) |
|
for i in range(len(exposure)): |
|
keV = E[i] |
|
temp = ( |
|
( |
|
( |
|
-5.023290717769674e-6 |
|
+ 1.810595449064631e-7 |
|
+ np.sqrt(keV) |
|
+ np.log(keV) |
|
+ 0.008838658459816926 / keV**2 |
|
) |
|
** (10**-3) |
|
) |
|
/ 1000 |
|
* 0.1145 |
|
) |
|
exposure[i] = temp |
|
return exposure |
|
|
|
|
|
def dgn_calculate(a, b, c, d, e, f, g, h, keVs): |
|
dgn = np.zeros(len(keVs)) |
|
for i in range(len(keVs)): |
|
E = keVs[i] |
|
temp = ( |
|
a * 10 ** (-14) * E**8 |
|
+ b * 10 ** (-12) * E**7 |
|
+ c * 10 ** (-10) * E**6 |
|
+ d * 10 ** (-8) * E**5 |
|
+ e * 10 ** (-6) * E**4 |
|
+ f * 10 ** (-4) * E**3 |
|
+ g * 10 ** (-3) * E**2 |
|
+ h * 10 ** (-2) * E |
|
) |
|
dgn[i] = temp |
|
return dgn |
|
|
|
|
|
def pDgN_calculate_denominator(I, exposure): |
|
total = I * exposure |
|
pDgN_denom = np.sum(total) |
|
|
|
return pDgN_denom |
|
|
|
|
|
def pDgN_calculate_numerator(I, dgn, exposure): |
|
total = I * exposure * dgn |
|
pDgN_num = sum(total) |
|
return pDgN_num |
|
|
|
|
|
def calculate_pDgNct(*values): |
|
keV = values[2] |
|
I = values[3] |
|
psiE = np.array(list(map(exposure_per_fluence, keV))) |
|
|
|
if values[0] == "Sarno Koning": |
|
variables = values[1] |
|
DgNctE = np.array( |
|
list( |
|
map( |
|
sarno_dgnct, |
|
variables[:, 0], |
|
variables[:, 1], |
|
variables[:, 2], |
|
variables[:, 3], |
|
variables[:, 4], |
|
variables[:, 5], |
|
variables[:, 6], |
|
variables[:, 7], |
|
keV, |
|
) |
|
) |
|
) |
|
pDgN = np.sum(I * psiE * DgNctE) / np.sum(I * psiE) |
|
elif values[0] == "Hernandez": |
|
DgN_list = np.array(values[1]) |
|
pDgN = np.sum(I * psiE * DgN_list) / (np.sum(I * psiE)) |
|
|
|
return pDgN |
|
|
|
|
|
|
|
def calculate_mgd( |
|
air_KERMA, dgn, number_of_projections, mAs, air_KERMA_input_units, output_units |
|
): |
|
|
|
if air_KERMA_input_units != "mGy": |
|
if air_KERMA_input_units == "mrad": |
|
air_KERMA = air_KERMA * 0.01 |
|
elif air_KERMA_input_units == "R": |
|
air_KERMA = air_KERMA * 8.77 |
|
elif air_KERMA_input_units == "mR": |
|
air_KERMA = air_KERMA * 0.00877 |
|
|
|
|
|
mgd = air_KERMA * dgn * float(number_of_projections) * mAs |
|
|
|
|
|
if output_units == "mrad": |
|
mgd = mgd * 100 |
|
|
|
return mgd |
|
|
|
|
|
a = -0.41324119391158 |
|
b = 4.88540710576677 |
|
c = -13.0460380815292 |
|
d = 15.3913804609064 |
|
e = -9.19621868949206 |
|
f = 2.66123817129083 |
|
g = -2.67974610124986 |
|
h = 0.883219836298924 |
|
|
|
air_KERMA = 5.0 |
|
number_of_projections = 300 |
|
mAs = 0.5 |
|
|
|
keV = np.array([10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14]) |
|
I = np.array( |
|
[ |
|
6.20275e2, |
|
2.26229e2, |
|
5.25667e2, |
|
2.39324e3, |
|
1.45979e3, |
|
2.17293e3, |
|
3.36611e3, |
|
4.89394e3, |
|
6.61405e3, |
|
] |
|
) |
|
|
|
exposure = exposure_per_fluence(keV) |
|
dgn = dgn_calculate(a, b, c, d, e, f, g, h, keV) |
|
|
|
pDgN_num = pDgN_calculate_numerator(I, dgn, exposure) |
|
pDgN_denom = pDgN_calculate_denominator(I, exposure) |
|
pDgN = pDgN_num / pDgN_denom |
|
|
|
print("pDgN =", pDgN) |
|
|
|
mgd = calculate_mgd(air_KERMA, pDgN, number_of_projections, mAs, "mR", "mGy") |
|
|
|
print("mgd =", mgd) |
|
|