Analysis tools: Densf, FCF, analysis
************************************

Apart from the main computational programs mentioned above, Amsterdam
Modeling Suite offers a range of small utility tools that can be used
to obtain more specific results. These tools usually rely on the prior
run of one of the main programs and need the KF file produced by those
programs as a part of the input.

From the functional point of view these tools are very similar to ADF
or AMS. Their results are stored in KF files and their input files
follow the same structure of blocks, keys and values. Because of that
the same classes ("SCMJob" and "SCMResults") are used as bases and
hence preparation, running and results extraction for utility tools
follow the same rules as the AMS program.

The main difference is that usually utility jobs don't need molecular
coordinates as part of the input (they extract this information from
previous calculation's KF file). So no "Molecule" instance is needed
and the "molecule" attribute of the job object is simply ignored.
Because of that "get_molecule()" method does not work with
"FCFResults", "DensfResults" etc.

Below you can find the list of dedicated job classes that are
currently available. Details about input specification for those jobs
can be found in the corresponding part of the AMS suite documentation.

class FCFJob(inputjob1=None, inputjob2=None, name='plamsjob', settings=None, depend=None)

   A class representing calculation of Franck-Condon factors using
   "fcf" program.

   Two new attributes are introduced: "inputjob1" and "inputjob2".
   They are used to supply KF files from previous runs to "fcf"
   program. The value can either be a string with a path to KF file or
   an instance of any type of "SCMJob" or "SCMResults" (in this case
   the path to corresponding KF file will be extracted automatically).
   If the value of "inputjob1" or "inputjob2" is "None", no automatic
   handling occurs and user needs to manually supply paths to input
   jobs using proper keywords placed in "myjob.settings.input"
   ("STATES" or "STATE1" and "STATE2").

   The resulting "TAPE61" file is renamed to "jobname.t61".

   Parameters:
      * **inputjob1** (*str** | **SCMJob** | **SCMResults** | **None*)
        --

      * **inputjob2** (*str** | **SCMJob** | **SCMResults** | **None*)
        --

      * **kwargs** (*Any*) --

   __init__(inputjob1=None, inputjob2=None, **kwargs)

      Parameters:
         * **inputjob1** (*str** | **SCMJob** | **SCMResults** |
           **None*) --

         * **inputjob2** (*str** | **SCMJob** | **SCMResults** |
           **None*) --

         * **kwargs** (*Any*) --

   _serialize_mol()

      Process "Molecule" instance stored in "molecule" attribute and
      add it as relevant entries of "settings.input" branch. Abstract
      method.

      Return type:
         None

   _remove_mol()

      Remove from "settings.input" all entries added by
      "_serialize_mol()". Abstract method.

      Return type:
         None

class DensfJob(inputjob=None, name='plamsjob', settings=None, depend=None)

   A class representing calculation of molecular properties on a grid
   using "densf" program.

   A new attribute "inputjob" is introduced to supply KF file from
   previously run job. The value can either be a string with a path to
   KF file or an instance of any type of "SCMJob" or "SCMResults" (in
   this case the path to corresponding KF file will be extracted
   automatically). If the value of "inputjob" is "None", no automatic
   handling occurs and user needs to manually supply path to input job
   using "INPUTFILE" keyword placed in "myjob.settings.input".

   The resulting "TAPE41" file is renamed to "jobname.t41".

   Parameters:
      * **inputjob** (*str** | **SCMJob** | **SCMResults** | **None*)
        --

      * **kwargs** (*Any*) --

   __init__(inputjob=None, **kwargs)

      Parameters:
         * **inputjob** (*str** | **SCMJob** | **SCMResults** |
           **None*) --

         * **kwargs** (*Any*) --

   _serialize_mol()

      Process "Molecule" instance stored in "molecule" attribute and
      add it as relevant entries of "settings.input" branch. Abstract
      method.

      Return type:
         None

   _remove_mol()

      Remove from "settings.input" all entries added by
      "_serialize_mol()". Abstract method.

      Return type:
         None

   check()

      Check if "termination status" variable from "General" section of
      main KF file equals "NORMAL TERMINATION".

      Return type:
         bool

class AMSAnalysisJob(name='plamsjob', settings=None, depend=None)

   A class for analyzing molecular dynamics trajectories using the
   "analysis" program.

   Parameters:
      **kwargs** (*Any*) --

   __init__(**kwargs)

      Parameters:
         **kwargs** (*Any*) --

   _serialize_mol()

      Use the method from AMSJob to move the molecule to the settings
      object

      Return type:
         None

   _remove_mol()

      Remove the molecule from the system block again

      Return type:
         None

   static _atom_suffix(atom)

      Return the suffix of an atom.

      Parameters:
         **atom** (*Atom*) --

      Return type:
         str

   check()

      Check if "termination status" variable from "General" section of
      main KF file equals "NORMAL TERMINATION".

      Return type:
         bool
