Esempio n. 1
0
 def write_3d_pdf(self, filename, verbose=False, quiet=False, **kwargs):
     """
     Write interactive 3D pictures of the molecules to a pdf file, one per page.
     @param filename: File to write
     @param kwargs: Keywords to pass to JMolRenderer.write_3d_pdf
     """
     latex_out = path_join(self.tempdir, "output.tex")
     #----------------------------------------#
     pbar = ProgressBar(len(self.molecules))
     if not quiet:
         pbar.update(0)
     with open(latex_out, "w+") as f:
         f.write(pdf_3d_header)
         for mol in self.molecules:
             renderer = JmolRenderer(mol)
             if mol.description is not None:
                 f.write(
                     pdf_description_template.replace(
                         "@@@LABEL@@@", mol.description))
             renderer.write_3d_pdf(filename=None,
                                   verbose=verbose,
                                   latex_file_handler=f,
                                   **kwargs)
             if mol is not self.molecules[-1]:
                 f.write(r"\clearpage")
             if not quiet:
                 pbar += 1
         f.write(pdf_3d_footer)
     #----------------------------------------#
     pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"]
     with working_directory(self.tempdir):
         # Run 3 times to get references right
         JmolRenderer._safe_run(pdflatex_cmd_list,
                                "pdflatex",
                                require_empty_stderr=True,
                                require_zero_exit=False)
         if verbose: print("  ...run 1 complete")
         JmolRenderer._safe_run(pdflatex_cmd_list,
                                "output",
                                require_empty_stderr=True,
                                require_zero_exit=False)
         if verbose: print("  ...run 2 complete")
         JmolRenderer._safe_run(pdflatex_cmd_list,
                                "output",
                                require_empty_stderr=True,
                                require_zero_exit=False)
         if verbose: print("  ...run 3 complete")
     #----------------------------------------#
     move(path_join(self.tempdir, "output.pdf"), filename)
Esempio n. 2
0
 def write_3d_pdf(self, filename,
         verbose=False,
         quiet=False,
         **kwargs
 ):
     """
     Write interactive 3D pictures of the molecules to a pdf file, one per page.
     @param filename: File to write
     @param kwargs: Keywords to pass to JMolRenderer.write_3d_pdf
     """
     latex_out = path_join(self.tempdir, "output.tex")
     #----------------------------------------#
     pbar = ProgressBar(len(self.molecules))
     if not quiet:
         pbar.update(0)
     with open(latex_out, "w+") as f:
         f.write(pdf_3d_header)
         for mol in self.molecules:
             renderer = JmolRenderer(mol)
             if mol.description is not None:
                 f.write(pdf_description_template.replace("@@@LABEL@@@", mol.description))
             renderer.write_3d_pdf(
                 filename=None, verbose=verbose,
                 latex_file_handler=f,
                 **kwargs
             )
             if mol is not self.molecules[-1]:
                 f.write(r"\clearpage")
             if not quiet:
                 pbar += 1
         f.write(pdf_3d_footer)
     #----------------------------------------#
     pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"]
     with working_directory(self.tempdir):
         # Run 3 times to get references right
         JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex",
             require_empty_stderr=True, require_zero_exit=False)
         if verbose: print("  ...run 1 complete")
         JmolRenderer._safe_run(pdflatex_cmd_list, "output",
             require_empty_stderr=True, require_zero_exit=False)
         if verbose: print("  ...run 2 complete")
         JmolRenderer._safe_run(pdflatex_cmd_list, "output",
             require_empty_stderr=True, require_zero_exit=False)
         if verbose: print("  ...run 3 complete")
     #----------------------------------------#
     move(path_join(self.tempdir, "output.pdf"), filename)
Esempio n. 3
0
 def write_3d_pdf(self,
                  filename,
                  verbose=False,
                  extra_latex_before="",
                  extra_latex_after="",
                  latex_file_handler=None,
                  toolbar=False,
                  quiet=False,
                  **kwargs):
     self._ensure_tmp_xyz()
     #----------------------------------------#
     if not _have_meshlab:
         raise RuntimeError(
             "You need to have meshlab.app installed (currently it must be installed in /Applications/ to work...) to do make 3D pdfs.  Get it from Sourceforge"
         )
     #----------------------------------------#
     new_kw = JmolRenderer.default_keywords.copy()
     # 3d keywords are higher priority
     new_kw.update(JmolRenderer.default_3d_keywords)
     # user preferences always have veto power
     new_kw.update(kwargs)
     extra_lines = self._get_kwarg_script_lines(**new_kw)
     #----------------------------------------#
     if verbose: print("Generating idtf file with Jmol...")
     jscript = """
         load "{molfile}"
         {extra_lines}
         write "{tempdir}/output.idtf"
     """.format(molfile=self._geom_path,
                tempdir=self.tempdir,
                extra_lines=extra_lines)
     self._run_jmol_script(jscript)
     idtf_path = path_join(self.tempdir, "output.idtf")
     if not exists(idtf_path):
         raise RuntimeError("Jmol command failed to produce "
                            "file '{}'.  Script was:\n{}".format(
                                idtf_path, indent(jscript)))
     #----------------------------------------#
     # now convert to u3d format
     # TODO make this portable
     if verbose: print("Converting idtf file to u3d file...")
     idtf_cmd = _idtf_to_u3d_template.format(
         input=path_join(self.tempdir, "output.idtf"),
         output=path_join(self.tempdir, "output.u3d"))
     JmolRenderer._safe_run(shlex.split(idtf_cmd),
                            descr="IDTF to u3d conversion")
     #shlex.os.system(idtf_cmd)
     #----------------------------------------#
     # Now embed in a latex document and run PDFLatex
     if verbose:
         print("Constructing latex document...".format(
             pdflatex_path, self.tempdir))
     with open(path_join(self.tempdir, "output.idtf.tex")) as f:
         jmol_latex_data = f.read()
     stuff3d = jmol_latex_data.split("toolbar=false,")[1].split(
         "inline=true,")[0].strip()
     if latex_file_handler is None:
         f = open(path_join(self.tempdir, "output.tex"), "w+")
         run_pdflatex = True
     else:
         f = latex_file_handler
         run_pdflatex = False
     if run_pdflatex:
         f.write(pdf_3d_header)
     pdf3d_section = pdf_3d_entry_template\
         .replace("@@@LABEL@@@", "molecule")\
         .replace("@@@3DSTUFF@@@", stuff3d)\
         .replace("@@@FNAME@@@", path_join(self.tempdir, "output.u3d"))
     if toolbar:
         pdf3d_section = pdf3d_section.replace("toolbar=false",
                                               "toolbar=true")
     f.write(extra_latex_before)
     f.write(pdf3d_section)
     f.write(extra_latex_after)
     if run_pdflatex:
         f.write(pdf_3d_footer)
     #- - - - - - - - - - - - - - - - - - - - #
     if run_pdflatex:
         if verbose:
             print("Running '{} {} output' in directory {}...".format(
                 pdflatex_path, " ".join(pdflatex_args), self.tempdir))
         pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"]
         with working_directory(self.tempdir):
             # Run 3 times to get references right
             JmolRenderer._safe_run(pdflatex_cmd_list,
                                    "pdflatex",
                                    require_empty_stderr=True,
                                    require_zero_exit=False)
             if verbose: print("  ...run 1 complete")
             JmolRenderer._safe_run(pdflatex_cmd_list,
                                    "output",
                                    require_empty_stderr=True,
                                    require_zero_exit=False)
             if verbose: print("  ...run 2 complete")
             JmolRenderer._safe_run(pdflatex_cmd_list,
                                    "output",
                                    require_empty_stderr=True,
                                    require_zero_exit=False)
             if verbose: print("  ...run 3 complete")
         #----------------------------------------#
         # Finally, copy back the temporary output to the requested file path
         #   but only if we wrote the file
         move(path_join(self.tempdir, "output.pdf"), filename)
Esempio n. 4
0
 def write_3d_pdf(self, filename,
         verbose=False,
         extra_latex_before="",
         extra_latex_after="",
         latex_file_handler=None,
         toolbar=False,
         quiet=False,
         **kwargs
 ):
     self._ensure_tmp_xyz()
     #----------------------------------------#
     if not _have_meshlab:
         raise RuntimeError("You need to have meshlab.app installed (currently it must be installed in /Applications/ to work...) to do make 3D pdfs.  Get it from Sourceforge")
     #----------------------------------------#
     new_kw = JmolRenderer.default_keywords.copy()
     # 3d keywords are higher priority
     new_kw.update(JmolRenderer.default_3d_keywords)
     # user preferences always have veto power
     new_kw.update(kwargs)
     extra_lines = self._get_kwarg_script_lines(**new_kw)
     #----------------------------------------#
     if verbose: print("Generating idtf file with Jmol...")
     jscript = """
         load "{molfile}"
         {extra_lines}
         write "{tempdir}/output.idtf"
     """.format(
         molfile=self._geom_path,
         tempdir=self.tempdir,
         extra_lines=extra_lines
     )
     self._run_jmol_script(jscript)
     idtf_path = path_join(self.tempdir, "output.idtf")
     if not exists(idtf_path):
         raise RuntimeError("Jmol command failed to produce "
                            "file '{}'.  Script was:\n{}".format(
             idtf_path,
             indent(jscript)
         ))
     #----------------------------------------#
     # now convert to u3d format
     # TODO make this portable
     if verbose: print("Converting idtf file to u3d file...")
     idtf_cmd = _idtf_to_u3d_template.format(
         input=path_join(self.tempdir, "output.idtf"),
         output=path_join(self.tempdir, "output.u3d")
     )
     JmolRenderer._safe_run(shlex.split(idtf_cmd), descr="IDTF to u3d conversion")
     #shlex.os.system(idtf_cmd)
     #----------------------------------------#
     # Now embed in a latex document and run PDFLatex
     if verbose: print("Constructing latex document...".format(pdflatex_path, self.tempdir))
     with open(path_join(self.tempdir, "output.idtf.tex")) as f:
         jmol_latex_data = f.read()
     stuff3d = jmol_latex_data.split("toolbar=false,")[1].split("inline=true,")[0].strip()
     if latex_file_handler is None:
         f = open(path_join(self.tempdir, "output.tex"), "w+")
         run_pdflatex = True
     else:
         f = latex_file_handler
         run_pdflatex = False
     if run_pdflatex:
         f.write(pdf_3d_header)
     pdf3d_section = pdf_3d_entry_template\
         .replace("@@@LABEL@@@", "molecule")\
         .replace("@@@3DSTUFF@@@", stuff3d)\
         .replace("@@@FNAME@@@", path_join(self.tempdir, "output.u3d"))
     if toolbar:
         pdf3d_section = pdf3d_section.replace("toolbar=false", "toolbar=true")
     f.write(extra_latex_before)
     f.write(pdf3d_section)
     f.write(extra_latex_after)
     if run_pdflatex:
         f.write(pdf_3d_footer)
     #- - - - - - - - - - - - - - - - - - - - #
     if run_pdflatex:
         if verbose: print("Running '{} {} output' in directory {}...".format(pdflatex_path, " ".join(pdflatex_args), self.tempdir))
         pdflatex_cmd_list = [pdflatex_path] + pdflatex_args + ["output"]
         with working_directory(self.tempdir):
             # Run 3 times to get references right
             JmolRenderer._safe_run(pdflatex_cmd_list, "pdflatex",
                 require_empty_stderr=True, require_zero_exit=False)
             if verbose: print("  ...run 1 complete")
             JmolRenderer._safe_run(pdflatex_cmd_list, "output",
                 require_empty_stderr=True, require_zero_exit=False)
             if verbose: print("  ...run 2 complete")
             JmolRenderer._safe_run(pdflatex_cmd_list, "output",
                 require_empty_stderr=True, require_zero_exit=False)
             if verbose: print("  ...run 3 complete")
         #----------------------------------------#
         # Finally, copy back the temporary output to the requested file path
         #   but only if we wrote the file
         move(path_join(self.tempdir, "output.pdf"), filename)
Esempio n. 5
0
 def __input_check(self):
     with working_directory(self.directory):
         if not self.input_generator.generated:
             self.input_generator.generate(self.runner.input_file)