ararpy 0.1.14__py3-none-any.whl → 0.1.17__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/__init__.py +1 -1
- ararpy/calc/age.py +9 -8
- ararpy/calc/basic.py +30 -1
- ararpy/calc/corr.py +35 -22
- ararpy/calc/regression.py +4 -3
- ararpy/files/calc_file.py +24 -15
- ararpy/smp/basic.py +50 -12
- ararpy/smp/corr.py +8 -6
- ararpy/smp/diffusion_funcs.py +73 -99
- ararpy/smp/export.py +216 -86
- ararpy/smp/initial.py +34 -20
- ararpy/smp/plots.py +11 -10
- ararpy/smp/sample.py +14 -9
- ararpy/smp/style.py +13 -5
- ararpy/smp/table.py +19 -21
- ararpy/{argon_diffusion_simulator → thermo}/__init__.py +1 -1
- ararpy/thermo/arrhenius.py +15 -0
- ararpy/{argon_diffusion_simulator/main.py → thermo/atomic_level_random_walk.py} +95 -6
- ararpy/thermo/basic.py +306 -0
- {ararpy-0.1.14.dist-info → ararpy-0.1.17.dist-info}/METADATA +17 -3
- {ararpy-0.1.14.dist-info → ararpy-0.1.17.dist-info}/RECORD +24 -22
- {ararpy-0.1.14.dist-info → ararpy-0.1.17.dist-info}/WHEEL +1 -1
- {ararpy-0.1.14.dist-info → ararpy-0.1.17.dist-info/licenses}/LICENSE +0 -0
- {ararpy-0.1.14.dist-info → ararpy-0.1.17.dist-info}/top_level.txt +0 -0
ararpy/__init__.py
CHANGED
ararpy/calc/age.py
CHANGED
|
@@ -20,6 +20,7 @@ import numpy as np
|
|
|
20
20
|
def calc_age_min(F, sF, **kwargs) -> tuple:
|
|
21
21
|
"""
|
|
22
22
|
Calculate ArAr ages using Min et al. (2000) equation.
|
|
23
|
+
Note that the Ar/K of primary standards is not working currently
|
|
23
24
|
Parameters
|
|
24
25
|
----------
|
|
25
26
|
F : array-like
|
|
@@ -33,6 +34,7 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
|
|
|
33
34
|
|
|
34
35
|
Returns
|
|
35
36
|
-------
|
|
37
|
+
[age, s1, s2, s3] in years
|
|
36
38
|
|
|
37
39
|
"""
|
|
38
40
|
F, sF = arr.array_as_float([F, sF]).astype(float)
|
|
@@ -68,7 +70,6 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
|
|
|
68
70
|
# recalculation using Min et al.(2000) equation
|
|
69
71
|
# lmd = A * W * Y / (f * No)
|
|
70
72
|
V = f * No / ((Ab + Ae) * W * Y)
|
|
71
|
-
sf = 0 # the error of f was not considered by Koppers
|
|
72
73
|
sV = pow((V / f * sf) ** 2 + (V / No * sNo) ** 2 + (V / (Ab + Ae)) ** 2 * (sAb ** 2 + sAe ** 2) +
|
|
73
74
|
(V / W * sW) ** 2 + (V / Y * sY) ** 2, 0.5)
|
|
74
75
|
# standard age in year, change to Ma
|
|
@@ -87,7 +88,7 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
|
|
|
87
88
|
KK = np.exp(t / V) - 1 # 40Arr / 40K Use standard age
|
|
88
89
|
XX = BB * KK * R + 1
|
|
89
90
|
k0 = V * np.log(XX)
|
|
90
|
-
e1 = (np.log(XX) * V / f - V * BB * KK * R / (f * XX)) ** 2 * sf ** 2 #
|
|
91
|
+
e1 = (np.log(XX) * V / f - V * BB * KK * R / (f * XX)) ** 2 * sf ** 2 # sF
|
|
91
92
|
e2 = (np.log(XX) * V / No) ** 2 * sNo ** 2 # sNo
|
|
92
93
|
e3 = (-1 * np.log(XX) * V / A + BB * KK * R / (A * XX)) ** 2 * sAb ** 2 # sAb
|
|
93
94
|
e4 = (-1 * np.log(XX) * V / A - Ab * KK * R / (Ae ** 2 * XX)) ** 2 * sAe ** 2 # sAe
|
|
@@ -111,12 +112,12 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
|
|
|
111
112
|
|
|
112
113
|
# change to Ma
|
|
113
114
|
# analytical error, error of 40Ar/39Ar only
|
|
114
|
-
s1 = np.sqrt((V * KK * BB / XX) ** 2 * sR_2 ** 2)
|
|
115
|
+
s1 = np.sqrt((V * KK * BB / XX) ** 2 * sR_2 ** 2)
|
|
115
116
|
# internal error, errors of 40Ar/39Ar and J value
|
|
116
|
-
s2 = np.sqrt((V * KK * BB / XX) ** 2 * sR_1 ** 2)
|
|
117
|
+
s2 = np.sqrt((V * KK * BB / XX) ** 2 * sR_1 ** 2)
|
|
117
118
|
# total external error
|
|
118
|
-
s3 = np.sqrt(e1 + e2 + e3 + e4 + e5 + e6 + e7 + e8 + e9)
|
|
119
|
-
age = k0
|
|
119
|
+
s3 = np.sqrt(e1 + e2 + e3 + e4 + e5 + e6 + e7 + e8 + e9)
|
|
120
|
+
age = k0
|
|
120
121
|
return age, s1, s2, s3
|
|
121
122
|
|
|
122
123
|
|
|
@@ -135,7 +136,7 @@ def calc_age_general(F, sF, J, sJ, L, sL, **kwargs):
|
|
|
135
136
|
|
|
136
137
|
Returns
|
|
137
138
|
-------
|
|
138
|
-
tuple of array objects, (age, s1, s2, s3)
|
|
139
|
+
tuple of array objects, (age, s1, s2, s3), in years
|
|
139
140
|
"""
|
|
140
141
|
F, sF, J, sJ, L, sL = np.array([F, sF, J, sJ, L, sL])
|
|
141
142
|
sJ = sJ * J / 100
|
|
@@ -147,4 +148,4 @@ def calc_age_general(F, sF, J, sJ, L, sL, **kwargs):
|
|
|
147
148
|
s1 = v1 ** .5 # analytical error
|
|
148
149
|
s2 = (v1 + v2) ** .5 # internal error
|
|
149
150
|
s3 = (v1 + v2 + v3) ** .5 # full external error
|
|
150
|
-
return age
|
|
151
|
+
return age, s1, s2, s3
|
ararpy/calc/basic.py
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
import copy
|
|
13
13
|
import random
|
|
14
14
|
import string
|
|
15
|
+
import numpy as np
|
|
16
|
+
from scipy import stats
|
|
15
17
|
from datetime import datetime, timezone, timedelta
|
|
16
18
|
import pytz
|
|
17
19
|
|
|
@@ -66,7 +68,7 @@ def merge_dicts(a: dict, b: dict):
|
|
|
66
68
|
"""
|
|
67
69
|
res = copy.deepcopy(a)
|
|
68
70
|
for key, val in b.items():
|
|
69
|
-
if key not in res.keys() and key.isnumeric():
|
|
71
|
+
if key not in res.keys() and str(key).isnumeric():
|
|
70
72
|
key = int(key)
|
|
71
73
|
if key not in res.keys():
|
|
72
74
|
res[key] = val
|
|
@@ -100,3 +102,30 @@ def update_dicts(a: dict, b: dict):
|
|
|
100
102
|
|
|
101
103
|
def get_random_digits(length: int = 7) -> str:
|
|
102
104
|
return ''.join(random.choices(string.digits, k=length))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def monte_carlo(func, inputs, confidence_level, **kwargs):
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
func: Callable
|
|
113
|
+
inputs: array
|
|
114
|
+
two-dimensional array
|
|
115
|
+
confidence_level: float
|
|
116
|
+
[0, 1]
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
|
|
121
|
+
"""
|
|
122
|
+
N = len(inputs)
|
|
123
|
+
l_range = int(0.5 * (1 - confidence_level) * N)
|
|
124
|
+
r_range = N - l_range - 1
|
|
125
|
+
values = np.transpose([func(*each, **kwargs) for each in inputs])
|
|
126
|
+
cov = np.cov(values, rowvar=True)
|
|
127
|
+
values = np.sort(values, axis=1) # sort to find the lower and upper limitation at the given confidence level
|
|
128
|
+
means = np.mean(values, axis=1).reshape(len(values), 1)
|
|
129
|
+
limits = values[:, [l_range, r_range]]
|
|
130
|
+
|
|
131
|
+
return np.concatenate((means, limits), axis=1), cov
|
ararpy/calc/corr.py
CHANGED
|
@@ -59,14 +59,14 @@ def mdf(rm: float, srm: float, m1: float, m2: float, ra: float = 298.56,
|
|
|
59
59
|
sdelta_m = err.add(sm2, sm1)
|
|
60
60
|
ratio_m = m2 / m1
|
|
61
61
|
sratio_m = err.div((m2, sm2), (m1, sm1))
|
|
62
|
-
|
|
63
|
-
if
|
|
62
|
+
useRyu = False
|
|
63
|
+
if not useRyu:
|
|
64
64
|
# line
|
|
65
|
-
k1 = (ra / rm + delta_m - 1) / delta_m
|
|
65
|
+
k1 = (ra / rm + delta_m - 1) / delta_m
|
|
66
66
|
k2 = err.div(((ra / rm + delta_m - 1), err.div((ra, sra), (rm, srm))), (delta_m, sdelta_m))
|
|
67
67
|
# exp
|
|
68
68
|
try:
|
|
69
|
-
k3 = (np.log(ra / rm) / np.log(ratio_m)) * (1 / m1) + 1
|
|
69
|
+
k3 = (np.log(ra / rm) / np.log(ratio_m)) * (1 / m1) + 1
|
|
70
70
|
v1 = err.log((ra / rm, err.div((ra, sra), (rm, srm))))
|
|
71
71
|
v2 = err.log((ratio_m, sratio_m))
|
|
72
72
|
v3 = err.div((np.log(ra / rm), v1), (np.log(ratio_m), v2))
|
|
@@ -75,7 +75,7 @@ def mdf(rm: float, srm: float, m1: float, m2: float, ra: float = 298.56,
|
|
|
75
75
|
k3, k4 = "Null", "Null"
|
|
76
76
|
# pow
|
|
77
77
|
try:
|
|
78
|
-
k5 = pow((ra / rm), (1 / delta_m)) #
|
|
78
|
+
k5 = pow((ra / rm), (1 / delta_m)) # Renne2009, B.D. Turrin2010
|
|
79
79
|
k6 = err.pow((ra / rm, err.div((ra, sra), (rm, srm))),
|
|
80
80
|
(1 / delta_m, err.div((1, 0), (delta_m, sdelta_m))))
|
|
81
81
|
except Exception:
|
|
@@ -247,6 +247,8 @@ def random_normal_relative(mu, std, size):
|
|
|
247
247
|
|
|
248
248
|
|
|
249
249
|
def random_normal_absolute(mu, std, size):
|
|
250
|
+
if np.isnan(std):
|
|
251
|
+
std = 0
|
|
250
252
|
return np.random.normal(mu, std, size)
|
|
251
253
|
|
|
252
254
|
|
|
@@ -262,13 +264,12 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
262
264
|
L37ar: Tuple[float, float], L39ar: Tuple[float, float], L36cl: Tuple[float, float],
|
|
263
265
|
MDFunc: Union[MethodType],
|
|
264
266
|
MDF: Tuple[float, float],
|
|
265
|
-
M40: Tuple[float, float],
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
M36: Tuple[float, float],
|
|
267
|
+
M40: Tuple[float, float], M39: Tuple[float, float], M38: Tuple[float, float],
|
|
268
|
+
M37: Tuple[float, float], M36: Tuple[float, float],
|
|
269
|
+
G40: Tuple[float, float], G39: Tuple[float, float], G38: Tuple[float, float],
|
|
270
|
+
G37: Tuple[float, float], G36: Tuple[float, float],
|
|
270
271
|
stand_time_year: float,
|
|
271
|
-
**options)
|
|
272
|
+
**options):
|
|
272
273
|
"""
|
|
273
274
|
|
|
274
275
|
Parameters
|
|
@@ -306,7 +307,9 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
306
307
|
Monte_Carlo_Size = 10000
|
|
307
308
|
|
|
308
309
|
# generate random
|
|
310
|
+
print(ar40m)
|
|
309
311
|
ar40m = random_normal_absolute(*ar40m, size=Monte_Carlo_Size)
|
|
312
|
+
print(ar40m)
|
|
310
313
|
ar39m = random_normal_absolute(*ar39m, size=Monte_Carlo_Size)
|
|
311
314
|
ar38m = random_normal_absolute(*ar38m, size=Monte_Carlo_Size)
|
|
312
315
|
ar37m = random_normal_absolute(*ar37m, size=Monte_Carlo_Size)
|
|
@@ -325,6 +328,12 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
325
328
|
M37 = random_normal_relative(*M37, size=Monte_Carlo_Size)
|
|
326
329
|
M36 = random_normal_relative(*M36, size=Monte_Carlo_Size)
|
|
327
330
|
|
|
331
|
+
G40 = random_normal_relative(*G40, size=Monte_Carlo_Size)
|
|
332
|
+
G39 = random_normal_relative(*G39, size=Monte_Carlo_Size)
|
|
333
|
+
G38 = random_normal_relative(*G38, size=Monte_Carlo_Size)
|
|
334
|
+
G37 = random_normal_relative(*G37, size=Monte_Carlo_Size)
|
|
335
|
+
G36 = random_normal_relative(*G36, size=Monte_Carlo_Size)
|
|
336
|
+
|
|
328
337
|
L36cl = random_normal_relative(*L36cl, size=Monte_Carlo_Size)
|
|
329
338
|
L37ar = random_normal_relative(*L37ar, size=Monte_Carlo_Size)
|
|
330
339
|
L39ar = random_normal_relative(*L39ar, size=Monte_Carlo_Size)
|
|
@@ -338,6 +347,8 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
338
347
|
R38v39k = random_normal_relative(*R38v39k, size=Monte_Carlo_Size)
|
|
339
348
|
R36v38clp = random_normal_relative(*R36v38clp, size=Monte_Carlo_Size)
|
|
340
349
|
|
|
350
|
+
blank_gain_corr = options.get('blank_gain_corr', True)
|
|
351
|
+
|
|
341
352
|
def do_simulation():
|
|
342
353
|
i = 0
|
|
343
354
|
while i < Monte_Carlo_Size:
|
|
@@ -351,20 +362,20 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
351
362
|
|
|
352
363
|
_ar40m = ar40m[i]
|
|
353
364
|
|
|
354
|
-
_ar36 = (ar36m[i] - ar36b[i]) * P36Mdf
|
|
355
|
-
_ar37 = (ar37m[i] - ar37b[i]) * P37Mdf
|
|
356
|
-
_ar38 = (ar38m[i] - ar38b[i]) * P38Mdf
|
|
357
|
-
_ar39 = (ar39m[i] - ar39b[i]) * P39Mdf
|
|
358
|
-
_ar40 = (ar40m[i] - ar40b[i]) * P40Mdf
|
|
365
|
+
_ar36 = (ar36m[i] / G36[i] - ar36b[i] / (G36[i] if blank_gain_corr else 1)) * P36Mdf
|
|
366
|
+
_ar37 = (ar37m[i] / G37[i] - ar37b[i] / (G37[i] if blank_gain_corr else 1)) * P37Mdf
|
|
367
|
+
_ar38 = (ar38m[i] / G38[i] - ar38b[i] / (G38[i] if blank_gain_corr else 1)) * P38Mdf
|
|
368
|
+
_ar39 = (ar39m[i] / G39[i] - ar39b[i] / (G39[i] if blank_gain_corr else 1)) * P39Mdf
|
|
369
|
+
_ar40 = (ar40m[i] / G40[i] - ar40b[i] / (G40[i] if blank_gain_corr else 1)) * P40Mdf
|
|
359
370
|
|
|
360
|
-
_ar37ca =
|
|
361
|
-
_ar39k =
|
|
362
|
-
_ar38res =
|
|
363
|
-
_ar36res =
|
|
371
|
+
_ar37ca = _ar37 * P37Decay
|
|
372
|
+
_ar39k = _ar39 * P39Decay - _ar37ca * R39v37ca[i]
|
|
373
|
+
_ar38res = _ar38 - _ar39k * R38v39k[i] - _ar37ca * R38v37ca[i]
|
|
374
|
+
_ar36res = _ar36 - _ar37ca * R36v37ca[i]
|
|
364
375
|
_ar36cl = (_ar36res - _ar38res / R38v36a[i]) / (1 - 1 / (R36v38clp[i] * (1 - exp(-1 * L36cl[i] * stand_time_year)) * R38v36a[i]))
|
|
365
376
|
_ar36a = _ar36res - _ar36cl
|
|
366
|
-
_ar40r =
|
|
367
|
-
_ar40ar =
|
|
377
|
+
_ar40r = _ar40 - _ar36a * R40v36a[i] - _ar39k * R40v39k[i]
|
|
378
|
+
_ar40ar = _ar40 - _ar39k * R40v39k[i]
|
|
368
379
|
_f = _ar40r / _ar39k
|
|
369
380
|
i += 1
|
|
370
381
|
# yield _f, _ar36, _ar37, _ar38, _ar39, _ar40, _ar36a, _ar37ca, _ar39k, _ar40r, _ar36cl
|
|
@@ -405,6 +416,8 @@ def Monte_Carlo_F(ar40m: Tuple[float, float], ar39m: Tuple[float, float], ar38m:
|
|
|
405
416
|
# ar40r.append(each[9])
|
|
406
417
|
# ar36cl.append(each[10])
|
|
407
418
|
|
|
419
|
+
print(f"{np.mean(F) = }, {np.std(F) = }")
|
|
420
|
+
|
|
408
421
|
# print("F = {0} ± {1}".format(np.mean(F), np.std(F)))
|
|
409
422
|
#
|
|
410
423
|
# with open("ar36m.txt", 'w') as f: # save serialized json data to a readable text
|
ararpy/calc/regression.py
CHANGED
|
@@ -42,8 +42,8 @@ def york2(x: list, sx: list, y: list, sy: list, ri: list, f: int = 1,
|
|
|
42
42
|
Returns
|
|
43
43
|
-------
|
|
44
44
|
Intercept | Error | slope | Error | MSWD | Convergence | Number of Iterations | error magnification | other
|
|
45
|
-
|
|
46
|
-
b, seb, m, sem, mswd, abs(m - last_m), Di, k, r2, chi_square, p_value, avg_err_s
|
|
45
|
+
b, sb, a, sa, mswd, dF, Di, k, r2, chi_square, p_value, avg_err_s, cov_b_m
|
|
46
|
+
b, seb, m, sem, mswd, abs(m - last_m), Di, k, r2, chi_square, p_value, avg_err_s, cov_b_m
|
|
47
47
|
"""
|
|
48
48
|
data = np.array([x, sx, y, sy, ri])
|
|
49
49
|
data = data[:, np.where(
|
|
@@ -110,6 +110,7 @@ def york2(x: list, sx: list, y: list, sy: list, ri: list, f: int = 1,
|
|
|
110
110
|
r2 = ssreg / sstotal if sstotal != 0 else np.inf # r2 = ssreg / sstotal
|
|
111
111
|
chi_square = mswd * (n - 2)
|
|
112
112
|
p_value = distributions.chi2.sf(chi_square, n - 2)
|
|
113
|
+
cov_b_m = - np.mean(X) * (ssresid / (n - 2) / np.sum((X - np.mean(X)) ** 2)) # covariance of intercept b and slope m
|
|
113
114
|
# average error of S
|
|
114
115
|
err_s = lambda m, b: list(map(lambda Zi, Yi, Xi: (1 / Zi) ** (1./2.) / abs(Yi - m * Xi - b), Z(m, b), y, x))
|
|
115
116
|
avg_err_s = sum(err_s(m, b)) / len(x) * 100
|
|
@@ -127,7 +128,7 @@ def york2(x: list, sx: list, y: list, sy: list, ri: list, f: int = 1,
|
|
|
127
128
|
# k, sk, m, sm, mswd, conv, iter, mag, r2, chisq, p, avg_err
|
|
128
129
|
# ]
|
|
129
130
|
|
|
130
|
-
return b, seb, m, sem, mswd, abs(m - last_m), Di, k, r2, chi_square, p_value, avg_err_s
|
|
131
|
+
return b, seb, m, sem, mswd, abs(m - last_m), Di, k, r2, chi_square, p_value, avg_err_s, cov_b_m
|
|
131
132
|
|
|
132
133
|
|
|
133
134
|
def york2_df(data: pd.DataFrame, f: int = 1, convergence: float = 0.001,
|
ararpy/files/calc_file.py
CHANGED
|
@@ -109,6 +109,8 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
|
|
|
109
109
|
-999, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 100-109
|
|
110
110
|
-999, -999, -999, -999, -1, # 110-114
|
|
111
111
|
-999, -999, -999, -999, -999, -999, -999, -999, # 115-122
|
|
112
|
+
-999, -999, -999, -999, -999, -999, -999, -999, # 123-130
|
|
113
|
+
-999, -999, -999, -999, -999, # 131-135
|
|
112
114
|
]
|
|
113
115
|
|
|
114
116
|
# double transpose to remove keys
|
|
@@ -126,7 +128,7 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
|
|
|
126
128
|
sequence = get_data(data, sequence_index)
|
|
127
129
|
|
|
128
130
|
# adjustment
|
|
129
|
-
isochron_mark.replace({4.0: 1}, inplace=True)
|
|
131
|
+
isochron_mark.replace({4.0: '1'}, inplace=True)
|
|
130
132
|
total_param[83] = logs01[1][9] # No
|
|
131
133
|
total_param[84] = logs01[1][10] # %SD
|
|
132
134
|
total_param[81] = logs01[1][11] # K mass
|
|
@@ -283,6 +285,10 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
|
|
|
283
285
|
-999, -999, -999, -999, -1,
|
|
284
286
|
# 115-122
|
|
285
287
|
-999, -999, -999, -999, -999, -999, -999, -999,
|
|
288
|
+
# 123-130
|
|
289
|
+
-999, -999, -999, -999, -999, -999, -999, -999,
|
|
290
|
+
# 131-135
|
|
291
|
+
-999, -999, -999, -999, -999,
|
|
286
292
|
]
|
|
287
293
|
|
|
288
294
|
# double transpose to remove keys
|
|
@@ -304,7 +310,7 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
|
|
|
304
310
|
total_param.copy(), logs02, get_data(data, [59, 58, 57, 60, 61]), data[63][0]
|
|
305
311
|
)
|
|
306
312
|
# Do adjustment
|
|
307
|
-
isochron_mark.replace({4.0: 1}, inplace=True)
|
|
313
|
+
isochron_mark.replace({4.0: '1'}, inplace=True)
|
|
308
314
|
total_param[44] = logs01[1][40]
|
|
309
315
|
total_param[45] = logs01[1][41]
|
|
310
316
|
total_param[42] = logs01[1][38]
|
|
@@ -417,9 +423,10 @@ def open_full_xls(file_path: str, sample_name: str = ''):
|
|
|
417
423
|
return e
|
|
418
424
|
start_row = 5
|
|
419
425
|
rows_num = len(res['Sample Parameters']) - 5
|
|
426
|
+
|
|
420
427
|
for key, val in res.items():
|
|
421
428
|
res[key] = arr.transpose(val[:start_row + rows_num])
|
|
422
|
-
# 2
|
|
429
|
+
# 2 sigma errors to 1 sigma
|
|
423
430
|
for i in range(len(res[key])):
|
|
424
431
|
if res[key][i][2] in ['2s', '%2s', '± 2s']:
|
|
425
432
|
_temp = []
|
|
@@ -442,7 +449,7 @@ def open_full_xls(file_path: str, sample_name: str = ''):
|
|
|
442
449
|
res['Incremental Heating Summary'][13][start_row: start_row + rows_num] = _temp
|
|
443
450
|
res['Incremental Heating Summary'][13][start_row: start_row + rows_num] = _s
|
|
444
451
|
|
|
445
|
-
# degas
|
|
452
|
+
# degas: change relative uncertainties to absolute
|
|
446
453
|
for i in range(len(res['Degassing Patterns'])):
|
|
447
454
|
if res['Degassing Patterns'][i][2] in ['%1s', '%2s']:
|
|
448
455
|
_temp = []
|
|
@@ -453,7 +460,7 @@ def open_full_xls(file_path: str, sample_name: str = ''):
|
|
|
453
460
|
except TypeError:
|
|
454
461
|
_temp.append('')
|
|
455
462
|
res['Degassing Patterns'][i][start_row: start_row + rows_num] = _temp
|
|
456
|
-
rows = list(range(start_row, rows_num))
|
|
463
|
+
rows = list(range(start_row, start_row + rows_num))
|
|
457
464
|
sequence_name = arr.partial(res['Procedure Blanks'], rows, 1)
|
|
458
465
|
sequence_value = arr.partial(res['Procedure Blanks'], rows, 2)
|
|
459
466
|
blank_values = arr.partial(
|
|
@@ -503,15 +510,17 @@ def open_full_xls(file_path: str, sample_name: str = ''):
|
|
|
503
510
|
-1, -1, # 56-57
|
|
504
511
|
-1, -1, # 58-59
|
|
505
512
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, # 60-68
|
|
506
|
-
10, 11, 12, 13, #
|
|
507
|
-
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, #
|
|
508
|
-
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, #
|
|
509
|
-
-1, -1, -1, -1, #
|
|
510
|
-
-1, -1, -1, -1, #
|
|
511
|
-
-1, -1, -1, -1, -
|
|
512
|
-
-1, -1, -1, -1, #
|
|
513
|
-
-1, -1, -1, -1, #
|
|
514
|
-
-1, #
|
|
513
|
+
10, 11, 12, 13, # 69-72
|
|
514
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 73-84
|
|
515
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 85-94
|
|
516
|
+
-1, -1, -1, -1, # 95-98
|
|
517
|
+
-1, -1, -1, -1, # 99-102
|
|
518
|
+
-1, -1, -1, -1, # 103-106
|
|
519
|
+
-1, -1, -1, -1, # 107-110
|
|
520
|
+
-1, -1, -1, -1, # 111-114
|
|
521
|
+
-1, -1, -1, -1, -1, -1, -1, -1, # 115-122
|
|
522
|
+
-1, -1, -1, -1, -1, -1, -1, -1, # 123-130
|
|
523
|
+
-1, -1, -1, -1, -1, # 131-135
|
|
515
524
|
])
|
|
516
525
|
|
|
517
526
|
month_convert = {'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06',
|
|
@@ -544,7 +553,7 @@ def open_full_xls(file_path: str, sample_name: str = ''):
|
|
|
544
553
|
isochron_values[24:29] = isochron.get_data(
|
|
545
554
|
degas_values[10], degas_values[11], degas_values[24], degas_values[25], degas_values[20], degas_values[21]
|
|
546
555
|
) # 38/39, 40/39
|
|
547
|
-
isochron_mark = [1 if i == 'P' else '' for i in arr.partial(
|
|
556
|
+
isochron_mark = ['1' if i == 'P' else '' for i in arr.partial(
|
|
548
557
|
res['Normal Isochron Table'], rows, 3)]
|
|
549
558
|
|
|
550
559
|
sample_info = {
|
ararpy/smp/basic.py
CHANGED
|
@@ -20,6 +20,7 @@ from typing import Optional, Union, List
|
|
|
20
20
|
from .. import calc
|
|
21
21
|
from ..files.basic import (read as read_params)
|
|
22
22
|
from .sample import Sample, Table, Plot, ArArData, ArArBasic, Sequence, RawData
|
|
23
|
+
from .initial import preference_keys
|
|
23
24
|
|
|
24
25
|
Set = Plot.Set
|
|
25
26
|
Label = Plot.Label
|
|
@@ -128,20 +129,38 @@ def calc_age(ar40ar39=None, params: dict = None, smp: Sample = None, index: list
|
|
|
128
129
|
params_from_smp.update(params)
|
|
129
130
|
params = params_from_smp
|
|
130
131
|
|
|
132
|
+
u = 'Ma'
|
|
133
|
+
try:
|
|
134
|
+
u = smp.Info.preference['ageUnit']
|
|
135
|
+
except:
|
|
136
|
+
print(traceback.format_exc())
|
|
137
|
+
pass
|
|
138
|
+
finally:
|
|
139
|
+
if u.lower() == 'ga':
|
|
140
|
+
age_unit_factor = 1000000000
|
|
141
|
+
elif u.lower() == 'ma':
|
|
142
|
+
age_unit_factor = 1000000
|
|
143
|
+
elif u.lower() == 'ka':
|
|
144
|
+
age_unit_factor = 1000
|
|
145
|
+
else:
|
|
146
|
+
age_unit_factor = 1
|
|
147
|
+
|
|
131
148
|
# check if using Min equation
|
|
132
149
|
params['Min'] = [i if isinstance(i, bool) else False for i in params['Min']]
|
|
133
150
|
|
|
134
|
-
idx1 = np.flatnonzero(np.where(params['Min'], True, False)) # True, using Min
|
|
151
|
+
idx1 = np.flatnonzero(np.where(params['Min'], True, False)) # True, using Min equation
|
|
135
152
|
idx2 = np.flatnonzero(np.where(params['Min'], False, True)) # False
|
|
136
153
|
k1, k2 = [], []
|
|
137
154
|
if np.size(idx1) > 0:
|
|
138
155
|
k1 = calc.age.calc_age_min(
|
|
139
156
|
F=[ar40ar39[0][i] for i in idx1], sF=[ar40ar39[1][i] for i in idx1],
|
|
140
157
|
**dict(zip(params.keys(), [[val[i] for i in idx1] for val in params.values()])))
|
|
158
|
+
k1 = [i / age_unit_factor for i in k1]
|
|
141
159
|
if np.size(idx2) > 0:
|
|
142
160
|
k2 = calc.age.calc_age_general(
|
|
143
161
|
F=[ar40ar39[0][i] for i in idx2], sF=[ar40ar39[1][i] for i in idx2],
|
|
144
162
|
**dict(zip(params.keys(), [[val[i] for i in idx2] for val in params.values()])))
|
|
163
|
+
k2 = [i / age_unit_factor for i in k2]
|
|
145
164
|
|
|
146
165
|
# idx1 = params[params['Min'].astype(bool)].index
|
|
147
166
|
# idx2 = params[~params['Min'].astype(bool)].index # The operators are: | for or, & for and, and ~ for not
|
|
@@ -477,7 +496,7 @@ def set_params(smp: Sample, params: Union[List, str], flag: Optional[str] = None
|
|
|
477
496
|
return set_params(smp, read_params(params), flag=flag)
|
|
478
497
|
|
|
479
498
|
def remove_none(old_params, new_params, rows, length):
|
|
480
|
-
res = [[]
|
|
499
|
+
res = [[] for _ in range(length)]
|
|
481
500
|
for index, item in enumerate(new_params):
|
|
482
501
|
if item is None:
|
|
483
502
|
res[index] = old_params[index]
|
|
@@ -487,6 +506,9 @@ def set_params(smp: Sample, params: Union[List, str], flag: Optional[str] = None
|
|
|
487
506
|
|
|
488
507
|
n = len(smp.SequenceName)
|
|
489
508
|
|
|
509
|
+
if n == 0:
|
|
510
|
+
raise ValueError(f"The number of sample sequences is undefined.")
|
|
511
|
+
|
|
490
512
|
if flag == 'calc':
|
|
491
513
|
smp.TotalParam[34:56] = remove_none(smp.TotalParam[34:56], params[0:22], n, 56 - 34)
|
|
492
514
|
smp.TotalParam[71:97] = remove_none(smp.TotalParam[71:97], params[22:48], n, 97 - 71)
|
|
@@ -524,22 +546,32 @@ def set_params(smp: Sample, params: Union[List, str], flag: Optional[str] = None
|
|
|
524
546
|
stand_time_second = [
|
|
525
547
|
calc.basic.get_datetime(*re.findall(r"\d+", smp.TotalParam[31][i])) - calc.basic.get_datetime(
|
|
526
548
|
*re.findall(r"\d+", smp.TotalParam[30][i])) for i in range(n)]
|
|
527
|
-
except
|
|
549
|
+
except (BaseException, Exception):
|
|
528
550
|
print(f'Error in calculate standing duration: {traceback.format_exc()}')
|
|
551
|
+
raise
|
|
529
552
|
else:
|
|
530
553
|
smp.TotalParam[32] = [i / (3600 * 24 * 365.242) for i in stand_time_second] # stand year
|
|
531
554
|
|
|
532
555
|
elif flag == 'smp':
|
|
533
|
-
print(params)
|
|
556
|
+
print(dict(zip([i for i in range(len(params))], params)))
|
|
534
557
|
smp.TotalParam[67:71] = remove_none(smp.TotalParam[67:71], params[0:4], n, 71 - 67)
|
|
535
558
|
smp.TotalParam[58:67] = remove_none(smp.TotalParam[58:67], params[4:13], n, 67 - 58)
|
|
536
559
|
smp.TotalParam[97:100] = remove_none(smp.TotalParam[97:100], params[13:16], n, 100 - 97)
|
|
537
560
|
smp.TotalParam[115:120] = remove_none(smp.TotalParam[115:120], params[16:21], n, 120 - 115)
|
|
538
561
|
smp.TotalParam[126:136] = remove_none(smp.TotalParam[126:136], params[21:31], n, 136 - 126)
|
|
539
|
-
smp.TotalParam[120:123] = remove_none(smp.TotalParam[120:123], params[31:34], n, 123 - 120)
|
|
562
|
+
# smp.TotalParam[120:123] = remove_none(smp.TotalParam[120:123], params[31:34], n, 123 - 120)
|
|
540
563
|
smp.TotalParam[100:114] = remove_none(
|
|
541
564
|
smp.TotalParam[100:114],
|
|
542
|
-
[['Linear', 'Exponential', 'Power'][params[
|
|
565
|
+
[['Linear', 'Exponential', 'Power'][params[35:38].index(True)] if True in params[35:38] else '', *params[38:]], n, 114 - 100)
|
|
566
|
+
pref = dict(zip(preference_keys, params[31:35]))
|
|
567
|
+
smp.Info.preference.update(pref)
|
|
568
|
+
for key, comp in get_components(smp).items():
|
|
569
|
+
if isinstance(comp, Table):
|
|
570
|
+
comp.decimal_places = pref['decimalPlaces']
|
|
571
|
+
comp.set_coltypes()
|
|
572
|
+
smp.AgeSpectraPlot.yaxis.title.text = f"Apparent Age ({str(pref['ageUnit']).capitalize()})"
|
|
573
|
+
print(smp.Info.preference)
|
|
574
|
+
|
|
543
575
|
else:
|
|
544
576
|
raise KeyError(f"{flag = } is not supported. It must be 'calc' for Calc Params, "
|
|
545
577
|
f"'irra' for Irradiation Params, or 'smp' for Sample Params.")
|
|
@@ -547,16 +579,22 @@ def set_params(smp: Sample, params: Union[List, str], flag: Optional[str] = None
|
|
|
547
579
|
|
|
548
580
|
|
|
549
581
|
def get_sequence(smp: Sample):
|
|
582
|
+
set1_index = [index for index, _ in enumerate(smp.IsochronMark) if _ in [1, '1']]
|
|
583
|
+
set2_index = [index for index, _ in enumerate(smp.IsochronMark) if _ in [2, '2']]
|
|
584
|
+
set3_index = list(set(range(0, len(smp.IsochronMark))) - set(set1_index) - set(set2_index))
|
|
585
|
+
smp.SelectedSequence1 = set1_index
|
|
586
|
+
smp.SelectedSequence2 = set2_index
|
|
587
|
+
smp.UnselectedSequence = set3_index
|
|
588
|
+
smp.Info.results.selection[0]['data'] = smp.SelectedSequence1
|
|
589
|
+
smp.Info.results.selection[1]['data'] = smp.SelectedSequence2
|
|
590
|
+
smp.Info.results.selection[2]['data'] = smp.UnselectedSequence
|
|
550
591
|
return ArArBasic(
|
|
551
592
|
size=len(smp.SequenceName), name=smp.SequenceName, value=smp.SequenceValue, unit=smp.SequenceUnit,
|
|
552
593
|
mark=ArArBasic(
|
|
553
594
|
size=len(smp.IsochronMark), value=smp.IsochronMark,
|
|
554
|
-
set1=ArArBasic(size=
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
index=[index for index, _ in enumerate(smp.IsochronMark) if _ == 2]),
|
|
558
|
-
unselected=ArArBasic(size=sum([0 if i == 2 or i == 1 else 1 for i in smp.IsochronMark]),
|
|
559
|
-
index=[index for index, _ in enumerate(smp.IsochronMark) if _ != 1 and _ != 2]),
|
|
595
|
+
set1=ArArBasic(size=len(set1_index), index=set1_index),
|
|
596
|
+
set2=ArArBasic(size=len(set2_index), index=set2_index),
|
|
597
|
+
unselected=ArArBasic(size=len(set3_index), index=set3_index),
|
|
560
598
|
)
|
|
561
599
|
)
|
|
562
600
|
|
ararpy/smp/corr.py
CHANGED
|
@@ -506,11 +506,11 @@ def monte_carlo_f(sample: Sample):
|
|
|
506
506
|
M39 = np.transpose(sample.TotalParam[77:79])
|
|
507
507
|
M40 = np.transpose(sample.TotalParam[79:81])
|
|
508
508
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
509
|
+
G36 = np.transpose(sample.TotalParam[126:128]) # gain correction factors
|
|
510
|
+
G37 = np.transpose(sample.TotalParam[128:130])
|
|
511
|
+
G38 = np.transpose(sample.TotalParam[130:132])
|
|
512
|
+
G39 = np.transpose(sample.TotalParam[132:134])
|
|
513
|
+
G40 = np.transpose(sample.TotalParam[134:136])
|
|
514
514
|
|
|
515
515
|
MDF = np.transpose(sample.TotalParam[69:71])
|
|
516
516
|
|
|
@@ -553,6 +553,7 @@ def monte_carlo_f(sample: Sample):
|
|
|
553
553
|
ar40m=ar40m[i], ar39m=ar39m[i], ar38m=ar38m[i], ar37m=ar37m[i], ar36m=ar36m[i],
|
|
554
554
|
ar40b=ar40b[i], ar39b=ar39b[i], ar38b=ar38b[i], ar37b=ar37b[i], ar36b=ar36b[i],
|
|
555
555
|
M40=M40[i], M39=M39[i], M38=M38[i], M37=M37[i], M36=M36[i],
|
|
556
|
+
G40=G40[i], G39=G39[i], G38=G38[i], G37=G37[i], G36=G36[i],
|
|
556
557
|
t1=t1[i], t2=t2[i], t3=t3[i],
|
|
557
558
|
R40v36a=R40v36a[i], R38v36a=R38v36a[i],
|
|
558
559
|
R39v37ca=R39v37ca[i], R36v37ca=R36v37ca[i], R38v37ca=R38v37ca[i],
|
|
@@ -560,7 +561,8 @@ def monte_carlo_f(sample: Sample):
|
|
|
560
561
|
R36v38clp=R36v38clp[i],
|
|
561
562
|
L37ar=L37ar[i], L39ar=L39ar[i], L36cl=L36cl[i],
|
|
562
563
|
MDFunc=None,
|
|
563
|
-
MDF=MDF[i], stand_time_year=stand_time_year[i]
|
|
564
|
+
MDF=MDF[i], stand_time_year=stand_time_year[i],
|
|
565
|
+
blank_gain_corr=sample.TotalParam[111][i]
|
|
564
566
|
)
|
|
565
567
|
|
|
566
568
|
yield res
|