{"id":20915680,"url":"https://github.com/markovmodel/pysfd","last_synced_at":"2025-07-02T14:05:31.093Z","repository":{"id":41092727,"uuid":"120060680","full_name":"markovmodel/PySFD","owner":"markovmodel","description":null,"archived":false,"fork":false,"pushed_at":"2020-06-18T10:38:29.000Z","size":124416,"stargazers_count":5,"open_issues_count":0,"forks_count":6,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-01T23:03:53.374Z","etag":null,"topics":["collective-variables","ensemble","molecular-dynamics","order-parameters","visualization"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markovmodel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-02-03T04:55:43.000Z","updated_at":"2022-06-28T10:50:38.000Z","dependencies_parsed_at":"2022-07-30T21:08:08.118Z","dependency_job_id":null,"html_url":"https://github.com/markovmodel/PySFD","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markovmodel%2FPySFD","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markovmodel%2FPySFD/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markovmodel%2FPySFD/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markovmodel%2FPySFD/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markovmodel","download_url":"https://codeload.github.com/markovmodel/PySFD/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253923130,"owners_count":21984843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["collective-variables","ensemble","molecular-dynamics","order-parameters","visualization"],"created_at":"2024-11-18T16:17:17.318Z","updated_at":"2025-05-13T10:33:21.518Z","avatar_url":"https://github.com/markovmodel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## PySFD - Significant Feature Differences Analyzer for Python\n\nPySFD computes and visualizes any significant differences in features, e.g., distances, contacts, angles, dihedrals, \namong different sets of molecular dynamics-simulated ensembles.\n\nFor an overview, pleas read the following documentation.\nFor further details, please read\n- the doc strings throughout the PySFD package\n- example jupyter notebook and python files located in `PySFD/docs/PySFD_example`\n\nThis software has been thoroughly tested, but comes with no warranty.\n\n### Citation\nIf you find this tool useful, please cite:\n```\nStolzenberg, S. \"PySFD: Comprehensive Molecular Insights from Significant Feature Differences detected among many Simulated Ensembles.\" Bioinformatics (Oxford, England) (2018).\n```\nhttps://doi.org/10.1093/bioinformatics/bty818\n\n### Installation\nPySFD is a Python package available for Python 2 and 3, should in principle run on all common platforms, \nbut is currently only supported for Linux and MacOS.\n\n#### Required Packages\n\nWith conda installed, e.g., via\n\nMiniconda https://conda.io/miniconda.html\n\nfirst make sure you have activated the conda-forge channel:\n```sh\nconda config --add channels conda-forge\n```\n\nand then install the folllowing python packages:\n```sh\nconda install jupyter numpy pathos pandas biopandas mdtraj scipy matplotlib seaborn\n```\n\nto install SHIFTX2 (only works for Python 3):\n```sh\nconda install -c omnia/label/dev shiftx2\n```\n\nFor visualization of significant feature differences, please install the latest versions of:\n\n- PyMOL (https://pymol.org), e.g., via\n```sh\nconda install -c schrodinger pymol\nconda install Pmw\n```\n- VMD (http://www.ks.uiuc.edu/Research/vmd)\n\nIn case you would like to visualize your PySFD results directly from a Python/iPython/Jupyter session (via ```pysfd.view_feature_diffs()```), you will need to install the Python module iPyMol\n(https://github.com/cxhernandez/ipymol.git)\nvia:\n```\npip install ipymol\n```\n\n\n#### Working Package System\n\nPySFD was successfully tested, e.g., using the following python environment:\n\n| package | version | | channel |\n|:---|:---|:---|:---|\n|biopandas                 |0.2.3            |        py36_0    |conda-forge|\n|ipymol                    |0.5              |         \\\u003cpip\\\u003e  |           |\n|jupyter                   |1.0.0            |          py_1    |conda-forge|\n|matplotlib                |2.2.2            |        py36_1    |conda-forge|\n|mdtraj                    |1.9.1            |        py36_1    |conda-forge|\n|numpy                     |1.14.5           |py36hcd700cb_0    |           |\n|pandas                    |0.23.1           |        py36_0    |conda-forge|\n|pathos                    |0.2.1            |        py36_1    |conda-forge|\n|pymol                     |2.1.1            |        py36_2    |schrodinger|\n|python                    |3.6.5            |             1    |conda-forge|\n|scipy                     |1.1.0            |py36hfc37229_0    |           |\n|seaborn                   |0.8.1            |        py36_0    |conda-forge|\n\n(created via\n``conda list \"^python$|^jupyter$|numpy|pathos|pandas|biopandas|mdtraj|scipy|matplotlib|seaborn|shiftx2|pymol|ipymol\"``\n)\n\nThe full conda environment is listed in ./pysfd.yaml\n\n(created via ``conda env export \u003e pysfd.yaml``)\n\n, which can be used to automatically install all required packages via:\n\n``conda env create -f pysfd.yaml``\n\n#### PySFD\n\nThen just download the PySFD package, e.g., via GitHub\n```sh\ngit clone https://github.com/markovmodel/PySFD.git\n```\nand from within the downloaded \"PySFD\" directory,\ninstall PySFD into the Python Path of your environment via:\n```sh\npython setup.py install\n```\nTo uninstall, simply type:\n```sh\npip uninstall pysfd\n```\n\n### Features\nPre-defined features are stored in `pysfd.features` and currently include the following modules\nand feature classes:\n\n[srf.py] : Single Residue Feature (SRF)\n- `CA_RMSF_VMD`:      CA atom root mean square flucatuations (RMSF), computed with VMD\n- `ChemicalShift`:    predicted NMR Chemical Shifts, computed via mdtraj and shiftx2\n- `Dihedral` (`Dihedral_Std`): dihedral angles (their standard deviations) computed with mdtraj, one of the following methods is passed to the `Dihedral` (`Dihedral_Std`) class:\n    - `mdtraj.compute_chi1`\n    - `mdtraj.compute_chi2`\n    - `mdtraj.compute_chi3`\n    - `mdtraj.compute_chi4`\n    - `mdtraj.compute_omega`\n    - `mdtraj.compute_phi`\n    - `mdtraj.compute_psi`\n- `IsDSSP_mdtraj`  :  binary secondary structure assignments (DSSP), e.g., whether or not a helix (\"H\") is formed in a particular residue\n- `Scalar_Coupling`:  scalar couplings computed with mdtraj, one of the following methods is passed to the `Scalar_Coupling` class:\n    - `mdtraj.compute_J3_HN_C`\n    - `mdtraj.compute_J3_HN_CB`\n    - `mdtraj.compute_J3_HN_HA`\n- `SASA_sr`  : solvent accessibility surface areas (SASAs) via mdtraj.shrake_rupley\n- `RSASA_sr` : relative SASA, i.e. normalized to the total SASA of a particular residue, computed via mdtraj.shrake_rupley\n\n[paf.py] : Pairwise Atomic Features (PAF)\n- `Atm2Atm_Distance`:     atom-to-atom distance (CA atoms by default, i.e. if df_sel is None)\n- `AtmPos_Correlation`:   (partial) correlations between atom positions (CA atoms by default, i.e. if df_sel is None)\n\n[prf.py] : Pairwise Residual Features (PRF)\n- `Ca2Ca_Distance`:       distance between CA atoms\n- `CaPos_Correlation`:    (partial) correlations between Ca positions\n- `Dihedral_Correlation`: (partial) correlations between Dihedral angles (see srf module)\n- `Scalar_Coupling_Correlation`: (partial) correlations between Dihedral angles (see srf module)\n\n[spbsf.py]  : sparse Pairwise Backbone Sidechain Features (sPBSF) (contact frequencies and dwell times)\n- `HBond_mdtraj`: hydrogen bonds via mdtraj\n- `HBond_VMD`:    hydrogen bonds via VMD\n- `HBond_HBPLUS`: hydrogen bonds via HBPLUS\n    - link to HBPLUS program:\n      https://www.ebi.ac.uk/thornton-srv/software/HBPLUS/\n    - after installation, please update \"export hbdir=...\"\n      in PySFD/features/scripts/compute_PI.hbplus.sh\n- `Hvvdwdist_VMD`: heavy atom van der Waals radii contacts between residues that are \u003e 4 residue positions apart, computed via VMD\n- `HvvdwHB`: contact, if `Hvvdwdist_VMD` or `HBond_HBPLUS` contact in a simulation frame\n`Hvvdwdist_VMD` contacts can be transformed into a single residual feature (SRF, see above), e.g., by only considering the contact frequencies of any residual backbone or side-chain with water (`Hvvdwdist_H2O`).\n\n[pprf.py]   : Pairwise Pairwise Residual Features (PPRF)\n- `Ca2Ca_Distance_Correlation`: pairwise (partial) correlations between Ca-to-Ca distances\n\n[pspbsf.py] : Pairwise sparse Pairwise Backbone/Sidechain Features (PsPBSF)\n- `sPBSF_Correlation`: (partial) correlations between sPBSF features (see spbsf module)\n\n[pff.py]    : Pairwise Feature Features (PFF)\n- `Feature_Correlation`: pairwise (partial) correlations between (coarse-grained) features, each which are specified for individual frames, e.g. for correlations between `srf.Dihedral` and `spbsf.HBond_mdtraj`, but not with `srf.CA_RMSF_VMD`\n\nBeware of spurious correlations in big data!\n\nEach of these feature classes contained in each module is derived\nfrom `pysfd.features._feature_agent.FeatureAgent`.\nEach such feature class is instantiated and passed as a `FeatureObj` object into\nan `pysfd.PySFD` object, which in turn extracts the essential feature function from `FeatureObj` via\n`FeatureObj.get_feature_func()`.\nThese features classes can be exented by adding further feature classes in each existing feature module,\nor adding further feature modules (make sure then to update `PySFD/features/__init__.py`).\n\nAn important functionality of PySFD is that it allows the histogramming of specific (or all) computed features of a particular type.\nThe features to be histogrammed are initially listed in the `df_hist_feats` parameter, a pandas.DataFrame passed in a particular feature class (see docstrings).\nFor each ensemble, the average feature histograms (with standard deviations) over ensemble trajectories are then computed, and stored into the `PySFD.df_fhists` dictionary.\n\n### Feature Coarse-Graining\nEach of these features can be further coarse-grained for each simulation frame by \"region\" into regional features by providing\n`df_rgn_seg_res_bb`, a user-defined pandas Dataframe, and\n`rgn_agg_func`, user-defined function or string, \nto the specific feature class.\n\n`df_rgn_seg_res_bb` maps from the residual (or sub-residual, i.e. backbone/sidechain) level to the regional level via \nthe columns `rgn` (region ID), `seg` (SegID), `res` (ResID), and optionally `bb` (is backbone (1)? is sidechain (0)?).\n```python\n'''\n* df_rgn_seg_res_bb : optional pandas.DataFrame for coarse-graining that defines\n                      regions by segIDs and resIDs, and optionally backbone/sidechain, e.g.\n  df_rgn_seg_res_bb = _pd.DataFrame({'rgn' : [\"a1\", \"a2\", \"b1\", \"b2\", \"c\"],\n                                     'seg' : [\"A\", \"A\", \"B\", \"B\", \"C\"],\n                                     'res' : [range(4,83), range(83,185), range(4,95), range(95,191), range(102,121)]})\n                      if None, no coarse-graining is performed\n'''\n```\n\n`rgn_agg_func` defines the function used in the coarse-graining, e.g. mean, sum, ...\n```python\n'''\n* rgn_agg_func  : function or str for coarse-graining\n                  function that defines how to aggregate from residues (backbone/sidechain) to regions in each frame\n                  this function uses the coarse-graining mapping defined in `df_rgn_seg_res_bb`\n                  - if a function, it has to be vectorized (i.e. able to be used by, e.g., a 1-dimensional numpy array)\n                  - if a string, it has to be readable by the aggregate function of a pandas Data.Frame,\n                    such as \"mean\", \"std\"\n'''\n```\n\nEach feature class then coarse-grains these features\n- in each simulation frame, if feature values are computed by frame\n- otherwise over feature values, e.g., if the underlying feature type describes an entire trajectory (correlation coefficients, RMSF, ...)\n\nEach feature type has a default for `rgn_agg_func` (usually \"mean\" or \"sum\", see doc strings)\n\nFor help on how to semi-automatically define `df_rgn_seg_res_bb`\nsee:\n\n`PySFD/docs/notes/how_to_define_rgn_to_seg_res_ranges.txt`\n\nFor example definitions of `df_rgn_seg_res_bb` data frames, see\n\n`PySFD/docs/PySFD_example/scripts`\n\n### Feature and Significant Feature Differences\nThese are computed by the following methods (see example jupyter notebooks in `PySFD/docs/PySFD_example`):\n1) `PySFD.comp_features()`,\n2) `PySFD.comp_feature_diffs()`, or `PySFD.comp_feature_diffs_with_dwells()`, and\n3) `PySFD.comp_and_write_common_feature_diffs()`\n\n(further notes below)\n\nMultiple features types and differences can be computed within the same PySFD instance and\nare stored, respectively, into the dictionaries\n`PySFD.df_features[PySFD.feature_func_name]` and\n`PySFD.df_feature_diffs[PySFD.feature_func_name]`, where\n`PySFD.feature_func_name` is the name of the\ncurrently selected feature function `PySFD.feature_func`.\n\nFurther Notes:\n\n1\\. `PySFD.comp_features()`\n\nFeatures are computed as means over ensemble trajectory means (and optionally higher statistical moments with respect to the mean, see parameter `max_mom_ord` in the docstrings),\ni.e. each feature as a mean of the feature's mean (or higher statistical moment with respect to the mean) along each trajectory\n(circular/arithmetic means for circular/linear feature types).\nThe uncertainties of these feature means (and optionally higher moments) can be computed either as\n\n\"standard errors\"     (`PySFD.error_type[PySFD.feature_func_name] = \"std_err\"`) (statistical uncertainty)\n\nor\n\n\"standard deviations\" (`PySFD.error_type[PySFD.feature_func_name] = \"std_dev\"`) (\"exclusive\"(/\"effect size\") uncertainty).\n\n(optional higher moments, i.e. `max_mom_ord\u003e1`, are defined only for \"standard errors\")\n\nIf these uncertainties are computed as \"standard errors\", then each as\na (circular) standard deviation over ensemble trajectory means.\n\nIf these uncertainties are computed as \"standard deviations\", then each as\na mean of (circular) standard deviations over ensemble trajectories.\n\n`PySFD.error_type[PySFD.feature_func_name]` is implicitly defined in each `FeatureObj` object\npassed into PySFD.\n\n(\n\n`PySFD.error_type[PySFD.feature_func_name]` gets updated\nin the beginning of `PySFD.run_ens()`:\n```python\nself.error_type[self._feature_func_name] = dataflags.get(\"error_type\")\n```\n\nAlternatively, one could directly define error_type as a universal PySFD.error_type\nand make PySFD.PyASDA.feat_func() read it, but then looping through a list of \nfeature functions items would require\nupdating self.error_type for every iteration, e.g. via an external dictionary.\n\n)\n\nReloading of already computed features (not differences) is invoked via\n`PySFD.reload_features()`\nand writing features to disk via\n`PySFD.write_features()`.\n\n2\\. `PySFD.comp_feature_diffs()`, or `PySFD.comp_feature_diffs_with_dwells()`\n\nTo determine significant differences among pairs of ensembles, the individual ensemble\nuncertainties are added geometrically (to form \"sigma\", i.e. the sqrt(...) in the manuscript)\nand scaled by `num_sigma`.\nAn individual feature is significantly different between two ensembles, if its mean (optionally a higher moment with respect to the mean) differs in absolute value by\nmore than both `num_funit` and num_sigma * sigma:\n\n![equation](http://latex.codecogs.com/gif.latex?%7Babs%7D%5Cleft%28%5Cbar%7Bf%7D_%7Ba%7D-%5Cbar%7Bf%7D_%7Bb%7D%5Cright%29-%5Cmax%5Cleft%28n_%7B%5Csigma%7D%5Ccdot%5Csqrt%7B%5CDelta_%7Bf_%7Ba%7D%7D%5E%7B2%7D\u0026plus;%5CDelta_%7Bf_%7Bb%7D%7D%5E%7B2%7D%7D%2Cn_%7Bf%7D%5Cright%29%3E0)\n\n(f_a, f_b could either be a mean or optionally a higher statistical moment with respect to the mean)\n\nIf significant differences are computed also in regard to higher statistical moments, then significant differences in the m-th moment (for all 1 \u003c m \u003c= `max_mom_ord`)\nare selected, for which all n-th moments (n\\\u003cm, \"mean\" for n=1) are not significantly different.\n\nSignificant feature difference (d_s in the manuscript) are written to disk via\n\n`PySFD.write_feature_diffs()`\n\n`PySFD.comp_feature_diffs_with_dwells()` computes significant differences in\nsPBSF features *and* dwell times (for this, `PySFD.is_with_dwell_times` must be set to True)\nsPBSF dwell times are defined as the average simulation time (in units of frames) a sPBSF spends\nin the \"on\" (\"off\") state before switching to the \"off\" (\"on\") state.\nCurrently, for sPBSF dwell time computations, the corresponding ensemble trajectories have to be\nplain MD simulation trajectories (i.e. time-dependent, *not* \"samplebatches\" trajectories).\n\n!!!!!!\n\nCurrently, no significant difference in dwell time has been observed in real MD trajectories\nthat cannot already be explained by a significant difference in interaction frequency.\n\nIf you are the first to find such a significant difference, please inform the author \nto claim your complimentary beer / chocolate bar ! ;-)\n\nTo scan your own MD simulations for such peculiar differences, just type in, e.g.:\n```python\nmySDA = PySFD(...)\nmySDA.comp_features(...)\n...\nmySDA.comp_feature_diffs_with_dwells(num_sigma=2)\nabc = mySDA.df_feature_diffs['pbsi.HBond_VMD.std_err'][('bN82A.pcca1', 'WT.pcca3')]\n# significant differences in 'ton' (\"on\"  dwell time) that is NOT significant in 'f' (interaction frequency)\nprint(abc[(-1, 1, 0)])\n# significant differences in 'tof' (\"off\" dwell time) that is NOT significant in 'f' (interaction frequency)\nprint(abc[(-1, 0, 1)])\n```\n!!!!!!\n\n3\\. `PySFD.comp_and_write_common_feature_diffs()`\n\n`PySFD.comp_and_write_common_feature_diffs()` computes and writes out significant feature differences that\nare common among different pairwise ensemble comparisons, and *optionally* that are NOT significantly different among\n a different set of pairwise ensemble comparisons. These common differences may indicate general mechanistic elements that trigger\nconformational changes in the simulated system.\n    \n### Multiprocessed Feature Computation\n`PySFD.comp_features()` uses a two-layer multiprocessing (using the pathos module)\nto compute features. In this multiprocessing, i*j CPU cores on a single node simultaneously\ncompute features of i ensembles and j trajectories (replica). If the features of more than\ni ensembles and/or j replica are to be computed, these features will be computed subsequently on\nthe respectice level (of i or of j).\nIn particular, `PySFD.comp_features()` spawns i non-deamon processes each executing\n`PySFD.run_ens()`. Each `PySFD.run_ens()` then spawns j deamom processes, each executing\n`PySFD.feature_func()`, where the latter is the current feature function.\n\n### Simulation Input\nFeatures are computed from input simulation trajectories that are to be organized\nwith respect to your current working directory as:\n\n`'input/%s/r_%05d/%s.r_%05d.prot.%s' % (myens, r, myens, r, intrajtype)`\n\neach with a PDB File containing the topology information:\n\n`'input/%s/r_%05d/%s.r_%05d.prot.pdb' % (myens, r, myens, r)`, where\n* `myens` is the name of the simulated ensemble\n* `r` is the replica index running from 0 to PySFD.num_bs\n* `intrajtype` is the trajectory format\n\nThese input trajectories can be one of two different types:\n```sh\nPySFD.intrajdatatype : string, default=\"samplebatches\"\n        * 'samplebatches'   : trajectories each containing frames sampled from\n                              a stationary distribution of, e.g.,\n                              a trajectory-bootstrapped MSM or a bayesian MSM sample\n                              of bootstrapped frames drawn, e.g., from\n                              a meta-stable set of a Markov State Model\n        * 'raw'             : plain simulation trajectories, whose feature statistics \n                              - means or (means and standard deviations) - \n                              are further bootstrapped on the trajectory level\n                              (with *num_bs* bootstraps)\n        * 'convcheck'       : for convergence checks of the significant feature differences:\n                              samples a single bootstrap (with replacement) from\n                              the input trajectories containing num_bs (\u003c= numreplica)\n                              bootstrapped trajectories;\n                              for the actual convergence check, you need to run PySFD\n                              with the parameter value 'convcheck' multiple times with\n                              varying parameter values of *num_bs*\n                              (see Fig. S5 in the manuscript and\n                              PySFD/docs/PySFD_example/convcheck folder for example scripts)\n```\n\nand one of two different formats:\n```sh\nPySFD.intrajformat : string, default = \"xtc\"\n        Input trajectory format\n        |  \"xtc\" : gromacs xtc format (additional pdb file for topolgy information required, see example)\n        |  \"dcd\" :         dcd format (additional pdb file for topolgy information required, see example)\n        |  \"pdb\" :         pdb format\n```\nThe user is responsible for the correct naming and numbering of residues and atoms\namong different ensembles trajectories (e.g. among different mutants)\n\n### Significant Feature Difference Visualization\n(Common) significant feature differences can be visualized with\nPyMOL and VMD scripts provided in \n`$PYSFDPATH/VisFeatDiffs`\n, where $PYSFDPATH, e.g., can be the path to your GitHub-downloaded (or already locally installed) PySFD directory.\nThese scripts are executed directly either within a PyMOL or VMD session, respectively,\nand read in the (common) significant feature difference tables.\nYou should copy `$PYSFDPATH/VisFeatDiffs` into your current working directory\n(see `PySFD/docs/PySFD_example`).\n\n#### PyMOL\n[PyMOLVisFeatDiffs.py]: contains the parent PyMOLVisFeatDiffs class\n\nEach of\n\n[PyMOLVisFeatDiffs_prf.py],\n\n[PyMOLVisFeatDiffs_spbsf.py], and\n\n[PyMOLVisFeatDiffs_srf.py]\n\ncontains all the feature-specific parameter values and an `_add_vis()` method that\nis executed by `PyMOLVisFeatDiffs.vis_feature_diffs`\n\nThese feature-specific python files are executed within PyMOL, e.g., via\n```sh\nrun $CURRENT_WORKDIR/VisFeatDiffs/PyMOL/PyMOLVisFeatDiffs_spbsf.py\n```\n(also see `VisFeatDiffs/PyMOL/readme.txt`).\n\nBefore visualizing coarse-grained significant differences,\nthe coresponding \"seg,res\"-\u003e\"rgn\" mappings have to be defined in \n`$CURRENT_WORKDIR/scripts/df_rgn_seg_res_bb.dat`\nsee\n`PySFD/docs/notes/how_to_define_rgn_to_seg_res_ranges.txt`\nfor help on how to create this file from \"df_rgn_seg_res_bb\" defined in PySFD\n\nCurrently, PyMOL visualizations for significant feature differences are implemented only for: \n- Single Residual Features (SRF)\n- Pairwise Residual Features (PRF)\n- sparse Pairwise Backbone/Sidechain Features (sPBSF)\n\nIn case you would like to visualize your PySFD results in PyMOL directly from a Python/iPython/Jupyter session, you can use the ```PySFD.view_feature_diffs()``` method (see docstring for further documentation).\n\n#### VMD\n[VMD_Vis.tcl] : main VMD Visualizer function `VMD_visualize_feature_diffs`\n\nEach of\n\n[VMD_Vis.prf.tcl],\n\n[VMD_Vis.spbsf.tcl], and\n\n[VMD_Vis.srf.tcl]\ncontains all the feature-specific parameter values and an `add_vis()` function that\nis executed by VMD_visualize_feature_diffs (contained in [VMD_Vis.tcl]).\n\nThese feature-specific tcl files are executed within VMD, e.g., via\n```tcl\nset VisFeatDiffsDir $CURRENT_WORKDIR/VisFeatDiffs\nsource $VisFeatDiffsDir/VMD/VMD_Vis.spbsf.tcl\n```\n(also see `VisFeatDiffs/VMD/readme.txt`)\n\nYou can \"cursor\" through the different simulated ensembles (and their significant feature differences) using the \"a\" and \"d\" keys.\n\nBefore visualizing coarse-grained significant differences,\nthe coresponding \"seg,res\"-\u003e\"rgn\" mappings have to be defined in \n`$CURRENT_WORKDIR/scripts/rgn2segres.tcl`\nsee `PySFD/docs/notes/how_to_define_rgn_to_seg_res_ranges.txt`\nfor help on how to create this file from `df_rgn_seg_res_bb` defined in PySFD\n\nCurrently, VMD visualizations for significant feature differences are implemented only for: \n- Single Residual Features (SRF)\n- Pairwise Residual Features (PRF)\n- sparse Pairwise Backbone/Sidechain Features (sPBSF)\n\n[srf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/srf.py\u003e\n[pff.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/pff.py\u003e\n[paf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/paf.py\u003e\n[prf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/prf.py\u003e\n[spbsf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/spbsf.py\u003e\n[pprf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/pprf.py\u003e\n[pspbsf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/features/pspbsf.py\u003e\n[VMD_Vis.tcl]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/VMD/VMD_Vis.tcl\u003e\n[VMD_Vis.prf.tcl]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/VMD/VMD_Vis.prf.tcl\u003e\n[VMD_Vis.spbsf.tcl]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/VMD/VMD_Vis.spbsf.tcl\u003e\n[VMD_Vis.srf.tcl]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/VMD/VMD_Vis.srf.tcl\u003e\n[PyMOLVisFeatDiffs.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/PyMOL/PyMOL_VisFeatDiffs.py\u003e\n[PyMOLVisFeatDiffs_prf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/PyMOL/PyMOL_VisFeatDiffs_prf.py\u003e\n[PyMOLVisFeatDiffs_spbsf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/PyMOL/PyMOL_VisFeatDiffs_spbsf.py\u003e\n[PyMOLVisFeatDiffs_srf.py]: \u003chttps://github.com/markovmodel/PySFD/blob/master/pysfd/VisFeatDiffs/PyMOL/PyMOL_VisFeatDiffs_srf.py\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkovmodel%2Fpysfd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkovmodel%2Fpysfd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkovmodel%2Fpysfd/lists"}