flowtracks 1.5.2.dev2__tar.gz → 1.6.0__tar.gz
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.
- {flowtracks-1.5.2.dev2/flowtracks.egg-info → flowtracks-1.6.0}/PKG-INFO +1 -1
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/_version.py +3 -3
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/an_scene.py +11 -1
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/analysis.py +8 -1
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/io.py +33 -5
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/scene.py +16 -1
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0/flowtracks.egg-info}/PKG-INFO +1 -1
- flowtracks-1.6.0/flowtracks.egg-info/scm_version.json +8 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_io.py +29 -19
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_scene.py +60 -31
- flowtracks-1.6.0/tests/test_zarr_scene.py +191 -0
- flowtracks-1.5.2.dev2/flowtracks.egg-info/scm_version.json +0 -8
- flowtracks-1.5.2.dev2/tests/test_zarr_scene.py +0 -208
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.github/workflows/python-package.yml +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.github/workflows/python-publish.yml +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.gitignore +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/CLAUDE.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/LICENSE.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/README.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/RELEASE.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/SPEEDUP_PLAN.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/WRITERS_PLAN.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/BASELINE.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_interp.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_io.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_pairs.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10001 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10002 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10003 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10004 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10005 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10006 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10007 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10008 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10009 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10010 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10011 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10012 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10013 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10014 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10015 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10016 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10017 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10018 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10019 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10020 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10021 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10022 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10023 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10024 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10025 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10026 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10027 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10028 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10029 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10030 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10031 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10032 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10033 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10034 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10035 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10036 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10037 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10038 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10039 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10040 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10041 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10042 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10043 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10044 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10045 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10046 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10047 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10048 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10049 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10050 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10051 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10052 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10053 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10054 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10055 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10056 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10057 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10058 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10059 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10060 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10061 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10062 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10063 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10064 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10065 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10066 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10067 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10068 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10069 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10070 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10071 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10072 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10073 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10074 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10075 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10076 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10077 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10078 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10079 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10080 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10081 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10082 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10083 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10084 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10085 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10086 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10087 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10088 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10089 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10090 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10091 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10092 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10093 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10094 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10095 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10096 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10097 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10098 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10099 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10100 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10101 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10102 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10103 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10104 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10105 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10106 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10107 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10108 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10109 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10110 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10111 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10112 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10113 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10114 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10115 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10116 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10117 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10118 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10119 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10120 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10121 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10122 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10123 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10124 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10125 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10126 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10127 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10128 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10129 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10130 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10131 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10132 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10133 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10134 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10135 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10136 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10137 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10138 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10139 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10140 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10141 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10142 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10143 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10144 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10145 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10146 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10147 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10148 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10149 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10150 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10151 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10152 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10153 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10154 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10155 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10156 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10157 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10158 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10159 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10160 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10161 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10162 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10163 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10164 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10165 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10166 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10167 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10168 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10169 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10170 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10171 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10172 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10173 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10174 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10175 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10176 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10177 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10178 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10179 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10180 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10181 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10182 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10183 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10184 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10185 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10186 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10187 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10188 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10189 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10190 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10191 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10192 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10193 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10194 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10195 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10196 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10197 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10198 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10199 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10200 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles.h5 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/readme.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/seq_hdf.cfg +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10001 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10002 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10003 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10004 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10005 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10006 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10007 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10008 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10009 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10010 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10011 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10012 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10013 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10014 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10015 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10016 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10017 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10018 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10019 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10020 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10021 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10022 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10023 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10024 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10025 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10026 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10027 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10028 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10029 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10030 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10031 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10032 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10033 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10034 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10035 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10036 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10037 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10038 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10039 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10040 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10041 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10042 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10043 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10044 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10045 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10046 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10047 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10048 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10049 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10050 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10051 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10052 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10053 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10054 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10055 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10056 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10057 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10058 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10059 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10060 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10061 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10062 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10063 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10064 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10065 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10066 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10067 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10068 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10069 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10070 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10071 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10072 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10073 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10074 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10075 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10076 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10077 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10078 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10079 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10080 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10081 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10082 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10083 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10084 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10085 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10086 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10087 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10088 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10089 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10090 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10091 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10092 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10093 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10094 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10095 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10096 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10097 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10098 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10099 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10100 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10101 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10102 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10103 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10104 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10105 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10106 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10107 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10108 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10109 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10110 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10111 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10112 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10113 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10114 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10115 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10116 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10117 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10118 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10119 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10120 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10121 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10122 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10123 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10124 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10125 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10126 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10127 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10128 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10129 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10130 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10131 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10132 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10133 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10134 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10135 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10136 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10137 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10138 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10139 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10140 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10141 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10142 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10143 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10144 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10145 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10146 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10147 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10148 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10149 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10150 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10151 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10152 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10153 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10154 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10155 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10156 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10157 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10158 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10159 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10160 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10161 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10162 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10163 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10164 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10165 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10166 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10167 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10168 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10169 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10170 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10171 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10172 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10173 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10174 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10175 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10176 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10177 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10178 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10179 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10180 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10181 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10182 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10183 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10184 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10185 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10186 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10187 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10188 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10189 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10190 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10191 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10192 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10193 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10194 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10195 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10196 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10197 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10198 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10199 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10200 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/0/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/0/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/1/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/1/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/2/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/2/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/3/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/3/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/0/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/0/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/1/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/1/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/2/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/2/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/3/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/3/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/2 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/3 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/2 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/3 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/0/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/0/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/1/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/1/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/2/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/2/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/3/0 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/3/1 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/_static/hdf5_scene_analysis.html +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/_static/repeated_interpolation.html +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/an_scene.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/analysis.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/conf.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/datastruct.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/graphics.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/index.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/interpolation.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/io.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/pairs.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/particle.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/repair.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/scene.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/sequence.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/smoothing.rst +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/batch_Lagrangian_to_Eulerian.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/hdf5_scene_analysis.ipynb +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/linking_trajectories.ipynb +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_dual_rig_trajectories.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_flowtracks.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_hdf5_vs_zarr_scene_analysis.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_linking_trajectories_zarr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_phase_averaging_demo.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_phase_metrics.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_vtk_writers_preview.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_zarr_dashboard.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/repeated_interpolation.ipynb +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/run_pipeline.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/visualize_marimo.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/visualize_results.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/__init__.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/combine.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/eulerian.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/flux.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/format_docstrings.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/future_idea_xarray_dask_zarr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/graphics.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/interpolation.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/nhist.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/pairs.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/particle.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/phase_average.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/pipeline.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/provenance.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/repair.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/sequence.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/smoothing.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/stitching.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/trajectory.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/vortex.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/wall_shear.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/writers.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/zarr_scene.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/SOURCES.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/dependency_links.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/requires.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/scm_file_list.json +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/top_level.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/future_plan.md +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/peek_zarr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/plotting_trajectories_using_postptv.ipynb +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/pyproject.toml +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/requriments.txt +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/analyse_fhdf.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/convert_tracers_to_zarr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/run_postptv_analysis.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/view_trajectories_3d.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/setup.cfg +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/setup.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/conftest.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/helpers.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_analysis.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_binning_equivalence.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_derived_fields.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_eulerian_grid.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_eulerian_upgrades.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_flux.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_graphics_3d.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_idw_call.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_interp.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_nhist.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_align_synthetic_sets.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_average_xr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_shift_extraction_and_vtr_export.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_post_analysis_edge_cases.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_post_analysis_xr.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_provenance.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_repair.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_sequence.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_smoothing.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_speedup_equivalence.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_stitching.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_streamlined_zarr_paraview.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_turbulent_statistics.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_vortex_and_wall_shear.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_writers.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_io.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_pipeline_end_to_end.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_trajectories.py +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/interpolant.cfg +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10001 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10002 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10003 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10004 +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/sequence.cfg +0 -0
- {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/three_trajects_simple.h5 +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowtracks
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
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: GNU GENERAL PUBLIC LICENSE
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1,
|
|
21
|
+
__version__ = version = '1.6.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 6, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g0098b1fd3'
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
import tables
|
|
7
|
+
except ImportError: # optional legacy dependency; zarr paths do not need it
|
|
8
|
+
tables = None
|
|
5
9
|
|
|
6
10
|
from .scene import gen_query_string, read_dual_scene
|
|
7
11
|
from .trajectory import Trajectory
|
|
@@ -21,6 +25,12 @@ class AnalysedScene(object):
|
|
|
21
25
|
Arguments:
|
|
22
26
|
analysis_file - path to the HDF file containing analysis results.
|
|
23
27
|
"""
|
|
28
|
+
if tables is None:
|
|
29
|
+
raise ImportError(
|
|
30
|
+
"PyTables ('tables') is required for the legacy AnalysedScene. "
|
|
31
|
+
"The project now uses Zarr; install the 'legacy-io' extra "
|
|
32
|
+
"only if you need the old format."
|
|
33
|
+
)
|
|
24
34
|
self._file = tables.open_file(analysis_file, "r")
|
|
25
35
|
self._table = self._file.get_node('/analysis')
|
|
26
36
|
|
|
@@ -14,7 +14,6 @@ fluid velocity around a particle from its surrounding tracers.
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import numpy as np
|
|
17
|
-
import tables
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
def companion_indices(trids, companions):
|
|
@@ -132,6 +131,14 @@ def analysis(scene, analysis_file, conf_file, analysers, frame_range=-1):
|
|
|
132
131
|
descr.extend(analyser.descr())
|
|
133
132
|
descr = np.dtype(descr)
|
|
134
133
|
|
|
134
|
+
try:
|
|
135
|
+
import tables
|
|
136
|
+
except ImportError:
|
|
137
|
+
raise ImportError(
|
|
138
|
+
"PyTables ('tables') is required for analysis() HDF5 output. "
|
|
139
|
+
"The project now uses Zarr; install the 'legacy-io' extra only "
|
|
140
|
+
"if you need the old format."
|
|
141
|
+
)
|
|
135
142
|
outfile = tables.open_file(analysis_file, "w", title="Analysis results.")
|
|
136
143
|
table = outfile.create_table('/', 'analysis', descr)
|
|
137
144
|
table.attrs['config'] = conf_file
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
"""
|
|
5
5
|
The main entry points for using the module are the :func:`trajectories`
|
|
6
6
|
function (or its counterpart :func:`iter_trajectories`) for reading the data
|
|
7
|
-
for a scene; and either :func:`
|
|
8
|
-
:func:`
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
for a scene; and either :func:`save_zarr_trajectories` /
|
|
8
|
+
:func:`read_zarr_trajectories` for the current Zarr format, or the legacy
|
|
9
|
+
:func:`save_trajectories` (obsolete directory of NPZ files) and
|
|
10
|
+
:func:`save_particles_table` (legacy PyTables HDF5, requires the optional
|
|
11
|
+
``tables`` dependency).
|
|
11
12
|
|
|
12
13
|
The trajectory reader, unless otherwise noted, will try to infer the format
|
|
13
14
|
from the file name (see :func:`infer_format`).
|
|
@@ -24,7 +25,6 @@ from configparser import ConfigParser
|
|
|
24
25
|
from io import StringIO
|
|
25
26
|
|
|
26
27
|
import numpy as np
|
|
27
|
-
import tables
|
|
28
28
|
from scipy import io
|
|
29
29
|
|
|
30
30
|
from .particle import Particle
|
|
@@ -37,6 +37,22 @@ from .trajectory import (
|
|
|
37
37
|
trajectories_in_frame,
|
|
38
38
|
)
|
|
39
39
|
|
|
40
|
+
try:
|
|
41
|
+
import tables
|
|
42
|
+
except ImportError: # optional legacy dependency; zarr paths do not need it
|
|
43
|
+
tables = None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _require_tables():
|
|
47
|
+
if tables is None:
|
|
48
|
+
raise ImportError(
|
|
49
|
+
"PyTables ('tables') is required for legacy HDF5 I/O "
|
|
50
|
+
"(save_particles_table, save_frames_hdf, trajectories_table, "
|
|
51
|
+
"Scene with .h5 files). The project now uses Zarr "
|
|
52
|
+
"(save_zarr_trajectories, read_zarr_trajectories, ZarrScene); "
|
|
53
|
+
"install the 'legacy-io' extra only if you need the old format."
|
|
54
|
+
)
|
|
55
|
+
|
|
40
56
|
|
|
41
57
|
class FramesIterator(object):
|
|
42
58
|
def __init__(self, fname_tmpl, fmt, skip, first=None, last=None, usecols=None):
|
|
@@ -540,6 +556,7 @@ def trajectories(fname, first=None, last=None, frate=1.0, fmt=None, traj_min_len
|
|
|
540
556
|
traj_min_len=traj_min_len)
|
|
541
557
|
|
|
542
558
|
elif fmt == 'hdf':
|
|
559
|
+
_require_tables()
|
|
543
560
|
scene = Scene(fname, (first, last))
|
|
544
561
|
it = scene.iter_trajectories()
|
|
545
562
|
if iter_allowed:
|
|
@@ -728,6 +745,10 @@ def save_particles_table(filename, trajects, trim=None):
|
|
|
728
745
|
(frame number) and trajid - the last one may be indexed. Note that no extra
|
|
729
746
|
(per-trajectory or meta) data is allowed here, unlike the npz save format.
|
|
730
747
|
|
|
748
|
+
.. deprecated::
|
|
749
|
+
Legacy PyTables/HDF5 format. Prefer
|
|
750
|
+
:func:`save_zarr_trajectories` + :class:`ZarrScene`.
|
|
751
|
+
|
|
731
752
|
Arguments:
|
|
732
753
|
filename - name of output PyTables HDF5 file to create. The 'h5' extension
|
|
733
754
|
is recommended so that infer_format() knows what to do with it.
|
|
@@ -735,6 +756,7 @@ def save_particles_table(filename, trajects, trim=None):
|
|
|
735
756
|
trim - if None, remove this many time points from each end of each
|
|
736
757
|
trajectory before saving.
|
|
737
758
|
"""
|
|
759
|
+
_require_tables()
|
|
738
760
|
table = None
|
|
739
761
|
trim_len = 0 if trim is None else trim * 2
|
|
740
762
|
|
|
@@ -794,6 +816,7 @@ def save_frames_hdf(filename, frames):
|
|
|
794
816
|
is recommended so that ``infer_format()`` knows what to do with it.
|
|
795
817
|
frames - an iterable sequence of ParticleSnapshot objects to save.
|
|
796
818
|
"""
|
|
819
|
+
_require_tables()
|
|
797
820
|
table = None
|
|
798
821
|
outfile = tables.open_file(filename, mode='w')
|
|
799
822
|
min_pos = np.full(3, np.inf)
|
|
@@ -862,6 +885,10 @@ def trajectories_table(fname, first=None, last=None):
|
|
|
862
885
|
Reads trajectories from a PyTables HDF5 file, as saved by
|
|
863
886
|
save_particles_table().
|
|
864
887
|
|
|
888
|
+
.. deprecated::
|
|
889
|
+
Legacy PyTables/HDF5 format. Prefer
|
|
890
|
+
:func:`read_zarr_trajectories` + :class:`ZarrScene`.
|
|
891
|
+
|
|
865
892
|
Arguments:
|
|
866
893
|
fname - path to file to read.
|
|
867
894
|
first, last - inclusive range of frames to read.
|
|
@@ -869,6 +896,7 @@ def trajectories_table(fname, first=None, last=None):
|
|
|
869
896
|
Returns:
|
|
870
897
|
trajects - a list of Trajectory objects, each trimmed to the frame range.
|
|
871
898
|
"""
|
|
899
|
+
_require_tables()
|
|
872
900
|
outfile = tables.open_file(fname, mode='r')
|
|
873
901
|
table = outfile.get_node('/particles')
|
|
874
902
|
|
|
@@ -19,7 +19,11 @@ import itertools as it
|
|
|
19
19
|
from configparser import ConfigParser
|
|
20
20
|
|
|
21
21
|
import numpy as np
|
|
22
|
-
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
import tables
|
|
25
|
+
except ImportError: # optional legacy dependency; ZarrScene needs no tables
|
|
26
|
+
tables = None
|
|
23
27
|
|
|
24
28
|
from .particle import Particle
|
|
25
29
|
from .trajectory import ParticleSnapshot, Trajectory
|
|
@@ -73,6 +77,11 @@ class Scene(object):
|
|
|
73
77
|
This class is the programmer's interface to an HDF files containing
|
|
74
78
|
particle trajectory data. It manages access by frames or trajectories,
|
|
75
79
|
as well as by segments.
|
|
80
|
+
|
|
81
|
+
.. deprecated::
|
|
82
|
+
Legacy PyTables/HDF5 backend. Prefer
|
|
83
|
+
:class:`flowtracks.zarr_scene.ZarrScene` (duck-typed compatible)
|
|
84
|
+
and open stores via :func:`open_scene`.
|
|
76
85
|
"""
|
|
77
86
|
def __init__(self, file_name, frame_range=None):
|
|
78
87
|
"""
|
|
@@ -81,6 +90,12 @@ class Scene(object):
|
|
|
81
90
|
frame_range - use only frames in this range for iterating the data.
|
|
82
91
|
the default is None, meaning to use all present frams.
|
|
83
92
|
"""
|
|
93
|
+
if tables is None:
|
|
94
|
+
raise ImportError(
|
|
95
|
+
"PyTables ('tables') is required for the legacy HDF5 Scene. "
|
|
96
|
+
"The project now uses Zarr (ZarrScene); install the "
|
|
97
|
+
"'legacy-io' extra only if you need the old format."
|
|
98
|
+
)
|
|
84
99
|
self._file = tables.open_file(file_name)
|
|
85
100
|
self._table = self._file.get_node('/particles')
|
|
86
101
|
try:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowtracks
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
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: GNU GENERAL PUBLIC LICENSE
|
|
@@ -68,23 +68,33 @@ class TestPtvis(unittest.TestCase):
|
|
|
68
68
|
trjs = io.trajectories_ptvis(inName, xuap = True, traj_min_len = None)
|
|
69
69
|
self.assertEqual(len(trjs), 332)
|
|
70
70
|
|
|
71
|
-
def
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
71
|
+
def test_trajectories_zarr(self):
|
|
72
|
+
"""Zarr round-trip works"""
|
|
73
|
+
import tempfile
|
|
74
|
+
|
|
75
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
76
|
+
zarr_path = os.path.join(tmpdir, 'table.zarr')
|
|
77
|
+
io.save_zarr_trajectories(self.correct, zarr_path)
|
|
78
|
+
loaded = io.read_zarr_trajectories(zarr_path)
|
|
79
|
+
self.compare_trajectories(
|
|
80
|
+
sorted(loaded, key=lambda t: t.trajid()),
|
|
81
|
+
sorted(self.correct, key=lambda t: t.trajid()),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
def test_trim_zarr(self):
|
|
85
|
+
"""Zarr trajectory trimming via frame-range read"""
|
|
86
|
+
import tempfile
|
|
87
|
+
|
|
88
|
+
correct = io.trajectories_ptvis(self.tmpl, self.first + 1, self.last - 1)
|
|
89
|
+
|
|
90
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
91
|
+
zarr_path = os.path.join(tmpdir, 'table.zarr')
|
|
92
|
+
io.save_zarr_trajectories(self.correct, zarr_path)
|
|
93
|
+
|
|
94
|
+
loaded = io.read_zarr_trajectories(
|
|
95
|
+
zarr_path, first=self.first + 1, last=self.last - 1)
|
|
96
|
+
self.compare_trajectories(
|
|
97
|
+
sorted(loaded, key=lambda t: t.trajid()),
|
|
98
|
+
sorted(correct, key=lambda t: t.trajid()),
|
|
99
|
+
)
|
|
90
100
|
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Test the input/output routines in flowtracks: read/write files and verify
|
|
3
|
-
correct results.
|
|
3
|
+
correct results (Zarr backend).
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
import tempfile
|
|
6
7
|
import unittest
|
|
7
8
|
|
|
8
9
|
import numpy as np
|
|
9
10
|
import numpy.testing as nptest
|
|
10
11
|
|
|
11
|
-
from flowtracks.
|
|
12
|
+
from flowtracks.io import save_zarr_trajectories
|
|
13
|
+
from flowtracks.scene import gen_query_string
|
|
12
14
|
from flowtracks.trajectory import Trajectory, take_snapshot
|
|
15
|
+
from flowtracks.zarr_scene import ZarrScene
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
class TestScene(unittest.TestCase):
|
|
@@ -18,9 +21,6 @@ class TestScene(unittest.TestCase):
|
|
|
18
21
|
There are 3 trajectories of 4 frames each, each going along a separate
|
|
19
22
|
axis.
|
|
20
23
|
"""
|
|
21
|
-
tmpl = "tests/testing_fodder/three_trajects_simple.h5"
|
|
22
|
-
self.scene = Scene(tmpl)
|
|
23
|
-
|
|
24
24
|
# ptv_is files are in [mm], [mm/s], etc.
|
|
25
25
|
correct_pos = np.r_[0.1, 0.2, 0.3, 0.5] / 1000.
|
|
26
26
|
correct_vel = np.r_[0.1, 0.1, 0.2, 0.] / 1000.
|
|
@@ -30,28 +30,38 @@ class TestScene(unittest.TestCase):
|
|
|
30
30
|
self.correct = []
|
|
31
31
|
for axis in [0, 1, 2]:
|
|
32
32
|
pos = np.zeros((4, 3))
|
|
33
|
-
pos[:,axis] = correct_pos
|
|
33
|
+
pos[:, axis] = correct_pos
|
|
34
34
|
|
|
35
35
|
vel = np.zeros((4, 3))
|
|
36
|
-
vel[:,axis] = correct_vel
|
|
36
|
+
vel[:, axis] = correct_vel
|
|
37
37
|
|
|
38
38
|
accel = np.zeros((4, 3))
|
|
39
|
-
accel[:,axis] = correct_accel
|
|
39
|
+
accel[:, axis] = correct_accel
|
|
40
40
|
|
|
41
41
|
self.correct.append(Trajectory(pos, vel, t, len(self.correct),
|
|
42
42
|
accel=accel))
|
|
43
43
|
|
|
44
|
+
self._tmpdir = tempfile.TemporaryDirectory()
|
|
45
|
+
self._zarr_path = self._tmpdir.name + "/three_trajects_simple.zarr"
|
|
46
|
+
save_zarr_trajectories(self.correct, self._zarr_path)
|
|
47
|
+
self.scene = ZarrScene(self._zarr_path)
|
|
48
|
+
|
|
49
|
+
def tearDown(self):
|
|
50
|
+
self._tmpdir.cleanup()
|
|
51
|
+
|
|
44
52
|
def test_keys(self):
|
|
45
53
|
"""Reading known available keys with the needed exclusions"""
|
|
46
|
-
|
|
47
|
-
self.assertEqual(list(self.scene.keys()), correct_keys)
|
|
54
|
+
self.assertEqual(set(self.scene.keys()), {'velocity', 'pos', 'accel'})
|
|
48
55
|
|
|
49
56
|
def test_iter_trajectories(self):
|
|
50
57
|
"""Iterating trajectories and getting correct Trajectory objects"""
|
|
51
58
|
trjs = [tr for tr in self.scene.iter_trajectories()]
|
|
52
59
|
self.assertEqual(len(trjs), len(self.correct))
|
|
53
60
|
|
|
54
|
-
for trj, correct in zip(
|
|
61
|
+
for trj, correct in zip(
|
|
62
|
+
sorted(trjs, key=lambda t: t.trajid()),
|
|
63
|
+
sorted(self.correct, key=lambda t: t.trajid()),
|
|
64
|
+
):
|
|
55
65
|
nptest.assert_array_almost_equal(trj.pos(), correct.pos())
|
|
56
66
|
nptest.assert_array_almost_equal(trj.velocity(), correct.velocity())
|
|
57
67
|
nptest.assert_array_almost_equal(trj.accel(), correct.accel())
|
|
@@ -64,7 +74,10 @@ class TestScene(unittest.TestCase):
|
|
|
64
74
|
trjs = [tr for tr in self.scene.iter_trajectories()]
|
|
65
75
|
self.assertEqual(len(trjs), len(self.correct))
|
|
66
76
|
|
|
67
|
-
for trj, correct in zip(
|
|
77
|
+
for trj, correct in zip(
|
|
78
|
+
sorted(trjs, key=lambda t: t.trajid()),
|
|
79
|
+
sorted(self.correct, key=lambda t: t.trajid()),
|
|
80
|
+
):
|
|
68
81
|
nptest.assert_array_almost_equal(trj.pos(), correct.pos()[1:-1])
|
|
69
82
|
nptest.assert_array_almost_equal(trj.velocity(), correct.velocity()[1:-1])
|
|
70
83
|
nptest.assert_array_almost_equal(trj.accel(), correct.accel()[1:-1])
|
|
@@ -72,49 +85,65 @@ class TestScene(unittest.TestCase):
|
|
|
72
85
|
self.assertEqual(trj.trajid(), correct.trajid())
|
|
73
86
|
|
|
74
87
|
def test_iter_frames(self):
|
|
75
|
-
"""Iterating the
|
|
88
|
+
"""Iterating the store by frames, getting correct ParticleSnapshot objects"""
|
|
76
89
|
schm = self.correct[0].schema()
|
|
77
|
-
correct_frames = [take_snapshot(self.correct, frm, schm)
|
|
90
|
+
correct_frames = [take_snapshot(self.correct, frm, schm)
|
|
78
91
|
for frm in range(10001, 10005)]
|
|
79
92
|
|
|
80
93
|
frames = [frm for frm in self.scene.iter_frames()]
|
|
81
94
|
self.assertEqual(len(frames), len(correct_frames))
|
|
82
95
|
|
|
83
96
|
for frm, correct in zip(frames, correct_frames):
|
|
84
|
-
nptest.assert_array_almost_equal(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
nptest.assert_array_almost_equal(
|
|
97
|
+
nptest.assert_array_almost_equal(
|
|
98
|
+
frm.pos()[np.argsort(frm.trajid())],
|
|
99
|
+
correct.pos()[np.argsort(correct.trajid())])
|
|
100
|
+
nptest.assert_array_almost_equal(
|
|
101
|
+
frm.velocity()[np.argsort(frm.trajid())],
|
|
102
|
+
correct.velocity()[np.argsort(correct.trajid())])
|
|
103
|
+
nptest.assert_array_almost_equal(
|
|
104
|
+
frm.accel()[np.argsort(frm.trajid())],
|
|
105
|
+
correct.accel()[np.argsort(correct.trajid())])
|
|
106
|
+
nptest.assert_array_equal(
|
|
107
|
+
np.sort(frm.trajid()), np.sort(correct.trajid()))
|
|
88
108
|
self.assertEqual(frm.time(), correct.time())
|
|
89
109
|
|
|
90
110
|
def test_iter_frames_subrange(self):
|
|
91
111
|
"""Iterating frames subrange"""
|
|
92
|
-
print(self.scene.__dict__)
|
|
93
112
|
self.scene.set_frame_range((10002, 10004))
|
|
94
|
-
print(self.scene.__dict__)
|
|
95
113
|
|
|
96
114
|
schm = self.correct[0].schema()
|
|
97
|
-
correct_frames = [take_snapshot(self.correct, frm, schm)
|
|
115
|
+
correct_frames = [take_snapshot(self.correct, frm, schm)
|
|
98
116
|
for frm in range(10002, 10004)]
|
|
99
117
|
|
|
100
118
|
frames = [frm for frm in self.scene.iter_frames()]
|
|
101
119
|
self.assertEqual(len(frames), len(correct_frames))
|
|
102
120
|
|
|
103
121
|
for frm, correct in zip(frames, correct_frames):
|
|
104
|
-
nptest.assert_array_almost_equal(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
nptest.assert_array_almost_equal(
|
|
122
|
+
nptest.assert_array_almost_equal(
|
|
123
|
+
frm.pos()[np.argsort(frm.trajid())],
|
|
124
|
+
correct.pos()[np.argsort(correct.trajid())])
|
|
125
|
+
nptest.assert_array_almost_equal(
|
|
126
|
+
frm.velocity()[np.argsort(frm.trajid())],
|
|
127
|
+
correct.velocity()[np.argsort(correct.trajid())])
|
|
128
|
+
nptest.assert_array_almost_equal(
|
|
129
|
+
frm.accel()[np.argsort(frm.trajid())],
|
|
130
|
+
correct.accel()[np.argsort(correct.trajid())])
|
|
131
|
+
nptest.assert_array_equal(
|
|
132
|
+
np.sort(frm.trajid()), np.sort(correct.trajid()))
|
|
108
133
|
self.assertEqual(frm.time(), correct.time())
|
|
109
134
|
|
|
110
135
|
def test_collect(self):
|
|
111
|
-
"""Slicing the
|
|
136
|
+
"""Slicing the store by keys or expressions"""
|
|
112
137
|
v = self.scene.collect(['velocity'])[0]
|
|
113
|
-
self.assertEqual(v.shape, (12,3))
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
138
|
+
self.assertEqual(v.shape, (12, 3))
|
|
139
|
+
|
|
140
|
+
by_id = {}
|
|
141
|
+
for trj in self.scene.iter_trajectories():
|
|
142
|
+
by_id[trj.trajid()] = trj.velocity()
|
|
143
|
+
v_stacked = np.stack(
|
|
144
|
+
[by_id[i] for i in sorted(by_id)], axis=0)
|
|
145
|
+
nptest.assert_array_almost_equal(v_stacked[0, :, 0], v_stacked[1, :, 1])
|
|
146
|
+
nptest.assert_array_almost_equal(v_stacked[0, :, 0], v_stacked[2, :, 2])
|
|
118
147
|
|
|
119
148
|
class TestUtils(unittest.TestCase):
|
|
120
149
|
def test_query_string(self):
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""ZarrScene behaviour checks against Zarr stores written by
|
|
2
|
+
:func:`flowtracks.io.save_zarr_trajectories` and against an openptv2
|
|
3
|
+
RunStore-style Zarr layout (traj/ + trajectories/ groups)."""
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from flowtracks.io import save_zarr_trajectories
|
|
9
|
+
from flowtracks.scene import open_scene
|
|
10
|
+
from flowtracks.trajectory import Trajectory
|
|
11
|
+
from flowtracks.zarr_scene import ZarrScene
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _make_trajectories():
|
|
15
|
+
tr1 = Trajectory(
|
|
16
|
+
pos=np.array([[0.0, 0.0, 0.0], [1.0, 1.0, 1.0], [2.0, 2.0, 2.0]]),
|
|
17
|
+
velocity=np.array([[0.1, 0.1, 0.1], [0.2, 0.2, 0.2], [0.3, 0.3, 0.3]]),
|
|
18
|
+
time=np.array([10, 11, 12]),
|
|
19
|
+
trajid=1,
|
|
20
|
+
accel=np.array([[0.01, 0.01, 0.01], [0.02, 0.02, 0.02], [0.03, 0.03, 0.03]]),
|
|
21
|
+
)
|
|
22
|
+
tr2 = Trajectory(
|
|
23
|
+
pos=np.array([[5.0, 5.0, 5.0], [6.0, 6.0, 6.0], [7.0, 7.0, 7.0], [8.0, 8.0, 8.0]]),
|
|
24
|
+
velocity=np.array(
|
|
25
|
+
[[0.5, 0.5, 0.5], [0.6, 0.6, 0.6], [0.7, 0.7, 0.7], [0.8, 0.8, 0.8]]
|
|
26
|
+
),
|
|
27
|
+
time=np.array([10, 11, 12, 13]),
|
|
28
|
+
trajid=2,
|
|
29
|
+
accel=np.array(
|
|
30
|
+
[[0.05] * 3, [0.06] * 3, [0.07] * 3, [0.08] * 3]
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
tr3 = Trajectory(
|
|
34
|
+
pos=np.array([[9.0, 9.0, 9.0], [9.5, 9.5, 9.5]]),
|
|
35
|
+
velocity=np.array([[0.9, 0.9, 0.9], [0.95, 0.95, 0.95]]),
|
|
36
|
+
time=np.array([11, 12]),
|
|
37
|
+
trajid=3,
|
|
38
|
+
accel=np.array([[0.09] * 3, [0.095] * 3]),
|
|
39
|
+
)
|
|
40
|
+
return [tr1, tr2, tr3]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.fixture
|
|
44
|
+
def zarr_scene(tmp_path):
|
|
45
|
+
trajects = _make_trajectories()
|
|
46
|
+
zarr_path = tmp_path / "ref.zarr"
|
|
47
|
+
save_zarr_trajectories(trajects, zarr_path)
|
|
48
|
+
return ZarrScene(zarr_path), {t.trajid(): t for t in trajects}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _sorted_rows(arr):
|
|
52
|
+
return arr[np.lexsort(arr.T)]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_keys_and_shapes(zarr_scene):
|
|
56
|
+
scene, _ = zarr_scene
|
|
57
|
+
assert set(scene.keys()) == {"pos", "velocity", "accel"}
|
|
58
|
+
assert dict(zip(scene.keys(), scene.shapes())) == {
|
|
59
|
+
"pos": 3, "velocity": 3, "accel": 3,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_trajectory_ids_and_tags(zarr_scene):
|
|
64
|
+
scene, ref = zarr_scene
|
|
65
|
+
assert sorted(scene.trajectory_ids().tolist()) == [1, 2, 3]
|
|
66
|
+
tags = {int(r[0]): (int(r[1]), int(r[2])) for r in scene.trajectory_tags()}
|
|
67
|
+
assert tags == {1: (10, 12), 2: (10, 13), 3: (11, 12)}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_trajectory_by_id_matches(zarr_scene):
|
|
71
|
+
scene, ref = zarr_scene
|
|
72
|
+
for trid in [1, 2, 3]:
|
|
73
|
+
z = scene.trajectory_by_id(trid)
|
|
74
|
+
h = ref[trid]
|
|
75
|
+
np.testing.assert_allclose(z.pos(), h.pos())
|
|
76
|
+
np.testing.assert_allclose(z.velocity(), h.velocity())
|
|
77
|
+
np.testing.assert_array_equal(z.time(), h.time())
|
|
78
|
+
assert z.trajid() == h.trajid()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_iter_trajectories_matches(zarr_scene):
|
|
82
|
+
scene, ref = zarr_scene
|
|
83
|
+
z_by_id = {t.trajid(): t for t in scene.iter_trajectories()}
|
|
84
|
+
assert set(z_by_id) == set(ref)
|
|
85
|
+
for trid in ref:
|
|
86
|
+
np.testing.assert_allclose(z_by_id[trid].pos(), ref[trid].pos())
|
|
87
|
+
np.testing.assert_array_equal(z_by_id[trid].time(), ref[trid].time())
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_iter_frames_matches(zarr_scene):
|
|
91
|
+
scene, ref = zarr_scene
|
|
92
|
+
z_frames = {f.time(): f for f in scene.iter_frames()}
|
|
93
|
+
assert set(z_frames) == {10, 11, 12, 13}
|
|
94
|
+
assert sorted(z_frames[10].trajid().tolist()) == [1, 2]
|
|
95
|
+
assert sorted(z_frames[11].trajid().tolist()) == [1, 2, 3]
|
|
96
|
+
np.testing.assert_allclose(
|
|
97
|
+
_sorted_rows(z_frames[10].pos()),
|
|
98
|
+
_sorted_rows(np.array([[0.0, 0, 0], [5.0, 5, 5]])),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def test_frame_by_time_matches(zarr_scene):
|
|
103
|
+
scene, _ = zarr_scene
|
|
104
|
+
z = scene.frame_by_time(11)
|
|
105
|
+
assert sorted(z.trajid().tolist()) == [1, 2, 3]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_iter_segments_matches(zarr_scene):
|
|
109
|
+
scene, _ = zarr_scene
|
|
110
|
+
z_segs = list(scene.iter_segments())
|
|
111
|
+
# frames 10..13 -> 3 consecutive pairs
|
|
112
|
+
assert len(z_segs) == 3
|
|
113
|
+
(z_a, z_b) = z_segs[0]
|
|
114
|
+
assert z_a.time() == 10 and z_b.time() == 11
|
|
115
|
+
assert sorted(z_a.trajid().tolist()) == [1, 2]
|
|
116
|
+
assert sorted(z_b.trajid().tolist()) == [1, 2]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_collect_matches(zarr_scene):
|
|
120
|
+
scene, _ = zarr_scene
|
|
121
|
+
z_pos, z_time = scene.collect(["pos", "time"])
|
|
122
|
+
assert z_pos.shape == (9, 3)
|
|
123
|
+
assert z_time.shape == (9,)
|
|
124
|
+
assert set(np.unique(z_time).tolist()) == {10, 11, 12, 13}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def test_collect_with_where_matches(zarr_scene):
|
|
128
|
+
scene, _ = zarr_scene
|
|
129
|
+
where = {"time": (11, 13, False)}
|
|
130
|
+
z_pos = scene.collect(["pos"], where=where)[0]
|
|
131
|
+
assert len(z_pos) == 6 # frames 11, 12 across tr1 (2) + tr2 (2) + tr3 (2)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_bounding_box_matches(zarr_scene):
|
|
135
|
+
scene, _ = zarr_scene
|
|
136
|
+
z_min, z_max = scene.bounding_box()
|
|
137
|
+
np.testing.assert_allclose(z_min, [0.0, 0, 0])
|
|
138
|
+
np.testing.assert_allclose(z_max, [9.5, 9.5, 9.5])
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_frame_range_filters(zarr_scene):
|
|
142
|
+
scene, _ = zarr_scene
|
|
143
|
+
scene.set_frame_range((11, 13))
|
|
144
|
+
assert scene.frame_range() == (11, 13)
|
|
145
|
+
z_pos = scene.collect(["time"])[0]
|
|
146
|
+
assert z_pos.min() >= 11 and z_pos.max() < 13
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def test_open_scene_dispatches_zarr(tmp_path):
|
|
150
|
+
trajects = _make_trajectories()
|
|
151
|
+
zarr_path = tmp_path / "d.zarr"
|
|
152
|
+
save_zarr_trajectories(trajects, zarr_path)
|
|
153
|
+
|
|
154
|
+
assert isinstance(open_scene(str(zarr_path)), ZarrScene)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def test_reads_openptv2_run_store_layout(tmp_path):
|
|
158
|
+
"""openptv2's RunStore.seal() writes traj/{trajid,first,last,length} and
|
|
159
|
+
trajectories/{pos,vel,accel,time,trajid} -- no /bounds table, just the
|
|
160
|
+
traj/ index. ZarrScene must read this directly, not just flowtracks'
|
|
161
|
+
own save_zarr_trajectories output."""
|
|
162
|
+
import zarr
|
|
163
|
+
|
|
164
|
+
store_path = tmp_path / "run.zarr"
|
|
165
|
+
root = zarr.open_group(str(store_path), mode="w")
|
|
166
|
+
traj_grp = root.create_group("traj")
|
|
167
|
+
traj_grp.create_array("trajid", data=np.array([7, 8], dtype=np.int32))
|
|
168
|
+
traj_grp.create_array("first", data=np.array([10, 10], dtype=np.int32))
|
|
169
|
+
traj_grp.create_array("last", data=np.array([11, 12], dtype=np.int32))
|
|
170
|
+
traj_grp.create_array("length", data=np.array([2, 3], dtype=np.int32))
|
|
171
|
+
|
|
172
|
+
trajectories_grp = root.create_group("trajectories")
|
|
173
|
+
trajectories_grp.create_array(
|
|
174
|
+
"pos",
|
|
175
|
+
data=np.array(
|
|
176
|
+
[[0.0, 0, 0], [0.1, 0, 0], [1.0, 1, 1], [1.1, 1, 1], [1.2, 1, 1]]
|
|
177
|
+
),
|
|
178
|
+
)
|
|
179
|
+
trajectories_grp.create_array(
|
|
180
|
+
"vel", data=np.zeros((5, 3))
|
|
181
|
+
)
|
|
182
|
+
trajectories_grp.create_array("time", data=np.array([10, 11, 10, 11, 12]))
|
|
183
|
+
trajectories_grp.create_array("trajid", data=np.array([7, 7, 8, 8, 8]))
|
|
184
|
+
|
|
185
|
+
scene = ZarrScene(store_path)
|
|
186
|
+
assert sorted(scene.trajectory_ids().tolist()) == [7, 8]
|
|
187
|
+
tr7 = scene.trajectory_by_id(7)
|
|
188
|
+
assert len(tr7) == 2
|
|
189
|
+
tr8 = scene.trajectory_by_id(8)
|
|
190
|
+
assert len(tr8) == 3
|
|
191
|
+
assert "accel" not in scene.keys()
|