Skip to content

FileRead

Xuetao Shi edited this page Apr 27, 2017 · 2 revisions

Read Gaussian trajectory log file based on regex patterns and then do proper processing.

  • Initialization: FileRead(n_atom=-1)
    The initialization of this object will attempt to determine the number of atoms in the molecule and set up a pattern dictionary, partially based on the number of atoms.

    • Parameters:
      • n_atom: integer
        optional, default=-1, which is a flag to signify this value was not directly passed in. This gives the number of atoms in the molecule for the Gaussian log files to read.
  • FileRead.pattern_dict =

      {
          "Electric Field": r"An electric field of +([\-+]*[.\d]+D*[\-+]*[\d]*) +([\-+]*[.\d]+D*[\-+]*[\d]*) +"
                            r"([\-+]*[.\d]+D*[\-+]*[\d]*)|Standard basis: .+(?:\n.+){1,2} basis functions,",
          "Electric Field Alt": r"Electric field = +([\-+]*[.\d]+D*[\-+]*[\d]*) +([\-+]*[.\d]+D*[\-+]*[\d]*) +"
                                r"([\-+]*[.\d]+D*[\-+]*[\d]*)|Standard basis: .+(?:\n.+){1,2} basis functions,",
          "Cartesian Coordinates #VarRow": r"Cartesian coordinates.+\n"
                                           + r".+ X= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                                             r" +Y= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                                             r" +Z= +([\-+]*[.\d]+D*[\-+]*[\d]*)\n" * self.n_atom,
          "Mass Weighted Velocity #VarRow": r"MW [cC]artesian velocity:.*\n"
                                            + r" I= +\d+ X= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                                              r" +Y= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                                              r" +Z= +([\-+]*[.\d]+D*[\-+]*[\d]*)\n" * self.n_atom,
          "Time": r"Time \(fs\) +([\-+]*[.\d]+D*[\-+]*[\d]*)",
          "Total Energy": r"ETot += +([\-+]*[.\d]+D*[\-+]*[\d]*)",
          "Kinetic Energy": r"EKin = +([\-+]*[.\d]+D*[\-+]*[\d]*);",
          "Potential Energy": r"EPot = +([\-+]*[.\d]+D*[\-+]*[\d]*);",
          "Total Angular Momentum": r"Jtot = +([\-+]*[.\d]+D*[\-+]*[\d]*) H-BAR",
          "Angular Momemtum Components": r"Angular momentum \(instantaneous\)\n +JX ="
                                         r" +([\-+]*[.\d]+D*[\-+]*[\d]*) +JY = +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                                         r" +JZ = +([\-+]*[.\d]+D*[\-+]*[\d]*)",
          "Mulliken Charges #VarRow": r"(?<=\n) Mulliken charges(?::| and spin densities:)(?! with)\n.+\n"
                                      + r" +\d+ +\S+ +([\-+]*[.\d]+)(?:\n| +[\-+]*[.\d]+\n)" * self.n_atom,
          "Dipole Moment": r" Dipole moment .+:\n +X= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
                           r" +Y= +([\-+]*[.\d]+D*[\-+]*[\d]*) +Z= +([\-+]*[.\d]+D*[\-+]*[\d]*)"
      }
    
    • There are three types of patterns:
      1. Fixed dimension:
        for example, "Time": r"Time (fs) +([-+][.\d]+D[-+][\d])" This means a 1-dimensional array will be read from every data block at each time step.
      2. Variable row number:
        for example, "Mulliken Charges #VarRow": r"(?<=\n) Mulliken charges(?::| and spin densities:)(?! with)\n.+\n"
        • r" +\d+ +\S+ +([-+][.\d]+)(?:\n| +[-+][.\d]+\n)" * self.n_atom This means a 2-dimensional array will be read from every data block at each time step. In order to preserve the shape of such array, the regex pattern is generated by a variable, self.n_atom, which is the number of atoms determined previously. "#VarRow" in the key of this dictionary entry signifies the follow-up method to treat such data type accordingly.
      3. Variable column number:
        similar to Variable row number type. Right now there is not any data type needed in this category, but the functionality is built in already.
    • So far the only variable in the above mentioned variable type patterns is the number of atoms, and can only be the number of atoms.
  • FileRead.findall(file_str, data_type)
    The method to extract the data from a log file.

    • Parameters:

      • file_str: string, python File object
        first argument. The raw string of a log file or the file handle of said file to be read from.
      • data_type: string
        second argument. The string of the key in the pattern_dict dictionary. An error will be raised if such entry was not added before using this method.
    • Returns: numpy array.

    • Example:
      Suppose all the Cartesian coordinates are to be extracted from a log file. The following lines will do the job:

        fh = open("trajectory.log", "r")
        reader = FileRead(file_str=fh)
        cts = reader.findall(fh, "Cartesian Coordinates #VarRow")
        fh.close()
      

      Array cts is now a multi-dimensional array containing such data. cts[points, n_atoms, xyz]

Clone this wiki locally