ararpy 0.1.20__py3-none-any.whl → 0.1.22__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/__init__.py CHANGED
@@ -16,7 +16,7 @@ from . import calc, smp, files, thermo, test
16
16
  """ Information """
17
17
 
18
18
  name = 'ararpy'
19
- version = '0.1.20'
19
+ version = '0.1.22'
20
20
  __version__ = version
21
21
  full_version = version
22
22
  last_update = '2024-03-28'
ararpy/calc/age.py CHANGED
@@ -41,11 +41,13 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
41
41
  J = arr.array_as_float(kwargs.pop('J'))
42
42
  sJ = arr.array_as_float(kwargs.pop('sJ') * J / 100)
43
43
  A = arr.array_as_float(kwargs.pop('A'))
44
- sA = arr.array_as_float(kwargs.pop('sA') * A / 100)
44
+ sA = arr.array_as_float(kwargs.pop('sA') * A / 100) # total A, A = Aec + (Ab+) + (Ab-). Ab- for Ca
45
45
  Ae = arr.array_as_float(kwargs.pop('Ae'))
46
- sAe = arr.array_as_float(kwargs.pop('sAe') * Ae / 100)
46
+ sAe = arr.array_as_float(kwargs.pop('sAe') * Ae / 100) # Aec
47
47
  Ab = arr.array_as_float(kwargs.pop('Ab'))
48
- sAb = arr.array_as_float(kwargs.pop('sAb') * Ab / 100)
48
+ sAb = arr.array_as_float(kwargs.pop('sAb') * Ab / 100) # Ab-
49
+ Abp = arr.array_as_float(kwargs.pop('Abp'))
50
+ sAbp = arr.array_as_float(kwargs.pop('sAbp') * Ab / 100) # Ab+
49
51
  W = arr.array_as_float(kwargs.pop('W'))
50
52
  sW = arr.array_as_float(kwargs.pop('sW') * W / 100)
51
53
  Y = arr.array_as_float(kwargs.pop('Y'))
@@ -62,21 +64,21 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
62
64
  sLb = arr.array_as_float(kwargs.pop('sLb') * Lb / 100)
63
65
  t = arr.array_as_float(kwargs.pop('t'))
64
66
  st = arr.array_as_float(kwargs.pop('st'))
65
- # Ap = arr.array_as_float(kwargs.pop('Ap'))
66
- # sAp = arr.array_as_float(kwargs.pop('sAp') * Ap / 100)
67
- # Kp = arr.array_as_float(kwargs.pop('Kp'))
68
- # sKp = arr.array_as_float(kwargs.pop('sKp') * Kp / 100)
67
+ Ap = arr.array_as_float(kwargs.pop('Ap'))
68
+ sAp = arr.array_as_float(kwargs.pop('sAp') * Ap / 100)
69
+ Kp = arr.array_as_float(kwargs.pop('Kp'))
70
+ sKp = arr.array_as_float(kwargs.pop('sKp') * Kp / 100)
69
71
 
70
- # recalculation using Min et al.(2000) equation
72
+ # calculating using Min et al.(2000) equation
71
73
  # lmd = A * W * Y / (f * No)
72
74
  V = f * No / ((Ab + Ae) * W * Y)
73
- sf = 0
74
75
  sV = pow((V / f * sf) ** 2 + (V / No * sNo) ** 2 + (V / (Ab + Ae)) ** 2 * (sAb ** 2 + sAe ** 2) +
75
76
  (V / W * sW) ** 2 + (V / Y * sY) ** 2, 0.5)
77
+
76
78
  # standard age in year, change to Ma
77
79
  t = t * 1000000
78
80
  st = st * 1000000
79
- # back-calculating Ar40/Ar39 ration for the standard
81
+ # back-calculating Ar40/Ar39 of the standard
80
82
  stdR = (np.exp(t * L) - 1) / J
81
83
  # errors of standard age and decay constants were not applied
82
84
  sStdR = pow((stdR / J) ** 2 * sJ ** 2, 0.5)
@@ -85,31 +87,27 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
85
87
  sR_1 = np.sqrt((sF / stdR) ** 2 + (F * sStdR / stdR ** 2) ** 2) # errors of measured 40Ar/39Ar and J value
86
88
  sR_2 = np.sqrt((sF / stdR) ** 2) # error of measured 40Ar/39Ar only
87
89
 
88
- BB = 1
89
- KK = np.exp(t / V) - 1 # 40Arr / 40K Use standard age
90
+ useStandardAge = True
91
+ if useStandardAge:
92
+ # ln part in Min 2000 equation
93
+ BB = 1
94
+ KK = np.exp(t / V) - 1 # 40Arr / 40K Use standard age
95
+ else: # use Ar40* and K concentrations of primary standard
96
+ # not fanished, this function is wrong
97
+ BB = (Ab + Ae) / Ae
98
+ KK = Ap / Kp / f
99
+ raise TypeError(f"Not use standard age. Not supported.")
100
+
90
101
  XX = BB * KK * R + 1
91
102
  k0 = V * np.log(XX)
92
- e1 = (np.log(XX) * V / f - V * BB * KK * R / (f * XX)) ** 2 * sf ** 2 # sF
93
- e2 = (np.log(XX) * V / No) ** 2 * sNo ** 2 # sNo
94
- e3 = (-1 * np.log(XX) * V / A + BB * KK * R / (A * XX)) ** 2 * sAb ** 2 # sAb
95
- e4 = (-1 * np.log(XX) * V / A - Ab * KK * R / (Ae ** 2 * XX)) ** 2 * sAe ** 2 # sAe
96
- e5 = (-1 * np.log(XX) * V / W - V * BB * KK * R / (W * XX)) ** 2 * sW ** 2 # sW
97
- e6 = (np.log(XX) * V / Y) ** 2 * sY ** 2 # sY
98
- e7 = (V * BB * KK / XX) ** 2 * sR_1 ** 2 # sR
99
- # e8 = (V * BB * KK * R / (Ap * XX)) ** 2 * sAp ** 2 # sAp
100
- # e9 = (V * BB * KK * R / (Kp * XX)) ** 2 * sKp ** 2 # sKp
101
- e8, e9 = 0, 0
102
- # useDecayConst = False
103
- # if useDecayConst: # k0 = log(L / Le * KK * R + 1) / L
104
- # e1 = (V * BB * KK * R / (f * XX)) ** 2 * sf ** 2
105
- # e2 = 0
106
- # e3 = (-1 * np.log(XX) * V / L + BB * KK * R / (L * XX)) ** 2 * sLb ** 2
107
- # e4 = (-1 * np.log(XX) * V / L - Lb * KK * R / (Le ** 2 * XX)) ** 2 * sLe ** 2
108
- # e5 = (V * BB * KK * R / (W * XX)) ** 2 * sW ** 2
109
- # e6 = 0
110
- useStandardAge = True
103
+
111
104
  if useStandardAge:
112
- e1, e9 = 0, 0
105
+ # k0 = V * ln(exp(t/V) - 1 * R + 1)
106
+ e1 = (np.log(XX) - R * (KK + 1) * t / (V * XX)) ** 2 * sV ** 2 # sV
107
+ e2 = (BB * (KK + 1) * R / XX) ** 2 * st ** 2 # st
108
+ e3 = (V * BB * KK / XX) ** 2 * sR_1 ** 2 # sR
109
+ else:
110
+ e1, e2, e3 = 0, 0, 0
113
111
 
114
112
  # change to Ma
115
113
  # analytical error, error of 40Ar/39Ar only
@@ -117,7 +115,7 @@ def calc_age_min(F, sF, **kwargs) -> tuple:
117
115
  # internal error, errors of 40Ar/39Ar and J value
118
116
  s2 = np.sqrt((V * KK * BB / XX) ** 2 * sR_1 ** 2)
119
117
  # total external error
120
- s3 = np.sqrt(e1 + e2 + e3 + e4 + e5 + e6 + e7 + e8 + e9)
118
+ s3 = np.sqrt(e1 + e2 + e3)
121
119
  age = k0
122
120
  return age, s1, s2, s3
123
121
 
@@ -146,7 +144,7 @@ def calc_age_general(F, sF, J, sJ, L, sL, **kwargs):
146
144
  v1 = sF ** 2 * (J / (L * (1 + J * F))) ** 2
147
145
  v2 = sJ ** 2 * (F / (L * (1 + J * F))) ** 2
148
146
  v3 = sL ** 2 * (np.log(1 + J * F) / (L ** 2)) ** 2
149
- s1 = v1 ** .5 # analytical error
150
- s2 = (v1 + v2) ** .5 # internal error
151
- s3 = (v1 + v2 + v3) ** .5 # full external error
147
+ s1 = v1 ** .5 # analytical error, F only
148
+ s2 = (v1 + v2) ** .5 # internal error, F and J
149
+ s3 = (v1 + v2 + v3) ** .5 # full external error. F, J and L
152
150
  return age, s1, s2, s3
ararpy/calc/corr.py CHANGED
@@ -61,10 +61,10 @@ def mdf(rm: float, srm: float, m1: float, m2: float, ra: float = 298.56,
61
61
  sratio_m = err.div((m2, sm2), (m1, sm1))
62
62
  useRyu = False
63
63
  if not useRyu:
64
- # line
65
- k1 = (ra / rm + delta_m - 1) / delta_m
66
- k2 = err.div(((ra / rm + delta_m - 1), err.div((ra, sra), (rm, srm))), (delta_m, sdelta_m))
67
- # exp
64
+ # line, D = 1 + (ra / rm - 1) / dm # Renne2009
65
+ k1 = 1 + (ra / rm - 1) / delta_m
66
+ k2 = err.div(((ra / rm - 1), err.div((ra, sra), (rm, srm))), (delta_m, sdelta_m))
67
+ # exp, D = 1 + ln(ra / rm) / (m1 * ln(m2/m1)) # Renne2009
68
68
  try:
69
69
  k3 = (np.log(ra / rm) / np.log(ratio_m)) * (1 / m1) + 1
70
70
  v1 = err.log((ra / rm, err.div((ra, sra), (rm, srm))))
@@ -73,7 +73,7 @@ def mdf(rm: float, srm: float, m1: float, m2: float, ra: float = 298.56,
73
73
  k4 = err.div((np.log(ra / rm) / np.log(ratio_m), v3), (m1, sm1))
74
74
  except Exception:
75
75
  k3, k4 = 0, 0
76
- # pow
76
+ # pow, D = pow(ra / rm, 1 / dm) # Renne2009
77
77
  try:
78
78
  k5 = pow((ra / rm), (1 / delta_m)) # Renne2009, B.D. Turrin2010
79
79
  k6 = err.pow((ra / rm, err.div((ra, sra), (rm, srm))),
@@ -105,18 +105,17 @@ def discr(a0: list, e0: list, mdf: list, smdf: list, m: list, m40: list,
105
105
  if isRelative:
106
106
  smdf = [smdf[i] * mdf[i] / 100 for i in range(len(smdf))]
107
107
  for i in range(min([len(arg) for arg in [a0, e0, mdf, smdf]])):
108
- delta_mass = abs(m40[i] - m[i])
109
- ratio_mass = abs(m40[i] / m[i]) if m[i] != 0 else 1
110
- if method.lower().startswith("l"):
111
- k0 = 1 / (delta_mass * mdf[i] - delta_mass + 1) if (delta_mass * mdf[i] - delta_mass + 1) != 0 else 0
112
- k1 = err.div((1, 0), (delta_mass * mdf[i] - delta_mass + 1, smdf[i] * delta_mass))
113
- elif method.lower().startswith("e"):
114
- k0 = 1 / (ratio_mass ** (mdf[i] * m40[i] - m[i]))
115
- k1 = err.div((1, 0), (ratio_mass ** (mdf[i] * m40[i] - m[i]), err.pow((ratio_mass, 0), (
116
- mdf[i] * m40[i] - m[i], err.mul((mdf[i], smdf[i]), (m40[i], 0))))))
117
- elif method.lower().startswith("p"):
118
- k0 = 1 / (mdf[i] ** delta_mass)
119
- k1 = err.div((1, 0), (mdf[i] ** delta_mass, err.pow((mdf[i], smdf[i]), (delta_mass, 0))))
108
+ delta_m = abs(m40[i] - m[i])
109
+ ratio_m = abs(m40[i] / m[i]) if m[i] != 0 else 1
110
+ if method.lower().startswith("l"): # linear
111
+ k0 = 1 / (delta_m * mdf[i] - delta_m + 1) if (delta_m * mdf[i] - delta_m + 1) != 0 else 0
112
+ k1 = err.rec((delta_m * mdf[i] - delta_m + 1, smdf[i] * delta_m))
113
+ elif method.lower().startswith("e"): # exponential
114
+ k0 = 1 / np.exp((mdf - 1) * m * np.log(m40 / m))
115
+ k1 = err.rec((1 / k0, err.pow((np.e, 0), ((mdf - 1) * m * np.log(m40 / m), err.mul((mdf - 1, smdf), (m * np.log(m40 / m), 0))))))
116
+ elif method.lower().startswith("p"): # power
117
+ k0 = 1 / (mdf[i] ** delta_m)
118
+ k1 = err.rec((mdf[i] ** delta_m, err.pow((mdf[i], smdf[i]), (delta_m, 0))))
120
119
  else:
121
120
  k0 = 1
122
121
  k1 = 0
ararpy/smp/basic.py CHANGED
@@ -153,7 +153,8 @@ def calc_age(ar40ar39=None, params: dict = None, smp: Sample = None, index: list
153
153
  """
154
154
  params_index_dict = {
155
155
  34: 'L', 35: 'sL', 36: 'Le', 37: 'sLe', 38: 'Lb', 39: 'sLb', 48: 'A', 49: 'sA',
156
- 50: 'Ae', 51: 'sAe', 52: 'Ab', 53: 'sAb', 59: 't', 60: 'st', 67: 'J', 68: 'sJ',
156
+ 50: 'Ae', 51: 'sAe', 52: 'Ab', 53: 'sAb', 54: 'Abp', 55: 'sAbp', 59: 't', 60: 'st',
157
+ 61: 'Ap', 62: 'sAp', 63: 'Kp', 64: 'sKp', 67: 'J', 68: 'sJ',
157
158
  81: 'W', 82: 'sW', 83: 'No', 84: 'sNo', 85: 'Y', 86: 'sY', 87: 'f', 88: 'sf', 110: 'Min'
158
159
  }
159
160
 
ararpy/smp/corr.py CHANGED
@@ -545,7 +545,7 @@ def monte_carlo_f(sample: Sample):
545
545
  R36v38clp = np.transpose(sample.TotalParam[56:58])
546
546
 
547
547
  stand_time_year = np.transpose(sample.TotalParam[32])
548
- JNFactor = sample.NormalizeFactor
548
+ JNFactor = np.transpose(sample.NormalizeFactor)
549
549
 
550
550
  irradiation_cycles = [list(filter(None, re.split(r'[DS]', each_step))) for each_step in sample.TotalParam[27]]
551
551
  t1 = [re.findall(r"\d+", i) for i in sample.TotalParam[31]] # t1: experimental times
@@ -579,7 +579,7 @@ def monte_carlo_f(sample: Sample):
579
579
  L37ar=L37ar[i], L39ar=L39ar[i], L36cl=L36cl[i],
580
580
  MDFunc=None,
581
581
  MDF=MDF[i], stand_time_year=stand_time_year[i],
582
- JNFactor=JNFactor,
582
+ JNFactor=JNFactor[i],
583
583
  blank_gain_corr=sample.TotalParam[111][i]
584
584
  )
585
585
 
ararpy/smp/sample.py CHANGED
@@ -248,8 +248,8 @@ TOTAL_PARAMS_SHORT_HEADERS = [
248
248
  'DAb-K40', '%1s', # 54-55
249
249
  'DAb+K40', '%1s', # 56-57
250
250
  'Cl36/Cl38P', '%1s', # 58-59
251
- 'StdName', 'StdAge', '1s', 'Ar40%', '1s', 'K%', '1s',
252
- 'F', '1s', # 60-68
251
+ 'StdName', 'StdAge', '1s', 'Ar40%', '1s', 'K%', '1s', # 60-66
252
+ 'F', '1s', # 67-68
253
253
  'J', '%1s', 'MDF', '%1s', # 69-72
254
254
  'MassAr36', '%1s', 'MassAr37', '%1s',
255
255
  'MassAr38', '%1s', 'MassAr39', '%1s',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ararpy
3
- Version: 0.1.20
3
+ Version: 0.1.22
4
4
  Summary: A project for Ar-Ar geochronology
5
5
  Home-page: https://github.com/wuyangchn/ararpy.git
6
6
  Author: Yang Wu
@@ -1,10 +1,10 @@
1
- ararpy/__init__.py,sha256=V5si5FQDT72N9e7Nf_GuCgS_ZNJdcFEdGAvhIDS_E2I,6857
1
+ ararpy/__init__.py,sha256=eXot2SznEPD-wmJMnxjnESJes1ehgJafSapnCxoKwxc,6857
2
2
  ararpy/test.py,sha256=4F46-JJ1Ge12HGae0qO44Qc6kiEMHBgn2MsY_5LlHDo,3973
3
3
  ararpy/calc/__init__.py,sha256=kUjRuLE8TLuKOv3i976RnGJoEMj23QBZDu37LWs81U4,322
4
- ararpy/calc/age.py,sha256=OcStt55LoYW1brs7a5_Ovv1NUSR5uZVQHDVGGmA_Pqg,5784
4
+ ararpy/calc/age.py,sha256=WOZs70zXiBWDIEhXJLIaNiYTOFJNk0NDbH5e5zCbCks,5435
5
5
  ararpy/calc/arr.py,sha256=jD1Fd0Cj3xc7NqgnG4cp3VWQWxUlV0qCtPBZZokDG8o,15246
6
6
  ararpy/calc/basic.py,sha256=uJCCUFaPd9zvfkggrdbFYSGLl2pt7UJ7ENgXanzHy68,4036
7
- ararpy/calc/corr.py,sha256=6hlBlFIM8HyN6CDuWPGqiLpVM88pZJLEuRm8vAyg9ng,18747
7
+ ararpy/calc/corr.py,sha256=QDitvLf6y5IBpHtVEJfOUVjWSlIP9qJ4Jhluk9eDEDE,18801
8
8
  ararpy/calc/err.py,sha256=63LtprqjemlIb1QGDst4Ggcv5KMSDHdlAIL-nyQs1eA,2691
9
9
  ararpy/calc/histogram.py,sha256=0GVbDdsjd91KQ1sa2B7NtZ4KGo0XpRIJapgIrzAwQUo,5777
10
10
  ararpy/calc/isochron.py,sha256=ej9G2e68k6yszonWHsLcEubh3TA7eh1upTJP_X0ttAA,5726
@@ -41,10 +41,10 @@ ararpy/files/raw_file.py,sha256=5hnZMS7r78lA0ZXrBEN5SWVurQyl0QsHOI9rJz5BQv8,2230
41
41
  ararpy/files/xls.py,sha256=DVcZ_yRnc19p-m4leGGjt-YPDpSa2udYKmGyrM0qub0,640
42
42
  ararpy/smp/EXPORT_TO_PDF_DATA_PROPERTIES.py,sha256=baDM437tu6hsPv0uYfod0TREXlPd6kvMBFT1S9ZZlkk,3024
43
43
  ararpy/smp/__init__.py,sha256=k6_fa27UJsQK7K7oC5GYlwMo6l0Xd8af3QtOrZz2XJk,478
44
- ararpy/smp/basic.py,sha256=FjntKS61vdUFtwrBJcL2HTiTJthR288Q-DDNuFoUND4,24825
44
+ ararpy/smp/basic.py,sha256=PMvlSoToY8CJEORRrhEo4rYM2-VfSmjg0IuDpGFOGUM,24899
45
45
  ararpy/smp/calculation.py,sha256=LCFJWjLVLEKEQ5b7RFUIxsMahEzgLdodW4kCYXV5Z34,2919
46
46
  ararpy/smp/consts.py,sha256=XIdjdz8cYxspG2jMnoItdlUsxr3hKbNFJjMZJh1bpzw,393
47
- ararpy/smp/corr.py,sha256=tE8nVv7DrL9ktou_HvxfYQaYwhJ3MA4l0fAXasKVph8,26499
47
+ ararpy/smp/corr.py,sha256=L4YwCzu14Zot9tm9ijOgYzMbZEYEZGXArACrquIrfDg,26516
48
48
  ararpy/smp/diffusion_funcs.py,sha256=4-PMMIZWzjk2HOYYWNgSp4GmApygp1MmOxJ2g3xrqWc,175049
49
49
  ararpy/smp/export.py,sha256=s89L5B1aHoCeJIjcw6nXA6NtV0j_5XXaWnOETWnomCs,115043
50
50
  ararpy/smp/info.py,sha256=iKUELm-BuUduDlJKC1d8tKKNHbwwbNmhUg2pi6bcBvA,489
@@ -52,15 +52,15 @@ ararpy/smp/initial.py,sha256=VSNku2fYD1xGkpHxMqnSJCAhSQawfsDCdqYCxtDJryQ,17196
52
52
  ararpy/smp/json.py,sha256=BTZCjVN0aj9epc700nwkYEYMKN2lHBYo-pLmtnz5oHY,2300
53
53
  ararpy/smp/plots.py,sha256=rF0vrFu9dMt2Eu1EHiDfDRC9232M6dH0Unc_3qNDxLY,33579
54
54
  ararpy/smp/raw.py,sha256=51n-rrbW2FqeZHQyevuG7iObPLGvIBzTe414QDVM1FE,6523
55
- ararpy/smp/sample.py,sha256=ZOrQt3Ilm6tJbQCwh_btoZOXdkCngZFHCt10Nh0UmpI,57727
55
+ ararpy/smp/sample.py,sha256=dEgy2--RxfS4vXYqlBjD5MlLpw2SaZPDyPxRyiQXjgU,57736
56
56
  ararpy/smp/style.py,sha256=wCygwtpCflhzwmI7u08X-feYGPytOyfR98YcgJx813c,7678
57
57
  ararpy/smp/table.py,sha256=9bNAOqAIOc0nSC3LNeqjJKUYSJSM28Ji3o9VimwMU8A,6645
58
58
  ararpy/thermo/__init__.py,sha256=6VBuqTRFl403PVqOuMkVrut0nKaQsAosBmfW91X1dMg,263
59
59
  ararpy/thermo/arrhenius.py,sha256=Ass1ichHfqIAtpv8eLlgrUc1UOb3Urh1qzr1E3gLB4U,233
60
60
  ararpy/thermo/atomic_level_random_walk.py,sha256=Q97zfe2h2RaxADkoBAqd0uEiP16BFOajrTmXHMkL2EQ,25502
61
61
  ararpy/thermo/basic.py,sha256=nBGHI9uK7VdJwThwBIOcKAzdnYqPyQseFoY6s4zKizk,11504
62
- ararpy-0.1.20.dist-info/licenses/LICENSE,sha256=cvG5t_C1qY_zUyJI7sNOa7gCArdngNPaOrfujl2LYuc,1085
63
- ararpy-0.1.20.dist-info/METADATA,sha256=-3UiJOtxnZz1wNj81B591579TjQq3rzQ5K5DlVvHxyA,24516
64
- ararpy-0.1.20.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
65
- ararpy-0.1.20.dist-info/top_level.txt,sha256=9iTpsPCYuRYq09yQTk9d2lqB8JtTEOmbN-IcGB-K3vY,7
66
- ararpy-0.1.20.dist-info/RECORD,,
62
+ ararpy-0.1.22.dist-info/licenses/LICENSE,sha256=cvG5t_C1qY_zUyJI7sNOa7gCArdngNPaOrfujl2LYuc,1085
63
+ ararpy-0.1.22.dist-info/METADATA,sha256=BD8UulpdJ0OOiH2cSJaEwfB6qWjavqDcc6XnVZF8OEI,24516
64
+ ararpy-0.1.22.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
65
+ ararpy-0.1.22.dist-info/top_level.txt,sha256=9iTpsPCYuRYq09yQTk9d2lqB8JtTEOmbN-IcGB-K3vY,7
66
+ ararpy-0.1.22.dist-info/RECORD,,