pytme 0.2.0b0__cp311-cp311-macosx_14_0_arm64.whl → 0.2.1__cp311-cp311-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {pytme-0.2.0b0.data → pytme-0.2.1.data}/scripts/match_template.py +473 -140
  2. {pytme-0.2.0b0.data → pytme-0.2.1.data}/scripts/postprocess.py +107 -49
  3. {pytme-0.2.0b0.data → pytme-0.2.1.data}/scripts/preprocessor_gui.py +4 -1
  4. {pytme-0.2.0b0.dist-info → pytme-0.2.1.dist-info}/METADATA +2 -2
  5. pytme-0.2.1.dist-info/RECORD +73 -0
  6. scripts/extract_candidates.py +117 -85
  7. scripts/match_template.py +473 -140
  8. scripts/match_template_filters.py +458 -169
  9. scripts/postprocess.py +107 -49
  10. scripts/preprocessor_gui.py +4 -1
  11. scripts/refine_matches.py +364 -160
  12. tme/__version__.py +1 -1
  13. tme/analyzer.py +278 -148
  14. tme/backends/__init__.py +1 -0
  15. tme/backends/cupy_backend.py +20 -13
  16. tme/backends/jax_backend.py +218 -0
  17. tme/backends/matching_backend.py +25 -10
  18. tme/backends/mlx_backend.py +13 -9
  19. tme/backends/npfftw_backend.py +22 -12
  20. tme/backends/pytorch_backend.py +20 -9
  21. tme/density.py +85 -64
  22. tme/extensions.cpython-311-darwin.so +0 -0
  23. tme/matching_data.py +86 -60
  24. tme/matching_exhaustive.py +245 -166
  25. tme/matching_optimization.py +137 -69
  26. tme/matching_utils.py +1 -1
  27. tme/orientations.py +175 -55
  28. tme/preprocessing/__init__.py +2 -0
  29. tme/preprocessing/_utils.py +188 -0
  30. tme/preprocessing/composable_filter.py +31 -0
  31. tme/preprocessing/compose.py +51 -0
  32. tme/preprocessing/frequency_filters.py +378 -0
  33. tme/preprocessing/tilt_series.py +1017 -0
  34. tme/preprocessor.py +17 -7
  35. tme/structure.py +4 -1
  36. pytme-0.2.0b0.dist-info/RECORD +0 -66
  37. {pytme-0.2.0b0.data → pytme-0.2.1.data}/scripts/estimate_ram_usage.py +0 -0
  38. {pytme-0.2.0b0.data → pytme-0.2.1.data}/scripts/preprocess.py +0 -0
  39. {pytme-0.2.0b0.dist-info → pytme-0.2.1.dist-info}/LICENSE +0 -0
  40. {pytme-0.2.0b0.dist-info → pytme-0.2.1.dist-info}/WHEEL +0 -0
  41. {pytme-0.2.0b0.dist-info → pytme-0.2.1.dist-info}/entry_points.txt +0 -0
  42. {pytme-0.2.0b0.dist-info → pytme-0.2.1.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,7 @@ import argparse
9
9
  from sys import exit
10
10
  from os import getcwd
11
11
  from os.path import join, abspath
12
- from typing import List
12
+ from typing import List, Tuple
13
13
  from os.path import splitext
14
14
 
15
15
  import numpy as np
@@ -29,6 +29,7 @@ from tme.matching_utils import (
29
29
  euler_to_rotationmatrix,
30
30
  euler_from_rotationmatrix,
31
31
  )
32
+ from tme.matching_optimization import create_score_object, optimize_match
32
33
 
33
34
  PEAK_CALLERS = {
34
35
  "PeakCallerSort": PeakCallerSort,
@@ -181,6 +182,13 @@ def parse_args():
181
182
  required=False,
182
183
  help="Number of accepted false-positives picks to determine minimum score.",
183
184
  )
185
+ additional_group.add_argument(
186
+ "--local_optimization",
187
+ action="store_true",
188
+ required=False,
189
+ help="[Experimental] Perform local optimization of candidates. Useful when the "
190
+ "number of identified candidats is small (< 10).",
191
+ )
184
192
 
185
193
  args = parser.parse_args()
186
194
 
@@ -195,28 +203,34 @@ def parse_args():
195
203
 
196
204
  if args.minimum_score is not None or args.n_false_positives is not None:
197
205
  args.number_of_peaks = np.iinfo(np.int64).max
198
- else:
206
+ elif args.number_of_peaks is None:
199
207
  args.number_of_peaks = 1000
200
208
 
201
209
  return args
202
210
 
203
211
 
204
- def load_template(filepath: str, sampling_rate: NDArray, center: bool = True):
212
+ def load_template(
213
+ filepath: str,
214
+ sampling_rate: NDArray,
215
+ centering: bool = True,
216
+ target_shape: Tuple[int] = None,
217
+ ):
205
218
  try:
206
219
  template = Density.from_file(filepath)
207
- center_of_mass = template.center_of_mass(template.data)
220
+ center = np.divide(np.subtract(template.shape, 1), 2)
208
221
  template_is_density = True
209
- except ValueError:
222
+ except Exception:
210
223
  template = Structure.from_file(filepath)
211
- center_of_mass = template.center_of_mass()[::-1]
224
+ center = template.center_of_mass()[::-1]
212
225
  template = Density.from_structure(template, sampling_rate=sampling_rate)
213
226
  template_is_density = False
214
227
 
215
- translation = np.zeros_like(center_of_mass)
216
- if center:
228
+ translation = np.zeros_like(center)
229
+ if centering and template_is_density:
217
230
  template, translation = template.centered(0)
231
+ center = np.divide(np.subtract(template.shape, 1), 2)
218
232
 
219
- return template, center_of_mass, translation, template_is_density
233
+ return template, center, translation, template_is_density
220
234
 
221
235
 
222
236
  def merge_outputs(data, filepaths: List[str], args):
@@ -226,7 +240,7 @@ def merge_outputs(data, filepaths: List[str], args):
226
240
  if data[0].ndim != data[2].ndim:
227
241
  return data, 1
228
242
 
229
- from tme.matching_exhaustive import _normalize_under_mask
243
+ from tme.matching_exhaustive import normalize_under_mask
230
244
 
231
245
  def _norm_scores(data, args):
232
246
  target_origin, _, sampling_rate, cli_args = data[-1]
@@ -235,7 +249,7 @@ def merge_outputs(data, filepaths: List[str], args):
235
249
  ret = load_template(
236
250
  filepath=cli_args.template,
237
251
  sampling_rate=sampling_rate,
238
- center=not cli_args.no_centering,
252
+ centering=not cli_args.no_centering,
239
253
  )
240
254
  template, center_of_mass, translation, template_is_density = ret
241
255
 
@@ -256,7 +270,7 @@ def merge_outputs(data, filepaths: List[str], args):
256
270
  mask.shape, np.multiply(args.min_boundary_distance, 2)
257
271
  ).astype(int)
258
272
  mask[cropped_shape] = 0
259
- _normalize_under_mask(template=data[0], mask=mask, mask_intensity=mask.sum())
273
+ normalize_under_mask(template=data[0], mask=mask, mask_intensity=mask.sum())
260
274
  return data[0]
261
275
 
262
276
  entities = np.zeros_like(data[0])
@@ -280,7 +294,7 @@ def main():
280
294
  ret = load_template(
281
295
  filepath=cli_args.template,
282
296
  sampling_rate=sampling_rate,
283
- center=not cli_args.no_centering,
297
+ centering=not cli_args.no_centering,
284
298
  )
285
299
  template, center_of_mass, translation, template_is_density = ret
286
300
 
@@ -310,7 +324,9 @@ def main():
310
324
  max_shape = np.max(template.shape)
311
325
  args.min_boundary_distance = np.ceil(np.divide(max_shape, 2))
312
326
 
313
- # data, entities = merge_outputs(data=data, filepaths=args.input_file[1:], args=args)
327
+ entities = None
328
+ if len(args.input_file) > 1:
329
+ data, entities = merge_outputs(data=data, filepaths=args.input_file, args=args)
314
330
 
315
331
  orientations = args.orientations
316
332
  if orientations is None:
@@ -346,31 +362,33 @@ def main():
346
362
  minimum_score = max(minimum_score, 0)
347
363
  args.minimum_score = minimum_score
348
364
 
349
- peak_caller = PEAK_CALLERS[args.peak_caller](
350
- number_of_peaks=args.number_of_peaks,
351
- min_distance=args.min_distance,
352
- min_boundary_distance=args.min_boundary_distance,
353
- )
354
- if args.minimum_score is not None:
355
- args.number_of_peaks = np.inf
365
+ args.batch_dims = None
366
+ if hasattr(cli_args, "target_batch"):
367
+ args.batch_dims = cli_args.target_batch
368
+
369
+ peak_caller_kwargs = {
370
+ "number_of_peaks": args.number_of_peaks,
371
+ "min_distance": args.min_distance,
372
+ "min_boundary_distance": args.min_boundary_distance,
373
+ "batch_dims": args.batch_dims,
374
+ }
356
375
 
376
+ peak_caller = PEAK_CALLERS[args.peak_caller](**peak_caller_kwargs)
357
377
  peak_caller(
358
378
  scores,
359
- rotation_matrix=np.eye(3),
379
+ rotation_matrix=np.eye(template.data.ndim),
360
380
  mask=template.data,
361
381
  rotation_mapping=rotation_mapping,
362
382
  rotation_array=rotation_array,
363
383
  minimum_score=args.minimum_score,
364
384
  )
365
385
  candidates = peak_caller.merge(
366
- candidates=[tuple(peak_caller)],
367
- number_of_peaks=args.number_of_peaks,
368
- min_distance=args.min_distance,
369
- min_boundary_distance=args.min_boundary_distance,
386
+ candidates=[tuple(peak_caller)], **peak_caller_kwargs
370
387
  )
371
388
  if len(candidates) == 0:
372
- print("Found no peaks. Consider changing peak calling parameters.")
373
- exit(-1)
389
+ candidates = [[], [], [], []]
390
+ print("Found no peaks, consider changing peak calling parameters.")
391
+ exit(0)
374
392
 
375
393
  for translation, _, score, detail in zip(*candidates):
376
394
  rotations.append(rotation_mapping[rotation_array[tuple(translation)]])
@@ -381,8 +399,13 @@ def main():
381
399
  for i in range(translation.shape[0]):
382
400
  rotations.append(euler_from_rotationmatrix(rotation[i]))
383
401
 
384
- rotations = np.vstack(rotations).astype(float)
402
+ if len(rotations):
403
+ rotations = np.vstack(rotations).astype(float)
385
404
  translations, scores, details = candidates[0], candidates[2], candidates[3]
405
+
406
+ if entities is not None:
407
+ details = entities[tuple(translations.T)]
408
+
386
409
  orientations = Orientations(
387
410
  translations=translations,
388
411
  rotations=rotations,
@@ -390,14 +413,55 @@ def main():
390
413
  details=details,
391
414
  )
392
415
 
393
- if args.minimum_score is not None:
416
+ if args.minimum_score is not None and len(orientations.scores):
394
417
  keep = orientations.scores >= args.minimum_score
395
418
  orientations = orientations[keep]
396
419
 
397
- if args.maximum_score is not None:
420
+ if args.maximum_score is not None and len(orientations.scores):
398
421
  keep = orientations.scores <= args.maximum_score
399
422
  orientations = orientations[keep]
400
423
 
424
+ if args.peak_oversampling > 1:
425
+ peak_caller = peak_caller = PEAK_CALLERS[args.peak_caller]()
426
+ if data[0].ndim != data[2].ndim:
427
+ print(
428
+ "Input pickle does not contain template matching scores."
429
+ " Cannot oversample peaks."
430
+ )
431
+ exit(-1)
432
+ orientations.translations = peak_caller.oversample_peaks(
433
+ score_space=data[0],
434
+ peak_positions=orientations.translations,
435
+ oversampling_factor=args.peak_oversampling,
436
+ )
437
+
438
+ if args.local_optimization:
439
+ target = Density.from_file(cli_args.target)
440
+ orientations.translations = orientations.translations.astype(np.float32)
441
+ orientations.rotations = orientations.rotations.astype(np.float32)
442
+ for index, (translation, angles, *_) in enumerate(orientations):
443
+ score_object = create_score_object(
444
+ score="FLC",
445
+ target=target.data.copy(),
446
+ template=template.data.copy(),
447
+ template_mask=template_mask.data.copy(),
448
+ )
449
+
450
+ center = np.divide(template.shape, 2)
451
+ init_translation = np.subtract(translation, center)
452
+ bounds_translation = tuple((x - 5, x + 5) for x in init_translation)
453
+
454
+ translation, rotation_matrix, score = optimize_match(
455
+ score_object=score_object,
456
+ optimization_method="basinhopping",
457
+ bounds_translation=bounds_translation,
458
+ maxiter=3,
459
+ x0=[*init_translation, *angles],
460
+ )
461
+ orientations.translations[index] = np.add(translation, center)
462
+ orientations.rotations[index] = angles
463
+ orientations.scores[index] = score * -1
464
+
401
465
  if args.output_format == "orientations":
402
466
  orientations.to_file(filename=f"{args.output_prefix}.tsv", file_format="text")
403
467
  exit(0)
@@ -515,7 +579,6 @@ def main():
515
579
  )
516
580
  rotation_matrix = rotation.inv().as_matrix()
517
581
 
518
- # rotation_matrix = euler_to_rotationmatrix(orientations.rotations[index])
519
582
  subset = Density(target.data[obs_slices[index]])
520
583
  subset = subset.rigid_transform(rotation_matrix=rotation_matrix, order=1)
521
584
 
@@ -526,35 +589,30 @@ def main():
526
589
  ret.to_file(f"{args.output_prefix}_average.mrc")
527
590
  exit(0)
528
591
 
529
- if args.peak_oversampling > 1:
530
- peak_caller = peak_caller = PEAK_CALLERS[args.peak_caller]()
531
- if data[0].ndim != data[2].ndim:
532
- print(
533
- "Input pickle does not contain template matching scores."
534
- " Cannot oversample peaks."
535
- )
536
- exit(-1)
537
- orientations.translations = peak_caller.oversample_peaks(
538
- score_space=data[0],
539
- translations=orientations.translations,
540
- oversampling_factor=args.oversampling_factor,
541
- )
592
+ template, center, *_ = load_template(
593
+ filepath=cli_args.template,
594
+ sampling_rate=sampling_rate,
595
+ centering=not cli_args.no_centering,
596
+ target_shape=target.shape,
597
+ )
542
598
 
543
599
  for index, (translation, angles, *_) in enumerate(orientations):
544
600
  rotation_matrix = euler_to_rotationmatrix(angles)
545
601
  if template_is_density:
546
- translation = np.subtract(translation, center_of_mass)
602
+ translation = np.subtract(translation, center)
547
603
  transformed_template = template.rigid_transform(
548
604
  rotation_matrix=rotation_matrix
549
605
  )
550
- new_origin = np.add(target_origin / sampling_rate, translation)
551
- transformed_template.origin = np.multiply(new_origin, sampling_rate)
606
+ transformed_template.origin = np.add(
607
+ target_origin, np.multiply(translation, sampling_rate)
608
+ )
609
+
552
610
  else:
553
611
  template = Structure.from_file(cli_args.template)
554
612
  new_center_of_mass = np.add(
555
613
  np.multiply(translation, sampling_rate), target_origin
556
614
  )
557
- translation = np.subtract(new_center_of_mass, center_of_mass)
615
+ translation = np.subtract(new_center_of_mass, center)
558
616
  transformed_template = template.rigid_transform(
559
617
  translation=translation[::-1],
560
618
  rotation_matrix=rotation_matrix[::-1, ::-1],
@@ -789,7 +789,10 @@ class AlignmentWidget(widgets.Container):
789
789
  active_layer = self.viewer.layers.selection.active
790
790
  if active_layer is None:
791
791
  return ()
792
- return [i for i in range(active_layer.data.ndim)]
792
+ try:
793
+ return [i for i in range(active_layer.data.ndim)]
794
+ except Exception:
795
+ return ()
793
796
 
794
797
  def _update_align_axis(self, *args):
795
798
  self.align_axis.choices = self._get_active_layer_dims()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytme
3
- Version: 0.2.0b0
3
+ Version: 0.2.1
4
4
  Summary: Python Template Matching Engine
5
5
  Author: Valentin Maurer
6
6
  Author-email: Valentin Maurer <valentin.maurer@embl-hamburg.de>
@@ -22,7 +22,7 @@ Requires-Dist: scikit-learn >=1.2.1
22
22
  Requires-Dist: scipy >=1.9.1
23
23
  Requires-Dist: pybind11
24
24
  Requires-Dist: psutil
25
- Requires-Dist: tifffile[all]
25
+ Requires-Dist: tifffile
26
26
  Requires-Dist: h5py
27
27
 
28
28
  # Python Template Matching Engine (PyTME)
@@ -0,0 +1,73 @@
1
+ pytme-0.2.1.data/scripts/estimate_ram_usage.py,sha256=R1NDpFajcF-MonJ4a43SfDlA-nxBYwK7D2quzCdsVFM,2767
2
+ pytme-0.2.1.data/scripts/match_template.py,sha256=d9c_014dy4X9jFtulHkypuRqcDTCJsddA5-tt2ZUw6g,39833
3
+ pytme-0.2.1.data/scripts/postprocess.py,sha256=dg2TQpoTiQFDm1Q-l-WH3g0kIqwBEvKk-hX1QhhgjoI,23132
4
+ pytme-0.2.1.data/scripts/preprocess.py,sha256=zog-l2Je-GeouJ6SnamOMuHgTn7fFPiGnO5X03y5qSY,2527
5
+ pytme-0.2.1.data/scripts/preprocessor_gui.py,sha256=-lYdd9--xvgZghhuPE43JGycventc3tPoG4JF1wkXo0,35254
6
+ scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ scripts/estimate_ram_usage.py,sha256=rN7haobnHg3YcgGJIp81FNiCzy8-saJGeEurQlmQmNQ,2768
8
+ scripts/extract_candidates.py,sha256=j8SZNw4-F73_7o0_NorioQcyH8LatrbNX4pwfe-XC9A,8139
9
+ scripts/match_template.py,sha256=yTFtX0cZqk6Q38wtlDDTzHRRJsGLNnoVTXQeXWBH8Rc,39834
10
+ scripts/match_template_filters.py,sha256=-QnSZsGgLP5k6nH5DXINO2Yd7c1zEq_qyIDwfGB0w8o,40272
11
+ scripts/postprocess.py,sha256=L67WF7A9RIWEjr04KzHjHDg4LUpbn6h19JFKh_OyonI,23133
12
+ scripts/preprocess.py,sha256=ebJVLxbRlB6TI5YHNr0VavZ4lmaRdf8QVafyiDhh_oU,2528
13
+ scripts/preprocessor_gui.py,sha256=2-IKFVwztnvOa_G6fZ4SYsk1g6rFb3_-LMDmWSHqCno,35255
14
+ scripts/refine_matches.py,sha256=BlQqZFYdatAUAPly14xobDgqJOWvwEidjTz4pW4QBlg,14628
15
+ tme/__init__.py,sha256=MGVeRX1f5k6RwExBcffZtCM7igNNtpoIr2G2yJZ4OHI,251
16
+ tme/__version__.py,sha256=HfjVOrpTnmZ-xVFCYSVmX50EXaBQeJteUHG-PD6iQs8,22
17
+ tme/analyzer.py,sha256=esp23U15jsctbtDy1QMcUwsiBCwXbapiRfH3ZEVvwOg,61500
18
+ tme/density.py,sha256=cMfHfZSY8Ff9w7HfE-Sqigo4XKT_naht3jMtdWg4sKk,88846
19
+ tme/extensions.cpython-311-darwin.so,sha256=nIqjOFVGoKxod55SSK7hNvHxk6uTnTQ-oqkYdSsmn6Y,411792
20
+ tme/helpers.py,sha256=TMtBuJoZk6q4M_rfkr8yPpGzJD74ycqyN3yXMuU9mr4,23625
21
+ tme/matching_constrained.py,sha256=NAJnZpusjQs5rKabHiNyrclXSPm27K0V8HVFjTQ2zB0,6725
22
+ tme/matching_data.py,sha256=QeAhwgqiwCpQIghlj9wN0jCbW1UpZH55DOZWFudtXSw,24869
23
+ tme/matching_exhaustive.py,sha256=YidMx0RGnV-YdAK-tEdG9aHg06sSE3QgV-D2KMTKcZE,63676
24
+ tme/matching_memory.py,sha256=bmCAUYyXWEet-1XXhldtc0irio2ytMSsAzWYyFI5LNM,11273
25
+ tme/matching_optimization.py,sha256=wil0-5DYrqLzgFMhi-uClkt5mzp15AE_--zmmhJbdkw,43530
26
+ tme/matching_utils.py,sha256=qLcRcfMCURsA5vFvJDUBa7xIAHsICWn_PB_jOYK3Pb0,42520
27
+ tme/orientations.py,sha256=3SuKZhscTGnclOfNJCz2Rq1KiePHFytPdjuHiQi7m5Q,23929
28
+ tme/parser.py,sha256=tA9ABeV95cZn8lJCukVUaocQ9RguR6ZZzQsMXf_-ud0,13887
29
+ tme/preprocessor.py,sha256=ylVO-D1o9lpvvApXEymkmtdRrvaFd2HrJSn9nsWcMTs,51225
30
+ tme/structure.py,sha256=mIhDhGksMf8cSARr0ofNhJQUpQIdpKZtJsX63Law2z0,52503
31
+ tme/types.py,sha256=2Tyh_xnMLxIWYb3aJDAUb6GWpaL6gcYMUm2YNbJlAPI,295
32
+ tme/backends/__init__.py,sha256=xNX4Vx182F57AwZjb0DwLJA-sps6DixnDRWPcMlOvWw,4397
33
+ tme/backends/cupy_backend.py,sha256=1Wsnoo0HiIELRGb8wT9VZJ5spVEU5-DVbyyY092RixI,13230
34
+ tme/backends/jax_backend.py,sha256=uq_Vk_ofb5JG9IGg3SfHn3YqcBD9c4wWypgdCu9HTno,7372
35
+ tme/backends/matching_backend.py,sha256=eFoowia-uzc1UYAq9AnDN3CMN31rWAT1ilCskH6sruw,29876
36
+ tme/backends/mlx_backend.py,sha256=pq4U3m3-dAkSC5y6P0R1CayvVKwi5rZjTVoeG4XOQ8g,8569
37
+ tme/backends/npfftw_backend.py,sha256=_PzGKO6fuo20RofChRqq7WlfqVm-6Ne6tMPEyxB3fvE,27856
38
+ tme/backends/pytorch_backend.py,sha256=cY3KSQdLy80NVvKSMy5Jj6HzD1UDsLRQTeC2WA70Abo,18694
39
+ tme/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ tme/data/c48n309.npy,sha256=NwH64mOEbm3tStq5c98o81fY1vMOoq4nvXDAh7Z7iZg,296768
41
+ tme/data/c48n527.npy,sha256=saSUMTa1R0MisPvgFL02a7IHQSwEZ-mJu0v3qJjg5AU,506048
42
+ tme/data/c48n9.npy,sha256=bDVLV6mWjZHSQfeDc-MOCKKarfc1jaNeVvpoe2xMUy4,8768
43
+ tme/data/c48u1.npy,sha256=JeXMFzFITs2ezdc3x5lp3jo1cHHHHVADSA1Tpf77kXs,1088
44
+ tme/data/c48u1153.npy,sha256=ECiEximtYDWtIux3Fwe_EJlyn08gUqP85DN9gjkT9_k,1107008
45
+ tme/data/c48u1201.npy,sha256=aceC_Jeienz_81X4520nPpZcg5tnRhbW795EqbpWkrg,1153088
46
+ tme/data/c48u1641.npy,sha256=p4LwW3LzdTjrUUpA7H53RfNWxYfPX0XjeSwZ39Ac78Q,1575488
47
+ tme/data/c48u181.npy,sha256=mLYXrv1YHLH6DsBp5MkxHkxlxgMnj1mw_KKI0udH-FY,173888
48
+ tme/data/c48u2219.npy,sha256=p8TQeX8YHu4pdxnwJjEAlQWAPa66W7kpK96iZKZr9JE,2130368
49
+ tme/data/c48u27.npy,sha256=k03ZNEsoPwBKCy8IeIa5G0WRZqjGZMtX6Ibu7EpJHvU,26048
50
+ tme/data/c48u2947.npy,sha256=icI97ED6ct66y7FIaJAugmjzrIWk7CINCxtO3wDTnrU,2829248
51
+ tme/data/c48u3733.npy,sha256=tla-__Pf-hpN6h04vtFIfkkFdCLple11VO06kr1dXkM,3583808
52
+ tme/data/c48u4749.npy,sha256=tItOA4oV7SiqCCREwz3fyEpZoxM0lCq_jfEo5_-fp2s,4559168
53
+ tme/data/c48u5879.npy,sha256=bFk89MllIFCX_sLXTYWFquSyN1NuahH4wwnEsPJLxzA,5643968
54
+ tme/data/c48u7111.npy,sha256=CMy9kI2edH-q9eTIVdgUtXurplYNI7Uqp4dXfkkVdf8,6826688
55
+ tme/data/c48u815.npy,sha256=bCuJxLtm0Sjg3GGxtyjGzRYZ1G0Gz79XHI-71GvqQnI,782528
56
+ tme/data/c48u83.npy,sha256=7ODJYnsiuDjGbgd9GFopsyIW2IjrYI0J2X2f-cK868U,79808
57
+ tme/data/c48u8649.npy,sha256=-IPlpR4zrPQZWhhSPu4zEulFdrCEVgTMFffCB5d-huE,8303168
58
+ tme/data/c600v.npy,sha256=JqSu3ALoL1A9iguehc0YGUMFPsh2fprHHp76VXeFXIw,2528
59
+ tme/data/c600vc.npy,sha256=Yht-GFXDSjjGvsjFBvyxxEZAI-ODADPd5gEgFNZQVTA,14528
60
+ tme/data/metadata.yaml,sha256=fAgX-mEzB0QMHTEtYDG4cSMbJhYxBbDJH3sdvJvL7a8,750
61
+ tme/data/quat_to_numpy.py,sha256=-gkDZb10fKBxwfYrSLCUWvMB76TzZWELCeKsYProwws,1333
62
+ tme/preprocessing/__init__.py,sha256=7O3vDzJcIfxovJkf7avWSPtzaIVlTbmsW7egQFukC_s,98
63
+ tme/preprocessing/_utils.py,sha256=jj5VSRLewO4uk0cHoEhpw2rTU9taT8iuZCijvbFcrw0,5190
64
+ tme/preprocessing/composable_filter.py,sha256=sp3bN8JeFB2r384cEIgvN6yXjC53GCoPhBmGI0S0kbI,781
65
+ tme/preprocessing/compose.py,sha256=tbQMo3LaKRBnOFKoqZ64as3i0t6U6312s76Csz0FPvk,1324
66
+ tme/preprocessing/frequency_filters.py,sha256=k3MvXTBeoETTp5WINpqxEcmhiHSFh90QyAJBXe-fGxs,12614
67
+ tme/preprocessing/tilt_series.py,sha256=OaYMuN4e0F5Z7tuNVwG_kn69E4zPAU6_xIoA5B-IQUw,34747
68
+ pytme-0.2.1.dist-info/LICENSE,sha256=K1IUNSVAz8BXbpH5EA8y5FpaHdvFXnAF2zeK95Lr2bY,18467
69
+ pytme-0.2.1.dist-info/METADATA,sha256=pTq0YVA2oWM7Zo8p-lk6ynkuZsEHAPnDDEbzcbEon_4,2165
70
+ pytme-0.2.1.dist-info/WHEEL,sha256=BDgKu9_KNfDn85ptly0T56JpX4avXH07X_ZCqAJnQwY,110
71
+ pytme-0.2.1.dist-info/entry_points.txt,sha256=ff3LQL3FCWfCYOwFiP9zatm7laUbnwCkuPELkQVyUO4,241
72
+ pytme-0.2.1.dist-info/top_level.txt,sha256=J8FUkazOb2fZ0n_KexnqCGyNOtie2bwisFSUBiM5-0w,12
73
+ pytme-0.2.1.dist-info/RECORD,,