flowtracks 1.6.2.dev1__py3-none-any.whl → 1.6.2.dev4__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.
Files changed (30) hide show
  1. flowtracks/__init__.py +10 -0
  2. flowtracks/_version.py +3 -3
  3. flowtracks/eulerian.py +29 -2
  4. flowtracks/io.py +10 -1
  5. flowtracks/phasing.py +111 -0
  6. flowtracks/writers.py +19 -1
  7. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/METADATA +1 -1
  8. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/RECORD +30 -29
  9. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/batch_Lagrangian_to_Eulerian.py +0 -0
  10. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/hdf5_scene_analysis.ipynb +0 -0
  11. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/linking_trajectories.ipynb +0 -0
  12. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_dual_rig_trajectories.py +0 -0
  13. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_flowtracks.py +0 -0
  14. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_hdf5_vs_zarr_scene_analysis.py +0 -0
  15. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_linking_trajectories_zarr.py +0 -0
  16. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_phase_averaging_demo.py +0 -0
  17. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_phase_metrics.py +0 -0
  18. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_vtk_writers_preview.py +0 -0
  19. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/marimo_zarr_dashboard.py +0 -0
  20. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/repeated_interpolation.ipynb +0 -0
  21. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/run_pipeline.py +0 -0
  22. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/visualize_marimo.py +0 -0
  23. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/data/flowtracks-examples/visualize_results.py +0 -0
  24. {flowtracks-1.6.2.dev1.data → flowtracks-1.6.2.dev4.data}/scripts/analyse_fhdf.py +0 -0
  25. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/WHEEL +0 -0
  26. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/entry_points.txt +0 -0
  27. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/licenses/LICENSE.txt +0 -0
  28. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/licenses/LICENSES/BSD-3-Clause.txt +0 -0
  29. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/licenses/LICENSES/GPL-3.0-only.txt +0 -0
  30. {flowtracks-1.6.2.dev1.dist-info → flowtracks-1.6.2.dev4.dist-info}/top_level.txt +0 -0
flowtracks/__init__.py CHANGED
@@ -21,6 +21,12 @@ from flowtracks.eulerian import (
21
21
  save_zarr,
22
22
  )
23
23
  from flowtracks.phase_average import fluctuations, phase_average
24
+ from flowtracks.phasing import (
25
+ assign_bins,
26
+ bin_of_frame,
27
+ phase_of_frame,
28
+ validate_bins,
29
+ )
24
30
  from flowtracks.smoothing import savitzky_golay
25
31
  from flowtracks.stitching import stitch_trajectories
26
32
  from flowtracks.writers import (
@@ -41,6 +47,10 @@ __all__ = [
41
47
  "finite_difference_velocity",
42
48
  "phase_average",
43
49
  "fluctuations",
50
+ "validate_bins",
51
+ "assign_bins",
52
+ "phase_of_frame",
53
+ "bin_of_frame",
44
54
  "derived_fields",
45
55
  "save_zarr",
46
56
  "save_dataset",
flowtracks/_version.py CHANGED
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.6.2.dev1'
22
- __version_tuple__ = version_tuple = (1, 6, 2, 'dev1')
21
+ __version__ = version = '1.6.2.dev4'
22
+ __version_tuple__ = version_tuple = (1, 6, 2, 'dev4')
23
23
 
24
- __commit_id__ = commit_id = 'g343cf68fa'
24
+ __commit_id__ = commit_id = 'gc00cb25a5'
flowtracks/eulerian.py CHANGED
@@ -128,11 +128,12 @@ def _bin_counts_sums_ceil(pos, vel, ti, mins, deltas, shape):
128
128
  return counts, sums
129
129
 
130
130
 
131
- def eulerian_grid(scene, grid_params, first, last, cycletime,
131
+ def eulerian_grid(scene, grid_params, first, last, cycletime=None,
132
132
  deltat=90, base_time=100000, min_count=50,
133
133
  smoothing_sigma=None, *, fill_value=float("nan"),
134
134
  qc=None, chunk_frames=None, add_valid=True, fin=None,
135
- voxel_rule="half-open") -> xr.Dataset:
135
+ voxel_rule="half-open", n_frames_in_period=None,
136
+ n_phases=None, phase_zero_frame=None) -> xr.Dataset:
136
137
  """Bin Lagrangian particles onto a (x, y, z, phase) grid of mean velocities.
137
138
 
138
139
  Same math as batch_Lagrangian_to_Eulerian.eulerian_grid, but: reads the
@@ -140,6 +141,21 @@ def eulerian_grid(scene, grid_params, first, last, cycletime,
140
141
  query per frame, bins every particle at once with np.histogramdd, and
141
142
  returns a self-describing Dataset instead of writing HDF5.
142
143
 
144
+ Phase-bin naming (shared with openptv-cloud/openptv-analysis — same
145
+ users, one vocabulary; see :mod:`flowtracks.phasing` for the full
146
+ definition and its rules): ``n_frames_in_period`` is ``cycletime``,
147
+ ``n_phases`` is ``fin``, ``phase_zero_frame`` is ``base_time``. Pass
148
+ either style; when both are given the new-style name wins. Narrow
149
+ (gappy) bins — ``phase_width`` in :mod:`flowtracks.phasing` — are a
150
+ caller-side frame selection (see :func:`flowtracks.phasing.bin_of_frame`);
151
+ this gridder always tiles contiguously.
152
+
153
+ Input contract (NOT validated — the caller states it): positions in
154
+ METRES, velocities in METRES PER SECOND. The output dataset is labelled
155
+ ``m`` / ``m s-1`` (CF) on that basis. Per-frame velocities (no frame
156
+ rate known) average arithmetically fine, but the ``m s-1`` label is then
157
+ wrong — relabel to ``m frame-1`` downstream, or state the frame rate.
158
+
143
159
  smoothing_sigma (in grid cells, scalar or per-axis (sx, sy, sz)) applies
144
160
  Gaussian kernel smoothing to the velocity sums AND the counts before the
145
161
  division (Shepard/kernel estimate); min_count then acts on smoothed counts.
@@ -171,6 +187,17 @@ def eulerian_grid(scene, grid_params, first, last, cycletime,
171
187
  prefilter to the strict exclusive box (both bounds exclusive), so
172
188
  the binned set matches the legacy inputs exactly.
173
189
  """
190
+ if n_frames_in_period is not None:
191
+ cycletime = n_frames_in_period
192
+ if cycletime is None:
193
+ raise ValueError(
194
+ "eulerian_grid() needs a period: pass cycletime (legacy) or "
195
+ "n_frames_in_period (shared vocabulary)."
196
+ )
197
+ if n_phases is not None:
198
+ fin = n_phases
199
+ if phase_zero_frame is not None:
200
+ base_time = phase_zero_frame
174
201
  zaman = deltat * 2 + 1
175
202
  fin = int(np.ceil(cycletime / zaman)) if fin is None else int(fin)
176
203
  edges = [np.linspace(grid_params[f"min_{d}"], grid_params[f"max_{d}"],
flowtracks/io.py CHANGED
@@ -1226,7 +1226,8 @@ def read_zarr_trajectories(zarr_path, first=None, last=None, group="trajectories
1226
1226
  return []
1227
1227
 
1228
1228
 
1229
- def save_zarr_trajectories(trajects, zarr_path, group="trajectories", overwrite=True):
1229
+ def save_zarr_trajectories(trajects, zarr_path, group="trajectories", overwrite=True,
1230
+ units=None):
1230
1231
  """
1231
1232
  Save a list of Trajectory objects into a Zarr directory store.
1232
1233
 
@@ -1235,6 +1236,11 @@ def save_zarr_trajectories(trajects, zarr_path, group="trajectories", overwrite=
1235
1236
  zarr_path - path to the target .zarr directory.
1236
1237
  group - sub-group name inside the Zarr store.
1237
1238
  overwrite - if True, overwrite existing arrays in the group.
1239
+ units - dict of per-array units recorded on the group, e.g.
1240
+ {"pos": "m", "vel": "m s-1", "accel": "m s-2", "time": "frame"}.
1241
+ The writer never guesses: omit it only when the caller truly does
1242
+ not know, in which case no unit claim is stored. Honest rule: no
1243
+ frame rate means per-frame velocity units ("m frame-1"), never "m s-1".
1238
1244
  """
1239
1245
  import zarr
1240
1246
 
@@ -1275,4 +1281,7 @@ def save_zarr_trajectories(trajects, zarr_path, group="trajectories", overwrite=
1275
1281
  accel_arr = np.concatenate(all_accel, axis=0)
1276
1282
  target_group.create_array("accel", data=accel_arr, overwrite=overwrite)
1277
1283
 
1284
+ if units:
1285
+ target_group.attrs.update({f"{k}_units": v for k, v in units.items()})
1286
+
1278
1287
 
flowtracks/phasing.py ADDED
@@ -0,0 +1,111 @@
1
+ # SPDX-License-Identifier: GPL-3.0-only
2
+ """One shared phase-bin definition for periodic PTV post-processing.
3
+
4
+ Every package in the OpenPTV family (flowtracks itself, openptv-cloud,
5
+ openptv-analysis — same users) uses these names and these rules, so a
6
+ ``post_analysis.binning`` block means the same thing everywhere:
7
+
8
+ Canonical names (all self-explainable):
9
+
10
+ n_frames_in_period — period length, in frames
11
+ n_phases — number of phase bins per cycle (the output count)
12
+ phase_width — bin width in cycle units [0, 1); default 1/n_phases
13
+ phase_zero_frame — frame anchoring phase 0
14
+
15
+ Rules enforced by :func:`validate_bins` (fail loudly, never ship NaNs):
16
+
17
+ 1 <= n_phases <= n_frames_in_period (more bins than frames would stay
18
+ empty by construction — with whole-frame counting there are only
19
+ n_frames_in_period distinct phases per cycle);
20
+ 0 < phase_width <= 1/n_phases (bins never overlap in time; narrower bins
21
+ leave gaps — some frames go unused, which is intentional).
22
+
23
+ Bins are uniform and start-anchored: bin ``i`` covers
24
+ ``[i/n_phases, i/n_phases + phase_width)``. :func:`assign_bins` returns -1
25
+ for samples falling in gaps.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import numpy as np
31
+
32
+ __all__ = [
33
+ "validate_bins",
34
+ "assign_bins",
35
+ "phase_of_frame",
36
+ "bin_of_frame",
37
+ ]
38
+
39
+
40
+ def validate_bins(n_frames_in_period, n_phases, phase_width=None) -> float:
41
+ """Check one bin definition; return the effective width (cycle units).
42
+
43
+ Raises SystemExit on violation — a bad binning must fail loudly before
44
+ any averaging, never ship silent NaN phases.
45
+ """
46
+ try:
47
+ period = int(n_frames_in_period)
48
+ except (TypeError, ValueError):
49
+ raise SystemExit(
50
+ "[phasing] n_frames_in_period must be a positive integer "
51
+ f"(got {n_frames_in_period!r})."
52
+ )
53
+ try:
54
+ n = int(n_phases)
55
+ except (TypeError, ValueError):
56
+ raise SystemExit(
57
+ f"[phasing] n_phases must be a positive integer (got {n_phases!r})."
58
+ )
59
+ if period < 1:
60
+ raise SystemExit("[phasing] n_frames_in_period must be >= 1.")
61
+ if n < 1:
62
+ raise SystemExit("[phasing] n_phases must be >= 1.")
63
+ if n > period:
64
+ raise SystemExit(
65
+ f"[phasing] n_phases ({n}) cannot exceed n_frames_in_period "
66
+ f"({period}): with whole-frame counting there are only {period} "
67
+ "distinct phases per cycle, so the extra bins would stay empty. "
68
+ f"Use n_phases <= {period}."
69
+ )
70
+ spacing = 1.0 / n
71
+ width = float(phase_width) if phase_width is not None else spacing
72
+ if not width > 0:
73
+ raise SystemExit("[phasing] phase_width must be positive.")
74
+ if width > spacing + 1e-12:
75
+ raise SystemExit(
76
+ f"[phasing] phase_width ({width:.4g}) exceeds the phase spacing "
77
+ f"(1/n_phases = {spacing:.4g}): bins would overlap in time. "
78
+ "Maximum is 1/n_phases (contiguous bins, no gaps)."
79
+ )
80
+ return width
81
+
82
+
83
+ def phase_of_frame(frame, n_frames_in_period, phase_zero_frame=0) -> float:
84
+ """Phase in [0, 1) of one frame number."""
85
+ period = int(n_frames_in_period)
86
+ return ((int(frame) - int(phase_zero_frame)) % period) / period
87
+
88
+
89
+ def bin_of_frame(frame, n_phases, n_frames_in_period,
90
+ phase_width=None, phase_zero_frame=0) -> int:
91
+ """Bin index of one frame number, or -1 when it falls in a gap."""
92
+ n = int(n_phases)
93
+ width = float(phase_width) if phase_width is not None else 1.0 / n
94
+ phase = phase_of_frame(frame, n_frames_in_period, phase_zero_frame)
95
+ idx = min(int(phase * n), n - 1)
96
+ return idx if (phase * n - idx) < width * n - 1e-12 else -1
97
+
98
+
99
+ def assign_bins(phase, n_phases, phase_width=None):
100
+ """Bin index per sample phase, or -1 for samples in gaps.
101
+
102
+ phase: array-like floats in [0, 1). Default width (None) = 1/n_phases,
103
+ i.e. contiguous tiling with no gaps.
104
+ """
105
+ phase = np.asarray(phase, dtype=float)
106
+ n = int(n_phases)
107
+ width = float(phase_width) if phase_width is not None else 1.0 / n
108
+ idx = np.minimum((phase * n).astype(int), n - 1)
109
+ intra = phase * n - idx # position inside the bin, 0..1
110
+ keep_fraction = width * n # how much of each bin is covered
111
+ return np.where(intra < keep_fraction - 1e-12, idx, -1)
flowtracks/writers.py CHANGED
@@ -134,13 +134,20 @@ def _clean(values: np.ndarray) -> np.ndarray:
134
134
 
135
135
 
136
136
  def write_eulerian_series(ds: xr.Dataset, out_dir: Path, prefix: str = "phase",
137
- time_dim: str = "phase", dt: float = 1.0) -> Path:
137
+ time_dim: str = "phase", dt: float = 1.0,
138
+ units: dict | None = None) -> Path:
138
139
  """Write one Eulerian grid file per ``time_dim`` step plus a ``.pvd`` series.
139
140
 
140
141
  Grid type is chosen from axis spacing: ``vtkImageData`` (``.vti``) when x,
141
142
  y and z are each uniformly spaced, ``vtkRectilinearGrid`` (``.vtr``)
142
143
  otherwise. Vector fields named by ``VEL_VARS`` are combined into a single
143
144
  "velocity" array; every other data variable is written as a scalar.
145
+
146
+ ``units`` maps array name to unit string (e.g. ``{"velocity": "m s-1"}``)
147
+ and is stored as grid field data (``units:<name>``); when omitted, the
148
+ dataset's own ``units`` attrs are carried over where present. VTK has no
149
+ unit system, so this is annotation, not enforcement — but the reader no
150
+ longer has to guess.
144
151
  """
145
152
  import pyvista as pv
146
153
 
@@ -179,6 +186,17 @@ def write_eulerian_series(ds: xr.Dataset, out_dir: Path, prefix: str = "phase",
179
186
  # skip rather than silently reshape/truncate them.
180
187
  continue
181
188
  grid.point_data[name] = _clean(da.values).ravel(order="F")
189
+ fields = dict(units) if units else {}
190
+ for name, da in snap.data_vars.items():
191
+ if name not in fields and da.attrs.get("units"):
192
+ fields[name] = da.attrs["units"]
193
+ if "velocity" in grid.point_data:
194
+ for v in VEL_VARS:
195
+ if v in fields:
196
+ fields["velocity"] = fields.pop(v)
197
+ break
198
+ for k, val in fields.items():
199
+ grid.field_data[f"units:{k}"] = np.array([str(val)])
182
200
  path = out_dir / f"{prefix}_{i:04d}.{ext}"
183
201
  grid.save(str(path))
184
202
  entries.append((i * dt, path))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowtracks
3
- Version: 1.6.2.dev1
3
+ Version: 1.6.2.dev4
4
4
  Summary: Library for handling 3D PTV trajectory databases and Lagrangian/Eulerian turbulence post-processing.
5
5
  Author-email: Yosef Meller <yosefm@gmail.com>
6
6
  License-Expression: GPL-3.0-only AND BSD-3-Clause
@@ -1,19 +1,20 @@
1
- flowtracks/__init__.py,sha256=UHxu1eFrWI0DD2kPLy-GdF2WEMkbx1dBRkN_4NmqD7M,1341
2
- flowtracks/_version.py,sha256=sX-4f5T5duAZRGqZmFciqVEpgoXPx5071sKVdXva8CM,541
1
+ flowtracks/__init__.py,sha256=iCexskmRtpNJ0fNZWRFkQAqrku7csbKy5NtL2YQNYeo,1532
2
+ flowtracks/_version.py,sha256=ZWyF90B5Js1Ikxd3zd_HluOAb1r35l1-eoSda5mck90,541
3
3
  flowtracks/an_scene.py,sha256=QV_gtzp-5h1CqAW1Y6ieGco9BxXQDE4f_7-fcy3fluI,7361
4
4
  flowtracks/analysis.py,sha256=nob5-pKxjPzB34_oQsxmxYALz4Q_s1BTpC5_VgXX3ss,6320
5
5
  flowtracks/combine.py,sha256=-UQtbTH4vjQS88_92h5UZlS60OfQofTWEV6SL1prXgI,4455
6
- flowtracks/eulerian.py,sha256=ksW4pxKS-C56ew3qWtKn6dweIctgDoaR5_1_QK3H6g8,40456
6
+ flowtracks/eulerian.py,sha256=PMt0_TtjrFwRPEvSEKm_wn8YZdClSux4yXEuxiB2EjM,41872
7
7
  flowtracks/flux.py,sha256=w4K_jjDWTBIOj4BkoeNoKjIRcvg_6stCqNF8iivxF-A,15137
8
8
  flowtracks/format_docstrings.py,sha256=iJVJmtTUYEDEcmF5XSRZ08zpvlVc9lU66CZeqSpEKic,1987
9
9
  flowtracks/future_idea_xarray_dask_zarr.py,sha256=4ZS6QuZ2s_sUaiCW0XBo74GrP5fw_clVyhWNjT5gbds,6101
10
10
  flowtracks/graphics.py,sha256=Pror0OmWXmlZz5yyEY2qKKQM5t_BMtKeYIAw26I0JeQ,13043
11
11
  flowtracks/interpolation.py,sha256=njuB-bvWK5M2tc2Ibm6ZWNg6Tm6H-PTn0a63IldlJaA,39414
12
- flowtracks/io.py,sha256=muNcht-yBDQM7vJaNHl9l6ag9iO0OTzWU12_etx_QEU,47869
12
+ flowtracks/io.py,sha256=sujLgtY8WIymMZugDv2jlQeL9QR_hZn-MaZPPKsAPvA,48366
13
13
  flowtracks/nhist.py,sha256=3xdrfSTSpTojXJcyhwBgagHBmKrm0U_AEsP3BjP9H1o,4089
14
14
  flowtracks/pairs.py,sha256=ehYDDTmjeRuzkSAMpdlwnwwAZOPNLKGF_e5HmcKw-2g,4034
15
15
  flowtracks/particle.py,sha256=sVng1X8Xp3V9_wgJK2EGsDEx1OFQjd3L63Fzn--MWkM,671
16
16
  flowtracks/phase_average.py,sha256=jjtrHYg0ukGRnJtRawJ6sWhdyrlV_16qBLlfNVxEQHw,3035
17
+ flowtracks/phasing.py,sha256=us7WfMYrx6dCCPNwucvN34G_0A7EKS9ieH1TrnpwM0I,4320
17
18
  flowtracks/pipeline.py,sha256=0wOeeFqQGN_Lhgq-QFeQNg0oEKtJSGDhhZdv81M1PDg,5167
18
19
  flowtracks/provenance.py,sha256=8L2BXmLdBcZRncUkr8oJbeU5JKdebj1Cgxrbzdy5o7A,2115
19
20
  flowtracks/repair.py,sha256=rxaE1hcxQjNx19tLJOhL619lSfkB7Kfh6kXpJ_fSMfg,19122
@@ -24,29 +25,29 @@ flowtracks/stitching.py,sha256=HFsIRdAfqyhmES1OwIFslyWTF9U7kPJ5OKtjBl4YWqA,16895
24
25
  flowtracks/trajectory.py,sha256=uL4-byZ2tycdrAwGoET4AfLHuKaWRnc8VHLO5zv9MOg,11831
25
26
  flowtracks/vortex.py,sha256=4lG3QkvvnWhAHy4tl1pJrBGFLdrlP4pxNdhCZI1VZ4Q,2529
26
27
  flowtracks/wall_shear.py,sha256=k9Q5FEchIO9J_onXPOw4PNJQfmsrSyVVvX4RdW-rQlE,6788
27
- flowtracks/writers.py,sha256=QzZ7gKqRGNti6caPHcwCr_4VUCjzzDxMA2CBS5-pq84,8391
28
+ flowtracks/writers.py,sha256=NAVz8H2w-Wtiy__acB9uT_NDSO6RqpEywcxm8tk1peg,9273
28
29
  flowtracks/zarr_scene.py,sha256=PKCtiTT1t0Hj74Q572ra5DM3uM8lQK1A6DzzfUxvIzI,10468
29
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/batch_Lagrangian_to_Eulerian.py,sha256=e7mQFqyqvCeAHRKiN1IaxdNJi0e2FU84c7QNrx0L-m0,2296
30
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/hdf5_scene_analysis.ipynb,sha256=jn0Z_ZVL1-iXaiKXwyAeb74NbXsBpnocCxCSDh814eU,243097
31
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/linking_trajectories.ipynb,sha256=udz0GLDiPv68BYySg4yO1HWzaB9Sdy3YA3IhnIHDeII,8820
32
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_dual_rig_trajectories.py,sha256=dzeK0C-knwq1bPOwo0p1RhWrb0RPp-T31rBaGEptXcc,6737
33
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_flowtracks.py,sha256=7FIJNwBx9aBRmaM5ofmYTXSWEjE0wZqDfs8J47Tmw6U,9440
34
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_hdf5_vs_zarr_scene_analysis.py,sha256=bjXlMsLJTxJ0JkvGcVZbuDOFYZU4OvdabtDUgqb15So,4536
35
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_linking_trajectories_zarr.py,sha256=Ny_WUbiZWo0aKw-u2KGFWrhMv-8BvNgBy0UHIqCobYg,8210
36
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_phase_averaging_demo.py,sha256=vg6j2ayKGl-5uj08bdzzb6pujzJJQ_5bUsG7UuPP7dM,9270
37
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_phase_metrics.py,sha256=kBc2e_b-orDrm3AnuUXCcxsvmfQWyCtE826pFeolMGE,9367
38
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_vtk_writers_preview.py,sha256=Otrhhp-QFf6F94EOs6rWu5xOCpbS16EfWy_iMFp7e_I,14611
39
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/marimo_zarr_dashboard.py,sha256=jVIum6hdEelH4ef7vRgsfLhrbmMsuErsJBzxrnEImnw,9268
40
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/repeated_interpolation.ipynb,sha256=t9SfoIWRu5XP0SrphWbQy508uzyEibVz61FGjl51fjA,8861
41
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/run_pipeline.py,sha256=5fGE2tIP6XjFZ1sEYmqBujuLaXFfRL-rNnbr2p2CDfM,7205
42
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/visualize_marimo.py,sha256=jWrg5IWjY-bmSQwQjaO5qTr0t_G48CsqJYpevdQrxeY,13026
43
- flowtracks-1.6.2.dev1.data/data/flowtracks-examples/visualize_results.py,sha256=SbPg3EoDcuIyo0rUz3E-AnT4sLWDVJFhgC6xVcracW4,7583
44
- flowtracks-1.6.2.dev1.data/scripts/analyse_fhdf.py,sha256=QH08NdImGukTEGuZEKFxjStcSelXBv-8A-22G6KtXqM,1315
45
- flowtracks-1.6.2.dev1.dist-info/licenses/LICENSE.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
46
- flowtracks-1.6.2.dev1.dist-info/licenses/LICENSES/BSD-3-Clause.txt,sha256=XiJR9O5snDB6sAz0bcncOU6msceZgjPRxejWEQGg40Q,1505
47
- flowtracks-1.6.2.dev1.dist-info/licenses/LICENSES/GPL-3.0-only.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
48
- flowtracks-1.6.2.dev1.dist-info/METADATA,sha256=Rj-Vf--pDCbat5wzy_wvw9yz7TQ4N-UhJAwomgbHUuE,4773
49
- flowtracks-1.6.2.dev1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
50
- flowtracks-1.6.2.dev1.dist-info/entry_points.txt,sha256=U6028E7yQZQiZoXWMl7w4xgZUPwPxAGiAuuMB__c-yQ,60
51
- flowtracks-1.6.2.dev1.dist-info/top_level.txt,sha256=cR54RNb9y2Wfr_BfuOezmNJOMB4GfIHh1-luXTREnQA,11
52
- flowtracks-1.6.2.dev1.dist-info/RECORD,,
30
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/batch_Lagrangian_to_Eulerian.py,sha256=e7mQFqyqvCeAHRKiN1IaxdNJi0e2FU84c7QNrx0L-m0,2296
31
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/hdf5_scene_analysis.ipynb,sha256=jn0Z_ZVL1-iXaiKXwyAeb74NbXsBpnocCxCSDh814eU,243097
32
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/linking_trajectories.ipynb,sha256=udz0GLDiPv68BYySg4yO1HWzaB9Sdy3YA3IhnIHDeII,8820
33
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_dual_rig_trajectories.py,sha256=dzeK0C-knwq1bPOwo0p1RhWrb0RPp-T31rBaGEptXcc,6737
34
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_flowtracks.py,sha256=7FIJNwBx9aBRmaM5ofmYTXSWEjE0wZqDfs8J47Tmw6U,9440
35
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_hdf5_vs_zarr_scene_analysis.py,sha256=bjXlMsLJTxJ0JkvGcVZbuDOFYZU4OvdabtDUgqb15So,4536
36
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_linking_trajectories_zarr.py,sha256=Ny_WUbiZWo0aKw-u2KGFWrhMv-8BvNgBy0UHIqCobYg,8210
37
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_phase_averaging_demo.py,sha256=vg6j2ayKGl-5uj08bdzzb6pujzJJQ_5bUsG7UuPP7dM,9270
38
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_phase_metrics.py,sha256=kBc2e_b-orDrm3AnuUXCcxsvmfQWyCtE826pFeolMGE,9367
39
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_vtk_writers_preview.py,sha256=Otrhhp-QFf6F94EOs6rWu5xOCpbS16EfWy_iMFp7e_I,14611
40
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/marimo_zarr_dashboard.py,sha256=jVIum6hdEelH4ef7vRgsfLhrbmMsuErsJBzxrnEImnw,9268
41
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/repeated_interpolation.ipynb,sha256=t9SfoIWRu5XP0SrphWbQy508uzyEibVz61FGjl51fjA,8861
42
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/run_pipeline.py,sha256=5fGE2tIP6XjFZ1sEYmqBujuLaXFfRL-rNnbr2p2CDfM,7205
43
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/visualize_marimo.py,sha256=jWrg5IWjY-bmSQwQjaO5qTr0t_G48CsqJYpevdQrxeY,13026
44
+ flowtracks-1.6.2.dev4.data/data/flowtracks-examples/visualize_results.py,sha256=SbPg3EoDcuIyo0rUz3E-AnT4sLWDVJFhgC6xVcracW4,7583
45
+ flowtracks-1.6.2.dev4.data/scripts/analyse_fhdf.py,sha256=QH08NdImGukTEGuZEKFxjStcSelXBv-8A-22G6KtXqM,1315
46
+ flowtracks-1.6.2.dev4.dist-info/licenses/LICENSE.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
47
+ flowtracks-1.6.2.dev4.dist-info/licenses/LICENSES/BSD-3-Clause.txt,sha256=XiJR9O5snDB6sAz0bcncOU6msceZgjPRxejWEQGg40Q,1505
48
+ flowtracks-1.6.2.dev4.dist-info/licenses/LICENSES/GPL-3.0-only.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
49
+ flowtracks-1.6.2.dev4.dist-info/METADATA,sha256=5FSsqSUpZRPt6m3eOTVB-aQF_2vDOZOelKmkNibfg-k,4773
50
+ flowtracks-1.6.2.dev4.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
51
+ flowtracks-1.6.2.dev4.dist-info/entry_points.txt,sha256=U6028E7yQZQiZoXWMl7w4xgZUPwPxAGiAuuMB__c-yQ,60
52
+ flowtracks-1.6.2.dev4.dist-info/top_level.txt,sha256=cR54RNb9y2Wfr_BfuOezmNJOMB4GfIHh1-luXTREnQA,11
53
+ flowtracks-1.6.2.dev4.dist-info/RECORD,,