From 456c25de63eea411180c3027cc320addffb030b7 Mon Sep 17 00:00:00 2001 From: Rodrigo V Honorato Date: Mon, 22 Apr 2024 13:30:39 +0200 Subject: [PATCH] linting --- .devcontainer/devcontainer.json | 2 +- .github/workflows/test.yml | 1 - INSTALLATION.md | 40 +- USAGE.md | 36 +- media/1ppe_whiscy.png | Bin 193784 -> 165556 bytes media/loch_haddock.png | Bin 399184 -> 341502 bytes media/whiscy_logo.png | Bin 18680 -> 16747 bytes media/whiscy_logo.svg | 126 +-- src/whiscy/cli_consadjust.py | 2 +- src/whiscy/cli_setup.py | 2 +- src/whiscy/modules/pam_data.py | 1365 +++++++++++++++++++++++---- src/whiscy/modules/quotes.py | 33 +- tests/gold/run_parasmooth.sh | 2 +- tests/gold/run_whiscy.sh | 2 +- tests/test_consadjust_regression.py | 4 +- tests/test_parasmooth_regression.py | 4 +- tests/test_resdist_regression.py | 3 +- tests/test_whiscy_regression.py | 2 - 18 files changed, 1230 insertions(+), 394 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e69f75d..7a496dd 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -19,4 +19,4 @@ ] } } -} \ No newline at end of file +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 133e214..038a803 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,6 @@ name: ci on: push: - jobs: test: runs-on: ubuntu-latest diff --git a/INSTALLATION.md b/INSTALLATION.md index 37c6135..0b0c57c 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -19,9 +19,9 @@ To install Whiscy, follow these steps: - Clone the repository: - ```bash - git clone https://github.com/haddocking/whiscy && cd whiscy - ``` + ```bash + git clone https://github.com/haddocking/whiscy && cd whiscy + ``` - Install the scripts @@ -33,23 +33,23 @@ To install Whiscy, follow these steps: - Check the installation - ```text - $ whiscy -h - usage: whiscy [-h] [-o output_file] [--version] - surface_list conversion_table alignment_file distance_file - - positional arguments: - surface_list Surface list - conversion_table Conversion table - alignment_file Alignment file - distance_file Distance file - - options: - -h, --help show this help message and exit - -o output_file, --output output_file - If set, output prediction to this file - --version show program's version number and exit - ``` + ```text + $ whiscy -h + usage: whiscy [-h] [-o output_file] [--version] + surface_list conversion_table alignment_file distance_file + + positional arguments: + surface_list Surface list + conversion_table Conversion table + alignment_file Alignment file + distance_file Distance file + + options: + -h, --help show this help message and exit + -o output_file, --output output_file + If set, output prediction to this file + --version show program's version number and exit + ``` ### Troubleshooting diff --git a/USAGE.md b/USAGE.md index 5aa75af..d36783f 100644 --- a/USAGE.md +++ b/USAGE.md @@ -10,9 +10,9 @@ Below we will give an example of how to use WHISCY to predict the binding site o Download the PDB file of the protein 1PPE from the [RCSB PDB](https://www.rcsb.org/structure/1PPE) website. - ```bash - wget https://files.rcsb.org/download/1PPE.pdb - ``` +```bash +wget https://files.rcsb.org/download/1PPE.pdb +``` ### Setup the prediction @@ -32,26 +32,26 @@ $ whiscy_setup 1PPE.pdb E 2024-04-22 11:44:44,046 cli_setup:319 INFO - Protdist calculated 2024-04-22 11:44:44,054 cli_setup:326 INFO - Conversion table file generated 2024-04-22 11:44:44,054 cli_setup:328 INFO - Whiscy setup finished - ``` +``` This script will generate a set of files needed for the prediction step with `whiscy`. Here it is a list of the generated files in our 1PPE complex. > Follow the links to see a set of pre-generated files for the 1PPE protein. -| File name | Explanation | -| ----------------------------------------- |----------------------------------------------------------------| -| [1ppe.hssp](example/1ppe.hssp) | Multiple sequence alignment download from the HSSP database | -| [1ppe.hssp.bz2](example/1ppe.hssp.bz2) | HSSP MSA file compressed | -| [1ppe.pdb](example/1ppe.pdb) | PDB file download from the Protein Data Bank | -| [1ppe_E.pdb](example/1ppe_E.pdb) | 1ppe.pdb parsed to select only the given `chain_id` | -| [1ppe_E.rsa](example/1ppe_E.rsa) | SASA output of `freesasa` in `NACCESS` format of `1ppe_E.pdb` file| -| [1ppe_E.fasta](example/1ppe_E.fasta) | Sequence of 1ppe_E.pdb. Alternative residues have been removed | -| [1ppe_E.phylseq](example/1ppe_E.phylseq) | MSA file translated from HSSP to PHYLIP format | -| [1ppe_E.conv](example/1ppe_E.conv) | PDB residue numeration to FASTA sequence numeration | -| [1ppe_E.out](example/1ppe_E.out) | Output of the `protdist` software on 1ppe_E.pdb | -| [1ppe_E.sur](example/1ppe_E.sur) | >15 % surface residue list according to `sa_pred_cutoff` cutoff | -| [1ppe_E.suract](example/1ppe_E.suract) | >40 % surface residue list according to `sa_act_cutoff` cutoff | -| [1ppe_E.lac](example/1ppe_E.lac) | 0-15 % accessible residue list | +| File name | Explanation | +| ---------------------------------------- | ------------------------------------------------------------------ | +| [1ppe.hssp](example/1ppe.hssp) | Multiple sequence alignment download from the HSSP database | +| [1ppe.hssp.bz2](example/1ppe.hssp.bz2) | HSSP MSA file compressed | +| [1ppe.pdb](example/1ppe.pdb) | PDB file download from the Protein Data Bank | +| [1ppe_E.pdb](example/1ppe_E.pdb) | 1ppe.pdb parsed to select only the given `chain_id` | +| [1ppe_E.rsa](example/1ppe_E.rsa) | SASA output of `freesasa` in `NACCESS` format of `1ppe_E.pdb` file | +| [1ppe_E.fasta](example/1ppe_E.fasta) | Sequence of 1ppe_E.pdb. Alternative residues have been removed | +| [1ppe_E.phylseq](example/1ppe_E.phylseq) | MSA file translated from HSSP to PHYLIP format | +| [1ppe_E.conv](example/1ppe_E.conv) | PDB residue numeration to FASTA sequence numeration | +| [1ppe_E.out](example/1ppe_E.out) | Output of the `protdist` software on 1ppe_E.pdb | +| [1ppe_E.sur](example/1ppe_E.sur) | >15 % surface residue list according to `sa_pred_cutoff` cutoff | +| [1ppe_E.suract](example/1ppe_E.suract) | >40 % surface residue list according to `sa_act_cutoff` cutoff | +| [1ppe_E.lac](example/1ppe_E.lac) | 0-15 % accessible residue list | ### Make the interface prediction diff --git a/media/1ppe_whiscy.png b/media/1ppe_whiscy.png index be94248d9afb7c3204c72f4575df7e0f7bf924aa..32f8b8cf4674936cbb72fdc4a12c939223bb0ea5 100644 GIT binary patch literal 165556 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