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.
- ararpy/Example - Check arr.py +52 -0
- ararpy/Example - Granite Cooling History.py +411 -0
- ararpy/Example - Plot temperature calibration.py +291 -0
- ararpy/Example - Show MDD results.py +561 -0
- ararpy/Example - Show all Kfs age spectra.py +344 -0
- ararpy/Example - Show random walk results.py +363 -0
- ararpy/Example - Tc calculation.py +437 -0
- ararpy/__init__.py +3 -4
- ararpy/calc/age.py +34 -36
- ararpy/calc/arr.py +0 -20
- ararpy/calc/basic.py +26 -3
- ararpy/calc/corr.py +131 -85
- ararpy/calc/jvalue.py +7 -5
- ararpy/calc/plot.py +1 -2
- ararpy/calc/raw_funcs.py +41 -2
- ararpy/calc/regression.py +224 -132
- ararpy/files/arr_file.py +2 -1
- ararpy/files/basic.py +0 -22
- ararpy/files/calc_file.py +107 -84
- ararpy/files/raw_file.py +242 -229
- ararpy/smp/basic.py +133 -34
- ararpy/smp/calculation.py +6 -6
- ararpy/smp/corr.py +339 -153
- ararpy/smp/diffusion_funcs.py +345 -36
- ararpy/smp/export.py +247 -129
- ararpy/smp/info.py +2 -2
- ararpy/smp/initial.py +93 -45
- ararpy/smp/json.py +2 -2
- ararpy/smp/plots.py +144 -164
- ararpy/smp/raw.py +11 -15
- ararpy/smp/sample.py +222 -181
- ararpy/smp/style.py +26 -7
- ararpy/smp/table.py +42 -33
- ararpy/thermo/atomic_level_random_walk.py +56 -48
- ararpy/thermo/basic.py +2 -2
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/METADATA +10 -1
- ararpy-0.2.2.dist-info/RECORD +73 -0
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/WHEEL +1 -1
- ararpy-0.1.199.dist-info/RECORD +0 -66
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/licenses/LICENSE +0 -0
- {ararpy-0.1.199.dist-info → ararpy-0.2.2.dist-info}/top_level.txt +0 -0
ararpy/smp/info.py
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
|
|
16
16
|
def name(smp, n: str = None):
|
|
17
17
|
if n is None:
|
|
18
|
-
return smp.Info.
|
|
18
|
+
return smp.Info.experiment.name
|
|
19
19
|
elif isinstance(n, str):
|
|
20
|
-
smp.Info.
|
|
20
|
+
smp.Info.experiment.name = n
|
|
21
21
|
return n
|
|
22
22
|
else:
|
|
23
23
|
raise ValueError(f"{n} is not a string")
|
ararpy/smp/initial.py
CHANGED
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
#
|
|
11
11
|
"""
|
|
12
12
|
import os
|
|
13
|
+
import re
|
|
13
14
|
import pickle
|
|
14
15
|
import uuid
|
|
15
16
|
import pandas as pd
|
|
16
17
|
import numpy as np
|
|
17
18
|
import copy
|
|
18
19
|
from typing import List, Union, Optional
|
|
19
|
-
from ..calc import arr, err
|
|
20
|
+
from ..calc import arr, err, basic as calc_basic
|
|
20
21
|
from ..files import calc_file
|
|
21
22
|
from . import (sample as samples, basic, table, raw as smp_raw)
|
|
22
23
|
|
|
@@ -50,7 +51,7 @@ SPECTRA_RES = dict(zip(
|
|
|
50
51
|
spectra_res_keys, [np.nan for i in spectra_res_keys])
|
|
51
52
|
)
|
|
52
53
|
preference_keys = [
|
|
53
|
-
'
|
|
54
|
+
'decimal_places', 'to_precision', 'confidence_level', 'age_unit'
|
|
54
55
|
]
|
|
55
56
|
PREFERENCE_RES = dict(zip(
|
|
56
57
|
preference_keys, [6, 'fixed', 1, 'Ma'])
|
|
@@ -123,14 +124,14 @@ def create_sample_from_dict(content: dict, smp_info: dict):
|
|
|
123
124
|
|
|
124
125
|
def initial(smp: Sample):
|
|
125
126
|
# 已更新 2023/7/4
|
|
126
|
-
smp.TotalParam = arr.create_arr((len(samples.TOTAL_PARAMS_HEADERS) -
|
|
127
|
-
smp.BlankIntercept = arr.create_arr((len(samples.BLANK_INTERCEPT_HEADERS) -
|
|
128
|
-
smp.SampleIntercept = arr.create_arr((len(samples.SAMPLE_INTERCEPT_HEADERS) -
|
|
129
|
-
smp.PublishValues = arr.create_arr((len(samples.PUBLISH_TABLE_HEADERS) -
|
|
127
|
+
smp.TotalParam = arr.create_arr((len(samples.TOTAL_PARAMS_HEADERS) - 3, 0))
|
|
128
|
+
smp.BlankIntercept = arr.create_arr((len(samples.BLANK_INTERCEPT_HEADERS) - 3, 0))
|
|
129
|
+
smp.SampleIntercept = arr.create_arr((len(samples.SAMPLE_INTERCEPT_HEADERS) - 3, 0))
|
|
130
|
+
smp.PublishValues = arr.create_arr((len(samples.PUBLISH_TABLE_HEADERS) - 3, 0))
|
|
130
131
|
smp.DecayCorrected = arr.create_arr((10, 0))
|
|
131
|
-
smp.CorrectedValues = arr.create_arr((len(samples.CORRECTED_HEADERS) -
|
|
132
|
-
smp.DegasValues = arr.create_arr((len(samples.DEGAS_HEADERS) -
|
|
133
|
-
smp.ApparentAgeValues = arr.create_arr((len(samples.SPECTRUM_TABLE_HEADERS) -
|
|
132
|
+
smp.CorrectedValues = arr.create_arr((len(samples.CORRECTED_HEADERS) - 3, 0))
|
|
133
|
+
smp.DegasValues = arr.create_arr((len(samples.DEGAS_HEADERS) - 3, 0))
|
|
134
|
+
smp.ApparentAgeValues = arr.create_arr((len(samples.SPECTRUM_TABLE_HEADERS) - 3, 0))
|
|
134
135
|
smp.IsochronValues = arr.create_arr((len(samples.ISOCHRON_TABLE_HEADERS) - 3, 0))
|
|
135
136
|
|
|
136
137
|
# Doi
|
|
@@ -140,15 +141,18 @@ def initial(smp: Sample):
|
|
|
140
141
|
# Info
|
|
141
142
|
setattr(smp, 'Info', ArArBasic(
|
|
142
143
|
id='0', name='info', attr_name='Info', arr_version=samples.VERSION,
|
|
144
|
+
experiment=ArArBasic(
|
|
145
|
+
name='', type='', instrument='', mass_spec='', collectors='', step_num=0,
|
|
146
|
+
),
|
|
143
147
|
sample=ArArBasic(
|
|
144
148
|
name='SAMPLE NAME', material='MATERIAL', location='LOCATION', type='Unknown', method='',
|
|
145
|
-
sequence_unit='', weight=''
|
|
149
|
+
sequence_unit='', weight='',
|
|
146
150
|
),
|
|
147
151
|
researcher=ArArBasic(
|
|
148
|
-
name='RESEARCHER', addr='ADDRESS', email='EMAIL'
|
|
152
|
+
name='RESEARCHER', addr='ADDRESS', email='EMAIL',
|
|
149
153
|
),
|
|
150
154
|
laboratory=ArArBasic(
|
|
151
|
-
name='LABORATORY', addr='ADDRESS', email='EMAIL', info='INFORMATION', analyst='ANALYST'
|
|
155
|
+
name='LABORATORY', addr='ADDRESS', email='EMAIL', info='INFORMATION', analyst='ANALYST',
|
|
152
156
|
),
|
|
153
157
|
results=ArArBasic(
|
|
154
158
|
name='RESULTS', plateau_F=[], plateau_age=[], total_F=[], total_age=[],
|
|
@@ -183,42 +187,42 @@ def initial(smp: Sample):
|
|
|
183
187
|
reference=ArArBasic(
|
|
184
188
|
name='REFERENCE', journal='JOURNAL', doi='DOI'
|
|
185
189
|
),
|
|
186
|
-
preference=
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
)
|
|
190
|
+
preference=ArArBasic(**PREFERENCE_RES),
|
|
191
|
+
irradiation= ArArBasic(
|
|
192
|
+
label='', pos_h='', pos_x='', pos_y='',
|
|
193
|
+
)
|
|
190
194
|
))
|
|
191
195
|
|
|
192
|
-
decimal_places =
|
|
196
|
+
decimal_places = smp.Info.preference.decimal_places
|
|
193
197
|
# Plots and Tables
|
|
194
198
|
setattr(smp, 'UnknownTable', Table(
|
|
195
199
|
id='1', name='Unknown', header=samples.SAMPLE_INTERCEPT_HEADERS, decimal_places=decimal_places,
|
|
196
|
-
text_indexes=[0, 1],
|
|
200
|
+
text_indexes=[0, 1, 2],
|
|
197
201
|
# numeric_indexes=list(range(1, 20))
|
|
198
202
|
))
|
|
199
203
|
setattr(smp, 'BlankTable', Table(
|
|
200
204
|
id='2', name='Blank', header=samples.BLANK_INTERCEPT_HEADERS, decimal_places=decimal_places,
|
|
201
|
-
text_indexes=[0, 1],
|
|
205
|
+
text_indexes=[0, 1, 2],
|
|
202
206
|
# numeric_indexes=list(range(1, 20))
|
|
203
207
|
))
|
|
204
208
|
setattr(smp, 'CorrectedTable', Table(
|
|
205
209
|
id='3', name='Corrected', header=samples.CORRECTED_HEADERS, decimal_places=decimal_places,
|
|
206
|
-
text_indexes=[0, 1],
|
|
210
|
+
text_indexes=[0, 1, 2],
|
|
207
211
|
# numeric_indexes=list(range(1, 35))
|
|
208
212
|
))
|
|
209
213
|
setattr(smp, 'DegasPatternTable', Table(
|
|
210
214
|
id='4', name='Degas Pattern', header=samples.DEGAS_HEADERS, decimal_places=decimal_places,
|
|
211
|
-
text_indexes=[0, 1],
|
|
215
|
+
text_indexes=[0, 1, 2],
|
|
212
216
|
# numeric_indexes=list(range(1, 35))
|
|
213
217
|
))
|
|
214
218
|
setattr(smp, 'PublishTable', Table(
|
|
215
219
|
id='5', name='Publish', header=samples.PUBLISH_TABLE_HEADERS, decimal_places=decimal_places,
|
|
216
|
-
text_indexes=[0, 1],
|
|
220
|
+
text_indexes=[0, 1, 2],
|
|
217
221
|
# numeric_indexes=list(range(1, 20))
|
|
218
222
|
))
|
|
219
223
|
setattr(smp, 'AgeSpectraTable', Table(
|
|
220
224
|
id='6', name='Age Spectra', header=samples.SPECTRUM_TABLE_HEADERS, decimal_places=decimal_places,
|
|
221
|
-
text_indexes=[0, 1],
|
|
225
|
+
text_indexes=[0, 1, 2],
|
|
222
226
|
# numeric_indexes=list(range(1, 26))
|
|
223
227
|
))
|
|
224
228
|
setattr(smp, 'IsochronsTable', Table(
|
|
@@ -228,7 +232,7 @@ def initial(smp: Sample):
|
|
|
228
232
|
))
|
|
229
233
|
setattr(smp, 'TotalParamsTable', Table(
|
|
230
234
|
id='8', name='Total Params', header=samples.TOTAL_PARAMS_HEADERS, decimal_places=decimal_places,
|
|
231
|
-
text_indexes=[0, 1,
|
|
235
|
+
text_indexes=[0, 1, 2, 30, 31, 33, 34, 61, 100, 103, *list(range(104, 118))],
|
|
232
236
|
# numeric_indexes=list(range(1, 120)),
|
|
233
237
|
))
|
|
234
238
|
|
|
@@ -298,25 +302,65 @@ def check_version(smp: Sample):
|
|
|
298
302
|
std = initial(Sample())
|
|
299
303
|
basic.get_merged_smp(smp, std)
|
|
300
304
|
|
|
305
|
+
try:
|
|
306
|
+
version = int(smp.version)
|
|
307
|
+
except ValueError:
|
|
308
|
+
return smp
|
|
309
|
+
|
|
301
310
|
# 20250328: # Experiment info
|
|
302
311
|
smp.Info.experiment.name = smp.name()
|
|
303
312
|
smp.Info.experiment.step_num = smp.sequence().size
|
|
304
313
|
|
|
305
|
-
#
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
314
|
+
# old version: add masses and gain factors
|
|
315
|
+
if version < 20240730:
|
|
316
|
+
gains = np.ones([10, smp.Info.experiment.step_num])
|
|
317
|
+
gains[[1, 3, 5, 7, 9], :] = 0
|
|
318
|
+
smp.TotalParam[126:136] = gains.tolist()
|
|
319
|
+
gains[0] = 35.96754628
|
|
320
|
+
gains[2] = 36.9667759
|
|
321
|
+
gains[4] = 37.9627322
|
|
322
|
+
gains[6] = 38.964313
|
|
323
|
+
gains[8] = 39.962383123
|
|
324
|
+
smp.TotalParam[71:81] = gains.tolist()
|
|
325
|
+
smp.version = "20240730"
|
|
326
|
+
|
|
327
|
+
# 20250404: # Normalization for steps with different J values
|
|
328
|
+
# always check
|
|
329
|
+
if version < 1120250405:
|
|
330
|
+
doNormalize = True
|
|
331
|
+
v, sv = [], []
|
|
332
|
+
try:
|
|
333
|
+
if smp.Info.sample.type.lower() == "unknown":
|
|
334
|
+
v, sv = smp.TotalParam[67:69]
|
|
335
|
+
sv = np.multiply(v, sv) / 100
|
|
336
|
+
elif smp.Info.sample.type.lower() == "air":
|
|
337
|
+
v, sv = smp.TotalParam[93:95]
|
|
338
|
+
sv = np.multiply(v, sv) / 100
|
|
339
|
+
elif smp.Info.sample.type.lower() == "standard":
|
|
340
|
+
v, sv = smp.TotalParam[59:61]
|
|
341
|
+
except:
|
|
342
|
+
doNormalize = False
|
|
343
|
+
smp.TotalParam[136:138] = [
|
|
344
|
+
[1 if v[0] == each or not doNormalize else v[0] / each for each in v],
|
|
345
|
+
[0 if v[0] == v[i] or not doNormalize else err.div((v[0], sv[0]), (v[i], sv[i])) for i in range(len(v))]
|
|
346
|
+
]
|
|
347
|
+
# smp.version = "20250405"
|
|
348
|
+
|
|
349
|
+
# 20251001: # add marks for every table
|
|
350
|
+
if version < 20251002:
|
|
351
|
+
try:
|
|
352
|
+
stand_time_second = [
|
|
353
|
+
calc_basic.get_datetime(*re.findall(r"\d+", smp.TotalParam[31][i])) - calc_basic.get_datetime(
|
|
354
|
+
*re.findall(r"\d+", smp.TotalParam[30][i])) for i in range(smp.Info.experiment.step_num)]
|
|
355
|
+
except (BaseException, Exception) as e:
|
|
356
|
+
print(f"{type(e).__name__}: {str(e)}")
|
|
357
|
+
smp.TotalParam[32] = [np.nan for index in range(smp.Info.experiment.step_num)]
|
|
358
|
+
else:
|
|
359
|
+
smp.TotalParam[32] = [item / (3600 * 24 * 365.242) for item in stand_time_second] # stand year
|
|
360
|
+
smp = smp.recalculate(re_table_style=True)
|
|
361
|
+
smp = smp.recalculate(re_set_table=True)
|
|
362
|
+
smp.version = "20251001"
|
|
363
|
+
|
|
320
364
|
return smp
|
|
321
365
|
|
|
322
366
|
|
|
@@ -448,14 +492,14 @@ def from_raw_data(raw: RawData, mapping: Optional[List[dict]] = None) -> Sample:
|
|
|
448
492
|
for row in mapping:
|
|
449
493
|
row_unknown_intercept = []
|
|
450
494
|
row_blank_intercept = []
|
|
451
|
-
|
|
452
495
|
unknown: Sequence = raw.get_sequence(row['unknown'], flag='name')
|
|
453
|
-
|
|
496
|
+
try:
|
|
497
|
+
blank: Sequence = raw.get_sequence(row['blank'], flag='name')
|
|
498
|
+
if blank is None or blank == []: raise KeyError
|
|
499
|
+
except KeyError:
|
|
454
500
|
blank: Sequence = arr.filter(
|
|
455
|
-
raw.interpolated_blank, func=lambda seq: seq.datetime == unknown.datetime,
|
|
501
|
+
raw.interpolated_blank, func=lambda seq: seq.datetime == unknown.datetime and seq.name == row['blank'],
|
|
456
502
|
get=None, unique=True)
|
|
457
|
-
else:
|
|
458
|
-
blank: Sequence = raw.get_sequence(row['blank'], flag='name')
|
|
459
503
|
for i in range(5):
|
|
460
504
|
row_unknown_intercept = arr.multi_append(row_unknown_intercept, *unknown.results[i][int(unknown.fitting_method[i])][:2])
|
|
461
505
|
row_blank_intercept = arr.multi_append(row_blank_intercept, *blank.results[i][int(blank.fitting_method[i])][:2])
|
|
@@ -471,12 +515,16 @@ def from_raw_data(raw: RawData, mapping: Optional[List[dict]] = None) -> Sample:
|
|
|
471
515
|
sample.UnselectedSequence = list(range(len(sample.SequenceName)))
|
|
472
516
|
sample.SelectedSequence1 = []
|
|
473
517
|
sample.SelectedSequence2 = []
|
|
518
|
+
sample.IsochronMark = ['' for i in range(len(sample.SequenceName))]
|
|
474
519
|
#
|
|
475
520
|
sample.Info.results.selection[0]['data'] = sample.SelectedSequence1
|
|
476
521
|
sample.Info.results.selection[1]['data'] = sample.SelectedSequence2
|
|
477
522
|
sample.Info.results.selection[2]['data'] = sample.UnselectedSequence
|
|
523
|
+
sample.Info.experiment.step_num = len(sample.SequenceName)
|
|
524
|
+
|
|
525
|
+
sample.recalculate(re_initial=True)
|
|
478
526
|
|
|
479
|
-
table.update_table_data(sample) # Update table after submission row data and calculation
|
|
527
|
+
# table.update_table_data(sample) # Update table after submission row data and calculation
|
|
480
528
|
|
|
481
529
|
# sample.TotalParam[31] = [raw.get_sequence(row['unknown'], flag='name').datetime for row in mapping]
|
|
482
530
|
|
ararpy/smp/json.py
CHANGED
|
@@ -50,8 +50,8 @@ class MyEncoder(json.JSONEncoder):
|
|
|
50
50
|
Plot.Set, Plot.BasicAttr, RawData, Sequence, ArArBasic)):
|
|
51
51
|
if isinstance(obj, Sequence):
|
|
52
52
|
return dict(obj.__dict__, **{
|
|
53
|
-
'is_blank': obj.is_blank(), 'is_unknown': obj.is_unknown()
|
|
54
|
-
|
|
53
|
+
'is_blank': obj.is_blank(), 'is_unknown': obj.is_unknown()
|
|
54
|
+
})
|
|
55
55
|
return obj.__dict__
|
|
56
56
|
# Error
|
|
57
57
|
if isinstance(obj, BaseException):
|