Computation with the ADIOS data
The core Oil
object system was designed to managing the data – lots of detail about exactly what data is there, the ability to anything to be missing, and units clearly defined with each value.
However, this makes it a bit awkward to work with if you want to do computation.
The computation
sub-package provides a number of utilities that make it easier to do computation with the data.
The Measurement Objects
At the base of the entire set of data structures are py:class:Measurement objects. A Measurment object is used to store the actual data, along with its units, and a few utilties for unit conversion etc.
Features of a Measurement Object.
Unique object type for each physical unit type, e.g. Mass, Length, etc.
Stores the unit of the data
Can store single value, as well as a range of values, or greater than or less than.
Supplies unit convertion to other compatible units.
Note
The Measurement objects use the pynucos pacakge for all unit defintions and conversions. See: PyNUCOS on GitHub for unit types, names, etc.
Available Measurement classes:
AngularVelocity, AnyUnit, Concentration, Density, Dimensionless, DynamicViscosity, InterfacialTension, KinematicViscosity, Length, Mass, MassFraction, MassOrVolumeFraction, MeasurementBase, MeasurementDataclass, NeedleAdhesion, Pressure, SayboltViscosity, Temperature, Time, Unitless, VolumeFraction
Examples
Single Value:
# All the Measurment objects should be in the scripting namespace
import adios_db.scripting as ads
In [4]: mass_recovered = ads.Mass(54, 'kg')
In [5]: mass_recovered
Out[5]: Mass(value=54.0, unit='kg', unit_type='mass')
# create a new Object with different units
In [6]: mass_recovered.converted_to('g')
Out[6]: Mass(value=54000.0, unit='g', unit_type='mass')
# change units in place:
In [7]: mass_recovered.convert_to('g')
In [8]: mass_recovered
Out[8]: Mass(value=54000.0, unit='g', unit_type='mass')
# get the value
In [9]: mass_recovered.value
Out[9]: 54000.0
# and the unit
In [10]: mass_recovered.unit
Out[10]: 'g'
# it will not let you conver to an invalid unit:
In [11]: mass_recovered.convert_to('meter')
...
InvalidUnitError: The unit: meter is not in the list for Unit Type: Mass
In [12]: mass_recovered.convert_to('meter')
Range of Values:
You can specify a range of values for a measurement:
In [16]: pour_point
Out[16]: Temperature(unit='C', min_value=15.0, max_value=20.0, unit_type='temperature')
# The value is None:
In [17]: pour_point.value
The min and max are directly available:
In [20]: pour_point.min_value
Out[20]: 15.0
In [21]: pour_point.max_value
Out[21]: 20.0
# or you can find the minimum or maximum
# if there is a single value, it will be returned
In [18]: pour_point.minimum
Out[18]: 15.0
In [19]: pour_point.maximum
Out[19]: 20.0
Greater than or less than values:
You can specify only a minimum or maximum, to represent :greater than, or les than, for example a measurment below a detection limit might be less than a given value:
In [22]: benzene_concentation = ads.MassFraction(max_value=1, unit='ppb')
In [23]: benzene_concentation
Out[23]: MassFraction(unit='ppb', max_value=1.0, unit_type='massfraction')
In [24]: benzene_concentation.maximum
Out[24]: 1.0
In [25]: benzene_concentation.converted_to('ppm').maximum
Out[25]: 0.001
Similarly for greater than.