4
4
5
5
from hashlib import md5
6
6
from math import isnan
7
+ from bson .dbref import DBRef
7
8
from datetime import datetime
8
9
from flask import current_app
9
10
from atlasq import AtlasManager , AtlasQ
18
19
from boltons .iterutils import remap
19
20
from decimal import Decimal
20
21
from pint import UnitRegistry
21
- from pint .unit import UnitDefinition
22
- from pint .converters import ScaleConverter
23
22
from pint .errors import DimensionalityError
24
23
from uncertainties import ufloat_fromstr
25
24
from pymatgen .core import Composition , Element
35
34
lambda s : s .replace ("%" , " percent " ),
36
35
],
37
36
)
38
- ureg .default_format = "~,P"
39
-
40
- ureg .define (UnitDefinition ("percent" , "%" , (), ScaleConverter (0.01 )))
41
- ureg .define (UnitDefinition ("permille" , "%%" , (), ScaleConverter (0.001 )))
42
- ureg .define (UnitDefinition ("ppm" , "ppm" , (), ScaleConverter (1e-6 )))
43
- ureg .define (UnitDefinition ("ppb" , "ppb" , (), ScaleConverter (1e-9 )))
37
+ ureg .formatter .default_format = "~,P"
38
+
39
+ if "percent" not in ureg :
40
+ # percent is native in pint >= 0.21
41
+ ureg .define ("percent = 0.01 = %" )
42
+ if "permille" not in ureg :
43
+ # permille is native in pint >= 0.24.2
44
+ ureg .define ("permille = 0.001 = ‰ = %%" )
45
+ if "ppm" not in ureg :
46
+ # ppm is native in pint >= 0.21
47
+ ureg .define ("ppm = 1e-6" )
48
+ ureg .define ("ppb = 1e-9" )
44
49
ureg .define ("atom = 1" )
45
50
ureg .define ("bohr_magneton = e * hbar / (2 * m_e) = µᵇ = µ_B = mu_B" )
46
51
ureg .define ("electron_mass = 9.1093837015e-31 kg = mₑ = m_e" )
@@ -68,12 +73,12 @@ def format_cell(cell):
68
73
return cell
69
74
70
75
q = get_quantity (cell )
71
- if not q or isnan (q .nominal_value ):
76
+ if not q or isnan (q .magnitude . nominal_value ):
72
77
return cell
73
78
74
79
q = truncate_digits (q )
75
80
try :
76
- return str (q .nominal_value ) if isnan (q .std_dev ) else str (q )
81
+ return str (q .magnitude . nominal_value ) if isnan (q . magnitude .std_dev ) else str (q )
77
82
except Exception :
78
83
return cell
79
84
@@ -102,10 +107,10 @@ def get_quantity(s):
102
107
103
108
104
109
def truncate_digits (q ):
105
- if isnan (q .nominal_value ):
110
+ if isnan (q .magnitude . nominal_value ):
106
111
return q
107
112
108
- v = Decimal (str (q .nominal_value ))
113
+ v = Decimal (str (q .magnitude . nominal_value ))
109
114
vt = v .as_tuple ()
110
115
111
116
if vt .exponent >= 0 :
@@ -114,8 +119,8 @@ def truncate_digits(q):
114
119
dgts = len (vt .digits )
115
120
dgts = max_dgts if dgts > max_dgts else dgts
116
121
s = f"{ v :.{dgts }g} "
117
- if not isnan (q .std_dev ):
118
- s += f"+/-{ q .std_dev :.{dgts }g} "
122
+ if not isnan (q .magnitude . std_dev ):
123
+ s += f"+/-{ q .magnitude . std_dev :.{dgts }g} "
119
124
120
125
if q .units :
121
126
s += f" { q .units } "
@@ -260,7 +265,7 @@ def make_quantities(path, key, value):
260
265
return key , value
261
266
262
267
# silently ignore "nan"
263
- if isnan (q .nominal_value ):
268
+ if isnan (q .magnitude . nominal_value ):
264
269
return False
265
270
266
271
# ensure that the same units are used across contributions
@@ -288,11 +293,11 @@ def make_quantities(path, key, value):
288
293
q = truncate_digits (q )
289
294
290
295
# return new value dict
291
- display = str (q .value ) if isnan (q .std_dev ) else str (q )
296
+ display = str (q .value ) if isnan (q .magnitude . std_dev ) else str (q )
292
297
value = {
293
298
"display" : display ,
294
- "value" : q .nominal_value ,
295
- "error" : q .std_dev ,
299
+ "value" : q .magnitude . nominal_value ,
300
+ "error" : q .magnitude . std_dev ,
296
301
"unit" : str (q .units ),
297
302
}
298
303
return key , value
@@ -307,10 +312,11 @@ def pre_delete(cls, sender, document, **kwargs):
307
312
document .reload (* args )
308
313
309
314
for component in COMPONENTS .keys ():
310
- # check if other contributions exist before deletion!
311
- for idx , obj in enumerate (getattr (document , component )):
315
+ # check if other contributions exist before deletion
316
+ # and make sure component still exists (getattr converts ref to object)
317
+ for obj in getattr (document , component ):
312
318
q = {component : obj .id }
313
- if sender .objects (** q ).count () < 2 :
319
+ if sender .objects (** q ).count () < 2 and not isinstance ( obj , DBRef ) :
314
320
obj .delete ()
315
321
316
322
0 commit comments