ararpy 0.1.12__py3-none-any.whl → 0.1.14__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,28 +14,29 @@
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
37
36
 
38
37
 
38
+ import numpy as np
39
+
39
40
  def is_number(s):
40
41
  try:
41
42
  float(s)
@@ -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
@@ -742,6 +743,8 @@ class DiffArrmultiFunc(DiffSample):
742
743
  for j in range(0, na, 2):
743
744
  a1[j + 1] = a1[j + 1] / sum
744
745
 
746
+ # 生成体积浓度分数随机值,归一到总和为1
747
+
745
748
  # Definition of sizes (start with random order numbers greater to smaller)
746
749
  sum = 0.0
747
750
  for j in range(0, na - 2, 2):
@@ -752,11 +755,15 @@ class DiffArrmultiFunc(DiffSample):
752
755
  for j in range(0, na - 2, 2):
753
756
  a1[j] = a1[j] / sum * xro
754
757
 
758
+ # 从后到前随机生成尺寸,归一化到最大值为xro
759
+
755
760
  sum = a1[na - 1] + a1[na - 3]
756
761
  for j in range(2, na - 3, 2):
757
762
  a1[j] = a1[j] - np.log10(sum)
758
763
  sum = sum + a1[na - (j + 1) - 2]
759
764
 
765
+ # 调整尺寸的值,为什么?
766
+
760
767
  ro = 10.0 ** a1[0]
761
768
 
762
769
  for j in range(2, na - 3, 2):
@@ -3321,11 +3328,11 @@ class DiffDraw(DiffSample):
3321
3328
 
3322
3329
  def get_plot_data(self):
3323
3330
 
3324
- k1 = [x, y1, y2] = ap.calc.spectra.get_data(self.age, self.sage, [i * 100 for i in self.f], cumulative=True)
3331
+ k1 = [x, y1, y2] = calc.spectra.get_data(self.age, self.sage, [i * 100 for i in self.f], cumulative=True)
3325
3332
  k2 = []
3326
3333
  k3 = []
3327
3334
  for cyc in range(self.mcyc):
3328
- x, y1, y2 = ap.calc.spectra.get_data(
3335
+ x, y1, y2 = calc.spectra.get_data(
3329
3336
  self.mage[cyc, :], np.zeros(self.mage[cyc, :].size), self.mf[cyc, :], cumulative=True)
3330
3337
  k2.append([x, y1, y2])
3331
3338
  k3.append([self.mcage[cyc, :], self.mcte[cyc, :]])
@@ -3355,7 +3362,7 @@ class DiffDraw(DiffSample):
3355
3362
  axs.plot(data[0][0], data[0][1], c='blue')
3356
3363
 
3357
3364
  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, :],
3365
+ # x, y1, y2 = calc.spectra.get_data(self.mage[cyc, :], np.zeros(self.mage[cyc, :].size), self.mf[cyc, :],
3359
3366
  # cumulative=True)
3360
3367
  axs.plot(data[1][cyc][0], data[1][cyc][2], c='red')
3361
3368
  axs.plot(data[1][cyc][0], data[1][cyc][1], c='red')
@@ -3501,25 +3508,25 @@ class InsideTemperatureCalibration:
3501
3508
  file_out.writelines(f"{seq.SP = }, {seq.MaxTime = }, conf MaxTime = {max(x_conf)} \n")
3502
3509
  file2_out.writelines(f"SP = {seq.SP}, MaxTime = {max(x_conf)} \n")
3503
3510
 
3504
- beta = ap.calc.regression.polynomial(y1_conf, x_conf, degree=degree)[5]
3511
+ beta = calc.regression.polynomial(y1_conf, x_conf, degree=degree)[5]
3505
3512
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3506
3513
  c='blue')
3507
3514
  file_out.writelines("BetaY1\t" + "\t".join([str(i) for i in beta]) + "\n")
3508
3515
  file2_out.writelines("\t".join([str(i) for i in beta]) + "\n")
3509
3516
 
3510
- beta = ap.calc.regression.polynomial(y2_conf, x_conf, degree=degree)[5]
3517
+ beta = calc.regression.polynomial(y2_conf, x_conf, degree=degree)[5]
3511
3518
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3512
3519
  c='blue')
3513
3520
  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")
3521
+ file2_out.writelines("\t".join([str(i) for fi in beta]) + "\n")
3515
3522
 
3516
- beta = ap.calc.regression.polynomial(y3_conf, x_conf, degree=degree)[5]
3523
+ beta = calc.regression.polynomial(y3_conf, x_conf, degree=degree)[5]
3517
3524
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3518
3525
  c='blue')
3519
3526
  file_out.writelines("BetaY3\t" + "\t".join([str(i) for i in beta]) + "\n")
3520
3527
  file2_out.writelines("\t".join([str(i) for i in beta]) + "\n")
3521
3528
 
3522
- beta = ap.calc.regression.polynomial(y4_conf, x_conf, degree=degree)[5]
3529
+ beta = calc.regression.polynomial(y4_conf, x_conf, degree=degree)[5]
3523
3530
  ax.plot(x_conf, np.sum(beta * np.array([x_conf ** i for i in range(degree + 1)]).transpose(), axis=1),
3524
3531
  c='blue')
3525
3532
  file_out.writelines("BetaY4\t" + "\t".join([str(i) for i in beta]) + "\n")
@@ -3715,7 +3722,7 @@ class SmpTemperatureCalibration:
3715
3722
  if line == "":
3716
3723
  break
3717
3724
  k = line.split(";")
3718
- time = dt.strptime(k[0], "%Y-%m-%dT%H:%M:%S%z").timestamp()
3725
+ time = dt.strptime(k[0], "%Y-%m-%dT%H:%M:%S%z").timestamp() # UTC datetime
3719
3726
  cumulative_time = 0
3720
3727
  if int(k[1]) != last_sp:
3721
3728
  last_sp = int(k[1])
@@ -3730,11 +3737,12 @@ class SmpTemperatureCalibration:
3730
3737
  except KeyError:
3731
3738
  inside_temp = [0, 0]
3732
3739
 
3733
- libano_log.append([time, int(k[1]), int(k[2]), cumulative_time, inside_temp[0], inside_temp[1]])
3740
+ # timestamp, cumulative_time of the current temperature, SP, AP, Inside, Inside error
3741
+ libano_log.append([time, cumulative_time, int(k[1]), int(k[2]), (inside_temp[0] + inside_temp[1]) / 2,
3742
+ abs(inside_temp[0] - inside_temp[1]) / 2, 9999])
3734
3743
  n += 1
3735
3744
 
3736
3745
  libano_file.close()
3737
- libano_log = np.array(libano_log).transpose()
3738
3746
 
3739
3747
  # # set time starts with zero
3740
3748
  # log_time = [i - log_time[0] for i in log_time]
@@ -3748,10 +3756,13 @@ class SmpTemperatureCalibration:
3748
3756
  helix_log = [[], [], [], [], [], [], [], [], [], [], [], []]
3749
3757
  nstep = 0
3750
3758
 
3759
+ time_difference = 147 # helix time - libano time 时间差
3760
+
3751
3761
  keys = {
3752
3762
  "start_buildup": "GenWorkflow-BuildUp.cs: line 1: Clock reset",
3753
3763
  "set_temp": "GenWorkflow-Sampling.cs: Target temperature: key = Intensity, value = ",
3754
3764
  "end_sampling": "GenWorkflow-Prepare.cs: line 1: CLOSE for VUcleaningline/VINL2",
3765
+ # "start_sampling": "GenWorkflow-Prepare.cs: line 15: CLOSE for VUcleaningline/VGP5", # Y01样品之后发现VPL1漏气,多加了一步关闭VPL1因此,在那之后是line 15
3755
3766
  "start_sampling": "GenWorkflow-Prepare.cs: line 14: CLOSE for VUcleaningline/VGP5",
3756
3767
  "end_sequence": "GenWorkflow-PostAcquisition.cs: line 7: Starting Acquisition",
3757
3768
  "get_setpoint": "GenWorkflow-Sampling.cs: Target temperature: key = Intensity, value = ",
@@ -3776,10 +3787,13 @@ class SmpTemperatureCalibration:
3776
3787
  continue
3777
3788
 
3778
3789
  dt_str, helix, system, service, scripting, userinfo, message1, message2 = line.split("|")
3779
- dt_utc = dt_str[:26] + dt_str[27:]
3790
+ # dt_str likes 2024-10-23T19:58:59.6662140+02:00, it is too long for datetime parser
3791
+ dt_utc = dt_str[:26] + dt_str[27:] # dt_utc will be like 2024-10-23T19:58:59.666214+02:00
3780
3792
  dt_utc = dt.fromisoformat(str(dt_utc)).timestamp()
3781
3793
 
3782
- if not (self.start_time <= dt_utc <= self.end_time):
3794
+ dt_utc = dt_utc - time_difference
3795
+
3796
+ if not (self.start_time <= int(dt_utc) <= self.end_time):
3783
3797
  continue
3784
3798
  if message1.startswith(keys["start_buildup"]):
3785
3799
  ### start buildup
@@ -3793,6 +3807,16 @@ class SmpTemperatureCalibration:
3793
3807
  # 关闭vinlet2,60秒进质谱,之后开vinlet2,90秒抽气
3794
3808
  gas_collection_end = dt_utc
3795
3809
  helix_log[1].append(dt_utc)
3810
+ try:
3811
+ gas_collection_start = gas_collection_start
3812
+ except NameError:
3813
+ gas_collection_start = buildup_start
3814
+ # 添加阶段标记
3815
+ for each_row in libano_log:
3816
+ # 时间在集气过程中
3817
+ if gas_collection_start <= each_row[0] <= gas_collection_end:
3818
+ each_row[6] = nstep
3819
+
3796
3820
  if message1.startswith(keys["start_sampling"]):
3797
3821
  # Close VGP5, start peak centering and measurement, IMPORTANT: start to sampling
3798
3822
  gas_collection_start = dt_utc
@@ -3813,6 +3837,8 @@ class SmpTemperatureCalibration:
3813
3837
  for i in helix_log:
3814
3838
  print(len(i))
3815
3839
  print(i)
3840
+
3841
+ libano_log = np.array(libano_log).transpose()
3816
3842
  helix_log = np.array(helix_log)
3817
3843
 
3818
3844
 
@@ -3841,12 +3867,12 @@ class SmpTemperatureCalibration:
3841
3867
  yellow_data_index.append(_index)
3842
3868
 
3843
3869
  med = int((_index[0] + _index[-1]) / 2)
3844
- helix_log[4, i] = (libano_log[4, _index][0] + libano_log[5, _index][0]) / 2
3845
- helix_log[5, i] = abs(libano_log[4, _index][0] - libano_log[5, _index][0]) / 2
3846
- helix_log[6, i] = (libano_log[4, _index][-1] + libano_log[5, _index][-1]) / 2
3847
- helix_log[7, i] = abs(libano_log[4, _index][-1] - libano_log[5, _index][-1]) / 2
3848
- helix_log[8, i] = (libano_log[4, med] + libano_log[5, med]) / 2
3849
- helix_log[9, i] = abs(libano_log[4, med] - libano_log[5, med]) / 2
3870
+ helix_log[4, i] = libano_log[4, _index][0]
3871
+ helix_log[5, i] = libano_log[5, _index][0]
3872
+ helix_log[6, i] = libano_log[4, _index][-1]
3873
+ helix_log[7, i] = libano_log[5, _index][-1]
3874
+ helix_log[8, i] = libano_log[4, med]
3875
+ helix_log[9, i] = libano_log[5, med]
3850
3876
  helix_log[11, i] = gas_in_end - gas_in_start
3851
3877
 
3852
3878
  line = f"{i + 1}\t{helix_log[10, i]}\t{helix_log[11, i]}\t" + '\t'.join(
@@ -3869,11 +3895,9 @@ class SmpTemperatureCalibration:
3869
3895
  ax.plot(libano_log[0], libano_log[1], c='green')
3870
3896
  ax.plot(libano_log[0], libano_log[2], c='blue')
3871
3897
  ax.plot(libano_log[0], libano_log[4], c='red')
3872
- ax.plot(libano_log[0], libano_log[5], c='red')
3873
3898
  for i in range(nstep):
3874
3899
  _index = yellow_data_index[i]
3875
3900
  ax.plot(libano_log[0, _index], libano_log[4, _index], c='yellow')
3876
- ax.plot(libano_log[0, _index], libano_log[5, _index], c='yellow')
3877
3901
 
3878
3902
  fig.tight_layout()
3879
3903
  plt.show()
@@ -4117,7 +4141,7 @@ class Ran1Generator:
4117
4141
 
4118
4142
  self.count += 1
4119
4143
 
4120
- print(f"{ran1 = }, {self.count = }")
4144
+ # print(f"{ran1 = }, {self.count = }")
4121
4145
 
4122
4146
  return ran1
4123
4147
 
@@ -4443,19 +4467,15 @@ def kahan_sum(input):
4443
4467
  return sum
4444
4468
 
4445
4469
 
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 = ""):
4470
+ def get_random_dir(path: str, length=7, random_index=""):
4451
4471
  try:
4472
+ exist_ok = random_index != ""
4452
4473
  if random_index == "":
4453
- random_index = get_random_index(length=length)
4474
+ random_index = calc.basic.get_random_digits(length=length)
4454
4475
  destination_folder = os.path.join(path, random_index)
4455
- os.makedirs(destination_folder, exist_ok=False)
4476
+ os.makedirs(destination_folder, exist_ok=exist_ok)
4456
4477
  return destination_folder, random_index
4457
4478
  except FileExistsError:
4458
- random_index = ""
4459
4479
  return get_random_dir(path=path, length=length)
4460
4480
 
4461
4481
 
@@ -4473,7 +4493,7 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
4473
4493
  agemon.ni = len(data)
4474
4494
  agemon.nit = agemon.ni
4475
4495
  agemon.max_plateau_age = max_age
4476
- data = ap.calc.arr.transpose(data)
4496
+ data = calc.arr.transpose(data)
4477
4497
  agemon.telab = [i + 273.15 for i in data[3]]
4478
4498
  agemon.tilab = [i / 5.256E+11 for i in data[4]] # 1 Ma = 525600000000 minutes
4479
4499
  for i in range(agemon.nit):
@@ -4555,9 +4575,12 @@ def run_agemon_dll(sample: Sample, source_dll_path: str, loc: str, data, max_age
4555
4575
  return
4556
4576
 
4557
4577
 
4558
- def dr2_popov(f, ti):
4578
+ def dr2_popov(f, ti, ar, sar, ln=True):
4559
4579
  """
4560
4580
 
4581
+ Used in Popov 2020. It is related to the sphere model.
4582
+ The calculation of Dr2 is from sphere model. Errors are carefully propagated.
4583
+
4561
4584
  Parameters
4562
4585
  ----------
4563
4586
  f: cumulative 39Ar released, array
@@ -4573,47 +4596,86 @@ def dr2_popov(f, ti):
4573
4596
  # =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
4597
 
4575
4598
  f = np.array(f)
4576
- ti = np.array(ti)
4599
+ ti = np.array(ti) # in minute
4600
+ ar = np.array(ar)
4601
+ sar = np.array(sar)
4602
+ sar2 = sar ** 2
4577
4603
  n = min(len(f), len(ti))
4578
4604
  ti = ti * 60 # in seconds
4605
+ sti = [0.5 * 60 for i in range(n)]
4579
4606
  pi = math.pi
4580
- pi = 3.141592654
4607
+ # pi = 3.141592654
4581
4608
  dr2 = np.zeros(n)
4582
4609
 
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)):
4610
+ f = np.where(f >= 1, 0.9999999999999999, f)
4611
+ 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)]
4612
+
4613
+ # Popov 2020, sphere model
4614
+ model = geometric_model(geo='sphere')
4615
+ dtr2 = [model(bp=0.85)[1](fi) for fi in f]
4616
+ dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
4617
+ dr2[-1] = math.log((1 - f[-2]) / (1 - f[-1])) / pi ** 2 / ti[-1]
4618
+
4619
+ # =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)
4620
+ sar_lt = np.zeros(n) # 偏导数
4621
+ sar_eq = np.zeros(n) # 偏导数
4622
+ sar_gt = np.zeros(n) # 偏导数
4623
+ st = np.zeros(n) # 偏导数
4624
+ sdr2 = np.zeros(n)
4625
+ for i in range(n):
4589
4626
  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]
4627
+ if f[i] < 0.85:
4628
+ sar_lt[i] = 0
4629
+ 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)
4630
+ 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
4631
  else:
4595
- a = 1 - f[i]
4596
- dr2[i] = (math.log((f[i] - 1) / (-6 / pi ** 2)) / pi ** 2) / ti[i]
4632
+ sar_lt[i] = 0
4633
+ sar_eq[i] = (1 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4634
+ sar_gt[i] = (1 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4597
4635
  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]
4636
+ if f[i] < 0.85:
4637
+ 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)
4638
+ 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)
4639
+ 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
4640
  else:
4602
- dr2[i] = math.log((1 - f[i - 1]) / (1 - f[i])) / pi ** 2 / ti[i]
4603
- b = a
4641
+ sar_lt[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (0 - 0)
4642
+ sar_eq[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - 0)
4643
+ sar_gt[i] = (1 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - sum(ar[i:]))
4644
+ st[i] = - dr2[i] / ti[i]
4645
+ 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
4646
 
4605
- print(f"popov {dr2 = }")
4647
+ logdr2 = np.log(dr2) if ln else np.log10(dr2)
4648
+ wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) / np.log(10)
4606
4649
 
4607
- return dr2, np.log(dr2)
4650
+ return dtr2, logdr2, wt
4608
4651
 
4609
4652
 
4610
- def dr2_lovera(f, ti, ar, sar):
4653
+ def dr2_lovera(f, ti, ar, sar, ln=True):
4654
+ """
4655
+
4656
+ Plane sheet model
4657
+
4658
+ Parameters
4659
+ ----------
4660
+ f
4661
+ ti
4662
+ ar
4663
+ sar
4664
+ ln
4665
+
4666
+ Returns
4667
+ -------
4668
+
4669
+ """
4611
4670
  # Lovera
4612
4671
  f = np.array(f)
4613
4672
  ti = np.array(ti)
4614
- # ar = np.array(ar)
4615
- # sar = np.array(sar)
4673
+ n = min(len(f), len(ti))
4674
+ ar = np.array(ar)
4675
+ sar = np.array(sar)
4676
+ sar2 = sar ** 2
4616
4677
  ti = ti * 60 # in seconds
4678
+ sti = [90 for i in range(n)]
4617
4679
  pi = math.pi
4618
4680
  pi = 3.141592654
4619
4681
 
@@ -4623,28 +4685,76 @@ def dr2_lovera(f, ti, ar, sar):
4623
4685
 
4624
4686
  f = np.where(f >= 1, 0.9999999999999999, f)
4625
4687
 
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]
4688
+ model = geometric_model(geo='plane')
4689
+ dtr2 = [model(bp=0.5)[1](fi) for fi in f]
4690
+ dtr2_1 = [model(bp=0)[1](fi) for fi in f]
4691
+ dtr2_2 = [model(bp=2)[1](fi) for fi in f]
4692
+ dtr2_1.insert(0, 0); dtr2_2.insert(0, 0)
4693
+ # dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] for i in range(len(dtr2))]
4694
+ 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))]
4695
+
4696
+ # imp = 2
4697
+ # # imp = 1
4698
+ # dtr2 = [pi * (fi / 4) ** 2 if fi <= 0.5 else math.log((1 - fi) * pi ** 2 / 8) / (- pi ** 2) for fi in f]
4699
+ # dr2 = [(dtr2[i] - (dtr2[i - 1] if i > 0 else 0)) / ti[i] * imp ** 2 for i in range(len(dtr2))]
4700
+ # xlogd = [np.log10(i) for i in dr2]
4701
+
4702
+ sar_lt = np.zeros(n) # 偏导数
4703
+ sar_eq = np.zeros(n) # 偏导数
4704
+ sar_gt = np.zeros(n) # 偏导数
4705
+ st = np.zeros(n) # 偏导数
4706
+ sdr2 = np.zeros(n)
4707
+ for i in range(n):
4708
+ if i == 0:
4709
+ if f[i] <= 0.5:
4710
+ sar_lt[i] = 0
4711
+ 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)
4712
+ 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)
4713
+ else:
4714
+ sar_lt[i] = 0
4715
+ sar_eq[i] = (4 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((sum(ar) - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4716
+ sar_gt[i] = (4 / (pi ** 2 * ti[i] * (f[i] - 1))) * ((0 - ar[i] - sum(ar[:i])) / sum(ar) ** 2)
4717
+ else:
4718
+ if f[i] <= 0.5:
4719
+ 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)
4720
+ 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)
4721
+ 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)
4722
+ else:
4723
+ sar_lt[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (0 - 0)
4724
+ sar_eq[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - 0)
4725
+ sar_gt[i] = (4 / (pi ** 2 * ti[i] * sum(ar[i:]) * sum(ar[i+1:]))) * (sum(ar[i+1:]) - sum(ar[i:]))
4726
+ if i == n - 1:
4727
+ sar_lt[i] = 0
4728
+ sar_eq[i] = 0
4729
+ sar_gt[i] = 0
4730
+ st[i] = - dr2[i] / ti[i]
4731
+ 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)
4732
+
4733
+ # wt = np.abs(sdr2 / dr2)
4734
+ # wt = errcal(f, ti, ar, sar)
4735
+
4736
+ xlogd = logdr2 = np.log(dr2) if ln else np.log10(dr2)
4737
+ #ee = 1 / np.log(10)
4738
+ ee = 0.4342944819
4739
+ wt = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) * ee
4740
+ #
4741
+ # print(f"{wt = }")
4742
+ # wt = errcal(f, ti, ar, sar)
4743
+ # print(f"{wt = }")
4631
4744
 
4632
- wt = errcal(f, ti, ar, sar)
4745
+ """
4746
+ ### errcal(f, ti, ar, sar)和这里的计算有非常少的差异,但这样的差异足以导致迭代次数变化,但不一定导致agemon结果有大的差异
4747
+ """
4633
4748
 
4634
4749
  return dr2, xlogd, wt
4635
4750
 
4636
4751
 
4637
- def dr2_yang(f, ti, ar, sar):
4752
+ def dr2_yang(f, ti, ar, sar, ln=True):
4638
4753
  """
4639
4754
 
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
4755
  Parameters
4646
4756
  ----------
4647
- f: array NOTE:这里的 f 既不是释放百分数也不是累积百分数,而是各个阶段释放量占其及后续所有气体的分数,即占释放前的比例
4757
+ f:
4648
4758
  ti
4649
4759
 
4650
4760
  Returns
@@ -4653,40 +4763,31 @@ def dr2_yang(f, ti, ar, sar):
4653
4763
  """
4654
4764
  f = np.array(f)
4655
4765
  ti = np.array(ti)
4766
+ ar = np.array(ar)
4767
+ sar = np.array(sar)
4768
+ sar2 = sar ** 2
4656
4769
  n = min(len(f), len(ti))
4657
4770
  ti = ti * 60 # in seconds
4658
- sti = 5.
4771
+ sti = [5 for i in range(n)]
4659
4772
  pi = math.pi
4660
4773
  pi = 3.141592654
4661
4774
  ee = 0.4342944819
4662
- dr2 = np.zeros(n)
4663
- sdr2 = np.zeros(n)
4664
4775
 
4776
+ f = np.array([ar[i] / sum(ar[i:]) for i in range(n)])
4777
+ 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
4778
  f = np.where(f >= 1, 0.9999999999999999, f)
4779
+ # # print(f"{f = }")
4780
+ # 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
4781
 
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))
4782
+ model = geometric_model(geo='sphere')
4783
+ dtr2 = np.array([model(bp=0.85)[1](fi) for fi in f])
4784
+ 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)]
4785
+ dr2 = dtr2 / ti
4786
+ 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)])
4681
4787
 
4682
- xlogd = np.log(dr2)
4683
- sxlogd = np.abs(sdr2 / dr2)
4684
-
4685
- print(f"yang {dr2 = }")
4686
- print(f"yang {xlogd = }")
4687
- print(f"yang {sxlogd = }")
4688
-
4689
- return dr2, xlogd, sxlogd
4788
+ xlogd = logdr2 = np.log(dr2) if ln else np.log10(dr2)
4789
+ wt = sxlogd = np.abs(sdr2 / dr2) if ln else np.abs(sdr2 / dr2) / np.log(10)
4790
+ return dr2, xlogd, wt
4690
4791
 
4691
4792
 
4692
4793
  def errcal(f, ti, ar, sar):
@@ -4745,25 +4846,83 @@ def errcal(f, ti, ar, sar):
4745
4846
 
4746
4847
  print(f"lovera {wt = }")
4747
4848
 
4849
+ return wt
4748
4850
 
4749
- ## 下面是我重新改写 计算的 与lovera的结果接近但不一致
4750
4851
 
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 = }")
4852
+ def geometric_model(geo: str = "sphere"):
4853
+ """
4854
+
4855
+ Parameters
4856
+ ----------
4857
+ geo: str, sphere | cylinder | plane | cube
4858
+ b
4859
+
4860
+ Returns
4861
+ -------
4862
+
4863
+ """
4864
+ if geo.lower()[:3] == 'sphere'[:3]:
4865
+ return sphere
4866
+ if geo.lower()[:3] == 'plane'[:3]:
4867
+ return plane
4868
+
4869
+
4870
+ def sphere(bp=0.85):
4871
+ """
4872
+ Parameters
4873
+ ----------
4874
+ bp: float, breakpoint
4875
+
4876
+ Returns
4877
+ -------
4878
+
4879
+ """
4880
+ pi = math.pi
4881
+ pi = 3.141592654
4882
+
4883
+ def func(dtr2):
4884
+ f = 1 - (6 / pi ** 2) * math.exp(-1 * pi ** 2 * dtr2)
4885
+ f2 = (6 / pi ** 1.5) * (pi ** 2 * dtr2) ** 0.5 - (3 / pi ** 2) * (pi ** 2 * dtr2)
4886
+ return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
4887
+
4888
+ def inv_func(f):
4889
+ if 0 <= f < bp:
4890
+ dtr2 = (1 - math.sqrt(1 - pi * f / 3)) ** 2 / pi
4891
+ elif f < 1:
4892
+ dtr2 = - math.log((1 - f) * pi ** 2 / 6) / pi ** 2
4893
+ else:
4894
+ dtr2 = np.nan
4895
+ return dtr2
4896
+
4897
+ return func, inv_func
4898
+
4899
+
4900
+ def plane(bp=0.6):
4901
+ """
4902
+ Parameters
4903
+ ----------
4904
+ bp: float, breakpoint
4905
+
4906
+ Returns
4907
+ -------
4908
+
4909
+ """
4910
+ pi = math.pi
4911
+ pi = 3.141592654
4912
+
4913
+ def func(dtr2):
4914
+ f = 1 - (8 / pi ** 2) * math.exp(- pi ** 2 * dtr2 / 4)
4915
+ f2 = 2 * math.sqrt(dtr2 / pi)
4916
+ return f if bp <= f <= 1 else f2 if 0 <= f2 else np.nan
4917
+
4918
+ def inv_func(f):
4919
+ if 0 <= f < bp:
4920
+ dtr2 = pi * f ** 2 / 4
4921
+ elif f < 1:
4922
+ dtr2 = 4 * math.log((1 - f) * pi ** 2 / 8) / (- pi ** 2)
4923
+ else:
4924
+ dtr2 = np.nan
4925
+ return dtr2
4926
+
4927
+ return func, inv_func
4768
4928
 
4769
- return wt