molecule.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 416 行

PHP
416
字号
<?php//// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.0 of the PHP license,       |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors: Jesus M. Castagnetto <jmcastagnetto@php.net>                |// +----------------------------------------------------------------------+//// $Id: Molecule.php,v 1.4 2003/05/13 01:18:17 jmcastagnetto Exp $//require_once "Science/Chemistry.php";require_once "Science/Chemistry/Atom.php";/** * Base class representing a Molecule * * @author  Jesus M. Castagnetto <jmcastagnetto@php.net> * @version 1.0 * @access  public * @package Science_Chemistry */class Science_Chemistry_Molecule {    /**     * Molecule name     *     * @var     string     * @access  public     */    var $name = "";    /**     * Number of atoms in the molecule     *      * @var     integer     * @access  public     * @see     initMolecule()     */    var $num_atoms = 0;    /**     * Array of atom objects in the molecule     *     * @var     array     * @access  private     * @see     initMolecule()     */    var $atoms = array();    /**     * Atom-Atom distance matrix     *     * @var     array     * @access  private     * @see     calcDistanceMatrix()     */    var $dist_matrix = array();    /**     * Atom-Atom connection (bond) table     *     * @var     array     * @access  private     * @see     calcConnectionTable()     */    var $conn_table = array();    /**     * Distance cutoff for bond estimation     *     * @var     float     * @access  private     * @see     setBondCutoff()     * @see     getBondCutoff()     * @see     calcConnectionTable()     */    var $BONDCUTOFF = 1.8;    /**     * Constructor for the class, requires a molecule name     * and an optional array of Science_Chemistry_Atom objects     *      * @param   string  $name     * @param   optional    array   $atoms     * @return  object  Science_Chemistry_Molecule     * @access  public     * @see     $name     * @see     initMolecule()     */    function Science_Chemistry_Molecule($name, $atoms="") {        if ($name)            $this->name = $name;        else            return null;        if ($atoms && is_array($atoms))            if (!$this->initMolecule($atoms))                return null;    }    /**     * Initializes the array of Science_Chemistry_Atom objects     *      * @param   array   $atoms     * @return  boolean     * @access  public     * @see     $num_atoms     * @see     $atoms     * @see     addAtom()     */    function initMolecule($atoms) {        if (is_array($atoms)) {            for ($i=0; $i=count($atoms); $i++) {                if (!$this->addAtom($atoms[$i]))                    return false;            }            return true;        } else {            return false;        }    }    /**     * Adds a Science_Chemistry_Atom object to the list of atoms in the molecule     *      * @param   object  Science_Chemistry_Atom   $atom     * @return  boolean     * @access  public     * @see     initMolecule()     */    function addAtom($atom) {        if (Science_Chemistry_Atom::isAtom($atom)) {            $this->atoms[] = $atom;            $this->num_atoms++;            // unset the distance matrix and             // connection table if they are not empty            // so next time either one is requested            // it gets calculated anew            if (!empty($this->dist_matrix))                $this->dist_matrix = array();            if (!empty($this->conn_table))                $this->conn_table = array();            return true;        } else {            return false;        }    }    /**     * Returns an array of Atom objects     *     * @return  array     * @access  public     * @see     $atoms     */    function getAtoms() {        return $this->atoms;    }    /**     * Checks if the object is an instance of Science_Chemistry_Molecule     *     * @param   object  Science_Chemistry_Molecule $obj     * @return  boolean     * @access  public     */    function isMolecule($obj) {        return  (is_object($obj) &&                  (strtolower(get_class($obj)) == strtolower("Science_Chemistry_Molecule") ||                  is_subclass_of($obj, strtolower("Science_Chemistry_Molecule")))                );    }    /**     * Returns a string representation of the molecule  as a XYZ-format file     * Alias of toXYZ()     *     * @return  string     * @access  public     * @see toXYZ()     */    function toString() {        return $this->toXYZ();    }    /**     * Returns a string representation of the molecule  as a XYZ-format file     *     * @return  string     * @access  public     * @see toString()     */    function toXYZ() {        if (!$this->atoms)            return false;        $out[] = $this->num_atoms;        $out[] = $this->name;        reset($this->atoms);        for ($i=0; $i<$this->num_atoms; $i++)            $out[] = $this->atoms[$i]->toString();        return implode("\n",$out)."\n";    }    /**     * Returns a CML representation of the molecule     * Accepts an optional id, and a flag to signal     * printing of the connection table     *     * @param   optional    string  $id     * @param   optional    boolean $connect     * @return  string     * @access  public     */    function toCML($title="molecule", $id="mol1", $connect=false) {        $out = " <molecule title=\"$title\" id=\"$id\">\n";        $out .= "  <string title=\"name\">".$this->name."</string>\n";        $out .= "  <list title=\"atoms\">\n";        for ($i=0; $i<$this->num_atoms; $i++)            $out .= $this->atoms[$i]->toCML($i+1);        $out .= "  </list>\n";        if ($connect) {            // calculate the connection table if needed            // and short-circuit if we cannot do that            if (empty($this->conn_table))                 if (!$this->calcConnectionTable()) {                    $out .= " </molecule>\n";                    return $out;                }            $out .= "  <list title=\"connections\">\n";            for ($i=0; $i < count($this->conn_table); $i++) {                $tmp = array();                foreach ($this->conn_table[$i] as $atomid=>$flag) {                    if ($flag)                        $tmp[] = $atomid + 1;                }                if (!empty($tmp)) {                    $out .= "   <list title=\"connect\" id=\"".($i + 1)."\">";                    $out .= implode(" ", $tmp)."</list>\n";                }            }            $out .= "  </list>\n";        }        $out .= " </molecule>\n";        return $out;    }        /**     * Sets the distance cutoff for bond determination     *     * @param   float   $cutoff     * @return  boolean     * @access  public     * @see     $BONDCUTOFF     * @see     getBondCutoff()     * @see     calcConnectionTable()     */    function setBondCutoff($cutoff) {        if ((float)$cutoff > 0.0) {            $this->BONDCUTOFF = (float)$cutoff;            return true;        } else {            return false;        }    }    /**     * Returns the bond cutoff uses to determine bonds     *      * @return  float     * @access  public     * @see     $BONDCUTOFF     * @see     setBondCutoff()     * @see     calcConnectionTable()     */    function getBondCutoff() {        return $this->BONDCUTOFF;    }    /**     * Calculates the atom-atom distance matrix in Angstroms     *     * @return  boolean     * @access  public     */    function calcDistanceMatrix() {        if (empty($this->atoms))            return false;        $this->dist_matrix = array();        for ($i=0; $i < $this->num_atoms; $i++)            for ($j=0; $j < $this->num_atoms; $j++) {                if ($i == $j) {                    $this->dist_matrix[$i][$j] = 0.0;                } elseif ($i < $j) {                    $this->dist_matrix[$i][$j] = $this->atoms[$i]->distance($this->atoms[$j]);                }            }        return true;    }    /**     * Prints the atom-atom distance matrix     *     * @return  string     * @access  public     */    function printDistanceMatrix() {        if (empty($this->dist_matrix))            if(!$this->calcDistanceMatrix())                return false;        $dmat = &$this->dist_matrix;        echo "# Atom-Atom Distance Matrix:\n";        for ($i=0; $i < $this->num_atoms; $i++)            echo "\t".($i+1);        for ($i=0; $i < $this->num_atoms; $i++) {            echo "\n".($i+1);            for ($j=0; $j < $this->num_atoms; $j++)                if (!isset($dmat[$i][$j])) {                    echo "\t";                } else {                    printf("\t%.4f",$dmat[$i][$j]);                }        }        echo "\n";        return true;    }    /**     * Returns the atom-atom distance matrix     *     * @return  array     * @access  public     */    function getDistanceMatrix() {        if (empty($this->dist_matrix))            if (!$this->calcDistanceMatrix())                return false;        return $this->dist_matrix;    }    /**     * Calculates the connection table for the molecule     *     * @return  boolean     * @access  public     */    function calcConnectionTable(){        if (empty($this->dist_matrix))            if (!$this->calcDistanceMatrix())                return false;        $dmat = &$this->dist_matrix;        for ($i=0; $i < $this->num_atoms; $i++)            for ($j=($i+1); $j < $this->num_atoms; $j++)                $this->conn_table[$i][$j] = ($dmat[$i][$j] <= $this->BONDCUTOFF);        return true;    }    /**     * Prints the molecule's connection table     *     * @return  boolean     * @access  public     */    function printConnectionTable() {        if (empty($this->conn_table))            if (!$this->calcConnectionTable())                return false;        printf("# Connection Table: (cutoff = %.4f Angstroms)\n", $this->BONDCUTOFF);        for ($i=0; $i < $this->num_atoms; $i++)            for ($j=($i+1); $j < $this->num_atoms; $j++)                if ($this->conn_table[$i][$j]) {                    echo $this->atoms[$i]->element.($i+1)."\t";                    echo $this->atoms[$j]->element.($j+1)."\n";                }        return true;    }    /**     * Returns an array of connected atoms and their bond distance     * e.g. array ( array ($atomobj1, $atomobj2, $distance ), ... )     *      * @return  array     * @access  public     */    function getConnectionTable() {        if (empty($this->conn_table))            if (!$this->calcConnectionTable())                return false;        $ct = 0; $ctable=array();        for ($i=0; $i < $this->num_atoms; $i++)            for ($j=($i+1); $j < $this->num_atoms; $j++)                if ($this->conn_table[$i][$j]) {                    $ctable[$ct] = array ($this->atoms[$i], $this->atoms[$j],                                    $this->dist_matrix[$i][$j]);                    $ct++;                }       return $ctable;     }} // end of class Science_Chemistry_Molecule// vim: expandtab: ts=4: sw=4?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?