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.
Files changed (568) hide show
  1. {flowtracks-1.5.2.dev2/flowtracks.egg-info → flowtracks-1.6.0}/PKG-INFO +1 -1
  2. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/_version.py +3 -3
  3. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/an_scene.py +11 -1
  4. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/analysis.py +8 -1
  5. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/io.py +33 -5
  6. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/scene.py +16 -1
  7. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0/flowtracks.egg-info}/PKG-INFO +1 -1
  8. flowtracks-1.6.0/flowtracks.egg-info/scm_version.json +8 -0
  9. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_io.py +29 -19
  10. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_scene.py +60 -31
  11. flowtracks-1.6.0/tests/test_zarr_scene.py +191 -0
  12. flowtracks-1.5.2.dev2/flowtracks.egg-info/scm_version.json +0 -8
  13. flowtracks-1.5.2.dev2/tests/test_zarr_scene.py +0 -208
  14. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.github/workflows/python-package.yml +0 -0
  15. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.github/workflows/python-publish.yml +0 -0
  16. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/.gitignore +0 -0
  17. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/CLAUDE.md +0 -0
  18. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/LICENSE.txt +0 -0
  19. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/README.md +0 -0
  20. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/RELEASE.md +0 -0
  21. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/SPEEDUP_PLAN.md +0 -0
  22. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/WRITERS_PLAN.md +0 -0
  23. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/BASELINE.md +0 -0
  24. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_interp.py +0 -0
  25. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_io.py +0 -0
  26. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/benchmarks/bench_pairs.py +0 -0
  27. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10001 +0 -0
  28. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10002 +0 -0
  29. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10003 +0 -0
  30. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10004 +0 -0
  31. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10005 +0 -0
  32. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10006 +0 -0
  33. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10007 +0 -0
  34. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10008 +0 -0
  35. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10009 +0 -0
  36. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10010 +0 -0
  37. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10011 +0 -0
  38. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10012 +0 -0
  39. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10013 +0 -0
  40. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10014 +0 -0
  41. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10015 +0 -0
  42. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10016 +0 -0
  43. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10017 +0 -0
  44. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10018 +0 -0
  45. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10019 +0 -0
  46. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10020 +0 -0
  47. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10021 +0 -0
  48. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10022 +0 -0
  49. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10023 +0 -0
  50. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10024 +0 -0
  51. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10025 +0 -0
  52. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10026 +0 -0
  53. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10027 +0 -0
  54. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10028 +0 -0
  55. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10029 +0 -0
  56. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10030 +0 -0
  57. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10031 +0 -0
  58. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10032 +0 -0
  59. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10033 +0 -0
  60. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10034 +0 -0
  61. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10035 +0 -0
  62. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10036 +0 -0
  63. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10037 +0 -0
  64. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10038 +0 -0
  65. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10039 +0 -0
  66. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10040 +0 -0
  67. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10041 +0 -0
  68. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10042 +0 -0
  69. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10043 +0 -0
  70. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10044 +0 -0
  71. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10045 +0 -0
  72. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10046 +0 -0
  73. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10047 +0 -0
  74. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10048 +0 -0
  75. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10049 +0 -0
  76. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10050 +0 -0
  77. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10051 +0 -0
  78. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10052 +0 -0
  79. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10053 +0 -0
  80. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10054 +0 -0
  81. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10055 +0 -0
  82. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10056 +0 -0
  83. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10057 +0 -0
  84. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10058 +0 -0
  85. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10059 +0 -0
  86. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10060 +0 -0
  87. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10061 +0 -0
  88. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10062 +0 -0
  89. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10063 +0 -0
  90. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10064 +0 -0
  91. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10065 +0 -0
  92. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10066 +0 -0
  93. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10067 +0 -0
  94. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10068 +0 -0
  95. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10069 +0 -0
  96. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10070 +0 -0
  97. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10071 +0 -0
  98. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10072 +0 -0
  99. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10073 +0 -0
  100. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10074 +0 -0
  101. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10075 +0 -0
  102. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10076 +0 -0
  103. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10077 +0 -0
  104. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10078 +0 -0
  105. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10079 +0 -0
  106. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10080 +0 -0
  107. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10081 +0 -0
  108. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10082 +0 -0
  109. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10083 +0 -0
  110. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10084 +0 -0
  111. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10085 +0 -0
  112. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10086 +0 -0
  113. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10087 +0 -0
  114. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10088 +0 -0
  115. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10089 +0 -0
  116. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10090 +0 -0
  117. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10091 +0 -0
  118. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10092 +0 -0
  119. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10093 +0 -0
  120. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10094 +0 -0
  121. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10095 +0 -0
  122. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10096 +0 -0
  123. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10097 +0 -0
  124. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10098 +0 -0
  125. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10099 +0 -0
  126. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10100 +0 -0
  127. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10101 +0 -0
  128. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10102 +0 -0
  129. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10103 +0 -0
  130. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10104 +0 -0
  131. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10105 +0 -0
  132. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10106 +0 -0
  133. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10107 +0 -0
  134. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10108 +0 -0
  135. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10109 +0 -0
  136. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10110 +0 -0
  137. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10111 +0 -0
  138. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10112 +0 -0
  139. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10113 +0 -0
  140. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10114 +0 -0
  141. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10115 +0 -0
  142. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10116 +0 -0
  143. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10117 +0 -0
  144. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10118 +0 -0
  145. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10119 +0 -0
  146. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10120 +0 -0
  147. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10121 +0 -0
  148. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10122 +0 -0
  149. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10123 +0 -0
  150. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10124 +0 -0
  151. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10125 +0 -0
  152. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10126 +0 -0
  153. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10127 +0 -0
  154. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10128 +0 -0
  155. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10129 +0 -0
  156. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10130 +0 -0
  157. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10131 +0 -0
  158. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10132 +0 -0
  159. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10133 +0 -0
  160. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10134 +0 -0
  161. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10135 +0 -0
  162. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10136 +0 -0
  163. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10137 +0 -0
  164. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10138 +0 -0
  165. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10139 +0 -0
  166. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10140 +0 -0
  167. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10141 +0 -0
  168. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10142 +0 -0
  169. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10143 +0 -0
  170. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10144 +0 -0
  171. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10145 +0 -0
  172. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10146 +0 -0
  173. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10147 +0 -0
  174. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10148 +0 -0
  175. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10149 +0 -0
  176. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10150 +0 -0
  177. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10151 +0 -0
  178. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10152 +0 -0
  179. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10153 +0 -0
  180. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10154 +0 -0
  181. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10155 +0 -0
  182. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10156 +0 -0
  183. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10157 +0 -0
  184. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10158 +0 -0
  185. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10159 +0 -0
  186. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10160 +0 -0
  187. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10161 +0 -0
  188. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10162 +0 -0
  189. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10163 +0 -0
  190. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10164 +0 -0
  191. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10165 +0 -0
  192. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10166 +0 -0
  193. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10167 +0 -0
  194. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10168 +0 -0
  195. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10169 +0 -0
  196. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10170 +0 -0
  197. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10171 +0 -0
  198. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10172 +0 -0
  199. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10173 +0 -0
  200. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10174 +0 -0
  201. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10175 +0 -0
  202. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10176 +0 -0
  203. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10177 +0 -0
  204. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10178 +0 -0
  205. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10179 +0 -0
  206. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10180 +0 -0
  207. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10181 +0 -0
  208. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10182 +0 -0
  209. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10183 +0 -0
  210. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10184 +0 -0
  211. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10185 +0 -0
  212. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10186 +0 -0
  213. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10187 +0 -0
  214. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10188 +0 -0
  215. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10189 +0 -0
  216. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10190 +0 -0
  217. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10191 +0 -0
  218. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10192 +0 -0
  219. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10193 +0 -0
  220. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10194 +0 -0
  221. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10195 +0 -0
  222. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10196 +0 -0
  223. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10197 +0 -0
  224. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10198 +0 -0
  225. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10199 +0 -0
  226. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles/xuap.10200 +0 -0
  227. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/particles.h5 +0 -0
  228. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/readme.txt +0 -0
  229. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/seq_hdf.cfg +0 -0
  230. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10001 +0 -0
  231. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10002 +0 -0
  232. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10003 +0 -0
  233. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10004 +0 -0
  234. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10005 +0 -0
  235. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10006 +0 -0
  236. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10007 +0 -0
  237. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10008 +0 -0
  238. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10009 +0 -0
  239. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10010 +0 -0
  240. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10011 +0 -0
  241. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10012 +0 -0
  242. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10013 +0 -0
  243. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10014 +0 -0
  244. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10015 +0 -0
  245. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10016 +0 -0
  246. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10017 +0 -0
  247. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10018 +0 -0
  248. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10019 +0 -0
  249. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10020 +0 -0
  250. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10021 +0 -0
  251. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10022 +0 -0
  252. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10023 +0 -0
  253. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10024 +0 -0
  254. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10025 +0 -0
  255. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10026 +0 -0
  256. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10027 +0 -0
  257. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10028 +0 -0
  258. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10029 +0 -0
  259. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10030 +0 -0
  260. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10031 +0 -0
  261. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10032 +0 -0
  262. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10033 +0 -0
  263. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10034 +0 -0
  264. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10035 +0 -0
  265. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10036 +0 -0
  266. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10037 +0 -0
  267. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10038 +0 -0
  268. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10039 +0 -0
  269. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10040 +0 -0
  270. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10041 +0 -0
  271. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10042 +0 -0
  272. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10043 +0 -0
  273. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10044 +0 -0
  274. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10045 +0 -0
  275. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10046 +0 -0
  276. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10047 +0 -0
  277. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10048 +0 -0
  278. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10049 +0 -0
  279. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10050 +0 -0
  280. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10051 +0 -0
  281. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10052 +0 -0
  282. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10053 +0 -0
  283. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10054 +0 -0
  284. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10055 +0 -0
  285. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10056 +0 -0
  286. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10057 +0 -0
  287. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10058 +0 -0
  288. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10059 +0 -0
  289. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10060 +0 -0
  290. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10061 +0 -0
  291. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10062 +0 -0
  292. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10063 +0 -0
  293. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10064 +0 -0
  294. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10065 +0 -0
  295. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10066 +0 -0
  296. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10067 +0 -0
  297. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10068 +0 -0
  298. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10069 +0 -0
  299. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10070 +0 -0
  300. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10071 +0 -0
  301. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10072 +0 -0
  302. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10073 +0 -0
  303. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10074 +0 -0
  304. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10075 +0 -0
  305. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10076 +0 -0
  306. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10077 +0 -0
  307. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10078 +0 -0
  308. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10079 +0 -0
  309. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10080 +0 -0
  310. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10081 +0 -0
  311. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10082 +0 -0
  312. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10083 +0 -0
  313. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10084 +0 -0
  314. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10085 +0 -0
  315. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10086 +0 -0
  316. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10087 +0 -0
  317. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10088 +0 -0
  318. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10089 +0 -0
  319. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10090 +0 -0
  320. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10091 +0 -0
  321. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10092 +0 -0
  322. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10093 +0 -0
  323. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10094 +0 -0
  324. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10095 +0 -0
  325. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10096 +0 -0
  326. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10097 +0 -0
  327. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10098 +0 -0
  328. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10099 +0 -0
  329. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10100 +0 -0
  330. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10101 +0 -0
  331. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10102 +0 -0
  332. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10103 +0 -0
  333. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10104 +0 -0
  334. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10105 +0 -0
  335. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10106 +0 -0
  336. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10107 +0 -0
  337. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10108 +0 -0
  338. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10109 +0 -0
  339. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10110 +0 -0
  340. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10111 +0 -0
  341. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10112 +0 -0
  342. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10113 +0 -0
  343. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10114 +0 -0
  344. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10115 +0 -0
  345. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10116 +0 -0
  346. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10117 +0 -0
  347. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10118 +0 -0
  348. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10119 +0 -0
  349. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10120 +0 -0
  350. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10121 +0 -0
  351. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10122 +0 -0
  352. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10123 +0 -0
  353. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10124 +0 -0
  354. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10125 +0 -0
  355. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10126 +0 -0
  356. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10127 +0 -0
  357. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10128 +0 -0
  358. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10129 +0 -0
  359. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10130 +0 -0
  360. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10131 +0 -0
  361. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10132 +0 -0
  362. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10133 +0 -0
  363. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10134 +0 -0
  364. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10135 +0 -0
  365. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10136 +0 -0
  366. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10137 +0 -0
  367. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10138 +0 -0
  368. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10139 +0 -0
  369. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10140 +0 -0
  370. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10141 +0 -0
  371. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10142 +0 -0
  372. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10143 +0 -0
  373. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10144 +0 -0
  374. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10145 +0 -0
  375. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10146 +0 -0
  376. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10147 +0 -0
  377. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10148 +0 -0
  378. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10149 +0 -0
  379. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10150 +0 -0
  380. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10151 +0 -0
  381. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10152 +0 -0
  382. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10153 +0 -0
  383. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10154 +0 -0
  384. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10155 +0 -0
  385. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10156 +0 -0
  386. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10157 +0 -0
  387. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10158 +0 -0
  388. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10159 +0 -0
  389. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10160 +0 -0
  390. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10161 +0 -0
  391. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10162 +0 -0
  392. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10163 +0 -0
  393. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10164 +0 -0
  394. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10165 +0 -0
  395. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10166 +0 -0
  396. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10167 +0 -0
  397. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10168 +0 -0
  398. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10169 +0 -0
  399. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10170 +0 -0
  400. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10171 +0 -0
  401. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10172 +0 -0
  402. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10173 +0 -0
  403. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10174 +0 -0
  404. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10175 +0 -0
  405. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10176 +0 -0
  406. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10177 +0 -0
  407. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10178 +0 -0
  408. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10179 +0 -0
  409. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10180 +0 -0
  410. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10181 +0 -0
  411. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10182 +0 -0
  412. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10183 +0 -0
  413. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10184 +0 -0
  414. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10185 +0 -0
  415. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10186 +0 -0
  416. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10187 +0 -0
  417. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10188 +0 -0
  418. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10189 +0 -0
  419. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10190 +0 -0
  420. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10191 +0 -0
  421. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10192 +0 -0
  422. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10193 +0 -0
  423. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10194 +0 -0
  424. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10195 +0 -0
  425. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10196 +0 -0
  426. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10197 +0 -0
  427. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10198 +0 -0
  428. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10199 +0 -0
  429. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers/ptv_is.10200 +0 -0
  430. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/0/0 +0 -0
  431. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/0/1 +0 -0
  432. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/1/0 +0 -0
  433. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/1/1 +0 -0
  434. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/2/0 +0 -0
  435. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/2/1 +0 -0
  436. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/3/0 +0 -0
  437. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/accel/c/3/1 +0 -0
  438. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/0/0 +0 -0
  439. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/0/1 +0 -0
  440. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/1/0 +0 -0
  441. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/1/1 +0 -0
  442. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/2/0 +0 -0
  443. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/2/1 +0 -0
  444. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/3/0 +0 -0
  445. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/pos/c/3/1 +0 -0
  446. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/0 +0 -0
  447. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/1 +0 -0
  448. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/2 +0 -0
  449. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/time/c/3 +0 -0
  450. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/0 +0 -0
  451. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/1 +0 -0
  452. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/2 +0 -0
  453. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/trajid/c/3 +0 -0
  454. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/0/0 +0 -0
  455. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/0/1 +0 -0
  456. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/1/0 +0 -0
  457. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/1/1 +0 -0
  458. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/2/0 +0 -0
  459. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/2/1 +0 -0
  460. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/3/0 +0 -0
  461. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/data/tracers.zarr/trajectories/vel/c/3/1 +0 -0
  462. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/_static/hdf5_scene_analysis.html +0 -0
  463. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/_static/repeated_interpolation.html +0 -0
  464. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/an_scene.rst +0 -0
  465. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/analysis.rst +0 -0
  466. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/conf.py +0 -0
  467. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/datastruct.rst +0 -0
  468. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/graphics.rst +0 -0
  469. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/index.rst +0 -0
  470. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/interpolation.rst +0 -0
  471. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/io.rst +0 -0
  472. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/pairs.rst +0 -0
  473. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/particle.rst +0 -0
  474. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/repair.rst +0 -0
  475. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/scene.rst +0 -0
  476. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/sequence.rst +0 -0
  477. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/doc/smoothing.rst +0 -0
  478. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/batch_Lagrangian_to_Eulerian.py +0 -0
  479. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/hdf5_scene_analysis.ipynb +0 -0
  480. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/linking_trajectories.ipynb +0 -0
  481. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_dual_rig_trajectories.py +0 -0
  482. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_flowtracks.py +0 -0
  483. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_hdf5_vs_zarr_scene_analysis.py +0 -0
  484. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_linking_trajectories_zarr.py +0 -0
  485. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_phase_averaging_demo.py +0 -0
  486. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_phase_metrics.py +0 -0
  487. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_vtk_writers_preview.py +0 -0
  488. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/marimo_zarr_dashboard.py +0 -0
  489. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/repeated_interpolation.ipynb +0 -0
  490. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/run_pipeline.py +0 -0
  491. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/visualize_marimo.py +0 -0
  492. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/examples/visualize_results.py +0 -0
  493. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/__init__.py +0 -0
  494. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/combine.py +0 -0
  495. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/eulerian.py +0 -0
  496. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/flux.py +0 -0
  497. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/format_docstrings.py +0 -0
  498. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/future_idea_xarray_dask_zarr.py +0 -0
  499. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/graphics.py +0 -0
  500. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/interpolation.py +0 -0
  501. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/nhist.py +0 -0
  502. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/pairs.py +0 -0
  503. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/particle.py +0 -0
  504. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/phase_average.py +0 -0
  505. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/pipeline.py +0 -0
  506. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/provenance.py +0 -0
  507. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/repair.py +0 -0
  508. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/sequence.py +0 -0
  509. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/smoothing.py +0 -0
  510. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/stitching.py +0 -0
  511. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/trajectory.py +0 -0
  512. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/vortex.py +0 -0
  513. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/wall_shear.py +0 -0
  514. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/writers.py +0 -0
  515. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks/zarr_scene.py +0 -0
  516. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/SOURCES.txt +0 -0
  517. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/dependency_links.txt +0 -0
  518. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/requires.txt +0 -0
  519. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/scm_file_list.json +0 -0
  520. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/flowtracks.egg-info/top_level.txt +0 -0
  521. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/future_plan.md +0 -0
  522. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/peek_zarr.py +0 -0
  523. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/plotting_trajectories_using_postptv.ipynb +0 -0
  524. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/pyproject.toml +0 -0
  525. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/requriments.txt +0 -0
  526. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/analyse_fhdf.py +0 -0
  527. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/convert_tracers_to_zarr.py +0 -0
  528. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/run_postptv_analysis.py +0 -0
  529. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/scripts/view_trajectories_3d.py +0 -0
  530. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/setup.cfg +0 -0
  531. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/setup.py +0 -0
  532. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/conftest.py +0 -0
  533. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/helpers.py +0 -0
  534. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_analysis.py +0 -0
  535. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_binning_equivalence.py +0 -0
  536. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_derived_fields.py +0 -0
  537. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_eulerian_grid.py +0 -0
  538. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_eulerian_upgrades.py +0 -0
  539. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_flux.py +0 -0
  540. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_graphics_3d.py +0 -0
  541. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_idw_call.py +0 -0
  542. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_interp.py +0 -0
  543. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_nhist.py +0 -0
  544. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_align_synthetic_sets.py +0 -0
  545. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_average_xr.py +0 -0
  546. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_phase_shift_extraction_and_vtr_export.py +0 -0
  547. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_post_analysis_edge_cases.py +0 -0
  548. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_post_analysis_xr.py +0 -0
  549. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_provenance.py +0 -0
  550. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_repair.py +0 -0
  551. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_sequence.py +0 -0
  552. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_smoothing.py +0 -0
  553. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_speedup_equivalence.py +0 -0
  554. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_stitching.py +0 -0
  555. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_streamlined_zarr_paraview.py +0 -0
  556. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_turbulent_statistics.py +0 -0
  557. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_vortex_and_wall_shear.py +0 -0
  558. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_writers.py +0 -0
  559. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_io.py +0 -0
  560. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_pipeline_end_to_end.py +0 -0
  561. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/test_zarr_trajectories.py +0 -0
  562. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/interpolant.cfg +0 -0
  563. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10001 +0 -0
  564. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10002 +0 -0
  565. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10003 +0 -0
  566. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/ptvis/ptv_is.10004 +0 -0
  567. {flowtracks-1.5.2.dev2 → flowtracks-1.6.0}/tests/testing_fodder/sequence.cfg +0 -0
  568. {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.5.2.dev2
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.5.2.dev2'
22
- __version_tuple__ = version_tuple = (1, 5, 2, 'dev2')
21
+ __version__ = version = '1.6.0'
22
+ __version_tuple__ = version_tuple = (1, 6, 0)
23
23
 
24
- __commit_id__ = commit_id = 'gd0fd559b2'
24
+ __commit_id__ = commit_id = 'g0098b1fd3'
@@ -1,7 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  import numpy as np
4
- import tables
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:`save_trajectories` or
8
- :func:`save_particles_table` for saving scene data in, respectively, an obsolete
9
- format based on a directory of NPZ files, or in the newer, recommended, HDF5
10
- format.
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
- import tables
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.5.2.dev2
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.6.0",
3
+ "distance": 0,
4
+ "node": "g0098b1fd3dca3e00bdbd04cf5c7505cb2f39a82e",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-29"
8
+ }
@@ -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 test_trajectories_hdf(self):
72
- """HDF reading works"""
73
- outfile = 'tests/testing_fodder/table.h5'
74
- io.save_particles_table(outfile, self.correct)
75
- loaded = io.trajectories_table(outfile)
76
- self.compare_trajectories(loaded, self.correct)
77
- os.remove(outfile)
78
-
79
- def test_trim_hdf(self):
80
- """HDF trajectory trimming"""
81
- correct = io.trajectories_ptvis(self.tmpl, self.first+1, self.last-1)
82
-
83
- outfile = 'tests/testing_fodder/table.h5'
84
- io.save_particles_table(outfile, self.correct, trim=1)
85
-
86
- loaded = io.trajectories_table(outfile)
87
- self.compare_trajectories(loaded, correct)
88
-
89
- os.remove(outfile)
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.scene import Scene, gen_query_string
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
- correct_keys = ['velocity', 'pos', 'accel']
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(trjs, self.correct):
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(trjs, self.correct):
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 HDF files by frames, and getting correct ParticleSnapshot objects"""
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(frm.pos(), correct.pos())
85
- nptest.assert_array_almost_equal(frm.velocity(), correct.velocity())
86
- nptest.assert_array_almost_equal(frm.accel(), correct.accel())
87
- nptest.assert_array_almost_equal(frm.trajid(), correct.trajid())
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(frm.pos(), correct.pos())
105
- nptest.assert_array_almost_equal(frm.velocity(), correct.velocity())
106
- nptest.assert_array_almost_equal(frm.accel(), correct.accel())
107
- nptest.assert_array_almost_equal(frm.trajid(), correct.trajid())
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 file by keys or expressions"""
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
- v = v.reshape(3,4,3)
116
- nptest.assert_array_almost_equal(v[0,:,0], v[1,:,1])
117
- nptest.assert_array_almost_equal(v[0,:,0], v[2,:,2])
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()
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.5.1",
3
- "distance": 2,
4
- "node": "gd0fd559b28f895d77ee63a74ae23275dc95d148b",
5
- "dirty": false,
6
- "branch": "master",
7
- "node_date": "2026-09-29"
8
- }