24小时热门版块排行榜    

查看: 654  |  回复: 2

zyj8119

木虫 (著名写手)

[交流] 【原创】MAPS中构筑超晶胞的python程序 已有2人参与

CODE:
#!/usr/bin/python
###########################################################################
#                   buildCluster.py  -  description
#                   -------------------------------
#   begin                : Fri Dec 15 16:11:04 CET 2006
#   copyright            : (C) 2006 by Scienomics
#   email                : Joerg-Ruediger.Hill@scienomics.com
###########################################################################
#
###########################################################################
#                                                                         #
#   This program and all subroutines,  data, and  files used by it are    #
#   protected by copyright and hence may not be used, copied, modified    #
#   transmitted, inspected, or executed by any means including the use    #
#   of electronic data processing equipment,  xerography, or any other    #
#   methods  without the express  written permission  of the copyright    #
#   holder.                                                               #
#                                                                         #
#   Copyright (C) 2006 Scienomics S. A.                                   #
#                                                                         #
###########################################################################
#
# $Id: buildCluster.py,v 1.10 2010/03/29 15:15:56 jrh Exp $
# $Log: buildCluster.py,v $
# Revision 1.10  2010/03/29 15:15:56  jrh
# Moved to new way of retrieving plugin objects
#
# Revision 1.9  2008/10/20 09:25:06  lperi
# Clear undo stack (bug 2562).
#
# Revision 1.8  2008/10/14 15:21:17  jrh
# Fixed bug 2520
#
# Revision 1.7  2008/01/16 12:21:18  jrh
# Moved to Qt4
#
# Revision 1.6  2007/01/16 10:28:26  jrh
# Removed automatic creation of cell since this might crash
#
# Revision 1.5  2006/12/15 16:07:31  jrh
# Added header and documentation
#
#

import Maps
import MapsChemistryDataModel
import MapsViewer
from PyQt4 import *

class ClusterBuilder:
  """ This class implements a cluster generating algorithm
      by cutting atoms from a periodic system based on a
      distance criterion. The class takes either the active
      molecule or asks the user to load a molecule if no
      active molecule is found, puts a molecule into a box
      at density 1.0 if the system is not periodic already,
      and builds a cluster by copying all atoms which are
      within 5 Ang from the central atom to a new model.
  """

  app=Maps.MapsApp.getContainer()
  cdm=MapsChemistryDataModel.ChemistryDataModel.get()
  viewerPlugin=MapsViewer.ViewerPlugin.get()
  project=None
  molecule=None

  def loadMolecule(self):
    activeViewer=self.viewerPlugin.getActiveViewer()
    if activeViewer != None:
      self.molecule=activeViewer.getMolecule()
      projectName=self.cdm.findProjectNameForMolecule(self.molecule)
      self.project=self.cdm.findProjectByName(projectName)
      QtGui.qApp.processEvents()
      return(0)
    else:
      QtGui.QMessageBox.information(self.app, "Note", "Please load a molecule from the\nfollowing dialog.")
      # Load a molecule from an existing file
      dialog=self.app.fileDialog
      dialog.setFileMode(QtGui.QFileDialog.ExistingFile)
      dialog.setWindowTitle("Open file")
      filters=QtCore.QStringList()
      filters.append("All files (*)")
      dialog.setFilters(filters)
      dialog.selectFile("")
      if dialog.exec_(Maps.FileDialog.DATA) == QtGui.QDialog.Accepted:
        fileName=str(dialog.selectedFiles()[0])
        self.app.openDocumentFile(fileName, None, "")
        projects=self.cdm.getProjects()
        self.project=projects[0]
        molecules=self.project.getMolecules()
        self.molecule=molecules[0]
        self.viewerPlugin.start(self.molecule)
        QtGui.qApp.processEvents()
        return(0)
      else:
        return(1)

  def createSuperCell(self):
    # Create a 3 x 3 x 3 super cell. If the system is not periodic tell
    # the user and exit
    if not self.molecule.isPeriodic():
      QtGui.QMessageBox.information(self.app, "Note", "Please use a periodic system with this script.")
      return(0);
    else:
      cell=self.molecule.getActiveConformation().getUnitcell()
    cell.setDuplicate(3, 3, 3, 1)
    cell.makeSuperCell(1)
    QtGui.qApp.processEvents()
    return(1)

  def cutCluster(self):
    # Cut a cluster by finding the atom closest to the center of the
    # super cell and including all atoms at a distance of up to
    # 5.0 Ang from this atom
    center=self.molecule.calculateCenterOfGravity(self.molecule.atoms)
    min=100.0
    centerAtom=None
    for atom in self.molecule.atoms:
      pos=atom.getCoordinates()
      diff=pos-center
      if diff.abs() < min:
        min=diff.abs()
        centerAtom=atom
    viewer=self.viewerPlugin.getActiveViewer()
    # Clear the undo stack to prevent a discontinuity
    # in the recorded editing actions which could
    # cause a crash
    viewer.clearUndoStack()
    viewer.setSelectionMode(MapsViewer.Viewer.DISTANCE, 5.0)
    viewer.selectAtoms(centerAtom, 1)
    viewer.copy()
    # Create a new model in the same project and paste the cluster
    # in there
    cluster=MapsChemistryDataModel.Molecule(self.cdm)
    cluster.setName("Cluster")
    self.project.addMolecule(cluster)
    self.viewerPlugin.start(cluster)
    clusterViewer=self.viewerPlugin.getActiveViewer()
    clusterViewer.paste()
    clusterViewer.centerMolecule()
    clusterViewer.getMoleculeRenderer().setSelection(cluster.atoms, 0)
    QtGui.qApp.processEvents()

  def run(self):
    if not self.loadMolecule():
      if self.createSuperCell():
        self.cutCluster()

#-------------------------
if __name__ == '__main__':
  builder=ClusterBuilder()
  builder.run()

回复此楼

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

好好学习,天天向上。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
送鲜花一朵
2楼2012-03-22 16:11:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

juwendy

铁虫 (正式写手)

顶一个,支持楼主。
3楼2012-03-22 21:09:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zyj8119 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见