biotite 1.0.0__cp312-cp312-macosx_10_9_x86_64.whl → 1.0.1__cp312-cp312-macosx_10_9_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 (31) hide show
  1. biotite/sequence/align/banded.cpython-312-darwin.so +0 -0
  2. biotite/sequence/align/kmeralphabet.cpython-312-darwin.so +0 -0
  3. biotite/sequence/align/kmersimilarity.cpython-312-darwin.so +0 -0
  4. biotite/sequence/align/kmertable.cpython-312-darwin.so +0 -0
  5. biotite/sequence/align/localgapped.cpython-312-darwin.so +0 -0
  6. biotite/sequence/align/localungapped.cpython-312-darwin.so +0 -0
  7. biotite/sequence/align/multiple.cpython-312-darwin.so +0 -0
  8. biotite/sequence/align/pairwise.cpython-312-darwin.so +0 -0
  9. biotite/sequence/align/permutation.cpython-312-darwin.so +0 -0
  10. biotite/sequence/align/selector.cpython-312-darwin.so +0 -0
  11. biotite/sequence/align/tracetable.cpython-312-darwin.so +0 -0
  12. biotite/sequence/codec.cpython-312-darwin.so +0 -0
  13. biotite/sequence/phylo/nj.cpython-312-darwin.so +0 -0
  14. biotite/sequence/phylo/tree.cpython-312-darwin.so +0 -0
  15. biotite/sequence/phylo/upgma.cpython-312-darwin.so +0 -0
  16. biotite/structure/atoms.py +27 -3
  17. biotite/structure/bonds.cpython-312-darwin.so +0 -0
  18. biotite/structure/celllist.cpython-312-darwin.so +0 -0
  19. biotite/structure/charges.cpython-312-darwin.so +0 -0
  20. biotite/structure/filter.py +1 -1
  21. biotite/structure/io/pdb/hybrid36.cpython-312-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-312-darwin.so +0 -0
  25. biotite/structure/io/trajfile.py +16 -16
  26. biotite/structure/sasa.cpython-312-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=0oG4CjoGfYHRJPy3gHncDJdYpmnqlf1ZuriAgA0fRmw,106
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
@@ -65,7 +61,7 @@ biotite/sequence/__init__.py,sha256=fSWhobaPGRMJI6-8UYFpjguxVtP4O4cAHmiRxNAGzYI,
65
61
  biotite/sequence/seqtypes.py,sha256=zdj3fFkb_EDB0T4rqQuq-ErtX6TcFiP8kZ0tWINibnI,19346
66
62
  biotite/sequence/codon.py,sha256=6SBjwz4c6IZiAFZL03qjcrjT84zczltc14haOOAkm6Q,16392
67
63
  biotite/sequence/search.py,sha256=dF-OtPocZ5XAIgS4GCMt2YOKz0Oxb9b8FvPmVUY8j-k,3089
68
- biotite/sequence/codec.cpython-312-darwin.so,sha256=cdGbxYio-bCY-yPHKKqa22sj7pEFosV_2lNd4M-3njs,282056
64
+ biotite/sequence/codec.cpython-312-darwin.so,sha256=MCuoSegNP7mrlLQGZHH0Y7fbOWxLAEhC1EhL5vAgD1M,282056
69
65
  biotite/sequence/alphabet.py,sha256=OiUxnsbTaxuDjAiB96sVHYTOqG3XvwF5ceJ3tvViqh4,17190
70
66
  biotite/sequence/io/__init__.py,sha256=4K13uxFWe8IpNC8yuVxjDiI7-8lmXu7qT6iMmVSqPs4,314
71
67
  biotite/sequence/io/general.py,sha256=sD03pLnkxsT6vFh8806ZhErC8GEG3LF_70NMcVJyGe0,6694
@@ -86,33 +82,33 @@ biotite/sequence/io/fastq/file.py,sha256=OwSUw-Unp8AQc7LdpJSI2zmavBWsCcqov23HPHW
86
82
  biotite/sequence/align/matrix.py,sha256=6N0b6j1MOBrFMnSdX83sWZqGH0e5_dFfIVEhGglbSBI,12720
87
83
  biotite/sequence/align/permutation.pyx,sha256=xbbw5DJ7c5SXnuSUl2hJUMxzvinKP1Khc7CSdH5cEE0,10028
88
84
  biotite/sequence/align/selector.pyx,sha256=13MYCmECOYFGoMQHgCRgKKeN74VOUSc0TnZuqRJhBo0,33471
89
- biotite/sequence/align/pairwise.cpython-312-darwin.so,sha256=vEQE142u4efHpco621bATlJMEkUo8i-7YDjrVOmNsu8,625808
85
+ biotite/sequence/align/pairwise.cpython-312-darwin.so,sha256=2ePTYBYHc9l1V9Lu5NH9IFGMibY9eK0tjkpIqElhzHg,625808
90
86
  biotite/sequence/align/primes.txt,sha256=7pKfLGN1vjYl_KJ3y5uuo8np_5DDUH52UAkhb3fJfWE,10140
91
- biotite/sequence/align/localgapped.cpython-312-darwin.so,sha256=SRx3KwVqbgmXLDkhi-IP-2mAqGIwCQ6auqj34X1jnjI,1090672
92
- biotite/sequence/align/banded.cpython-312-darwin.so,sha256=3sqMdjvztfV-tIEDz7WftNl-VmOqDGHDqQpOnc__pHQ,609448
87
+ biotite/sequence/align/localgapped.cpython-312-darwin.so,sha256=g9aEs9WI1Qq5i3DWoJ-YJD3Yjv76B1zrhIQp_KUKO7g,1090672
88
+ biotite/sequence/align/banded.cpython-312-darwin.so,sha256=-tOqfiK7-3v4oPiX83mQ8YQ-X-Gz7kyib9KzSYbv6HE,609448
93
89
  biotite/sequence/align/kmeralphabet.pyx,sha256=J8I33f6AT8vhCNeW7tuZERqbCCC7Z9baC0RCrF01_zk,18115
94
- biotite/sequence/align/localungapped.cpython-312-darwin.so,sha256=QpBj1U1a4EV4RfpSOC4TS9KIsYIU2vWprPic1KucLgs,305312
90
+ biotite/sequence/align/localungapped.cpython-312-darwin.so,sha256=JblYHlIS_zG88w9BgaL0IH0_SZNt3dzA0i6nil54UxA,305312
95
91
  biotite/sequence/align/alignment.py,sha256=XxFE0tdH37oiWcxfcbPYt25d2S3MePan7RY6fl8noP0,21351
96
- biotite/sequence/align/permutation.cpython-312-darwin.so,sha256=3z-eDYcx1Djp7EXkNR-EeYc6Zf6tuA7RJEyv7q9KfG4,220800
97
- biotite/sequence/align/multiple.cpython-312-darwin.so,sha256=WCD_XBTRPxN4nFxt3Wa5ec5SBLy2lBBanRC-GzIC-pE,539024
92
+ biotite/sequence/align/permutation.cpython-312-darwin.so,sha256=kl0rvDK4emogw4w6b2UwTzzlZ9mwWq-wUjo_fLFHwbw,220800
93
+ biotite/sequence/align/multiple.cpython-312-darwin.so,sha256=AZk7OzRaPhZHpMWWXGICbgDpP4fsuwMtVlIyR575VFc,539024
98
94
  biotite/sequence/align/tracetable.pyx,sha256=1gsT3OV7VkE6i_UpNiYOLVvD2_tfJgbNZb1yv9F4XR8,15455
99
95
  biotite/sequence/align/pairwise.pyx,sha256=88bZUcDG3CflZPdUN_HMJaIMTKCAtBhmhq946tY__KE,22836
100
96
  biotite/sequence/align/__init__.py,sha256=Twwj35DdxgKu9pN84u2PEtwo6MekLENbkaGbAPxB2A4,4715
101
97
  biotite/sequence/align/localungapped.pyx,sha256=rj6gbuyLQIo6ZuPwVt01rs3fOSOjpzq6Vx3v6_zKdEQ,9696
102
98
  biotite/sequence/align/buckets.py,sha256=k8H5RBS5Y7DrMoIOd5Ifrxp-nYWosJuqOYgLd1y-DWs,2464
103
99
  biotite/sequence/align/localgapped.pyx,sha256=djdmgvACXde0dyqbKttc4itgu0MNh7aF0U9L6tHTZXM,33385
104
- biotite/sequence/align/kmersimilarity.cpython-312-darwin.so,sha256=piy05_ae4vJRgq7tFp9QOdSHp0umKk4AqhnJNqo4zAo,211128
100
+ biotite/sequence/align/kmersimilarity.cpython-312-darwin.so,sha256=0LGc1bNteuuwfoVd22zQgfcRAXgM5YvxUie84qhkIyE,211128
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
- biotite/sequence/align/tracetable.cpython-312-darwin.so,sha256=j1nsDhr5mMJCZl8xh6Tj6eE47vmi0n2xw59In7Xew-g,181032
104
+ biotite/sequence/align/tracetable.cpython-312-darwin.so,sha256=-bjOnTAxwUkAR4pIV3G1K_WBqlkTPFSpDCP9ZMX7-Is,181032
109
105
  biotite/sequence/align/multiple.pyx,sha256=cUnbuAfYBp_Kt4Y7LeuPeuBiRdyu1D694i1kQIsUqPM,21965
110
106
  biotite/sequence/align/statistics.py,sha256=98Vaz__s_8GltcMwfErNuKQfXuFKZCq-i1XWkJ_iAMQ,9655
111
- biotite/sequence/align/selector.cpython-312-darwin.so,sha256=Oo5ZNDxPcYePEU3IROp4W7PhMd4YCkTsD1LUjGq7dEg,316176
107
+ biotite/sequence/align/selector.cpython-312-darwin.so,sha256=ku9GCeyHhNf2F8bWyuI8IaRolmFgU7SEQdRNMvdV_VU,316176
112
108
  biotite/sequence/align/banded.pyx,sha256=-5peQOsZHoe27GjZCWrlrVN6YxsCEQCn0HkpglxDsbU,25392
113
- biotite/sequence/align/kmeralphabet.cpython-312-darwin.so,sha256=VOaCMZZFKyuLvvnA0ODyxPb1TEt7f0wJF_3RrEASlpE,395056
109
+ biotite/sequence/align/kmeralphabet.cpython-312-darwin.so,sha256=uDekjDRJrZPAct9x2vR6wTkn9zapR-orgjDXjotetLs,395056
114
110
  biotite/sequence/align/kmersimilarity.pyx,sha256=EBpz8R_fofRd4gsmBJLuH2qZgMWKlzQkCJ54w_-K7gQ,8433
115
- biotite/sequence/align/kmertable.cpython-312-darwin.so,sha256=TbuoVB3CssZ3QpHD0dKEWrosR2i8ueolA_FM13GakCY,727792
111
+ biotite/sequence/align/kmertable.cpython-312-darwin.so,sha256=OUpAD-xcSlC2OEXCVQwvs7BheS5ffiRF9aDyZZyifFQ,727792
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
@@ -228,38 +224,38 @@ biotite/sequence/graphics/color_schemes/jalview_prop_strand.json,sha256=83GsLW_L
228
224
  biotite/sequence/graphics/color_schemes/autumn.json,sha256=usp-Y70tk39LCJV64vi7t3wd0pcf7kOjEE8dZhAbryM,842
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
- biotite/sequence/phylo/tree.cpython-312-darwin.so,sha256=ywsZU-UN8FfB72arPYfXSO9Jt9ypD7PnqrQ6sJA7Dl0,267536
232
- biotite/sequence/phylo/upgma.cpython-312-darwin.so,sha256=QWZ0PDgMUkx7Os7bQw44Ih-6sGxIhntjg5u_d-3v8Ng,199176
227
+ biotite/sequence/phylo/tree.cpython-312-darwin.so,sha256=XuGoDjyMvFVdgHFRBqrBe_7CrGG6uK1-icetsDOUi3Q,267536
228
+ biotite/sequence/phylo/upgma.cpython-312-darwin.so,sha256=bBYEZtpqPOHccDL-ge7rvk-t54NokRrCNfqannEYcds,199176
233
229
  biotite/sequence/phylo/nj.pyx,sha256=s6hoo_7s3VFy-7Hgq9lKtUVXTZ-To8Dxwytk-ohfWYI,7281
234
230
  biotite/sequence/phylo/__init__.py,sha256=TW1CQqOa3JZYqidRy5XE8gA0HuzA8zo2Iouit3wSsBM,1261
235
231
  biotite/sequence/phylo/upgma.pyx,sha256=86QxGjj8fcGRhze7vZfqw8JLjLAZUevhkWDmzTy357E,5213
236
232
  biotite/sequence/phylo/tree.pyx,sha256=4e4Bhlm1qWY0Wvj6JqDE9jVwP6lEUmE8lIHEUmRNLwU,39206
237
- biotite/sequence/phylo/nj.cpython-312-darwin.so,sha256=2nL-RRXAS4J6IuJ4-EgO52HcUB8vQKp0s4DJ5bUrdPs,204832
233
+ biotite/sequence/phylo/nj.cpython-312-darwin.so,sha256=yYejjC-VjjyJtz4HdInOyZbtJTMWSS2Tj2x27Jo8jGQ,204832
238
234
  biotite/structure/repair.py,sha256=-1orK6q9tRNy36GWuS8_r4_goaGiaVtJy0I1VPCao2Q,6996
239
235
  biotite/structure/superimpose.py,sha256=MvPsab-ZRdeig_SoJH3XrrOY0VteTNCnLEKNSsar0_Y,25124
240
236
  biotite/structure/chains.py,sha256=I_A8JslWdBxi8cagoSGCfHddvHJ2WBSSe_WfovCwHxM,8827
241
237
  biotite/structure/box.py,sha256=6iGaGbxnsoIRt_mq727yLqU1txz7PRpA2H458Xk00Uk,18598
242
- biotite/structure/charges.cpython-312-darwin.so,sha256=4IKZqynvFnMnssdgFe_Du2mGCTQ05DymGN27R-C9RwI,262584
238
+ biotite/structure/charges.cpython-312-darwin.so,sha256=zke8JyLHhM_N1agd-Y_FiINNFAujq5oOLkxDKO4QmMI,262584
243
239
  biotite/structure/error.py,sha256=NI8oZfhO7oYWlcEIi025QZFD3Wjvwn6SvOn_RanrFT0,783
244
240
  biotite/structure/util.py,sha256=z-yxfc60EMJMPyEpTZ8cdl0LTb2zURrJm6xDYZUprF0,2200
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/bonds.cpython-312-darwin.so,sha256=ox6LHWot74ACP8ZCZZ0xcvZKIFP_QD-Vk-CxYgRoGfg,596544
244
+ biotite/structure/bonds.cpython-312-darwin.so,sha256=CYd1ypVu7rHsHvS2l5oY6gGW4J1_CfF4WmszVeZhEXQ,596544
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
248
  biotite/structure/charges.pyx,sha256=RpCz4sVOiwmZeVTcMAapiWJFVBPAK0gAAiNoNZuxZWA,18822
253
249
  biotite/structure/density.py,sha256=BosyeB-0RGrANMpnq78A8cx_fYAOFnkcAJYxP8LKtZ0,4196
254
250
  biotite/structure/rdf.py,sha256=Yf9PoWqSpNK3QsWqnCnOUBGL8WwKGOakgZ0pxj5UOiA,8104
255
- biotite/structure/celllist.cpython-312-darwin.so,sha256=XGXOfL2XhzNLR6ShNFoUVGZkTxtWuO7FRRREDVmZA3c,304448
251
+ biotite/structure/celllist.cpython-312-darwin.so,sha256=hh9cKBvkTv4a38fEWYHe0e5o-VBniuM7Zd6fgJuWJ50,304448
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/sasa.cpython-312-darwin.so,sha256=EHAVqT04uLQwTql07NEzfW5gnR3JeNvVZyppFhtzvkQ,261736
257
+ biotite/structure/atoms.py,sha256=y_dSNDNpn0RGNOphCQ4LRNvm0Pe9sBuqb7vtde4TOMs,47411
258
+ biotite/structure/sasa.cpython-312-darwin.so,sha256=J5RdyesQc_CswsSqiwkQQwIC5lZnxfO1BdX29hb-dRA,261736
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,19 +264,19 @@ 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
275
271
  biotite/structure/io/dcd/file.py,sha256=jaU81fvGl4WG0zXB1dBKTOtSvFF3fS0kxeNR-wwpXlY,2224
276
272
  biotite/structure/io/trr/__init__.py,sha256=5WNHMGiHNNzYdoiybE6Cs0bYAcznS5D3ABu7gHDJ__A,359
277
273
  biotite/structure/io/trr/file.py,sha256=2LjaLoKYfNgyQGSEfQ1TdZQqaPyrBh3irbJdmEKFTMI,1235
278
- biotite/structure/io/pdbx/encoding.cpython-312-darwin.so,sha256=VZ515-qxfBa_X0IMV0ejzHEq1etDjwc5G0QVGxOBFSA,1137080
274
+ biotite/structure/io/pdbx/encoding.cpython-312-darwin.so,sha256=XW0js9XClBLwoaUZ_Qs6yj2DTQcoB1UOt1QkOHO9Ve4,1137080
279
275
  biotite/structure/io/pdbx/bcif.py,sha256=FD9F_K14wDLApgaHtJ8Ove6Gogpk_8MB4MbuvMJ0SlY,19820
280
- biotite/structure/io/pdbx/convert.py,sha256=8MHZHIFZ-sjg2bMQpXV1bRIc9IYHekGO5kQENW6gsfI,59629
276
+ biotite/structure/io/pdbx/convert.py,sha256=Ih1BEJNUes-NzvNhSyi8bWOZn4vNWyT_BVvkUclRGqY,60208
281
277
  biotite/structure/io/pdbx/encoding.pyx,sha256=KMfSe853yRKRCKzBNOl-JWtep7_i7Z0rzFFu6Tct0vE,28725
282
278
  biotite/structure/io/pdbx/__init__.py,sha256=t8TqRYZdoHW_Jt68ZfXCZ0jmchLOuQbtYWRYwCocnEc,693
283
- biotite/structure/io/pdbx/cif.py,sha256=Y4cboAQX1K_IwCSS1L-2ZEgi4yMXguc_dKEbbGZYTtI,32925
279
+ biotite/structure/io/pdbx/cif.py,sha256=Lg9BjYiKLni76J3gqeKiwWgqA7tSVxXuja8kUiK0A8g,34455
284
280
  biotite/structure/io/pdbx/component.py,sha256=1ILksDKeb2TdRy3hW1-mSpno_zZEqT0sdpGlq_eY4U0,8026
285
281
  biotite/structure/io/xtc/__init__.py,sha256=ipZjsWBil-h2ujdlEobyI2jGy5xsfRVOPAyCsYAJ7G4,357
286
282
  biotite/structure/io/xtc/file.py,sha256=PknO2-xzLgKTBW5Gig5Hv1HUZ4BIHRf2con2MLxEwNU,1235
@@ -297,7 +293,7 @@ biotite/structure/io/mol/__init__.py,sha256=WvcNPDdf9W1zPyJ0tjTvGNxA83ht18uRQA8B
297
293
  biotite/structure/io/mol/ctab.py,sha256=r6Ryx3ZBhlxm88PWVOWGwxrgPow95DLEAcIf8N2mkGU,13470
298
294
  biotite/structure/io/mol/mol.py,sha256=Eterau_ZfXbIkFHpDTvWzM2Yxxmem2hZn1tOQkXNuqM,5461
299
295
  biotite/structure/io/mol/sdf.py,sha256=6u2oSfY1BICf0TZ7qkOrMpfbbyYlf6QruoLBCipzKE8,32245
300
- biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so,sha256=E9Oh1BsLPXvCzzoDT4h4sc5tm_wyJ_ZH8zYr80jDKeU,187416
296
+ biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so,sha256=CZ2J5J56Cwsq0DUe5yQeL4k5CHfeRdC-U3gha4ufDNw,187416
301
297
  biotite/structure/io/pdb/convert.py,sha256=fzXkfm-SN9HswZ8srj0v15RRec9hq0BtB3gCgNIlk9s,10602
302
298
  biotite/structure/io/pdb/__init__.py,sha256=5NbUMDRKIe7jJ2ByRHpMhJzY_vIasjSgO63Zxrpq8BM,733
303
299
  biotite/structure/io/pdb/file.py,sha256=Ox_ufeO9B78c3ZS06Dpb0I-aYXftEhPN7T3oXnW_uW4,47896
@@ -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=0oG4CjoGfYHRJPy3gHncDJdYpmnqlf1ZuriAgA0fRmw,106
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