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.
- ararpy/argon_diffusion_simulator/__init__.py +12 -0
- ararpy/argon_diffusion_simulator/main.py +542 -0
- ararpy/calc/arr.py +2 -1
- ararpy/calc/basic.py +36 -14
- ararpy/calc/corr.py +7 -34
- ararpy/calc/plot.py +3 -3
- ararpy/calc/raw_funcs.py +4 -2
- ararpy/calc/regression.py +3 -6
- ararpy/calc/spectra.py +3 -1
- ararpy/files/calc_file.py +1 -1
- ararpy/files/raw_file.py +84 -82
- ararpy/smp/EXPORT_TO_PDF_DATA_PROPERTIES.py +95 -0
- ararpy/smp/basic.py +6 -5
- ararpy/smp/calculation.py +2 -2
- ararpy/smp/corr.py +107 -77
- ararpy/smp/diffusion_funcs.py +282 -123
- ararpy/smp/export.py +927 -264
- ararpy/smp/json.py +7 -0
- ararpy/smp/plots.py +10 -8
- ararpy/smp/raw.py +9 -2
- ararpy/smp/sample.py +32 -23
- {ararpy-0.1.12.dist-info → ararpy-0.1.14.dist-info}/METADATA +10 -2
- {ararpy-0.1.12.dist-info → ararpy-0.1.14.dist-info}/RECORD +26 -23
- {ararpy-0.1.12.dist-info → ararpy-0.1.14.dist-info}/WHEEL +1 -1
- {ararpy-0.1.12.dist-info → ararpy-0.1.14.dist-info}/LICENSE +0 -0
- {ararpy-0.1.12.dist-info → ararpy-0.1.14.dist-info}/top_level.txt +0 -0
ararpy/smp/diffusion_funcs.py
CHANGED
|
@@ -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
|
-
|
|
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
|
|
32
|
-
|
|
29
|
+
import matplotlib as mpl
|
|
33
30
|
mpl.use('TkAgg')
|
|
34
31
|
import matplotlib.pyplot as plt
|
|
35
32
|
|
|
36
|
-
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
3521
|
+
file2_out.writelines("\t".join([str(i) for fi in beta]) + "\n")
|
|
3515
3522
|
|
|
3516
|
-
beta =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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] =
|
|
3845
|
-
helix_log[5, i] =
|
|
3846
|
-
helix_log[6, i] =
|
|
3847
|
-
helix_log[7, i] =
|
|
3848
|
-
helix_log[8, i] =
|
|
3849
|
-
helix_log[9, i] =
|
|
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
|
|
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 =
|
|
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=
|
|
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 =
|
|
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
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
# Popov 2020
|
|
4587
|
-
|
|
4588
|
-
for
|
|
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
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
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
|
-
|
|
4596
|
-
|
|
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
|
-
|
|
4600
|
-
|
|
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
|
-
|
|
4603
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
4615
|
-
|
|
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
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
4668
|
-
|
|
4669
|
-
|
|
4670
|
-
|
|
4671
|
-
|
|
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
|
-
|
|
4752
|
-
|
|
4753
|
-
|
|
4754
|
-
|
|
4755
|
-
|
|
4756
|
-
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
|
|
4760
|
-
|
|
4761
|
-
|
|
4762
|
-
|
|
4763
|
-
|
|
4764
|
-
|
|
4765
|
-
|
|
4766
|
-
|
|
4767
|
-
|
|
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
|