       1 #!/bin/env python
       2 #
       3 # File: PyMOLConvertPMLToPSE.py
       4 # Author: Manish Sud <msud@san.rr.com>
       5 #
       6 # Copyright (C) 2018 Manish Sud. All rights reserved.
       7 #
       8 # The functionality available in this script is implemented using PyMOL, a
       9 # molecular visualization system on an open source foundation originally
      10 # developed by Warren DeLano.
      11 #
      12 # This file is part of MayaChemTools.
      13 #
      14 # MayaChemTools is free software; you can redistribute it and/or modify it under
      15 # the terms of the GNU Lesser General Public License as published by the Free
      16 # Software Foundation; either version 3 of the License, or (at your option) any
      17 # later version.
      18 #
      19 # MayaChemTools is distributed in the hope that it will be useful, but without
      20 # any warranty; without even the implied warranty of merchantability of fitness
      21 # for a particular purpose.  See the GNU Lesser General Public License for more
      22 # details.
      23 #
      24 # You should have received a copy of the GNU Lesser General Public License
      25 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
      26 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
      27 # Boston, MA, 02111-1307, USA.
      28 #
      29
      30 from __future__ import print_function
      31
      32 # Add local python path to the global path and import standard library modules...
      33 import os
      34 import sys;  sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), "..", "lib", "Python"))
      35 import time
      36 import re
      37
      38 # PyMOL imports...
      39 try:
      40     import pymol
      41     # Finish launching PyMOL in  a command line mode for batch processing (-c)
      42     # along with the following options:  disable loading of pymolrc and plugins (-k);
      43     # suppress start up messages (-q)
      44     pymol.finish_launching(['pymol', '-ckq'])
      45 except ImportError as ErrMsg:
      46     sys.stderr.write("\nFailed to import PyMOL module/package: %s\n" % ErrMsg)
      47     sys.stderr.write("Check/update your PyMOL environment and try again.\n\n")
      48     sys.exit(1)
      49
      50 # MayaChemTools imports...
      51 try:
      52     from docopt import docopt
      53     import MiscUtil
      54     import PyMOLUtil
      55 except ImportError as ErrMsg:
      56     sys.stderr.write("\nFailed to import MayaChemTools module/package: %s\n" % ErrMsg)
      57     sys.stderr.write("Check/update your MayaChemTools environment and try again.\n\n")
      58     sys.exit(1)
      59
      60 ScriptName = os.path.basename(sys.argv[0])
      61 Options = {}
      62 OptionsInfo = {}
      63
      64 def main():
      65     """Start execution of the script"""
      66
      67     MiscUtil.PrintInfo("\n%s (PyMOL v%s; %s) Starting...\n" % (ScriptName, pymol.cmd.get_version()[1], time.asctime()))
      68
      69     (WallClockTime, ProcessorTime) = MiscUtil.GetWallClockAndProcessorTime()
      70
      71     # Retrieve command line arguments and options...
      72     RetrieveOptions()
      73
      74     # Process and validate command line arguments and options...
      75     ProcessOptions()
      76
      77     # Perform actions required by the script...
      78     GeneratePSEFile()
      79
      80     MiscUtil.PrintInfo("\n%s: Done...\n" % ScriptName)
      81     MiscUtil.PrintInfo("Total time: %s" % MiscUtil.GetFormattedElapsedTime(WallClockTime, ProcessorTime))
      82
      83 def GeneratePSEFile():
      84     """Comvert PML file to PSE file."""
      85
      86     PMLFile = OptionsInfo["Infile"]
      87     PSEFile = OptionsInfo["Outfile"]
      88
      89     MiscUtil.PrintInfo("\nGenerating file %s..." % PSEFile)
      90
      91     PyMOLUtil.ConvertPMLFileToPSEFile(PMLFile, PSEFile, OutputFeedback = OptionsInfo["Feedback"])
      92
      93     if not os.path.exists(PSEFile):
      94         MiscUtil.PrintWarning("Failed to generate PSE file, %s..." % (PSEFile))
      95
      96 def ProcessOptions():
      97     """Process and validate command line arguments and options"""
      98
      99     MiscUtil.PrintInfo("Processing options...")
     100
     101     # Validate options...
     102     ValidateOptions()
     103
     104     OptionsInfo["Feedback"] = True if re.match("^Yes$", Options["--feedback"], re.I) else False
     105
     106     OptionsInfo["Infile"] = Options["--infile"]
     107     OptionsInfo["Outfile"] = Options["--outfile"]
     108
     109 def RetrieveOptions():
     110     """Retrieve command line arguments and options"""
     111
     112     # Get options...
     113     global Options
     114     Options = docopt(_docoptUsage_)
     115
     116     # Set current working directory to the specified directory...
     117     WorkingDir = Options["--workingdir"]
     118     if WorkingDir:
     119         os.chdir(WorkingDir)
     120
     121     # Handle examples option...
     122     if "--examples" in Options and Options["--examples"]:
     123         MiscUtil.PrintInfo(MiscUtil.GetExamplesTextFromDocOptText(_docoptUsage_))
     124         sys.exit(0)
     125
     126 def ValidateOptions():
     127     """Validate option values"""
     128
     129     MiscUtil.ValidateOptionTextValue("-f, --feedback", Options["--feedback"], "yes no")
     130
     131     MiscUtil.ValidateOptionFilePath("-i, --infile", Options["--infile"])
     132     MiscUtil.ValidateOptionFileExt("-i, --infile", Options["--infile"], "pml")
     133
     134     MiscUtil.ValidateOptionFileExt("-o, --outfile", Options["--outfile"], "pse")
     135     MiscUtil.ValidateOptionsOutputFileOverwrite("-o, --outfile", Options["--outfile"], "--overwrite", Options["--overwrite"])
     136     MiscUtil.ValidateOptionsDistinctFileNames("-i, --infile", Options["--infile"], "-o, --outfile", Options["--outfile"])
     137
     138 # Setup a usage string for docopt...
     139 _docoptUsage_ = """
     140 PyMOLConvertPMLToPSE.py - Convert PML to PSE
     141
     142 Usage:
     143     PyMOLConvertPMLToPSE.py [--feedback <yes or no>] [--overwrite]
     144                             [-w <dir>] -i <infile> -o <outfile>
     145     PyMOLConvertPMLToPSE.py -h | --help | -e | --examples
     146
     147 Description:
     148     Convert PyMOL script language (PML) file to PyMOL session (PSE) file.
     149
     150     The supported input and output file formats are PML (.pml) and PSE (.pse).
     151
     152 Options:
     153     -f, --feedback <yes or no>  [default: yes]
     154         PyMOL output feedback during loading of PML file. This option may not
     155         work in all versions of PyMOL across various platforms.
     156     -e, --examples
     157         Print examples.
     158     -h, --help
     159         Print this help message.
     160     -i, --infile <infile>
     161         Input file name.
     162     -o, --outfile <outfile>
     163         Output file name.
     164     --overwrite
     165         Overwrite existing files.
     166     -w, --workingdir <dir>
     167         Location of working directory which defaults to the current directory.
     168
     169 Examples:
     170     To convert a PML file to a PSE file, type:
     171
     172         % PyMOLConvertPMLToPSE.py -i Sample.pml -o Sample.pse
     173
     174     To convert a PML file to a PSE file along with turning off PyMOL feedback
     175     during loading of PML file, type:
     176
     177         % PyMOLConvertPMLToPSE.py -f no -i Sample.pml -o Sample.pse
     178
     179 Author:
     180     Manish Sud(msud@san.rr.com)
     181
     182 See also:
     183     PyMOLConvertLigandFileFormat.py, PyMOLSplitChainsAndLigands.py,
     184     PyMOLVisualizeMacromolecules.py
     185
     186 Copyright:
     187     Copyright (C) 2018 Manish Sud. All rights reserved.
     188
     189     The functionality available in this script is implemented using PyMOL, a
     190     molecular visualization system on an open source foundation originally
     191     developed by Warren DeLano.
     192
     193     This file is part of MayaChemTools.
     194
     195     MayaChemTools is free software; you can redistribute it and/or modify it under
     196     the terms of the GNU Lesser General Public License as published by the Free
     197     Software Foundation; either version 3 of the License, or (at your option) any
     198     later version.
     199
     200 """
     201
     202 if __name__ == "__main__":
     203     main()