biotite 1.3.0__cp311-cp311-macosx_11_0_arm64.whl → 1.4.0__cp311-cp311-macosx_11_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.

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-311-darwin.so +0 -0
  4. biotite/sequence/align/kmeralphabet.cpython-311-darwin.so +0 -0
  5. biotite/sequence/align/kmersimilarity.cpython-311-darwin.so +0 -0
  6. biotite/sequence/align/kmertable.cpython-311-darwin.so +0 -0
  7. biotite/sequence/align/localgapped.cpython-311-darwin.so +0 -0
  8. biotite/sequence/align/localungapped.cpython-311-darwin.so +0 -0
  9. biotite/sequence/align/multiple.cpython-311-darwin.so +0 -0
  10. biotite/sequence/align/pairwise.cpython-311-darwin.so +0 -0
  11. biotite/sequence/align/permutation.cpython-311-darwin.so +0 -0
  12. biotite/sequence/align/selector.cpython-311-darwin.so +0 -0
  13. biotite/sequence/align/tracetable.cpython-311-darwin.so +0 -0
  14. biotite/sequence/codec.cpython-311-darwin.so +0 -0
  15. biotite/sequence/phylo/nj.cpython-311-darwin.so +0 -0
  16. biotite/sequence/phylo/tree.cpython-311-darwin.so +0 -0
  17. biotite/sequence/phylo/upgma.cpython-311-darwin.so +0 -0
  18. biotite/structure/bonds.cpython-311-darwin.so +0 -0
  19. biotite/structure/bonds.pyx +67 -6
  20. biotite/structure/box.py +1 -1
  21. biotite/structure/celllist.cpython-311-darwin.so +0 -0
  22. biotite/structure/charges.cpython-311-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-311-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-311-darwin.so +0 -0
  32. biotite/structure/rings.py +117 -1
  33. biotite/structure/sasa.cpython-311-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=fm1N917lvYihbGT4OyonPrhA6HCp511clhZcK6Fbvns,133
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
@@ -70,7 +74,7 @@ biotite/application/clustalo/app.py,sha256=f5NEOkKCiTDlIVNJ1ozefzixwndVC4_vPQq8a
70
74
  biotite/application/muscle/app3.py,sha256=Otgzi3VEYv0iQ_q5TesRJEfB6krbF7wXxfN87JzdKFg,7653
71
75
  biotite/application/muscle/__init__.py,sha256=B1JrhQYjgwSKWxpcYgXS91f2GM5Tc1i9Ocs2wElslRs,338
72
76
  biotite/application/muscle/app5.py,sha256=xYF-iLn-UVue-vu4yGJFaQVtnPi561rwoIVwVCIu_C8,4474
73
- biotite/sequence/codec.cpython-311-darwin.so,sha256=_KQ5OPMg6H6FhDGtut5lvt9g734ZKpY9cZiWf21_eIg,285816
77
+ biotite/sequence/codec.cpython-311-darwin.so,sha256=P60kxyUVm_3HXONMv6wZpQZN3PODfhO9I7UP_7cVAw4,287736
74
78
  biotite/sequence/annotation.py,sha256=L_TZL2Gmsuokbr6A6Y6gVa4hbEM3ox_NJ_P5PTsZ4V0,29705
75
79
  biotite/sequence/codec.pyx,sha256=ed415FTMBJfiI9WbgKRFO3tF1f_SpRHxyEafLxW-g1k,4962
76
80
  biotite/sequence/sequence.py,sha256=eIZ7Ugz9IwXlWXs_HC2NGyAtDDcP-Vf1z82jynT_PPE,11691
@@ -97,36 +101,36 @@ biotite/sequence/io/genbank/file.py,sha256=5XvuJCd_FuI2zh03_bLbLSAuORNw4tXr7p9sG
97
101
  biotite/sequence/io/fastq/convert.py,sha256=x4rWn7WHdKxW1u7mwDgM8Z3qaML4lAO7r-JiMTQbvaI,3632
98
102
  biotite/sequence/io/fastq/__init__.py,sha256=lhw9bxWS0eKPXzF1lg8fvrNmgAmJPLBzIB6jEP5GOVI,588
99
103
  biotite/sequence/io/fastq/file.py,sha256=Q5jrBN21Fi0hp6rU5cc68kQPYc1jWdZfMwhx0Ze6oGw,17817
100
- biotite/sequence/align/selector.cpython-311-darwin.so,sha256=ekqt9Kb9HTP2ekyGL6KAobhL1S43Kr-x7IQS_HQUMDg,331120
104
+ biotite/sequence/align/selector.cpython-311-darwin.so,sha256=V0hKUkFJ6Ia8XOjH8ycHK-UV6AMyJvK8VkP7KnFVj0I,316176
101
105
  biotite/sequence/align/matrix.py,sha256=A1PUA43ltUnvYqB_RO6WPbvAtCzZI3zSfeKHP3aVSNQ,22360
102
106
  biotite/sequence/align/permutation.pyx,sha256=xbbw5DJ7c5SXnuSUl2hJUMxzvinKP1Khc7CSdH5cEE0,10028
103
107
  biotite/sequence/align/selector.pyx,sha256=BstkOkz-nB2dPtkZIZbU5QlCT-h3QHxdsGg1pGUh-Qo,33471
104
- biotite/sequence/align/kmeralphabet.cpython-311-darwin.so,sha256=XRoFxsGF5cKBsU_avXcvDIUd3fqAgdLu5WfuMY2R2dE,420032
108
+ biotite/sequence/align/kmeralphabet.cpython-311-darwin.so,sha256=bEeioCJN5P5IlicMFtOMOpTty9A-a3npGX4Kw5MhqXc,406384
105
109
  biotite/sequence/align/primes.txt,sha256=7pKfLGN1vjYl_KJ3y5uuo8np_5DDUH52UAkhb3fJfWE,10140
106
110
  biotite/sequence/align/kmeralphabet.pyx,sha256=t4MKs3uIXGn_2AB8NRKQxY73RoBLDa-IlKVnSdANkCU,18636
107
- biotite/sequence/align/kmertable.cpython-311-darwin.so,sha256=pBg3Xmr2rbriKK98R_W0xy1aaNtLUKlF4mQ4utAbRH0,728560
111
+ biotite/sequence/align/kmertable.cpython-311-darwin.so,sha256=eV1PwoHqJkV-Ugc2k1vl_qOY4U6B73rkhWOANhnnk3g,715984
108
112
  biotite/sequence/align/alignment.py,sha256=vf6Ldh0nevFkQ3dHJJRZw6_ZsqoWHHv-6M1Hy_DQgEs,22380
109
- biotite/sequence/align/kmersimilarity.cpython-311-darwin.so,sha256=XZIf5x1WRgXLtwsZdGWPwgPQ13xbg8CTqv125AUpVW8,232440
113
+ biotite/sequence/align/kmersimilarity.cpython-311-darwin.so,sha256=0V7iJYYGGANBnAunndf2dxnBiDbhTv509kNkZNgpZ70,217704
110
114
  biotite/sequence/align/tracetable.pyx,sha256=1gsT3OV7VkE6i_UpNiYOLVvD2_tfJgbNZb1yv9F4XR8,15455
111
115
  biotite/sequence/align/pairwise.pyx,sha256=Le9RWShVTDSUMpubq9-nxXSFNZp8CgYjhDsLUBE6yoY,22598
112
116
  biotite/sequence/align/__init__.py,sha256=NyYyB9PmYWCBQB_MaI-L54vYR64JraUvP9uobGJN54w,4711
113
- biotite/sequence/align/tracetable.cpython-311-darwin.so,sha256=H27GffGcIPGyY5nMGg-bhu8dgbstvjZoGBUAjOhjzME,204496
117
+ biotite/sequence/align/tracetable.cpython-311-darwin.so,sha256=1j5E9GU-d2BuEFBy2IiQzgZSXWkwy0RGoznlKXQvBbI,187520
114
118
  biotite/sequence/align/localungapped.pyx,sha256=h9wgrY85_t0_wOGDW56uJ9N4bo7GciYpeJZpNIBlp4g,9660
115
119
  biotite/sequence/align/buckets.py,sha256=k8H5RBS5Y7DrMoIOd5Ifrxp-nYWosJuqOYgLd1y-DWs,2464
116
- biotite/sequence/align/multiple.cpython-311-darwin.so,sha256=evOomWmsjPv9l2tDzcxdBd3mY_DT0AoBhYneijQSZ0Q,503104
120
+ biotite/sequence/align/multiple.cpython-311-darwin.so,sha256=JOe_Qmag9X7RbuoNKhvliLwXaYQWIDChEmyk648Y9T0,488992
117
121
  biotite/sequence/align/localgapped.pyx,sha256=1uoooliEMravtH1fQJSth0a6FEM4La_v32wGP2C0RIQ,33106
118
- biotite/sequence/align/permutation.cpython-311-darwin.so,sha256=1_AEYXjMfD-u7lboQvfKfRLcJqKJHyw9qB-eSOCsJ54,236400
122
+ biotite/sequence/align/permutation.cpython-311-darwin.so,sha256=ZowW7kOiOTifDoBT6RIoAqM65ZBo3eNhfKMou1Mbtys,237552
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
126
  biotite/sequence/align/multiple.pyx,sha256=ny6BbmXApxQAYMrUT7MPXqfFiEfrhfxvQApiSPoZ7iQ,21924
123
127
  biotite/sequence/align/statistics.py,sha256=mtscAgqIZIdTjtsvjg4s2A6gzFex0QxyHxmcAxpBQww,9652
124
128
  biotite/sequence/align/banded.pyx,sha256=n9-nBkEryjaA-_rQxjT90ZHKIh7Ep1cjFPjWPlHUC9I,25283
125
- biotite/sequence/align/pairwise.cpython-311-darwin.so,sha256=4UD-oyXu9KxWm-XAuB6KFpeqZphuGI1NMMcoESk7v7M,561840
126
- biotite/sequence/align/banded.cpython-311-darwin.so,sha256=z9HdFLT5Wkr80FpObSWHRK8HjvS0xiHfaHAWTSnmIlw,524784
129
+ biotite/sequence/align/pairwise.cpython-311-darwin.so,sha256=jlEfjohsRllSSPValVM5Od34deA7axJ6rOhWVvOZ16o,583120
130
+ biotite/sequence/align/banded.cpython-311-darwin.so,sha256=wBLBVsERjSc48ZEBykPpMlBQmQdeBbAjNnVQYJEMjSU,528336
127
131
  biotite/sequence/align/kmersimilarity.pyx,sha256=EBpz8R_fofRd4gsmBJLuH2qZgMWKlzQkCJ54w_-K7gQ,8433
128
- biotite/sequence/align/localgapped.cpython-311-darwin.so,sha256=d_Fg2sJTwBQ5Yvn8kVGz0SRaQQ7I24gvEddptzxWukg,1184768
129
- biotite/sequence/align/localungapped.cpython-311-darwin.so,sha256=msaoxkvrJCCdwT41zGu_8f7PGC9kI0fvrO6mdRBSzLs,306320
132
+ biotite/sequence/align/localgapped.cpython-311-darwin.so,sha256=blwPwnXW5sDpMhGDrLjon2Rsac8YpzOqcfbcj_jRFew,1138800
133
+ biotite/sequence/align/localungapped.cpython-311-darwin.so,sha256=nHz9TnXR3qOZCRAY8SdP9On0vR7ESXL6mtJirnFRZFg,307968
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
@@ -247,17 +251,17 @@ biotite/sequence/graphics/color_schemes/jalview_zappo.json,sha256=V0IJ-GsT8G8-J9
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
253
  biotite/sequence/phylo/nj.pyx,sha256=s6hoo_7s3VFy-7Hgq9lKtUVXTZ-To8Dxwytk-ohfWYI,7281
250
- biotite/sequence/phylo/nj.cpython-311-darwin.so,sha256=nN1m-sS5Iw5PBvffaYCRTTQHXe57bjWdMbm6x45U6qM,232584
254
+ biotite/sequence/phylo/nj.cpython-311-darwin.so,sha256=y2ycvMkB7K50rbhxa4cpuX3p65fTxid1HCA6wH3eq80,216920
251
255
  biotite/sequence/phylo/__init__.py,sha256=TW1CQqOa3JZYqidRy5XE8gA0HuzA8zo2Iouit3wSsBM,1261
252
256
  biotite/sequence/phylo/upgma.pyx,sha256=86QxGjj8fcGRhze7vZfqw8JLjLAZUevhkWDmzTy357E,5213
253
257
  biotite/sequence/phylo/tree.pyx,sha256=4e4Bhlm1qWY0Wvj6JqDE9jVwP6lEUmE8lIHEUmRNLwU,39206
254
- biotite/sequence/phylo/tree.cpython-311-darwin.so,sha256=m2lBdUJqLko7IGdD2JZ53ZPyBuJN4FbU_9-u_RHUiL0,287832
255
- biotite/sequence/phylo/upgma.cpython-311-darwin.so,sha256=qil3OHqFIyMV1Xwgf8ZYUyaZdQDsMe46cIE9yvPr-tY,212680
258
+ biotite/sequence/phylo/tree.cpython-311-darwin.so,sha256=mdIcPxM7WolBL9ESBdlNUc78ytaDo3NW7fD_KUmV_r4,273176
259
+ biotite/sequence/phylo/upgma.cpython-311-darwin.so,sha256=45uyuOAs2_8FpBbih99gRMT3JFo4cpvmsTs_bVzkAb8,214120
256
260
  biotite/structure/repair.py,sha256=EUvsV7EkJt-j7ruOnhZxhqdxfl7FMSKVzuQr7_xJE5g,6996
257
261
  biotite/structure/superimpose.py,sha256=gdn6be9KOf24qphK3mFRkxFDK4ejrtTm8C_tcpzSFHs,19562
258
- biotite/structure/sasa.cpython-311-darwin.so,sha256=JX9jdBIpPavxSSMJZ5W0b1iLYmhoRCeWEORcdD-K3WM,272408
262
+ biotite/structure/sasa.cpython-311-darwin.so,sha256=UPBrc7XiVgvrHFK1KsztSVvYc1YEWSp_RKnr-gUjxQI,256840
259
263
  biotite/structure/chains.py,sha256=_E4oEhXRg2AxsyZVy623fRkylzAFonDTDSLGSbh3-M8,8324
260
- biotite/structure/box.py,sha256=tcnKSV_6UWtzOqEo-ILyIHlt_09gyOMtO0JN2vxlS9o,23388
264
+ biotite/structure/box.py,sha256=0GFndCBJKBha8bMlX_9oIs0Y52a0S6Y0g1Qszh83_Sg,23396
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
@@ -265,11 +269,11 @@ biotite/structure/segments.py,sha256=1Z094xZWFsLTx_d5w67I-oHlEPCj2sbtLvZWaZfbgF4
265
269
  biotite/structure/sequence.py,sha256=TlJiSH1AC9XETl3G24UkKl1FHfpWh1aPKsdxj4ZdiEs,4245
266
270
  biotite/structure/sasa.pyx,sha256=lditLNluxg3LsxV1o3B69QOK0Lu1zeuRJXrEQ2SVIKk,12918
267
271
  biotite/structure/tm.py,sha256=HtG56CZI9fk3zjML5f5XJXcE7oKVtYS1r-HGm2ugawo,20967
268
- biotite/structure/celllist.cpython-311-darwin.so,sha256=C0yhpigiIW3PAK-tcNjJkepZieEAe7l3EY9EzemrKjE,334144
272
+ biotite/structure/celllist.cpython-311-darwin.so,sha256=VG-zSb10OGEY_08UMQUuXH3FIrbfjoZuEzWJoHxg3xg,319824
269
273
  biotite/structure/__init__.py,sha256=dqOp3qC1UU3AP7cxNus2wmtHLB9vB_D17Lhmd9cRxAM,5488
270
274
  biotite/structure/mechanics.py,sha256=A7590nMLbsfp_pHvLukca_YV0Q6VcrfDRW_p58D8ZNY,2587
271
275
  biotite/structure/sse.py,sha256=OHXohnYi4ipBcSas9XTi9Pm8oNasM49Oxr7DBvYbe1U,11404
272
- biotite/structure/bonds.cpython-311-darwin.so,sha256=HtkGadaHQTQlJ13z_LfumsCOsp5b4oV9U9Q5wZIPmD8,594904
276
+ biotite/structure/bonds.cpython-311-darwin.so,sha256=b8TBRHJT6Ir_6zErvLoblUwN5__o8yjwYGFMAaLkn1g,567480
273
277
  biotite/structure/charges.pyx,sha256=RpCz4sVOiwmZeVTcMAapiWJFVBPAK0gAAiNoNZuxZWA,18822
274
278
  biotite/structure/density.py,sha256=wGZFgqkK6Kdv0OzmmWz8eXPEVxPSFShxINWOOdehaIg,4197
275
279
  biotite/structure/rdf.py,sha256=Yf9PoWqSpNK3QsWqnCnOUBGL8WwKGOakgZ0pxj5UOiA,8104
@@ -277,14 +281,14 @@ biotite/structure/transform.py,sha256=i8xwMKfpHlN4hHFZBm7-U_nP5bLx_n1WgX8BQZ541_
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/charges.cpython-311-darwin.so,sha256=sMrtN-37rUMRWrTKXN576gpHFXOtDZ-lAKEUejcS6NQ,276592
287
+ biotite/structure/charges.cpython-311-darwin.so,sha256=mvunFPgxnxRqTESSxilspLBfyXwC4kvPWF7KWIsI_hw,277808
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,14 +302,14 @@ 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/bcif.py,sha256=k7WtZNB4U9czi00P1EpELZh8ty6cXRezll3yXdmiYOQ,21137
302
- biotite/structure/io/pdbx/convert.py,sha256=zGJsDmcbfB0xpigeTK0hyWsPANPnEv6eezxmg3Y2Bg8,79897
305
+ biotite/structure/io/pdbx/bcif.py,sha256=y5ueesX3G-5JSVj0chX6LiJ71IYdjgaF5x0nR6stiD0,21247
306
+ biotite/structure/io/pdbx/convert.py,sha256=hEBw0QeRNGRX70z3W0i7cDjVgIOD7RFrOnZGrUMa_gM,79916
303
307
  biotite/structure/io/pdbx/encoding.pyx,sha256=D8jUdfLXkXxFmut3Eu6V5ZUxQlBGgCS-eIWD0hasPxw,32128
304
308
  biotite/structure/io/pdbx/__init__.py,sha256=DlVXhrcuAF9A6Gim_JMccz-j8jDZuF2liDDA5cZxzx8,717
305
- biotite/structure/io/pdbx/compress.py,sha256=v5QbZIgd22FrdbazaL7DFdLBvkICwMI5G3FaRKqNUdA,13310
306
- biotite/structure/io/pdbx/cif.py,sha256=nTlgtU78Mb7IjEebwW-XuOAgEz9z5rAjD7A32IaEQek,34868
309
+ biotite/structure/io/pdbx/compress.py,sha256=GyGpDm8h7Trmaj1iq1RCGaYwYvxgtVnGFGvCBLnFvxM,13310
310
+ biotite/structure/io/pdbx/cif.py,sha256=1gyMDANR51yNXsV0aFIAK4VSUYl32nBIC94RwQf57PE,34978
307
311
  biotite/structure/io/pdbx/component.py,sha256=xnVVqpbBAj8ED4SCYx1tF6jHXCRVK8NWHcoG-fH7QVg,8398
308
- biotite/structure/io/pdbx/encoding.cpython-311-darwin.so,sha256=neXIEdYqeG6qIwO7JIPfBT_LXLYfoK82ILYn9bJu2Sk,1182496
312
+ biotite/structure/io/pdbx/encoding.cpython-311-darwin.so,sha256=5MJ6s0-rjET9LtIIFo0Py2ucWP_h_FXb5LUuK-BJ7ak,1166320
309
313
  biotite/structure/io/xtc/__init__.py,sha256=ipZjsWBil-h2ujdlEobyI2jGy5xsfRVOPAyCsYAJ7G4,357
310
314
  biotite/structure/io/xtc/file.py,sha256=PknO2-xzLgKTBW5Gig5Hv1HUZ4BIHRf2con2MLxEwNU,1235
311
315
  biotite/structure/io/pdbqt/convert.py,sha256=xF4m-tZG_4ykhZsknqUivFXbb6VqLXVLwmhi1AbOmuw,4008
@@ -323,9 +327,9 @@ biotite/structure/io/mol/mol.py,sha256=qp_yQ6tUIMmJNjzCqtle92mw_VJm4hkS0TRRJxAeg
323
327
  biotite/structure/io/mol/sdf.py,sha256=09GRt6OGdsWH-ccgR8tXVvDM6pCUhnsZdPRv9Dx_QQU,32975
324
328
  biotite/structure/io/pdb/convert.py,sha256=ECG8KFmduPN2xd7HWqJweYabn-IFdnhxVNtO3AkzLaQ,13800
325
329
  biotite/structure/io/pdb/__init__.py,sha256=5NbUMDRKIe7jJ2ByRHpMhJzY_vIasjSgO63Zxrpq8BM,733
326
- biotite/structure/io/pdb/file.py,sha256=4N6E-iNhSvbZ98HmvcS-dI9qUCnwoZD4NqxrfwGMMx4,53635
330
+ biotite/structure/io/pdb/file.py,sha256=Ppb0bFqmp8xi-L-_dA3JzEuMBjLdUUJKZEDB4DUeblw,54085
327
331
  biotite/structure/io/pdb/hybrid36.pyx,sha256=BKV7oh0xrrjqVrkhTn7KEolon57fUhlG4Yf0Tf22wuU,8036
328
- biotite/structure/io/pdb/hybrid36.cpython-311-darwin.so,sha256=lQLc3VdQdXfJO1Jl9uYR5-C4cDYlv7rGFRyhGXyH9Pw,210096
332
+ biotite/structure/io/pdb/hybrid36.cpython-311-darwin.so,sha256=Js8Mig8a1Xad8ScUlbrqWthUd0eLgN_aQZRfWt5nMAE,194480
329
333
  biotite/structure/alphabet/pb.py,sha256=ksJKkYj4y3jzfvgFUF7g99W981RvH46RXKe3RW5fkR8,5994
330
334
  biotite/structure/alphabet/unkerasify.py,sha256=P-EY9gbWglJHPF9xp_SivF67bIQE73403htyJMu4-nE,3301
331
335
  biotite/structure/alphabet/encoder_weights_3di.kerasify,sha256=m4JF4oVWBbiu6r8DM9ONQ5Bmcbqwr5dxKfqYThOmHpk,1032
@@ -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=fm1N917lvYihbGT4OyonPrhA6HCp511clhZcK6Fbvns,133
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