Post processing¶
LADiM comes with a simple python package postladim that can be used for
visualisation and analysis of LADiM output. It is based on the xarray package
http://xarray.pydata.org/en/stable/.
Usage¶
The basic class is ParticleFile giving access to the content
of a LADiM output file.
from postladim import ParticleFile
pf = ParticleFile("output.nc")
The ds method shows the underlying xarray Dataset, which is useful for a quick
overview of the content and for more advenced data processing.
The time at a given time step n is given by:
pf.time[n]
The output may be a bit verbose, pf.time(n) is syntactic sugar for the more concise``pf.time[n].values``.
The number of particles at time step n is given by:
pf.count[n]
For use in indexing pf.count is an integer array instead of an xarray DataArray.
The DataArray is avaiable as pf.ds.particle_count.
Following pandas and xarray, an instance variable, like X, is given both by
attribute pf.X and item pf['X'] notation. The NetCDF inspired notation
pf.variables['X'] is obsolete.
The most basic operation for an instance variable is to get the values at time step n as a xarray DataArray:
pf.X[n]
An alternative notation is pf.X.isel(time=n). The time stamp can be used instead of
the time index:
pf.X.sel(time='2020-02-05 12')
The format is optimized for particle distributions at a given time. Trajectories and other time series for a given particle may take longer time to extract. For the particle with identifier pid=p, the X-coordinate of the trajectory is given by:
pf.X.sel(pid=p)
If many trajectories are needed, it may be useful to turn the dataset into a full (i.e. non-sparse) 2D DataArray, indexed by time and particle identifier.
pf.X.full()
Note that for long simulations with particles of limited life span, this array may become much larger than the ParticleFile.
Reference¶
ParticleFile¶
-
class
ParticleFile(particle_file)¶ - Class for LADiM result files.
-
ds¶ The underlying xarray Dataset.
-
num_times¶ Number of time frames in the file.
-
-
num_particles¶ - The number of distinct particles
-
count¶ Integer numpy ndarray of particle counts at different time steps
-
start¶ ndarray of start indices at different time step
-
end¶ ndarray of end indices, short hand for pf.start + pf.count
-
instance_variables¶ List of particle instance variables
-
particle_variables¶ List of particle variables.
-
time¶ xarray DataArray of time stamps
-
position(n)¶ Tuple with position (X, Y) of particle-distribution at n-th time time,
pf.position(n) = (pf.X[n], pf.Y[n])
-
trajectory(pid)¶ Returns a tuple of X and Y coordinates of the particle with identifier pid,
trajectory(pid) = (pf.X.sel(pid=pid), pf.Y.sel(pid=pid)).
-
variables¶ Deprecated, dictionary of variables,
pf.variables['X'] = pf['X'] = pf.X.
-
time(n) Syntactic sugar,
pf.time(n) = pf.time[n].values
-
particle_count(n)¶ Deprecated,
pf.particle_count(n) = pf.count[n]
-
InstanceVariable¶
-
class
InstanceVariable¶ -
da¶ The underlying xarray DataArray
-
count¶ Number of particles at given time
-
time¶ The time steps
-
num_particles¶ The number of distinct particles
-
isel(time=n)¶ Select by time index,
V.isel(time=n) = V[n].
-
sel(time=t, pid=p)¶ Select by time value and/or pid value
V.sel(time='2019-09-19 12')selects particles at that time valueV.sel(pid=23)selects the time history of particle with that pid valueV.sel(time='2019-09-19 12', pid=23)selects the unique particle instance
-
full()¶ Return the full (non-sparse) 2D DataArray. May become vary large.
-
The InstanceVariable class support item notation:
V[n] = V.isel(time=n)
V[n, p] = V.isel(time=n).sel(pid=p)
Note that V[n, p] may be different from V[n][p] if particles have been removed.
The length of an instance variable is the number of time steps,
len(V) == len(V.time).