ararpy 0.1.12__py3-none-any.whl → 0.1.13__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.
@@ -14,27 +14,28 @@
14
14
 
15
15
  import os
16
16
  import shutil
17
- import string
18
-
19
17
  import numpy as np
20
- from .sample import Sample
21
- import ararpy as ap
22
- import matplotlib as mpl
23
- import scipy.stats as stats
18
+ np.set_printoptions(precision=18, threshold=10000, linewidth=np.inf)
24
19
  import math
20
+ import random
21
+ import scipy.stats as stats
22
+ from scipy.interpolate import griddata
25
23
  from scipy.special import comb
26
24
  from datetime import datetime as dt
27
25
  import re
28
26
  import time
29
27
  import ctypes
30
28
  import gc
31
- import random
32
-
29
+ import matplotlib as mpl
33
30
  mpl.use('TkAgg')
34
31
  import matplotlib.pyplot as plt
35
32
 
36
- np.set_printoptions(precision=18, threshold=10000, linewidth=np.inf)
33
+ from .sample import Sample
34
+ from .. import calc
35
+ # import ararpy as ap
36
+
37
37
 
38
+ import numpy as np
38
39
 
39
40
  def is_number(s):
40
41
  try:
@@ -286,7 +287,7 @@ class DiffArrmultiFunc(DiffSample):
286
287
  amax = 0.
287
288
  mct = 0
288
289
  chisq = 1.0e30
289
-
290
+ print(f"{mct = } > 30, continue!!!")
290
291
  continue
291
292
 
292
293
  nc = 0
@@ -3321,11 +3322,11 @@ class DiffDraw(DiffSample):
3321
3322
 
3322
3323
  def get_plot_data(self):
3323
3324
 
3324
- k1 = [x, y1, y2] = ap.calc.spectra.get_data(self.age, self.sage, [i * 100 for i in self.f], cumulative=True)
3325
+ k1 = [x, y1, y2] = calc.spectra.get_data(self.age, self.sage, [i * 100 for i in self.f], cumulative=True)
3325
3326
  k2 = []
3326
3327
  k3 = []
3327
3328
  for cyc in range(self.mcyc):
3328
- x, y1, y2 = ap.calc.spectra.get_data(
3329
+ x, y1, y2 = calc.spectra.get_data(
3329
3330
  self.mage[cyc, :], np.zeros(self.mage[cyc, :].size), self.mf[cyc, :], cumulative=True)
3330
3331
  k2.append([x, y1, y2])
3331
3332
  k3.append([self.mcage[cyc, :], self.mcte[cyc, :]])
@@ -3355,7 +3356,7 @@ class DiffDraw(DiffSample):
3355
3356
  axs.plot(data[0][0], data[0][1], c='blue')
3356
3357
 
3357
3358
  for cyc in range(self.mcyc):
3358
- # x, y1, y2 = ap.calc.spectra.get_data(self.mage[cyc, :], np.zeros(self.mage[cyc, :].size), self.mf[cyc, :],
3359
+ # x, y1, y2 = calc.spectra.get_data(self.mage[cyc, :], np.zeros(self.mage[cyc, :].size), self.mf[cyc, :],
3359
3360
  # cumulative=True)
3360
3361
  axs.plot(data[1][cyc][0], data[1][cyc][2], c='red')
3361
3362
  axs.plot(data[1][cyc][0], data[1][cyc][1], c='red')
@@ -3501,25 +3502,25 @@ class InsideTemperatureCalibration:
3501
3502
  file_out.writelines(f"{seq.SP = }, {seq.MaxTime = }, conf MaxTime = {max(x_conf)} \n")
3502
3503
  file2_out.writelines(f"SP = {seq.SP}, MaxTime = {max(x_conf)} \n")
3503
3504
 
3504
- beta = ap.calc.regression.polynomial(y1_conf, x_conf, degree=degree)[5]
3505
+ beta = calc.regression.polynomial(y1_conf, x_conf, degree=degree)[5]
3505
3506
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3506
3507
  c='blue')
3507
3508
  file_out.writelines("BetaY1\t" + "\t".join([str(i) for i in beta]) + "\n")
3508
3509
  file2_out.writelines("\t".join([str(i) for i in beta]) + "\n")
3509
3510
 
3510
- beta = ap.calc.regression.polynomial(y2_conf, x_conf, degree=degree)[5]
3511
+ beta = calc.regression.polynomial(y2_conf, x_conf, degree=degree)[5]
3511
3512
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3512
3513
  c='blue')
3513
3514
  file_out.writelines("BetaY2\t" + "\t".join([str(i) for i in beta]) + "\n")
3514
- file2_out.writelines("\t".join([str(i) for i in beta]) + "\n")
3515
+ file2_out.writelines("\t".join([str(i) for fi in beta]) + "\n")
3515
3516
 
3516
- beta = ap.calc.regression.polynomial(y3_conf, x_conf, degree=degree)[5]
3517
+ beta = calc.regression.polynomial(y3_conf, x_conf, degree=degree)[5]
3517
3518
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3518
3519
  c='blue')
3519
3520
  file_out.writelines("BetaY3\t" + "\t".join([str(i) for i in beta]) + "\n")
3520
3521
  file2_out.writelines("\t".join([str(i) for i in beta]) + "\n")
3521
3522
 
3522
- beta = ap.calc.regression.polynomial(y4_conf, x_conf, degree=degree)[5]
3523
+ beta = calc.regression.polynomial(y4_conf, x_conf, degree=degree)[5]
3523
3524
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3524
3525
  c='blue')
3525
3526
  file_out.writelines("BetaY4\t" + "\t".join([str(i) for i in beta]) + "\n")
@@ -3776,7 +3777,8 @@ class SmpTemperatureCalibration:
3776
3777
  continue
3777
3778
 
3778
3779
  dt_str, helix, system, service, scripting, userinfo, message1, message2 = line.split("|")
3779
- dt_utc = dt_str[:26] + dt_str[27:]
3780
+ # dt_str likes 2024-10-23T19:58:59.6662140+02:00, it is too long for datetime parser
3781
+ dt_utc = dt_str[:26] + dt_str[27:] # dt_utc will be like 2024-10-23T19:58:59.666214+02:00
3780
3782
  dt_utc = dt.fromisoformat(str(dt_utc)).timestamp()
3781
3783
 
3782
3784
  if not (self.start_time <= dt_utc <= self.end_time):
@@ -4117,7 +4119,7 @@ class Ran1Generator:
4117
4119
 
4118
4120
  self.count += 1
4119
4121
 
4120
- print(f"{ran1 = }, {self.count = }")
4122
+ # print(f"{ran1 = }, {self.count = }")
4121
4123
 
4122
4124
  return ran1
4123
4125
 
@@ -4443,19 +4445,15 @@ def kahan_sum(input):
4443
4445
  return sum
4444
4446
 
4445
4447
 
4446
- def get_random_index(length: int = 7):
4447
- return ''.join(random.choices(string.digits, k=length))
4448
-
4449
-
4450
- def get_random_dir(path: str, length=7, random_index = ""):
4448
+ def get_random_dir(path: str, length=7, random_index=""):
4451
4449
  try:
4450
+ exist_ok = random_index != ""
4452
4451
  if random_index == "":
4453
- random_index = get_random_index(length=length)
4452
+ random_index = calc.basic.get_random_digits(length=length)
4454
4453
  destination_folder = os.path.join(path, random_index)
4455
- os.makedirs(destination_folder, exist_ok=False)
4454
+ os.makedirs(destination_folder, exist_ok=exist_ok)
4456
4455
  return destination_folder, random_index
4457
4456
  except FileExistsError:
4458
- random_index = ""
4459
4457
  return get_random_dir(path=path, length=length)
4460
4458
 
4461
4459
 
@@ -4473,7 +4471,7 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
4473
4471
  agemon.ni = len(data)
4474
4472
  agemon.nit = agemon.ni
4475
4473
  agemon.max_plateau_age = max_age
4476
- data = ap.calc.arr.transpose(data)
4474
+ data = calc.arr.transpose(data)
4477
4475
  agemon.telab = [i + 273.15 for i in data[3]]
4478
4476
  agemon.tilab = [i / 5.256E+11 for i in data[4]] # 1 Ma = 525600000000 minutes
4479
4477
  for i in range(agemon.nit):
@@ -4555,9 +4553,12 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
4555
4553
  return
4556
4554
 
4557
4555
 
4558
- def dr2_popov(f, ti):
4556
+ def dr2_popov(f, ti, ar, sar, ln=True):
4559
4557
  """
4560
4558
 
4559
+ Used in Popov 2020. It is related to the sphere model.
4560
+ The calculation of Dr2 is from sphere model. Errors are carefully propagated.
4561
+
4561
4562
  Parameters
4562
4563
  ----------
4563
4564
  f: cumulative 39Ar released, array
@@ -4573,47 +4574,86 @@ def dr2_popov(f, ti):
4573
4574
  # =IF(M5<85,( 2/PI()^2*( SQRT(PI()^2-(PI()^3)*M4/100/3)-SQRT(PI()^2-(PI()^3)*M5/100/3)) +M4/100/3-M5/100/3 )/D5/60, LN((1-M4/100)/(1-M5/100))/PI()^2/D5/60)
4574
4575
 
4575
4576
  f = np.array(f)
4576
- ti = np.array(ti)
4577
+ ti = np.array(ti) # in minute
4578
+ ar = np.array(ar)
4579
+ sar = np.array(sar)
4580
+ sar2 = sar ** 2
4577
4581
  n = min(len(f), len(ti))
4578
4582
  ti = ti * 60 # in seconds
4583
+ sti = [0.5 * 60 for i in range(n)]
4579
4584
  pi = math.pi
4580
- pi = 3.141592654
4585
+ # pi = 3.141592654
4581
4586
  dr2 = np.zeros(n)
4582
4587
 
4583
- if f[-1] >= 1:
4584
- f[-1] = 0.99999999
4585
-
4586
- # Popov 2020
4587
- a, b = 0, 0
4588
- for i in range(len(f)):
4588
+ f = np.where(f >= 1, 0.9999999999999999, f)
4589
+ sf = [math.sqrt((sum(ar[i+1:]) / sum(ar) ** 2) ** 2 * sum(sar[:i+1] ** 2) + (sum(ar[:i+1]) / sum(ar) ** 2) ** 2 * sum(sar[i+1:] ** 2)) for i in range(n)]
4590
+
4591
+ # Popov 2020, sphere model
4592
+ model = geometric_model(geo='sphere')
4593
+ dtr2 = [model(bp=0.85)[1](fi) for fi in f]
4594
+ dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
4595
+ dr2[-1] = math.log((1 - f[-2]) / (1 - f[-1])) / pi ** 2 / ti[-1]
4596
+
4597
+ # =IF(M5<85,((-SUM(H5:$H$35)/3/SUM($H$4:$H$35)^2/SQRT(1-PI()/3*SUM($H$4:H4)/SUM($H$4:$H$35))/(D5*60)+SUM(H6:$H$35)/3/SUM($H$4:$H$35)^2/SQRT(1-PI()/3*SUM($H$4:H5)/SUM($H$4:$H$35))/(D5*60)+H5/3/SUM($H$4:$H$35)^2/(D5*60))^2),0)
4598
+ sar_lt = np.zeros(n) # 偏导数
4599
+ sar_eq = np.zeros(n) # 偏导数
4600
+ sar_gt = np.zeros(n) # 偏导数
4601
+ st = np.zeros(n) # 偏导数
4602
+ sdr2 = np.zeros(n)
4603
+ for i in range(n):
4589
4604
  if i == 0:
4590
- if f[i] < 85:
4591
- a = 2 / pi ** 2 * math.sqrt(pi ** 2 - (pi ** 3) * f[i] / 3) + f[i] / 3
4592
- dr2[i] = ((-6 / (pi ** 1.5) + math.sqrt(36 / pi ** 3 - 4 * f[i] * 3 / pi ** 2)) / (
4593
- -6 / pi ** 2)) ** 2 / pi ** 2 / ti[i]
4605
+ if f[i] < 0.85:
4606
+ sar_lt[i] = 0
4607
+ sar_eq[i] = ((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4608
+ sar_gt[i] = ((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4594
4609
  else:
4595
- a = 1 - f[i]
4596
- dr2[i] = (math.log((f[i] - 1) / (-6 / pi ** 2)) / pi ** 2) / ti[i]
4610
+ sar_lt[i] = 0
4611
+ sar_eq[i] = (1 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4612
+ sar_gt[i] = (1 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4597
4613
  else:
4598
- if f[i] < 85:
4599
- a = 2 / pi ** 2 * math.sqrt(pi ** 2 - (pi ** 3) * f[i] / 3) + f[i] / 3
4600
- dr2[i] = (b - a) / ti[i]
4614
+ if f[i] < 0.85:
4615
+ sar_lt[i] = ((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - ((1 / math.sqrt(1 - pi * f[i-1] / 3) - 1) / (3 * ti[i])) * ((sum(ar) - ar[i-1] - sum(ar[:i-1])) / sum(ar) ** 2)
4616
+ sar_eq[i] = ((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - ((1 / math.sqrt(1 - pi * f[i-1] / 3) - 1) / (3 * ti[i])) * ((0 - ar[i-1] - sum(ar[:i-1])) / sum(ar) ** 2)
4617
+ sar_gt[i] = ((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2) - ((1 / math.sqrt(1 - pi * f[i-1] / 3) - 1) / (3 * ti[i])) * ((0 - ar[i-1] - sum(ar[:i-1])) / sum(ar) ** 2)
4601
4618
  else:
4602
- dr2[i] = math.log((1 - f[i - 1]) / (1 - f[i])) / pi ** 2 / ti[i]
4603
- b = a
4619
+ sar_lt[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (0 - 0)
4620
+ sar_eq[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - 0)
4621
+ sar_gt[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - sum(ar[i:]))
4622
+ st[i] = - dr2[i] / ti[i]
4623
+ 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)
4604
4624
 
4605
- print(f"popov {dr2 = }")
4625
+ logdr2 = np.log(dr2) if ln else np.log10(dr2)
4626
+ wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) / np.log(10)
4606
4627
 
4607
- return dr2, np.log(dr2)
4628
+ return dtr2, logdr2, wt
4608
4629
 
4609
4630
 
4610
- def dr2_lovera(f, ti, ar, sar):
4631
+ def dr2_lovera(f, ti, ar, sar, ln=True):
4632
+ """
4633
+
4634
+ Plane sheet model
4635
+
4636
+ Parameters
4637
+ ----------
4638
+ f
4639
+ ti
4640
+ ar
4641
+ sar
4642
+ ln
4643
+
4644
+ Returns
4645
+ -------
4646
+
4647
+ """
4611
4648
  # Lovera
4612
4649
  f = np.array(f)
4613
4650
  ti = np.array(ti)
4614
- # ar = np.array(ar)
4615
- # sar = np.array(sar)
4651
+ n = min(len(f), len(ti))
4652
+ ar = np.array(ar)
4653
+ sar = np.array(sar)
4654
+ sar2 = sar ** 2
4616
4655
  ti = ti * 60 # in seconds
4656
+ sti = [90 for i in range(n)]
4617
4657
  pi = math.pi
4618
4658
  pi = 3.141592654
4619
4659
 
@@ -4623,28 +4663,76 @@ def dr2_lovera(f, ti, ar, sar):
4623
4663
 
4624
4664
  f = np.where(f >= 1, 0.9999999999999999, f)
4625
4665
 
4626
- imp = 2
4627
- # imp = 1
4628
- dtr2 = [pi * (fi / 4) ** 2 if fi <= 0.5 else math.log((1 - fi) * pi ** 2 / 8) / (- pi ** 2) for fi in f]
4629
- dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] * imp ** 2 for i in range(len(dtr2))]
4630
- xlogd = [np.log10(i) for i in dr2]
4666
+ model = geometric_model(geo='plane')
4667
+ dtr2 = [model(bp=0.5)[1](fi) for fi in f]
4668
+ dtr2_1 = [model(bp=0)[1](fi) for fi in f]
4669
+ dtr2_2 = [model(bp=2)[1](fi) for fi in f]
4670
+ dtr2_1.insert(0, 0); dtr2_2.insert(0, 0)
4671
+ # dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
4672
+ 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))]
4673
+
4674
+ # imp = 2
4675
+ # # imp = 1
4676
+ # dtr2 = [pi * (fi / 4) ** 2 if fi <= 0.5 else math.log((1 - fi) * pi ** 2 / 8) / (- pi ** 2) for fi in f]
4677
+ # dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] * imp ** 2 for i in range(len(dtr2))]
4678
+ # xlogd = [np.log10(i) for i in dr2]
4679
+
4680
+ sar_lt = np.zeros(n) # 偏导数
4681
+ sar_eq = np.zeros(n) # 偏导数
4682
+ sar_gt = np.zeros(n) # 偏导数
4683
+ st = np.zeros(n) # 偏导数
4684
+ sdr2 = np.zeros(n)
4685
+ for i in range(n):
4686
+ if i == 0:
4687
+ if f[i] <= 0.5:
4688
+ sar_lt[i] = 0
4689
+ sar_eq[i] = pi / (4 * ti[i]) * ((sum(ar[:i+1]) * 2 - 0) * sum(ar) ** 2 - (sum(ar[:i+1]) ** 2 - sum(ar[:i]) ** 2) * 2 * sum(ar)) / (sum(ar) ** 4)
4690
+ sar_gt[i] = pi / (4 * ti[i]) * ((0 - 0) * sum(ar) ** 2 - (sum(ar[:i+1]) ** 2 - sum(ar[:i]) ** 2) * 2 * sum(ar)) / (sum(ar) ** 4)
4691
+ else:
4692
+ sar_lt[i] = 0
4693
+ sar_eq[i] = (4 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4694
+ sar_gt[i] = (4 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4695
+ else:
4696
+ if f[i] <= 0.5:
4697
+ sar_lt[i] = pi / (4 * ti[i]) * ((sum(ar[:i+1]) * 2 - sum(ar[:i]) * 2) * sum(ar) ** 2 - (sum(ar[:i+1]) ** 2 - sum(ar[:i]) ** 2) * 2 * sum(ar)) / (sum(ar) ** 4)
4698
+ sar_eq[i] = pi / (4 * ti[i]) * ((sum(ar[:i+1]) * 2 - 0) * sum(ar) ** 2 - (sum(ar[:i+1]) ** 2 - sum(ar[:i]) ** 2) * 2 * sum(ar)) / (sum(ar) ** 4)
4699
+ sar_gt[i] = pi / (4 * ti[i]) * ((0 - 0) * sum(ar) ** 2 - (sum(ar[:i+1]) ** 2 - sum(ar[:i]) ** 2) * 2 * sum(ar)) / (sum(ar) ** 4)
4700
+ else:
4701
+ sar_lt[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (0 - 0)
4702
+ sar_eq[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - 0)
4703
+ sar_gt[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - sum(ar[i:]))
4704
+ if i == n - 1:
4705
+ sar_lt[i] = 0
4706
+ sar_eq[i] = 0
4707
+ sar_gt[i] = 0
4708
+ st[i] = - dr2[i] / ti[i]
4709
+ 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)
4710
+
4711
+ # wt = np.abs(sdr2 / dr2)
4712
+ # wt = errcal(f, ti, ar, sar)
4713
+
4714
+ xlogd = logdr2 = np.log(dr2) if ln else np.log10(dr2)
4715
+ #ee = 1 / np.log(10)
4716
+ ee = 0.4342944819
4717
+ wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) * ee
4718
+ #
4719
+ # print(f"{wt = }")
4720
+ # wt = errcal(f, ti, ar, sar)
4721
+ # print(f"{wt = }")
4631
4722
 
4632
- wt = errcal(f, ti, ar, sar)
4723
+ """
4724
+ ### errcal(f, ti, ar, sar)和这里的计算有非常少的差异,但这样的差异足以导致迭代次数变化,但不一定导致agemon结果有大的差异
4725
+ """
4633
4726
 
4634
4727
  return dr2, xlogd, wt
4635
4728
 
4636
4729
 
4637
- def dr2_yang(f, ti, ar, sar):
4730
+ def dr2_yang(f, ti, ar, sar, ln=True):
4638
4731
  """
4639
4732
 
4640
- if i == 0:
4641
- dr2[i] = _dr2(f[i]) / ti[i]
4642
- else:
4643
- dr2[i] = _dr2((f[i] - f[i - 1]) / (1 - f[i - 1])) / ti[i]
4644
-
4645
4733
  Parameters
4646
4734
  ----------
4647
- f: array NOTE:这里的 f 既不是释放百分数也不是累积百分数,而是各个阶段释放量占其及后续所有气体的分数,即占释放前的比例
4735
+ f:
4648
4736
  ti
4649
4737
 
4650
4738
  Returns
@@ -4653,40 +4741,31 @@ def dr2_yang(f, ti, ar, sar):
4653
4741
  """
4654
4742
  f = np.array(f)
4655
4743
  ti = np.array(ti)
4744
+ ar = np.array(ar)
4745
+ sar = np.array(sar)
4746
+ sar2 = sar ** 2
4656
4747
  n = min(len(f), len(ti))
4657
4748
  ti = ti * 60 # in seconds
4658
- sti = 5.
4749
+ sti = [5 for i in range(n)]
4659
4750
  pi = math.pi
4660
4751
  pi = 3.141592654
4661
4752
  ee = 0.4342944819
4662
- dr2 = np.zeros(n)
4663
- sdr2 = np.zeros(n)
4664
4753
 
4754
+ f = np.array([ar[i] / sum(ar[i:]) for i in range(n)])
4755
+ sf = [math.sqrt(sar[i] ** 2 * sum(ar[i+1:]) ** 2 / sum(ar[i:]) ** 4 + sum(sar[i+1:] ** 2) * ar[i] ** 2 / sum(ar[i:]) ** 4) for i in range(n)]
4665
4756
  f = np.where(f >= 1, 0.9999999999999999, f)
4757
+ # # print(f"{f = }")
4758
+ # f = [(f[i] - (f[i-1] if i > 0 else 0)) / (1 - (f[i-1] if i > 0 else 0)) for i in range(n)]
4666
4759
 
4667
- def _dr2(_fi):
4668
- # return: dr2, dy/df
4669
- if _fi <= 0.85:
4670
- return (1 - math.sqrt(1 - pi * _fi / 3)) ** 2 / pi, 1 / (3 * math.sqrt(1 - pi * _fi / 3)) - 1 / 3
4671
- else:
4672
- return math.log((1 - _fi) / (6 / pi ** 2)) / - (pi ** 2), 1 / (pi ** 2 * (1 - _fi))
4673
-
4674
- for i in range(n):
4675
- dtr2, d = _dr2((f[i] - (f[i-1] if i > 0 else 0)) / (1 - (f[i-1] if i > 0 else 0)))
4676
- # sf 中 f = (f[i] - f[i - 1]) / (1 - f[i - 1])
4677
- sf = sum([ar[i] ** 2 * sar[j] ** 2 / sum(ar[i:]) ** 4 for j in range(i+1, n)]) + sum(ar[i+1:]) ** 2 * sar[i] ** 2 / sum(ar[i:]) ** 4
4678
- sdtr2 = math.sqrt(d ** 2 * sf)
4679
- dr2[i] = dtr2 / ti[i]
4680
- sdr2[i] = ap.calc.err.div((dtr2, sdtr2), (ti[i], sti))
4681
-
4682
- xlogd = np.log(dr2)
4683
- sxlogd = np.abs(sdr2 / dr2)
4760
+ model = geometric_model(geo='sphere')
4761
+ dtr2 = np.array([model(bp=0.85)[1](fi) for fi in f])
4762
+ sdtr2 = [abs((((1 / math.sqrt(1 - pi * f[i] / 3) - 1) / (3 * ti[i])) * sf[i]) if f[i] < 0.85 else (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * sf[i]) for i in range(n)]
4763
+ dr2 = dtr2 / ti
4764
+ sdr2 = np.array([math.sqrt((1 / ti[i]) ** 2 * sdtr2[i] ** 2 + dtr2[i] ** 2 / ti[i] ** 4 * sti[i] ** 2) for i in range(n)])
4684
4765
 
4685
- print(f"yang {dr2 = }")
4686
- print(f"yang {xlogd = }")
4687
- print(f"yang {sxlogd = }")
4688
-
4689
- return dr2, xlogd, sxlogd
4766
+ xlogd = logdr2 = np.log(dr2) if ln else np.log10(dr2)
4767
+ wt = sxlogd = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) / np.log(10)
4768
+ return dr2, xlogd, wt
4690
4769
 
4691
4770
 
4692
4771
  def errcal(f, ti, ar, sar):
@@ -4745,25 +4824,83 @@ def errcal(f, ti, ar, sar):
4745
4824
 
4746
4825
  print(f"lovera {wt = }")
4747
4826
 
4827
+ return wt
4748
4828
 
4749
- ## 下面是我重新改写 计算的 与lovera的结果接近但不一致
4750
4829
 
4751
- # a39 = np.insert(a39, 0, 0)
4752
- # sig39 = np.insert(sig39, 0, 0)
4753
- #
4754
- # wt = []
4755
- # for i in range(0, ni):
4756
- #
4757
- # if f[i + 1] <= 0.5:
4758
- # sigt = (sigt0 / ti[i]) ** 2
4759
- # fp = (f[i + 1] + f[i])
4760
- # a = sig39[i + 1] / a39[i + 1]
4761
- # wt.append(ee * (sigt + 4 * (a ** 2 - 2 * a / a39.sum() + sigat) / (a39.sum() * fp) ** 2) ** 0.5)
4762
- # else:
4763
- # sigt = (sigt0 / ti[i]) ** 2
4764
- # sigf = (a39[i + 1] ** 2 / a39[i + 2:].sum() ** 2 * sig39[i + 2:].sum() ** 2 + sig39[i + 1] ** 2) / a39[i + 1:].sum() ** 2
4765
- # wt.append(ee * (sigt + (1 / math.log((1 - f[i + 1]) / (1 - f[i]))) ** 2 * sigf) ** 0.5)
4766
- #
4767
- # print(f"new function {wt = }")
4830
+ def geometric_model(geo: str = "sphere"):
4831
+ """
4832
+
4833
+ Parameters
4834
+ ----------
4835
+ geo: str, sphere | cylinder | plane | cube
4836
+ b
4837
+
4838
+ Returns
4839
+ -------
4840
+
4841
+ """
4842
+ if geo.lower()[:3] == 'sphere'[:3]:
4843
+ return sphere
4844
+ if geo.lower()[:3] == 'plane'[:3]:
4845
+ return plane
4846
+
4847
+
4848
+ def sphere(bp=0.85):
4849
+ """
4850
+ Parameters
4851
+ ----------
4852
+ bp: float, breakpoint
4853
+
4854
+ Returns
4855
+ -------
4856
+
4857
+ """
4858
+ pi = math.pi
4859
+ pi = 3.141592654
4860
+
4861
+ def func(dtr2):
4862
+ f = 1 - (6 / pi ** 2) * math.exp(-1 * pi ** 2 * dtr2)
4863
+ f2 = (6 / pi ** 1.5) * (pi ** 2 * dtr2) ** 0.5 - (3 / pi ** 2) * (pi ** 2 * dtr2)
4864
+ return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
4865
+
4866
+ def inv_func(f):
4867
+ if 0 <= f < bp:
4868
+ dtr2 = (1 - math.sqrt(1 - pi * f / 3)) ** 2 / pi
4869
+ elif f < 1:
4870
+ dtr2 = - math.log((1 - f) * pi ** 2 / 6) / pi ** 2
4871
+ else:
4872
+ dtr2 = np.nan
4873
+ return dtr2
4874
+
4875
+ return func, inv_func
4876
+
4877
+
4878
+ def plane(bp=0.6):
4879
+ """
4880
+ Parameters
4881
+ ----------
4882
+ bp: float, breakpoint
4883
+
4884
+ Returns
4885
+ -------
4886
+
4887
+ """
4888
+ pi = math.pi
4889
+ pi = 3.141592654
4890
+
4891
+ def func(dtr2):
4892
+ f = 1 - (8 / pi ** 2) * math.exp(- pi ** 2 * dtr2 / 4)
4893
+ f2 = 2 * math.sqrt(dtr2 / pi)
4894
+ return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
4895
+
4896
+ def inv_func(f):
4897
+ if 0 <= f < bp:
4898
+ dtr2 = pi * f ** 2 / 4
4899
+ elif f < 1:
4900
+ dtr2 = 4 * math.log((1 - f) * pi ** 2 / 8) / (- pi ** 2)
4901
+ else:
4902
+ dtr2 = np.nan
4903
+ return dtr2
4904
+
4905
+ return func, inv_func
4768
4906
 
4769
- return wt