ararpy 0.0.1a1__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 +178 -0
- ararpy/calc/__init__.py +11 -0
- ararpy/calc/age.py +161 -0
- ararpy/calc/arr.py +490 -0
- ararpy/calc/basic.py +57 -0
- ararpy/calc/corr.py +240 -0
- ararpy/calc/err.py +117 -0
- ararpy/calc/histogram.py +166 -0
- ararpy/calc/isochron.py +194 -0
- ararpy/calc/jvalue.py +38 -0
- ararpy/calc/plot.py +68 -0
- ararpy/calc/raw_funcs.py +118 -0
- ararpy/calc/regression.py +961 -0
- ararpy/calc/spectra.py +63 -0
- ararpy/files/__init__.py +2 -0
- ararpy/files/arr_file.py +86 -0
- ararpy/files/basic.py +100 -0
- ararpy/files/calc_file.py +683 -0
- ararpy/files/export.py +1181 -0
- ararpy/files/json.py +49 -0
- ararpy/files/new_file.py +31 -0
- ararpy/files/raw.py +115 -0
- ararpy/files/raw_file.py +14 -0
- ararpy/files/xls.py +27 -0
- ararpy/smp/__init__.py +17 -0
- ararpy/smp/basic.py +371 -0
- ararpy/smp/calculation.py +94 -0
- ararpy/smp/consts.py +20 -0
- ararpy/smp/corr.py +376 -0
- ararpy/smp/initial.py +232 -0
- ararpy/smp/plots.py +636 -0
- ararpy/smp/sample.py +911 -0
- ararpy/smp/style.py +191 -0
- ararpy/smp/table.py +131 -0
- ararpy-0.0.1a1.dist-info/LICENSE +21 -0
- ararpy-0.0.1a1.dist-info/METADATA +269 -0
- ararpy-0.0.1a1.dist-info/RECORD +39 -0
- ararpy-0.0.1a1.dist-info/WHEEL +5 -0
- ararpy-0.0.1a1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: UTF-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
# ==========================================
|
|
5
|
+
# Copyright 2023 Yang
|
|
6
|
+
# ararpy - smp - calculation
|
|
7
|
+
# 2023-12-4
|
|
8
|
+
# ==========================================
|
|
9
|
+
#
|
|
10
|
+
# ArArPy.smp.smp_funcs
|
|
11
|
+
#
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from . import (
|
|
15
|
+
basic, corr, initial, plots, style, table
|
|
16
|
+
)
|
|
17
|
+
from .sample import Sample
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def recalculate(
|
|
21
|
+
sample: Sample, re_initial: bool = False,
|
|
22
|
+
re_corr_blank: bool = False, re_corr_massdiscr: bool = False,
|
|
23
|
+
re_corr_decay: bool = False, re_degas_ca: bool = False, re_degas_k: bool = False,
|
|
24
|
+
re_degas_cl: bool = False, re_degas_atm: bool = False, re_degas_r: bool = False,
|
|
25
|
+
re_calc_ratio: bool = False, re_calc_apparent_age: bool = False,
|
|
26
|
+
re_plot: bool = False, re_plot_style: bool = False, re_set_table: bool = False,
|
|
27
|
+
re_table_style: bool = False, **kwargs
|
|
28
|
+
):
|
|
29
|
+
"""
|
|
30
|
+
Assign recalculate functions based on selections
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
sample
|
|
34
|
+
re_initial
|
|
35
|
+
re_corr_blank
|
|
36
|
+
re_corr_massdiscr
|
|
37
|
+
re_corr_decay
|
|
38
|
+
re_degas_ca
|
|
39
|
+
re_degas_k
|
|
40
|
+
re_degas_cl
|
|
41
|
+
re_degas_atm
|
|
42
|
+
re_degas_r
|
|
43
|
+
re_calc_ratio
|
|
44
|
+
re_calc_apparent_age
|
|
45
|
+
re_plot
|
|
46
|
+
re_plot_style
|
|
47
|
+
re_set_table
|
|
48
|
+
re_table_style
|
|
49
|
+
kwargs
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
Sample
|
|
54
|
+
"""
|
|
55
|
+
if len(sample.UnselectedSequence) == len(sample.SelectedSequence1) == len(sample.SelectedSequence2) == 0:
|
|
56
|
+
sample.UnselectedSequence = list(range(len(sample.SequenceName)))
|
|
57
|
+
# print(f"{sample.UnselectedSequence = }")
|
|
58
|
+
# print(f"{sample.SelectedSequence1 = }")
|
|
59
|
+
# print(f"{sample.SelectedSequence2 = }")
|
|
60
|
+
# --- initializing ---
|
|
61
|
+
if re_initial: # 1
|
|
62
|
+
initial.re_set_smp(sample)
|
|
63
|
+
# --- calculating ---
|
|
64
|
+
if re_corr_blank: # 2
|
|
65
|
+
corr.corr_blank(sample)
|
|
66
|
+
if re_corr_massdiscr: # 3
|
|
67
|
+
corr.corr_massdiscr(sample)
|
|
68
|
+
if re_corr_decay: # 4
|
|
69
|
+
corr.corr_decay(sample)
|
|
70
|
+
if re_degas_ca: # 5
|
|
71
|
+
corr.calc_degas_ca(sample)
|
|
72
|
+
if re_degas_k: # 6
|
|
73
|
+
corr.calc_degas_k(sample)
|
|
74
|
+
if re_degas_cl: # 7
|
|
75
|
+
corr.calc_degas_cl(sample)
|
|
76
|
+
if re_degas_atm: # 8
|
|
77
|
+
corr.calc_degas_atm(sample)
|
|
78
|
+
if re_degas_r: # 9
|
|
79
|
+
corr.calc_degas_r(sample)
|
|
80
|
+
if re_calc_ratio: # 10
|
|
81
|
+
corr.calc_ratio(sample)
|
|
82
|
+
if re_calc_apparent_age: # 11
|
|
83
|
+
basic.calc_apparent_ages(sample)
|
|
84
|
+
# --- plot and table ---
|
|
85
|
+
if re_plot: # 12
|
|
86
|
+
plots.set_plot_data(sample, **kwargs)
|
|
87
|
+
if re_plot_style: # 13
|
|
88
|
+
style.set_plot_style(sample)
|
|
89
|
+
if re_set_table: # 14
|
|
90
|
+
table.update_table_data(sample)
|
|
91
|
+
if re_table_style: # 15
|
|
92
|
+
style.set_table_style(sample)
|
|
93
|
+
return sample
|
|
94
|
+
|
ararpy/smp/consts.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: UTF-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
# ==========================================
|
|
5
|
+
# Copyright 2023 Yang
|
|
6
|
+
# webarar - consts
|
|
7
|
+
# ==========================================
|
|
8
|
+
#
|
|
9
|
+
#
|
|
10
|
+
#
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# unicode for superscript numbers
|
|
14
|
+
sup_35 = '\u00B3\u2075'
|
|
15
|
+
sup_36 = '\u00B3\u2076'
|
|
16
|
+
sup_37 = '\u00B3\u2077'
|
|
17
|
+
sup_38 = '\u00B3\u2078'
|
|
18
|
+
sup_39 = '\u00B3\u2079'
|
|
19
|
+
sup_40 = '\u2074\u2070'
|
|
20
|
+
|
ararpy/smp/corr.py
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: UTF-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
# ==========================================
|
|
5
|
+
# Copyright 2023 Yang
|
|
6
|
+
# ararpy - smp - corr
|
|
7
|
+
# ==========================================
|
|
8
|
+
#
|
|
9
|
+
#
|
|
10
|
+
#
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import traceback
|
|
14
|
+
import numpy as np
|
|
15
|
+
import copy
|
|
16
|
+
import re
|
|
17
|
+
|
|
18
|
+
from .. import calc
|
|
19
|
+
from .sample import Sample
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# =======================
|
|
23
|
+
# Corr Blank
|
|
24
|
+
# =======================
|
|
25
|
+
def corr_blank(sample: Sample):
|
|
26
|
+
"""Blank Correction"""
|
|
27
|
+
corrBlank = sample.TotalParam[102][0]
|
|
28
|
+
set_negative_zero = sample.TotalParam[101][0]
|
|
29
|
+
if not corrBlank:
|
|
30
|
+
sample.BlankCorrected = copy.deepcopy(sample.SampleIntercept)
|
|
31
|
+
sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
|
|
32
|
+
return
|
|
33
|
+
blank_corrected = [[]]*10
|
|
34
|
+
try:
|
|
35
|
+
for i in range(5):
|
|
36
|
+
blank_corrected[i * 2:2 + i * 2] = calc.corr.blank(
|
|
37
|
+
*sample.SampleIntercept[i * 2:2 + i * 2], *sample.BlankIntercept[i * 2:2 + i * 2])
|
|
38
|
+
except Exception as e:
|
|
39
|
+
print(traceback.format_exc())
|
|
40
|
+
raise ValueError('Blank correction error')
|
|
41
|
+
if set_negative_zero:
|
|
42
|
+
blank_corrected[0] = [i if i >= 0 else 0 for i in blank_corrected[0]]
|
|
43
|
+
sample.BlankCorrected = blank_corrected
|
|
44
|
+
sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# =======================
|
|
48
|
+
# Mass Discrimination
|
|
49
|
+
# =======================
|
|
50
|
+
def corr_massdiscr(sample: Sample):
|
|
51
|
+
"""Mass Discrimination Correction"""
|
|
52
|
+
corrMassdiscr = sample.TotalParam[103][0]
|
|
53
|
+
if not corrMassdiscr:
|
|
54
|
+
sample.MassDiscrCorrected = copy.deepcopy(sample.BlankCorrected)
|
|
55
|
+
sample.CorrectedValues = copy.deepcopy(sample.MassDiscrCorrected)
|
|
56
|
+
return
|
|
57
|
+
MASS = sample.TotalParam[71:81]
|
|
58
|
+
mdf_corrected = [[]]*10
|
|
59
|
+
try:
|
|
60
|
+
for i in range(5):
|
|
61
|
+
mdf_corrected[i * 2:2 + i * 2] = calc.corr.discr(
|
|
62
|
+
*sample.BlankCorrected[i * 2:2 + i * 2],
|
|
63
|
+
*sample.TotalParam[69:71], m=MASS[i*2], m40=MASS[8], isRelative=True,
|
|
64
|
+
method=sample.TotalParam[100][0])
|
|
65
|
+
except Exception as e:
|
|
66
|
+
print(traceback.format_exc())
|
|
67
|
+
raise ValueError('Mass discrimination correction error')
|
|
68
|
+
sample.MassDiscrCorrected = mdf_corrected
|
|
69
|
+
sample.CorrectedValues = copy.deepcopy(sample.MassDiscrCorrected)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# =======================
|
|
73
|
+
# Decay correction
|
|
74
|
+
# =======================
|
|
75
|
+
def corr_decay(sample: Sample):
|
|
76
|
+
""" Ar37 and Ar39 Decay Correction
|
|
77
|
+
Parameters
|
|
78
|
+
----------
|
|
79
|
+
sample
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
|
|
84
|
+
"""
|
|
85
|
+
decay_corrected = [[]]*10
|
|
86
|
+
try:
|
|
87
|
+
irradiation_cycles = [list(filter(None, re.split(r'[DS]', each_step))) for each_step in sample.TotalParam[27]]
|
|
88
|
+
t1 = [i.split('-') for i in sample.TotalParam[31]] # t1: experimental times
|
|
89
|
+
t2, t3 = [], [] # t2: irradiation times, t3: irradiation durations
|
|
90
|
+
for each_step in irradiation_cycles:
|
|
91
|
+
t2.append([item.split('-') for i, item in enumerate(each_step) if i % 2 == 0])
|
|
92
|
+
t3.append([item for i, item in enumerate(each_step) if i % 2 == 1])
|
|
93
|
+
decay_corrected[2:4] = calc.corr.decay(
|
|
94
|
+
*sample.MassDiscrCorrected[2:4], t1, t2, t3, *sample.TotalParam[44:46], isRelative=True)
|
|
95
|
+
decay_corrected[6:8] = calc.corr.decay(
|
|
96
|
+
*sample.MassDiscrCorrected[6:8], t1, t2, t3, *sample.TotalParam[42:44], isRelative=True)
|
|
97
|
+
# Negative number set to zero in decay correction
|
|
98
|
+
decay_corrected[2] = [0 if i < 0 else i for i in decay_corrected[2]]
|
|
99
|
+
decay_corrected[6] = [0 if i < 0 else i for i in decay_corrected[6]]
|
|
100
|
+
except Exception as e:
|
|
101
|
+
print(traceback.format_exc())
|
|
102
|
+
raise ValueError('Decay correction correction error')
|
|
103
|
+
|
|
104
|
+
corrDecay37 = sample.TotalParam[104][0]
|
|
105
|
+
corrDecay39 = sample.TotalParam[105][0]
|
|
106
|
+
if corrDecay37:
|
|
107
|
+
sample.CorrectedValues[2:4] = copy.deepcopy(decay_corrected[2:4])
|
|
108
|
+
if corrDecay39:
|
|
109
|
+
sample.CorrectedValues[6:8] = copy.deepcopy(decay_corrected[6:8])
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# =======================
|
|
113
|
+
# Degas Calcium derived 37Ar 36Ar 38Ar 39Ar
|
|
114
|
+
# =======================
|
|
115
|
+
def calc_degas_ca(sample: Sample):
|
|
116
|
+
""" Degas Pattern for Ca
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
sample
|
|
120
|
+
|
|
121
|
+
Returns
|
|
122
|
+
-------
|
|
123
|
+
|
|
124
|
+
"""
|
|
125
|
+
corrDecasCa = sample.TotalParam[106][0]
|
|
126
|
+
n = len(sample.CorrectedValues[2])
|
|
127
|
+
ar37ca = sample.CorrectedValues[2:4]
|
|
128
|
+
ar39ca = calc.arr.mul_factor(ar37ca, sample.TotalParam[8:10], isRelative=True)
|
|
129
|
+
ar38ca = calc.arr.mul_factor(ar37ca, sample.TotalParam[10:12], isRelative=True)
|
|
130
|
+
ar36ca = calc.arr.mul_factor(ar37ca, sample.TotalParam[12:14], isRelative=True)
|
|
131
|
+
sample.DegasValues[8:10] = ar37ca
|
|
132
|
+
sample.DegasValues[22:24] = ar39ca if corrDecasCa else [[0] * n, [0] * n]
|
|
133
|
+
sample.DegasValues[18:20] = ar38ca if corrDecasCa else [[0] * n, [0] * n]
|
|
134
|
+
sample.DegasValues[4:6] = ar36ca if corrDecasCa else [[0] * n, [0] * n]
|
|
135
|
+
sample.PublishValues[1] = ar37ca[0]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# =======================
|
|
139
|
+
# Degas Potassium derived 39Ar 38Ar 40Ar
|
|
140
|
+
# =======================
|
|
141
|
+
def calc_degas_k(sample: Sample):
|
|
142
|
+
""" Degas Pattern for K
|
|
143
|
+
Parameters
|
|
144
|
+
----------
|
|
145
|
+
sample
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
|
|
150
|
+
"""
|
|
151
|
+
corrDecasK = sample.TotalParam[107][0]
|
|
152
|
+
set_negative_zero = sample.TotalParam[101][0]
|
|
153
|
+
n = len(sample.CorrectedValues[6])
|
|
154
|
+
ar39k = calc.arr.sub(sample.CorrectedValues[6:8], sample.DegasValues[22:24])
|
|
155
|
+
ar39k[0] = [0 if i < 0 and set_negative_zero else i for i in ar39k[0]]
|
|
156
|
+
ar40k = calc.arr.mul_factor(ar39k, sample.TotalParam[14:16], isRelative=True)
|
|
157
|
+
ar38k = calc.arr.mul_factor(ar39k, sample.TotalParam[16:18], isRelative=True)
|
|
158
|
+
|
|
159
|
+
sample.PublishValues[3] = ar39k[0]
|
|
160
|
+
sample.DegasValues[20:22] = ar39k
|
|
161
|
+
sample.DegasValues[30:32] = ar40k if corrDecasK else [[0] * n, [0] * n]
|
|
162
|
+
sample.DegasValues[16:18] = ar38k if corrDecasK else [[0] * n, [0] * n]
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# =======================
|
|
166
|
+
# Degas Chlorine derived 36Ar 38Ar
|
|
167
|
+
# =======================
|
|
168
|
+
def calc_degas_cl(sample: Sample):
|
|
169
|
+
""" Degas Pattern for Cl
|
|
170
|
+
Parameters
|
|
171
|
+
----------
|
|
172
|
+
sample
|
|
173
|
+
|
|
174
|
+
Returns
|
|
175
|
+
-------
|
|
176
|
+
|
|
177
|
+
"""
|
|
178
|
+
corrDecasCl = sample.TotalParam[108][0]
|
|
179
|
+
decay_const = sample.TotalParam[46:48]
|
|
180
|
+
cl36_cl38_p = sample.TotalParam[56:58]
|
|
181
|
+
ar38ar36 = sample.TotalParam[4:6]
|
|
182
|
+
stand_time_year = sample.TotalParam[32]
|
|
183
|
+
set_negative_zero = sample.TotalParam[101][0]
|
|
184
|
+
# ============
|
|
185
|
+
decay_const[1] = [decay_const[0][i] * decay_const[1][i] / 100 for i in
|
|
186
|
+
range(len(decay_const[0]))] # convert to absolute error
|
|
187
|
+
cl36_cl38_p[1] = [cl36_cl38_p[0][i] * cl36_cl38_p[1][i] / 100 for i in
|
|
188
|
+
range(len(cl36_cl38_p[0]))] # convert to absolute error
|
|
189
|
+
# convert to absolute error
|
|
190
|
+
ar38ar36[1] = [ar38ar36[0][i] * ar38ar36[1][i] / 100 for i in range(len(ar38ar36[0]))]
|
|
191
|
+
# ============
|
|
192
|
+
# 36Ar deduct Ca, that is sum of 36Ara and 36ArCl
|
|
193
|
+
ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
|
|
194
|
+
# 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl
|
|
195
|
+
ar38acl = calc.arr.sub(calc.arr.sub(
|
|
196
|
+
sample.CorrectedValues[4:6], sample.DegasValues[16:18]), sample.DegasValues[18:20])
|
|
197
|
+
if set_negative_zero:
|
|
198
|
+
for index, item in enumerate(ar36acl[0]):
|
|
199
|
+
if item < 0:
|
|
200
|
+
ar36acl[0][index] = 0
|
|
201
|
+
if ar38acl[0][index] < 0:
|
|
202
|
+
ar38acl[0][index] = 0
|
|
203
|
+
try:
|
|
204
|
+
if not corrDecasCl:
|
|
205
|
+
raise ValueError("Do not apply degas chlorine")
|
|
206
|
+
v3 = [cl36_cl38_p[0][i] * (1 - np.exp(-1 * decay_const[0][i] * stand_time_year[i])) for i in
|
|
207
|
+
range(len(stand_time_year))]
|
|
208
|
+
s3 = [pow((cl36_cl38_p[1][i] * (1 - np.exp(-1 * decay_const[0][i] * stand_time_year[i]))) ** 2 +
|
|
209
|
+
(cl36_cl38_p[0][i] * stand_time_year[i] * (np.exp(-1 * decay_const[0][i] * stand_time_year[i])) *
|
|
210
|
+
decay_const[1][i]) ** 2, 0.5) for i in range(len(stand_time_year))]
|
|
211
|
+
s3 = [calc.err.div((1, 0), (v3[i], s3[i])) for i in range(len(s3))]
|
|
212
|
+
v3 = [1 / v3[i] for i in range(len(v3))]
|
|
213
|
+
# 36ArCl
|
|
214
|
+
ar36cl = [[], []]
|
|
215
|
+
ar36cl[0] = [(ar36acl[0][i] * ar38ar36[0][i] - ar38acl[0][i]) / (ar38ar36[0][i] - v3[i])
|
|
216
|
+
for i in range(len(ar36acl[0]))]
|
|
217
|
+
s1 = [(ar36acl[1][i] * ar38ar36[0][i] / (ar38ar36[0][i] - v3[i])) ** 2 for i in range(len(ar36cl[0]))]
|
|
218
|
+
s2 = [(ar38acl[1][i] / (ar38ar36[0][i] - v3[i])) ** 2 for i in range(len(ar36cl[0]))]
|
|
219
|
+
s3 = [(s3[i] * (ar36acl[0][i] * ar38ar36[0][i] - ar38acl[0][i]) / (ar38ar36[0][i] - v3[i]) ** 2) ** 2
|
|
220
|
+
for i in range(len(ar36cl[0]))]
|
|
221
|
+
s4 = [(ar36acl[0][i] / (ar38ar36[0][i] - v3[i]) -
|
|
222
|
+
(ar36acl[0][i] * ar38ar36[0][i] - ar38acl[0][i]) / (ar38ar36[0][i] - v3[i]) ** 2) ** 2 *
|
|
223
|
+
(ar38ar36[1][i]) ** 2 for i in range(len(ar36cl[0]))]
|
|
224
|
+
ar36cl[1] = [pow(s1[i] + s2[i] + s3[i] + s4[i], 0.5) for i in range(len(ar36cl[0]))]
|
|
225
|
+
|
|
226
|
+
# 38ArCl
|
|
227
|
+
ar38cl = [[], []]
|
|
228
|
+
ar38cl[1] = [calc.err.mul((ar36cl[0][i], ar36cl[1][i]), (v3[i], s3[i])) for i in range(len(ar36cl[0]))]
|
|
229
|
+
ar38cl[0] = [ar36cl[0][i] * v3[i] for i in range(len(ar36cl[0]))]
|
|
230
|
+
|
|
231
|
+
# Negative number set to zero
|
|
232
|
+
ar36cl[0] = [0 if i < 0 and set_negative_zero else i for i in ar36cl[0]]
|
|
233
|
+
# force 36ArCl to zero if 36Ar - 36ArCa - 36Cl < 0
|
|
234
|
+
ar36cl[0] = [0 if ar36acl[0][i] - item < 0 and set_negative_zero else item
|
|
235
|
+
for i, item in enumerate(ar36cl[0])]
|
|
236
|
+
|
|
237
|
+
except Exception as e:
|
|
238
|
+
print('Error in corr Cl: {}, lines: {}'.format(e, e.__traceback__.tb_lineno))
|
|
239
|
+
n = len(ar36acl[0])
|
|
240
|
+
ar36cl = [[0] * n, [0] * n]
|
|
241
|
+
ar38cl = [[0] * n, [0] * n]
|
|
242
|
+
sample.DegasValues[6:8] = ar36cl
|
|
243
|
+
sample.DegasValues[10:12] = ar38cl
|
|
244
|
+
sample.PublishValues[2] = ar38cl[0]
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
# =======================
|
|
248
|
+
# Degas atmospheric 36Ar 38Ar 40Ar
|
|
249
|
+
# =======================
|
|
250
|
+
def calc_degas_atm(sample: Sample):
|
|
251
|
+
""" Degas for Atmospheric Gas
|
|
252
|
+
Parameters
|
|
253
|
+
----------
|
|
254
|
+
sample
|
|
255
|
+
|
|
256
|
+
Returns
|
|
257
|
+
-------
|
|
258
|
+
|
|
259
|
+
"""
|
|
260
|
+
corrDecasAtm = sample.TotalParam[109][0]
|
|
261
|
+
set_negative_zero = sample.TotalParam[101][0]
|
|
262
|
+
n = len(sample.CorrectedValues[0])
|
|
263
|
+
# 36Ar deduct Ca, that is sum of 36Ara and 36ArCl
|
|
264
|
+
ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
|
|
265
|
+
if set_negative_zero:
|
|
266
|
+
ar36acl[0] = [i if i >= 0 else 0 for i in ar36acl[0]]
|
|
267
|
+
# 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl
|
|
268
|
+
# ar38acl = calc.arr.sub()(
|
|
269
|
+
# calc.arr.sub()(sample.CorrectedValues[2:4], sample.DegasValues[16:18]), sample.DegasValues[18:20])
|
|
270
|
+
# 36ArAir
|
|
271
|
+
ar36a = calc.arr.sub(ar36acl, sample.DegasValues[6:8])
|
|
272
|
+
# If ar36acl - ar36cl < 0, let ar36a = ar36 - ar36ca
|
|
273
|
+
if set_negative_zero:
|
|
274
|
+
ar36a[0] = [item if item >= 0 else ar36acl[index] for index, item in enumerate(ar36a[0])]
|
|
275
|
+
# 38ArAir
|
|
276
|
+
ar38a = calc.arr.mul_factor(ar36a, sample.TotalParam[4:6], isRelative=True)
|
|
277
|
+
# 40ArAir
|
|
278
|
+
ar40a = calc.arr.mul_factor(ar36a, sample.TotalParam[0:2], isRelative=True)
|
|
279
|
+
sample.DegasValues[0:2] = ar36a
|
|
280
|
+
sample.DegasValues[12:14] = ar38a if corrDecasAtm else [[0] * n, [0] * n]
|
|
281
|
+
sample.DegasValues[26:28] = ar40a if corrDecasAtm else [[0] * n, [0] * n]
|
|
282
|
+
sample.PublishValues[0] = ar36a[0]
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
# =======================
|
|
286
|
+
# Degas radiogenic 40Ar
|
|
287
|
+
# =======================
|
|
288
|
+
def calc_degas_r(sample: Sample):
|
|
289
|
+
""" Degas for Radiogenic Ar40
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
sample
|
|
293
|
+
|
|
294
|
+
Returns
|
|
295
|
+
-------
|
|
296
|
+
|
|
297
|
+
"""
|
|
298
|
+
ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
|
|
299
|
+
ar40r = calc.arr.sub(ar40ar, sample.DegasValues[26:28])
|
|
300
|
+
ar40r[0] = [item if item >= 0 else 0 for item in ar40r[0]]
|
|
301
|
+
sample.DegasValues[24:26] = ar40r
|
|
302
|
+
sample.PublishValues[4] = ar40r[0]
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
# =======================
|
|
306
|
+
# Calc ratio
|
|
307
|
+
# =======================
|
|
308
|
+
def calc_ratio(sample: Sample):
|
|
309
|
+
""" Calculate isochron ratio data, 40Arr/39ArK, Ar40r percentage,
|
|
310
|
+
Ar39K released percentage, Ca/K
|
|
311
|
+
Parameters
|
|
312
|
+
----------
|
|
313
|
+
sample : Sample instance
|
|
314
|
+
|
|
315
|
+
Returns
|
|
316
|
+
-------
|
|
317
|
+
None
|
|
318
|
+
"""
|
|
319
|
+
ar40r_percent = [item / sample.CorrectedValues[8][index] * 100 if sample.CorrectedValues[8][index] != 0 else 0
|
|
320
|
+
for index, item in enumerate(sample.DegasValues[24])]
|
|
321
|
+
sum_ar39k = sum(sample.DegasValues[20])
|
|
322
|
+
ar39k_percent = [item / sum_ar39k * 100 if sum_ar39k != 0 else 0 for item in sample.DegasValues[20]]
|
|
323
|
+
ar40rar39k = calc.arr.mul_factor(
|
|
324
|
+
sample.DegasValues[24:26], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False),
|
|
325
|
+
isRelative=False)
|
|
326
|
+
CaK = calc.arr.mul_factor(calc.arr.mul_factor(
|
|
327
|
+
sample.DegasValues[8:10], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False)),
|
|
328
|
+
calc.arr.rec_factor(sample.TotalParam[20:22], isRelative=True))
|
|
329
|
+
isochron_1 = calc.isochron.get_data(*sample.DegasValues[20:22], *calc.arr.sub(
|
|
330
|
+
sample.CorrectedValues[8:10], sample.DegasValues[30:32]), *sample.DegasValues[0:2])
|
|
331
|
+
isochron_2 = calc.isochron.get_data(*sample.DegasValues[20:22], *sample.DegasValues[0:2], *calc.arr.sub(
|
|
332
|
+
sample.CorrectedValues[8:10], sample.DegasValues[30:32]))
|
|
333
|
+
isochron_3 = calc.isochron.get_data(
|
|
334
|
+
*sample.DegasValues[20:22], *sample.DegasValues[24:26], *sample.DegasValues[10:12])
|
|
335
|
+
isochron_4 = calc.isochron.get_data(
|
|
336
|
+
*sample.DegasValues[20:22], *sample.DegasValues[10:12], *sample.DegasValues[24:26])
|
|
337
|
+
isochron_5 = calc.isochron.get_data(
|
|
338
|
+
*sample.DegasValues[10:12], *sample.DegasValues[24:26], *sample.DegasValues[20:22])
|
|
339
|
+
|
|
340
|
+
# assignation
|
|
341
|
+
sample.ApparentAgeValues[0:2] = ar40rar39k
|
|
342
|
+
sample.ApparentAgeValues[6:8] = [ar40r_percent, ar39k_percent]
|
|
343
|
+
sample.PublishValues[7:11] = [ar40r_percent, ar39k_percent, *CaK]
|
|
344
|
+
sample.IsochronValues[0:5] = isochron_1
|
|
345
|
+
sample.IsochronValues[6:11] = isochron_2
|
|
346
|
+
sample.IsochronValues[12:17] = isochron_3
|
|
347
|
+
sample.IsochronValues[18:23] = isochron_4
|
|
348
|
+
sample.IsochronValues[24:29] = isochron_5
|
|
349
|
+
|
|
350
|
+
# === Cl-Atm-Correlation Plot ===
|
|
351
|
+
# === Ar values ===
|
|
352
|
+
# 3D ratio, 36Ar(a+cl)/40Ar(a+r), 38Ar(a+cl)/40Ar(a+r), 39Ar(k)/40Ar(a+r),
|
|
353
|
+
ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
|
|
354
|
+
# 36Ar deduct Ca, that is sum of 36Ara and 36ArCl (and also 36Arc)
|
|
355
|
+
ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
|
|
356
|
+
# 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl (and also 38Arc)
|
|
357
|
+
ar38acl = calc.arr.sub(calc.arr.sub(sample.CorrectedValues[4:6], sample.DegasValues[16:18]),
|
|
358
|
+
sample.DegasValues[18:20])
|
|
359
|
+
# 38ArCl
|
|
360
|
+
ar38cl = sample.DegasValues[10:12]
|
|
361
|
+
# 39ArK
|
|
362
|
+
ar39k = sample.DegasValues[20:22]
|
|
363
|
+
# isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar40ar, *ar39k)
|
|
364
|
+
isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar39k,
|
|
365
|
+
*ar40ar) # Points on the plot will be more disperse than the above
|
|
366
|
+
sample.IsochronValues[30:39] = isochron_6
|
|
367
|
+
|
|
368
|
+
# Turner 1988 3D cake mix plots
|
|
369
|
+
# ar40 = sample.CorrectedValues[8:10] # ar40 = atm + r + k
|
|
370
|
+
# ar36a = sample.DegasValues[0:2] # ar36a
|
|
371
|
+
# isochron_6 = calc.isochron.get_3d_data(*ar39k, *ar38cl, *ar40, *ar36a)
|
|
372
|
+
# sample.IsochronValues[30:39] = isochron_6
|
|
373
|
+
|
|
374
|
+
# Note that the difference between Turner 3D plots and our 3D plots.
|
|
375
|
+
|
|
376
|
+
|