biotite 1.0.0__cp311-cp311-macosx_11_0_arm64.whl → 1.0.1__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 (31) hide show
  1. biotite/sequence/align/banded.cpython-311-darwin.so +0 -0
  2. biotite/sequence/align/kmeralphabet.cpython-311-darwin.so +0 -0
  3. biotite/sequence/align/kmersimilarity.cpython-311-darwin.so +0 -0
  4. biotite/sequence/align/kmertable.cpython-311-darwin.so +0 -0
  5. biotite/sequence/align/localgapped.cpython-311-darwin.so +0 -0
  6. biotite/sequence/align/localungapped.cpython-311-darwin.so +0 -0
  7. biotite/sequence/align/multiple.cpython-311-darwin.so +0 -0
  8. biotite/sequence/align/pairwise.cpython-311-darwin.so +0 -0
  9. biotite/sequence/align/permutation.cpython-311-darwin.so +0 -0
  10. biotite/sequence/align/selector.cpython-311-darwin.so +0 -0
  11. biotite/sequence/align/tracetable.cpython-311-darwin.so +0 -0
  12. biotite/sequence/codec.cpython-311-darwin.so +0 -0
  13. biotite/sequence/phylo/nj.cpython-311-darwin.so +0 -0
  14. biotite/sequence/phylo/tree.cpython-311-darwin.so +0 -0
  15. biotite/sequence/phylo/upgma.cpython-311-darwin.so +0 -0
  16. biotite/structure/atoms.py +27 -3
  17. biotite/structure/bonds.cpython-311-darwin.so +0 -0
  18. biotite/structure/celllist.cpython-311-darwin.so +0 -0
  19. biotite/structure/charges.cpython-311-darwin.so +0 -0
  20. biotite/structure/filter.py +1 -1
  21. biotite/structure/io/pdb/hybrid36.cpython-311-darwin.so +0 -0
  22. biotite/structure/io/pdbx/cif.py +79 -51
  23. biotite/structure/io/pdbx/convert.py +34 -21
  24. biotite/structure/io/pdbx/encoding.cpython-311-darwin.so +0 -0
  25. biotite/structure/io/trajfile.py +16 -16
  26. biotite/structure/sasa.cpython-311-darwin.so +0 -0
  27. biotite/version.py +2 -2
  28. {biotite-1.0.0.dist-info → biotite-1.0.1.dist-info}/METADATA +2 -1
  29. {biotite-1.0.0.dist-info → biotite-1.0.1.dist-info}/RECORD +31 -31
  30. {biotite-1.0.0.dist-info → biotite-1.0.1.dist-info}/WHEEL +0 -0
  31. {biotite-1.0.0.dist-info → biotite-1.0.1.dist-info}/licenses/LICENSE.rst +0 -0
@@ -99,9 +99,24 @@ class _AtomArrayBase(Copyable, metaclass=abc.ABCMeta):
99
99
  See Also
100
100
  --------
101
101
  set_annotation
102
+
103
+ Notes
104
+ -----
105
+ If the annotation category already exists, a compatible dtype is chosen,
106
+ that is also able to represent the old values.
102
107
  """
103
108
  if category not in self._annot:
104
109
  self._annot[str(category)] = np.zeros(self._array_length, dtype=dtype)
110
+ elif np.can_cast(self._annot[str(category)].dtype, dtype):
111
+ self._annot[str(category)] = self._annot[str(category)].astype(dtype)
112
+ elif np.can_cast(dtype, self._annot[str(category)].dtype):
113
+ # The existing dtype is more general
114
+ pass
115
+ else:
116
+ raise ValueError(
117
+ f"Cannot cast '{str(category)}' "
118
+ f"with dtype '{self._annot[str(category)].dtype}' into '{dtype}'"
119
+ )
105
120
 
106
121
  def del_annotation(self, category):
107
122
  """
@@ -145,16 +160,25 @@ class _AtomArrayBase(Copyable, metaclass=abc.ABCMeta):
145
160
  array : ndarray or None
146
161
  The new value of the annotation category. The size of the
147
162
  array must be the same as the array length.
163
+
164
+ Notes
165
+ -----
166
+ If the annotation category already exists, a compatible dtype is chosen,
167
+ that is able to represent the old and new array values.
148
168
  """
169
+ array = np.asarray(array)
149
170
  if len(array) != self._array_length:
150
171
  raise IndexError(
151
172
  f"Expected array length {self._array_length}, " f"but got {len(array)}"
152
173
  )
153
174
  if category in self._annot:
154
- # Keep the dtype if the annotation already exists
155
- self._annot[category] = np.asarray(array, dtype=self._annot[category].dtype)
175
+ # If the annotation already exists, find the compatible dtype
176
+ self._annot[category] = array.astype(
177
+ dtype=np.promote_types(self._annot[category].dtype, array.dtype),
178
+ copy=False,
179
+ )
156
180
  else:
157
- self._annot[category] = np.asarray(array)
181
+ self._annot[category] = array
158
182
 
159
183
  def get_annotation_categories(self):
160
184
  """
@@ -577,7 +577,7 @@ def filter_highest_occupancy_altloc(atoms, altloc_ids, occupancies):
577
577
  if len(letter_altloc_ids) > 0:
578
578
  highest = -1.0
579
579
  highest_id = None
580
- for id in set(letter_altloc_ids):
580
+ for id in sorted(set(letter_altloc_ids)):
581
581
  occupancy_sum = np.sum(occupancies_in_res[altloc_ids_in_res == id])
582
582
  if occupancy_sum > highest:
583
583
  highest = occupancy_sum
@@ -370,7 +370,7 @@ class CIFCategory(_Component, MutableMapping):
370
370
  if category_name is None:
371
371
  raise DeserializationError("Failed to parse category name")
372
372
 
373
- lines = _to_single(lines, is_looped)
373
+ lines = _to_single(lines)
374
374
  if is_looped:
375
375
  category_dict = CIFCategory._deserialize_looped(lines, expect_whitespace)
376
376
  else:
@@ -439,11 +439,28 @@ class CIFCategory(_Component, MutableMapping):
439
439
  Process a category where each field has a single value.
440
440
  """
441
441
  category_dict = {}
442
- for line in lines:
442
+ line_i = 0
443
+ while line_i < len(lines):
444
+ line = lines[line_i]
443
445
  parts = _split_one_line(line)
444
- column_name = parts[0].split(".")[1]
445
- column = parts[1]
446
- category_dict[column_name] = CIFColumn(column)
446
+ if len(parts) == 2:
447
+ # Standard case -> name and value in one line
448
+ name_part, value_part = parts
449
+ line_i += 1
450
+ elif len(parts) == 1:
451
+ # Value is a multiline value on the next line
452
+ name_part = parts[0]
453
+ parts = _split_one_line(lines[line_i + 1])
454
+ if len(parts) == 1:
455
+ value_part = parts[0]
456
+ else:
457
+ raise DeserializationError(f"Failed to parse line '{line}'")
458
+ line_i += 2
459
+ elif len(parts) == 0:
460
+ raise DeserializationError("Empty line within category")
461
+ else:
462
+ raise DeserializationError(f"Failed to parse line '{line}'")
463
+ category_dict[name_part.split(".")[1]] = CIFColumn(value_part)
447
464
  return category_dict
448
465
 
449
466
  @staticmethod
@@ -468,7 +485,7 @@ class CIFCategory(_Component, MutableMapping):
468
485
  data_lines = lines[i:]
469
486
  # Rows may be split over multiple lines -> do not rely on
470
487
  # row-line-alignment at all and simply cycle through columns
471
- column_names = itertools.cycle(column_names)
488
+ column_indices = itertools.cycle(range(len(column_names)))
472
489
  for data_line in data_lines:
473
490
  # If whitespace is expected in quote protected values,
474
491
  # use regex-based _split_one_line() to split
@@ -485,9 +502,18 @@ class CIFCategory(_Component, MutableMapping):
485
502
  ):
486
503
  values[k] = values[k][1:-1]
487
504
  for val in values:
488
- column_name = next(column_names)
505
+ column_index = next(column_indices)
506
+ column_name = column_names[column_index]
489
507
  category_dict[column_name].append(val)
490
508
 
509
+ # Check if all columns have the same length
510
+ # Otherwise, this would indicate a parsing error or an invalid CIF file
511
+ column_index = next(column_indices)
512
+ if column_index != 0:
513
+ raise DeserializationError(
514
+ "Category contains columns with different lengths"
515
+ )
516
+
491
517
  return category_dict
492
518
 
493
519
  def _serialize_single(self):
@@ -496,7 +522,8 @@ class CIFCategory(_Component, MutableMapping):
496
522
  # "+3" Because of three whitespace chars after longest key
497
523
  req_len = max_len + 3
498
524
  return [
499
- key.ljust(req_len) + _multiline(_quote(column.as_item()))
525
+ # Remove potential terminal newlines from multiline values
526
+ (key.ljust(req_len) + _escape(column.as_item())).strip()
500
527
  for key, column in zip(keys, self.values())
501
528
  ]
502
529
 
@@ -508,7 +535,7 @@ class CIFCategory(_Component, MutableMapping):
508
535
  array = column.as_array(str)
509
536
  # Quote before measuring the number of chars,
510
537
  # as the quote characters modify the length
511
- array = np.array([_multiline(_quote(element)) for element in array])
538
+ array = np.array([_escape(element) for element in array])
512
539
  column_arrays.append(array)
513
540
 
514
541
  # Number of characters the longest string in the column needs
@@ -522,7 +549,8 @@ class CIFCategory(_Component, MutableMapping):
522
549
  for j, array in enumerate(column_arrays):
523
550
  value_lines[i] += array[i].ljust(column_n_chars[j])
524
551
  # Remove trailing justification of last column
525
- value_lines[i].rstrip()
552
+ # and potential terminal newlines from multiline values
553
+ value_lines[i] = value_lines[i].strip()
526
554
 
527
555
  return ["loop_"] + key_lines + value_lines
528
556
 
@@ -927,52 +955,50 @@ def _is_loop_start(line):
927
955
  return line.startswith("loop_")
928
956
 
929
957
 
930
- def _to_single(lines, is_looped):
931
- """
958
+ def _to_single(lines):
959
+ r"""
932
960
  Convert multiline values into singleline values
933
961
  (in terms of 'lines' list elements).
934
- Linebreaks are preserved.
962
+ Linebreaks are preserved as ``'\n'`` characters within a list element.
963
+ The initial ``';'`` character is also preserved, while the final ``';'`` character
964
+ is removed.
935
965
  """
936
- processed_lines = [None] * len(lines)
937
- in_i = 0
938
- out_i = 0
939
- while in_i < len(lines):
940
- if lines[in_i][0] == ";":
941
- # Multiline value
942
- multi_line_str = lines[in_i][1:]
943
- j = in_i + 1
944
- while lines[j] != ";":
945
- # Preserve linebreaks
946
- multi_line_str += "\n" + lines[j]
947
- j += 1
948
- if is_looped:
949
- # Create a line for the multiline string only
950
- processed_lines[out_i] = f"'{multi_line_str}'"
951
- out_i += 1
966
+ processed_lines = []
967
+ in_multi_line = False
968
+ mutli_line_value = []
969
+ for line in lines:
970
+ # Multiline value are enclosed by ';' at the start of the beginning and end line
971
+ if line[0] == ";":
972
+ if not in_multi_line:
973
+ # Start of multiline value
974
+ in_multi_line = True
975
+ mutli_line_value.append(line)
952
976
  else:
953
- # Append multiline string to previous line
954
- processed_lines[out_i - 1] += " " + f"'{multi_line_str}'"
955
- in_i = j + 1
956
-
957
- elif not is_looped and lines[in_i][0] != "_":
958
- # Singleline value in the line after the corresponding key
959
- processed_lines[out_i - 1] += " " + lines[in_i]
960
- in_i += 1
961
-
977
+ # End of multiline value
978
+ in_multi_line = False
979
+ # The current line contains only the end character ';'
980
+ # Hence this line is not added to the processed lines
981
+ processed_lines.append("\n".join(mutli_line_value))
982
+ mutli_line_value = []
962
983
  else:
963
- # Normal singleline value in the same row as the key
964
- processed_lines[out_i] = lines[in_i]
965
- in_i += 1
966
- out_i += 1
967
-
968
- return [line for line in processed_lines if line is not None]
984
+ if in_multi_line:
985
+ mutli_line_value.append(line)
986
+ else:
987
+ processed_lines.append(line)
988
+ return processed_lines
969
989
 
970
990
 
971
- def _quote(value):
991
+ def _escape(value):
972
992
  """
973
- A less secure but much quicker version of ``shlex.quote()``.
993
+ Escape special characters in a value to make it compatible with CIF.
974
994
  """
975
- if len(value) == 0:
995
+ if "\n" in value:
996
+ # A value with linebreaks must be represented as multiline value
997
+ return _multiline(value)
998
+ elif "'" in value and '"' in value:
999
+ # If both quote types are present, you cannot use them for escaping
1000
+ return _multiline(value)
1001
+ elif len(value) == 0:
976
1002
  return "''"
977
1003
  elif value[0] == "_":
978
1004
  return "'" + value + "'"
@@ -990,12 +1016,10 @@ def _quote(value):
990
1016
 
991
1017
  def _multiline(value):
992
1018
  """
993
- Convert a string containing linebreaks into CIF-compatible
1019
+ Convert a string that may contain linebreaks into CIF-compatible
994
1020
  multiline string.
995
1021
  """
996
- if "\n" in value:
997
- return "\n;" + value + "\n;\n"
998
- return value
1022
+ return "\n;" + value + "\n;\n"
999
1023
 
1000
1024
 
1001
1025
  def _split_one_line(line):
@@ -1003,6 +1027,10 @@ def _split_one_line(line):
1003
1027
  Split a line into its fields.
1004
1028
  Supporting embedded quotes (' or "), like `'a dog's life'` to `a dog's life`
1005
1029
  """
1030
+ # Special case of multiline value, where the line starts with ';'
1031
+ if line[0] == ";":
1032
+ return [line[1:]]
1033
+
1006
1034
  # Define the patterns for different types of fields
1007
1035
  single_quote_pattern = r"('(?:'(?! )|[^'])*')(?:\s|$)"
1008
1036
  double_quote_pattern = r'("(?:"(?! )|[^"])*")(?:\s|$)'
@@ -450,7 +450,7 @@ def _fill_annotations(array, atom_site, extra_fields, use_author_fields):
450
450
  "chain_id",
451
451
  _get_or_fallback(
452
452
  atom_site, f"{prefix}_asym_id", f"{alt_prefix}_asym_id"
453
- ).as_array("U4"),
453
+ ).as_array(str),
454
454
  )
455
455
  array.set_annotation(
456
456
  "res_id",
@@ -458,21 +458,21 @@ def _fill_annotations(array, atom_site, extra_fields, use_author_fields):
458
458
  atom_site, f"{prefix}_seq_id", f"{alt_prefix}_seq_id"
459
459
  ).as_array(int, -1),
460
460
  )
461
- array.set_annotation("ins_code", atom_site["pdbx_PDB_ins_code"].as_array("U1", ""))
461
+ array.set_annotation("ins_code", atom_site["pdbx_PDB_ins_code"].as_array(str, ""))
462
462
  array.set_annotation(
463
463
  "res_name",
464
464
  _get_or_fallback(
465
465
  atom_site, f"{prefix}_comp_id", f"{alt_prefix}_comp_id"
466
- ).as_array("U5"),
466
+ ).as_array(str),
467
467
  )
468
468
  array.set_annotation("hetero", atom_site["group_PDB"].as_array(str) == "HETATM")
469
469
  array.set_annotation(
470
470
  "atom_name",
471
471
  _get_or_fallback(
472
472
  atom_site, f"{prefix}_atom_id", f"{alt_prefix}_atom_id"
473
- ).as_array("U6"),
473
+ ).as_array(str),
474
474
  )
475
- array.set_annotation("element", atom_site["type_symbol"].as_array("U2"))
475
+ array.set_annotation("element", atom_site["type_symbol"].as_array(str))
476
476
 
477
477
  if "atom_id" in extra_fields:
478
478
  array.set_annotation("atom_id", atom_site["id"].as_array(int))
@@ -577,7 +577,7 @@ def _parse_inter_residue_bonds(atom_site, struct_conn):
577
577
  atoms_indices_2 = atoms_indices_2[mapping_exists_mask]
578
578
 
579
579
  # Interpret missing values as ANY bonds
580
- bond_order = struct_conn["pdbx_value_order"].as_array("U4", "")
580
+ bond_order = struct_conn["pdbx_value_order"].as_array(str, "")
581
581
  # Consecutively apply the same masks as applied to the atom indices
582
582
  # Logical combination does not work here,
583
583
  # as the second mask was created based on already filtered data
@@ -964,25 +964,38 @@ def _set_intra_residue_bonds(array, atom_site):
964
964
  aromatic_flag[i] = aromatic
965
965
  any_mask = bond_array[:, 2] == BondType.ANY
966
966
 
967
- chem_comp_bond = Category()
967
+ # Remove already existing residue and atom name combinations
968
+ # These appear when the structure contains a residue multiple times
969
+ atom_id_1 = array.atom_name[bond_array[:, 0]]
970
+ atom_id_2 = array.atom_name[bond_array[:, 1]]
968
971
  # Take the residue name from the first atom index, as the residue
969
972
  # name is the same for both atoms, since we have only intra bonds
970
- chem_comp_bond["comp_id"] = array.res_name[bond_array[:, 0]]
971
- chem_comp_bond["atom_id_1"] = array.atom_name[bond_array[:, 0]]
972
- chem_comp_bond["atom_id_2"] = array.atom_name[bond_array[:, 1]]
973
+ comp_id = array.res_name[bond_array[:, 0]]
974
+ _, unique_indices = np.unique(
975
+ np.stack([comp_id, atom_id_1, atom_id_2], axis=-1), axis=0, return_index=True
976
+ )
977
+ unique_indices.sort()
978
+
979
+ chem_comp_bond = Category()
980
+ n_bonds = len(unique_indices)
981
+ chem_comp_bond["pdbx_ordinal"] = np.arange(1, n_bonds + 1, dtype=np.int32)
982
+ chem_comp_bond["comp_id"] = comp_id[unique_indices]
983
+ chem_comp_bond["atom_id_1"] = atom_id_1[unique_indices]
984
+ chem_comp_bond["atom_id_2"] = atom_id_2[unique_indices]
973
985
  chem_comp_bond["value_order"] = Column(
974
- value_order, np.where(any_mask, MaskValue.MISSING, MaskValue.PRESENT)
986
+ value_order[unique_indices],
987
+ np.where(any_mask[unique_indices], MaskValue.MISSING, MaskValue.PRESENT),
975
988
  )
976
989
  chem_comp_bond["pdbx_aromatic_flag"] = Column(
977
- aromatic_flag, np.where(any_mask, MaskValue.MISSING, MaskValue.PRESENT)
990
+ aromatic_flag[unique_indices],
991
+ np.where(any_mask[unique_indices], MaskValue.MISSING, MaskValue.PRESENT),
978
992
  )
979
993
  # BondList does not contain stereo information
980
994
  # -> all values are missing
981
995
  chem_comp_bond["pdbx_stereo_config"] = Column(
982
- np.zeros(len(bond_array), dtype="U1"),
983
- np.full(len(bond_array), MaskValue.MISSING),
996
+ np.zeros(n_bonds, dtype="U1"),
997
+ np.full(n_bonds, MaskValue.MISSING),
984
998
  )
985
- chem_comp_bond["pdbx_ordinal"] = np.arange(1, len(bond_array) + 1, dtype=np.int32)
986
999
  return chem_comp_bond
987
1000
 
988
1001
 
@@ -1007,6 +1020,7 @@ def _set_inter_residue_bonds(array, atom_site):
1007
1020
  bond_array = _filter_bonds(array, "inter")
1008
1021
  if len(bond_array) == 0:
1009
1022
  return None
1023
+
1010
1024
  struct_conn = Category()
1011
1025
  struct_conn["id"] = np.arange(1, len(bond_array) + 1)
1012
1026
  struct_conn["conn_type_id"] = np.full(len(bond_array), "covale")
@@ -1135,12 +1149,11 @@ def get_component(pdbx_file, data_block=None, use_ideal_coord=True, res_name=Non
1135
1149
 
1136
1150
  array = AtomArray(atom_category.row_count)
1137
1151
 
1138
- array.hetero[:] = True
1139
- array.res_name = atom_category["comp_id"].as_array("U5")
1140
- array.atom_name = atom_category["atom_id"].as_array("U6")
1141
- array.element = atom_category["type_symbol"].as_array("U2")
1142
- array.add_annotation("charge", int)
1143
- array.charge = atom_category["charge"].as_array(int, 0)
1152
+ array.set_annotation("hetero", np.full(len(atom_category["comp_id"]), True))
1153
+ array.set_annotation("res_name", atom_category["comp_id"].as_array(str))
1154
+ array.set_annotation("atom_name", atom_category["atom_id"].as_array(str))
1155
+ array.set_annotation("element", atom_category["type_symbol"].as_array(str))
1156
+ array.set_annotation("charge", atom_category["charge"].as_array(int, 0))
1144
1157
 
1145
1158
  coord_fields = [f"pdbx_model_Cartn_{dim}_ideal" for dim in ("x", "y", "z")]
1146
1159
  alt_coord_fields = [f"model_Cartn_{dim}" for dim in ("x", "y", "z")]
@@ -54,9 +54,9 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
54
54
 
55
55
  Parameters
56
56
  ----------
57
- file_name : str
57
+ file_name : str or Path
58
58
  The path of the file to be read.
59
- A file-like-object cannot be used.
59
+ Any other file-like object cannot be used.
60
60
  start : int, optional
61
61
  The frame index, where file parsing is started. If no value
62
62
  is given, parsing starts at the first frame.
@@ -101,7 +101,7 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
101
101
  chunk_size = ((chunk_size // step) + 1) * step
102
102
 
103
103
  traj_type = cls.traj_type()
104
- with traj_type(file_name, "r") as f:
104
+ with traj_type(str(file_name), "r") as f:
105
105
  if start is None:
106
106
  start = 0
107
107
  # Discard atoms before start
@@ -153,9 +153,9 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
153
153
 
154
154
  Parameters
155
155
  ----------
156
- file_name : str
156
+ file_name : str or Path
157
157
  The path of the file to be read.
158
- A file-like-object cannot be used.
158
+ Any other file-like object cannot be used.
159
159
  start : int, optional
160
160
  The frame index, where file parsing is started. If no value
161
161
  is given, parsing starts at the first frame.
@@ -196,7 +196,7 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
196
196
  The `step` parameter does currently not work for *DCD* files.
197
197
  """
198
198
  traj_type = cls.traj_type()
199
- with traj_type(file_name, "r") as f:
199
+ with traj_type(str(file_name), "r") as f:
200
200
  if start is None:
201
201
  start = 0
202
202
  # Discard atoms before start
@@ -280,9 +280,9 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
280
280
 
281
281
  Parameters
282
282
  ----------
283
- file_name : str
283
+ file_name : str or Path
284
284
  The path of the file to be read.
285
- A file-like-object cannot be used.
285
+ Any other file-like object cannot be used.
286
286
  template : AtomArray or AtomArrayStack
287
287
  The template array or stack, where the atom annotation data
288
288
  is taken from.
@@ -354,13 +354,13 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
354
354
 
355
355
  Parameters
356
356
  ----------
357
- file_name : str
358
- The path of the file to be written to.
359
- A file-like-object cannot be used.
357
+ file_name : str or Path
358
+ The path of the file to be read.
359
+ Any other file-like object cannot be used.
360
360
  """
361
361
  traj_type = self.traj_type()
362
362
  param = self.prepare_write_values(self._coord, self._box, self._time)
363
- with traj_type(file_name, "w") as f:
363
+ with traj_type(str(file_name), "w") as f:
364
364
  f.write(**param)
365
365
 
366
366
  @classmethod
@@ -378,9 +378,9 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
378
378
 
379
379
  Parameters
380
380
  ----------
381
- file_name : str
382
- The path of the file to be written to.
383
- A file-like-object cannot be used.
381
+ file_name : str or Path
382
+ The path of the file to be read.
383
+ Any other file-like object cannot be used.
384
384
  coord : generator or array-like of ndarray, shape=(n,3), dtype=float
385
385
  The atom coordinates for each frame.
386
386
  box : generator or array-like of ndarray, shape=(3,3), dtype=float, optional
@@ -398,7 +398,7 @@ class TrajectoryFile(File, metaclass=abc.ABCMeta):
398
398
  time = itertools.repeat(None)
399
399
 
400
400
  traj_type = cls.traj_type()
401
- with traj_type(file_name, "w") as f:
401
+ with traj_type(str(file_name), "w") as f:
402
402
  for c, b, t in zip(coord, box, time):
403
403
  if c.ndim != 2:
404
404
  raise IndexError(
biotite/version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.0.0'
16
- __version_tuple__ = version_tuple = (1, 0, 0)
15
+ __version__ = version = '1.0.1'
16
+ __version_tuple__ = version_tuple = (1, 0, 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: biotite
3
- Version: 1.0.0
3
+ Version: 1.0.1
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
@@ -56,6 +56,7 @@ Requires-Dist: numpy>=1.25
56
56
  Requires-Dist: requests>=2.12
57
57
  Provides-Extra: test
58
58
  Requires-Dist: pytest; extra == 'test'
59
+ Requires-Dist: pytest-codspeed; extra == 'test'
59
60
  Description-Content-Type: text/x-rst
60
61
 
61
62
  .. image:: https://img.shields.io/pypi/v/biotite.svg
@@ -1,8 +1,4 @@
1
- biotite-1.0.0.dist-info/RECORD,,
2
- biotite-1.0.0.dist-info/WHEEL,sha256=FADWsAbCknuFYRiPIqUqs7TwHvSgFIOpRdMEMMJW_gY,105
3
- biotite-1.0.0.dist-info/METADATA,sha256=C6tIVbg8HfB-DgcNYsM7sb56iNpH-n4EulEWtL_-2fQ,7111
4
- biotite-1.0.0.dist-info/licenses/LICENSE.rst,sha256=ZuNQuB65Dxf0rDB_5LxvA4SVQJBWxRZyvbjbvE-APWY,1534
5
- biotite/version.py,sha256=DGJ4pj32xs3_DRJhSzQwCiRNnAQrMgo09USYpyMZsKc,411
1
+ biotite/version.py,sha256=IIj5MPQqf7H30zvHF3gsfSLSw1SsdlKYR9SngW-9GC8,411
6
2
  biotite/copyable.py,sha256=C7ycTQxqanxT0SmXhzy5OLp7NpZdNWHyokozdoVDGNA,1897
7
3
  biotite/__init__.py,sha256=rL8ZyaCUjOrECEvRxyHj8MOMp4FHMJ8n6KKgrYf5OAQ,545
8
4
  biotite/visualize.py,sha256=EYUBKgeNrkPI53f7L4T893NMmLWgBp07aO2XFcdpYTU,10012
@@ -56,7 +52,7 @@ biotite/application/clustalo/app.py,sha256=JdICuA14SHdiuYPt6Y1cc1d6zHTNZaXzoPk_y
56
52
  biotite/application/muscle/app3.py,sha256=-T6AmkGlBE0EAxp3ZG--tvcxUVBTkBdr7W5qzUrDTXE,8085
57
53
  biotite/application/muscle/__init__.py,sha256=B1JrhQYjgwSKWxpcYgXS91f2GM5Tc1i9Ocs2wElslRs,338
58
54
  biotite/application/muscle/app5.py,sha256=cjK26uAcL3dblyxa8WzfJE8FXzo3FZ0p5jn8ttu8YNc,4426
59
- biotite/sequence/codec.cpython-311-darwin.so,sha256=Si8UZ1W2yU9-g3wNAWoLvr2HsetnokAsAnYRNZSlWcg,285816
55
+ biotite/sequence/codec.cpython-311-darwin.so,sha256=KJmXuqjTafzHe6YwNfAowzPROgs6Bz-QKwmbKCGm3ic,285816
60
56
  biotite/sequence/annotation.py,sha256=b0A1_NciOz2g3PEG0AgIcNC5XXmHap2PScbIpyKO0v8,29513
61
57
  biotite/sequence/codec.pyx,sha256=ed415FTMBJfiI9WbgKRFO3tF1f_SpRHxyEafLxW-g1k,4962
62
58
  biotite/sequence/sequence.py,sha256=6k2WVEd4JX4pnTQ-nbtrhvLBCVEaTpsETfsiCBD5Cfk,11693
@@ -83,36 +79,36 @@ biotite/sequence/io/genbank/file.py,sha256=UQDvUUqftl7g5mMHPVrhzNzZEai8fmKDXlTfB
83
79
  biotite/sequence/io/fastq/convert.py,sha256=x4rWn7WHdKxW1u7mwDgM8Z3qaML4lAO7r-JiMTQbvaI,3632
84
80
  biotite/sequence/io/fastq/__init__.py,sha256=lhw9bxWS0eKPXzF1lg8fvrNmgAmJPLBzIB6jEP5GOVI,588
85
81
  biotite/sequence/io/fastq/file.py,sha256=OwSUw-Unp8AQc7LdpJSI2zmavBWsCcqov23HPHWaXQU,17816
86
- biotite/sequence/align/selector.cpython-311-darwin.so,sha256=OYbpg_Sy3F18iDNtnKDUXoIrBpftouKmFwIWzHhQfo8,331120
82
+ biotite/sequence/align/selector.cpython-311-darwin.so,sha256=2_E_V7MqnyfD9Ejhw3S41VSDknzdx3PN0972a1xR5oQ,331120
87
83
  biotite/sequence/align/matrix.py,sha256=6N0b6j1MOBrFMnSdX83sWZqGH0e5_dFfIVEhGglbSBI,12720
88
84
  biotite/sequence/align/permutation.pyx,sha256=xbbw5DJ7c5SXnuSUl2hJUMxzvinKP1Khc7CSdH5cEE0,10028
89
85
  biotite/sequence/align/selector.pyx,sha256=13MYCmECOYFGoMQHgCRgKKeN74VOUSc0TnZuqRJhBo0,33471
90
- biotite/sequence/align/kmeralphabet.cpython-311-darwin.so,sha256=tJ6O2S7r8mhgF5l4gtbfFaBusSLRopvu4BJlGjqaY8g,395440
86
+ biotite/sequence/align/kmeralphabet.cpython-311-darwin.so,sha256=m6PCW6U7ssvO5EiiJy_5qTpgStmfMgK-o0EUXxDPXCY,395440
91
87
  biotite/sequence/align/primes.txt,sha256=7pKfLGN1vjYl_KJ3y5uuo8np_5DDUH52UAkhb3fJfWE,10140
92
88
  biotite/sequence/align/kmeralphabet.pyx,sha256=J8I33f6AT8vhCNeW7tuZERqbCCC7Z9baC0RCrF01_zk,18115
93
- biotite/sequence/align/kmertable.cpython-311-darwin.so,sha256=i4NC0DOz8u0rx8xoT3A8MpKGSJ8o5R60VJ3vV95yIfw,727968
89
+ biotite/sequence/align/kmertable.cpython-311-darwin.so,sha256=G7gKEHoTAodmRX_eaUPoLYRpCYm8c9YsaaFjqZ4lxcU,727968
94
90
  biotite/sequence/align/alignment.py,sha256=XxFE0tdH37oiWcxfcbPYt25d2S3MePan7RY6fl8noP0,21351
95
- biotite/sequence/align/kmersimilarity.cpython-311-darwin.so,sha256=wpizNCy9jONKpy34U5G1d70bU7M50f5m7_MbM8OuDUQ,232440
91
+ biotite/sequence/align/kmersimilarity.cpython-311-darwin.so,sha256=yH92V3Q9dTjhvmIRLzzWIEq3srVLueX42Pwws_ZPUsg,232440
96
92
  biotite/sequence/align/tracetable.pyx,sha256=1gsT3OV7VkE6i_UpNiYOLVvD2_tfJgbNZb1yv9F4XR8,15455
97
93
  biotite/sequence/align/pairwise.pyx,sha256=88bZUcDG3CflZPdUN_HMJaIMTKCAtBhmhq946tY__KE,22836
98
94
  biotite/sequence/align/__init__.py,sha256=Twwj35DdxgKu9pN84u2PEtwo6MekLENbkaGbAPxB2A4,4715
99
- biotite/sequence/align/tracetable.cpython-311-darwin.so,sha256=34b4m3mxJ9ZtfpMHNf7gLHiLMf9ru4a05y6-HJgD5hw,204496
95
+ biotite/sequence/align/tracetable.cpython-311-darwin.so,sha256=48_-o3HztULRG85DoGU7YnCdhMwkKn3Ut839MQW2UEk,204496
100
96
  biotite/sequence/align/localungapped.pyx,sha256=rj6gbuyLQIo6ZuPwVt01rs3fOSOjpzq6Vx3v6_zKdEQ,9696
101
97
  biotite/sequence/align/buckets.py,sha256=k8H5RBS5Y7DrMoIOd5Ifrxp-nYWosJuqOYgLd1y-DWs,2464
102
- biotite/sequence/align/multiple.cpython-311-darwin.so,sha256=koY0ma3AHrLXo1sqsUSVMM9JNm0GbAmB64genxi5QOM,503104
98
+ biotite/sequence/align/multiple.cpython-311-darwin.so,sha256=U_jGtjuIjT4ktf8AwOHWvDeBh2KeSye_IfKb1XUViH4,503104
103
99
  biotite/sequence/align/localgapped.pyx,sha256=djdmgvACXde0dyqbKttc4itgu0MNh7aF0U9L6tHTZXM,33385
104
- biotite/sequence/align/permutation.cpython-311-darwin.so,sha256=a__pMKIsH9ZlpcL2PkdQ5QObNVogrBsk_j2LDjIzYkI,236400
100
+ biotite/sequence/align/permutation.cpython-311-darwin.so,sha256=lfOgwn2XiM0ToBeHIvZZxRF61CSYSRtCdjYEpKSbXv8,236400
105
101
  biotite/sequence/align/cigar.py,sha256=HGHelQe2SH4SdKjcyTmVlvrlllFzDtpiysskFcclIW4,14285
106
102
  biotite/sequence/align/tracetable.pxd,sha256=_VP1ayP6FZL1Tzn1pCCbt6xPZDzFtE9bH0Gvop2lxyQ,2825
107
103
  biotite/sequence/align/kmertable.pyx,sha256=6f-ifIWbICKP_ZAItxPqgjQVBoyId5bT2g6-dIO0zS4,121334
108
104
  biotite/sequence/align/multiple.pyx,sha256=cUnbuAfYBp_Kt4Y7LeuPeuBiRdyu1D694i1kQIsUqPM,21965
109
105
  biotite/sequence/align/statistics.py,sha256=98Vaz__s_8GltcMwfErNuKQfXuFKZCq-i1XWkJ_iAMQ,9655
110
106
  biotite/sequence/align/banded.pyx,sha256=-5peQOsZHoe27GjZCWrlrVN6YxsCEQCn0HkpglxDsbU,25392
111
- biotite/sequence/align/pairwise.cpython-311-darwin.so,sha256=eAnkfUht2_YP1rdd3Lj3GEE6LSv01-sIulI7PyFhkoE,578352
112
- biotite/sequence/align/banded.cpython-311-darwin.so,sha256=35IuLDwJlY86lms6S16gvHfKLwY9bgfwSFi88eIOs7g,524784
107
+ biotite/sequence/align/pairwise.cpython-311-darwin.so,sha256=s482BGcWYMrwmdVUv28N5PCeoUtI17Kw0ix1pny4KFQ,578352
108
+ biotite/sequence/align/banded.cpython-311-darwin.so,sha256=eAwbUUZqqb_rJphBTj0LZiXOmuOg3gZ8AVsWR_JMSu0,524784
113
109
  biotite/sequence/align/kmersimilarity.pyx,sha256=EBpz8R_fofRd4gsmBJLuH2qZgMWKlzQkCJ54w_-K7gQ,8433
114
- biotite/sequence/align/localgapped.cpython-311-darwin.so,sha256=QYK6zqlf00AgA0QNN1JXatYQ8jUFBB-h3ewl-4dt_9M,1184768
115
- biotite/sequence/align/localungapped.cpython-311-darwin.so,sha256=94Nn_UJxEg1bvm2fF1QMu18yokZb4Es_2sIIJVBIxpg,306320
110
+ biotite/sequence/align/localgapped.cpython-311-darwin.so,sha256=MNhYHXzAwvWdcx2eojuWXVqluujaCreLa7QauFO-Ot8,1184768
111
+ biotite/sequence/align/localungapped.cpython-311-darwin.so,sha256=GqUy5MCC3nHEgXH5WujI9WzxbMIPTr7iprbKWB7M06U,306320
116
112
  biotite/sequence/align/matrix_data/PAM370.mat,sha256=ZD8BpkVrVK22_oLSXZb9d_kzNDfic_i0eVT1fUNkyBk,2068
117
113
  biotite/sequence/align/matrix_data/PAM210.mat,sha256=UfUmaJ09ID11GUzuNeK7aUzgZTW1iJLizADnD0qT2BI,2067
118
114
  biotite/sequence/align/matrix_data/BLOSUM30.mat,sha256=j6FWyeTXvfpSR0ZGecI18MCATcjM_FTJ2XGoEjWg3Qg,2122
@@ -229,15 +225,15 @@ biotite/sequence/graphics/color_schemes/autumn.json,sha256=usp-Y70tk39LCJV64vi7t
229
225
  biotite/sequence/graphics/color_schemes/jalview_zappo.json,sha256=V0IJ-GsT8G8-J9CILWaiY3QkB35wYEq2kbWEDqYjm-4,701
230
226
  biotite/sequence/graphics/color_schemes/clustalx_dna.json,sha256=xkNRgGj_ersYNx8eSDAnI1HQalGiAWHw97tO_pmfyNE,249
231
227
  biotite/sequence/phylo/nj.pyx,sha256=s6hoo_7s3VFy-7Hgq9lKtUVXTZ-To8Dxwytk-ohfWYI,7281
232
- biotite/sequence/phylo/nj.cpython-311-darwin.so,sha256=B_L0rAJ3P1O9ZDpu9jN3xVDB2M2jxbtF6I_EzQf5Ejk,232584
228
+ biotite/sequence/phylo/nj.cpython-311-darwin.so,sha256=EavT5gxyXNVGdjc-_3Pa4dJ9bmGcuAy99uaNbtYf24Y,232584
233
229
  biotite/sequence/phylo/__init__.py,sha256=TW1CQqOa3JZYqidRy5XE8gA0HuzA8zo2Iouit3wSsBM,1261
234
230
  biotite/sequence/phylo/upgma.pyx,sha256=86QxGjj8fcGRhze7vZfqw8JLjLAZUevhkWDmzTy357E,5213
235
231
  biotite/sequence/phylo/tree.pyx,sha256=4e4Bhlm1qWY0Wvj6JqDE9jVwP6lEUmE8lIHEUmRNLwU,39206
236
- biotite/sequence/phylo/tree.cpython-311-darwin.so,sha256=MpcQiDZa9-__fU_nasuioj2lfjdP_o70WOh6EF9t74I,287832
237
- biotite/sequence/phylo/upgma.cpython-311-darwin.so,sha256=j2gINKj712fggyCxUCjdJMDMcDI77Rexwrjv7yVO1mQ,212680
232
+ biotite/sequence/phylo/tree.cpython-311-darwin.so,sha256=xCa88jobGBa2JX8KQ2QibWwtmsEEGsFWK9edzqkHNpg,287832
233
+ biotite/sequence/phylo/upgma.cpython-311-darwin.so,sha256=Osi_Tch_Tt-xuZs2NsU9nHh7q536hxSZOwXXFZ_DOac,212680
238
234
  biotite/structure/repair.py,sha256=-1orK6q9tRNy36GWuS8_r4_goaGiaVtJy0I1VPCao2Q,6996
239
235
  biotite/structure/superimpose.py,sha256=MvPsab-ZRdeig_SoJH3XrrOY0VteTNCnLEKNSsar0_Y,25124
240
- biotite/structure/sasa.cpython-311-darwin.so,sha256=FvzJaG_DTs_t3CrBqxn68BUuEMPLKVyUwaf4vXw4ypg,272408
236
+ biotite/structure/sasa.cpython-311-darwin.so,sha256=0FxC_41xq2odsLXjcJ0Ekpl5EE9_0ZEXlTueHO77cxY,272408
241
237
  biotite/structure/chains.py,sha256=I_A8JslWdBxi8cagoSGCfHddvHJ2WBSSe_WfovCwHxM,8827
242
238
  biotite/structure/box.py,sha256=6iGaGbxnsoIRt_mq727yLqU1txz7PRpA2H458Xk00Uk,18598
243
239
  biotite/structure/error.py,sha256=NI8oZfhO7oYWlcEIi025QZFD3Wjvwn6SvOn_RanrFT0,783
@@ -245,21 +241,21 @@ biotite/structure/util.py,sha256=z-yxfc60EMJMPyEpTZ8cdl0LTb2zURrJm6xDYZUprF0,220
245
241
  biotite/structure/segments.py,sha256=_yotEX4cr9WbxHdezLmoak5M3306PZZmPAxcO-tqSHU,5546
246
242
  biotite/structure/sequence.py,sha256=HLUaO32S_iDw2Ot1XEqQ7UtGDrxjCg30cCpzBqKpVPY,4246
247
243
  biotite/structure/sasa.pyx,sha256=fEUWuLtqjEmviPuL57lLuLdopndW-b7xtzvCr0vfQtk,12984
248
- biotite/structure/celllist.cpython-311-darwin.so,sha256=7x0KD3gHK0XiFJuA0kwA0WLTojNqQVDqa9uLA4FHLhA,315952
244
+ biotite/structure/celllist.cpython-311-darwin.so,sha256=5zrfzp-kmHV9l7ENflHMnSgfJp-nGvb8fn-nh5pApkE,315952
249
245
  biotite/structure/__init__.py,sha256=r2CR-UtCLVqbAygpKCri0pXD1FCe2M9wZSOi1Szp700,5324
250
246
  biotite/structure/mechanics.py,sha256=1qzDJZ1U1T_KsxwKioYjtMTy9cGYRirtxKD5AcsaJ3E,2588
251
247
  biotite/structure/sse.py,sha256=MUdyNSaDvxGi_gaY9bQjUSVNm-W8B1oinJ-UFV7slwk,11406
252
- biotite/structure/bonds.cpython-311-darwin.so,sha256=G0t92v5BwgANFdMSGLra6-xJTh0rP1l1ljkFdn-r74A,591912
248
+ biotite/structure/bonds.cpython-311-darwin.so,sha256=rHqCtBt7HGq2dBrFYfaxd2e0rSVYkn7x9wy3VadbuM0,591912
253
249
  biotite/structure/charges.pyx,sha256=RpCz4sVOiwmZeVTcMAapiWJFVBPAK0gAAiNoNZuxZWA,18822
254
250
  biotite/structure/density.py,sha256=BosyeB-0RGrANMpnq78A8cx_fYAOFnkcAJYxP8LKtZ0,4196
255
251
  biotite/structure/rdf.py,sha256=Yf9PoWqSpNK3QsWqnCnOUBGL8WwKGOakgZ0pxj5UOiA,8104
256
252
  biotite/structure/transform.py,sha256=uz0t7-uv3QxJEd7oe8tpcnQPt5YfoFT6CLoruxEmvpA,19649
257
253
  biotite/structure/geometry.py,sha256=nYFJxpZvtujFK-9ERBRxAl1yQSikezGVz6ZAKjoa96U,25058
258
254
  biotite/structure/molecules.py,sha256=gkOSUTkIf1csP_6vDuxBhfJjIJWx-9xf_dW6dO7vFPY,15504
259
- biotite/structure/filter.py,sha256=CwxFJKBGuk8TtalAjQ5WoPTFhQhgEdQmQjjTpanGIm8,17959
255
+ biotite/structure/filter.py,sha256=X2Mj5_Z0_lk1LxuJudlztxuu7VkVF_ObtV_FCrXyHhg,17967
260
256
  biotite/structure/bonds.pyx,sha256=XYd9QtCtyqEZKGXkSQyt74oku9NVNufPmaC35BFLZX0,67996
261
- biotite/structure/atoms.py,sha256=bqROmImfB3W3rBIbm0z8p0Aaz5EDueQmdJarxQX6xL8,46481
262
- biotite/structure/charges.cpython-311-darwin.so,sha256=ch4QUNPincKApcBuCMRnCiinIzhw-fnDErIVHZLDUu4,276592
257
+ biotite/structure/atoms.py,sha256=y_dSNDNpn0RGNOphCQ4LRNvm0Pe9sBuqb7vtde4TOMs,47411
258
+ biotite/structure/charges.cpython-311-darwin.so,sha256=XuuJZ-iHdvIXsvCt6qbBO8DXXLp53vJbombC9RdKz64,276592
263
259
  biotite/structure/pseudoknots.py,sha256=hHxS4IOekR8ZqYFJvuXMexM1e1kaWmdqX18zfxAL4W0,22224
264
260
  biotite/structure/basepairs.py,sha256=2qxTgl6Q1zMjvZLa331hfQzbeMwrFzvSJYAfSETnwWo,49759
265
261
  biotite/structure/integrity.py,sha256=I2gcIgCoxWsC_adSsHYvbmvCz1aSeeXvIjt8uZWxYOM,6826
@@ -268,7 +264,7 @@ biotite/structure/hbond.py,sha256=4y2FXeAXl7g2EDnwb1uDXFieGpZPQhnnkdATBechvW8,15
268
264
  biotite/structure/dotbracket.py,sha256=8S1DHu1-PRgeMHERztfOKggneVEcoUdwd0QNtcH3qI4,6834
269
265
  biotite/structure/residues.py,sha256=nYkbDjGYK6pFNJ0mZ1Hyb2ocmIOWLLnLyGi1tuhXxXk,22454
270
266
  biotite/structure/celllist.pyx,sha256=PCK5hx4QyuRrernfP_ty-w2ZRG5Qyn5dmibRwdVKXsE,34461
271
- biotite/structure/io/trajfile.py,sha256=eEghJscuDlYrYWPfb_Y7W-L87KhErj1UilgOMuBtRWw,25096
267
+ biotite/structure/io/trajfile.py,sha256=vQehU2tsUnvK_y5VyAyBpQX9ec-MQrFjFr7X0tYM8tI,25184
272
268
  biotite/structure/io/__init__.py,sha256=Lxmd8x6lpWz8nA0QhXmrgjvD_mOP0KyGmEzsVGzxXX4,998
273
269
  biotite/structure/io/general.py,sha256=GknBtXTMUsxhEiBrnB1dxW5ndFDHXnXT39xAlNAEr_4,8448
274
270
  biotite/structure/io/dcd/__init__.py,sha256=tYiiTSmqDrsSgg_sZaoQgx2D8N9OeqlooxH46-4-iaQ,388
@@ -276,12 +272,12 @@ biotite/structure/io/dcd/file.py,sha256=jaU81fvGl4WG0zXB1dBKTOtSvFF3fS0kxeNR-wwp
276
272
  biotite/structure/io/trr/__init__.py,sha256=5WNHMGiHNNzYdoiybE6Cs0bYAcznS5D3ABu7gHDJ__A,359
277
273
  biotite/structure/io/trr/file.py,sha256=2LjaLoKYfNgyQGSEfQ1TdZQqaPyrBh3irbJdmEKFTMI,1235
278
274
  biotite/structure/io/pdbx/bcif.py,sha256=FD9F_K14wDLApgaHtJ8Ove6Gogpk_8MB4MbuvMJ0SlY,19820
279
- biotite/structure/io/pdbx/convert.py,sha256=8MHZHIFZ-sjg2bMQpXV1bRIc9IYHekGO5kQENW6gsfI,59629
275
+ biotite/structure/io/pdbx/convert.py,sha256=Ih1BEJNUes-NzvNhSyi8bWOZn4vNWyT_BVvkUclRGqY,60208
280
276
  biotite/structure/io/pdbx/encoding.pyx,sha256=KMfSe853yRKRCKzBNOl-JWtep7_i7Z0rzFFu6Tct0vE,28725
281
277
  biotite/structure/io/pdbx/__init__.py,sha256=t8TqRYZdoHW_Jt68ZfXCZ0jmchLOuQbtYWRYwCocnEc,693
282
- biotite/structure/io/pdbx/cif.py,sha256=Y4cboAQX1K_IwCSS1L-2ZEgi4yMXguc_dKEbbGZYTtI,32925
278
+ biotite/structure/io/pdbx/cif.py,sha256=Lg9BjYiKLni76J3gqeKiwWgqA7tSVxXuja8kUiK0A8g,34455
283
279
  biotite/structure/io/pdbx/component.py,sha256=1ILksDKeb2TdRy3hW1-mSpno_zZEqT0sdpGlq_eY4U0,8026
284
- biotite/structure/io/pdbx/encoding.cpython-311-darwin.so,sha256=toy_PI2BPB9ouPL_6DPkVnKJCa_c1h7QkgSBFHXwYHs,1162224
280
+ biotite/structure/io/pdbx/encoding.cpython-311-darwin.so,sha256=DQMMoXo79apSfV6FM6oVjEQE6cIFYAgr9o7sxuwAfOY,1162224
285
281
  biotite/structure/io/xtc/__init__.py,sha256=ipZjsWBil-h2ujdlEobyI2jGy5xsfRVOPAyCsYAJ7G4,357
286
282
  biotite/structure/io/xtc/file.py,sha256=PknO2-xzLgKTBW5Gig5Hv1HUZ4BIHRf2con2MLxEwNU,1235
287
283
  biotite/structure/io/pdbqt/convert.py,sha256=xF4m-tZG_4ykhZsknqUivFXbb6VqLXVLwmhi1AbOmuw,4008
@@ -301,7 +297,7 @@ biotite/structure/io/pdb/convert.py,sha256=fzXkfm-SN9HswZ8srj0v15RRec9hq0BtB3gCg
301
297
  biotite/structure/io/pdb/__init__.py,sha256=5NbUMDRKIe7jJ2ByRHpMhJzY_vIasjSgO63Zxrpq8BM,733
302
298
  biotite/structure/io/pdb/file.py,sha256=Ox_ufeO9B78c3ZS06Dpb0I-aYXftEhPN7T3oXnW_uW4,47896
303
299
  biotite/structure/io/pdb/hybrid36.pyx,sha256=BKV7oh0xrrjqVrkhTn7KEolon57fUhlG4Yf0Tf22wuU,8036
304
- biotite/structure/io/pdb/hybrid36.cpython-311-darwin.so,sha256=lf9quTaoFdfQTChdBEC1GsrYmhxxgkNJoHtd3T-bG8w,210096
300
+ biotite/structure/io/pdb/hybrid36.cpython-311-darwin.so,sha256=DFncvVgm5QcJVxxV5REftnSgFTidHA0nIxpI0BHRtGg,210096
305
301
  biotite/structure/info/misc.py,sha256=GIdFhRtzWInhynVXNQwQpJszowmZ_0Jdqh9R706CB_Y,3512
306
302
  biotite/structure/info/atom_masses.json,sha256=WME4ezDPy-HrEIhxkOGxcmIMdgxf1x7e_xwBkFRdTsY,2383
307
303
  biotite/structure/info/__init__.py,sha256=SMJ93QhJitkvDwTra_MjSsGEuU1V0-PoQ1Kwq7OuRvI,679
@@ -320,3 +316,7 @@ biotite/structure/info/ccd/nucleotides.txt,sha256=Q7Zjz45BAO6c2QDAgvYdKtWAqmjQxy
320
316
  biotite/structure/graphics/__init__.py,sha256=YwMT8-c2DjrkcwyK6jPeDtAKxQda0OhElnwk8J0y3Hc,353
321
317
  biotite/structure/graphics/rna.py,sha256=w7zFMKo2ZZ4n60SkbkupEXPxe3-KUNa261PF784ry8k,12016
322
318
  biotite/structure/graphics/atoms.py,sha256=988_URX4hfTE3oBOYgAvZruOrzogMPcFKiTT5RJL01E,8116
319
+ biotite-1.0.1.dist-info/RECORD,,
320
+ biotite-1.0.1.dist-info/WHEEL,sha256=FADWsAbCknuFYRiPIqUqs7TwHvSgFIOpRdMEMMJW_gY,105
321
+ biotite-1.0.1.dist-info/METADATA,sha256=lnwl1IjHDLJ5EVhHYSUQplx3-4Ql4gbbezrkspTCRK8,7159
322
+ biotite-1.0.1.dist-info/licenses/LICENSE.rst,sha256=ZuNQuB65Dxf0rDB_5LxvA4SVQJBWxRZyvbjbvE-APWY,1534