ararpy 0.1.199__py3-none-any.whl → 0.2.2__py3-none-any.whl
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.
- ararpy/Example - Check arr.py +52 -0
- ararpy/Example - Granite Cooling History.py +411 -0
- ararpy/Example - Plot temperature calibration.py +291 -0
- ararpy/Example - Show MDD results.py +561 -0
- ararpy/Example - Show all Kfs age spectra.py +344 -0
- ararpy/Example - Show random walk results.py +363 -0
- ararpy/Example - Tc calculation.py +437 -0
- ararpy/__init__.py +3 -4
- ararpy/calc/age.py +34 -36
- ararpy/calc/arr.py +0 -20
- ararpy/calc/basic.py +26 -3
- ararpy/calc/corr.py +131 -85
- ararpy/calc/jvalue.py +7 -5
- ararpy/calc/plot.py +1 -2
- ararpy/calc/raw_funcs.py +41 -2
- ararpy/calc/regression.py +224 -132
- ararpy/files/arr_file.py +2 -1
- ararpy/files/basic.py +0 -22
- ararpy/files/calc_file.py +107 -84
- ararpy/files/raw_file.py +242 -229
- ararpy/smp/basic.py +133 -34
- ararpy/smp/calculation.py +6 -6
- ararpy/smp/corr.py +339 -153
- ararpy/smp/diffusion_funcs.py +345 -36
- ararpy/smp/export.py +247 -129
- ararpy/smp/info.py +2 -2
- ararpy/smp/initial.py +93 -45
- ararpy/smp/json.py +2 -2
- ararpy/smp/plots.py +144 -164
- ararpy/smp/raw.py +11 -15
- ararpy/smp/sample.py +222 -181
- ararpy/smp/style.py +26 -7
- ararpy/smp/table.py +42 -33
- ararpy/thermo/atomic_level_random_walk.py +56 -48
- ararpy/thermo/basic.py +2 -2
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/METADATA +10 -1
- ararpy-0.2.2.dist-info/RECORD +73 -0
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/WHEEL +1 -1
- ararpy-0.1.199.dist-info/RECORD +0 -66
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/licenses/LICENSE +0 -0
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/top_level.txt +0 -0
ararpy/smp/diffusion_funcs.py
CHANGED
|
@@ -56,7 +56,10 @@ class DiffSample:
|
|
|
56
56
|
|
|
57
57
|
if smp is not None:
|
|
58
58
|
self.smp = smp
|
|
59
|
-
|
|
59
|
+
if name is None:
|
|
60
|
+
self.sname = self.smp.name()
|
|
61
|
+
else:
|
|
62
|
+
self.sname = name
|
|
60
63
|
|
|
61
64
|
self.sequence = self.smp.sequence()
|
|
62
65
|
self.ni = self.sequence.size # sequence number
|
|
@@ -76,7 +79,7 @@ class DiffSample:
|
|
|
76
79
|
self.ya = np.array(self.smp.ApparentAgeValues[2], dtype=np.float64)
|
|
77
80
|
self.sig = np.array(self.smp.ApparentAgeValues[3], dtype=np.float64)
|
|
78
81
|
|
|
79
|
-
read_from_file = kwargs.get('read_from_file',
|
|
82
|
+
read_from_file = kwargs.get('read_from_file', True)
|
|
80
83
|
if read_from_file:
|
|
81
84
|
self.file_age_in = open(os.path.join(self.loc, f"{self.sname}_age.in"), "w")
|
|
82
85
|
self.file_sig_in = open(os.path.join(self.loc, f"{self.sname}_sig.in"), "w")
|
|
@@ -125,6 +128,11 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
125
128
|
|
|
126
129
|
self.file_output_par = open(os.path.join(self.loc, f"{self.sname}.par"), "w")
|
|
127
130
|
self.file_output_ame = open(os.path.join(self.loc, f"{self.sname}.ame"), "w")
|
|
131
|
+
|
|
132
|
+
self.file_output_ar0 = open(os.path.join(self.loc, f"{self.sname}.ar0"), "w")
|
|
133
|
+
self.file_output_ar1 = open(os.path.join(self.loc, f"{self.sname}.ar1"), "w")
|
|
134
|
+
self.file_output_lg0 = open(os.path.join(self.loc, f"{self.sname}.lg1"), "w")
|
|
135
|
+
self.file_output_lg1 = open(os.path.join(self.loc, f"{self.sname}.lg1"), "w")
|
|
128
136
|
# self.file_output_mch = open(os.path.join(self.loc, f"{self.sname}_mch-out.dat"), "w")
|
|
129
137
|
# self.file_output_mages = open(os.path.join(self.loc, f"{self.sname}_mages-out.dat"), "w")
|
|
130
138
|
# self.file_output_agesd = open(os.path.join(self.loc, f"{self.sname}_ages-sd.samp"), "w")
|
|
@@ -143,6 +151,7 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
143
151
|
self.f = [0] # ar39%, array(ni)
|
|
144
152
|
self.a39 = [] # ar39, array(ni - 1)
|
|
145
153
|
self.sig39 = [] # sigma of ar39, array(ni - 1)
|
|
154
|
+
self.max_temp = 1373 # in K, 1100°C + 273
|
|
146
155
|
|
|
147
156
|
# for i in range(self.ni):
|
|
148
157
|
# self.telab.append(float(self.file_tmp_in.readline())) # heating temperature in Kelvin
|
|
@@ -202,14 +211,19 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
202
211
|
# xlogd = [np.log10((dtr2[i + 1] - dtr2[i]) / self.tilab[i] * self.imp ** 2) for i in range(0, len(dtr2) - 1)]
|
|
203
212
|
xlogd = self.xlogd
|
|
204
213
|
tinv = [1 / i * 10000 for i in self.telab]
|
|
214
|
+
|
|
205
215
|
self.nimax = self.ni # the first sequence index great than 1100 celsius degree
|
|
206
216
|
for i in range(self.ni):
|
|
207
|
-
if self.nimax == self.ni and self.telab[i] >
|
|
217
|
+
if self.nimax == self.ni and self.telab[i] > self.max_temp:
|
|
208
218
|
self.nimax = i
|
|
209
219
|
|
|
210
220
|
# wt = self.errcal()
|
|
211
221
|
wt = self.wt
|
|
212
222
|
|
|
223
|
+
for i in range(len(xlogd)):
|
|
224
|
+
self.file_output_ar0.writelines(f"{tinv[i]}\t{xlogd[i]}\t{wt[i]}\n")
|
|
225
|
+
self.file_output_ar0.close()
|
|
226
|
+
|
|
213
227
|
wf = []
|
|
214
228
|
sumwf = 0
|
|
215
229
|
for i in range(self.ni):
|
|
@@ -231,7 +245,6 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
231
245
|
|
|
232
246
|
slop = e * ee / (r * 10000)
|
|
233
247
|
xro = (ordi - slop * tinv[self.nimax - 1] - xlogd[self.nimax - 1]) / 2 * (1 + (1 - self.f[self.nimax]) / 2)
|
|
234
|
-
|
|
235
248
|
e0 = e
|
|
236
249
|
ord0 = ordi
|
|
237
250
|
self.ni = self.nimax
|
|
@@ -240,7 +253,7 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
240
253
|
|
|
241
254
|
nca = 20
|
|
242
255
|
zi = [0]
|
|
243
|
-
ndom =
|
|
256
|
+
ndom = self.ndom
|
|
244
257
|
na = 2 * ndom - 1
|
|
245
258
|
a1 = np.zeros(na + 1, dtype=np.float64)
|
|
246
259
|
a2 = np.zeros(na + 1, dtype=np.float64)
|
|
@@ -273,7 +286,6 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
273
286
|
to_break = False
|
|
274
287
|
|
|
275
288
|
while True:
|
|
276
|
-
|
|
277
289
|
nnnnnn += 1
|
|
278
290
|
|
|
279
291
|
a1, a2 = self.guess(ndom, a1, a2, xro, self.generator.idum)
|
|
@@ -436,8 +448,8 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
436
448
|
mct += 1
|
|
437
449
|
continue
|
|
438
450
|
|
|
439
|
-
fmod = np.zeros(ns, dtype=np.float64)
|
|
440
|
-
for nt in range(self.ni):
|
|
451
|
+
fmod = np.zeros(ns+1, dtype=np.float64)
|
|
452
|
+
for nt in range(1, self.ni+1):
|
|
441
453
|
y, dyda = self.funcs(zi[nt], a2, na, a1)
|
|
442
454
|
fmod[nt] = y
|
|
443
455
|
if amax == -1:
|
|
@@ -480,8 +492,17 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
480
492
|
self.file_output_ame.writelines(f"{slop}\n")
|
|
481
493
|
self.file_output_ame.writelines(f"{ordi}\n")
|
|
482
494
|
|
|
495
|
+
|
|
483
496
|
dzx = np.zeros(ns, dtype=np.float64)
|
|
484
|
-
dzx, _ = self.arr(e, ordi, dzx, fmod, self.f, self.telab, self.tilab, xlogd)
|
|
497
|
+
dzx, _ , results_16, results_18, results_22 = self.arr(e, ordi, dzx, fmod, self.f, self.telab, self.tilab, xlogd)
|
|
498
|
+
|
|
499
|
+
for each_line in results_16:
|
|
500
|
+
self.file_output_ar1.writelines(f"{each_line}\n")
|
|
501
|
+
for each_line in results_18:
|
|
502
|
+
self.file_output_lg1.writelines(f"{each_line}\n")
|
|
503
|
+
for each_line in results_22:
|
|
504
|
+
self.file_output_lg0.writelines(f"{each_line}\n")
|
|
505
|
+
|
|
485
506
|
|
|
486
507
|
chisq2 = 0.
|
|
487
508
|
noutlier = 0
|
|
@@ -1462,9 +1483,9 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
1462
1483
|
# INVERSION OF 39-F
|
|
1463
1484
|
for k in range(ni):
|
|
1464
1485
|
if fmod[k] > acut:
|
|
1465
|
-
zx[k + 1] = -np.log(pi ** 2 / b * (1.0 - fmod[k])) / pi ** 2
|
|
1486
|
+
zx[k + 1] = -np.log(pi ** 2 / b * (1.0 - fmod[k+1])) / pi ** 2
|
|
1466
1487
|
else:
|
|
1467
|
-
zx[k + 1] = pi * (fmod[k] / 4.0) ** 2
|
|
1488
|
+
zx[k + 1] = pi * (fmod[k+1] / 4.0) ** 2
|
|
1468
1489
|
|
|
1469
1490
|
zx[0] = 0.0
|
|
1470
1491
|
slop = e * ee / 10000.0 / r
|
|
@@ -1477,8 +1498,8 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
1477
1498
|
dzx[k] = np.log10((zx[k + 1] - zx[k]) / tilab[k] * imp ** 2)
|
|
1478
1499
|
tinv = 1.0 / telab[k] * 10000.0
|
|
1479
1500
|
xlog = (ord - slop * tinv - dzx[k]) / 2.0
|
|
1480
|
-
results_18.append(f"{fmod[k - 1] * 100:.8f}{tab1}{xlog:.8f}")
|
|
1481
1501
|
results_18.append(f"{fmod[k] * 100:.8f}{tab1}{xlog:.8f}")
|
|
1502
|
+
results_18.append(f"{fmod[k+1] * 100:.8f}{tab1}{xlog:.8f}")
|
|
1482
1503
|
results_16.append(f"{tinv:.8f}{tab1}{dzx[k]:.8f}")
|
|
1483
1504
|
|
|
1484
1505
|
results_16.append("&")
|
|
@@ -1487,10 +1508,11 @@ class DiffArrmultiFunc(DiffSample):
|
|
|
1487
1508
|
for k in range(ni):
|
|
1488
1509
|
tinv = 1.0 / telab[k] * 10000.0
|
|
1489
1510
|
xlogr0 = (ord - slop * tinv - xlogd[k]) / 2.0
|
|
1490
|
-
results_22.append(f"{f[k - 1] * 100:.8f}{tab1}{xlogr0:.8f}")
|
|
1491
1511
|
results_22.append(f"{f[k] * 100:.8f}{tab1}{xlogr0:.8f}")
|
|
1512
|
+
results_22.append(f"{f[k+1] * 100:.8f}{tab1}{xlogr0:.8f}")
|
|
1513
|
+
|
|
1492
1514
|
|
|
1493
|
-
return dzx, zx
|
|
1515
|
+
return dzx, zx, results_16, results_18, results_22
|
|
1494
1516
|
|
|
1495
1517
|
|
|
1496
1518
|
class DiffAgemonFuncs(DiffSample):
|
|
@@ -1631,6 +1653,7 @@ class DiffAgemonFuncs(DiffSample):
|
|
|
1631
1653
|
|
|
1632
1654
|
###
|
|
1633
1655
|
# initialize
|
|
1656
|
+
print(f"DiffAgemon initializing ...")
|
|
1634
1657
|
lista = np.zeros(self.nc, dtype=int)
|
|
1635
1658
|
c0 = np.zeros(self.nc, dtype=np.float64)
|
|
1636
1659
|
c = np.zeros(self.nc, dtype=np.float64)
|
|
@@ -4225,7 +4248,7 @@ def gammln(xx):
|
|
|
4225
4248
|
|
|
4226
4249
|
|
|
4227
4250
|
|
|
4228
|
-
def conf(input_x, input_y, count=None, num=None, using_binom=False, using_normal=False):
|
|
4251
|
+
def conf(input_x, input_y, count=None, num=None, using_binom=False, using_normal=False, start=None, end=None):
|
|
4229
4252
|
"""
|
|
4230
4253
|
Calculate 90% confident interval of the given distribution of cooling histories.
|
|
4231
4254
|
Parameters
|
|
@@ -4239,6 +4262,37 @@ def conf(input_x, input_y, count=None, num=None, using_binom=False, using_normal
|
|
|
4239
4262
|
|
|
4240
4263
|
"""
|
|
4241
4264
|
|
|
4265
|
+
if len(input_x) != len(input_y):
|
|
4266
|
+
raise ValueError("length of input x does not equal to that of input y")
|
|
4267
|
+
|
|
4268
|
+
data_length = len(input_x)
|
|
4269
|
+
if start is None:
|
|
4270
|
+
start = min([min(i) for i in input_x])
|
|
4271
|
+
if end is None:
|
|
4272
|
+
end = max([max(i) for i in input_x])
|
|
4273
|
+
num = 20 if num is None else num
|
|
4274
|
+
|
|
4275
|
+
x_conf = np.linspace(start, end, num=num).tolist()
|
|
4276
|
+
y1_conf = []
|
|
4277
|
+
y2_conf = []
|
|
4278
|
+
y3_conf = []
|
|
4279
|
+
y4_conf = []
|
|
4280
|
+
y_conf = np.zeros((num, data_length)).tolist()
|
|
4281
|
+
#
|
|
4282
|
+
# # distribution
|
|
4283
|
+
# for k, out_x in enumerate(x_conf):
|
|
4284
|
+
# for i in range(data_length):
|
|
4285
|
+
# xs = input_x[i]
|
|
4286
|
+
# ys = input_y[i]
|
|
4287
|
+
# out_y = 0
|
|
4288
|
+
# for j, xi in enumerate(xs):
|
|
4289
|
+
# if xi <= out_x <= xs[j+1]:
|
|
4290
|
+
# y_conf[k, i] = (ys[j+1] - ys[j]) / (xs[j+1] - xs[j]) * (out_x - xs[j]) + ys[j]
|
|
4291
|
+
# break
|
|
4292
|
+
#
|
|
4293
|
+
# print(y_conf)
|
|
4294
|
+
|
|
4295
|
+
|
|
4242
4296
|
input_x = np.array(input_x)
|
|
4243
4297
|
input_y = np.array(input_y)
|
|
4244
4298
|
|
|
@@ -4253,12 +4307,6 @@ def conf(input_x, input_y, count=None, num=None, using_binom=False, using_normal
|
|
|
4253
4307
|
x_steps_num = int(x_end - x_start) if num is None else num
|
|
4254
4308
|
dx = (x_end - x_start) / x_steps_num
|
|
4255
4309
|
|
|
4256
|
-
x_conf = []
|
|
4257
|
-
y1_conf = []
|
|
4258
|
-
y2_conf = []
|
|
4259
|
-
y3_conf = []
|
|
4260
|
-
y4_conf = []
|
|
4261
|
-
|
|
4262
4310
|
for i in range(x_steps_num + 1):
|
|
4263
4311
|
data = []
|
|
4264
4312
|
# 置信曲线的x,即age
|
|
@@ -4388,7 +4436,7 @@ def get_random_dir(path: str, length=7, random_index=""):
|
|
|
4388
4436
|
try:
|
|
4389
4437
|
exist_ok = random_index != ""
|
|
4390
4438
|
if random_index == "":
|
|
4391
|
-
random_index = calc.basic.
|
|
4439
|
+
random_index = calc.basic.random_choice(length=length)
|
|
4392
4440
|
destination_folder = os.path.join(path, random_index)
|
|
4393
4441
|
os.makedirs(destination_folder, exist_ok=exist_ok)
|
|
4394
4442
|
return destination_folder, random_index
|
|
@@ -4442,18 +4490,18 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
|
|
|
4442
4490
|
max_age = agemon.max_plateau_age # double
|
|
4443
4491
|
nsteps = agemon.ni # int
|
|
4444
4492
|
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4493
|
+
print(f"{xs = }")
|
|
4494
|
+
print(f"{age = }")
|
|
4495
|
+
print(f"{sig = }")
|
|
4496
|
+
print(f"{e = }")
|
|
4497
|
+
print(f"{d0 = }")
|
|
4498
|
+
print(f"{vc = }")
|
|
4499
|
+
print(f"{nsts = }")
|
|
4500
|
+
print(f"{temp = }")
|
|
4501
|
+
print(f"{heating_time = }")
|
|
4502
|
+
print(f"{kk = }")
|
|
4503
|
+
print(f"{max_age = }")
|
|
4504
|
+
print(f"{nsteps = }")
|
|
4457
4505
|
|
|
4458
4506
|
d0_flatten = d0.flatten()
|
|
4459
4507
|
vc_flatten = vc.flatten()
|
|
@@ -4483,7 +4531,8 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
|
|
|
4483
4531
|
ctypes.c_char_p(filepath),
|
|
4484
4532
|
ctypes.c_char_p(samplename)
|
|
4485
4533
|
)
|
|
4486
|
-
except:
|
|
4534
|
+
except Exception as e:
|
|
4535
|
+
print(e)
|
|
4487
4536
|
pass
|
|
4488
4537
|
else:
|
|
4489
4538
|
del mylib
|
|
@@ -4669,6 +4718,197 @@ def dr2_plane(f, ti, ar, sar, ln=True):
|
|
|
4669
4718
|
return dr2, logdr2, wt
|
|
4670
4719
|
|
|
4671
4720
|
|
|
4721
|
+
def dr2_cylinder(f, ti, ar, sar, ln=True):
|
|
4722
|
+
"""
|
|
4723
|
+
|
|
4724
|
+
Cylinder model
|
|
4725
|
+
|
|
4726
|
+
Parameters
|
|
4727
|
+
----------
|
|
4728
|
+
f
|
|
4729
|
+
ti
|
|
4730
|
+
ar
|
|
4731
|
+
sar
|
|
4732
|
+
ln
|
|
4733
|
+
|
|
4734
|
+
Returns
|
|
4735
|
+
-------
|
|
4736
|
+
|
|
4737
|
+
"""
|
|
4738
|
+
f = np.array(f)
|
|
4739
|
+
ti = np.array(ti)
|
|
4740
|
+
n = min(len(f), len(ti))
|
|
4741
|
+
ar = np.array(ar)
|
|
4742
|
+
sar = np.array(sar)
|
|
4743
|
+
sar2 = sar ** 2
|
|
4744
|
+
ti = ti * 60 # in seconds
|
|
4745
|
+
sti = [90 for i in range(n)]
|
|
4746
|
+
pi = math.pi
|
|
4747
|
+
pi = 3.141592654
|
|
4748
|
+
|
|
4749
|
+
# sf = sqrt(b ** 2 * siga ** 2 + a ** 2 * sigb ** 2) / (a + b) ** 2
|
|
4750
|
+
# sf = [math.sqrt(sar[i + 1:].sum() ** 2 * (sar[:i + 1] ** 2).sum() + ar[:i + 1].sum() ** 2 * (sar[i + 1:] ** 2).sum()) / ar.sum() ** 2 for i in range(len(ar) - 1)]
|
|
4751
|
+
# sf.append(0)
|
|
4752
|
+
|
|
4753
|
+
f = np.where(f >= 1, 0.9999999999999999, f)
|
|
4754
|
+
|
|
4755
|
+
model = geometric_model(geo='cylinder')
|
|
4756
|
+
dtr2 = [model(bp=0.6)[1](fi) for fi in f]
|
|
4757
|
+
dtr2_1 = [model(bp=0)[1](fi) for fi in f]
|
|
4758
|
+
dtr2_2 = [model(bp=2)[1](fi) for fi in f]
|
|
4759
|
+
dtr2_1.insert(0, 0); dtr2_2.insert(0, 0)
|
|
4760
|
+
# dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
|
|
4761
|
+
dr2 = [((dtr2_1[i+1] - dtr2_1[i]) / ti[i]) if f[i] > 0.6 else ((dtr2_2[i+1] - dtr2_2[i]) / ti[i]) for i in range(len(f))]
|
|
4762
|
+
|
|
4763
|
+
# imp = 2
|
|
4764
|
+
# # imp = 1
|
|
4765
|
+
# dtr2 = [pi * (fi / 4) ** 2 if fi <= 0.5 else math.log((1 - fi) * pi ** 2 / 8) / (- pi ** 2) for fi in f]
|
|
4766
|
+
# dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] * imp ** 2 for i in range(len(dtr2))]
|
|
4767
|
+
# xlogd = [np.log10(i) for i in dr2]
|
|
4768
|
+
|
|
4769
|
+
sar_lt = np.zeros(n) # 偏导数
|
|
4770
|
+
sar_eq = np.zeros(n) # 偏导数
|
|
4771
|
+
sar_gt = np.zeros(n) # 偏导数
|
|
4772
|
+
st = np.zeros(n) # 偏导数
|
|
4773
|
+
sdr2 = np.zeros(n)
|
|
4774
|
+
for i in range(n):
|
|
4775
|
+
if i == 0:
|
|
4776
|
+
if f[i] <= 0.6:
|
|
4777
|
+
sar_lt[i] = 0
|
|
4778
|
+
sar_eq[i] = (1 / (ti[i] * (1 - f[i] / 4 * pi) ** 0.5)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - 1 / ti[i] * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4779
|
+
sar_gt[i] = (1 / (ti[i] * (1 - f[i] / 4 * pi) ** 0.5)) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - 1 / ti[i] * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4780
|
+
else:
|
|
4781
|
+
sar_lt[i] = 0
|
|
4782
|
+
sar_eq[i] = (1 / (5.78 * ti[i] * (1 - f[i]))) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4783
|
+
sar_gt[i] = (1 / (5.78 * ti[i] * (1 - f[i]))) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4784
|
+
else:
|
|
4785
|
+
|
|
4786
|
+
if f[i] <= 0.6:
|
|
4787
|
+
sar_lt[i] = (1 / (ti[i] * (1 - f[i] / 4 * pi) ** 0.5)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - (1 / (ti[i] * (1 - f[i-1] / 4 * pi) ** 0.5)) * ((sum(ar) - ar[i-1] - sum(ar[:i-1])) / sum(ar) ** 2) - (1 / ti[i]) * (0 - ar[i]) / sum(ar) ** 2
|
|
4788
|
+
sar_eq[i] = (1 / (ti[i] * (1 - f[i] / 4 * pi) ** 0.5)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - (1 / (ti[i] * (1 - f[i-1] / 4 * pi) ** 0.5)) * ((0 - 0 - sum(ar[:i-1])) / sum(ar) ** 2) - (1 / ti[i]) * (sum(ar) - ar[i]) / sum(ar) ** 2
|
|
4789
|
+
sar_gt[i] = (1 / (ti[i] * (1 - f[i] / 4 * pi) ** 0.5)) * ((0 - 0 - sum(ar[:i])) / sum(ar) ** 2) - (1 / (ti[i] * (1 - f[i-1] / 4 * pi) ** 0.5)) * ((0 - 0 - sum(ar[:i-1])) / sum(ar) ** 2) - (1 / ti[i]) * (0 - ar[i]) / sum(ar) ** 2
|
|
4790
|
+
else:
|
|
4791
|
+
sar_lt[i] = (1 / (5.78 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (0 - 0)
|
|
4792
|
+
sar_eq[i] = (1 / (5.78 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - 0)
|
|
4793
|
+
sar_gt[i] = (1 / (5.78 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - sum(ar[i:]))
|
|
4794
|
+
if i == n - 1:
|
|
4795
|
+
sar_lt[i] = 0
|
|
4796
|
+
sar_eq[i] = 0
|
|
4797
|
+
sar_gt[i] = 0
|
|
4798
|
+
st[i] = - dr2[i] / ti[i]
|
|
4799
|
+
sdr2[i] = math.sqrt(sar_lt[i] ** 2 * sum(sar2[:i]) + sar_eq[i] ** 2 * sar2[i] + sar_gt[i] ** 2 * sum(sar2[i+1:]) + st[i] ** 2 * sti[i] ** 2)
|
|
4800
|
+
|
|
4801
|
+
# wt = np.abs(sdr2 / dr2)
|
|
4802
|
+
# wt = errcal(f, ti, ar, sar)
|
|
4803
|
+
|
|
4804
|
+
logdr2 = np.log(dr2) if ln else np.log10(dr2)
|
|
4805
|
+
#ee = 1 / np.log(10)
|
|
4806
|
+
ee = 0.4342944819
|
|
4807
|
+
wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) * ee
|
|
4808
|
+
#
|
|
4809
|
+
# print(f"{wt = }")
|
|
4810
|
+
# wt = errcal(f, ti, ar, sar)
|
|
4811
|
+
# print(f"{wt = }")
|
|
4812
|
+
|
|
4813
|
+
return dr2, logdr2, wt
|
|
4814
|
+
|
|
4815
|
+
|
|
4816
|
+
def dr2_cube(f, ti, ar, sar, ln=True):
|
|
4817
|
+
"""
|
|
4818
|
+
|
|
4819
|
+
Cube model
|
|
4820
|
+
|
|
4821
|
+
Parameters
|
|
4822
|
+
----------
|
|
4823
|
+
f
|
|
4824
|
+
ti
|
|
4825
|
+
ar
|
|
4826
|
+
sar
|
|
4827
|
+
ln
|
|
4828
|
+
|
|
4829
|
+
Returns
|
|
4830
|
+
-------
|
|
4831
|
+
|
|
4832
|
+
"""
|
|
4833
|
+
# Lovera
|
|
4834
|
+
f = np.array(f)
|
|
4835
|
+
ti = np.array(ti)
|
|
4836
|
+
n = min(len(f), len(ti))
|
|
4837
|
+
ar = np.array(ar)
|
|
4838
|
+
sar = np.array(sar)
|
|
4839
|
+
sar2 = sar ** 2
|
|
4840
|
+
ti = ti * 60 # in seconds
|
|
4841
|
+
sti = [90 for i in range(n)]
|
|
4842
|
+
pi = math.pi
|
|
4843
|
+
pi = 3.141592654
|
|
4844
|
+
|
|
4845
|
+
# sf = sqrt(b ** 2 * siga ** 2 + a ** 2 * sigb ** 2) / (a + b) ** 2
|
|
4846
|
+
# sf = [math.sqrt(sar[i + 1:].sum() ** 2 * (sar[:i + 1] ** 2).sum() + ar[:i + 1].sum() ** 2 * (sar[i + 1:] ** 2).sum()) / ar.sum() ** 2 for i in range(len(ar) - 1)]
|
|
4847
|
+
# sf.append(0)
|
|
4848
|
+
|
|
4849
|
+
f = np.where(f >= 1, 0.9999999999999999, f)
|
|
4850
|
+
|
|
4851
|
+
model = geometric_model(geo='cube')
|
|
4852
|
+
dtr2 = [model(bp=2)[1](fi) for fi in f]
|
|
4853
|
+
dtr2_1 = [model(bp=0)[1](fi) for fi in f]
|
|
4854
|
+
dtr2_2 = [model(bp=2)[1](fi) for fi in f]
|
|
4855
|
+
dtr2_1.insert(0, 0); dtr2_2.insert(0, 0)
|
|
4856
|
+
# dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
|
|
4857
|
+
dr2 = [((dtr2_1[i+1] - dtr2_1[i]) / ti[i]) if f[i] > 0.5 else ((dtr2_2[i+1] - dtr2_2[i]) / ti[i]) for i in range(len(f))]
|
|
4858
|
+
|
|
4859
|
+
# imp = 2
|
|
4860
|
+
# # imp = 1
|
|
4861
|
+
# dtr2 = [pi * (fi / 4) ** 2 if fi <= 0.5 else math.log((1 - fi) * pi ** 2 / 8) / (- pi ** 2) for fi in f]
|
|
4862
|
+
# dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] * imp ** 2 for i in range(len(dtr2))]
|
|
4863
|
+
# xlogd = [np.log10(i) for i in dr2]
|
|
4864
|
+
|
|
4865
|
+
sar_lt = np.zeros(n) # 偏导数
|
|
4866
|
+
sar_eq = np.zeros(n) # 偏导数
|
|
4867
|
+
sar_gt = np.zeros(n) # 偏导数
|
|
4868
|
+
st = np.zeros(n) # 偏导数
|
|
4869
|
+
sdr2 = np.zeros(n)
|
|
4870
|
+
for i in range(n):
|
|
4871
|
+
if i == 0:
|
|
4872
|
+
if f[i] <= 2:
|
|
4873
|
+
sar_lt[i] = 0
|
|
4874
|
+
sar_eq[i] = 0
|
|
4875
|
+
sar_gt[i] = 0
|
|
4876
|
+
else:
|
|
4877
|
+
sar_lt[i] = 0
|
|
4878
|
+
sar_eq[i] = (pi / (6 * ti[i]) * (f[i] - 1) ** (1 / 3) * (f[i] - 1) ** (- 2 / 3)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4879
|
+
sar_gt[i] = (pi / (6 * ti[i]) * (f[i] - 1) ** (1 / 3) * (f[i] - 1) ** (- 2 / 3)) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
|
|
4880
|
+
else:
|
|
4881
|
+
if f[i] <= 2:
|
|
4882
|
+
sar_lt[i] = 0
|
|
4883
|
+
sar_eq[i] = 0
|
|
4884
|
+
sar_gt[i] = 0
|
|
4885
|
+
else:
|
|
4886
|
+
sar_lt[i] = (pi / (6 * ti[i]) * (f[i] - 1) ** (1 / 3) * (f[i] - 1) ** (- 2 / 3)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - (pi / (6 * ti[i]) * (f[i-1] - 1) ** (1 / 3) * (f[i-1] - 1) ** (- 2 / 3)) * ((sum(ar) - ar[i-1] - sum(ar[:i-1])) / sum(ar) ** 2)
|
|
4887
|
+
sar_eq[i] = (pi / (6 * ti[i]) * (f[i] - 1) ** (1 / 3) * (f[i] - 1) ** (- 2 / 3)) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - (pi / (6 * ti[i]) * (f[i-1] - 1) ** (1 / 3) * (f[i-1] - 1) ** (- 2 / 3)) * ((0 - 0 - sum(ar[:i-1])) / sum(ar) ** 2)
|
|
4888
|
+
sar_gt[i] = (pi / (6 * ti[i]) * (f[i] - 1) ** (1 / 3) * (f[i] - 1) ** (- 2 / 3)) * ((0 - 0 - sum(ar[:i])) / sum(ar) ** 2) - (pi / (6 * ti[i]) * (f[i-1] - 1) ** (1 / 3) * (f[i-1] - 1) ** (- 2 / 3)) * ((0 - 0 - sum(ar[:i-1])) / sum(ar) ** 2)
|
|
4889
|
+
if i == n - 1:
|
|
4890
|
+
sar_lt[i] = 0
|
|
4891
|
+
sar_eq[i] = 0
|
|
4892
|
+
sar_gt[i] = 0
|
|
4893
|
+
st[i] = - dr2[i] / ti[i]
|
|
4894
|
+
sdr2[i] = math.sqrt(sar_lt[i] ** 2 * sum(sar2[:i]) + sar_eq[i] ** 2 * sar2[i] + sar_gt[i] ** 2 * sum(sar2[i+1:]) + st[i] ** 2 * sti[i] ** 2)
|
|
4895
|
+
|
|
4896
|
+
# wt = np.abs(sdr2 / dr2)
|
|
4897
|
+
# wt = errcal(f, ti, ar, sar)
|
|
4898
|
+
|
|
4899
|
+
logdr2 = np.log(dr2) if ln else np.log10(dr2)
|
|
4900
|
+
#ee = 1 / np.log(10)
|
|
4901
|
+
ee = 0.4342944819
|
|
4902
|
+
wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) * ee
|
|
4903
|
+
#
|
|
4904
|
+
# print(f"{wt = }")
|
|
4905
|
+
# wt = errcal(f, ti, ar, sar)
|
|
4906
|
+
# print(f"{wt = }")
|
|
4907
|
+
|
|
4908
|
+
|
|
4909
|
+
return dr2, logdr2, wt
|
|
4910
|
+
|
|
4911
|
+
|
|
4672
4912
|
def dr2_thern(f, ti, ar, sar, ln=True):
|
|
4673
4913
|
"""
|
|
4674
4914
|
|
|
@@ -4716,11 +4956,16 @@ def dr2_thern(f, ti, ar, sar, ln=True):
|
|
|
4716
4956
|
wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) * ee
|
|
4717
4957
|
|
|
4718
4958
|
# dr2, xlogd, wt = dr2_sphere(f, ti, ar, sar, ln, bp=0.85)
|
|
4719
|
-
r2 = 0.
|
|
4959
|
+
r2 = (100 * 0.0001) ** 2 # 100µm to cm
|
|
4720
4960
|
d = dr2 * r2
|
|
4721
4961
|
logd = np.log(d)
|
|
4962
|
+
logdr2 = np.log(dr2)
|
|
4963
|
+
|
|
4964
|
+
print(dr2)
|
|
4965
|
+
print(d)
|
|
4722
4966
|
|
|
4723
4967
|
return d, logd, wt
|
|
4968
|
+
# return dr2, logdr2, wt
|
|
4724
4969
|
|
|
4725
4970
|
|
|
4726
4971
|
def dr2_yang(f, ti, ar, sar, ln=True):
|
|
@@ -4839,6 +5084,10 @@ def geometric_model(geo: str = "sphere"):
|
|
|
4839
5084
|
return sphere
|
|
4840
5085
|
if geo.lower()[:3] == 'plane'[:3]:
|
|
4841
5086
|
return plane
|
|
5087
|
+
if geo.lower()[:3] == 'cylinder'[:3]:
|
|
5088
|
+
return cylinder
|
|
5089
|
+
if geo.lower()[:3] == 'cube'[:3]:
|
|
5090
|
+
return cube
|
|
4842
5091
|
|
|
4843
5092
|
|
|
4844
5093
|
def sphere(bp=0.85):
|
|
@@ -4900,3 +5149,63 @@ def plane(bp=0.6):
|
|
|
4900
5149
|
|
|
4901
5150
|
return func, inv_func
|
|
4902
5151
|
|
|
5152
|
+
|
|
5153
|
+
def cylinder(bp=0.6):
|
|
5154
|
+
"""
|
|
5155
|
+
Parameters
|
|
5156
|
+
----------
|
|
5157
|
+
bp: float, breakpoint
|
|
5158
|
+
|
|
5159
|
+
Returns
|
|
5160
|
+
-------
|
|
5161
|
+
|
|
5162
|
+
"""
|
|
5163
|
+
pi = math.pi
|
|
5164
|
+
pi = 3.141592654
|
|
5165
|
+
|
|
5166
|
+
def func(dtr2):
|
|
5167
|
+
f = 1 - (9 / 13) * math.exp(- 5.78 * dtr2)
|
|
5168
|
+
f2 = (4 / pi ** 1.5) * dtr2 ** 0.5 - dtr2
|
|
5169
|
+
return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
|
|
5170
|
+
|
|
5171
|
+
def inv_func(f):
|
|
5172
|
+
if 0 <= f < bp:
|
|
5173
|
+
dtr2 = (1 - math.sqrt(1 - pi * f / 4)) * 8 / pi - f
|
|
5174
|
+
elif f < 1:
|
|
5175
|
+
dtr2 = math.log((1 - f) * 13 / 9) / (- 5.78)
|
|
5176
|
+
else:
|
|
5177
|
+
dtr2 = np.nan
|
|
5178
|
+
return dtr2
|
|
5179
|
+
|
|
5180
|
+
return func, inv_func
|
|
5181
|
+
|
|
5182
|
+
|
|
5183
|
+
def cube(bp=2):
|
|
5184
|
+
"""
|
|
5185
|
+
Parameters
|
|
5186
|
+
----------
|
|
5187
|
+
bp: float, breakpoint
|
|
5188
|
+
|
|
5189
|
+
Returns
|
|
5190
|
+
-------
|
|
5191
|
+
|
|
5192
|
+
"""
|
|
5193
|
+
pi = math.pi
|
|
5194
|
+
pi = 3.141592654
|
|
5195
|
+
|
|
5196
|
+
def func(dtr2):
|
|
5197
|
+
f = np.nan
|
|
5198
|
+
f2 = 6 * (dtr2 / pi) ** 0.5 - 12 * (dtr2 / pi) + 8 * (dtr2 / pi) ** 1.5 # 0 < f <= 0.97
|
|
5199
|
+
return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
|
|
5200
|
+
|
|
5201
|
+
def inv_func(f):
|
|
5202
|
+
if 0 <= f < bp:
|
|
5203
|
+
dtr2 = (pi * ((f - 1) ** (1 / 3) + 1) ** 2) / 4
|
|
5204
|
+
elif f < 1:
|
|
5205
|
+
dtr2 = np.nan
|
|
5206
|
+
else:
|
|
5207
|
+
dtr2 = np.nan
|
|
5208
|
+
return dtr2
|
|
5209
|
+
|
|
5210
|
+
return func, inv_func
|
|
5211
|
+
|