ararpy 0.1.12__py3-none-any.whl → 0.1.14__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
@@ -20,54 +20,53 @@ from .sample import Sample
20
20
 
21
21
 
22
22
  # =======================
23
- # Corr Blank
23
+ # Corr Gain
24
24
  # =======================
25
- def corr_blank(sample: Sample):
25
+ def corr_gain(sample: Sample):
26
26
  """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
27
+ corrGain = True
28
+ gain_corrected = np.zeros([10, len(sample.SequenceName)])
33
29
  try:
34
30
  for i in range(5):
35
- 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])
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)
37
34
  except Exception as e:
35
+ print(f"Gain correction failed")
38
36
  print(traceback.format_exc())
39
- raise ValueError('Blank correction error')
37
+ return
40
38
  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])]
43
- blank_corrected[i] = [0 if j < 0 and sample.TotalParam[101][index] else j for index, j in enumerate(blank_corrected[i])]
44
- sample.BlankCorrected = blank_corrected
45
- sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
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)
46
42
 
47
43
 
48
44
  # =======================
49
45
  # Corr Blank
50
46
  # =======================
51
- def corr_gain(sample: Sample):
47
+ def corr_blank(sample: Sample):
52
48
  """Blank Correction"""
53
- corrGain = True
54
- # if not corrBlank:
55
- # sample.BlankCorrected = copy.deepcopy(sample.SampleIntercept)
56
- # sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
57
- # return
58
- gain_corrected = [[]] * 10
49
+ blank_corrected = np.zeros([10, len(sample.SequenceName)])
59
50
  try:
60
51
  for i in range(5):
61
- gain_corrected[i * 2:2 + i * 2] = calc.corr.gain(
62
- *sample.BlankCorrected[i * 2:2 + i * 2], *sample.TotalParam[126 + i * 2:128 + i * 2])
52
+ b, sb = copy.deepcopy(sample.BlankIntercept[i * 2: i * 2 + 2])
53
+ f, sf = np.array(sample.TotalParam[126 + i * 2:128 + i * 2])
54
+ sf = f * sf / 100
55
+ _ = calc.corr.gain(*sample.BlankIntercept[i * 2:2 + i * 2], f, sf)
56
+ for index in range(len(sample.BlankIntercept[i * 2])):
57
+ if sample.TotalParam[111][index]: # use same parameters to correct blank intercepts
58
+ b[index] = _[0][index]
59
+ sb[index] = _[1][index]
60
+ blank_corrected[i * 2:2 + i * 2] = calc.corr.blank(
61
+ *sample.CorrectedValues[i * 2:2 + i * 2], b, sb)
63
62
  except Exception as e:
64
- print(f"Gain correction failed")
65
63
  print(traceback.format_exc())
66
- return
64
+ raise ValueError('Blank correction error')
67
65
  for i in range(0, 10, 2):
68
- gain_corrected[i] = [gain_corrected[i][index] if corrGain else j for index, j in enumerate(sample.BlankCorrected[i])]
69
- gain_corrected[i + 1] = [gain_corrected[i + 1][index] if corrGain else j for index, j in enumerate(sample.BlankCorrected[i + 1])]
70
- sample.BlankCorrected = copy.deepcopy(gain_corrected)
66
+ blank_corrected[i] = [blank_corrected[i][index] if sample.TotalParam[102][index] else j for index, j in enumerate(sample.CorrectedValues[i])]
67
+ 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])]
68
+ blank_corrected[i] = [0 if j < 0 and sample.TotalParam[101][index] else j for index, j in enumerate(blank_corrected[i])]
69
+ sample.BlankCorrected = blank_corrected
71
70
  sample.CorrectedValues = copy.deepcopy(sample.BlankCorrected)
72
71
 
73
72
 
@@ -82,7 +81,7 @@ def corr_massdiscr(sample: Sample):
82
81
  sample.CorrectedValues = copy.deepcopy(sample.MassDiscrCorrected)
83
82
  return
84
83
  MASS = sample.TotalParam[71:81]
85
- mdf_corrected = [[]] * 10
84
+ mdf_corrected = np.zeros([10, len(sample.SequenceName)])
86
85
  try:
87
86
  for i in range(5):
88
87
  if len(sample.BlankCorrected[i * 2:2 + i * 2]) == 0:
@@ -111,7 +110,7 @@ def corr_decay(sample: Sample):
111
110
  -------
112
111
 
113
112
  """
114
- decay_corrected = [[]] * 10
113
+ decay_corrected = np.zeros([10, len(sample.SequenceName)])
115
114
  try:
116
115
  irradiation_cycles = [list(filter(None, re.split(r'[DS]', each_step))) for each_step in sample.TotalParam[27]]
117
116
  t1 = [re.findall(r"\d+", i) for i in sample.TotalParam[31]] # t1: experimental times
@@ -265,7 +264,6 @@ def calc_degas_cl(sample: Sample):
265
264
  # 38ArCl
266
265
  ar38cl = [[], []]
267
266
  ar38cl[1] = [calc.err.mul((ar36cl[0][i], ar36cl[1][i]), (v3[i], s3[i])) for i in range(len(ar36cl[0]))]
268
- ar38cl[0] = [ar36cl[0][i] * v3[i] for i in range(len(ar36cl[0]))]
269
267
 
270
268
  # Negative number set to zero
271
269
  ar36cl[0] = [0 if i < 0 and set_negative_zero else i for i in ar36cl[0]]
@@ -273,11 +271,13 @@ def calc_degas_cl(sample: Sample):
273
271
  ar36cl[0] = [0 if ar36acl[0][i] - item < 0 and set_negative_zero else item
274
272
  for i, item in enumerate(ar36cl[0])]
275
273
 
274
+ ar38cl[0] = [ar36cl[0][i] * v3[i] for i in range(len(ar36cl[0]))]
275
+
276
276
  except Exception as e:
277
277
  print('Error in corr Cl: {}, lines: {}'.format(e, e.__traceback__.tb_lineno))
278
278
  n = len(ar36acl[0])
279
- ar36cl = [[0] * n, [0] * n]
280
- ar38cl = [[0] * n, [0] * n]
279
+ ar36cl = np.zeros([2, n])
280
+ ar38cl = np.zeros([2, n])
281
281
 
282
282
  # sample.DegasValues[6:8] = ar36cl
283
283
  # sample.DegasValues[10:12] = ar38cl
@@ -357,6 +357,57 @@ def calc_degas_r(sample: Sample):
357
357
  # =======================
358
358
  # Calc ratio
359
359
  # =======================
360
+ def calc_nor_inv_isochrons(sample: Sample):
361
+ n = len(sample.SequenceName)
362
+ try:
363
+ isochron_1 = calc.isochron.get_data(*sample.DegasValues[20:22], *calc.arr.sub(
364
+ sample.CorrectedValues[8:10], sample.DegasValues[30:32]), *sample.DegasValues[0:2])
365
+ isochron_2 = calc.isochron.get_data(*sample.DegasValues[20:22], *sample.DegasValues[0:2], *calc.arr.sub(
366
+ sample.CorrectedValues[8:10], sample.DegasValues[30:32]))
367
+ except:
368
+ return np.zeros([5, n]), np.zeros([5, n])
369
+ else:
370
+ return isochron_1, isochron_2
371
+
372
+
373
+ def calc_cl_isochrons(sample: Sample):
374
+ n = len(sample.SequenceName)
375
+ try:
376
+ isochron_3 = calc.isochron.get_data(
377
+ *sample.DegasValues[20:22], *sample.DegasValues[24:26], *sample.DegasValues[10:12])
378
+ isochron_4 = calc.isochron.get_data(
379
+ *sample.DegasValues[20:22], *sample.DegasValues[10:12], *sample.DegasValues[24:26])
380
+ isochron_5 = calc.isochron.get_data(
381
+ *sample.DegasValues[10:12], *sample.DegasValues[24:26], *sample.DegasValues[20:22])
382
+ except:
383
+ return np.zeros([5, n]), np.zeros([5, n]), np.zeros([5, n])
384
+ else:
385
+ return isochron_3, isochron_4, isochron_5
386
+
387
+
388
+ def calc_3D_isochrons(sample: Sample):
389
+ n = len(sample.SequenceName)
390
+ try:
391
+ # === Ar values ===
392
+ # 3D ratio, 36Ar(a+cl)/40Ar(a+r), 38Ar(a+cl)/40Ar(a+r), 39Ar(k)/40Ar(a+r),
393
+ ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
394
+ # 36Ar deduct Ca, that is sum of 36Ara and 36ArCl (and also 36Arc)
395
+ ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
396
+ # 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl (and also 38Arc)
397
+ ar38acl = calc.arr.sub(calc.arr.sub(sample.CorrectedValues[4:6], sample.DegasValues[16:18]),
398
+ sample.DegasValues[18:20])
399
+ # 38ArCl
400
+ ar38cl = sample.DegasValues[10:12]
401
+ # 39ArK
402
+ ar39k = sample.DegasValues[20:22]
403
+ # isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar40ar, *ar39k)
404
+ isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar39k, *ar40ar) # Points on the plot will be more disperse than the above
405
+ except:
406
+ return np.zeros([9, n])
407
+ else:
408
+ return isochron_6
409
+
410
+
360
411
  def calc_ratio(sample: Sample, monte_carlo: bool = False):
361
412
  """ Calculate isochron ratio data, 40Arr/39ArK, Ar40r percentage,
362
413
  Ar39K released percentage, Ca/K
@@ -372,57 +423,36 @@ def calc_ratio(sample: Sample, monte_carlo: bool = False):
372
423
  ar40r_percent = [item / sample.CorrectedValues[8][index] * 100 if sample.CorrectedValues[8][index] != 0 else 0
373
424
  for index, item in enumerate(sample.DegasValues[24])]
374
425
  sum_ar39k = sum(sample.DegasValues[20])
375
- ar39k_percent = [item / sum_ar39k * 100 if sum_ar39k != 0 else 0 for item in sample.DegasValues[20]]
376
426
  sum_ar36a = sum(sample.DegasValues[ 0])
377
- ar36a_percent = [item / sum_ar36a * 100 if sum_ar36a != 0 else 0 for item in sample.DegasValues[ 0]]
378
- ar40rar39k = calc.arr.mul_factor(
379
- sample.DegasValues[24:26], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False),
380
- isRelative=False)
381
- ar40aar36a = calc.arr.mul_factor(
382
- sample.DegasValues[26:28], calc.arr.rec_factor(sample.DegasValues[0:2], isRelative=False),
383
- isRelative=False)
384
427
  CaK = calc.arr.mul_factor(calc.arr.mul_factor(
385
428
  sample.DegasValues[8:10], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False)),
386
429
  calc.arr.rec_factor(sample.TotalParam[20:22], isRelative=True))
387
- isochron_1 = calc.isochron.get_data(*sample.DegasValues[20:22], *calc.arr.sub(
388
- sample.CorrectedValues[8:10], sample.DegasValues[30:32]), *sample.DegasValues[0:2])
389
- isochron_2 = calc.isochron.get_data(*sample.DegasValues[20:22], *sample.DegasValues[0:2], *calc.arr.sub(
390
- sample.CorrectedValues[8:10], sample.DegasValues[30:32]))
391
- isochron_3 = calc.isochron.get_data(
392
- *sample.DegasValues[20:22], *sample.DegasValues[24:26], *sample.DegasValues[10:12])
393
- isochron_4 = calc.isochron.get_data(
394
- *sample.DegasValues[20:22], *sample.DegasValues[10:12], *sample.DegasValues[24:26])
395
- isochron_5 = calc.isochron.get_data(
396
- *sample.DegasValues[10:12], *sample.DegasValues[24:26], *sample.DegasValues[20:22])
397
430
 
398
431
  # assignation
399
- sample.ApparentAgeValues[0:2] = ar40aar36a if sample.Info.sample.type == "Air" else ar40rar39k
432
+ if sample.Info.sample.type == "Air":
433
+ ar40aar36a = calc.arr.mul_factor(
434
+ sample.DegasValues[26:28], calc.arr.rec_factor(sample.DegasValues[0:2], isRelative=False),
435
+ isRelative=False)
436
+ ar36a_percent = [item / sum_ar36a * 100 if sum_ar36a != 0 else 0 for item in sample.DegasValues[0]]
437
+ sample.ApparentAgeValues[0:2] = ar40aar36a
438
+ sample.ApparentAgeValues[7] = ar36a_percent
439
+ else:
440
+ ar40rar39k = calc.arr.mul_factor(
441
+ sample.DegasValues[24:26], calc.arr.rec_factor(sample.DegasValues[20:22], isRelative=False),
442
+ isRelative=False)
443
+ ar39k_percent = [item / sum_ar39k * 100 if sum_ar39k != 0 else 0 for item in sample.DegasValues[20]]
444
+ sample.ApparentAgeValues[0:2] = ar40rar39k
445
+ sample.ApparentAgeValues[7] = ar39k_percent
446
+
400
447
  sample.ApparentAgeValues[6] = ar40r_percent
401
- sample.ApparentAgeValues[7] = ar36a_percent if sample.Info.sample.type == "Air" else ar39k_percent
402
- sample.PublishValues[7:11] = [ar40r_percent, ar39k_percent, *CaK]
403
- sample.IsochronValues[0:5] = isochron_1
404
- sample.IsochronValues[6:11] = isochron_2
405
- sample.IsochronValues[12:17] = isochron_3
406
- sample.IsochronValues[18:23] = isochron_4
407
- sample.IsochronValues[24:29] = isochron_5
448
+ sample.PublishValues[7:11] = copy.deepcopy([*sample.ApparentAgeValues[6:8], *CaK])
449
+
450
+ sample.IsochronValues[0:5], sample.IsochronValues[6:11] = calc_nor_inv_isochrons(sample)
451
+ sample.IsochronValues[12:17], sample.IsochronValues[18:23], sample.IsochronValues[24:29] = \
452
+ calc_cl_isochrons(sample)
408
453
 
409
454
  # === Cl-Atm-Correlation Plot ===
410
- # === Ar values ===
411
- # 3D ratio, 36Ar(a+cl)/40Ar(a+r), 38Ar(a+cl)/40Ar(a+r), 39Ar(k)/40Ar(a+r),
412
- ar40ar = calc.arr.sub(sample.CorrectedValues[8:10], sample.DegasValues[30:32])
413
- # 36Ar deduct Ca, that is sum of 36Ara and 36ArCl (and also 36Arc)
414
- ar36acl = calc.arr.sub(sample.CorrectedValues[0:2], sample.DegasValues[4:6])
415
- # 38Ar deduct K and Ca, that is sum of 38Ara and 38ArCl (and also 38Arc)
416
- ar38acl = calc.arr.sub(calc.arr.sub(sample.CorrectedValues[4:6], sample.DegasValues[16:18]),
417
- sample.DegasValues[18:20])
418
- # 38ArCl
419
- ar38cl = sample.DegasValues[10:12]
420
- # 39ArK
421
- ar39k = sample.DegasValues[20:22]
422
- # isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar40ar, *ar39k)
423
- isochron_6 = calc.isochron.get_3d_data(*ar36acl, *ar38acl, *ar39k,
424
- *ar40ar) # Points on the plot will be more disperse than the above
425
- sample.IsochronValues[30:39] = isochron_6
455
+ sample.IsochronValues[30:39] = calc_3D_isochrons(sample)
426
456
 
427
457
  # Turner 1988 3D cake mix plots
428
458
  # ar40 = sample.CorrectedValues[8:10] # ar40 = atm + r + k