ararpy 0.1.199__py3-none-any.whl → 0.2.2__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.
Files changed (41) hide show
  1. ararpy/Example - Check arr.py +52 -0
  2. ararpy/Example - Granite Cooling History.py +411 -0
  3. ararpy/Example - Plot temperature calibration.py +291 -0
  4. ararpy/Example - Show MDD results.py +561 -0
  5. ararpy/Example - Show all Kfs age spectra.py +344 -0
  6. ararpy/Example - Show random walk results.py +363 -0
  7. ararpy/Example - Tc calculation.py +437 -0
  8. ararpy/__init__.py +3 -4
  9. ararpy/calc/age.py +34 -36
  10. ararpy/calc/arr.py +0 -20
  11. ararpy/calc/basic.py +26 -3
  12. ararpy/calc/corr.py +131 -85
  13. ararpy/calc/jvalue.py +7 -5
  14. ararpy/calc/plot.py +1 -2
  15. ararpy/calc/raw_funcs.py +41 -2
  16. ararpy/calc/regression.py +224 -132
  17. ararpy/files/arr_file.py +2 -1
  18. ararpy/files/basic.py +0 -22
  19. ararpy/files/calc_file.py +107 -84
  20. ararpy/files/raw_file.py +242 -229
  21. ararpy/smp/basic.py +133 -34
  22. ararpy/smp/calculation.py +6 -6
  23. ararpy/smp/corr.py +339 -153
  24. ararpy/smp/diffusion_funcs.py +345 -36
  25. ararpy/smp/export.py +247 -129
  26. ararpy/smp/info.py +2 -2
  27. ararpy/smp/initial.py +93 -45
  28. ararpy/smp/json.py +2 -2
  29. ararpy/smp/plots.py +144 -164
  30. ararpy/smp/raw.py +11 -15
  31. ararpy/smp/sample.py +222 -181
  32. ararpy/smp/style.py +26 -7
  33. ararpy/smp/table.py +42 -33
  34. ararpy/thermo/atomic_level_random_walk.py +56 -48
  35. ararpy/thermo/basic.py +2 -2
  36. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/METADATA +10 -1
  37. ararpy-0.2.2.dist-info/RECORD +73 -0
  38. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/WHEEL +1 -1
  39. ararpy-0.1.199.dist-info/RECORD +0 -66
  40. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/licenses/LICENSE +0 -0
  41. {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/top_level.txt +0 -0
ararpy/files/calc_file.py CHANGED
@@ -22,7 +22,7 @@ import os
22
22
  import msoffcrypto
23
23
 
24
24
  from . import xls
25
- from ..calc.basic import get_datetime
25
+ from ..calc.basic import get_datetime, parser
26
26
  from ..calc import arr, err, isochron
27
27
 
28
28
 
@@ -66,6 +66,7 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
66
66
  data[-999] = [0] * data.index.size
67
67
  data[999] = [1] * data.index.size
68
68
  data[-1] = [np.nan] * data.index.size
69
+ data[-2] = [''] * data.index.size
69
70
  # rows_unm --> 样品阶段数
70
71
  sequence_index = [1, 2, ]
71
72
  sample_values_index = [16, 17, 21, 22, 26, 27, 31, 32, 36, 37,]
@@ -88,28 +89,27 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
88
89
  isochron_values_index = [
89
90
  116, 117, 118, 119, 122, # normal isochron
90
91
  -1, 127, 128, 129, 130, 133, # inverse
91
- -1, -999, -999, -999, -999, -999, # 39/38 vs 40/38
92
- -1, -999, -999, -999, -999, -999, # 39/40 vs 39/40
93
- -1, -999, -999, -999, -999, -999, # 38/39 vs 40/39
94
- -1, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 3D isochron, 36/39, 38/39, 40/39
92
+ -1, -1, -1, -1, -1, -1, # 39/38 vs 40/38
93
+ -1, -1, -1, -1, -1, -1, # 39/40 vs 39/40
94
+ -1, -1, -1, -1, -1, -1, # 38/39 vs 40/39
95
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 3D isochron, 36/39, 38/39, 40/39
95
96
  ]
96
97
  isochron_mark_index = [115,]
97
98
  total_param_index = [
98
99
  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, # 0-9
99
100
  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, # 10-19
100
- 91, 92, 93, 94, 95, 96, -999, -999, 63, -999, # 20-29
101
- -999, -999, -1, -1, -999, -999, -999, -999, -999, -999, # 30-39
101
+ 91, 92, 93, 94, 95, 96, -999, -2, 63, -999, # 20-29
102
+ -999, -2, -1, -1, -999, -999, -999, -999, -999, -999, # 30-39
102
103
  -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 40-49
103
104
  -999, -999, -999, -999, -999, -999, -999, -999, 67, 49, # 50-59
104
105
  50, -999, -999, -999, -999, -999, -999, 51, 52, 53, # 60-69
105
106
  54, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 70-79
106
107
  -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 80-89
107
- -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 90-99
108
- -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, # 100-109
109
- -999, -999, -999, -999, -1, # 110-114
110
- -999, -999, -999, -999, -999, -999, -999, -999, # 115-122
111
- -999, -999, -999, -999, -999, -999, -999, -999, # 123-130
112
- -999, -999, -999, -999, -999, # 131-135
108
+ -999, -999, -999, -999, -999, -999, -999, -2, -999, -999, # 90-99
109
+ -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, # 100-109
110
+ -2, -2, -2, -2, -2, -2, -999, -999, -999, -999, # 110-119
111
+ -999, -999, -999, -999, -999, -999, 999, -999, 999, -999, # 120-129
112
+ 999, -999, 999, -999, 999, -999, 999, -999, # 130-137
113
113
  ]
114
114
 
115
115
  # double transpose to remove keys
@@ -128,6 +128,14 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
128
128
 
129
129
  # adjustment
130
130
  isochron_mark.replace({4.0: '1'}, inplace=True)
131
+ isochron_mark.replace({'●': '1'}, inplace=True)
132
+
133
+ total_param[71] = 35.96754628
134
+ total_param[73] = 36.9667759
135
+ total_param[75] = 37.9627322
136
+ total_param[77] = 38.964313
137
+ total_param[79] = 39.962383123
138
+
131
139
  total_param[83] = logs01[1][9] # No
132
140
  total_param[84] = logs01[1][10] # %SD
133
141
  total_param[81] = logs01[1][11] # K mass
@@ -150,9 +158,9 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
150
158
  total_param[51] = logs01[1][27] # %SD
151
159
  total_param[52] = logs01[1][28] # 40K(\beta-) activities param
152
160
  total_param[53] = logs01[1][29] # %SD
153
- total_param[48] = logs01[1][26] + logs01[1][28] # 40K(EC) activities param
154
- total_param[49] = 100 / total_param[48] * pow(
155
- (logs01[1][27] / 100 * logs01[1][26]) ** 2 + (logs01[1][29] / 100 * logs01[1][28]) ** 2, 0.5) # %SD
161
+ total_param[48] = logs01[1][26] + logs01[1][28] # 40K total activities param
162
+ total_param[49] = round(100 / total_param[48] * pow(
163
+ (logs01[1][27] / 100 * logs01[1][26]) ** 2 + (logs01[1][29] / 100 * logs01[1][28]) ** 2, 0.5), 6) # %SD
156
164
 
157
165
  total_param[34] = logs01[1][36] # decay constant of 40K total
158
166
  total_param[35] = logs01[1][37] # %SD
@@ -169,30 +177,29 @@ def open_252(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
169
177
  total_param[44] = logs01[1][40] # decay constant of 37Ar
170
178
  total_param[45] = logs01[1][41] # %SD
171
179
 
172
- # logs01[1][49]] # 1 for using weighted YORK isochron regression, 2 for unweighted
173
- # logs01[1][50]] # True for including errors on irradiation constants, False for excluding those
174
- # [logs01[1][67]] # MDF method, 'LIN'
180
+ # logs01[1][49] # 1 for using weighted YORK isochron regression, 2 for unweighted
181
+ # logs01[1][50] # True for including errors on irradiation constants, False for excluding those
182
+ # logs01[1][67] # MDF method, 'LIN'
175
183
  total_param[93] = logs01[1][70] # 40Ar/36Ar air
176
184
  total_param[94] = logs01[1][71] # %SD
177
-
178
- total_param[97] = 'York-2' # Fitting method
185
+ total_param[97] = 'York-2' if int(logs01[1][49]) == 1 else "" # Fitting method
179
186
  total_param[98] = logs01[1][0] # Convergence
180
187
  total_param[99] = logs01[1][1] # Iterations number
181
188
  total_param[100] = logs01[1][67] # MDF method
182
- total_param[101] = logs01[1][65] # force negative to zero when correct blank
189
+ total_param[101] = parser(logs01[1][65], bool) # force negative to zero when correct blank
183
190
  total_param[102] = True # Apply 37Ar decay
184
191
  total_param[103] = True # Apply 39Ar decay
185
- total_param[104] = logs01[1][6] # Apply 37Ar decay
186
- total_param[105] = logs01[1][7] # Apply 39Ar decay
187
- total_param[106] = True # Apply K degas
188
- total_param[107] = True # Apply Ca degas
189
- total_param[108] = True # Apply Air degas
190
- total_param[109] = logs01[1][8] # Apply Cl degas
192
+ total_param[104] = parser(logs01[1][6], bool) # Apply 37Ar decay
193
+ total_param[105] = parser(logs01[1][7], bool) # Apply 39Ar decay
194
+ total_param[106] = True # Apply Ca degas
195
+ total_param[107] = True # Apply K degas
196
+ total_param[108] = parser(logs01[1][8], bool) # Apply Cl degas
197
+ total_param[109] = True # Apply Trap degas
191
198
 
192
199
  total_param[110] = True if logs01[1][5] == 'MIN' else False # Calculating ages using Min equation [True] or conventional equation [False]
193
- total_param[111] = logs01[1][89] # Use primary standard or not
194
- total_param[112] = logs01[1][91] # Use standard age or not
195
- total_param[113] = logs01[1][92] # Use primary ratio or not
200
+ total_param[111] = parser(logs01[1][89], bool) # Use primary standard or not
201
+ total_param[112] = parser(logs01[1][91], bool) # Use standard age or not
202
+ total_param[113] = parser(logs01[1][92], bool) # Use primary ratio or not
196
203
 
197
204
  # irradiation time
198
205
  total_param = general_adjustment(
@@ -217,6 +224,7 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
217
224
  data[-999] = [0] * data.index.size
218
225
  data[999] = [1] * data.index.size
219
226
  data[-1] = [np.nan] * data.index.size
227
+ data[-2] = [''] * data.index.size
220
228
  # values index
221
229
  sequence_index = [1, 2, ]
222
230
  sample_values_index = [16, 17, 21, 22, 26, 27, 31, 32, 36, 37,]
@@ -248,13 +256,13 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
248
256
  # inverse
249
257
  -1, 125, 126, 127, 128, 131,
250
258
  # 39/38 vs 40/38
251
- -1, -999, -999, -999, -999, -999,
259
+ -1, -1, -1, -1, -1, -1,
252
260
  # 39/40 vs 39/40
253
- -1, -999, -999, -999, -999, -999,
261
+ -1, -1, -1, -1, -1, -1,
254
262
  # 38/39 vs 40/39
255
- -1, -999, -999, -999, -999, -999,
263
+ -1, -1, -1, -1, -1, -1,
256
264
  # 3D isochron, 36/39, 38/39, 40/39, r1, r2, r3
257
- -1, -999, -999, -999, -999, -999, -999, -999, -999, -999,
265
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
258
266
  ]
259
267
  isochron_mark_index = [113,]
260
268
  total_param_index = [
@@ -286,8 +294,8 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
286
294
  -999, -999, -999, -999, -999, -999, -999, -999,
287
295
  # 123-130
288
296
  -999, -999, -999, -999, -999, -999, -999, -999,
289
- # 131-135
290
- -999, -999, -999, -999, -999,
297
+ # 131-137
298
+ -999, -999, -999, -999, -999, 999, -999,
291
299
  ]
292
300
 
293
301
  # double transpose to remove keys
@@ -310,12 +318,12 @@ def open_240(data: pd.DataFrame, logs01: pd.DataFrame, logs02: pd.DataFrame):
310
318
  )
311
319
  # Do adjustment
312
320
  isochron_mark.replace({4.0: '1'}, inplace=True)
313
- total_param[44] = logs01[1][40]
314
- total_param[45] = logs01[1][41]
315
- total_param[42] = logs01[1][38]
316
- total_param[43] = logs01[1][39]
317
321
  total_param[34] = logs01[1][36]
318
322
  total_param[35] = logs01[1][37]
323
+ total_param[42] = logs01[1][38]
324
+ total_param[43] = logs01[1][39]
325
+ total_param[44] = logs01[1][40]
326
+ total_param[45] = logs01[1][41]
319
327
 
320
328
  return [
321
329
  sample_values, blank_values, corrected_values, degas_values, publish_values,
@@ -399,6 +407,8 @@ def general_adjustment(
399
407
  total_param[32] = [i / (3600 * 24 * 365.242) for i in stand_time_second] # stand year
400
408
 
401
409
  # initial ratios & error display settings
410
+ total_param[95] = logs02[9][irradiation_index] # 38Ar/36Ar air
411
+ total_param[96] = logs02[10][irradiation_index] # %SD
402
412
  total_param[115] = 0
403
413
  total_param[116] = 298.56
404
414
  total_param[117] = 0.31
@@ -486,40 +496,41 @@ def open_full_xls(file_path: str, sample_name: str = ''):
486
496
  res['Inverse Isochron Table'], rows, [4, 5, 6, 7, 10])
487
497
  total_param = arr.partial(
488
498
  res['Sample Parameters'], rows, [
489
- # 1, 2, # 0-1
490
- -1, -1, -1, -1, # 2-5
491
- -1, -1, -1, -1, # 6-9
492
- -1, -1, -1, -1, -1, -1, # 10-15
493
- -1, -1, -1, -1, # 16-19
494
- -1, -1, # 20-21
495
- 23, 24, -1, -1, -1, -1, # 22-27
496
- -1, -1, # 28-29
497
- 22, -1, -1, -1, # 30-33
498
- -1, -1, # 34-35
499
- -1, -1, # 36-37
500
- -1, -1, # 38-39
501
- -1, -1, # 40-41
502
- -1, -1, # 42-43
503
- -1, -1, # 44-45
504
- -1, -1, # 46-47
505
- -1, -1, # 48-49
506
- -1, -1, # 50-51
507
- -1, -1, # 52-53
508
- -1, -1, # 54-55
509
- -1, -1, # 56-57
510
- -1, -1, # 58-59
511
- -1, -1, -1, -1, -1, -1, -1, -1, -1, # 60-68
512
- 10, 11, 12, 13, # 69-72
513
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 73-84
514
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 85-94
515
- -1, -1, -1, -1, # 95-98
516
- -1, -1, -1, -1, # 99-102
517
- -1, -1, -1, -1, # 103-106
518
- -1, -1, -1, -1, # 107-110
519
- -1, -1, -1, -1, # 111-114
520
- -1, -1, -1, -1, -1, -1, -1, -1, # 115-122
521
- -1, -1, -1, -1, -1, -1, -1, -1, # 123-130
522
- -1, -1, -1, -1, -1, # 131-135
499
+ # 1, 2, -1, # 0-2
500
+ -1, -1, -1, -1, # 3-6
501
+ -1, -1, -1, -1, # 7-10
502
+ -1, -1, -1, -1, -1, -1, # 11-16
503
+ -1, -1, -1, -1, # 17-20
504
+ -1, -1, # 21-22
505
+ 23, 24, -1, -1, -1, -1, # 23-28
506
+ -1, -1, # 29-30
507
+ 22, -1, -1, -1, # 31-34
508
+ -1, -1, # 35-36
509
+ -1, -1, # 37-38
510
+ -1, -1, # 39-40
511
+ -1, -1, # 41-42
512
+ -1, -1, # 43-44
513
+ -1, -1, # 45-46
514
+ -1, -1, # 47-48
515
+ -1, -1, # 49-50
516
+ -1, -1, # 51-52
517
+ -1, -1, # 53-54
518
+ -1, -1, # 55-56
519
+ -1, -1, # 57-58
520
+ -1, -1, # 59-60
521
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, # 61-69
522
+ 10, 11, 12, 13, # 70-73
523
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 74-85
524
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 86-95
525
+ -1, -1, -1, -1, # 96-99
526
+ -1, -1, -1, -1, # 100-103
527
+ -1, -1, -1, -1, # 104-107
528
+ -1, -1, -1, -1, # 108-111
529
+ -1, -1, -1, -1, # 112-115
530
+ -1, -1, -1, -1, -1, -1, -1, -1, # 116-123
531
+ -1, -1, -1, -1, -1, -1, -1, -1, # 124-131
532
+ -1, -1, -1, -1, -1, # 132-136
533
+ -1, -1, -1, -1, # 137-140
523
534
  ])
524
535
 
525
536
  month_convert = {'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06',
@@ -584,9 +595,9 @@ class ArArCalcFile:
584
595
  book_contents = read_calc_file(self.file_path)
585
596
  # create data frames for book values
586
597
  content = pd.DataFrame(book_contents['Data Tables'])
587
- logs01 = pd.DataFrame(book_contents['Logs01'])
588
- logs02 = pd.DataFrame(book_contents['Logs02'])
589
- logs03 = pd.DataFrame(book_contents['Logs03'])
598
+ logs01 = pd.DataFrame(book_contents.get('Logs01', [[]]))
599
+ logs02 = pd.DataFrame(book_contents.get('Logs02', [[]]))
600
+ logs03 = pd.DataFrame(book_contents.get('Logs03', [[]]))
590
601
 
591
602
  start_row = 5
592
603
  sequence_num = int(logs03[2][0])
@@ -600,13 +611,15 @@ class ArArCalcFile:
600
611
  if version == '25.2':
601
612
  handler = open_252
602
613
  material = data[45][0]
614
+ irra_label = data[46][0]
603
615
  analyst = data[47][0]
604
616
  elif version == '24.0':
605
617
  handler = open_240
606
618
  material = data[46][0]
607
619
  analyst = data[48][0]
620
+ irra_label = ''
608
621
  else:
609
- raise ValueError(f'non-supported version: {version}')
622
+ raise ValueError(f'Unsupported version: {version}')
610
623
 
611
624
  # change error type, 2sigma to 1sigma..., relative errors to absolute errors
612
625
  data = change_error_type(data, header)
@@ -624,15 +637,19 @@ class ArArCalcFile:
624
637
  # list(range(1, 26, 2)) irradiation correction constants
625
638
  # list(range(39, 58, 2)) decay constants
626
639
  # list(range(68, 97, 2)) J, MDF, other constants
627
- for column in list(range(1, 26, 2)) + list(range(68, 71, 2)):
640
+ for column in list(range(1, 26, 2)) + list(range(68, 71, 2)): # irradiation constants and J, MDF uncertainties
628
641
  self.content.loc[:, ('pam', column)] = \
629
- (self.content['pam', column].astype("float") / (
630
- self.content['pam', column - 1].astype("float")) * 100).replace(np.nan, 0)
642
+ round(self.content['pam', column].astype("float") / (
643
+ self.content['pam', column - 1].astype("float")) * 100, 6).replace(np.nan, 0)
631
644
 
632
645
  # sample info
633
646
  self.sample_info = {
647
+ 'experiment': {
648
+ 'name': self.sample_name,
649
+ 'type': material, 'instrument': '', 'collectors': '','step_num': 0,
650
+ },
634
651
  'sample': {
635
- 'name': self.sample_name or data[44][0],
652
+ 'name': data[44][0],
636
653
  'material': material, 'location': 'LOCATION'
637
654
  },
638
655
  'researcher': {'name': data[64][0]},
@@ -640,7 +657,13 @@ class ArArCalcFile:
640
657
  'name': logs01[1][44],
641
658
  'analyst': analyst,
642
659
  'info': '\n'.join([logs01[1][45], logs01[1][46], logs01[1][47]]),
643
- }
660
+ },
661
+ 'reference': {
662
+ 'name': '', 'journal': '', 'doi': '',
663
+ },
664
+ 'irradiation': {
665
+ 'label': irra_label, 'pos_h': '', 'pos_x': '', 'pos_y': '',
666
+ },
644
667
  }
645
668
 
646
669
  return self