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.
@@ -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
+