ararpy 0.1.11__py3-none-any.whl → 0.1.13__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/calc/arr.py +4 -1
- ararpy/calc/basic.py +36 -14
- ararpy/calc/corr.py +15 -30
- ararpy/calc/isochron.py +4 -2
- ararpy/calc/raw_funcs.py +2 -2
- ararpy/calc/regression.py +3 -1
- ararpy/examples/WHA.pdf +2863 -0
- 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 +9 -7
- ararpy/smp/calculation.py +4 -0
- ararpy/smp/corr.py +104 -56
- ararpy/smp/diffusion_funcs.py +285 -124
- ararpy/smp/export.py +464 -1
- ararpy/smp/json.py +12 -1
- ararpy/smp/plots.py +10 -6
- ararpy/smp/raw.py +9 -2
- ararpy/smp/sample.py +28 -12
- ararpy/smp/table.py +8 -0
- ararpy/test.py +63 -0
- {ararpy-0.1.11.dist-info → ararpy-0.1.13.dist-info}/METADATA +1 -1
- {ararpy-0.1.11.dist-info → ararpy-0.1.13.dist-info}/RECORD +26 -24
- {ararpy-0.1.11.dist-info → ararpy-0.1.13.dist-info}/WHEEL +1 -1
- {ararpy-0.1.11.dist-info → ararpy-0.1.13.dist-info}/LICENSE +0 -0
- {ararpy-0.1.11.dist-info → ararpy-0.1.13.dist-info}/top_level.txt +0 -0
ararpy/smp/corr.py
CHANGED
|
@@ -19,27 +19,44 @@ from .. import calc
|
|
|
19
19
|
from .sample import Sample
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
# =======================
|
|
23
|
+
# Corr Gain
|
|
24
|
+
# =======================
|
|
25
|
+
def corr_gain(sample: Sample):
|
|
26
|
+
"""Blank Correction"""
|
|
27
|
+
corrGain = True
|
|
28
|
+
gain_corrected = np.zeros([10, len(sample.SequenceName)])
|
|
29
|
+
try:
|
|
30
|
+
for i in range(5):
|
|
31
|
+
f, sf = np.array(sample.TotalParam[126 + i * 2:128 + i * 2])
|
|
32
|
+
sf = f * sf / 100
|
|
33
|
+
gain_corrected[i * 2:2 + i * 2] = calc.corr.gain(*sample.SampleIntercept[i * 2:2 + i * 2], f, sf)
|
|
34
|
+
except Exception as e:
|
|
35
|
+
print(f"Gain correction failed")
|
|
36
|
+
print(traceback.format_exc())
|
|
37
|
+
return
|
|
38
|
+
for i in range(0, 10, 2):
|
|
39
|
+
gain_corrected[i] = [gain_corrected[i][index] if corrGain else j for index, j in enumerate(sample.SampleIntercept[i])]
|
|
40
|
+
gain_corrected[i + 1] = [gain_corrected[i + 1][index] if corrGain else j for index, j in enumerate(sample.SampleIntercept[i + 1])]
|
|
41
|
+
sample.CorrectedValues = copy.deepcopy(gain_corrected)
|
|
42
|
+
|
|
43
|
+
|
|
22
44
|
# =======================
|
|
23
45
|
# Corr Blank
|
|
24
46
|
# =======================
|
|
25
47
|
def corr_blank(sample: Sample):
|
|
26
48
|
"""Blank Correction"""
|
|
27
|
-
|
|
28
|
-
# if not corrBlank:
|
|
29
|
-
# sample.BlankCorrected = copy.deepcopy(sample.SampleIntercept)
|
|
30
|
-
# sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
|
|
31
|
-
# return
|
|
32
|
-
blank_corrected = [[]] * 10
|
|
49
|
+
blank_corrected = np.zeros([10, len(sample.SequenceName)])
|
|
33
50
|
try:
|
|
34
51
|
for i in range(5):
|
|
35
52
|
blank_corrected[i * 2:2 + i * 2] = calc.corr.blank(
|
|
36
|
-
*sample.
|
|
53
|
+
*sample.CorrectedValues[i * 2:2 + i * 2], *sample.BlankIntercept[i * 2:2 + i * 2])
|
|
37
54
|
except Exception as e:
|
|
38
55
|
print(traceback.format_exc())
|
|
39
56
|
raise ValueError('Blank correction error')
|
|
40
57
|
for i in range(0, 10, 2):
|
|
41
|
-
blank_corrected[i] = [blank_corrected[i][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.
|
|
42
|
-
blank_corrected[i + 1] = [blank_corrected[i + 1][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.
|
|
58
|
+
blank_corrected[i] = [blank_corrected[i][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.CorrectedValues[i])]
|
|
59
|
+
blank_corrected[i + 1] = [blank_corrected[i + 1][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.CorrectedValues[i + 1])]
|
|
43
60
|
blank_corrected[i] = [0 if j < 0 and sample.TotalParam[101][index] else j for index, j in enumerate(blank_corrected[i])]
|
|
44
61
|
sample.BlankCorrected = blank_corrected
|
|
45
62
|
sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
|
|
@@ -56,7 +73,7 @@ def corr_massdiscr(sample: Sample):
|
|
|
56
73
|
sample.CorrectedValues = copy.deepcopy(sample.MassDiscrCorrected)
|
|
57
74
|
return
|
|
58
75
|
MASS = sample.TotalParam[71:81]
|
|
59
|
-
mdf_corrected = [
|
|
76
|
+
mdf_corrected = np.zeros([10, len(sample.SequenceName)])
|
|
60
77
|
try:
|
|
61
78
|
for i in range(5):
|
|
62
79
|
if len(sample.BlankCorrected[i * 2:2 + i * 2]) == 0:
|
|
@@ -85,7 +102,7 @@ def corr_decay(sample: Sample):
|
|
|
85
102
|
-------
|
|
86
103
|
|
|
87
104
|
"""
|
|
88
|
-
decay_corrected = [
|
|
105
|
+
decay_corrected = np.zeros([10, len(sample.SequenceName)])
|
|
89
106
|
try:
|
|
90
107
|
irradiation_cycles = [list(filter(None, re.split(r'[DS]', each_step))) for each_step in sample.TotalParam[27]]
|
|
91
108
|
t1 = [re.findall(r"\d+", i) for i in sample.TotalParam[31]] # t1: experimental times
|
|
@@ -239,7 +256,6 @@ def calc_degas_cl(sample: Sample):
|
|
|
239
256
|
# 38ArCl
|
|
240
257
|
ar38cl = [[], []]
|
|
241
258
|
ar38cl[1] = [calc.err.mul((ar36cl[0][i], ar36cl[1][i]), (v3[i], s3[i])) for i in range(len(ar36cl[0]))]
|
|
242
|
-
ar38cl[0] = [ar36cl[0][i] * v3[i] for i in range(len(ar36cl[0]))]
|
|
243
259
|
|
|
244
260
|
# Negative number set to zero
|
|
245
261
|
ar36cl[0] = [0 if i < 0 and set_negative_zero else i for i in ar36cl[0]]
|
|
@@ -247,11 +263,13 @@ def calc_degas_cl(sample: Sample):
|
|
|
247
263
|
ar36cl[0] = [0 if ar36acl[0][i] - item < 0 and set_negative_zero else item
|
|
248
264
|
for i, item in enumerate(ar36cl[0])]
|
|
249
265
|
|
|
266
|
+
ar38cl[0] = [ar36cl[0][i] * v3[i] for i in range(len(ar36cl[0]))]
|
|
267
|
+
|
|
250
268
|
except Exception as e:
|
|
251
269
|
print('Error in corr Cl: {}, lines: {}'.format(e, e.__traceback__.tb_lineno))
|
|
252
270
|
n = len(ar36acl[0])
|
|
253
|
-
ar36cl = [
|
|
254
|
-
ar38cl = [
|
|
271
|
+
ar36cl = np.zeros([2, n])
|
|
272
|
+
ar38cl = np.zeros([2, n])
|
|
255
273
|
|
|
256
274
|
# sample.DegasValues[6:8] = ar36cl
|
|
257
275
|
# sample.DegasValues[10:12] = ar38cl
|
|
@@ -331,6 +349,57 @@ def calc_degas_r(sample: Sample):
|
|
|
331
349
|
# =======================
|
|
332
350
|
# Calc ratio
|
|
333
351
|
# =======================
|
|
352
|
+
def calc_nor_inv_isochrons(sample: Sample):
|
|
353
|
+
n = len(sample.SequenceName)
|
|
354
|
+
try:
|
|
355
|
+
isochron_1 = calc.isochron.get_data(*sample.DegasValues[20:22], *calc.arr.sub(
|
|
356
|
+
sample.CorrectedValues[8:10], sample.DegasValues[30:32]), *sample.DegasValues[0:2])
|
|
357
|
+
isochron_2 = calc.isochron.get_data(*sample.DegasValues[20:22], *sample.DegasValues[0:2], *calc.arr.sub(
|
|
358
|
+
sample.CorrectedValues[8:10], sample.DegasValues[30:32]))
|
|
359
|
+
except:
|
|
360
|
+
return np.zeros([5, n]), np.zeros([5, n])
|
|
361
|
+
else:
|
|
362
|
+
return isochron_1, isochron_2
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def calc_cl_isochrons(sample: Sample):
|
|
366
|
+
n = len(sample.SequenceName)
|
|
367
|
+
try:
|
|
368
|
+
isochron_3 = calc.isochron.get_data(
|
|
369
|
+
*sample.DegasValues[20:22], *sample.DegasValues[24:26], *sample.DegasValues[10:12])
|
|
370
|
+
isochron_4 = calc.isochron.get_data(
|
|
371
|
+
*sample.DegasValues[20:22], *sample.DegasValues[10:12], *sample.DegasValues[24:26])
|
|
372
|
+
isochron_5 = calc.isochron.get_data(
|
|
373
|
+
*sample.DegasValues[10:12], *sample.DegasValues[24:26], *sample.DegasValues[20:22])
|
|
374
|
+
except:
|
|
375
|
+
return np.zeros([5, n]), np.zeros([5, n]), np.zeros([5, n])
|
|
376
|
+
else:
|
|
377
|
+
return isochron_3, isochron_4, isochron_5
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def calc_3D_isochrons(sample: Sample):
|
|
381
|
+
n = len(sample.SequenceName)
|
|
382
|
+
try:
|
|
383
|
+
# === Ar values ===
|
|
384
|
+
# 3D ratio, 36Ar(a+cl)/40Ar(a+r), 38Ar(a+cl)/40Ar(a+r), 39Ar(k)/40Ar(a+r),
|
|
385
|
+
ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
|
|
386
|
+
# 36Ar deduct Ca, that is sum of 36Ara and 36ArCl (and also 36Arc)
|
|
387
|
+
ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
|
|
388
|
+
# 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl (and also 38Arc)
|
|
389
|
+
ar38acl = calc.arr.sub(calc.arr.sub(sample.CorrectedValues[4:6], sample.DegasValues[16:18]),
|
|
390
|
+
sample.DegasValues[18:20])
|
|
391
|
+
# 38ArCl
|
|
392
|
+
ar38cl = sample.DegasValues[10:12]
|
|
393
|
+
# 39ArK
|
|
394
|
+
ar39k = sample.DegasValues[20:22]
|
|
395
|
+
# isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar40ar, *ar39k)
|
|
396
|
+
isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar39k, *ar40ar) # Points on the plot will be more disperse than the above
|
|
397
|
+
except:
|
|
398
|
+
return np.zeros([9, n])
|
|
399
|
+
else:
|
|
400
|
+
return isochron_6
|
|
401
|
+
|
|
402
|
+
|
|
334
403
|
def calc_ratio(sample: Sample, monte_carlo: bool = False):
|
|
335
404
|
""" Calculate isochron ratio data, 40Arr/39ArK, Ar40r percentage,
|
|
336
405
|
Ar39K released percentage, Ca/K
|
|
@@ -346,57 +415,36 @@ def calc_ratio(sample: Sample, monte_carlo: bool = False):
|
|
|
346
415
|
ar40r_percent = [item / sample.CorrectedValues[8][index] * 100 if sample.CorrectedValues[8][index] != 0 else 0
|
|
347
416
|
for index, item in enumerate(sample.DegasValues[24])]
|
|
348
417
|
sum_ar39k = sum(sample.DegasValues[20])
|
|
349
|
-
ar39k_percent = [item / sum_ar39k * 100 if sum_ar39k != 0 else 0 for item in sample.DegasValues[20]]
|
|
350
418
|
sum_ar36a = sum(sample.DegasValues[ 0])
|
|
351
|
-
ar36a_percent = [item / sum_ar36a * 100 if sum_ar36a != 0 else 0 for item in sample.DegasValues[ 0]]
|
|
352
|
-
ar40rar39k = calc.arr.mul_factor(
|
|
353
|
-
sample.DegasValues[24:26], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False),
|
|
354
|
-
isRelative=False)
|
|
355
|
-
ar40aar36a = calc.arr.mul_factor(
|
|
356
|
-
sample.DegasValues[26:28], calc.arr.rec_factor(sample.DegasValues[0:2], isRelative=False),
|
|
357
|
-
isRelative=False)
|
|
358
419
|
CaK = calc.arr.mul_factor(calc.arr.mul_factor(
|
|
359
420
|
sample.DegasValues[8:10], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False)),
|
|
360
421
|
calc.arr.rec_factor(sample.TotalParam[20:22], isRelative=True))
|
|
361
|
-
isochron_1 = calc.isochron.get_data(*sample.DegasValues[20:22], *calc.arr.sub(
|
|
362
|
-
sample.CorrectedValues[8:10], sample.DegasValues[30:32]), *sample.DegasValues[0:2])
|
|
363
|
-
isochron_2 = calc.isochron.get_data(*sample.DegasValues[20:22], *sample.DegasValues[0:2], *calc.arr.sub(
|
|
364
|
-
sample.CorrectedValues[8:10], sample.DegasValues[30:32]))
|
|
365
|
-
isochron_3 = calc.isochron.get_data(
|
|
366
|
-
*sample.DegasValues[20:22], *sample.DegasValues[24:26], *sample.DegasValues[10:12])
|
|
367
|
-
isochron_4 = calc.isochron.get_data(
|
|
368
|
-
*sample.DegasValues[20:22], *sample.DegasValues[10:12], *sample.DegasValues[24:26])
|
|
369
|
-
isochron_5 = calc.isochron.get_data(
|
|
370
|
-
*sample.DegasValues[10:12], *sample.DegasValues[24:26], *sample.DegasValues[20:22])
|
|
371
422
|
|
|
372
423
|
# assignation
|
|
373
|
-
|
|
424
|
+
if sample.Info.sample.type == "Air":
|
|
425
|
+
ar40aar36a = calc.arr.mul_factor(
|
|
426
|
+
sample.DegasValues[26:28], calc.arr.rec_factor(sample.DegasValues[0:2], isRelative=False),
|
|
427
|
+
isRelative=False)
|
|
428
|
+
ar36a_percent = [item / sum_ar36a * 100 if sum_ar36a != 0 else 0 for item in sample.DegasValues[0]]
|
|
429
|
+
sample.ApparentAgeValues[0:2] = ar40aar36a
|
|
430
|
+
sample.ApparentAgeValues[7] = ar36a_percent
|
|
431
|
+
else:
|
|
432
|
+
ar40rar39k = calc.arr.mul_factor(
|
|
433
|
+
sample.DegasValues[24:26], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False),
|
|
434
|
+
isRelative=False)
|
|
435
|
+
ar39k_percent = [item / sum_ar39k * 100 if sum_ar39k != 0 else 0 for item in sample.DegasValues[20]]
|
|
436
|
+
sample.ApparentAgeValues[0:2] = ar40rar39k
|
|
437
|
+
sample.ApparentAgeValues[7] = ar39k_percent
|
|
438
|
+
|
|
374
439
|
sample.ApparentAgeValues[6] = ar40r_percent
|
|
375
|
-
sample.
|
|
376
|
-
|
|
377
|
-
sample.IsochronValues[0:5] =
|
|
378
|
-
sample.IsochronValues[
|
|
379
|
-
|
|
380
|
-
sample.IsochronValues[18:23] = isochron_4
|
|
381
|
-
sample.IsochronValues[24:29] = isochron_5
|
|
440
|
+
sample.PublishValues[7:11] = copy.deepcopy([*sample.ApparentAgeValues[6:8], *CaK])
|
|
441
|
+
|
|
442
|
+
sample.IsochronValues[0:5], sample.IsochronValues[6:11] = calc_nor_inv_isochrons(sample)
|
|
443
|
+
sample.IsochronValues[12:17], sample.IsochronValues[18:23], sample.IsochronValues[24:29] = \
|
|
444
|
+
calc_cl_isochrons(sample)
|
|
382
445
|
|
|
383
446
|
# === Cl-Atm-Correlation Plot ===
|
|
384
|
-
|
|
385
|
-
# 3D ratio, 36Ar(a+cl)/40Ar(a+r), 38Ar(a+cl)/40Ar(a+r), 39Ar(k)/40Ar(a+r),
|
|
386
|
-
ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
|
|
387
|
-
# 36Ar deduct Ca, that is sum of 36Ara and 36ArCl (and also 36Arc)
|
|
388
|
-
ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
|
|
389
|
-
# 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl (and also 38Arc)
|
|
390
|
-
ar38acl = calc.arr.sub(calc.arr.sub(sample.CorrectedValues[4:6], sample.DegasValues[16:18]),
|
|
391
|
-
sample.DegasValues[18:20])
|
|
392
|
-
# 38ArCl
|
|
393
|
-
ar38cl = sample.DegasValues[10:12]
|
|
394
|
-
# 39ArK
|
|
395
|
-
ar39k = sample.DegasValues[20:22]
|
|
396
|
-
# isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar40ar, *ar39k)
|
|
397
|
-
isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar39k,
|
|
398
|
-
*ar40ar) # Points on the plot will be more disperse than the above
|
|
399
|
-
sample.IsochronValues[30:39] = isochron_6
|
|
447
|
+
sample.IsochronValues[30:39] = calc_3D_isochrons(sample)
|
|
400
448
|
|
|
401
449
|
# Turner 1988 3D cake mix plots
|
|
402
450
|
# ar40 = sample.CorrectedValues[8:10] # ar40 = atm + r + k
|