diff --git a/.gitignore b/.gitignore index 35a8efb..382b1f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ site + +docs/api_subpackages/ +docs/api_modules docs/py-docstring-parser/ docs/site/ docs/sources/api_modules/ diff --git a/biopandas/__init__.py b/biopandas/__init__.py index 2adefaa..297f7f8 100644 --- a/biopandas/__init__.py +++ b/biopandas/__init__.py @@ -24,5 +24,5 @@ # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = '0.3.0dev0' +__version__ = '0.3.0' __author__ = "Sebastian Raschka " diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3614c8a..22cd2b4 100755 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -3,24 +3,29 @@ The CHANGELOG for the current development version is available at [https://github.com/rasbt/biopandas/blob/main/docs/sources/CHANGELOG.md](https://github.com/rasbt/biopandas/blob/main/docs/sources/CHANGELOG.md). -### 0.3.0dev0 (TBD) +### 0.3.0 (04-06-2022) ##### Downloads -- + +- [Source code (zip)](https://github.com/rasbt/biopandas/archive/v0.3.0.zip) +- [Source code (tar.gz)](https://github.com/rasbt/biopandas/archive/v0.3.0.tar.gz) + + ##### New Features -- Adds support for parsing mmCIF protein structure files (via PR [94](https://github.com/rasbt/biopandas/pull/94/files)) +- Adds support for parsing mmCIF protein structure files (via [Arian Jamasb](https://github.com/a-r-j), PR #[94](https://github.com/rasbt/biopandas/pull/94/files)) ##### Changes -- +- - ##### Bug Fixes -- Fixes a bug where coordinates with more than 4 digits before the decimal point caused a column shift when saving a PDB file. (via PR #[90](https://github.com/rasbt/biopandas/pull/90/files)) -- Fixes a bug where the invert parameter in get_carbon was selecting the wrong case. (via PR #[96](https://github.com/rasbt/biopandas/pull/96/files)) +- Fixes a bug where coordinates with more than 4 digits before the decimal point caused a column shift when saving a PDB file. (via PR #[90](https://github.com/rasbt/biopandas/pull/90/files)) +- Fixes a bug where the invert parameter in get_carbon was selecting the wrong case. (via [Arian Jamasb](https://github.com/a-r-j) PR #[96](https://github.com/rasbt/biopandas/pull/96/files)) + ### 0.2.9 (08-30-2021) @@ -36,8 +41,8 @@ The CHANGELOG for the current development version is available at ##### Changes -- Now also allow `.ent` and `.ent.gz` file endings for PDB files. (via PR [82](https://github.com/rasbt/biopandas/pull/82/files) -- Added Python 3.8 and 3.9 to setup.py in order to support these versions via conda-forge. (via PR [87](https://github.com/rasbt/biopandas/pull/87/files) +- Now also allow `.ent` and `.ent.gz` file endings for PDB files. (via PR #[82](https://github.com/rasbt/biopandas/pull/82/files) +- Added Python 3.8 and 3.9 to setup.py in order to support these versions via conda-forge. (via PR #[87](https://github.com/rasbt/biopandas/pull/87/files) ##### Bug Fixes @@ -52,11 +57,11 @@ The CHANGELOG for the current development version is available at ##### New Features -- A `PandasPdb.read_pdb_from_list` method was added analogous to the existing `PandasMol2.read_mol2_from_list` (via PR [72](https://github.com/rasbt/biopandas/pull/72/files) by [dominiquesydow](https://github.com/dominiquesydow)) +- A `PandasPdb.read_pdb_from_list` method was added analogous to the existing `PandasMol2.read_mol2_from_list` (via PR #[72](https://github.com/rasbt/biopandas/pull/72/files) by [dominiquesydow](https://github.com/dominiquesydow)) ##### Changes -- `ValueError` raising and improved file format error messages for `read_pdb` and `read_mol2` functionality. (via PR [73](https://github.com/rasbt/biopandas/pull/73/files) by [dominiquesydow](https://github.com/dominiquesydow)) +- `ValueError` raising and improved file format error messages for `read_pdb` and `read_mol2` functionality. (via PR #[73](https://github.com/rasbt/biopandas/pull/73/files) by [dominiquesydow](https://github.com/dominiquesydow)) ##### Bug Fixes diff --git a/docs/api_modules/biopandas.mmcif/PandasMMCIF.md b/docs/api_modules/biopandas.mmcif/PandasMMCIF.md index d663e41..d777e46 100644 --- a/docs/api_modules/biopandas.mmcif/PandasMMCIF.md +++ b/docs/api_modules/biopandas.mmcif/PandasMMCIF.md @@ -1,6 +1,6 @@ -## PandasMMCIF +## PandasMmcif -*PandasMMCIF(use_auth: bool = True)* +*PandasMmcif(use_auth: bool = True)* None @@ -99,7 +99,7 @@ Computes Euclidean distance between atoms and a 3D point. *fetch_mmcif(pdb_code: str)* -Fetches mmcif file contents from the Protein Databank at rcsb.org. +Fetches mmCIF file contents from the Protein Databank at rcsb.org. **Parameters** diff --git a/docs/api_subpackages/biopandas.mmcif.md b/docs/api_subpackages/biopandas.mmcif.md index 56d1183..574aebf 100644 --- a/docs/api_subpackages/biopandas.mmcif.md +++ b/docs/api_subpackages/biopandas.mmcif.md @@ -1,7 +1,7 @@ -biopandas version: 0.3.0dev0 -## PandasMMCIF +biopandas version: 0.3.0 +## PandasMmcif -*PandasMMCIF(use_auth: bool = True)* +*PandasMmcif(use_auth: bool = True)* None @@ -100,7 +100,7 @@ Computes Euclidean distance between atoms and a 3D point. *fetch_mmcif(pdb_code: str)* -Fetches mmcif file contents from the Protein Databank at rcsb.org. +Fetches mmCIF file contents from the Protein Databank at rcsb.org. **Parameters** diff --git a/docs/api_subpackages/biopandas.mol2.md b/docs/api_subpackages/biopandas.mol2.md index eaa4bdc..867d302 100644 --- a/docs/api_subpackages/biopandas.mol2.md +++ b/docs/api_subpackages/biopandas.mol2.md @@ -1,4 +1,4 @@ -biopandas version: 0.3.0dev0 +biopandas version: 0.3.0 ## PandasMol2 *PandasMol2()* diff --git a/docs/api_subpackages/biopandas.pdb.md b/docs/api_subpackages/biopandas.pdb.md index 6f33931..a4ea859 100644 --- a/docs/api_subpackages/biopandas.pdb.md +++ b/docs/api_subpackages/biopandas.pdb.md @@ -1,4 +1,4 @@ -biopandas version: 0.3.0dev0 +biopandas version: 0.3.0 ## PandasPdb *PandasPdb()* diff --git a/docs/api_subpackages/biopandas.testutils.md b/docs/api_subpackages/biopandas.testutils.md index f5ff06f..162bbe1 100644 --- a/docs/api_subpackages/biopandas.testutils.md +++ b/docs/api_subpackages/biopandas.testutils.md @@ -1,4 +1,4 @@ -biopandas version: 0.3.0dev0 +biopandas version: 0.3.0 ## assert_raises *assert_raises(exception_type, message, func, *args, **kwargs)* diff --git a/docs/sources/api_subpackages/biopandas.mmcif.md b/docs/sources/api_subpackages/biopandas.mmcif.md deleted file mode 100644 index 56d1183..0000000 --- a/docs/sources/api_subpackages/biopandas.mmcif.md +++ /dev/null @@ -1,231 +0,0 @@ -biopandas version: 0.3.0dev0 -## PandasMMCIF - -*PandasMMCIF(use_auth: bool = True)* - -None - -### Methods - -
- -*amino3to1(record: str = 'ATOM', residue_col: str = 'auth_comp_id', residue_number_col: str = 'auth_seq_id', chain_col: str = 'auth_asym_id', fillna: str = '?')* - -Creates 1-letter amino acid codes from DataFrame - - Non-canonical amino-acids are converted as follows: - ASH (protonated ASP) => D - CYX (disulfide-bonded CYS) => C - GLH (protonated GLU) => E - HID/HIE/HIP (different protonation states of HIS) = H - HYP (hydroxyproline) => P - MSE (selenomethionine) => M - -**Parameters** - -- `record` : str, default: 'ATOM' - - Specfies the record DataFrame. - -- `residue_col` : str, default: 'residue_name' - - Column in `record` DataFrame to look for 3-letter amino acid - codes for the conversion. - -- `fillna` : str, default: '?' - - Placeholder string to use for unknown amino acids. - -**Returns** - -- `pandas.DataFrame` : Pandas DataFrame object consisting of two columns, - - `'chain_id'` and `'residue_name'`, where the former contains - the chain ID of the amino acid and the latter - contains the 1-letter amino acid code, respectively. - -
- -*distance(xyz=(0.0, 0.0, 0.0), records=('ATOM', 'HETATM'))* - -Computes Euclidean distance between atoms and a 3D point. - -**Parameters** - -- `xyz` : tuple, default: (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation. - -- `records` : iterable, default: ('ATOM', 'HETATM') - - Specify which record sections to consider. For example, to consider - both protein and ligand atoms, set `records=('ATOM', 'HETATM')`. - This setting is ignored if `df` is not set to None. - For downward compatibility, a string argument is still supported - but deprecated and will be removed in future versions. - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the record section and `xyz`. - -
- -*distance_df(df, xyz=(0.0, 0.0, 0.0))* - -Computes Euclidean distance between atoms and a 3D point. - -**Parameters** - -- `df` : DataFrame - - DataFrame containing entries in the `PandasPdb.df['ATOM']` - or `PandasPdb.df['HETATM']` format for the - the distance computation to the `xyz` reference coordinates. - -- `xyz` : tuple, default: (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation. - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the record section and `xyz`. - -
- -*fetch_mmcif(pdb_code: str)* - -Fetches mmcif file contents from the Protein Databank at rcsb.org. - -**Parameters** - -- `pdb_code` : str - - A 4-letter PDB code, e.g., "3eiy". - -**Returns** - -self - -
- -*get(s, df=None, invert=False, records=('ATOM', 'HETATM'))* - -Filter PDB DataFrames by properties - -**Parameters** - -- `s` : str in {'main chain', 'hydrogen', 'c-alpha', 'heavy'} - - String to specify which entries to return. - - -- `df` : pandas.DataFrame, default: None - - Optional DataFrame to perform the filter operation on. - If df=None, filters on self.df['ATOM']. - - -- `invert` : bool, default: True - - Inverts the search query. For example if s='hydrogen' and - invert=True, all but hydrogen entries are returned. - - -- `records` : iterable, default: ('ATOM', 'HETATM') - - Specify which record sections to consider. For example, to consider - both protein and ligand atoms, set `records=('ATOM', 'HETATM')`. - This setting is ignored if `df` is not set to None. - For downward compatibility, a string argument is still supported - but deprecated and will be removed in future versions. - -**Returns** - -- `df` : pandas.DataFrame - - Returns a DataFrame view on the filtered entries. - -
- -*read_mmcif(path)* - -Read MMCIF files (unzipped or gzipped) from local drive - -**Attributes** - -- `path` : str - - Path to the MMCIF file in .cif format or gzipped format (.cif.gz). - -**Returns** - -self - -
- -*read_mmcif_from_list(mmcif_lines)* - -Reads mmCIF file from a list into DataFrames - -**Attributes** - -- `pdb_lines` : list - - A list of lines containing the mmCIF file contents. - -**Returns** - -self - -
- -*rmsd(df1, df2, s=None, invert=False)* - -Compute the Root Mean Square Deviation between molecules. - -**Parameters** - -- `df1` : pandas.DataFrame - - DataFrame with HETATM, ATOM, and/or ANISOU entries. - - -- `df2` : pandas.DataFrame - - Second DataFrame for RMSD computation against df1. Must have the - same number of entries as df1. - - -- `s` : {'main chain', 'hydrogen', 'c-alpha', 'heavy', 'carbon'} or None, - - default: None - String to specify which entries to consider. If None, considers - all atoms for comparison. - - -- `invert` : bool, default: False - - Inverts the string query if true. For example, the setting - `s='hydrogen', invert=True` computes the RMSD based on all - but hydrogen atoms. - -**Returns** - -- `rmsd` : float - - Root Mean Square Deviation between df1 and df2 - -### Properties - -
- -*df* - -Acccess dictionary of pandas DataFrames for PDB record sections. - diff --git a/docs/sources/api_subpackages/biopandas.mol2.md b/docs/sources/api_subpackages/biopandas.mol2.md deleted file mode 100644 index eaa4bdc..0000000 --- a/docs/sources/api_subpackages/biopandas.mol2.md +++ /dev/null @@ -1,213 +0,0 @@ -biopandas version: 0.3.0dev0 -## PandasMol2 - -*PandasMol2()* - -Object for working with Tripos Mol2 structure files. - -**Attributes** - -- `df` : pandas.DataFrame - - DataFrame of a Mol2's ATOM section - - -- `mol2_text` : str - - Mol2 file contents in string format - - -- `code` : str - - ID, code, or name of the molecule stored - - -- `pdb_path` : str - - Location of the MOL2 file that was read in via `read_mol2` - -### Methods - -
- -*distance(xyz=(0.0, 0.0, 0.0))* - -Computes Euclidean distance between atoms in - self.df and a 3D point. - -**Parameters** - -- `xyz` : tuple (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the atom section and `xyz`. - -
- -*distance_df(df, xyz=(0.0, 0.0, 0.0))* - -Computes Euclidean distance between atoms and a 3D point. - -**Parameters** - -- `df` : DataFrame - - DataFrame containing entries similar to the PandasMol2.df - format for the - the distance computation to the `xyz` reference coordinates. - -- `xyz` : tuple (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the atom section and `xyz`. - -
- -*read_mol2(path, columns=None)* - -Reads Mol2 files (unzipped or gzipped) from local drive - - Note that if your mol2 file contains more than one molecule, - only the first molecule is loaded into the DataFrame - -**Attributes** - -- `path` : str - - Path to the Mol2 file in .mol2 format or gzipped format (.mol2.gz) - - -- `columns` : dict or None (default: None) - - If None, this methods expects a 9-column ATOM section that contains - the following columns: - - {0:('atom_id', int), 1:('atom_name', str), - 2:('x', float), 3:('y', float), 4:('z', float), - 5:('atom_type', str), 6:('subst_id', int), - 7:('subst_name', str), 8:('charge', float)} - - If your Mol2 files are formatted differently, you can provide your - own column_mapping dictionary in a format similar to the one above. - However, note that not all assert_raise_message methods - may be supported then. - -**Returns** - -self - -
- -*read_mol2_from_list(mol2_lines, mol2_code, columns=None)* - -Reads Mol2 file from a list into DataFrames - -**Attributes** - -- `mol2_lines` : list - - A list of lines containing the mol2 file contents. For example, - ['@MOLECULE\n', - 'ZINC38611810\n', - ' 65 68 0 0 0\n', - 'SMALL\n', - 'NO_CHARGES\n', - '\n', - '@ATOM\n', - ' 1 C1 -1.1786 2.7011 -4.0323 C.3 1 <0> -0.1537\n', - ' 2 C2 -1.2950 1.2442 -3.5798 C.3 1 <0> -0.1156\n', - ...] - - -- `mol2_code` : str or None - - Name or ID of the molecule. - - -- `columns` : dict or None (default: None) - - If None, this methods expects a 9-column ATOM section that contains - the following columns: - {0:('atom_id', int), 1:('atom_name', str), - 2:('x', float), 3:('y', float), 4:('z', float), - 5:('atom_type', str), 6:('subst_id', int), - 7:('subst_name', str), 8:('charge', float)} - If your Mol2 files are formatted differently, you can provide your - own column_mapping dictionary in a format similar to the one above. - However, note that not all assert_raise_message methods may be - supported then. - -**Returns** - -self - -
- -*rmsd(df1, df2, heavy_only=True)* - -Compute the Root Mean Square Deviation between molecules - -**Parameters** - -- `df1` : pandas.DataFrame - - DataFrame with HETATM, ATOM, and/or ANISOU entries - -- `df2` : pandas.DataFrame - - Second DataFrame for RMSD computation against df1. Must have the - same number of entries as df1 - -- `heavy_only` : bool (default: True) - - Which atoms to compare to compute the RMSD. If `True` (default), - computes the RMSD between non-hydrogen atoms only. - -**Returns** - -- `rmsd` : float - - Root Mean Square Deviation between df1 and df2 - -### Properties - -
- -*df* - -Acccesses the pandas DataFrame - -## split_multimol2 - -*split_multimol2(mol2_path)* - -Generator function that - splits a multi-mol2 file into individual Mol2 file contents. - -**Parameters** - -- `mol2_path` : str - - Path to the multi-mol2 file. Parses gzip files if the filepath - ends on .gz. - -**Returns** - -A generator object for lists for every extracted mol2-file. Lists contain - the molecule ID and the mol2 file contents. - e.g., ['ID1234', ['@MOLECULE\n', '...']]. Note that bytestrings - are returned (for reasons of efficieny) if the Mol2 content is read - from a gzip (.gz) file. - diff --git a/docs/sources/api_subpackages/biopandas.pdb.md b/docs/sources/api_subpackages/biopandas.pdb.md deleted file mode 100644 index 6f33931..0000000 --- a/docs/sources/api_subpackages/biopandas.pdb.md +++ /dev/null @@ -1,320 +0,0 @@ -biopandas version: 0.3.0dev0 -## PandasPdb - -*PandasPdb()* - -Object for working with Protein Databank structure files. - -**Attributes** - -- `df` : dict - - Dictionary storing pandas DataFrames for PDB record sections. - The dictionary keys are {'ATOM', 'HETATM', 'ANISOU', 'OTHERS'} - where 'OTHERS' contains all entries that are not parsed as - 'ATOM', 'HETATM', or 'ANISOU'. - - -- `pdb_text` : str - - PDB file contents in raw text format. - - -- `pdb_path` : str - - Location of the PDB file that was read in via `read_pdb` - or URL of the page where the PDB content was fetched from - if `fetch_pdb` was called. - - -- `header` : str - - PDB file description. - - -- `code` : str - - PDB code - -### Methods - -
- -*amino3to1(record='ATOM', residue_col='residue_name', fillna='?')* - -Creates 1-letter amino acid codes from DataFrame - - Non-canonical amino-acids are converted as follows: - ASH (protonated ASP) => D - CYX (disulfide-bonded CYS) => C - GLH (protonated GLU) => E - HID/HIE/HIP (different protonation states of HIS) = H - HYP (hydroxyproline) => P - MSE (selenomethionine) => M - -**Parameters** - -- `record` : str, default: 'ATOM' - - Specfies the record DataFrame. - -- `residue_col` : str, default: 'residue_name' - - Column in `record` DataFrame to look for 3-letter amino acid - codes for the conversion. - -- `fillna` : str, default: '?' - - Placeholder string to use for unknown amino acids. - -**Returns** - -- `pandas.DataFrame` : Pandas DataFrame object consisting of two columns, - - `'chain_id'` and `'residue_name'`, where the former contains - the chain ID of the amino acid and the latter - contains the 1-letter amino acid code, respectively. - -
- -*distance(xyz=(0.0, 0.0, 0.0), records=('ATOM', 'HETATM'))* - -Computes Euclidean distance between atoms and a 3D point. - -**Parameters** - -- `xyz` : tuple, default: (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation. - -- `records` : iterable, default: ('ATOM', 'HETATM') - - Specify which record sections to consider. For example, to consider - both protein and ligand atoms, set `records=('ATOM', 'HETATM')`. - This setting is ignored if `df` is not set to None. - For downward compatibility, a string argument is still supported - but deprecated and will be removed in future versions. - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the record section and `xyz`. - -
- -*distance_df(df, xyz=(0.0, 0.0, 0.0))* - -Computes Euclidean distance between atoms and a 3D point. - -**Parameters** - -- `df` : DataFrame - - DataFrame containing entries in the `PandasPdb.df['ATOM']` - or `PandasPdb.df['HETATM']` format for the - the distance computation to the `xyz` reference coordinates. - -- `xyz` : tuple, default: (0.00, 0.00, 0.00) - - X, Y, and Z coordinate of the reference center for the distance - computation. - -**Returns** - -- `pandas.Series` : Pandas Series object containing the Euclidean - - distance between the atoms in the record section and `xyz`. - -
- -*fetch_pdb(pdb_code)* - -Fetches PDB file contents from the Protein Databank at rcsb.org. - -**Parameters** - -- `pdb_code` : str - - A 4-letter PDB code, e.g., "3eiy". - -**Returns** - -self - -
- -*get(s, df=None, invert=False, records=('ATOM', 'HETATM'))* - -Filter PDB DataFrames by properties - -**Parameters** - -- `s` : str in {'main chain', 'hydrogen', 'c-alpha', 'heavy'} - - String to specify which entries to return. - - -- `df` : pandas.DataFrame, default: None - - Optional DataFrame to perform the filter operation on. - If df=None, filters on self.df['ATOM']. - - -- `invert` : bool, default: True - - Inverts the search query. For example if s='hydrogen' and - invert=True, all but hydrogen entries are returned. - - -- `records` : iterable, default: ('ATOM', 'HETATM') - - Specify which record sections to consider. For example, to consider - both protein and ligand atoms, set `records=('ATOM', 'HETATM')`. - This setting is ignored if `df` is not set to None. - For downward compatibility, a string argument is still supported - but deprecated and will be removed in future versions. - -**Returns** - -- `df` : pandas.DataFrame - - Returns a DataFrame view on the filtered entries. - -
- -*impute_element(records=('ATOM', 'HETATM'), inplace=False)* - -Impute element_symbol from atom_name section. - -**Parameters** - -- `records` : iterable, default: ('ATOM', 'HETATM') - - Coordinate sections for which the element symbols should be - imputed. - - -- `inplace` : bool, (default: False - - Performs the operation in-place if True and returns a copy of the - PDB DataFrame otherwise. - -**Returns** - -DataFrame - -
- -*parse_sse()* - -Parse secondary structure elements - -
- -*read_pdb(path)* - -Read PDB files (unzipped or gzipped) from local drive - -**Attributes** - -- `path` : str - - Path to the PDB file in .pdb format or gzipped format (.pdb.gz). - -**Returns** - -self - -
- -*read_pdb_from_list(pdb_lines)* - -Reads PDB file from a list into DataFrames - -**Attributes** - -- `pdb_lines` : list - - A list of lines containing the pdb file contents. - -**Returns** - -self - -
- -*rmsd(df1, df2, s=None, invert=False)* - -Compute the Root Mean Square Deviation between molecules. - -**Parameters** - -- `df1` : pandas.DataFrame - - DataFrame with HETATM, ATOM, and/or ANISOU entries. - - -- `df2` : pandas.DataFrame - - Second DataFrame for RMSD computation against df1. Must have the - same number of entries as df1. - - -- `s` : {'main chain', 'hydrogen', 'c-alpha', 'heavy', 'carbon'} or None, - - default: None - String to specify which entries to consider. If None, considers - all atoms for comparison. - - -- `invert` : bool, default: False - - Inverts the string query if true. For example, the setting - `s='hydrogen', invert=True` computes the RMSD based on all - but hydrogen atoms. - -**Returns** - -- `rmsd` : float - - Root Mean Square Deviation between df1 and df2 - -
- -*to_pdb(path, records=None, gz=False, append_newline=True)* - -Write record DataFrames to a PDB file or gzipped PDB file. - -**Parameters** - -- `path` : str - - A valid output path for the pdb file - - -- `records` : iterable, default: None - - A list of PDB record sections in - {'ATOM', 'HETATM', 'ANISOU', 'OTHERS'} that are to be written. - Writes all lines to PDB if `records=None`. - - -- `gz` : bool, default: False - - Writes a gzipped PDB file if True. - - -- `append_newline` : bool, default: True - - Appends a new line at the end of the PDB file if True - -### Properties - -
- -*df* - -Acccess dictionary of pandas DataFrames for PDB record sections. - diff --git a/docs/sources/api_subpackages/biopandas.testutils.md b/docs/sources/api_subpackages/biopandas.testutils.md deleted file mode 100644 index f5ff06f..0000000 --- a/docs/sources/api_subpackages/biopandas.testutils.md +++ /dev/null @@ -1,27 +0,0 @@ -biopandas version: 0.3.0dev0 -## assert_raises - -*assert_raises(exception_type, message, func, *args, **kwargs)* - -Check that an exception is raised with a specific message - -**Parameters** - -- `exception_type` : exception - - The exception that should be raised - -- `message` : str (default: None) - - The error message that should be raised. Ignored if False or None - -- `func` : callable - - The function that raises the exception - -- `*args` : positional arguments to `func` - - -- `**kwargs` : keyword arguments to `func` - - diff --git a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames.md b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames.md index f494cee..39da11e 100644 --- a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames.md +++ b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames.md @@ -2,22 +2,13 @@ ## Loading PDB Files -There are 2 1/2 ways to load a PDB structure into a `PandasPdb` object. +There are 3 ways to load a PDB structure into a `PandasPdb` object. #### 1 PDB files can be directly fetched from The Protein Data Bank at [http://www.rcsb.org](http://www.rcsb.org) via its unique 4-letter after initializing a new [`PandasPdb`](../api/biopandas.pdb#pandaspdb) object and calling the [`fetch_pdb`](../api/biopandas.pdb#pandaspdbfetch_pdb) method: -```python -from biopandas.pdb import PandasPdb - -# Initialize a new PandasPdb object -# and fetch the PDB file from rcsb.org -ppdb = PandasPdb().fetch_pdb('3eiy') -``` - - ```python from biopandas.pdb import PandasPdb @@ -38,11 +29,11 @@ ppdb.read_pdb('./data/3eiy.pdb') - + -[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/master/docs/sources/tutorials/data/3eiy.pdb)] +[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/main/docs/tutorials/data/3eiy.pdb)] #### 2 b) @@ -56,11 +47,11 @@ ppdb.read_pdb('./data/3eiy.pdb.gz') - + -[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/master/docs/sources/tutorials/data/3eiy.pdb.gz?raw=true)] +[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/main/docs/tutorials/data/3eiy.pdb.gz?raw=true)] After the file was succesfully loaded, we have access to the following attributes: @@ -177,6 +168,123 @@ ppdb.df['ATOM'].head(3) But more on that in the next section. +#### 3) + +**Loading PDB files from a Python List** + +Since biopandas 0.3.0, PDB files can also be loaded into a PandasPdb object from a Python list: + + +```python +with open('./data/3eiy.pdb', 'r') as f: + three_eiy = f.readlines() + +ppdb2 = PandasPdb() +ppdb2.read_pdb_from_list(three_eiy) + +ppdb2.df['ATOM'].head() +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
record_nameatom_numberblank_1atom_name...segment_idelement_symbolchargeline_idx
0ATOM1N...NNaN609
1ATOM2CA...CNaN610
2ATOM3C...CNaN611
3ATOM4O...ONaN612
4ATOM5CB...CNaN613
+

5 rows × 21 columns

+
+ + + ## Looking at PDBs in DataFrames PDB files are parsed according to the [PDB file format description](http://www.rcsb.org/pdb/static.do?p=file_formats/pdb/index.html). More specifically, BioPandas reads the columns of the ATOM and HETATM sections as shown in the following excerpt from [http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#ATOM](http://deposit.rcsb.org/adit/docs/pdb_atom_format.html#ATOM). @@ -237,7 +345,7 @@ ppdb.df.keys() -[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/master/docs/sources/tutorials/data/3eiy.pdb)] +[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/main/docs/tutorials/data/3eiy.pdb)] - 'ATOM': contains the entries from the ATOM coordinate section - 'HETATM': ... entries from the "HETATM" coordinate section @@ -646,7 +754,7 @@ ppdb.df['ATOM'].head() -[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/master/docs/sources/tutorials/data/3eiy.pdb.gz?raw=true)] +[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/main/docs/tutorials/data/3eiy.pdb.gz?raw=true)] Okay, there's actually not *that* much to say ... Once we have our PDB file in the DataFrame format, we have the whole convenience of [pandas](http://pandas.pydata.org) right there at our fingertips. @@ -988,121 +1096,6 @@ print('Average B-Factor [Main Chain]: %.2f' % bfact_mc_avg) Average B-Factor [Main Chain]: 28.83 -**Loading PDB files from a Python List** - -Since biopandas 0.3.0, PDB files can also be loaded into a PandasPdb object from a Python list: - - -```python -with open('./data/3eiy.pdb', 'r') as f: - three_eiy = f.readlines() - -ppdb2 = PandasPdb() -ppdb2.read_pdb_from_list(three_eiy) - -ppdb2.df['ATOM'].head() -``` - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
record_nameatom_numberblank_1atom_name...segment_idelement_symbolchargeline_idx
0ATOM1N...NNaN609
1ATOM2CA...CNaN610
2ATOM3C...CNaN611
3ATOM4O...ONaN612
4ATOM5CB...CNaN613
-

5 rows × 21 columns

-
- - - ## Plotting Since we are using pandas under the hood, which in turns uses matplotlib under the hood, we can produce quick summary plots of our PDB structures relatively conveniently: @@ -1113,7 +1106,7 @@ from biopandas.pdb import PandasPdb ppdb = PandasPdb().read_pdb('./data/3eiy.pdb.gz') ``` -[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/master/docs/sources/tutorials/data/3eiy.pdb.gz?raw=true)] +[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/main/docs/tutorials/data/3eiy.pdb.gz?raw=true)] ```python @@ -1174,8 +1167,10 @@ BioPandas also comes with certain convenience functions, for example, ... The Root-mean-square deviation (RMSD) is simply a measure of the average distance between atoms of 2 protein or ligand structures. This calculation of the Cartesian error follows the equation: -$$RMSD(a, b) = \sqrt{\frac{1}{n} \sum^{n}_{i=1} \big((a_{ix})^2 + (a_{iy})^2 + (a_{iz})^2 \big)} \\ -= \sqrt{\frac{1}{n} \sum^{n}_{i=1} || a_i + b_i||_2^2}$$ +$$ +RMSD(a, b) = \sqrt{\frac{1}{n} \sum^{n}_{i=1} \big((a_{ix})^2 + (a_{iy})^2 + (a_{iz})^2 \big)} += \sqrt{\frac{1}{n} \sum^{n}_{i=1} || a_i + b_i||_2^2} +$$ So, assuming that the we have the following 2 conformations of a ligand molecule @@ -1197,7 +1192,9 @@ print('RMSD: %.4f Angstrom' % r) RMSD: 2.6444 Angstrom - /Users/sebastian/code/github_rasbt/biopandas/biopandas/pdb/pandas_pdb.py:403: UserWarning: No ATOM entries have been loaded. Is the input file/text in the pdb format? + /Users/sebastian/Desktop/biopandas/biopandas/pdb/pandas_pdb.py:403: UserWarning: No ATOM entries have been loaded. Is the input file/text in the pdb format? + warnings.warn('No ATOM entries have been loaded. ' + /Users/sebastian/Desktop/biopandas/biopandas/pdb/pandas_pdb.py:403: UserWarning: No ATOM entries have been loaded. Is the input file/text in the pdb format? warnings.warn('No ATOM entries have been loaded. ' @@ -1210,7 +1207,7 @@ r = PandasPdb.rmsd(l_1.df['HETATM'], l_2.df['HETATM'], print('RMSD: %.4f Angstrom' % r) ``` - RMSD: 3.1405 Angstrom + RMSD: 1.7249 Angstrom @@ -1267,7 +1264,7 @@ reference_point = (9.362, 41.410, 10.542) distances = p_1.distance(xyz=reference_point, records=('ATOM',)) ``` -[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/master/docs/sources/tutorials/data/3eiy.pdb)] +[File link: [3eiy.pdb](https://raw.githubusercontent.com/rasbt/biopandas/main/docs/tutorials/data/3eiy.pdb)] The distance method returns a Pandas Series object: @@ -1519,7 +1516,7 @@ for chain_id in sequence['chain_id'].unique(): Finally, let's talk about how to get the PDB structures out of the DataFrame format back into the beloved .pdb format. -Let's say we loaded a PDB structure, removed it from it's hydrogens: +Let's say we loaded a PDB structure, removed it from its hydrogens: ```python @@ -1528,7 +1525,7 @@ ppdb = PandasPdb().read_pdb('./data/3eiy.pdb.gz') ppdb.df['ATOM'] = ppdb.df['ATOM'][ppdb.df['ATOM']['element_symbol'] != 'H'] ``` -[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/master/docs/sources/tutorials/data/3eiy.pdb.gz?raw=true)] +[File link: [3eiy.pdb.gz](https://github.com/rasbt/biopandas/blob/main/docs/tutorials/data/3eiy.pdb.gz?raw=true)] We can save the file using the [`PandasPdb.to_pdb`](../api/biopandas.pdb#pandaspdbto_pdb) method: @@ -1540,7 +1537,7 @@ ppdb.to_pdb(path='./data/3eiy_stripped.pdb', append_newline=True) ``` -[File link: [3eiy_stripped.pdb](https://raw.githubusercontent.com/rasbt/biopandas/master/docs/sources/tutorials/data/3eiy_stripped.pdb)] +[File link: [3eiy_stripped.pdb](https://raw.githubusercontent.com/rasbt/biopandas/main/docs/tutorials/data/3eiy_stripped.pdb)] By default, all records (that is, 'ATOM', 'HETATM', 'OTHERS', 'ANISOU') are written if we set `records=None`. Alternatively, let's say we want to get rid of the 'ANISOU' entries and produce a compressed gzip archive of our PDB structure: @@ -1552,4 +1549,9 @@ ppdb.to_pdb(path='./data/3eiy_stripped.pdb.gz', append_newline=True) ``` -[File link: [3eiy_stripped.pdb.gz](https://github.com/rasbt/biopandas/blob/master/docs/sources/tutorials/data/3eiy_stripped.pdb.gz?raw=true)] +[File link: [3eiy_stripped.pdb.gz](https://github.com/rasbt/biopandas/blob/main/docs/tutorials/data/3eiy_stripped.pdb.gz?raw=true)] + + +```python + +``` diff --git a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_71_0.png b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_71_0.png index 512ae97..e81c7d3 100644 Binary files a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_71_0.png and b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_71_0.png differ diff --git a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_72_0.png b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_72_0.png index 7a1459e..a578e3a 100644 Binary files a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_72_0.png and b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_72_0.png differ diff --git a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_73_0.png b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_73_0.png index 7cd9ae4..dff51ac 100644 Binary files a/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_73_0.png and b/docs/tutorials/Working_with_PDB_Structures_in_DataFrames_files/Working_with_PDB_Structures_in_DataFrames_73_0.png differ diff --git a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames.md b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames.md index c8f96b5..7b2e229 100644 --- a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames.md +++ b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames.md @@ -29,7 +29,7 @@ pmmcif.read_mmcif('./data/3eiy.cif') - + @@ -47,7 +47,7 @@ pmmcif.read_mmcif('./data/3eiy.cif.gz') - + @@ -302,9 +302,7 @@ pmmcif2.df['ATOM'].head() ## Looking at mmCIF files in DataFrames -mmCIF files are parsed according to the [mmCIF file format description](https://mmcif.wwpdb.org). More specifically, BioPandas - -TODO +mmCIF files are parsed according to the [mmCIF file format description](https://mmcif.wwpdb.org). For more information, we recommend the helpful [Beginner’s Guide to PDB Structures and the PDBx/mmCIF Format](https://pdb101.rcsb.org/learn/guide-to-understanding-pdb-data/beginner’s-guide-to-pdb-structures-and-the-pdbx-mmcif-format) guide. @@ -333,6 +331,74 @@ pmmcif.df.keys() - 'HETATM': ... entries from the "HETATM" coordinate section - 'ANISOU': ... entries from the "ANISOU" coordinate section +The columns for `'ATOM'` DataFrame are as follows: + + +```python +pmmcif.df['ATOM'].columns +``` + + + + + Index(['group_PDB', 'id', 'type_symbol', 'label_atom_id', 'label_alt_id', 'label_comp_id', 'label_asym_id', 'label_entity_id', 'label_seq_id', 'pdbx_PDB_ins_code', 'Cartn_x', 'Cartn_y', 'Cartn_z', 'occupancy', 'B_iso_or_equiv', 'pdbx_formal_charge', 'auth_seq_id', 'auth_comp_id', 'auth_asym_id', 'auth_atom_id', 'pdbx_PDB_model_num'], dtype='object') + + + +- **'group_PDB'**: +The group of atoms to which the atom site belongs. This data + item is provided for compatibility with the original Protein + Data Bank format, and only for that purpose. +- **'id'**: The value of _atom_site.id must uniquely identify a record in the + ATOM_SITE list. Note that this item need not be a number; it can be any unique + identifier. +- **'type_symbol'**: The code used to identify the atom species (singular or plural) + representing this atom type. Normally this code is the element + symbol. The code may be composed of any character except + an underscore with the additional proviso that digits designate + an oxidation state and must be followed by a + or - character. +- **'label_atom_id'**: An atom name identifier, e.g., N, CA, C, O, ... +- **'label_alt_id'**: A place holder to indicate alternate conformation. The alternate conformation + can be an entire polymer chain, or several residues or + partial residue (several atoms within one residue). If + an atom is provided in more than one position, then a + non-blank alternate location indicator must be used for + each of the atomic positions. +- **'label_comp_id'**: For protein polymer entities, this is the three-letter code for + the amino acid. For nucleic acid polymer entities, this is the one-letter code + for the base. +- **'label_asym_id'**: A value that uniquely identifies a record in + the STRUCT_ASYM list. +- **'label_entity_id'**: A value that uniquely identifies a record in + the ENTITY list. +- **'label_seq_id'**: A value that uniquely identifies a record in + the ENTITY_POLY_SEQ list. +- **'pdbx_PDB_ins_code'**: PDB insertion code. +- **'Cartn_x'**: The x atom-site coordinate in angstroms +- **'Cartn_y'**: The y atom-site coordinate in angstroms +- **'Cartn_z'**: The z atom-site coordinate in angstroms +- **'occupancy'**: The fraction of the atom type present at this site. + The sum of the occupancies of all the atom types at this site + may not significantly exceed 1.0 unless it is a dummy site. +- **'B_iso_or_equiv'**: Isotropic atomic displacement parameter, or equivalent isotropic + atomic displacement parameter, B_eq, calculated from the + anisotropic displacement parameters. +- **'pdbx_formal_charge'**: The net integer charge assigned to this atom. This is the + formal charge assignment normally found in chemical diagrams. +- **'auth_seq_id'**: An alternative identifier for _atom_site.label_seq_id that + may be provided by an author in order to match the identification + used in the publication that describes the structure. +- **'auth_comp_id'**: An alternative identifier for _atom_site.label_comp_id that + may be provided by an author in order to match the identification + used in the publication that describes the structure. +- **'auth_asym_id'**: An alternative identifier for _atom_site.label_asym_id that + may be provided by an author in order to match the identification + used in the publication that describes the structure. +- **'auth_atom_id'**: An alternative identifier for _atom_site.label_atom_id that + may be provided by an author in order to match the identification + used in the publication that describes the structure. +- **'pdbx_PDB_model_num'**: PDB model number. + The columns of the 'HETATM' DataFrame are indentical to the 'ATOM' DataFrame that we've seen earlier: @@ -404,122 +470,83 @@ pmmcif.df['HETATM'].head(2) -
- -Note that "ANISOU" entries are handled a bit differently as specified at ??? - ```python -pmmcif.df['ANISOU'].head(2) +set(pmmcif.df['HETATM'].columns) == set(pmmcif.df['ATOM'].columns) ``` -
- - - - - - - - - - - - - - - - - - -
idtype_symbolpdbx_label_atom_idpdbx_label_alt_id...pdbx_auth_seq_idpdbx_auth_comp_idpdbx_auth_asym_idpdbx_auth_atom_id
-

0 rows × 18 columns

-
+ True -Not every PDB file contains ANISOU entries (similarly, some PDB files may only contain HETATM or ATOM entries). If records are present, the DataFrame will be empty as show above. +However, there are a few naming differences in the ANISOU columns, for instance, the `'ATOM'` and `'HETATM'` DataFrames feature the following columns that are not contained in ANISOU: ```python -pmmcif.df['ANISOU'].empty +set(pmmcif.df['ATOM'].columns) - set(pmmcif.df['ANISOU'].columns) ``` - True + {'B_iso_or_equiv', + 'Cartn_x', + 'Cartn_y', + 'Cartn_z', + 'auth_asym_id', + 'auth_atom_id', + 'auth_comp_id', + 'auth_seq_id', + 'group_PDB', + 'label_alt_id', + 'label_asym_id', + 'label_atom_id', + 'label_comp_id', + 'label_entity_id', + 'label_seq_id', + 'occupancy', + 'pdbx_PDB_model_num', + 'pdbx_formal_charge'} -Since the DataFrames are fairly wide, let's us take a look at the columns by accessing the DataFrame's `column` attribute: +Vice versa, ANISOU contains the following columns that are not in the `'ATOM'` and `'HETATM'` DataFrames: ```python -pmmcif.df['ANISOU'].columns +set(pmmcif.df['ANISOU'].columns) - set(pmmcif.df['ATOM'].columns) ``` - Index(['id', 'type_symbol', 'pdbx_label_atom_id', 'pdbx_label_alt_id', 'pdbx_label_comp_id', 'pdbx_label_asym_id', 'pdbx_label_seq_id', 'pdbx_PDB_ins_code', 'U[1][1]', 'U[2][2]', 'U[3][3]', 'U[1][2]', 'U[1][3]', 'U[2][3]', 'pdbx_auth_seq_id', 'pdbx_auth_comp_id', 'pdbx_auth_asym_id', 'pdbx_auth_atom_id'], dtype='object') + {'U[1][1]', + 'U[1][2]', + 'U[1][3]', + 'U[2][2]', + 'U[2][3]', + 'U[3][3]', + 'pdbx_auth_asym_id', + 'pdbx_auth_atom_id', + 'pdbx_auth_comp_id', + 'pdbx_auth_seq_id', + 'pdbx_label_alt_id', + 'pdbx_label_asym_id', + 'pdbx_label_atom_id', + 'pdbx_label_comp_id', + 'pdbx_label_seq_id'} -TODO - -
-
- -Ah, another interesting thing to mention is that the columns already come with the types you'd expect (where `object` essentially "means" `str` here): - - -```python -pmmcif.df['ATOM'].dtypes -``` - - - - - group_PDB object - id int64 - type_symbol object - label_atom_id object - label_alt_id object - label_comp_id object - label_asym_id object - label_entity_id int64 - label_seq_id object - pdbx_PDB_ins_code object - Cartn_x float64 - Cartn_y float64 - Cartn_z float64 - occupancy float64 - B_iso_or_equiv float64 - pdbx_formal_charge object - auth_seq_id int64 - auth_comp_id object - auth_asym_id object - auth_atom_id object - pdbx_PDB_model_num int64 - dtype: object +BioPandas tries to stay to the original column names as close as possible, and for more details, we recommend checking the original descriptions: +- [ATOM/HETATM](https://mmcif.wwpdb.org/docs/pdb_to_pdbx_correspondences.html#ATOMP) +- [ANISOU](https://mmcif.wwpdb.org/docs/pdb_to_pdbx_correspondences.html#ANISOU) +

@@ -1001,7 +1028,7 @@ style.use('ggplot') ```python -pmmcif.df['ATOM']['occupancy'].plot(kind='hist') +pmmcif.df['ATOM']['B_iso_or_equiv'].plot(kind='hist') plt.title('Distribution of B-Factors') plt.xlabel('B-factor') plt.ylabel('count') @@ -1010,13 +1037,13 @@ plt.show() -![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png) +![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_61_0.png) ```python -pmmcif.df['ATOM']['occupancy'].plot(kind='line') +pmmcif.df['ATOM']['B_iso_or_equiv'].plot(kind='line') plt.title('B-Factors Along the Amino Acid Chain') plt.xlabel('Residue Number') plt.ylabel('B-factor in $A^2$') @@ -1025,7 +1052,7 @@ plt.show() -![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png) +![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png) @@ -1040,7 +1067,7 @@ plt.show() -![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_64_0.png) +![png](Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png) diff --git a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_61_0.png b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_61_0.png new file mode 100644 index 0000000..e81c7d3 Binary files /dev/null and b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_61_0.png differ diff --git a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png index d0cb32c..a578e3a 100644 Binary files a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png and b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_62_0.png differ diff --git a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png index bb3b3c1..dff51ac 100644 Binary files a/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png and b/docs/tutorials/Working_with_mmCIF_Structures_in_DataFrames_files/Working_with_mmCIF_Structures_in_DataFrames_63_0.png differ diff --git a/mkdocs.yml b/mkdocs.yml index c7d48ee..fc7c91e 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,7 +24,7 @@ extra_javascript: extra_css: - extra.css -copyright: Copyright © 2015-2021 Sebastian Raschka +copyright: Copyright © 2015-2022 Sebastian Raschka google_analytics: ['UA-38457794-3', 'rasbt.github.io/biopandas'] nav: