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.
Files changed (41) hide show
  1. ararpy/Example - Check arr.py +52 -0
  2. ararpy/Example - Granite Cooling History.py +411 -0
  3. ararpy/Example - Plot temperature calibration.py +291 -0
  4. ararpy/Example - Show MDD results.py +561 -0
  5. ararpy/Example - Show all Kfs age spectra.py +344 -0
  6. ararpy/Example - Show random walk results.py +363 -0
  7. ararpy/Example - Tc calculation.py +437 -0
  8. ararpy/__init__.py +3 -4
  9. ararpy/calc/age.py +34 -36
  10. ararpy/calc/arr.py +0 -20
  11. ararpy/calc/basic.py +26 -3
  12. ararpy/calc/corr.py +131 -85
  13. ararpy/calc/jvalue.py +7 -5
  14. ararpy/calc/plot.py +1 -2
  15. ararpy/calc/raw_funcs.py +41 -2
  16. ararpy/calc/regression.py +224 -132
  17. ararpy/files/arr_file.py +2 -1
  18. ararpy/files/basic.py +0 -22
  19. ararpy/files/calc_file.py +107 -84
  20. ararpy/files/raw_file.py +242 -229
  21. ararpy/smp/basic.py +133 -34
  22. ararpy/smp/calculation.py +6 -6
  23. ararpy/smp/corr.py +339 -153
  24. ararpy/smp/diffusion_funcs.py +345 -36
  25. ararpy/smp/export.py +247 -129
  26. ararpy/smp/info.py +2 -2
  27. ararpy/smp/initial.py +93 -45
  28. ararpy/smp/json.py +2 -2
  29. ararpy/smp/plots.py +144 -164
  30. ararpy/smp/raw.py +11 -15
  31. ararpy/smp/sample.py +222 -181
  32. ararpy/smp/style.py +26 -7
  33. ararpy/smp/table.py +42 -33
  34. ararpy/thermo/atomic_level_random_walk.py +56 -48
  35. ararpy/thermo/basic.py +2 -2
  36. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/METADATA +10 -1
  37. ararpy-0.2.2.dist-info/RECORD +73 -0
  38. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/WHEEL +1 -1
  39. ararpy-0.1.199.dist-info/RECORD +0 -66
  40. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/licenses/LICENSE +0 -0
  41. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/top_level.txt +0 -0
@@ -56,7 +56,10 @@ class DiffSample:
56
56
 
57
57
  if smp is not None:
58
58
  self.smp = smp
59
- self.sname = self.smp.name()
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', False)
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] > 1373:
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 = 8
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.get_random_digits(length=length)
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
- # print(f"{xs = }")
4446
- # print(f"{age = }")
4447
- # print(f"{sig = }")
4448
- # print(f"{e = }")
4449
- # print(f"{d0 = }")
4450
- # print(f"{vc = }")
4451
- # print(f"{nsts = }")
4452
- # print(f"{temp = }")
4453
- # print(f"{heating_time = }")
4454
- # print(f"{kk = }")
4455
- # print(f"{max_age = }")
4456
- # print(f"{nsteps = }")
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.01 ** 2
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
+