pytme 0.2.9.post1__cp311-cp311-macosx_15_0_arm64.whl → 0.3b0.post1__cp311-cp311-macosx_15_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 (74) hide show
  1. pytme-0.3b0.post1.data/scripts/estimate_memory_usage.py +76 -0
  2. pytme-0.3b0.post1.data/scripts/match_template.py +1098 -0
  3. {pytme-0.2.9.post1.data → pytme-0.3b0.post1.data}/scripts/postprocess.py +318 -189
  4. {pytme-0.2.9.post1.data → pytme-0.3b0.post1.data}/scripts/preprocess.py +21 -31
  5. {pytme-0.2.9.post1.data → pytme-0.3b0.post1.data}/scripts/preprocessor_gui.py +12 -12
  6. pytme-0.3b0.post1.data/scripts/pytme_runner.py +769 -0
  7. {pytme-0.2.9.post1.dist-info → pytme-0.3b0.post1.dist-info}/METADATA +21 -20
  8. pytme-0.3b0.post1.dist-info/RECORD +126 -0
  9. {pytme-0.2.9.post1.dist-info → pytme-0.3b0.post1.dist-info}/entry_points.txt +2 -1
  10. pytme-0.3b0.post1.dist-info/licenses/LICENSE +339 -0
  11. scripts/estimate_memory_usage.py +76 -0
  12. scripts/eval.py +93 -0
  13. scripts/extract_candidates.py +224 -0
  14. scripts/match_template.py +341 -378
  15. pytme-0.2.9.post1.data/scripts/match_template.py → scripts/match_template_filters.py +213 -148
  16. scripts/postprocess.py +318 -189
  17. scripts/preprocess.py +21 -31
  18. scripts/preprocessor_gui.py +12 -12
  19. scripts/pytme_runner.py +769 -0
  20. scripts/refine_matches.py +625 -0
  21. tests/preprocessing/test_frequency_filters.py +28 -14
  22. tests/test_analyzer.py +41 -36
  23. tests/test_backends.py +1 -0
  24. tests/test_matching_cli.py +109 -54
  25. tests/test_matching_data.py +5 -5
  26. tests/test_matching_exhaustive.py +1 -2
  27. tests/test_matching_optimization.py +4 -9
  28. tests/test_matching_utils.py +1 -1
  29. tests/test_orientations.py +0 -1
  30. tme/__version__.py +1 -1
  31. tme/analyzer/__init__.py +2 -0
  32. tme/analyzer/_utils.py +26 -21
  33. tme/analyzer/aggregation.py +395 -222
  34. tme/analyzer/base.py +127 -0
  35. tme/analyzer/peaks.py +189 -204
  36. tme/analyzer/proxy.py +123 -0
  37. tme/backends/__init__.py +4 -3
  38. tme/backends/_cupy_utils.py +25 -24
  39. tme/backends/_jax_utils.py +20 -18
  40. tme/backends/cupy_backend.py +13 -26
  41. tme/backends/jax_backend.py +24 -23
  42. tme/backends/matching_backend.py +4 -3
  43. tme/backends/mlx_backend.py +4 -3
  44. tme/backends/npfftw_backend.py +34 -30
  45. tme/backends/pytorch_backend.py +18 -4
  46. tme/cli.py +126 -0
  47. tme/density.py +9 -7
  48. tme/filters/__init__.py +3 -3
  49. tme/filters/_utils.py +36 -10
  50. tme/filters/bandpass.py +229 -188
  51. tme/filters/compose.py +5 -4
  52. tme/filters/ctf.py +516 -254
  53. tme/filters/reconstruction.py +91 -32
  54. tme/filters/wedge.py +196 -135
  55. tme/filters/whitening.py +37 -42
  56. tme/matching_data.py +28 -39
  57. tme/matching_exhaustive.py +31 -27
  58. tme/matching_optimization.py +5 -4
  59. tme/matching_scores.py +25 -15
  60. tme/matching_utils.py +54 -9
  61. tme/memory.py +4 -3
  62. tme/orientations.py +22 -9
  63. tme/parser.py +114 -33
  64. tme/preprocessor.py +6 -5
  65. tme/rotations.py +10 -7
  66. tme/structure.py +4 -3
  67. pytme-0.2.9.post1.data/scripts/estimate_ram_usage.py +0 -97
  68. pytme-0.2.9.post1.dist-info/RECORD +0 -119
  69. pytme-0.2.9.post1.dist-info/licenses/LICENSE +0 -153
  70. scripts/estimate_ram_usage.py +0 -97
  71. tests/data/Maps/.DS_Store +0 -0
  72. tests/data/Structures/.DS_Store +0 -0
  73. {pytme-0.2.9.post1.dist-info → pytme-0.3b0.post1.dist-info}/WHEEL +0 -0
  74. {pytme-0.2.9.post1.dist-info → pytme-0.3b0.post1.dist-info}/top_level.txt +0 -0
tme/memory.py CHANGED
@@ -1,8 +1,9 @@
1
- """ Compute memory consumption of template matching components.
1
+ """
2
+ Compute memory consumption of template matching components.
2
3
 
3
- Copyright (c) 2023 European Molecular Biology Laboratory
4
+ Copyright (c) 2023 European Molecular Biology Laboratory
4
5
 
5
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
7
  """
7
8
 
8
9
  from abc import ABC, abstractmethod
tme/orientations.py CHANGED
@@ -1,10 +1,11 @@
1
- #!python3
2
- """ Handle template matching orientations and conversion between formats.
1
+ """
2
+ Handle template matching orientations and conversion between formats.
3
3
 
4
- Copyright (c) 2024 European Molecular Biology Laboratory
4
+ Copyright (c) 2024 European Molecular Biology Laboratory
5
5
 
6
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
7
7
  """
8
+
8
9
  from typing import List, Tuple
9
10
  from dataclasses import dataclass
10
11
  from string import ascii_lowercase, ascii_uppercase
@@ -14,7 +15,7 @@ import numpy as np
14
15
  from .parser import StarParser
15
16
  from .matching_utils import compute_extraction_box
16
17
 
17
- # Exceeds available numpy dimensions for default installations.
18
+ # Exceeds available numpy dimensions for default installations
18
19
  NAMES = ["x", "y", "z", *ascii_lowercase[:-3], *ascii_uppercase]
19
20
 
20
21
 
@@ -81,7 +82,7 @@ class Orientations:
81
82
  self.translations = np.array(self.translations).astype(np.float32)
82
83
  self.rotations = np.array(self.rotations).astype(np.float32)
83
84
  self.scores = np.array(self.scores).astype(np.float32)
84
- self.details = np.array(self.details).astype(np.float32)
85
+ self.details = np.array(self.details)
85
86
  n_orientations = set(
86
87
  [
87
88
  self.translations.shape[0],
@@ -324,6 +325,7 @@ class Orientations:
324
325
  "_rlnAngleRot",
325
326
  "_rlnAngleTilt",
326
327
  "_rlnAnglePsi",
328
+ "_rlnClassNumber",
327
329
  ]
328
330
  if source_path is not None:
329
331
  header.append("_rlnMicrographName")
@@ -339,6 +341,7 @@ class Orientations:
339
341
  for index, (translation, rotation, score, detail) in enumerate(self):
340
342
  line = [str(x) for x in translation]
341
343
  line.extend([str(x) for x in rotation])
344
+ line.extend([str(detail)])
342
345
 
343
346
  if source_path is not None:
344
347
  line.append(source_path)
@@ -489,9 +492,12 @@ class Orientations:
489
492
  def _from_star(
490
493
  cls, filename: str, delimiter: str = "\t"
491
494
  ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
492
- ret = StarParser(filename, delimiter=delimiter)
495
+ parser = StarParser(filename, delimiter=delimiter)
496
+
497
+ ret = parser.get("data_particles", None)
498
+ if ret is None:
499
+ ret = parser.get("data_", None)
493
500
 
494
- ret = ret.get("data_particles", None)
495
501
  if ret is None:
496
502
  raise ValueError(f"No data_particles section found in {filename}.")
497
503
 
@@ -500,13 +506,20 @@ class Orientations:
500
506
  )
501
507
  translation = translation.astype(np.float32).T
502
508
 
509
+ default_angle = np.zeros(translation.shape[0], dtype=np.float32)
510
+ for x in ("_rlnAngleRot", "_rlnAngleTilt", "_rlnAnglePsi"):
511
+ if x not in ret:
512
+ ret[x] = default_angle
513
+
503
514
  rotation = np.vstack(
504
515
  (ret["_rlnAngleRot"], ret["_rlnAngleTilt"], ret["_rlnAnglePsi"])
505
516
  )
506
517
  rotation = rotation.astype(np.float32).T
507
518
 
508
519
  default = np.zeros(translation.shape[0])
509
- return translation, rotation, default, default
520
+
521
+ scores = ret.get("_pytmeScore", default)
522
+ return translation, rotation, scores, default
510
523
 
511
524
  @staticmethod
512
525
  def _from_tbl(
tme/parser.py CHANGED
@@ -1,8 +1,9 @@
1
- """ Implements parsers for atomic structure file formats.
1
+ """
2
+ Implements parsers for atomic structure file formats.
2
3
 
3
- Copyright (c) 2023 European Molecular Biology Laboratory
4
+ Copyright (c) 2023 European Molecular Biology Laboratory
4
5
 
5
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
7
  """
7
8
 
8
9
  import re
@@ -15,7 +16,14 @@ from typing import List, Dict, Union
15
16
 
16
17
  import numpy as np
17
18
 
18
- __all__ = ["PDBParser", "MMCIFParser", "GROParser", "StarParser", "XMLParser"]
19
+ __all__ = [
20
+ "PDBParser",
21
+ "MMCIFParser",
22
+ "GROParser",
23
+ "StarParser",
24
+ "XMLParser",
25
+ "MDOCParser",
26
+ ]
19
27
 
20
28
 
21
29
  class Parser(ABC):
@@ -84,6 +92,34 @@ class Parser(ABC):
84
92
  """
85
93
  return key in self._data
86
94
 
95
+ def __repr__(self) -> str:
96
+ """
97
+ String representation of the Parser showing available keys and their lengths.
98
+
99
+ Returns
100
+ -------
101
+ str
102
+ A formatted string showing each key and the length of its value.
103
+ """
104
+ if not self._data:
105
+ return f"{self.__class__.__name__}(empty)"
106
+
107
+ lines = [f"{self.__class__.__name__}:"]
108
+ try:
109
+ for key, value in sorted(self._data.items()):
110
+ if isinstance(value, (list, tuple)):
111
+ lines.append(f" {key}: length {len(value)}")
112
+ elif isinstance(value, dict):
113
+ lines.append(f" {key}: dict with {len(value)} keys")
114
+ elif isinstance(value, str):
115
+ lines.append(f" {key}: str")
116
+ else:
117
+ lines.append(f" {key}: {type(value).__name__}")
118
+ except Exception:
119
+ pass
120
+
121
+ return "\n".join(lines)
122
+
87
123
  def get(self, key, default=None):
88
124
  """
89
125
  Retrieve a value from the internal data using a given key. If the
@@ -247,19 +283,6 @@ class MMCIFParser(Parser):
247
283
  """
248
284
 
249
285
  def parse_input(self, lines: deque) -> Dict:
250
- """
251
- Parse a list of lines from an MMCIF file and convert the data into a dictionary.
252
-
253
- Parameters
254
- ----------
255
- lines : deque of str
256
- The lines of an MMCIF file to parse.
257
-
258
- Returns
259
- -------
260
- dict
261
- A dictionary containing the parsed data from the MMCIF file.
262
- """
263
286
  lines = self._consolidate_strings(lines)
264
287
  blocks = self._split_in_blocks(lines)
265
288
  mmcif_dict = {}
@@ -448,21 +471,6 @@ class GROParser(Parser):
448
471
  """
449
472
 
450
473
  def parse_input(self, lines, **kwargs) -> Dict:
451
- """
452
- Parse a list of lines from a GRO file and convert the data into a dictionary.
453
-
454
- Parameters
455
- ----------
456
- lines : deque of str
457
- The lines of a GRO file to parse.
458
- kwargs : Dict, optional
459
- Optional keyword arguments.
460
-
461
- Returns
462
- -------
463
- dict
464
- A dictionary containing the parsed data from the GRO file.
465
- """
466
474
  data = {
467
475
  "title": [],
468
476
  "num_atoms": [],
@@ -560,7 +568,7 @@ class StarParser(MMCIFParser):
560
568
  .. [1] https://www.iucr.org/__data/assets/file/0013/11416/star.5.html
561
569
  """
562
570
 
563
- def parse_input(self, lines: List[str], delimiter: str = "\t") -> Dict:
571
+ def parse_input(self, lines: List[str], delimiter: str = None) -> Dict:
564
572
  pattern = re.compile(r"\s*#.*")
565
573
 
566
574
  ret, category, block = {}, None, []
@@ -683,3 +691,76 @@ class XMLParser(Parser):
683
691
  pass
684
692
 
685
693
  return value_str
694
+
695
+
696
+ class MDOCParser(Parser):
697
+ """
698
+ Convert MDOC file (SerialEM metadata) into a dictionary representation.
699
+
700
+ MDOC files contain global parameters and per-tilt metadata for cryo-ET
701
+ tilt series, with sections marked by [ZValue = N] for individual tilts.
702
+ """
703
+
704
+ def parse_input(self, lines: deque, **kwargs) -> Dict:
705
+ data = {}
706
+ global_params = {}
707
+ in_zvalue_section = False
708
+ zvalue_pattern = re.compile(r"\[ZValue\s*=\s*(\d+)\]")
709
+ section_pattern = re.compile(r"\[T\s*=\s*(.*?)\]")
710
+
711
+ if not lines:
712
+ return data
713
+
714
+ while lines:
715
+ line = lines.popleft().strip()
716
+
717
+ if not line:
718
+ continue
719
+
720
+ # Check for ZValue section header
721
+ zvalue_match = zvalue_pattern.match(line)
722
+ if zvalue_match:
723
+ in_zvalue_section = True
724
+
725
+ zvalue = int(zvalue_match.group(1))
726
+ if "ZValue" not in data:
727
+ data["ZValue"] = []
728
+ data["ZValue"].append(zvalue)
729
+ continue
730
+
731
+ # Check for T section header (comments/metadata)
732
+ section_match = section_pattern.match(line)
733
+ if section_match:
734
+ section_content = section_match.group(1)
735
+ if "sections" not in global_params:
736
+ global_params["sections"] = []
737
+ global_params["sections"].append(section_content)
738
+ continue
739
+
740
+ # Parse key-value pairs
741
+ if "=" in line:
742
+ try:
743
+ key, value = line.split("=", 1)
744
+ key = key.strip()
745
+ value = value.strip()
746
+
747
+ try:
748
+ if "." not in value and "e" not in value.lower():
749
+ parsed_value = int(value)
750
+ else:
751
+ parsed_value = float(value)
752
+ except ValueError:
753
+ parsed_value = value
754
+
755
+ if not in_zvalue_section:
756
+ global_params[key] = parsed_value
757
+ else:
758
+ if key not in data:
759
+ data[key] = []
760
+ data[key].append(parsed_value)
761
+
762
+ except ValueError:
763
+ continue
764
+
765
+ data.update(global_params)
766
+ return data
tme/preprocessor.py CHANGED
@@ -1,8 +1,9 @@
1
- """ Implements Preprocessor class for filtering operations.
1
+ """
2
+ Implements Preprocessor class for filtering operations.
2
3
 
3
- Copyright (c) 2023 European Molecular Biology Laboratory
4
+ Copyright (c) 2023 European Molecular Biology Laboratory
4
5
 
5
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
7
  """
7
8
 
8
9
  import os
@@ -669,9 +670,9 @@ class Preprocessor:
669
670
  NDArray
670
671
  Bandpass filtered.
671
672
  """
672
- from .filters import BandPassFilter
673
+ from .filters import BandPassReconstructed
673
674
 
674
- return BandPassFilter(
675
+ return BandPassReconstructed(
675
676
  sampling_rate=sampling_rate,
676
677
  lowpass=lowpass,
677
678
  highpass=highpass,
tme/rotations.py CHANGED
@@ -1,8 +1,9 @@
1
- """ Implements various means of generating rotation matrices.
1
+ """
2
+ Implements various means of generating rotation matrices.
2
3
 
3
- Copyright (c) 2023-2025 European Molecular Biology Laboratory
4
+ Copyright (c) 2023-2025 European Molecular Biology Laboratory
4
5
 
5
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
7
  """
7
8
 
8
9
  import yaml
@@ -183,12 +184,14 @@ def euler_to_rotationmatrix(angles: Tuple[float], seq: str = "zyz") -> NDArray:
183
184
  NDArray
184
185
  The generated rotation matrix.
185
186
  """
187
+ angles = np.asarray(angles)
188
+
186
189
  n_angles = len(angles)
187
- angle_convention = seq[:n_angles]
188
- if n_angles == 1:
189
- angles = (angles, 0, 0)
190
+ if angles.ndim == 2:
191
+ n_angles = angles.shape[1]
192
+
190
193
  rotation_matrix = Rotation.from_euler(
191
- seq=angle_convention, angles=angles, degrees=True
194
+ seq=seq[:n_angles], angles=angles, degrees=True
192
195
  )
193
196
  return rotation_matrix.as_matrix().astype(np.float32)
194
197
 
tme/structure.py CHANGED
@@ -1,8 +1,9 @@
1
- """ Implements class Structure to represent atomic structures.
1
+ """
2
+ Implements class Structure to represent atomic structures.
2
3
 
3
- Copyright (c) 2023 European Molecular Biology Laboratory
4
+ Copyright (c) 2023 European Molecular Biology Laboratory
4
5
 
5
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
+ Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
6
7
  """
7
8
 
8
9
  import warnings
@@ -1,97 +0,0 @@
1
- #!python
2
- """ Estimate RAM requirements for template matching jobs.
3
-
4
- Copyright (c) 2023 European Molecular Biology Laboratory
5
-
6
- Author: Valentin Maurer <valentin.maurer@embl-hamburg.de>
7
- """
8
- import numpy as np
9
- import argparse
10
- from tme import Density
11
- from tme.matching_utils import estimate_ram_usage
12
- from tme.matching_exhaustive import MATCHING_EXHAUSTIVE_REGISTER
13
-
14
-
15
- def parse_args():
16
- parser = argparse.ArgumentParser(
17
- description="Estimate RAM usage for template matching."
18
- )
19
- parser.add_argument(
20
- "-m",
21
- "--target",
22
- dest="target",
23
- type=str,
24
- required=True,
25
- help="Path to a target in CCP4/MRC format.",
26
- )
27
- parser.add_argument(
28
- "-i",
29
- "--template",
30
- dest="template",
31
- type=str,
32
- required=True,
33
- help="Path to a template in PDB/MMCIF or CCP4/MRC format.",
34
- )
35
- parser.add_argument(
36
- "--matching_method",
37
- required=False,
38
- default=None,
39
- help="Analyzer method to use.",
40
- )
41
- parser.add_argument(
42
- "-s",
43
- dest="score",
44
- type=str,
45
- default="FLCSphericalMask",
46
- help="Template matching scoring function.",
47
- choices=MATCHING_EXHAUSTIVE_REGISTER.keys(),
48
- )
49
- parser.add_argument(
50
- "--ncores", type=int, help="Number of cores for parallelization.", required=True
51
- )
52
- parser.add_argument(
53
- "--no_edge_padding",
54
- dest="no_edge_padding",
55
- action="store_true",
56
- default=False,
57
- help="Whether to pad the edges of the target. This is useful, if the target"
58
- " has a well defined bounding box, e.g. a density map.",
59
- )
60
- parser.add_argument(
61
- "--no_fourier_padding",
62
- dest="no_fourier_padding",
63
- action="store_true",
64
- default=False,
65
- help="Whether input arrays should be zero-padded to the full convolution shape"
66
- " for numerical stability. When working with very large targets such as"
67
- " tomograms it is safe to use this flag and benefit from the performance gain.",
68
- )
69
- args = parser.parse_args()
70
- return args
71
-
72
-
73
- def main():
74
- args = parse_args()
75
- target = Density.from_file(args.target)
76
- template = Density.from_file(args.template)
77
-
78
- target_box = target.shape
79
- if not args.no_edge_padding:
80
- target_box = np.add(target_box, template.shape)
81
-
82
- template_box = template.shape
83
- if args.no_fourier_padding:
84
- template_box = np.ones(len(template_box), dtype=int)
85
-
86
- result = estimate_ram_usage(
87
- shape1=target_box,
88
- shape2=template_box,
89
- matching_method=args.score,
90
- ncores=args.ncores,
91
- analyzer_method="MaxScoreOverRotations",
92
- )
93
- print(result)
94
-
95
-
96
- if __name__ == "__main__":
97
- main()
@@ -1,119 +0,0 @@
1
- pytme-0.2.9.post1.data/scripts/estimate_ram_usage.py,sha256=R1NDpFajcF-MonJ4a43SfDlA-nxBYwK7D2quzCdsVFM,2767
2
- pytme-0.2.9.post1.data/scripts/match_template.py,sha256=k_PACJyQfVBwB7zJiFvkurTtsnej_h6LEnvajZjJkus,39558
3
- pytme-0.2.9.post1.data/scripts/postprocess.py,sha256=Wlbn284vN-Jjo2qpzNNsnW0zOHHHGLQEMeQp5RQJjZk,22759
4
- pytme-0.2.9.post1.data/scripts/preprocess.py,sha256=7NJRUmPGaSFpGSA5C8f4JUzajRo6alMJ4aEprIyS0oo,6512
5
- pytme-0.2.9.post1.data/scripts/preprocessor_gui.py,sha256=2b_xqZwEdB7GKmwWGu5Z4qewN71XZcEa1OVTe-15YF0,41789
6
- pytme-0.2.9.post1.dist-info/licenses/LICENSE,sha256=K1IUNSVAz8BXbpH5EA8y5FpaHdvFXnAF2zeK95Lr2bY,18467
7
- scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- scripts/estimate_ram_usage.py,sha256=rN7haobnHg3YcgGJIp81FNiCzy8-saJGeEurQlmQmNQ,2768
9
- scripts/match_template.py,sha256=8OkGMpvJe35mNVP9EMRd1KOTTrvMm9xB0OHLVkNlTV4,39559
10
- scripts/postprocess.py,sha256=TnmNY6b2GUOr_dZoi1F71TPpOzyhffmUULRs79LLefQ,22760
11
- scripts/preprocess.py,sha256=GP8lPh_rqFv_CDkPTeFbve_tC1Y7KQZl1YrD9w9wvT4,6513
12
- scripts/preprocessor_gui.py,sha256=8P-xhufzTeH0qEH08ZbF9onHFTq-5FinnhNaNbEv8Lg,41790
13
- tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- tests/test_analyzer.py,sha256=fMuY0WCh1_D1XdzaryKzq3Mj9Q3pJFpWCNeEO-DYY20,7949
15
- tests/test_backends.py,sha256=29HlacgrX4fRjFXfzNNh3yDjqHRd7WvCFpTpRQwAsmA,17541
16
- tests/test_density.py,sha256=vzzy0Gk3uUR096aZgA-e5gOfLnw9qG3RH-xyXtHCO_I,18971
17
- tests/test_extensions.py,sha256=1Zv9dG_dmmC2mlbX91YIPyGLSToPC0202-ffLAfVcr4,5203
18
- tests/test_matching_cli.py,sha256=VoGVi4QhakccVbC3pIQzEwaL97Zgi2Ll4np1zVqdpvo,9345
19
- tests/test_matching_data.py,sha256=TyvnSJPzdLPiXYWdz9coQ-m4H1tUS_cbD0WaBdvrevg,6062
20
- tests/test_matching_exhaustive.py,sha256=2_uG8Ir8QUyvGXMHcsBRdvr27j83cgpd53FnRyIkF8M,4055
21
- tests/test_matching_memory.py,sha256=XrBGRi4cIp3-4nN6s7tj0pBbFJrvJaG3vQdtK-6uzY0,1151
22
- tests/test_matching_optimization.py,sha256=KBmFojKpr1iC_T90vpsrvZoEeFzI41xmejC-WuINZGU,7941
23
- tests/test_matching_utils.py,sha256=9wJPKh5LF_Vb75pKbXy-JT8u_FGLfWioA7nFcOkAto4,6356
24
- tests/test_orientations.py,sha256=HtCYJB_XGMLjWEvTfCXSxKpE_FvrGg5Uk39dn1zB-4g,6837
25
- tests/test_parser.py,sha256=57oaksWrKNB4Z_22IxfW0nXMyQWLJFVsuvnJQPhMn10,993
26
- tests/test_rotations.py,sha256=CTEkpO8Z-6afgCIk2wGexXBaOqUeGJL2-krm1z4YRFY,5358
27
- tests/test_structure.py,sha256=Qgrex3wYl9TpFLcqMeUOkq-7w93bzEsMNStKdJdsbnw,8881
28
- tests/data/README.md,sha256=RMyG_mojKLo6AEIHUj40nTPI7ZGcs_6dRzWSRGxTgGY,83
29
- tests/data/Blurring/blob_width18.npy,sha256=_BVu5T2q_8N5lA2KCMUTLwknec8fHXh9Nsyoa4ov0wo,21408
30
- tests/data/Blurring/edgegaussian_sigma3.npy,sha256=OvxXAyJs5V_m7b91BFhBqS9BnisKWbckVcMlHuChQiY,21408
31
- tests/data/Blurring/gaussian_sigma2.npy,sha256=OS9sNpu0Y7l--X8dyB-mp-EE5eaNHISqiNkOOutllfc,21408
32
- tests/data/Blurring/hamming_width6.npy,sha256=yKdrOYGfHn-ER7GpTzASqfLZHkAR7AFeBcNRXrs4aIg,21408
33
- tests/data/Blurring/kaiserb_width18.npy,sha256=08grtR1E2dWRfksiPrEdN0nQwugd6o-TV5lKwnuLXQg,21408
34
- tests/data/Blurring/localgaussian_sigma0510.npy,sha256=KXASnlhxAnvvcgIDCniIHkak-NhsF_QmSV7j-p9kSk4,21408
35
- tests/data/Blurring/mean_size5.npy,sha256=2APwsCR_1fpwGIc_mG0dPegpcbgXhUbcEEeQo9Wa1iA,42688
36
- tests/data/Blurring/ntree_sigma0510.npy,sha256=HxYh_ItxdKulp8UiPMzQ0ze2iiQ3Oi7seWFvEzO1kWQ,21408
37
- tests/data/Blurring/rank_rank3.npy,sha256=MxCsomoNPmiV0Cd-5nl2S8TYCfLyEj-WV19gLH_xe0c,21408
38
- tests/data/Maps/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
39
- tests/data/Maps/emd_8621.mrc.gz,sha256=ZAlSOQRT9B_e8xpeodio9j0WBzygl2R1ctg9m8QhCRA,4572566
40
- tests/data/Raw/em_map.map,sha256=YeY_R0p-90-oZgxfbKGIsyE5bui_uWq9iGhWl0bLYZI,22304
41
- tests/data/Structures/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
42
- tests/data/Structures/1pdj.cif,sha256=QdO4e2ulO621PVoK3q9n0qDPDKnzJpV6sPeG6zQec1A,169343
43
- tests/data/Structures/1pdj.pdb,sha256=nTFGjecultoXNVUBDdsyho0CEzX5i1fSo_aBYDh5-pU,115749
44
- tests/data/Structures/5khe.cif,sha256=SnC0so37wyuoYwAX5UDTTLvQiknZXxeJrvkGai-11rw,214644
45
- tests/data/Structures/5khe.ent,sha256=AjXInxR_DgglZATzSNgB1rs7-LgAn2G1NdgnHb6fAmM,179010
46
- tests/data/Structures/5khe.pdb,sha256=AjXInxR_DgglZATzSNgB1rs7-LgAn2G1NdgnHb6fAmM,179010
47
- tests/data/Structures/5uz4.cif,sha256=KIcBaOf-RvOV4VRl1AU_EK4BsMxGXS8s8_UdlIhyeWk,6079401
48
- tests/preprocessing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- tests/preprocessing/test_compose.py,sha256=z44fgQhxJU0-zHSV0CLBMEJqwhK5gEFDhUCLuVsQpQc,2490
50
- tests/preprocessing/test_frequency_filters.py,sha256=rFms5nQb6KzxQE2IvMu37u8f15kTcN5tD7gr3v5Z-Jo,6610
51
- tests/preprocessing/test_preprocessor.py,sha256=XyR4xc4YM76PUKuTIiive76Q85DdcyDAvbXNGcoKL8w,4820
52
- tests/preprocessing/test_utils.py,sha256=2V1a9XtFZYmCyQzgsj0qWzWuXg-JAsOoG5_rtTwxvGg,3031
53
- tme/__init__.py,sha256=GXfIuzU4fh2KZfgUOIXnNeKlJ8kSp3EqoBr6bSik848,217
54
- tme/__version__.py,sha256=F8OVhAhMXSkvvXYgZtbPn2SG1AQC3joK4yu-FrHt81Y,22
55
- tme/density.py,sha256=vCBZHtMyQZ1lr0sTGfPa7RP-TpPf22etRHDzeL7yqaM,82424
56
- tme/extensions.cpython-311-darwin.so,sha256=vNaZYhhSrVlCjBlj5nzpKcnnJ_L_-84WhTRz2kWYK2Y,395696
57
- tme/matching_data.py,sha256=hhtjQl_EimGGmyR2DHiZi82Aeq3xmNF98koevZT7mKc,31238
58
- tme/matching_exhaustive.py,sha256=VXWOMaLF9m_31d9Hy3mn-PuUBJ0zgsTRb5v4sdRvJPU,18817
59
- tme/matching_optimization.py,sha256=wQ8k1VBK74twymogr_1LIOjNlhr_Nyl8CN4XxjEADHQ,45688
60
- tme/matching_scores.py,sha256=A8558Yj1lCEbcLYeevoVXMfhO3jILZeO3ztgp8gA9Xo,41023
61
- tme/matching_utils.py,sha256=Oa7ytvvaSyck6PSci3XBoakgz8-9tL8Qtv2Sx7P3pVo,36362
62
- tme/memory.py,sha256=gRKOsputjOjpVhqgrLn2q8JfSCiXGtRdV8wd9XG_Fho,9687
63
- tme/orientations.py,sha256=yQKJaYQWkBqDOIYFmVDP47rjdvqwoAHBCvmpu36qoOo,21023
64
- tme/parser.py,sha256=bqgJ9FPecbnvqFF-xZhRZOwPxawtMqs69SEGS3oaxWQ,21565
65
- tme/preprocessor.py,sha256=AafqtzBXX0OywZ6B8J0IBtZPMWCGhnJStbqZviRJPBc,40371
66
- tme/rotations.py,sha256=CO35CwD7qHxmiUSFBqFU9y-O4tRM8BKp-U7d52y2eLs,10630
67
- tme/structure.py,sha256=EktAzR_t0cK5J0iBiWlDDGw1okFoiEQgwACAIRDNdgY,72143
68
- tme/types.py,sha256=NAY7C4qxE6yz-DXVtClMvFfoOV-spWGLNfpLATZ1LcU,442
69
- tme/analyzer/__init__.py,sha256=DgEulEr9nERtXttTpmEeL8pNLCW-OxGWB4PMMCQ0INs,48
70
- tme/analyzer/_utils.py,sha256=ioG90NdGGyjC1bXLu9cdBSPFStOG2n5GlPOeS_0SFGs,6083
71
- tme/analyzer/aggregation.py,sha256=NYk9EWr670GmYO0gTJ5AalpCbDh30SEAfoA59m6IMGA,21104
72
- tme/analyzer/peaks.py,sha256=dVIJ1zCT7XPJSVK368uFdVcj7DcwRJYKJQbG9VhEDbQ,33028
73
- tme/backends/__init__.py,sha256=iGTq1c9CR0ZCAj9uOY6DzqPePYG0ZVvv637FukH-I7I,5257
74
- tme/backends/_cupy_utils.py,sha256=tzfoR-WyHViSY1E39mKoO5os-1L8zpChIdbf52QN0t4,24650
75
- tme/backends/_jax_utils.py,sha256=Bo47XU338rNdJ-BNLR4XKmbnnlAz8zxeLQomTNhgLmk,5907
76
- tme/backends/cupy_backend.py,sha256=4kzqTmcQET1ZySkwK_z5noxmKYTAsxRpIzV4M9E3kjs,10246
77
- tme/backends/jax_backend.py,sha256=m3GdCJXgDeBofOwYGz1GwnoxrLyjVh1gh6oJhZEIiwE,11050
78
- tme/backends/matching_backend.py,sha256=o0L5P80yN3E7KbjfcsgNjICc6kEaVlACxlc2WdCq0wc,34864
79
- tme/backends/mlx_backend.py,sha256=gMAxk7ue2xocSmdLzBj3H-jbVUCKZ5Q13TDpK4kyqV8,7764
80
- tme/backends/npfftw_backend.py,sha256=BMHRkT0MRLiVCdfkG6GuBINO8lYQ9lb9vjzOMBYAGHc,19295
81
- tme/backends/pytorch_backend.py,sha256=t1sNfLU_gt8XrbPaRhO2MGvp-YKUptpSLge3zxJeZwo,14800
82
- tme/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- tme/data/c48n309.npy,sha256=NwH64mOEbm3tStq5c98o81fY1vMOoq4nvXDAh7Z7iZg,296768
84
- tme/data/c48n527.npy,sha256=saSUMTa1R0MisPvgFL02a7IHQSwEZ-mJu0v3qJjg5AU,506048
85
- tme/data/c48n9.npy,sha256=bDVLV6mWjZHSQfeDc-MOCKKarfc1jaNeVvpoe2xMUy4,8768
86
- tme/data/c48u1.npy,sha256=JeXMFzFITs2ezdc3x5lp3jo1cHHHHVADSA1Tpf77kXs,1088
87
- tme/data/c48u1153.npy,sha256=ECiEximtYDWtIux3Fwe_EJlyn08gUqP85DN9gjkT9_k,1107008
88
- tme/data/c48u1201.npy,sha256=aceC_Jeienz_81X4520nPpZcg5tnRhbW795EqbpWkrg,1153088
89
- tme/data/c48u1641.npy,sha256=p4LwW3LzdTjrUUpA7H53RfNWxYfPX0XjeSwZ39Ac78Q,1575488
90
- tme/data/c48u181.npy,sha256=mLYXrv1YHLH6DsBp5MkxHkxlxgMnj1mw_KKI0udH-FY,173888
91
- tme/data/c48u2219.npy,sha256=p8TQeX8YHu4pdxnwJjEAlQWAPa66W7kpK96iZKZr9JE,2130368
92
- tme/data/c48u27.npy,sha256=k03ZNEsoPwBKCy8IeIa5G0WRZqjGZMtX6Ibu7EpJHvU,26048
93
- tme/data/c48u2947.npy,sha256=icI97ED6ct66y7FIaJAugmjzrIWk7CINCxtO3wDTnrU,2829248
94
- tme/data/c48u3733.npy,sha256=tla-__Pf-hpN6h04vtFIfkkFdCLple11VO06kr1dXkM,3583808
95
- tme/data/c48u4749.npy,sha256=tItOA4oV7SiqCCREwz3fyEpZoxM0lCq_jfEo5_-fp2s,4559168
96
- tme/data/c48u5879.npy,sha256=bFk89MllIFCX_sLXTYWFquSyN1NuahH4wwnEsPJLxzA,5643968
97
- tme/data/c48u7111.npy,sha256=CMy9kI2edH-q9eTIVdgUtXurplYNI7Uqp4dXfkkVdf8,6826688
98
- tme/data/c48u815.npy,sha256=bCuJxLtm0Sjg3GGxtyjGzRYZ1G0Gz79XHI-71GvqQnI,782528
99
- tme/data/c48u83.npy,sha256=7ODJYnsiuDjGbgd9GFopsyIW2IjrYI0J2X2f-cK868U,79808
100
- tme/data/c48u8649.npy,sha256=-IPlpR4zrPQZWhhSPu4zEulFdrCEVgTMFffCB5d-huE,8303168
101
- tme/data/c600v.npy,sha256=JqSu3ALoL1A9iguehc0YGUMFPsh2fprHHp76VXeFXIw,2528
102
- tme/data/c600vc.npy,sha256=Yht-GFXDSjjGvsjFBvyxxEZAI-ODADPd5gEgFNZQVTA,14528
103
- tme/data/metadata.yaml,sha256=fAgX-mEzB0QMHTEtYDG4cSMbJhYxBbDJH3sdvJvL7a8,750
104
- tme/data/quat_to_numpy.py,sha256=-gkDZb10fKBxwfYrSLCUWvMB76TzZWELCeKsYProwws,1333
105
- tme/data/scattering_factors.pickle,sha256=ZHktBc_AlS4H6uoER8AMmn5zOgjBwzgC92hUyww3Nik,38669
106
- tme/external/bindings.cpp,sha256=CIukugVf55LicY2uSCasHWQlrlO9GS2iUuCR3WLvncM,12912
107
- tme/filters/__init__.py,sha256=iCPAyxlXtvZdinMKk_nDzk8Ew8K9NkhMFDs1JF5_zEM,243
108
- tme/filters/_utils.py,sha256=rrgWXdlF8rbAdhQwXcDn3EPE5euhtr1uJDJeqMFmNmI,10106
109
- tme/filters/bandpass.py,sha256=YygCDFG5d3VZkoX5IxZwmjVgrVnQwyh9p3G-aeaanqo,7795
110
- tme/filters/compose.py,sha256=czOBaihYcRYKrfNFAAEodurtEYg3SF0PFPMLkCqR8tk,1992
111
- tme/filters/ctf.py,sha256=ymOi90sf-bSPfHFpdvMPeEsoDHgOerMjH6q1sRNlNiY,14801
112
- tme/filters/reconstruction.py,sha256=oomYOtWGiw7DXs_NVnQxPVv8zK8hwXZTONiwaFQNTE8,5436
113
- tme/filters/wedge.py,sha256=t9LKPydjyuhtY9NtkiQug-S5bGt2DDTBAaeNDbH5T9E,17583
114
- tme/filters/whitening.py,sha256=Rhr-sxxvAVp60yUieiyL96iJcDasbdgq9q1iTtCxS1w,6324
115
- pytme-0.2.9.post1.dist-info/METADATA,sha256=iRWxbDR6p4Lq4q2PbfXzscjDDxGjMe46KItWTvdbTHA,5374
116
- pytme-0.2.9.post1.dist-info/WHEEL,sha256=SPbiHAOPLnBtml4sk5MIwvWF6YnGfOfy9C__W6Bpeg4,109
117
- pytme-0.2.9.post1.dist-info/entry_points.txt,sha256=ff3LQL3FCWfCYOwFiP9zatm7laUbnwCkuPELkQVyUO4,241
118
- pytme-0.2.9.post1.dist-info/top_level.txt,sha256=ovCUR7UXXouH3zYt_fJLoqr_vtjp1wudFgjVAnztQLE,18
119
- pytme-0.2.9.post1.dist-info/RECORD,,