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/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
- corrBlank = sample.TotalParam[102][0]
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.SampleIntercept[i * 2:2 + i * 2], *sample.BlankIntercept[i * 2:2 + i * 2])
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.SampleIntercept[i])]
42
- blank_corrected[i + 1] = [blank_corrected[i + 1][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.SampleIntercept[i + 1])]
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 = [[]] * 10
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 = [[]] * 10
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 = [[0] * n, [0] * n]
254
- ar38cl = [[0] * n, [0] * n]
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
- sample.ApparentAgeValues[0:2] = ar40aar36a if sample.Info.sample.type == "Air" else ar40rar39k
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.ApparentAgeValues[7] = ar36a_percent if sample.Info.sample.type == "Air" else ar39k_percent
376
- sample.PublishValues[7:11] = [ar40r_percent, ar39k_percent, *CaK]
377
- sample.IsochronValues[0:5] = isochron_1
378
- sample.IsochronValues[6:11] = isochron_2
379
- sample.IsochronValues[12:17] = isochron_3
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
- # === Ar values ===
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