biotite 1.3.0__cp312-cp312-macosx_10_13_x86_64.whl → 1.4.0__cp312-cp312-macosx_10_13_x86_64.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.

Potentially problematic release.


This version of biotite might be problematic. Click here for more details.

Files changed (38) hide show
  1. biotite/interface/pymol/object.py +3 -1
  2. biotite/interface/rdkit/mol.py +5 -5
  3. biotite/sequence/align/banded.cpython-312-darwin.so +0 -0
  4. biotite/sequence/align/kmeralphabet.cpython-312-darwin.so +0 -0
  5. biotite/sequence/align/kmersimilarity.cpython-312-darwin.so +0 -0
  6. biotite/sequence/align/kmertable.cpython-312-darwin.so +0 -0
  7. biotite/sequence/align/localgapped.cpython-312-darwin.so +0 -0
  8. biotite/sequence/align/localungapped.cpython-312-darwin.so +0 -0
  9. biotite/sequence/align/multiple.cpython-312-darwin.so +0 -0
  10. biotite/sequence/align/pairwise.cpython-312-darwin.so +0 -0
  11. biotite/sequence/align/permutation.cpython-312-darwin.so +0 -0
  12. biotite/sequence/align/selector.cpython-312-darwin.so +0 -0
  13. biotite/sequence/align/tracetable.cpython-312-darwin.so +0 -0
  14. biotite/sequence/codec.cpython-312-darwin.so +0 -0
  15. biotite/sequence/phylo/nj.cpython-312-darwin.so +0 -0
  16. biotite/sequence/phylo/tree.cpython-312-darwin.so +0 -0
  17. biotite/sequence/phylo/upgma.cpython-312-darwin.so +0 -0
  18. biotite/structure/bonds.cpython-312-darwin.so +0 -0
  19. biotite/structure/bonds.pyx +67 -6
  20. biotite/structure/box.py +1 -1
  21. biotite/structure/celllist.cpython-312-darwin.so +0 -0
  22. biotite/structure/charges.cpython-312-darwin.so +0 -0
  23. biotite/structure/compare.py +2 -0
  24. biotite/structure/info/components.bcif +0 -0
  25. biotite/structure/io/pdb/file.py +15 -5
  26. biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so +0 -0
  27. biotite/structure/io/pdbx/bcif.py +6 -3
  28. biotite/structure/io/pdbx/cif.py +5 -2
  29. biotite/structure/io/pdbx/compress.py +2 -2
  30. biotite/structure/io/pdbx/convert.py +25 -20
  31. biotite/structure/io/pdbx/encoding.cpython-312-darwin.so +0 -0
  32. biotite/structure/rings.py +117 -1
  33. biotite/structure/sasa.cpython-312-darwin.so +0 -0
  34. biotite/version.py +2 -2
  35. {biotite-1.3.0.dist-info → biotite-1.4.0.dist-info}/METADATA +1 -1
  36. {biotite-1.3.0.dist-info → biotite-1.4.0.dist-info}/RECORD +38 -38
  37. {biotite-1.3.0.dist-info → biotite-1.4.0.dist-info}/WHEEL +0 -0
  38. {biotite-1.3.0.dist-info → biotite-1.4.0.dist-info}/licenses/LICENSE.rst +0 -0
@@ -388,7 +388,9 @@ class PyMOLObject:
388
388
  elif isinstance(selection, str):
389
389
  return f"%{self._name} and ({selection})"
390
390
  else:
391
- sel = self.where(np.asarray(selection))
391
+ if not isinstance(selection, slice):
392
+ selection = np.asarray(selection)
393
+ sel = self.where(selection)
392
394
  if sel == "none" and not_none:
393
395
  raise ValueError("Selection contains no atoms")
394
396
  return sel
@@ -59,7 +59,7 @@ _STANDARD_ANNOTATIONS = frozenset(
59
59
  "charge",
60
60
  "b_factor",
61
61
  "occupancy",
62
- "label_alt_id",
62
+ "altloc_id",
63
63
  }
64
64
  )
65
65
 
@@ -202,8 +202,8 @@ def to_mol(
202
202
  rdkit_atom_res_info.SetOccupancy(atoms.occupancy[i].item())
203
203
  if "b_factor" in has_annot:
204
204
  rdkit_atom_res_info.SetTempFactor(atoms.b_factor[i].item())
205
- if "label_alt_id" in has_annot:
206
- rdkit_atom_res_info.SetAltLoc(atoms.label_alt_id[i].item())
205
+ if "altloc_id" in has_annot:
206
+ rdkit_atom_res_info.SetAltLoc(atoms.altloc_id[i].item())
207
207
  rdkit_atom.SetPDBResidueInfo(rdkit_atom_res_info)
208
208
 
209
209
  # add extra annotations
@@ -361,7 +361,7 @@ def from_mol(mol, conformer_id=None, add_hydrogen=None):
361
361
  atoms.add_annotation("charge", int)
362
362
  atoms.add_annotation("b_factor", float)
363
363
  atoms.add_annotation("occupancy", float)
364
- atoms.add_annotation("label_alt_id", str)
364
+ atoms.add_annotation("altloc_id", str)
365
365
 
366
366
  for rdkit_atom in rdkit_atoms:
367
367
  _atom_idx = rdkit_atom.GetIdx()
@@ -406,7 +406,7 @@ def from_mol(mol, conformer_id=None, add_hydrogen=None):
406
406
  atoms.res_id[_atom_idx] = residue_info.GetResidueNumber()
407
407
  atoms.ins_code[_atom_idx] = residue_info.GetInsertionCode()
408
408
  atoms.res_name[_atom_idx] = residue_info.GetResidueName()
409
- atoms.label_alt_id[_atom_idx] = residue_info.GetAltLoc()
409
+ atoms.altloc_id[_atom_idx] = residue_info.GetAltLoc()
410
410
  atoms.hetero[_atom_idx] = residue_info.GetIsHeteroAtom()
411
411
  atoms.b_factor[_atom_idx] = residue_info.GetTempFactor()
412
412
  atoms.occupancy[_atom_idx] = residue_info.GetOccupancy()
@@ -517,14 +517,41 @@ class BondList(Copyable):
517
517
  0 1 SINGLE
518
518
  1 2 DOUBLE
519
519
  """
520
- bond_types = self._bonds[:,2]
521
520
  for aromatic_type, non_aromatic_type in [
522
521
  (BondType.AROMATIC_SINGLE, BondType.SINGLE),
523
522
  (BondType.AROMATIC_DOUBLE, BondType.DOUBLE),
524
523
  (BondType.AROMATIC_TRIPLE, BondType.TRIPLE),
525
524
  (BondType.AROMATIC, BondType.ANY),
526
525
  ]:
527
- bond_types[bond_types == aromatic_type] = non_aromatic_type
526
+ mask = self._bonds[:, 2] == aromatic_type
527
+ self._bonds[mask, 2] = non_aromatic_type
528
+
529
+ def remove_kekulization(self):
530
+ """
531
+ Remove the bond order information from aromatic bonds, i.e. convert all
532
+ aromatic bonds to :attr:`BondType.ANY`.
533
+
534
+ Examples
535
+ --------
536
+
537
+ >>> bond_list = BondList(3)
538
+ >>> bond_list.add_bond(0, 1, BondType.AROMATIC_SINGLE)
539
+ >>> bond_list.add_bond(1, 2, BondType.AROMATIC_DOUBLE)
540
+ >>> bond_list.remove_kekulization()
541
+ >>> for i, j, bond_type in bond_list.as_array():
542
+ ... print(i, j, BondType(bond_type).name)
543
+ 0 1 AROMATIC
544
+ 1 2 AROMATIC
545
+ """
546
+ kekulized_mask = np.isin(
547
+ self._bonds[:, 2],
548
+ (
549
+ BondType.AROMATIC_SINGLE,
550
+ BondType.AROMATIC_DOUBLE,
551
+ BondType.AROMATIC_TRIPLE,
552
+ ),
553
+ )
554
+ self._bonds[kekulized_mask, 2] = BondType.AROMATIC
528
555
 
529
556
  def remove_bond_order(self):
530
557
  """
@@ -532,6 +559,41 @@ class BondList(Copyable):
532
559
  """
533
560
  self._bonds[:,2] = BondType.ANY
534
561
 
562
+ def convert_bond_type(self, original_bond_type, new_bond_type):
563
+ """
564
+ convert_bond_type(original_bond_type, new_bond_type)
565
+
566
+ Convert all occurences of a given bond type into another bond type.
567
+
568
+ Parameters
569
+ ----------
570
+ original_bond_type : BondType or int
571
+ The bond type to convert.
572
+ new_bond_type : BondType or int
573
+ The new bond type.
574
+
575
+ Examples
576
+ --------
577
+
578
+ >>> bond_list = BondList(4)
579
+ >>> bond_list.add_bond(0, 1, BondType.DOUBLE)
580
+ >>> bond_list.add_bond(1, 2, BondType.COORDINATION)
581
+ >>> bond_list.add_bond(2, 3, BondType.COORDINATION)
582
+ >>> for i, j, bond_type in bond_list.as_array():
583
+ ... print(i, j, BondType(bond_type).name)
584
+ 0 1 DOUBLE
585
+ 1 2 COORDINATION
586
+ 2 3 COORDINATION
587
+ >>> bond_list.convert_bond_type(BondType.COORDINATION, BondType.SINGLE)
588
+ >>> for i, j, bond_type in bond_list.as_array():
589
+ ... print(i, j, BondType(bond_type).name)
590
+ 0 1 DOUBLE
591
+ 1 2 SINGLE
592
+ 2 3 SINGLE
593
+ """
594
+ mask = self._bonds[:, 2] == original_bond_type
595
+ self._bonds[mask, 2] = new_bond_type
596
+
535
597
  def get_atom_count(self):
536
598
  """
537
599
  get_atom_count()
@@ -1437,9 +1499,8 @@ _DEFAULT_DISTANCE_RANGE = {
1437
1499
  def connect_via_distances(atoms, dict distance_range=None, bint inter_residue=True,
1438
1500
  default_bond_type=BondType.ANY, bint periodic=False):
1439
1501
  """
1440
- connect_via_distances(atoms, distance_range=None, atom_mask=None,
1441
- inter_residue=True, default_bond_type=BondType.ANY,
1442
- periodic=False)
1502
+ connect_via_distances(atoms, distance_range=None, inter_residue=True,
1503
+ default_bond_type=BondType.ANY, periodic=False)
1443
1504
 
1444
1505
  Create a :class:`BondList` for a given atom array, based on
1445
1506
  pairwise atom distances.
@@ -1589,7 +1650,7 @@ def connect_via_distances(atoms, dict distance_range=None, bint inter_residue=Tr
1589
1650
  def connect_via_residue_names(atoms, bint inter_residue=True,
1590
1651
  dict custom_bond_dict=None):
1591
1652
  """
1592
- connect_via_residue_names(atoms, atom_mask=None, inter_residue=True)
1653
+ connect_via_residue_names(atoms, inter_residue=True, custom_bond_dict=None)
1593
1654
 
1594
1655
  Create a :class:`BondList` for a given atom array (stack), based on
1595
1656
  the deposited bonds for each residue in the RCSB ``components.cif``
biotite/structure/box.py CHANGED
@@ -361,7 +361,7 @@ def repeat_box(atoms, amount=1):
361
361
  if atoms.box is None:
362
362
  raise BadStructureError("Structure has no box")
363
363
 
364
- repeat_coord, indices = repeat_box_coord(atoms.coord, atoms.box)
364
+ repeat_coord, indices = repeat_box_coord(atoms.coord, atoms.box, amount)
365
365
  # Unroll repeated coordinates for input to 'repeat()'
366
366
  if repeat_coord.ndim == 2:
367
367
  repeat_coord = repeat_coord.reshape(-1, atoms.array_length(), 3)
@@ -449,6 +449,8 @@ def lddt(
449
449
  # Aggregate the fractions over the desired level
450
450
  if isinstance(aggregation, str) and aggregation == "all":
451
451
  # Average over all contacts
452
+ if len(fraction_preserved_bins) == 0:
453
+ return np.float32(np.nan)
452
454
  return np.mean(fraction_preserved_bins, axis=-1)
453
455
  else:
454
456
  # A string is also a 'Sequence'
Binary file
@@ -936,7 +936,11 @@ class PDBFile(TextFile):
936
936
  if transform_start is None:
937
937
  raise InvalidFileError("No 'BIOMT' records found for chosen assembly")
938
938
  rotations, translations = _parse_transformations(
939
- assembly_lines[transform_start:stop]
939
+ [
940
+ line
941
+ for line in assembly_lines[transform_start:stop]
942
+ if len(line.strip()) > 0
943
+ ]
940
944
  )
941
945
  # Filter affected chains
942
946
  sub_structure = structure[
@@ -1193,7 +1197,7 @@ class PDBFile(TextFile):
1193
1197
  conect_lines = [line for line in self.lines if line.startswith("CONECT")]
1194
1198
 
1195
1199
  # Mapping from atom ids to indices in an AtomArray
1196
- atom_id_to_index = np.zeros(atom_ids[-1] + 1, dtype=int)
1200
+ atom_id_to_index = np.full(atom_ids[-1] + 1, -1, dtype=int)
1197
1201
  try:
1198
1202
  for i, id in enumerate(atom_ids):
1199
1203
  atom_id_to_index[id] = i
@@ -1202,15 +1206,21 @@ class PDBFile(TextFile):
1202
1206
 
1203
1207
  bonds = []
1204
1208
  for line in conect_lines:
1205
- center_id = atom_id_to_index[decode_hybrid36(line[6:11])]
1209
+ center_index = atom_id_to_index[decode_hybrid36(line[6:11])]
1210
+ if center_index == -1:
1211
+ # Atom ID is not in the AtomArray (probably removed altloc)
1212
+ continue
1206
1213
  for i in range(11, 31, 5):
1207
1214
  id_string = line[i : i + 5]
1208
1215
  try:
1209
- id = atom_id_to_index[decode_hybrid36(id_string)]
1216
+ contact_index = atom_id_to_index[decode_hybrid36(id_string)]
1217
+ if contact_index == -1:
1218
+ # Atom ID is not in the AtomArray (probably removed altloc)
1219
+ continue
1210
1220
  except ValueError:
1211
1221
  # String is empty -> no further IDs
1212
1222
  break
1213
- bonds.append((center_id, id))
1223
+ bonds.append((center_index, contact_index))
1214
1224
 
1215
1225
  # The length of the 'atom_ids' array
1216
1226
  # is equal to the length of the AtomArray
@@ -511,7 +511,7 @@ class BinaryCIFBlock(_HierarchicalContainer):
511
511
 
512
512
  def __delitem__(self, key):
513
513
  try:
514
- return super().__setitem__("_" + key)
514
+ return super().__delitem__("_" + key)
515
515
  except KeyError:
516
516
  raise KeyError(key)
517
517
 
@@ -581,9 +581,12 @@ class BinaryCIFFile(File, _HierarchicalContainer):
581
581
 
582
582
  @property
583
583
  def block(self):
584
- if len(self) != 1:
584
+ if len(self) == 0:
585
+ raise ValueError("There are no blocks in the file")
586
+ elif len(self) > 1:
585
587
  raise ValueError("There are multiple blocks in the file")
586
- return self[next(iter(self))]
588
+ else:
589
+ return self[next(iter(self))]
587
590
 
588
591
  @staticmethod
589
592
  def subcomponent_class():
@@ -799,9 +799,12 @@ class CIFFile(_Component, File, MutableMapping):
799
799
 
800
800
  @property
801
801
  def block(self):
802
- if len(self) != 1:
802
+ if len(self) == 0:
803
+ raise ValueError("There are no blocks in the file")
804
+ elif len(self) > 1:
803
805
  raise ValueError("There are multiple blocks in the file")
804
- return self[next(iter(self))]
806
+ else:
807
+ return self[next(iter(self))]
805
808
 
806
809
  @staticmethod
807
810
  def subcomponent_class():
@@ -56,14 +56,14 @@ def compress(data, float_tolerance=None, rtol=1e-6, atol=1e-4):
56
56
  >>> pdbx_file.write(uncompressed_file)
57
57
  >>> _ = uncompressed_file.seek(0)
58
58
  >>> print(f"{len(uncompressed_file.read()) // 1000} KB")
59
- 927 KB
59
+ 937 KB
60
60
  >>> # Write compressed file
61
61
  >>> pdbx_file = compress(pdbx_file)
62
62
  >>> compressed_file = BytesIO()
63
63
  >>> pdbx_file.write(compressed_file)
64
64
  >>> _ = compressed_file.seek(0)
65
65
  >>> print(f"{len(compressed_file.read()) // 1000} KB")
66
- 111 KB
66
+ 114 KB
67
67
  """
68
68
  if float_tolerance is not None:
69
69
  warnings.warn(
@@ -775,7 +775,10 @@ def _filter_altloc(array, atom_site, altloc):
775
775
  if altloc == "all":
776
776
  array.set_annotation("altloc_id", altloc_ids.as_array(str))
777
777
  return array, atom_site
778
- elif altloc_ids is None or (altloc_ids.mask.array != MaskValue.PRESENT).all():
778
+ elif altloc_ids is None or (
779
+ altloc_ids.mask is not None
780
+ and (altloc_ids.mask.array != MaskValue.PRESENT).all()
781
+ ):
779
782
  # No altlocs in atom_site category
780
783
  return array, atom_site
781
784
  elif altloc == "occupancy" and occupancy is not None:
@@ -873,11 +876,7 @@ def set_structure(
873
876
  this parameter is ignored.
874
877
  If the file is empty, a new data block will be created.
875
878
  include_bonds : bool, optional
876
- If set to true and `array` has associated ``bonds`` , the
877
- intra-residue bonds will be written into the ``chem_comp_bond``
878
- category.
879
- Inter-residue bonds will be written into the ``struct_conn``
880
- independent of this parameter.
879
+ DEPRECATED: Has no effect anymore.
881
880
  extra_fields : list of str, optional
882
881
  List of additional fields from the ``atom_site`` category
883
882
  that should be written into the file.
@@ -898,6 +897,13 @@ def set_structure(
898
897
  >>> set_structure(file, atom_array)
899
898
  >>> file.write(os.path.join(path_to_directory, "structure.cif"))
900
899
  """
900
+ if include_bonds:
901
+ warnings.warn(
902
+ "`include_bonds` parameter is deprecated, "
903
+ "intra-residue are always written, if available",
904
+ DeprecationWarning,
905
+ )
906
+
901
907
  _check_non_empty(array)
902
908
 
903
909
  block = _get_or_create_block(pdbx_file, data_block)
@@ -975,10 +981,9 @@ def set_structure(
975
981
  struct_conn = _set_inter_residue_bonds(array, atom_site)
976
982
  if struct_conn is not None:
977
983
  block["struct_conn"] = struct_conn
978
- if include_bonds:
979
- chem_comp_bond = _set_intra_residue_bonds(array, atom_site)
980
- if chem_comp_bond is not None:
981
- block["chem_comp_bond"] = chem_comp_bond
984
+ chem_comp_bond = _set_intra_residue_bonds(array, atom_site)
985
+ if chem_comp_bond is not None:
986
+ block["chem_comp_bond"] = chem_comp_bond
982
987
 
983
988
  # In case of a single model handle each coordinate
984
989
  # simply like a flattened array
@@ -1652,11 +1657,11 @@ def get_assembly(
1652
1657
  If set to true, a :class:`BondList` will be created for the
1653
1658
  resulting :class:`AtomArray` containing the bond information
1654
1659
  from the file.
1655
- Bonds, whose order could not be determined from the
1656
- *Chemical Component Dictionary*
1657
- (e.g. especially inter-residue bonds),
1658
- have :attr:`BondType.ANY`, since the PDB format itself does
1659
- not support bond orders.
1660
+ Inter-residue bonds, will be read from the ``struct_conn``
1661
+ category.
1662
+ Intra-residue bonds will be read from the ``chem_comp_bond``, if
1663
+ available, otherwise they will be derived from the Chemical
1664
+ Component Dictionary.
1660
1665
 
1661
1666
  Returns
1662
1667
  -------
@@ -1926,11 +1931,11 @@ def get_unit_cell(
1926
1931
  If set to true, a :class:`BondList` will be created for the
1927
1932
  resulting :class:`AtomArray` containing the bond information
1928
1933
  from the file.
1929
- Bonds, whose order could not be determined from the
1930
- *Chemical Component Dictionary*
1931
- (e.g. especially inter-residue bonds),
1932
- have :attr:`BondType.ANY`, since the PDB format itself does
1933
- not support bond orders.
1934
+ Inter-residue bonds, will be read from the ``struct_conn``
1935
+ category.
1936
+ Intra-residue bonds will be read from the ``chem_comp_bond``, if
1937
+ available, otherwise they will be derived from the Chemical
1938
+ Component Dictionary.
1934
1939
 
1935
1940
  Returns
1936
1941
  -------
@@ -8,7 +8,12 @@ This module provides functions related to aromatic rings.
8
8
 
9
9
  __name__ = "biotite.structure"
10
10
  __author__ = "Patrick Kunzmann"
11
- __all__ = ["find_aromatic_rings", "find_stacking_interactions", "PiStacking"]
11
+ __all__ = [
12
+ "find_aromatic_rings",
13
+ "find_stacking_interactions",
14
+ "find_pi_cation_interactions",
15
+ "PiStacking",
16
+ ]
12
17
 
13
18
 
14
19
  from enum import IntEnum
@@ -268,6 +273,117 @@ def find_stacking_interactions(
268
273
  ]
269
274
 
270
275
 
276
+ def find_pi_cation_interactions(
277
+ atoms,
278
+ distance_cutoff=5.0,
279
+ angle_tol=np.deg2rad(30.0),
280
+ ):
281
+ """
282
+ Find pi-cation interactions between aromatic rings and cations.
283
+
284
+ Parameters
285
+ ----------
286
+ atoms : AtomArray
287
+ The atoms to be searched for pi-cation interactions.
288
+ Requires an associated :class:`BondList` and ``charge`` annotation.
289
+ distance_cutoff : float, optional
290
+ The cutoff distance between ring centroid and cation.
291
+ angle_tol : float, optional
292
+ The tolerance for the angle between the ring plane normal
293
+ and the centroid-cation vector. Perfect pi-cation interaction
294
+ has 0° angle (perpendicular to ring plane).
295
+ Given in radians.
296
+
297
+ Returns
298
+ -------
299
+ interactions : list of tuple(ndarray, int)
300
+ The pi-cation interactions between aromatic rings and cations.
301
+ Each element in the list represents one pi-cation interaction.
302
+ The first element of each tuple represents atom indices of the
303
+ aromatic ring, the second element is the atom index of the cation.
304
+
305
+ See Also
306
+ --------
307
+ find_aromatic_rings : Used for finding the aromatic rings in this function.
308
+ find_stacking_interactions : Find pi-stacking interactions between rings.
309
+
310
+ Notes
311
+ -----
312
+ The conditions for pi-cation interactions are:
313
+ - The distance between ring centroid and cation must be within
314
+ `distance_cutoff`. :footcite:`Wojcikowski2015` uses 5.0 Å,
315
+ whereas :footcite:`Bouysset2021` uses 4.5 Å.
316
+ - The angle between the ring plane normal and the centroid-cation
317
+ vector must be within `angle_tol` of 0° (perpendicular to plane).
318
+
319
+ Examples
320
+ --------
321
+ >>> from os.path import join
322
+ >>> structure = load_structure(join(path_to_structures, "3wip.cif"), include_bonds=True, extra_fields=["charge"])
323
+ >>> interactions = find_pi_cation_interactions(structure)
324
+ >>> for ring_indices, cation_index in interactions:
325
+ ... print(
326
+ ... structure.res_name[ring_indices[0]],
327
+ ... structure.res_name[cation_index]
328
+ ... )
329
+ TYR ACH
330
+ TRP ACH
331
+ """
332
+ if atoms.bonds is None:
333
+ raise BadStructureError("Structure must have an associated BondList")
334
+
335
+ if atoms.charge is None:
336
+ raise BadStructureError(
337
+ "Structure must have a 'charge' annotation to identify cations."
338
+ )
339
+
340
+ rings = find_aromatic_rings(atoms)
341
+ if len(rings) == 0:
342
+ return []
343
+
344
+ cation_mask = atoms.charge > 0
345
+ cation_indices = np.where(cation_mask)[0]
346
+
347
+ if len(cation_indices) == 0:
348
+ return []
349
+
350
+ # Calculate ring centroids and normals
351
+ ring_centroids = np.array(
352
+ [atoms.coord[atom_indices].mean(axis=0) for atom_indices in rings]
353
+ )
354
+ ring_normals = np.array(
355
+ [_get_ring_normal(atoms.coord[atom_indices]) for atom_indices in rings]
356
+ )
357
+
358
+ cation_coords = atoms.coord[cation_indices]
359
+
360
+ # Create an index array that contains the Cartesian product of all rings and cations
361
+ indices = np.stack(
362
+ [
363
+ np.repeat(np.arange(len(rings)), len(cation_indices)),
364
+ np.tile(np.arange(len(cation_indices)), len(rings)),
365
+ ],
366
+ axis=-1,
367
+ )
368
+
369
+ ## Condition 1: Ring centroids and cations are close enough to each other
370
+ diff = displacement(ring_centroids[indices[:, 0]], cation_coords[indices[:, 1]])
371
+ # Use squared distance to avoid time consuming sqrt computation
372
+ sq_distance = vector_dot(diff, diff)
373
+ is_interacting = sq_distance < distance_cutoff**2
374
+ indices = indices[is_interacting]
375
+
376
+ ## Condition 2: Angle between ring normal and centroid-cation vector
377
+ diff = displacement(ring_centroids[indices[:, 0]], cation_coords[indices[:, 1]])
378
+ norm_vector(diff)
379
+ angles = _minimum_angle(ring_normals[indices[:, 0]], diff)
380
+ is_interacting = _is_within_tolerance(angles, 0, angle_tol)
381
+ indices = indices[is_interacting]
382
+
383
+ # Only return pairs where all conditions were fulfilled
384
+ return [(rings[ring_i], cation_indices[cation_j]) for ring_i, cation_j in indices]
385
+
386
+
271
387
  def _get_ring_normal(ring_coord):
272
388
  """
273
389
  Get the normal vector perpendicular to the ring plane.
biotite/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.3.0'
21
- __version_tuple__ = version_tuple = (1, 3, 0)
20
+ __version__ = version = '1.4.0'
21
+ __version_tuple__ = version_tuple = (1, 4, 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: biotite
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: A comprehensive library for computational molecular biology
5
5
  Project-URL: homepage, https://www.biotite-python.org
6
6
  Project-URL: repository, https://github.com/biotite-dev/biotite
@@ -1,4 +1,8 @@
1
- biotite/version.py,sha256=qDtcPZdKzxLpd8vVl6fpIFIMkWt2HK_cO9gLDwaHEdk,511
1
+ biotite-1.4.0.dist-info/RECORD,,
2
+ biotite-1.4.0.dist-info/WHEEL,sha256=-B3I7-GmGBTt-SRVGImD3u4thPvZiqFGa5PvjykkCfw,135
3
+ biotite-1.4.0.dist-info/METADATA,sha256=NZDvKedU4WJkuZIOpWAI3GXJIdbfP5jDh_CbaLSLfgU,5525
4
+ biotite-1.4.0.dist-info/licenses/LICENSE.rst,sha256=ZuNQuB65Dxf0rDB_5LxvA4SVQJBWxRZyvbjbvE-APWY,1534
5
+ biotite/version.py,sha256=rcWNYDlh913lujUvTfOu9iOIPdrTXg64R9wl7ENLjFU,511
2
6
  biotite/copyable.py,sha256=C7ycTQxqanxT0SmXhzy5OLp7NpZdNWHyokozdoVDGNA,1897
3
7
  biotite/__init__.py,sha256=rL8ZyaCUjOrECEvRxyHj8MOMp4FHMJ8n6KKgrYf5OAQ,545
4
8
  biotite/visualize.py,sha256=GSxIL8PLXMDlaULG-ckSghRifQnBnkseZ-OWsnuno4M,13955
@@ -31,13 +35,13 @@ biotite/interface/__init__.py,sha256=CEbr_8h6pt3za2ybSeePcNKMsA2vkNUbzYhzP62g2Lg
31
35
  biotite/interface/warning.py,sha256=rU1F-b1MeIj1OWaK6wMeuM_YE-WKNGqo2TehjTr10KM,577
32
36
  biotite/interface/pymol/startup.py,sha256=8W0wIx13MGqGNvwTTT7ogmgypXCO48PI5w-DVPdS9jw,4619
33
37
  biotite/interface/pymol/shapes.py,sha256=Q34C5H5PkH4XbnyymwbJYp9iFD2Idj2a_qzDRA8tohQ,6066
34
- biotite/interface/pymol/object.py,sha256=5_zG4rn-sjreAHGdRLW45IxK9A096zXjgxn1cEgOVag,44193
38
+ biotite/interface/pymol/object.py,sha256=c0BxeD2rxyPNonXBTA1iLINSRA4_Ljn1_Tzpf4_rLYg,44280
35
39
  biotite/interface/pymol/convert.py,sha256=ldLXSiFdwhEkoZkTtLFOMvymIh9oLniChve54SbHJLA,6044
36
40
  biotite/interface/pymol/__init__.py,sha256=bOX95ek4eKSgZFYynrfcuZFRgjADYvhbrVWCR6ok7yc,6648
37
41
  biotite/interface/pymol/display.py,sha256=KJfCM9-hzvFdC5KFxvG5-oEXd0MIaf3Ocr3dMQVoipY,8458
38
42
  biotite/interface/pymol/cgo.py,sha256=wlG1GkbHAGYVdzaOUPQ5KzI-29lrDkutt0NRw7PIq-8,9859
39
43
  biotite/interface/rdkit/__init__.py,sha256=K2gVw_wrbIU0v-I3RgRvrihdtcpFfL9_t-IlObLuCMk,532
40
- biotite/interface/rdkit/mol.py,sha256=T4Nnc3ttQFfy-4YbbSRLuTpcAhahWjqQGwM7fypouEs,19644
44
+ biotite/interface/rdkit/mol.py,sha256=iMPR8U5girjnCa2-xLHQG1duw-tR3bUruVQRa1O27fc,19629
41
45
  biotite/interface/openmm/system.py,sha256=V-SDc1YDa6nKHcREXz1cGAN7jZJ2X1cPf0gazz_Gv6s,7018
42
46
  biotite/interface/openmm/__init__.py,sha256=ZcLsA9PPsrFDtY7rTMspizpCCQ_Fnm7vqwY-E5xTw6k,587
43
47
  biotite/interface/openmm/state.py,sha256=jmdLw1xc7TQbgeOnZGgSgdmD_rR9VEnMqhX0Wnw_1Jo,2723
@@ -79,7 +83,7 @@ biotite/sequence/__init__.py,sha256=fSWhobaPGRMJI6-8UYFpjguxVtP4O4cAHmiRxNAGzYI,
79
83
  biotite/sequence/seqtypes.py,sha256=I5OaC9IOJoA9G610Tod67cgCWDQqTAgYpK1FHF8Ofok,23246
80
84
  biotite/sequence/codon.py,sha256=Scua9XHD-TnWfCaKHRegKQGSP3XK3wW3zLgxen45ux0,16346
81
85
  biotite/sequence/search.py,sha256=G__T-GHMJODWmgh87z5wxs_g9-t1DtvEOd-USp-Qizg,3088
82
- biotite/sequence/codec.cpython-312-darwin.so,sha256=NrgGGiT18hqotHXY-HT-fo7-qxHEbhWjtaGPVWKqQvE,282056
86
+ biotite/sequence/codec.cpython-312-darwin.so,sha256=FXAaA9IXHjtzXDCL9JmoxxLEz1gCzMDgzjeI6q1TMNQ,276000
83
87
  biotite/sequence/alphabet.py,sha256=3iTSuuAsaPtTyqyTjeU0OF5y_17wuhC3lMVbcJGwqe8,17227
84
88
  biotite/sequence/io/__init__.py,sha256=4K13uxFWe8IpNC8yuVxjDiI7-8lmXu7qT6iMmVSqPs4,314
85
89
  biotite/sequence/io/general.py,sha256=sD03pLnkxsT6vFh8806ZhErC8GEG3LF_70NMcVJyGe0,6694
@@ -100,33 +104,33 @@ biotite/sequence/io/fastq/file.py,sha256=Q5jrBN21Fi0hp6rU5cc68kQPYc1jWdZfMwhx0Ze
100
104
  biotite/sequence/align/matrix.py,sha256=A1PUA43ltUnvYqB_RO6WPbvAtCzZI3zSfeKHP3aVSNQ,22360
101
105
  biotite/sequence/align/permutation.pyx,sha256=xbbw5DJ7c5SXnuSUl2hJUMxzvinKP1Khc7CSdH5cEE0,10028
102
106
  biotite/sequence/align/selector.pyx,sha256=BstkOkz-nB2dPtkZIZbU5QlCT-h3QHxdsGg1pGUh-Qo,33471
103
- biotite/sequence/align/pairwise.cpython-312-darwin.so,sha256=Fd8Mwe4aMbDOK_mBInRZxMkJuON4bHU_Z4NVEpO-U6g,625808
107
+ biotite/sequence/align/pairwise.cpython-312-darwin.so,sha256=iAwVCxsejnfWroB9O3SgONQEqFSUxoJhc6LXkjbwUuI,610208
104
108
  biotite/sequence/align/primes.txt,sha256=7pKfLGN1vjYl_KJ3y5uuo8np_5DDUH52UAkhb3fJfWE,10140
105
- biotite/sequence/align/localgapped.cpython-312-darwin.so,sha256=Za-YT8a3vO97cqhboHrUMGXAefNn_x66CEZFqndyjzs,1090672
106
- biotite/sequence/align/banded.cpython-312-darwin.so,sha256=CAMrr6vRJBU8VTDb2vm-3UNCKx-ZeO4gg9Q1Elk9opQ,609448
109
+ biotite/sequence/align/localgapped.cpython-312-darwin.so,sha256=-OOB_sK83-AB07UmysZQkpxgZf5GFrFoZoE2rPyO-0I,1032864
110
+ biotite/sequence/align/banded.cpython-312-darwin.so,sha256=HLPGiUUPNhJ5S7-cpRnKISX9vEiwWFdoKJYi-sw0lsY,568072
107
111
  biotite/sequence/align/kmeralphabet.pyx,sha256=t4MKs3uIXGn_2AB8NRKQxY73RoBLDa-IlKVnSdANkCU,18636
108
- biotite/sequence/align/localungapped.cpython-312-darwin.so,sha256=2TmvFzOVT6WtxCATto1fwHiSIB1kzfFPOtXrpdUPnFU,305312
112
+ biotite/sequence/align/localungapped.cpython-312-darwin.so,sha256=taNEY8mLHelriVFBTfaZHBrdFJsxX7qAp4wDXrkecUY,299048
109
113
  biotite/sequence/align/alignment.py,sha256=vf6Ldh0nevFkQ3dHJJRZw6_ZsqoWHHv-6M1Hy_DQgEs,22380
110
- biotite/sequence/align/permutation.cpython-312-darwin.so,sha256=gyemMpRkX3AufCPplVQoC1xy8kCAM4SYQY5Ngb4j6v0,220800
111
- biotite/sequence/align/multiple.cpython-312-darwin.so,sha256=PoEH7npUXVMnazI5OKPcrU1TMg80Mp58JXwMzUZlxH8,539024
114
+ biotite/sequence/align/permutation.cpython-312-darwin.so,sha256=k1fkEqMnHFIigY0BuKIhmJMKwrrsD33km8Kx2BX7QWY,214000
115
+ biotite/sequence/align/multiple.cpython-312-darwin.so,sha256=kHDDDTtbPPyqN8Q5Yt4e6lGZOe1yRHS4mOl5YZYdDhs,504768
112
116
  biotite/sequence/align/tracetable.pyx,sha256=1gsT3OV7VkE6i_UpNiYOLVvD2_tfJgbNZb1yv9F4XR8,15455
113
117
  biotite/sequence/align/pairwise.pyx,sha256=Le9RWShVTDSUMpubq9-nxXSFNZp8CgYjhDsLUBE6yoY,22598
114
118
  biotite/sequence/align/__init__.py,sha256=NyYyB9PmYWCBQB_MaI-L54vYR64JraUvP9uobGJN54w,4711
115
119
  biotite/sequence/align/localungapped.pyx,sha256=h9wgrY85_t0_wOGDW56uJ9N4bo7GciYpeJZpNIBlp4g,9660
116
120
  biotite/sequence/align/buckets.py,sha256=k8H5RBS5Y7DrMoIOd5Ifrxp-nYWosJuqOYgLd1y-DWs,2464
117
121
  biotite/sequence/align/localgapped.pyx,sha256=1uoooliEMravtH1fQJSth0a6FEM4La_v32wGP2C0RIQ,33106
118
- biotite/sequence/align/kmersimilarity.cpython-312-darwin.so,sha256=m4Y1u12tYmY4HJ58xoydQOtfIycbQnSj_gNdH-bTVjo,211128
122
+ biotite/sequence/align/kmersimilarity.cpython-312-darwin.so,sha256=LoqhHWzdqDdecvd_KTOXKZCyTiseRMWcOzHpwld1inU,199704
119
123
  biotite/sequence/align/cigar.py,sha256=ZhxnWSURuKMwOshbeNIK8mtt6r-xcFWXLzoLtluEo88,14335
120
124
  biotite/sequence/align/tracetable.pxd,sha256=_VP1ayP6FZL1Tzn1pCCbt6xPZDzFtE9bH0Gvop2lxyQ,2825
121
125
  biotite/sequence/align/kmertable.pyx,sha256=EqLVngPURKux5tsrv5PauuN5hLKAJbDDVZWnVGWZufo,121697
122
- biotite/sequence/align/tracetable.cpython-312-darwin.so,sha256=KV3q4S1_TpOPV308JeXCiB8eMWFZwAe_vjMPolGoj5k,181032
126
+ biotite/sequence/align/tracetable.cpython-312-darwin.so,sha256=sX8jBz_-aOQqNuXPLqBDf8hkNuYqX7nocuIY0poVxjw,168512
123
127
  biotite/sequence/align/multiple.pyx,sha256=ny6BbmXApxQAYMrUT7MPXqfFiEfrhfxvQApiSPoZ7iQ,21924
124
128
  biotite/sequence/align/statistics.py,sha256=mtscAgqIZIdTjtsvjg4s2A6gzFex0QxyHxmcAxpBQww,9652
125
- biotite/sequence/align/selector.cpython-312-darwin.so,sha256=HA8_KQVPxYqWI3ZcSAN_CYyH7HMwHaaYS58NFhBT--0,316176
129
+ biotite/sequence/align/selector.cpython-312-darwin.so,sha256=OMa58nYs8vKHPxedRYe-8Zk1HKvYOiwY_wfuV8Qbc_E,297480
126
130
  biotite/sequence/align/banded.pyx,sha256=n9-nBkEryjaA-_rQxjT90ZHKIh7Ep1cjFPjWPlHUC9I,25283
127
- biotite/sequence/align/kmeralphabet.cpython-312-darwin.so,sha256=UuY2SOHdaPZ_CokbIJ7t43yGZIE1S72jxcBh48HTDOM,423032
131
+ biotite/sequence/align/kmeralphabet.cpython-312-darwin.so,sha256=cxopXeeouxCjmHkI0NFvmHz0vlETckPMyObH8XOQotg,397472
128
132
  biotite/sequence/align/kmersimilarity.pyx,sha256=EBpz8R_fofRd4gsmBJLuH2qZgMWKlzQkCJ54w_-K7gQ,8433
129
- biotite/sequence/align/kmertable.cpython-312-darwin.so,sha256=K2Kadt22plXQo1WnIaECDyTA3J2VQnTW_5oWoGOhunM,731736
133
+ biotite/sequence/align/kmertable.cpython-312-darwin.so,sha256=bbtPp-42ZouT2RSkcNTSFOyQCZQjCZVZHlavTDwcDxQ,699392
130
134
  biotite/sequence/align/matrix_data/PAM370.mat,sha256=ZD8BpkVrVK22_oLSXZb9d_kzNDfic_i0eVT1fUNkyBk,2068
131
135
  biotite/sequence/align/matrix_data/PAM210.mat,sha256=UfUmaJ09ID11GUzuNeK7aUzgZTW1iJLizADnD0qT2BI,2067
132
136
  biotite/sequence/align/matrix_data/BLOSUM30.mat,sha256=j6FWyeTXvfpSR0ZGecI18MCATcjM_FTJ2XGoEjWg3Qg,2122
@@ -246,25 +250,25 @@ biotite/sequence/graphics/color_schemes/autumn.json,sha256=usp-Y70tk39LCJV64vi7t
246
250
  biotite/sequence/graphics/color_schemes/jalview_zappo.json,sha256=V0IJ-GsT8G8-J9CILWaiY3QkB35wYEq2kbWEDqYjm-4,701
247
251
  biotite/sequence/graphics/color_schemes/clustalx_dna.json,sha256=xkNRgGj_ersYNx8eSDAnI1HQalGiAWHw97tO_pmfyNE,249
248
252
  biotite/sequence/graphics/color_schemes/3di_flower.json,sha256=wuo5hCVuc_wR9a5AviU9BXRQC8XUb90VqJCsKcpq8pc,917
249
- biotite/sequence/phylo/tree.cpython-312-darwin.so,sha256=E1Xf7Q1MlETBU5fIGoCPPL8Njo4V1YMxQ4J3i2Qd3Gk,267536
250
- biotite/sequence/phylo/upgma.cpython-312-darwin.so,sha256=zMYl580xs0rYPxclL2A-tozBTlwjB4trvggHceRWh20,199176
253
+ biotite/sequence/phylo/tree.cpython-312-darwin.so,sha256=GNUTaXq8eHujyLkm_UOoe7VsY8h3dbAhxAr6mUSJIx0,253152
254
+ biotite/sequence/phylo/upgma.cpython-312-darwin.so,sha256=BU_aS85VcGdAzGfpujLI03uVCqWAnNRGj9w9v3vxOXI,188584
251
255
  biotite/sequence/phylo/nj.pyx,sha256=s6hoo_7s3VFy-7Hgq9lKtUVXTZ-To8Dxwytk-ohfWYI,7281
252
256
  biotite/sequence/phylo/__init__.py,sha256=TW1CQqOa3JZYqidRy5XE8gA0HuzA8zo2Iouit3wSsBM,1261
253
257
  biotite/sequence/phylo/upgma.pyx,sha256=86QxGjj8fcGRhze7vZfqw8JLjLAZUevhkWDmzTy357E,5213
254
258
  biotite/sequence/phylo/tree.pyx,sha256=4e4Bhlm1qWY0Wvj6JqDE9jVwP6lEUmE8lIHEUmRNLwU,39206
255
- biotite/sequence/phylo/nj.cpython-312-darwin.so,sha256=eXpL8RiI-_lErNi8But-mPdH8yjHzrYLeKPk01VTWqg,204832
259
+ biotite/sequence/phylo/nj.cpython-312-darwin.so,sha256=PFDGU-rH2RD10YCddYTox5Vd5l_QC8cadaxz9wUxjQk,197728
256
260
  biotite/structure/repair.py,sha256=EUvsV7EkJt-j7ruOnhZxhqdxfl7FMSKVzuQr7_xJE5g,6996
257
261
  biotite/structure/superimpose.py,sha256=gdn6be9KOf24qphK3mFRkxFDK4ejrtTm8C_tcpzSFHs,19562
258
262
  biotite/structure/chains.py,sha256=_E4oEhXRg2AxsyZVy623fRkylzAFonDTDSLGSbh3-M8,8324
259
- biotite/structure/box.py,sha256=tcnKSV_6UWtzOqEo-ILyIHlt_09gyOMtO0JN2vxlS9o,23388
260
- biotite/structure/charges.cpython-312-darwin.so,sha256=0luhGtM0BeVsTXPWO_JTe5V4i-LByFGc05w-afz1ulk,262584
263
+ biotite/structure/box.py,sha256=0GFndCBJKBha8bMlX_9oIs0Y52a0S6Y0g1Qszh83_Sg,23396
264
+ biotite/structure/charges.cpython-312-darwin.so,sha256=1nkubhQF5StZ3KcEchO-9c62kre0ywypEDVyUKgFVRM,247496
261
265
  biotite/structure/error.py,sha256=NI8oZfhO7oYWlcEIi025QZFD3Wjvwn6SvOn_RanrFT0,783
262
266
  biotite/structure/spacegroups.license,sha256=v4W5iaPxCZa2djh8J_KaHZCPX254AQjYjqaMIXI1wPI,1297
263
267
  biotite/structure/util.py,sha256=PvmoUJbB_PpqnTX0osuAs6e5V8AmeKjAVy3mFFZH288,4959
264
268
  biotite/structure/segments.py,sha256=1Z094xZWFsLTx_d5w67I-oHlEPCj2sbtLvZWaZfbgF4,9741
265
269
  biotite/structure/sequence.py,sha256=TlJiSH1AC9XETl3G24UkKl1FHfpWh1aPKsdxj4ZdiEs,4245
266
270
  biotite/structure/sasa.pyx,sha256=lditLNluxg3LsxV1o3B69QOK0Lu1zeuRJXrEQ2SVIKk,12918
267
- biotite/structure/bonds.cpython-312-darwin.so,sha256=GBVN92CAvVEJFuG9FFLJN_0N7RooohgIKnnWWynxp9U,605472
271
+ biotite/structure/bonds.cpython-312-darwin.so,sha256=W6pLUkl7vp94R2YWpbevDrwEmsxdgRpnP0XYRq7ivoA,569440
268
272
  biotite/structure/tm.py,sha256=HtG56CZI9fk3zjML5f5XJXcE7oKVtYS1r-HGm2ugawo,20967
269
273
  biotite/structure/__init__.py,sha256=dqOp3qC1UU3AP7cxNus2wmtHLB9vB_D17Lhmd9cRxAM,5488
270
274
  biotite/structure/mechanics.py,sha256=A7590nMLbsfp_pHvLukca_YV0Q6VcrfDRW_p58D8ZNY,2587
@@ -272,19 +276,19 @@ biotite/structure/sse.py,sha256=OHXohnYi4ipBcSas9XTi9Pm8oNasM49Oxr7DBvYbe1U,1140
272
276
  biotite/structure/charges.pyx,sha256=RpCz4sVOiwmZeVTcMAapiWJFVBPAK0gAAiNoNZuxZWA,18822
273
277
  biotite/structure/density.py,sha256=wGZFgqkK6Kdv0OzmmWz8eXPEVxPSFShxINWOOdehaIg,4197
274
278
  biotite/structure/rdf.py,sha256=Yf9PoWqSpNK3QsWqnCnOUBGL8WwKGOakgZ0pxj5UOiA,8104
275
- biotite/structure/celllist.cpython-312-darwin.so,sha256=rrY8V-41I3PrbIUFyo5YU-yj2_BtlbrRR-k_xYH3DZo,313096
279
+ biotite/structure/celllist.cpython-312-darwin.so,sha256=TIpjf_2onARiNCB0QLsjchVUJklvbi0atHOaaEv2qEU,294472
276
280
  biotite/structure/transform.py,sha256=i8xwMKfpHlN4hHFZBm7-U_nP5bLx_n1WgX8BQZ541_k,26975
277
281
  biotite/structure/geometry.py,sha256=7FtPNJtTUn691xw6kbVk90s8a9rAd98zC-rKD23ikdU,23676
278
282
  biotite/structure/molecules.py,sha256=Ar4NF3r3VQwirFprTMItIdHeluMSlpKOpRanZ0EEsWI,15291
279
283
  biotite/structure/filter.py,sha256=cXeTVhK2lbbHq9KA-lvu2-TKENtHWoI1Qc2hpFxR71Q,17995
280
- biotite/structure/bonds.pyx,sha256=xho8dzXn40-1Qt0vbikeZsqYTNWfV4WOd17p_UbU6Ow,69759
281
- biotite/structure/rings.py,sha256=DcrK7ujRN7op-HyY7yc7gsS_WaN-Z7TFqr3wqaNch6E,11446
284
+ biotite/structure/bonds.pyx,sha256=Bjjc5bTxFmbMUWeYNf1FMfHJ8DB4V02_DRFwrsqtdno,71791
285
+ biotite/structure/rings.py,sha256=pdxrBNtuvOE1hi9sxtI1EamUFtGnqprpkjzZpUi7jgs,15584
282
286
  biotite/structure/atoms.py,sha256=aavGBW5xIQlzpX_dgY-1jD7Z4LRIuSLRZBhMiZt6iq0,50844
283
- biotite/structure/sasa.cpython-312-darwin.so,sha256=oSNF7wew82OIe2lokne80hmW-8rYHoDNyxzuETZPqH0,261736
287
+ biotite/structure/sasa.cpython-312-darwin.so,sha256=1d59h4Y-s70gt9Xf2gwEFPjBtqiwh-kSTerMsG4KeiQ,242400
284
288
  biotite/structure/pseudoknots.py,sha256=X3LrVSJuV1EGXuKMstkzrJQ86otbC_6-vX215fKygiU,22094
285
289
  biotite/structure/basepairs.py,sha256=BT3_LHmerkRfzuQSU86MVTvDs0QZ0UjNJpopJm5VXBI,49908
286
290
  biotite/structure/integrity.py,sha256=-HaFg2ckyVgSyHEyHqqNQ8fOwnhVzieYsMgyTCdzCFo,6763
287
- biotite/structure/compare.py,sha256=irYBGnJHpcX_ETFUVNzlgHQpeGy_ihUGw7EEhWbCcDc,27353
291
+ biotite/structure/compare.py,sha256=JFIE2Ve8JRTxsAK9eTODgWNPi6AuiFMe9rRIOohe6OU,27437
288
292
  biotite/structure/hbond.py,sha256=DhVGCm9s_nNHnHhvfNUl81ph77Y-SIeFY1GGf1kPeL4,15192
289
293
  biotite/structure/dotbracket.py,sha256=jl_Zqp0IINBwFPtZ0XK8rvmGmwebncbYpF26vJldIZY,7198
290
294
  biotite/structure/residues.py,sha256=Fbng2Pxib4dgkijP6zREguDYwm8L0RxbbJxpuU-cv0U,21834
@@ -298,13 +302,13 @@ biotite/structure/io/dcd/__init__.py,sha256=tYiiTSmqDrsSgg_sZaoQgx2D8N9OeqlooxH4
298
302
  biotite/structure/io/dcd/file.py,sha256=jaU81fvGl4WG0zXB1dBKTOtSvFF3fS0kxeNR-wwpXlY,2224
299
303
  biotite/structure/io/trr/__init__.py,sha256=5WNHMGiHNNzYdoiybE6Cs0bYAcznS5D3ABu7gHDJ__A,359
300
304
  biotite/structure/io/trr/file.py,sha256=2LjaLoKYfNgyQGSEfQ1TdZQqaPyrBh3irbJdmEKFTMI,1235
301
- biotite/structure/io/pdbx/encoding.cpython-312-darwin.so,sha256=YX9XlR_qh0F2E7Z1bwsJPu9XTVB7gTmv3kMoeGVhH-Y,1146064
302
- biotite/structure/io/pdbx/bcif.py,sha256=k7WtZNB4U9czi00P1EpELZh8ty6cXRezll3yXdmiYOQ,21137
303
- biotite/structure/io/pdbx/convert.py,sha256=zGJsDmcbfB0xpigeTK0hyWsPANPnEv6eezxmg3Y2Bg8,79897
305
+ biotite/structure/io/pdbx/encoding.cpython-312-darwin.so,sha256=qGUD7f7igE3H5LJsYcBmZMe4dEVq9HxmhaTVZwtclS8,1117864
306
+ biotite/structure/io/pdbx/bcif.py,sha256=y5ueesX3G-5JSVj0chX6LiJ71IYdjgaF5x0nR6stiD0,21247
307
+ biotite/structure/io/pdbx/convert.py,sha256=hEBw0QeRNGRX70z3W0i7cDjVgIOD7RFrOnZGrUMa_gM,79916
304
308
  biotite/structure/io/pdbx/encoding.pyx,sha256=D8jUdfLXkXxFmut3Eu6V5ZUxQlBGgCS-eIWD0hasPxw,32128
305
309
  biotite/structure/io/pdbx/__init__.py,sha256=DlVXhrcuAF9A6Gim_JMccz-j8jDZuF2liDDA5cZxzx8,717
306
- biotite/structure/io/pdbx/compress.py,sha256=v5QbZIgd22FrdbazaL7DFdLBvkICwMI5G3FaRKqNUdA,13310
307
- biotite/structure/io/pdbx/cif.py,sha256=nTlgtU78Mb7IjEebwW-XuOAgEz9z5rAjD7A32IaEQek,34868
310
+ biotite/structure/io/pdbx/compress.py,sha256=GyGpDm8h7Trmaj1iq1RCGaYwYvxgtVnGFGvCBLnFvxM,13310
311
+ biotite/structure/io/pdbx/cif.py,sha256=1gyMDANR51yNXsV0aFIAK4VSUYl32nBIC94RwQf57PE,34978
308
312
  biotite/structure/io/pdbx/component.py,sha256=xnVVqpbBAj8ED4SCYx1tF6jHXCRVK8NWHcoG-fH7QVg,8398
309
313
  biotite/structure/io/xtc/__init__.py,sha256=ipZjsWBil-h2ujdlEobyI2jGy5xsfRVOPAyCsYAJ7G4,357
310
314
  biotite/structure/io/xtc/file.py,sha256=PknO2-xzLgKTBW5Gig5Hv1HUZ4BIHRf2con2MLxEwNU,1235
@@ -321,10 +325,10 @@ biotite/structure/io/mol/__init__.py,sha256=WvcNPDdf9W1zPyJ0tjTvGNxA83ht18uRQA8B
321
325
  biotite/structure/io/mol/ctab.py,sha256=yWhR81XMuWKrO3DVFG6hRgnvjOYQ7ituGTW7EnfDchs,14120
322
326
  biotite/structure/io/mol/mol.py,sha256=qp_yQ6tUIMmJNjzCqtle92mw_VJm4hkS0TRRJxAegS0,5461
323
327
  biotite/structure/io/mol/sdf.py,sha256=09GRt6OGdsWH-ccgR8tXVvDM6pCUhnsZdPRv9Dx_QQU,32975
324
- biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so,sha256=dG0FcqakD2vIR4pvH0avHNHxsRzffUntBEeBifa3V-Q,187416
328
+ biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so,sha256=Y4MEdMU4RKswHITS4nG99hnzSsfgNbE8UJ2qB8Gc1kI,180200
325
329
  biotite/structure/io/pdb/convert.py,sha256=ECG8KFmduPN2xd7HWqJweYabn-IFdnhxVNtO3AkzLaQ,13800
326
330
  biotite/structure/io/pdb/__init__.py,sha256=5NbUMDRKIe7jJ2ByRHpMhJzY_vIasjSgO63Zxrpq8BM,733
327
- biotite/structure/io/pdb/file.py,sha256=4N6E-iNhSvbZ98HmvcS-dI9qUCnwoZD4NqxrfwGMMx4,53635
331
+ biotite/structure/io/pdb/file.py,sha256=Ppb0bFqmp8xi-L-_dA3JzEuMBjLdUUJKZEDB4DUeblw,54085
328
332
  biotite/structure/io/pdb/hybrid36.pyx,sha256=BKV7oh0xrrjqVrkhTn7KEolon57fUhlG4Yf0Tf22wuU,8036
329
333
  biotite/structure/alphabet/pb.py,sha256=ksJKkYj4y3jzfvgFUF7g99W981RvH46RXKe3RW5fkR8,5994
330
334
  biotite/structure/alphabet/unkerasify.py,sha256=P-EY9gbWglJHPF9xp_SivF67bIQE73403htyJMu4-nE,3301
@@ -334,7 +338,7 @@ biotite/structure/alphabet/encoder.py,sha256=2BWLMdGBr2bHw09vMhbzPztMKSnVt8UhUf8
334
338
  biotite/structure/alphabet/i3d.py,sha256=SLJkVWiKl-EXMcsv8gcKF4zujoR5L8sQRyo9fnrETPM,3009
335
339
  biotite/structure/alphabet/pb.license,sha256=OkDCfXO06BfooLXYC3iF7LXXB_Uqqex1B2gjUEFdUZI,1091
336
340
  biotite/structure/alphabet/layers.py,sha256=Y1Y8G2LqqzC7M0kNUv8k-EXTVVKGLnPDJKdRrVEf3H4,2087
337
- biotite/structure/info/components.bcif,sha256=ouff7fpRp47Fq6CYsKBZlLpHkaN6x6X6q-dVnRs7uro,59990720
341
+ biotite/structure/info/components.bcif,sha256=y9ysqudHo8BQmtqI5JEMnEFXQtG1yt1X9WBtyw8yD2Y,60736935
338
342
  biotite/structure/info/misc.py,sha256=hAvTh8KdkPGsh9Y2mGxDRRt9ZDPgCoAGLHr1smCANlg,3428
339
343
  biotite/structure/info/atom_masses.json,sha256=WME4ezDPy-HrEIhxkOGxcmIMdgxf1x7e_xwBkFRdTsY,2383
340
344
  biotite/structure/info/__init__.py,sha256=k08kdsKlrxaVQ9x8MjEXoVFaXl1J8OcpLf6iG7dUgOY,698
@@ -348,7 +352,3 @@ biotite/structure/info/ccd.py,sha256=A3-YomYJS3bbAfntLpvwLkmCgQFjR2suMwFnGQsgPXg
348
352
  biotite/structure/graphics/__init__.py,sha256=YwMT8-c2DjrkcwyK6jPeDtAKxQda0OhElnwk8J0y3Hc,353
349
353
  biotite/structure/graphics/rna.py,sha256=1fa-_ROxHIdCQu4nFEmDWqWnQlXA6iZDZDprKST_h_g,11842
350
354
  biotite/structure/graphics/atoms.py,sha256=988_URX4hfTE3oBOYgAvZruOrzogMPcFKiTT5RJL01E,8116
351
- biotite-1.3.0.dist-info/RECORD,,
352
- biotite-1.3.0.dist-info/WHEEL,sha256=-B3I7-GmGBTt-SRVGImD3u4thPvZiqFGa5PvjykkCfw,135
353
- biotite-1.3.0.dist-info/METADATA,sha256=gcnHDjnEHlvw3vQKLx2ZpW64zoh-snCRfNU0n0erVEw,5525
354
- biotite-1.3.0.dist-info/licenses/LICENSE.rst,sha256=ZuNQuB65Dxf0rDB_5LxvA4SVQJBWxRZyvbjbvE-APWY,1534