TDCRPy 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of TDCRPy might be problematic. Click here for more details.

@@ -0,0 +1,305 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Fri Apr 14 20:43:26 2023
4
+
5
+ @author: romain.coulon
6
+ """
7
+ import matplotlib.pyplot as plt
8
+ import numpy as np
9
+ import scipy.signal as sg
10
+ import scipy.optimize as opt
11
+ import sys
12
+ sys.path.insert(1, 'G:\Python_modules\BIPM_RI_PyModules')
13
+ import TDCRcalculation as dtc
14
+
15
+
16
+ def readEff(Rad, kB, SDT):
17
+ file = open("G:\Python_modules\TDCRPy\TDCRPy\Code\\EfficiencyCurves/"+''.join(Rad)+"/Eff"+SDT+"_"+''.join(Rad)+'_[1]_'+str(kB)+".txt","r")
18
+ L=[]
19
+ p=[]
20
+ up=[]
21
+ for row in file:
22
+ H=row.split(" ")
23
+ L.append(float(H[0]))
24
+ p.append(float(H[1]))
25
+ up.append(float(H[2]))
26
+ return L, p, up
27
+
28
+ def readProfil(Rad,kB,SDT):
29
+ Lv, pSv, upSv = readEff(Rad, kB, SDT)
30
+ pSv = sg.savgol_filter(pSv, 7, 2)
31
+ return Lv, np.asarray(pSv), upSv
32
+
33
+ def res(L, TD, Lv, pDv, pTv):
34
+ return (np.interp(L, Lv, pTv)/np.interp(L, Lv, pDv)-TD)**2
35
+
36
+ def effTDCR(TD, Rad, kB):
37
+ kBv = [0.8e-5, 0.9e-5, 1.0e-5, 1.1e-5, 1.2e-5]
38
+ Lv0 = readProfil(Rad,0.8e-5,"D")[0]
39
+ pDv=[]; pTv=[]; Lv1=[]; effD1=[]; effT1=[]
40
+ for i in kBv:
41
+ pDv.append(readProfil(Rad,i,"D")[1])
42
+ pTv.append(readProfil(Rad,i,"T")[1])
43
+ Lv1.append(opt.minimize_scalar(res, args=(TD, Lv0, pDv[-1], pTv[-1]), method='golden').x)
44
+ effD1.append(np.interp(Lv1[-1], Lv0, pDv[-1]))
45
+ effT1.append(np.interp(Lv1[-1], Lv0, pTv[-1]))
46
+ L = np.interp(kB, kBv, Lv1)
47
+ effD = np.interp(kB, kBv, effD1)
48
+ effT = np.interp(kB, kBv, effT1)
49
+
50
+ # plt.figure("eff_D = f(kB)")
51
+ # plt.clf()
52
+ # plt.title(' ')
53
+ # plt.plot(kBv, effD1,'-b')
54
+ # plt.plot(kB, effD, 'or')
55
+ # plt.xlabel(r"$kB$ /(cm keV$^{-1}$)", fontsize = 14)
56
+ # plt.ylabel(r"$\epsilon_D$", fontsize = 14)
57
+ # plt.legend(fontsize = 12)
58
+ # # plt.close()
59
+
60
+ # plt.figure("eff_T = f(kB)")
61
+ # plt.clf()
62
+ # plt.title(' ')
63
+ # plt.plot(kBv, effT1,'-b')
64
+ # plt.plot(kB, effT, 'or')
65
+ # plt.xlabel(r"$kB$ /(cm keV$^{-1}$)", fontsize = 14)
66
+ # plt.ylabel(r"$\epsilon_T$", fontsize = 14)
67
+ # plt.legend(fontsize = 12)
68
+ # # plt.close()
69
+
70
+ # plt.figure("L = f(kB)")
71
+ # plt.clf()
72
+ # plt.title(' ')
73
+ # plt.plot(kBv, Lv1,'-b')
74
+ # plt.plot(kB, L, 'or')
75
+ # plt.xlabel(r"$kB$ /(cm keV$^{-1}$)", fontsize = 14)
76
+ # plt.ylabel(r"$L$ /keV$^{-1}$", fontsize = 14)
77
+ # plt.legend(fontsize = 12)
78
+ # # plt.close()
79
+
80
+ return L, effD, effT
81
+
82
+ def plotEffProfil(Rad,kB):
83
+ kBv = [0.8e-5, 0.9e-5, 1.0e-5, 1.1e-5, 1.2e-5]
84
+ Lv0 = readProfil(Rad,0.8e-5,"D")[0]
85
+ pDv=[]; pTv=[]; pSv=[]
86
+ for i in kBv:
87
+ pDv.append(readProfil(Rad,i,"D")[1])
88
+ pTv.append(readProfil(Rad,i,"T")[1])
89
+ pSv.append(readProfil(Rad,i,"S")[1])
90
+ effS=[]; effD=[]; effT=[]
91
+ print("S",np.asarray(pSv)[:,0])
92
+ for i in range(len(Lv0)):
93
+ effS.append(np.interp(kB, kBv, np.asarray(pSv)[:,i]))
94
+ effD.append(np.interp(kB, kBv, np.asarray(pDv)[:,i]))
95
+ effT.append(np.interp(kB, kBv, np.asarray(pTv)[:,i]))
96
+ tdcr = np.asarray(effT)/np.asarray(effD)
97
+
98
+ plt.figure("Efficiency curve eff = f(L)")
99
+ plt.clf()
100
+ plt.title(' ')
101
+ plt.plot(Lv0, effS,'-b', label = r"$\epsilon_{S}$, $kB$ = "+str(kB)+" cm/keV")
102
+ plt.plot(Lv0, effD,'-k', label = r"$\epsilon_{D}$, $kB$ = "+str(kB)+" cm/keV")
103
+ plt.plot(Lv0, effT,'-r', label = r"$\epsilon_{T}$, $kB$ = "+str(kB)+" cm/keV")
104
+ plt.xscale("log")
105
+ plt.xlabel(r"$L$ /keV$^{-1}$", fontsize = 14)
106
+ plt.ylabel(r"$\epsilon$", fontsize = 14)
107
+ plt.legend(fontsize = 12)
108
+ # plt.close()
109
+
110
+ plt.figure("Efficiency curve eff = f(TDCR)")
111
+ plt.clf()
112
+ plt.title(' ')
113
+ plt.plot(tdcr, effS,'-b', label = r"$\epsilon_{S}$, $kB$ = "+str(kB)+" cm/keV")
114
+ plt.plot(tdcr, effD,'-k', label = r"$\epsilon_{D}$, $kB$ = "+str(kB)+" cm/keV")
115
+ plt.plot(tdcr, effT,'-r', label = r"$\epsilon_{T}$, $kB$ = "+str(kB)+" cm/keV")
116
+ # plt.xscale("log")
117
+ plt.xlabel(r"$\epsilon_T/\epsilon_D$", fontsize = 14)
118
+ plt.ylabel(r"$\epsilon$", fontsize = 14)
119
+ # bbox_inches = "tight", format = "png", dpi = 500
120
+ plt.legend(fontsize = 12)
121
+ # plt.close()
122
+
123
+
124
+ def plotEffProfilkB(Rad,SDT): # plot the fitted efficiecny curves for a range of kB
125
+ kBv = [0.8e-5, 0.9e-5, 1.0e-5, 1.1e-5, 1.2e-5] # kB vector
126
+ plt.figure("Efficiency curve eff = f(TDCR)")
127
+ plt.clf()
128
+ plt.title(' ')
129
+ for i in kBv: # loop in the kB vector
130
+ pDv = readProfil(Rad,i,"D")[1] # probability vector of events
131
+ pTv = readProfil(Rad,i,"T")[1] # probability vector of triple coincidence events
132
+ pSv = readProfil(Rad,i,"S")[1] # probability vector of single events
133
+ tdcr = np.asarray(pTv)/np.asarray(pDv) # tdcr vector
134
+ if SDT == "S":
135
+ plt.plot(tdcr, pSv, label = r"$kB$ = "+str(i)+" cm/keV")
136
+ plt.ylabel(r"$\epsilon_S$", fontsize = 14)
137
+ if SDT == "D":
138
+ plt.plot(tdcr, pDv, label = r"$kB$ = "+str(i)+" cm/keV")
139
+ plt.ylabel(r"$\epsilon_D$", fontsize = 14)
140
+ if SDT == "T":
141
+ plt.plot(tdcr, pDv, label = r"$kB$ = "+str(i)+" cm/keV")
142
+ plt.ylabel(r"$\epsilon$", fontsize = 14)
143
+ # plt.xscale("log")
144
+ plt.xlabel(r"$\epsilon_T/\epsilon_D$", fontsize = 14)
145
+ # bbox_inches = "tight", format = "png", dpi = 500
146
+ plt.legend(fontsize = 12)
147
+ plt.savefig("EfficiencyCurves/"+Rad+"/tdcr_"+Rad+".png")
148
+ # plt.close()
149
+
150
+ def plotSmoothing(Rad,SDT): # plot the fitted efficiecny curves for a range of kB
151
+ kB = 1.0e-5
152
+ plt.figure(r"Fitting of calculated points - $kB$ = "+str(kB)+" cm/keV")
153
+ plt.clf()
154
+ plt.title(' ')
155
+ pDv = readProfil(Rad,kB,"D")[1] # probability vector of events
156
+ pts_D = readEff(Rad, kB, "D")
157
+ pTv = readProfil(Rad,kB,"T")[1] # probability vector of triple coincidence events
158
+ pts_T = readEff(Rad, kB, "T")
159
+ pSv = readProfil(Rad,kB,"S")[1] # probability vector of single events
160
+ pts_S = readEff(Rad, kB, "S")
161
+ tdcr = np.asarray(pTv)/np.asarray(pDv) # tdcr vector fit
162
+ tdcr_x = np.asarray(pts_T[1])/np.asarray(pts_D[1]) # calculated points
163
+ if SDT == "S":
164
+ plt.plot(tdcr_x, pts_S[1], "ok", label = r"calculated points")
165
+ plt.plot(tdcr, pSv, label = r"fitted function")
166
+ plt.ylabel(r"$\epsilon_S$", fontsize = 14)
167
+ if SDT == "D":
168
+ plt.plot(tdcr_x, pts_D[1], "ok", label = r"calculated points")
169
+ plt.plot(tdcr, pDv, label = r"fitted function")
170
+ plt.ylabel(r"$\epsilon_D$", fontsize = 14)
171
+ if SDT == "T":
172
+ plt.plot(tdcr_x, pts_T[1], "ok", label = r"calculated points")
173
+ plt.plot(tdcr, pDv, label = r"fitted function")
174
+ plt.ylabel(r"$\epsilon$", fontsize = 14)
175
+ # plt.xscale("log")
176
+ plt.xlabel(r"$\epsilon_T/\epsilon_D$", fontsize = 14)
177
+ # bbox_inches = "tight", format = "png", dpi = 500
178
+ plt.legend(fontsize = 12)
179
+ plt.savefig("EfficiencyCurves/"+Rad+"/tdcr_"+Rad+"_fit.png")
180
+ # plt.close()
181
+
182
+ def plotL(radv,kB,L): # plot the fitted efficiecny curves for a range of kB
183
+
184
+ effD = []; effT = []
185
+ for Rad in radv:
186
+ out = readProfil(Rad,kB,"D") # probability vector of double events
187
+ effD.append(np.interp(L, out[0], np.asarray(out[1])))
188
+ out = readProfil(Rad,kB,"T") # probability vector of triple events
189
+ effT.append(np.interp(L, out[0], np.asarray(out[1])))
190
+
191
+ effD = np.asarray(effD)
192
+ effT = np.asarray(effT)
193
+
194
+ x = effT/effD
195
+ plt.figure(r"Fitting of calculated points")#" - $kB$ = "+str(kB)+" cm/keV - $L$ = "+str(L)+" keV$^{-1}$")
196
+ plt.clf()
197
+ plt.title(' ')
198
+ plt.plot(x, effD, "ok", label="TDCR model")
199
+ for ix, c in enumerate(x):
200
+ plt.text(c, effD[ix]+0.000, radv[ix], color="b")
201
+ plt.errorbar(0.9788, 0.9767, xerr=0.0012, yerr=0.011, fmt="or", label="experiemental result")
202
+ plt.text(0.9788, 0.9767, "Co-60", color = "r")
203
+ plt.ylabel(r"$\epsilon_D$", fontsize = 14)
204
+ plt.xlabel(r"$\epsilon_T/\epsilon_D$", fontsize = 14)
205
+ # plt.xscale("log")
206
+ plt.legend(fontsize = 12)
207
+ plt.savefig("EfficiencyCurves/ESIRIC/EfficiencyCurve.png")
208
+ plt.show()
209
+
210
+ # plt.xscale("log")
211
+
212
+ # bbox_inches = "tight", format = "png", dpi = 500
213
+
214
+ # plt.close()
215
+
216
+ ## PLOT EFFICIENCY CURVES FOR SEVERAL KB VALUES
217
+ # plotEffProfilkB("C-14","D")
218
+
219
+ ## PLOT EFFICIENCY CURVE A GIVEN KB VALUE
220
+ # plotEffProfil("Fe-55", 1.05E-5)
221
+
222
+ ## PLOT THE FIT OF THE EFFICIENCY FUNCTION
223
+ # plotSmoothing("C-14","D")
224
+
225
+ ## PLOT THE EFFICIENCY FOR A GIVEN FREE PARAMETER
226
+ # plotSmoothing("C-14","D")
227
+
228
+ ## CALCULATION OF THE EFFICIENCY
229
+ # Reference Point Co-60 => TDCR=0.9788 Eff_D = 0.9767 => L =
230
+
231
+ # radv = ["H-3", "He-6", "Be-7", "C-11", "C-14", "N-13", "O-15", "F-18", "Na-22", \
232
+ # "Na-24", "Al-26", "P-32", "P-33", "S-35", "Cl-36", "Ar-41", "K-40", \
233
+ # "Ca-41", "Ca-45", "Sc-44", "Sc-46", "Sc-47", "Ti-44", "Cr-51", \
234
+ # "Mn-52", "Mn-52m", "Mn-54", "Mn-56", "Fe-52", "Fe-55", "Fe-59", "Co-56", \
235
+ # "Co-57", "Co-58", "Co-60", "Ga-66", "Ni-57", "Ni-59", "Ni-63", "Zn-65", \
236
+ # "I-123", "Sb-124", "Sb-125", "Te-123m", "Te-127", "Te-127m", "Te-132", \
237
+ # "Pu-241"]
238
+
239
+
240
+ radv = ["Fe-55"]
241
+ kB = 1.0e-5
242
+ L = 1.13
243
+ plotL(radv, kB, L)
244
+
245
+ # AB = 657.296
246
+ # BC = 695.919
247
+ # AC = 693.579
248
+ # T = 448.868
249
+ # D = AB+BC+AC-2*T
250
+ # out = effTDCR(T/D, "H-3", 1.05E-5) # H-3
251
+ # plotEffProfil("H-3", 1.05E-5)
252
+
253
+ # AB = 864.95
254
+ # BC = 1006.58
255
+ # AC = 968.45
256
+ # T = 700
257
+ # D = 1000
258
+ # XX = (D + 2*T)/3
259
+ # print(XX)
260
+ # print(T/D)
261
+ # D = AB+BC+AC-2*T
262
+
263
+ # TDCR = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
264
+ # kB = 0.8E-5
265
+ # rad = "C-14"
266
+ # TDCR.reverse()
267
+ # for t in TDCR:
268
+ # eff = effTDCR(t, rad, kB)[1] # H-3
269
+ # eff2 = dtc.I2calc(t, 0, 0, 0, rad, kB*1e3)[2]
270
+ # digRound = 2
271
+ # print("Efficiency of double coincidences = ", round(100*eff2, digRound),"% - ", round(100*eff, digRound),"%")
272
+
273
+
274
+
275
+
276
+
277
+ # DT = 0.977784348 # Co-60 NIST
278
+ # uDT = 0.000711023 # Co-60 NIST
279
+ # D = 84679.21179
280
+ # nMc = 1e3
281
+ # eff_v = []
282
+ # kB1 = 0.8e-5
283
+ # kB2 = 1.2e-5
284
+ # for i in range(int(nMc)):
285
+ # dti = np.random.normal(DT,uDT)
286
+ # kBi = np.random.uniform(kB1,kB2)
287
+ # eff_v.append(effTDCR(dti, "Co-60", kBi)[1]) # Co-60 NIST
288
+ # eff = np.median(eff_v)
289
+ # u_eff = np.std(eff_v)
290
+ # A = D/eff
291
+ # uA = D*u_eff/eff**2
292
+ # result 87099 67 (err = 0.0002) kB = 0.01
293
+ # result 87045 88 kB = [0.008 - 0.012]
294
+ # I2 86640.31523 14.64334414
295
+ # A_NIST = 86920 200
296
+
297
+ # out = effTDCR(657.296, 695.919, 693.579, 448.868) # Co-60
298
+ # print("Efficiency of double coincidences = ", round(100*eff, digRound),"+/-", round(100*u_eff, digRound),"%")
299
+ # print("Efficiency of triple coincidences = ", round(100*out[2], digRound),"%")
300
+ # print("Activity from double coincidences = ", round(A, digRound), "+/-", round(uA, digRound) ,"Bq")
301
+ # print("Activity of triple coincidences = ", round(T/out[2], digRound), "Bq")
302
+ # print("Efficiency of double coincidences (asym) = ", round(100*out[3], digRound),"%")
303
+ # print("Efficiency of triple coincidences (asym) = ", round(100*out[5], digRound),"%")
304
+ # print("Activity from double coincidences (asym) = ", round(D/out[3], digRound), "Bq")
305
+ # print("Activity of triple coincidences (asym) = ", round(T/out[5], digRound), "Bq")
@@ -0,0 +1,96 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Wed Jul 5 10:04:23 2023
4
+
5
+ @author: romain.coulon
6
+ """
7
+ import TDCR_model_lib as tl
8
+ import TDCRPy as td
9
+ import matplotlib.pyplot as plt
10
+
11
+ ## INPUT OF THE MODEL
12
+ # N=1 # number of simulated decay (MC trials)
13
+ N= 10000
14
+ Rad="Co-60, H-3" # list of radionuclides (Na-24)
15
+ # Rad = ["Cs-137"]
16
+ pmf_1="0.5, 0.5" # relative abondance (pmf)
17
+ kB =[1.0e-5]
18
+ # kB = [0.8e-5, 0.9e-5, 1.0e-5, 1.1e-5, 1.2e-5] # Birks constant in cm/keV
19
+ L=[1.13]
20
+ # L = np.logspace(-3,1,50) # Free paramete in keV-1
21
+
22
+ Record = False # to record the efficiency curves
23
+ # Record = True # to record the efficiency curves
24
+ # Display = False # to display calculation results on the console
25
+ Display = True # to display calculation results on the console
26
+ # RHO = 0.96 #density of absorber (Toluene) g/cm3
27
+ RHO = 0.98 #density of absorber (UG + H20) g/cm3
28
+ nE = 1000 #number of bin to discretize the energy vector for scintillation quenching calculation
29
+ mode = "eff"
30
+ #meta_vec = ["Am-242m","Pa-234m","Pm-148m","Pr-144m","Xe-133m","Te-127m","Ag-110m","Ag-108m","Tc-99m","Nb-95m","Y-90m","Mn-52m"]
31
+
32
+ TDCR_measure = 0.977784 # Measured TDCR value
33
+ u_TDCR_measure = 0.000711 # standard uncertainty
34
+ TAB=0.8
35
+ TBC=0.8
36
+ TAC=0.8
37
+
38
+ for kB_i in kB: # Loop on the kB
39
+ mean_efficiency_S = [] # efficiency of single counte rate
40
+ std_efficiency_S = [] # std
41
+ mean_efficiency_T = [] # efficiency of triple coincidence counte rate
42
+ std_efficiency_T = [] # std
43
+ mean_efficiency_D = [] # efficiency of double coincidence counte rate
44
+ std_efficiency_D = [] # std
45
+ TDCR_calcul = []
46
+ for L_i in L: # loop on the free parameter values
47
+ efficiency_S = [] # results calculated efficiency for single events
48
+ efficiency_D = [] # results calculated efficiency for double coincidence
49
+ efficiency_T = [] # results calculated efficiency for triple coincidence
50
+
51
+ out=td.TDCRPy(L_i,TDCR_measure,TAB, TBC, TAC, Rad,pmf_1,10,kB_i,RHO,nE,mode="eff",mode2="sym",Display=True)
52
+ efficiency_S.append(out[0])
53
+ std_efficiency_S.append(out[1])
54
+ efficiency_D.append(out[2])
55
+ std_efficiency_D.append(out[3])
56
+ efficiency_T.append(out[4])
57
+ std_efficiency_T.append(out[5])
58
+
59
+ if len(L) > 1: print("\n\t\t Progress = ", round(100*(L.tolist().index(L_i)+1)/len(L), 1), " %")
60
+ print("\t\tradionuclide(s): ", Rad)
61
+ print("\t\t TDCR calculation _ kB = ", kB_i, "cm/keV")
62
+ print("\t\t Free parameter = ", L_i, " keV-1")
63
+ print("\t\t Efficiency of Triple coincident events = ", round(100*efficiency_T[-1],3), "+/-", round(100*std_efficiency_T[-1],3), " %")
64
+ print("\t\t Efficiency of Double coincident events = ", round(100*efficiency_D[-1],3), "+/-", round(100*std_efficiency_D[-1],3), " %")
65
+ print("\t\t Efficiency of Single events = ", round(100*efficiency_S[-1],3), "+/-", round(100*std_efficiency_S[-1],3), " %")
66
+
67
+ if len(mean_efficiency_S)>1:
68
+ plt.figure("Efficiency curve I")
69
+ plt.clf()
70
+ plt.title(''.join(Rad))
71
+ plt.errorbar(L, mean_efficiency_S, yerr = std_efficiency_S, fmt=".b", label = "S")
72
+ plt.errorbar(L, mean_efficiency_D, yerr = std_efficiency_D, fmt=".k", label = "D")
73
+ plt.errorbar(L, mean_efficiency_T, yerr = std_efficiency_T, fmt=".r", label = "T")
74
+ plt.xscale("log")
75
+ plt.xlabel(r"$L$ /keV$^{-1}$", fontsize = 14)
76
+ plt.ylabel(r"$\epsilon$", fontsize = 14)
77
+ plt.legend(fontsize = 12)
78
+ if Record: plt.savefig("EfficiencyCurves/"+''.join(Rad)+"/fom_"+''.join(Rad)+"_"+str(kB_i)+".png")
79
+ plt.close()
80
+
81
+ plt.figure("Efficiency curve II")
82
+ plt.clf()
83
+ plt.title(''.join(Rad))
84
+ plt.errorbar(TDCR_calcul, mean_efficiency_S, yerr=std_efficiency_S, fmt=".b", label = "S")
85
+ plt.errorbar(TDCR_calcul, mean_efficiency_D, yerr=std_efficiency_D, fmt=".k", label = "D")
86
+ plt.errorbar(TDCR_calcul, mean_efficiency_T, yerr=std_efficiency_T, fmt=".r", label = "T")
87
+ plt.xlabel(r"$\epsilon_T/\epsilon_D$", fontsize = 14)
88
+ plt.ylabel(r"$\epsilon_D$", fontsize = 14)
89
+ plt.legend(fontsize = 12)
90
+ if Record: plt.savefig("EfficiencyCurves/"+''.join(Rad)+"/tdcr_"+''.join(Rad)+"_"+str(kB_i)+".png")
91
+ plt.close()
92
+
93
+ if Record:
94
+ tl.writeEffcurves(L, mean_efficiency_S, std_efficiency_S, Rad, pmf_1, kB_i, "S")
95
+ tl.writeEffcurves(L, mean_efficiency_D, std_efficiency_D, Rad, pmf_1, kB_i, "D")
96
+ tl.writeEffcurves(L, mean_efficiency_T, std_efficiency_T, Rad, pmf_1, kB_i, "T")