GaussSum-3.0.2/0000777000175000017500000000000013222436700011742 5ustar noelnoelGaussSum-3.0.2/Docs/0000777000175000017500000000000013222437274012641 5ustar noelnoelGaussSum-3.0.2/Docs/ch01.html0000666000175000017500000000623213222437274014265 0ustar noelnoel Chapter 1. Installation

Chapter 1. Installation

Table of Contents

Installing an all-in-one bundle on Windows
Installing the GaussSum scripts on Windows
Installing on Linux

This chapter describes how to install and run GaussSum on computers running Windows or Linux. Note that there are two choices for installing in Windows. One is to install an all-in-one bundle of Python/Numpy/Matplotlib/cclib/GaussSum (the easier method), the other is to install the GaussSum sources and the required libraries separately.

Installing an all-in-one bundle on Windows

Download the quite large all-in-one bundle from here. Doubleclick on the .msi file to install it into something like C:\Program Files\GaussSum. A shortcut will be added to the Start Menu.

GaussSum-3.0.2/Docs/ch01s02.html0000666000175000017500000001266613222437274014622 0ustar noelnoel Installing the GaussSum scripts on Windows

Installing the GaussSum scripts on Windows

Install Python

GaussSum requires Python, which is a programming language commonly used for scripting.

Go to the Python install page. Download and run the Windows installer for a recent version of Python 3 (e.g. Python 3.6).

Install Numpy

GaussSum requires Numpy, which is a Python extension that allows efficient matrix algebra. You can install this with pip at the command-line: py -m pip install numpy

Install Matplotlib

In order to draw the graphs, GaussSum requires the Python package Matplotlib. You can install this with pip at the command-line: py -m pip install matplotlib

Install cclib

In order to extract information from comp chem log files, the Python package cclib is need. You can install this with pip at the command-line: py -m pip install cclib

Install the GaussSum Python scripts

The scripts can be found here. Extract the zip file into something like C:\Program Files\GaussSum.

Create a shortcut on your desktop to GaussSum.py (to do this, right-click on an empty part of the desktop, choose New -> Shortcut, browse to the folder where you installed GaussSum and choose GaussSum.py). To change the icon, right-click on the icon, choose Properties -> General -> Change Icon -> Browse. Find the folder where you installed GaussSum and choose GaussSum.ico. In addition, change the program used to open GaussSum by following these instructions: right-click on the icon, choose Properties -> General -> Opens with -> Change -> PythonW. If you want to set a startup folder, right-click on the icon, choose Properties -> Shortcut -> Start in:, and type the name of the startup folder.

If you have any questions or requests, or if you wish to be added to the mailing list for information on new versions and bug fixes, please send an email to gausssum-help@lists.sourceforge.net.

Start GaussSum

Just double-click the shortcut to GaussSum.py to start GaussSum.

GaussSum-3.0.2/Docs/ch01s03.html0000666000175000017500000001534413222437274014617 0ustar noelnoel Installing on Linux

Installing on Linux

Install Gnuplot

Check to see if you already have Gnuplot, by typing 'which gnuplot' in a shell window. If Gnuplot is installed, you need to make sure that it is version 4.0 or newer ('gnuplot --version').

If you need to install Gnuplot, rpms are available from rpmfind.net and gzipped tar files from SourceForge. If you are using Debian Linux, Gnuplot will be downloaded and installed if you issue the following command as root: 'apt-get install gnuplot'.

Install Python

Check to see if you already have Python, by typing 'which python3' in a shell window.

If you have Python, type 'python3'. The version number should be displayed. If this is less than 3.1, the scripts may not work with your currently installed Python version. (Press 'CTRL+D, ENTER' to exit.)

If you need to install Python, follow the appropriate instructions for your system at www.python.org. You should install the latest version of Python 3.3 (although Python 3.1 and 3.2 also work fine with GaussSum). If you are using Debian Linux, Python will be downloaded and installed if you issue the following command as root: 'apt-get install python3 python3-tk'.

Install Numpy

Numpy is an extension to Python that allows efficient matrix manipulation. You should try to find a binary package for your system rather than compiling it yourself (check your package management system). If you are using Debian Linux, Numpy will be downloaded and installed if you issue the following command as root: 'apt-get install python3-numpy'.

Install Matplotlib

Matplotlib is a Python package for drawing graphs. It should be available through your package manager. You should install the version for Python3. If it is not available, you should download and build it from source. Instructions are available from the Matplotlib website.

Install cclib

cclib is a Python package for extracting information from comp chem output files. You should install the latest version. This is most easily done with pip. You should use the Python3 version of pip which may be available through your package manager. Once installed, it can be used as follows: pip install cclib --upgrade

Download GaussSum

Download a gzipped tar of GaussSum here. This should be untarred into a folder in the usual way, using 'tar zxvf GaussSum-3.0.2.tar.gz'.

If you wish to be added to the mailing list for information on new versions and bug fixes, please send an email to gausssum-help@lists.sourceforge.net.

Start GaussSum

To run GaussSum, change directory to the GaussSum directory and type 'python GaussSum.py'. You can also pass a filename as an argument: for example, 'python GaussSum.py myoutputfile.out'.

GaussSum-3.0.2/Docs/ch02.html0000666000175000017500000000515713222437274014273 0ustar noelnoel Chapter 2. How do I find all lines with a certain phrase?

Chapter 2. How do I find all lines with a certain phrase?

Open the file you wish to search and choose Find from the list of operations on the left.

Either choose one of the default search terms or choose Custom. If you choose Custom, enter a search term into the box. Note: you can change the default search terms using the Settings dialog box.

Click on the GaussSum logo to start the script.

If you wish to find all lines containing either TERM_A or TERM_B, then use the following notation, TERM_A%TERM_B, for the search term. Any number of terms may be combined in this way.

GaussSum-3.0.2/Docs/ch03.html0000666000175000017500000000723713222437274014275 0ustar noelnoel Chapter 3. How do I follow the progress of an SCF convergence?

Chapter 3. How do I follow the progress of an SCF convergence?

For Gaussian to print SCF convergence information, it is necessary to specify additional print, by using #P in the route section.

Using GaussSum, open the file you want to examine. Usually this will be the output file of a job which is currently running.

Choose Monitor SCF and click on the GaussSum logo to run the script. A graph will be plotted of the progress of the SCF convergence versus step number. Details of the SCF cycles are written to the screen. Where there is information on several SCF convergence cycles in a log file (e.g. in the case of a geometry optimisation), GaussSum plots the one closest to the end of the file.

The progress of the SCF convergence is calculated by considering the convergence criteria. For example, for Gaussian, these criteria are the RMS density, MAX density and change in energy. Each of the current values is divided by the target values. The log is taken of any results greater than 1. The 'progress value' is then calculated by summing the logs. Note that convergence is achieved when the progress value equals 0.

You may wish to leave out the initial points, so as to focus on the last few points. You can do this by entering a non-zero value into the box labeled "Leave out the first n points", and re-running the script.

Note that, at the moment, this procedure does not work for SCF=QC (Gaussian).

GaussSum-3.0.2/Docs/ch04.html0000666000175000017500000000605013222437274014266 0ustar noelnoel Chapter 4. How do I follow the progress of a geometry optimisation?

Chapter 4. How do I follow the progress of a geometry optimisation?

Using GaussSum open the file you want to examine. Usually this will be the output file of a job which is currently running.

Choose Monitor GeoOpt and click on the GaussSum logo to run the script.

Two graphs will be plotted. The first is of energy vs optimisation step. The second is the deviation from the targets vs optimisation step.

The deviation is found by considering the convergence criteria. Each of the current values is divided by the target values. The log is taken of any results greater than 1. The deviation is then calculated by summing the logs. Note that convergence is achieved when the progress value equals 0.

You may wish to leave out the initial points, so as to focus on the last few points. You can do this by entering a non-zero value into the box labeled "Leave out the first n points", and re-running the script.

GaussSum-3.0.2/Docs/ch05.html0000666000175000017500000001267213222437274014276 0ustar noelnoel Chapter 5. How do I get the IR or Raman spectrum of a molecule?

Chapter 5. How do I get the IR or Raman spectrum of a molecule?

(Gaussian,GAMESS)

Next, open a log file containing the results of a freq calculation. It isn't necessary to specify whether you wish to calculate the IR or the Raman spectrum - the IR spectrum will always be calculated, and if you ran a freq=raman job, then the Raman activity and Raman intensity spectra will be calculated.

Choose Frequencies from the list of operations on the left.

Parameters for Frequencies

Start, End

The spectra will be calculated for wavelengths between Start and End. The units of Start and End are cm-1.

Num pts

This parameter determines the number of points in the calculated spectra.

FWHM

The Full Width at Half Maximum of each peak.

Scaling factor

You can choose either a general or individual scaling factor (see below).The calculated frequencies are multiplied by the scaling factor. The scaled frequencies are then used to generate the spectra.

Exc. wavelength (nm)

(Only available for Raman) The value of the excitation wavelength is used to calculate the Raman intensities from the Raman activity (see below) using the equation described by Krishnakumar et al. (J. Mol. Struct., 2004, 702, 9) and Keresztury et al. (Spectrochimica Acta, 1993, 49A, 2007).

Temp. (K)

(Only available for Raman) This value determines the temperature used in the Raman intensity equation (see above).

Click on the GaussSum icon to run the script.

The spectra are convoluted with Lorentzian curves and then plotted with Gnuplot.

Information on the each spectrum and on the normal modes are written to gausssum3.0/IRSpectrum.txt and gausssum3.0/RamanSpectrum.txt.

The first few lines of an example IRSpectrum.txt are shown below. Tabs are used to separate each column of information. This allows easy import into spreadsheet software (e.g. Excel), just by right-clicking on the file and choosing "Open with".

Spectrum			Normal Modes
Freq (cm-1)	IR act		Mode	Label	Freq (cm-1)	IR act	Scaling factors	Unscaled freq
8	0.000612391353264		1	A	466.3941	0.0	1.0	466.3941
16	0.000624493504806		2	A	466.3945	0.0	1.0	466.3945
24	0.000636968752613		3	A	698.2427	0.0	1.0	698.2427
32	0.000649832766662		4	A	698.2429	0.0	1.0	698.2429
		

If you want to use individual scaling factors, you should open a previously created IRSpectrum.txt or RamanSpectrum.txt and edit the column titled 'Scaling Factors'. You can do this in (for example) Excel, and then save as 'Tab Delimited'. Run the Frequencies option again but choose individual scaling factors this time. The new IRSpectrum.txt or RamanSpectrum.txt will contain the scaled frequencies.

GaussSum-3.0.2/Docs/ch06.html0000666000175000017500000001150713222437274014273 0ustar noelnoel Chapter 6. How do I extract molecular orbital information?

Chapter 6. How do I extract molecular orbital information?

Table of Contents

How to extract basic information (DOS)
How to find the % contribution of a group to each molecular orbital (PDOS)
How to find the nature of the overlap between different groups of atoms (COOP)

This chapter has been divided into three sections. The first section describes how to extract information on the eigenvalues and symmetries of the molecular orbitals. The second section describes how to extract information on the contributions of groups of atoms to each of the molecular orbitals. The third section describes how to extract information on the nature of the overlap between different groups of atoms.

How to extract basic information (DOS)

Open the log file containing the relevant information and choose Orbitals from the list of operations on the left. Pick the DOS option.

The boxes labeled "Start" and "End" are the start and end points (in eV) of the density of states spectrum. The box labeled "FWHM" is the full width at half-maximum (in eV) of the gaussian curves used to convolute the DOS and COOP spectra.

Click on the GaussSum logo to start the script. The molecular orbital information is written to gausssum3.0/orbital_data.txt.

The density of states (DOS) spectrum is convoluted using Gaussian curves of unit height and the specified full width at half-maximum. Gnuplot is then used to plot the spectrum. The details are written to gausssum3.0/DOS_spectrum.txt.

If you tick the box labelled "Create originorbs.txt?", a file gausssum3.0/orginorbs.txt will be created which can be used to plot the orbital energies as a series of bars, one above the other, using a program such as Origin (Windows) or Grace (Linux). See the worked example on the GaussSum web site for more information.

Unrestricted calculations are supported for Gaussian. The same files are created but with the data broken down into sections for alpha and beta electrons. The DOS spectrum plotted is also different, containing an alpha DOS, a beta DOS and a (scaled) total DOS. If you ticked the box to create originorbs.txt, the beta eigenvalues are listed after all of the alpha eigenvalues.

GaussSum-3.0.2/Docs/ch06s02.html0000666000175000017500000001503113222437274014614 0ustar noelnoel How to find the % contribution of a group to each molecular orbital (PDOS)

How to find the % contribution of a group to each molecular orbital (PDOS)

In order to define the atoms which comprise a group, a file, gausssum3.0/Groups.txt, should be created with a format similar to the following:

atoms
Ru
1
bpy1
2-11,14,17,22,27,34-35,42-43,50,57
bpy2
12,16,18-19,25-26,28-30,39-41,44-46,54-56,58,61
bpy3
13,15,20-21,23-24,31-33,36-38,47-49,51-53,59-60
			

The first line needs to be either "atoms", "orbitals", "allatoms" or "allorbitals". If it is "allatoms" or "allorbitals", then no further input is required and a separate group will be made for each atom or each orbital. Otherwise, as in the example above, you need to describe which atoms or which orbitals are in each group. The numbers correspond to the order of the atoms/orbitals in the output file. An easy way to obtain these for Gaussian calculations is to open the output file in GaussView and turn on the labels. Groups.txt needs to obey the following rules:

A single point calculation should be done with the following keywords: (Gaussian) pop=full iop(3/33=1,3/36=-1), (GAMESS) NPRINT=3. This creates a large log file containing information on the overlap matrix among other things. (Note: the 3/36=-1 option for Gaussian prevents the calculation and printing of the multipole matrices; this is purely to keep the output file size as small as possible. In some cases, for example SCRF calculations, the multipole matrices must be calculated - if so, leave out the 3/36=-1. It will not affect the calculation of the PDOS.)

Using GaussSum open the log file and choose Orbitals. Pick the DOS option. See the previous section for information on the options.

Click on the GaussSum logo. GaussSum calculates the percent contributions of each of the groups to each of the molecular orbitals. This may take a few minutes.

Afterwards, the partial density of states spectra (PDOS) are plotted. Note that each one is stacked on top of the previous one, which means that the line at the greatest height is equal to the sum of all of the partial density of states, and hence equal to the total density of states spectrum. The stacking order is undefined. Information on the spectra is written to gausssum3.0/DOS_spectrum.txt which can be used to plot your own graphs.

Information on the molecular orbitals and the percent contributions of the groups is written to gausssum3.0/orbital_data.txt. The last few columns of orbital_data.txt contain more accurate values for the percent contributions and are used by the Electronic transitions operation. You should not edit this file if you wish to use the information in it to calculate the changes in charge density associated with electronic transitions, as described in Chapter 7, How do I get the UV-Vis or circular dichroism spectrum of a molecule?.

Note that the percent contributions are calculated based on Mulliken Population Analysis (MPA). MPA has some well-known deficiencies which can lead to unphysical values such as negative percentage contributions. If this happens for an orbital in which you are interested, remember that the exact figures are less important than the trend across a group of compounds.

Creation of PDOS spectra is also supported for unrestricted calculations with Gaussian. The spectrum plotted is of the total DOS broken down by the contribution of each of the groups. orbital_data.txt contains information on the breakdown of the alpha and beta electrons by group.

GaussSum-3.0.2/Docs/ch06s03.html0000666000175000017500000000742313222437274014623 0ustar noelnoel How to find the nature of the overlap between different groups of atoms (COOP)

How to find the nature of the overlap between different groups of atoms (COOP)

Crystal Orbital Overlap Population (COOP) diagrams were first developed by Huckel. They are especially used in the area of extended solids. They are equivalent to a multiplication of the DOS spectrum and the overlap population (positive or negative) between two groups. In this way, the bond between two groups can be described as bonding or antibonding with respect to each of the molecular orbitals.

Exactly the same information as for creating a PDOS diagram is needed for creating a COOP diagram. That is, you need a log file which is the result of a single-point calculation containing the same keywords as described in "How to find the % contribution of a group to each molecular orbital". You also need a file Groups.txt describing the groups of interest in the molecule (see "How to find the % contribution of a group to each molecular orbital"). The rules for Groups.txt are not as strict in this case: no atom can be listed twice, but not every atom needs to be listed.

Choose COOP after picking Orbitals. The options for creating a COOP diagram are the same as for creating a DOS or PDOS diagram.

Click on the GaussSum logo to calculate the COOP. Information on the overlap is written to gausssum3.0/COOP_data.txt and gausssum3.0/COOP_spectrum.txt.

GaussSum-3.0.2/Docs/ch07.html0000666000175000017500000001101113222437274014262 0ustar noelnoel Chapter 7. How do I get the UV-Vis or circular dichroism spectrum of a molecule?

Chapter 7. How do I get the UV-Vis or circular dichroism spectrum of a molecule?

Table of Contents

The UV-visible spectrum
The circular dichroism spectrum
The electron density difference map (EDDM) [Gaussian only]

The UV-visible spectrum

Open a log file that is the result of a TD-DFT calculation. For best results, a Gaussian TD-DFT calculation should include the following keyword "IOP(9/40=2)".

Choose the Electronic transitions from the list of operations on the left.

Choose the start and end (in nm) of the convoluted spectrum, as well as the number of points you wish to have in the calculated spectrum. FWHM refers to the full width at half-maximum of the gaussian curves used to convolute the spectrum. FWHM should be entered in cm-1.

After you have set the various parameters, click on the GaussSum logo to run convolute the spectrum.

The details are written to gausssum3.0/UVSpectrum.txt and gausssum3.0/UVData.txt. The file UVData.txt contains information on the contribution of singly-excited configurations to each electronic transition.

If there is a file in the gausssum3.0 directory called orbital_data.txt containing information on the percent contributions of various groups (e.g. ligands and metal centers) to the various molecular orbitals, GaussSum will use that data. It will calculate, for each transition, the change in charge density on each group. This information will be added to gausssum3.0/UVData.txt. (For more information, please see "How to find the % contribution of a group to each molecular orbital".)

For information on the formula used to convolute the UV-Vis spectrum, please see this pdf.

GaussSum-3.0.2/Docs/ch07s02.html0000666000175000017500000000620113222437274014614 0ustar noelnoel The circular dichroism spectrum

The circular dichroism spectrum

Open a log file that is the result of a TD-DFT calculation. For best results, a Gaussian TD-DFT calculation should include the following keyword "IOP(9/40=2)".

From the list of operations on the left, choose Electronic transitions.

Choose the start and end (in nm) of the convoluted spectrum, as well as the number of points you wish to have in the calculated spectrum. Sigma refers to the width of the band at 1/e height for the gaussian curves used to convolute the spectrum. The units for sigma are eV. (The equation used is Equation 8 from Stephens and Harada, Chirality, 2010, 22, 229-233. Delta in that equation is Sigma/2.)

After you have set the various parameters, click on the GaussSum logo to convolute the spectrum. The details are written to gausssum3.0/CDSpectrum.txt.

GaussSum-3.0.2/Docs/ch07s03.html0000666000175000017500000000664413222437274014630 0ustar noelnoel The electron density difference map (EDDM) [Gaussian only]

The electron density difference map (EDDM) [Gaussian only]

An EDDM is a representation of the changes in electron density that occur for a given electronic transition. It is calculated using the information on the single-excited configurations that contribute to each transition. The relative contribution is based on the square of the configuration's coefficient. Note that for some programs (e.g. Gaussian) these squares are not guaranteed to sum to 1.0 and so should not be regarded as scientifically accurate. However, they should be sufficient for the purposes of generating a diagram.

After you have plotted the UV-Vis or circular dichroism spectrum, copy a checkpoint file (or formatted checkpoint file) into the gausssum3.0 directory. Then select "Electronic transitions" and choose the "Create EDDM script?" option. Click on the GaussSum logo to convolute the spectrum and generate gausssum3.0/eddm.bat (gausssum3.0/eddm.sh on Linux).

Next you need to set the environment variable G03DIR to the directory containing the Gaussian binaries. To generate the EDDM, at a command prompt run "eddm.bat N", where N is the transition number (starting from 1 for the lowest energy transition).

GaussSum-3.0.2/Docs/ch08.html0000666000175000017500000000707413222437274014301 0ustar noelnoel Chapter 8. How can I automate spectra generation for multiple files? [Advanced]

Chapter 8. How can I automate spectra generation for multiple files? [Advanced]

Table of Contents

Generate UV-Vis spectra for multiple files

If you have a large number of log files, you may find it slow to use GaussSum to generate spectra for each file one-by-one. In order to speed things up, it is possible to write a Python script to automate this process. The following sections give example Python scripts that you could use. You should try to understand these before adapting them for your own purposes.

Generate UV-Vis spectra for multiple files

This example script generates a UV-Vis spectrum for each ".out" file in the current directory. Before running, you should set the PYTHONPATH to the directory containing GaussSum.py and make sure that there is no existing GaussSum output folder present.

import os
import sys
import glob
import logging

from gausssum.electrontrans import ET
from gausssum.cclib.parser import ccopen

ver = "3.0"
def gaussdir(filename):
    return os.path.join(os.path.dirname(filename), "gausssum%s" % ver)

if __name__ == "__main__":
    start, end = 200, 500
    numpts, fwhm = 500, 3000

    filenames = glob.glob("*.out")
    for filename in filenames:
        log = ccopen(filename)
        log.logger.setLevel(logging.ERROR)
        data = log.parse(filename)

        ET(None, sys.stdout, data, filename, start, end, numpts, fwhm, True,
           False)
        os.rename(gaussdir(filename), filename.split(".")[0] +"_gs")
    
GaussSum-3.0.2/Docs/index.html0000666000175000017500000001017613222437274014643 0ustar noelnoel GaussSum Version 3.0

GaussSum Version 3.0


Table of Contents

Introduction
Citation
Acknowledgments
1. Installation
Installing an all-in-one bundle on Windows
Installing the GaussSum scripts on Windows
Installing on Linux
2. How do I find all lines with a certain phrase?
3. How do I follow the progress of an SCF convergence?
4. How do I follow the progress of a geometry optimisation?
5. How do I get the IR or Raman spectrum of a molecule?
6. How do I extract molecular orbital information?
How to extract basic information (DOS)
How to find the % contribution of a group to each molecular orbital (PDOS)
How to find the nature of the overlap between different groups of atoms (COOP)
7. How do I get the UV-Vis or circular dichroism spectrum of a molecule?
The UV-visible spectrum
The circular dichroism spectrum
The electron density difference map (EDDM) [Gaussian only]
8. How can I automate spectra generation for multiple files? [Advanced]
Generate UV-Vis spectra for multiple files
GaussSum-3.0.2/Docs/mesh.gif0000666000175000017500000010427413222437274014274 0ustar noelnoelGIF89a@      .' !%" */+#-&?",%%)*5( 6381176<9F42<9%?77a4S8 CACA G>>KEJH RINKYH QG7OFGKNMP jJ PRTQYPtI aO[QULMRT}H SUaNLXY ]XaW\[yR Z[iX sU mW eZQ_UTMOS_[__^^__ VLJl`Wdc}] icv` [pc V^j^^c``ig kijd;_ ]{gnlf qnj d {mwo g `so ps i/\uq5h?q uo[twxpL}tt o zwh {nmspqyzw yz tvsu q ~}y }vs xv ~ ||~v|r1tOM%m   LEYTΜR2˗0PMgncg0D%H;~@AMϞaժ pj]٪n CIG]Ygbߨ ޺Tq 8.,>[~IgllHz$Z\MW 3TY_GFB7B >h2*qJˆne3e0WvjW-[L^a{_}L~0eQ7 -Rp!R>5HE4n"G0j iMJu&!I\KAW+KzQ`abI]L%CFV`eO~`umBFh ٕ*ɄFHBiDbl 4uJ+DmWe*| u3`cON LyS]6PXvŧi$ꧥ^\dz rޢg2l6&k)Agi MAhnhpt[mz_/}pcUZQcl{mGVineںcbU_īW*`LAVnGM-M)WIk  c"ݺGضd#) iƨcUbg̒p3}nJK[XN^)e}AMbSeJȵIimL$i4,CRR}rv+w(2E-J5% 0xsϥl%^TG4cAS+i0<+T\^3@MVCВC0ɶZQH~xl=T˽ OOG+QX0}p:={slBƔ"_z|iKͺc0|VObcE"b0RT$oxظ~me0fK+'@/}1Fᬗ=_h g3x ISYQr 3l4)^a!LVct^ UͰ@"mBLH @(0*Y sKuY`r88Q⼄ 1$`L)@ 2HDq/DJCf`d9E-+,YYט5 @@/&OH _ @@$H}#է. IM\I# I"蔧7ApU$7[h RzIR.1 fUb,V` K2k#(/"CgN EWd*C0 (e}̤[: E0sv_xH-IєJQsv PET/!, vCgj:$/I\*ǝLb}|k,{x]V) @Lmk;ynNt-._Ș=pYȘ7б.t? ;Ϸ"Oҗ?c{~Fӛ.u*|զu15p,K]wk@O0|(Z9[P+һ.O \`9Dlw}˦7P>o~Wu] @ uV%gO{kOUIJ1aD8icAb0q`5˻Z(@uxZ0F`Z`;F`CP[hhd𬅠ط[4p;H ݈]q{5 꺖l),YZx@`Qs kkۑp&)/ưN{G}Z{`;X`R hM j[ <\Yd`id@}'{$P{4G;ՈG&> +C2;ET\[: m q+@v._uUay9c+@t80ɓl|Z [nؚBL߻C0Năŗ;ż,ZI˕ 3K[td[I!B ݂{;52yL^!HPKɏ l@EpEjh |^n [j}d+3`{$T9˽x Sq:lllH 2W(z' |LBh =+@;$\69mP Am\p `n|ʪ JٗR0˵|$5{؈-$躴&m5O8ܹfU[ǡ:`1!DA` \N~0K Tm@ip6P ii@9\ɘ j @ ޝЙR+}z[,P =kG̗kHaߒS `];b+tl۷ULOLpl+Q-P.~i00}xBpiɜݭ 4Ȭiz k޳Qk z^~=̞d;`^81\Q 4U;A mcH,.WKJ͖y&+Pa128~}g`Q`pqP   @ `jX |ͺˊ] 4{ZZB Sl]HaPzd[tWIJ!vޡz^y_[qv/@*M.055(ꙮ2g0W=papBpx P ǀw{v=٬: [< Fy@mnbq z)YM>or6B JgNXo.J)th D „ٻҞG q3 ֦M>Dh,S̘2Fq]*&|CGTCT)tM:͖U^Ś* d~5!Ld ͆B31Ɛ =#Lћ٤~ih徣j.8l_;@oǙrA3cP !(F.g+: fdrq4tH(XYy-AXx'7GcA [ɛ<z!V7|nPDt|kG)(/"sߤ~/0= "(h\q W8 >0b "aBN׆*^1R)y:fB<E`r1D ֐ qB,eE=rALT|lXf刄,"Dib<8X<vӝ !Un`A!sعZ-D.ɦp4$4n(Pp? )8<JP,` .qJ q2&[04.rƌ\СE c.ѹ4f-M$pA`p-졜T#Q  ^VU#d ,=r\1:5%Bu01U"`OBʑ୥(F%{ VFA/=X_׸+FbXT9s2(`Oh 6 pD$›\젅 NDnӸEn;%HF8K֮ujh U Zկ ^PWO$_ {Vڃ 0g"?N i!rz9I3F1NʖWx7цVU3PGr},7w#A%ϐqe/]-Ut0Wz7!x)ޛ! =ޛU K0')@?, `c\LK 68Fq-kX "̀.d!Tq$("1"YbO?I?Zϵ"P!x"\$pt[U4 (g<33Xx!sU1vZ|ȃtQ#[ ,])<"EFoP>C8z!T>Uz#+\p;hˢ\0 _âĐ-!e29e# FA38 )ZɭBPh+( D.vs,*Ê1]h4ĭ(XY@91>}A$[2s!T@#$C2) ف((`0r13dF9!8eblj2ܟ#еs{6(#`P. @}P1cXD>,CshFtĂˊ9 ʓL<;UrT>uv2HBTL0]dX<ϊ)a3\4 e;y?mj sF5&шChPHa4qYKI]xG?Azè8D2*uɲ XE5W"Đ)NI1ʳ9.4iR3L?R&1ĦhF 06xFnFD=38,=JGr7Hq )YЅRH}lep̭8ċ8 (Ea/2)8iKP<념Tن#:]$lJf" -$"`GP>tRsMgɜJc6Z)*=%ĺφ0 2{A~", 4!+]PCT<@</(<X!"ӵN=cm iw0 :ELпC]H6 m+*-K%s)Ր q~i`lϪKĵSce]VM;X iVS Aқ+}ӪQ NA(xx0iJHs}2EKŒmeWk Ō#8A8I<"8$` L CO(Y(5)~Hٕ\VEY~Rs(z:(5=|-S%A4Mٟ֞mSzaUPr ځ8TܬM;,FNżC_$B4 0l:0@ 7lFYR] 8 oJ.+=8PU))\P\iEF٨R*> 6]zGx$W \$b|V2%VY<ځPLZc!"6 /Z<83fJ8\_0%ɸ<0iEf8fתmdCTm-PJ(Y-ٜ\>`9^;S;9c YP`j**]~'KdC)wuEJ+x3<ŢI*<S0gJ9KT^[8Ap/2b-D U ÃfĘ8H3]0Ȃ6hDD0hPXfMh^Yif=~'ϚG ]3Cgw+ 5u"w{0E]p9pQ2JV9qh[R13j/^#5$`.>_XƨKZ5U(hܚѽ$isc-8՗*>gHdt~޽Z8И8Tj(T"P 9--]<~ ^\#9ckvPeӞQ4b e:((i HZ4\-xf8iF]mۭtTP8 5yVT<<0 3mGQݶ6#\ w?kb 6cS^CQk,`O<ꮁ]P Y5R6 ~iE&*f}Vhg2ᣞ4K?"PZeAPspbPth _L=s!^+5X(U V<VP7lcL!W"GNw{Mبy uh%{7Z8 q3BaZ]TCKf-NN K:wv.QǸ#A(gXʂ"& D P%h"ƌ7^,%#Ȑ"A(i A(Wy|2"1&Μ9) Pi֬}Bg -jQ]#2m* pBĊ+Cc ?z|J1L+2Ҡ#L3~D s%͡0Qz!D߼q j +WzSڶۢES6,W,W@5'8B)p4B)|/a:Ǖ3,C U\0DҧOtiIWjwy{rJt/O?=3*iQ%A@X!PTrX-&XWA BCQEQ0(C]wW\1!iUaQ\cb+B,XH68sf=:ER"x۟HOdrg!7н P}D  `Oz._@sP946Dk:Tp1⋄+`sXhJWdfSjq6Z"1z 9U@_"ЈDYX6 h}CԺֶMq>AⵀJ@$_ӫ@}܁6,%,`p,qNu$X>d0d &C1e^j;D)kqbhՓ EHiZ+P >7 P!rn X0VF6+v]B6O{5ԫeƁc p@ ?1YB p@<t ի@q4F! RT+_fCR9Le3֢cJ$`7ISɈ*y4{qZ< cġV= }5x,l(?w#Or떵/ׂݦE(8~w &dl(R .?HM<Ԑ;<L$]M&x>8NtWN Nҿ 5z̔&@Q D8ԉ~ V!zC\F[to0BD~D0`ҮDt#Ex'@tK@ڐ5|݃@zRƀŠ cb%yUDE.5Yr}u Uf@G#-tڰ)ҍ qpCy"Lfy #SeETIJ  =B.]3׉]<9|gKz+r#׽9((| Hw#!aB1ۉJ7iFZe 01&0\68Ճ;1miDAiZ o.@A - p %4G_\-`A_y(NQ?PA~V,ԃ/W`Āŀ@ME\P,a`&`k,MR.QC48;6( }H3 P ɉp .Bh AXM C8%Y + D:Pߚ'u~pqd(C,OE]m!kƃ$ K,1 hTc4590 8XaMXDфA#腊AS!a(U"PXb0d""p". b**Id+~M(E0.RT;x]ׅp\[C1\ X @ @:(U mЬth%c.Q,TO/Ă8x(jH ׳t X~+V@L"B&҂&e)JDH?3TQdFׅp #,ȃl\`'EQ!(eZ̿I` H%4KC./0H5̐ZF[fLxmTB", A@M%\b&Y @ c`dBL_b`&Gx@% x&& <@|0 d͸E#vl_*1 We0Cû9jm3)lU ^ei̩i Ȁ~D܌% HdeAAAH \b'vi+BTr;x gnUT@=P \P\Ƭ >]hF(=!&< d@jI*%:C` TF1(T x[aBp  F ph|OB.לyIĸ\"B G(}b!@*dt8p<() H| 8*ǶpԵRB[ ea6,J9L@Ă,ɂ/,F[ N)8:&aBDg) ť -T@=/*)lcoT+&e{>e$(\ [k^Q\fJ(+lUXY$ lf 8jp Z[ԃ6(»D h8R0ZHN 38 B/Dܬ89Dô[ā Ch/փj`Qǿ1FȂ6,C# m ,6B,@ BL%BhDʫ?Iҍ'`++Dx ػ:ā ~ҶOkƃ[,@^oLo+D d!ܪnl/hCĪpEp ̮s.> j4BB4 )@"al/6/Ml0 Ciʉ'5!AD@"W V@ fM+ lxz!`\p F,5,!VƂ/hiHH#ʊ 4@1n 6+H,8':<>l@m)\*j>iad)hfƻUDJ /]A+_iO @#_? (ƋIC V%@H] | X8I>K=sZ;Bo4F"3do^%p(ZtX /a*;hbh B"D.'/_/YC,HHm\W.-U!ʕ/%J Ԁ5_JB63 LP@"I6d˃snx#8(MӲJ q5mvM*YnBm(%BpA @n;xCo'u/4½VrD\mYdEp3 J]6 @\n #(9-hKk68qo/ ܴ+xH Aքp@ D n[s?x/(W@b]^ OJopQ@@,(p (MR9[\6C,D `t#Zo _A/C򎣹B+/3|{#6| {Ҫk{#4iD ATSMA51 6uC:|TM(Lhdŧ4ϤTfQ;G zRW ,^4 l0<`,_o`d$;CC=l `cB=(4}:JE{6{T ֿM[1W\ԝ@RZ}K*lq/6 ̍`@cHǘFb_l:#~@9tWZD:@=>,@ZLF1p.LA€H(\uE(+bN#6wZ&>w5:W% S3aPޠOrHxJA]3ԧ tL%KRw&$/1'ށ~`˅EK.T6cq8j 0uv>cA0;@%40фPЦ8BKw6prYXBY( ֦m[yQ@!XGi|i kb#Q9K挣 u߭Dp!xJ| 6` 38cr.\̉976sC(7Ə-) ~8RnhWDX|qI_D!Yy)9Gbzi*Esebzb9^E88艟mVmdA0eQ&Vv]bF*ڳYS60Xڰ`T D'7K08.P"r%|/R_D9Xkp9v&s8  txSY|lשO-pΐA ?v׈CPpE ZG453K##LD?0UZ0gHC1>^E,rыaD#۰UM1}E.iQtY3>Id*q잢:pN(XA _c}OQ5eXCUpp4|5fOTC~U 2x!DR@m~2 ;-AV*CU~Zȵ˜Nh$ x 删Jx,nN<鎶I`)HJCB l'%r!A,lB}СyB(wnCzN:EF': G!؀ \( NfLoaK@ h>(Gl#P,b vD(uNFT0h+ȩ0BM`BƝB#Dmۺ(ۺ(\V$ᑈeдj *%GDގLo ڠ Ŵ20h, d 3@Ipdx0pu+: )QeLRÌ|bt]2^$( Eȝ6 ZlUazvNAN Ft3#@Dde垢   ') i,1K lZv fch&ϊIC \.988 E@þq.ŝ<࢏d d 8QvF  f'zAāG! o:⫢J8,= ͠]V " \2& FH')#hq2(G# `KOe*NT>Lr+ 1-D,-(|- hFaP8 AY`o0qtv$BBQ\AK{*l@l"QTϞNTCP*2m& &e Ps255a36 ɉNװ e u\N9̱8{ Nh“IoM:U]5`+F|0,D :JR(%\W$`kA&&~"3r/3AVkHr>l2@`4AA'f|Ҧ*4o+O"L3tmO^FZ:bd@oNJB@"h"DNcw\a?R#F*KaK"9)jɤ2LKe,˧DPSS!8?zLS-Bjx 9(4: t4ghr1jw <@eD;o;H&.QI4*fO "# {_C :r, 0J։|<&*8E@!=@GvWAe 8!,zZJ#3?%XbYJP:ZM0#C( ڀ J&IL5w])~3_ilWTH.,+ѱQ݅-!."; #|\T)\Ϙ#G,ȍvXA 9fo6TWθ*H h1  IX  `E-,Y𒃓c`|Oz֒LE֖k* *҂-IF1Z"#9 %`n}N2 !?$ ~,(Ka I+dމ+!p]J5wA`''t3Z`84gxdD ?{c-F={̠3qhJ ixG0g9&?EI#?J, ,!QZre :f&LN Pebbr'n۶۬1c6lX\T]РFx'LYBړ4:54 RoG5b׿ >81H ;f 2d*[9sf"+2\!d[J2ٳ{b1  [b 2zIg@d18i*GHz5)odru@b*&Y)LmL1+^U!G\aUVmZi}gDg(Kg$Bb\TW~`cb${(@ "l0eJj "iAF4v4"͵ޤ0H-mCh@V KWod$H'0w8E^Jas(vB)g;S)P2U/AX.8LUCB&+ANA lhs ^=] C~>/?1??^}Җ0Pp44TM 01iM>EZQ2u:)=W`ٯ9͒:%{2dD .sšQ,Ua\JC)J'D$ .@`5FH'\gZ zEj>#OD+πRl~x(-E cLD1+\8e dvHKME6{Ne[ X0_U`ppчDpLJ~,+KSP0SSЙb-H=ˆ$HtOChJy1Tݝbխnn ԠtyTW9-1qp1Z1rk3klٳf e;Wlv]h3zCFt5+ѓaPY{Ç)HnqQ@TvBA{&jwޱW"'iBMTSqcC ppx%5FLSQTp W13*T3.X*y1Ybbs,ZbeshlxtwK灅 !+U'UWu**h$/4@8+C"p8h'A3/Y&&*36UD[~Cx G ?91; n!Ex+esffs(pxhVEmVWHg "H`{@tn"%Q'Md|$awZ-ZBA\[akw ~Є,v> KB86r27m!x(E ҅a;S ,ӌZ&Ј֘Ⓧ$aOGHu\`69p'Ky/SRZ .lAf1/kAbG$C=Q:K@ bքʀ)[xYc1N Y"Ru@yʭQ*A|A1U-aAEij\zS C NAwIILH4S/Jw)31dKNNm0NC  >h%O0G/6`6PrZ-*7J~h hΧRD0"' { GX 88J !xbw> [ыI/-B89s8{< N_$Z QPF,hRplQܙ >V# P '.`i07k4fv1Jmw}}hzw0%(G):K!ëbFcqλ !_@Lm+ {{yFM`RlSLk,<Ĭ#-,\S0wѡh:wK@38@1 I5i ̰ 7jWmY=j:j 4C3oD]!@Eb "=?IЏPeELVC!^M0MPxF'KTc0* ْ] {2Ghv6R@!% BM%I`8v|$A(ȁ RKl+9 P q;U eJaBv[Ut If{׀C@RMpLkg˿#2mPٖ(68R>m7f7ɚ|+? q `Ss jy۸x3jMKL:2 !`i5(QYEճv=?޳ -䃭Rܬp"(# Q>ٕҙh#&#.!7UCFD1j9 L#4*kPHPT*W'dv;BkZE=O0"zB]VVeiZ`R꫎`[=pY.૑AԗR\x-ZC0 :="#^yՔBjG:k05FNv=Yj˾BMD'>d ߇اO!`Ռa9hqBC42*i[ ;گ#O%ȺqV 9Cb'ޘZV-镞l" ҐnM _SOwy0N o0I@F!;Ɏ i@<%_^;j@T T,NvdM6lPJl{lڥkh ANIFVV;Q?? X?[^/78v'S U(cT$x߯s \4Z㊟==w {`FF;BeNoΚ&^?c$(# .D8)O1N#J!W„9'J!BDȌaԨKWrꕋ+P@Waʬ1&sɓSQ;*Nܶh\bաCLs&MaDY o-¥H3ZaƯ#`)M $I$k Pe̙5(P lt{kd=un O"')F G+=a;(K^]+VSDk/fѢY5*T񕞳|.WD:HJH>k.P`C/5 L 4PP2)lD73N -6`mjF nG!: Id(:&O9%h*ҋFtK9ǝmI/zκ6"9@ 6@bA-Pt J{a C+²>{+\al D}`( +]>w4_? W x@(FM^)CnH4% oW!F\H!rO :B`!~6. R@7|A_gRTD#Z Z"EEQhB^0CEi^%KwrQC`"h-Bɑ\G0B =X &@ |.F4i LMr_"p%/ɯmR'7hy U"eP6Y>BO;Az01!b*F ^C /@Ih) q4ؔ6qDGtӛ<)N'vPNKcT'`g<K#a Tbfhsd( qU>PEQpRݔBz֑'dIWhw; )JkV9>*BЎ E\bXP jAACe%Lfv M(U",pVԊ4 '[HI !s{%kh[+vV ,X54P5 ' )n" H/lv kϖ(k8*ڔ6kH-jWLV{mt8qPorI,ZыXzAXPSoxJAMB[neT;62ro:F1k}S'귿26`$ B. slCXQ`SY60-\ ?R谡`K U&CnanwQ1 jC]s0iJ{ZxArl3)ND_*Lg8 xڈVlHuQ`!40 $2\n5{ kB" 1=CAHi`7щf"J4nK#9?p춍.zw?i,Z Rb;rA a(C&2q K~fIl/ NmW&{\sknw=FCl D;!QJ (Auɦ݃}A Rik8CR*'8 ^qV)fΙk  v%q߭W{| :|7ǹ#sG>Azl#/#]J 䎍?F+TkLX/ܐc9;}UD2ٻvf>w҉0n^/6 GLB}]xK^tݝyLo^h@zD}8=uPlk ;.N N[LPB(r,+`ɰK>勍{9>[/(MPACRXb[;7  @ /j@D{ +9p pUxRxAGx I>ۚG;)<xAyA$ J UBk(=%T=ܺs[=$-p8EX@kE_T5E؂[&8Cѻ7tl9O)<|LIh 㹝KD# 04x 0KDD0q8LĬ#<@\HʸӰ*)Ȅ;BUTW8;E(> L+RP+6`,9C :, WP<>>ԾMDF&lFG$;D6 M?xʒBQ*JuA:S{E|J+ [d2PXwȆ?P & 5H7Hc&!e|T<\U\h>GX`Ip<I'AFhDMD`T-\Ǻ#qECHʧE[H/۸+jJMz$,F9H\KXXXN>MX,X@\M גICDD9ܼLLpЂVLZ,JQ,Edz L..dY,5 +ZM w`TѨ&[kR]NNQQLM(O؂"T8!L)#ɜGoS2_TYDY'(b)N[]6kk`fF~7nc5FmTUTj޵[Y[[i[i]a9THI(OH[[I-HgI~]\gg~d~ ( hCTW$C\b^h6c i~a.]5vc]ZuFiXvipĮgdBPd jUYXICn7\U^jD~j|g ^j&ل^%H3+⇆h8]kي cmemk ݐgvZ6kenYiafkV`jVM`iT0pF^TW^B PwHnҶ^L6mNmO.4/H <$/hm7m~Yb~C__Slk7~nk6Ydn_dPang[霾ipl]ۛl?i ɹ\egdyd)GQ{^LMƥ$^p~b[\]hA: pgp;o8=lvgh_p_Hl®`8oC]uH0paU%d~j(oa)OML+wx~؇x]P52(>s45_hqus09n;a~c~@wa6tnaqq&wUp>vPKgSwj&uS[gU{{{nuf5p]ݖb_u3m9b G0lXg9gvufnphg%:sFp" ggaÊYU^Zu&ٴic!4hΊ_ Cf׬V`UG

LjaN5Qmܦ[M $o+S]:OAהtDtEEqZ)w7\ԘX3M^bمV|2,x-`PV]zg5`A @i!/YgF-'Lo:=\c9:r3t_#_[δۊOF ʲ2?l;|tzc:k^8^W\bv6w0EB$ V `eygFۣsrxG9tZ6ƎzoG;$T;̢?.AA(EFwU; Kx(^T(IT"lPR8#g7^эCs1r0 KcG;QiuyĒMdD(NF B h-rы`6~Do`Dz!O9Xvk_9>ǎwik3g>^j$|HNr %DE3 bU1-Zh`*hP*<.qoe,Ow#{a= >jn-hGigϜFю&^&%MI*O hqZE0Η-?Q/܉x,Ey;юv 43 aȈG(145fmzv"@B>rET$&Y>1Q>Хj^zqX!43hWWmeI*aX&2YQ+j ¶N}%O/ӁRoHZGp0B*s۩rd-x>79@@fiݝ1j=6N;GaussSum-3.0.2/Docs/pr01.html0000666000175000017500000002320513222437274014313 0ustar noelnoel Introduction

Introduction

GaussSum parses the output files of ADF, Dalton, Firefly, GAMESS, GAMESS-UK, Gaussian, Jaguar, Molpro, NWChem, ORCA, Psi and QChem calculations to extract useful information.

It is written by Noel O'Boyle and is available for free under the GNU Public License. For up-to-date information, please see http://gausssum.sf.net.

GaussSum version 3.0 can do the following:

  • display all lines containing a certain phrase

  • follow the progress of the SCF convergence

  • follow the progress of a geometry optimisation

  • extract molecular orbital information, including contributions of groups of atoms to the molecular orbitals

  • plot the density of states spectrum (and the partial density of states, in the case of groups of atoms)

  • plot the crystal orbital overlap population (COOP) spectrum, which gives information on the bonding/anti-bonding nature of an overlap between atoms/groups

  • extract information on the UV-Vis transitions, including the change in the charge density of groups of atoms

  • plot the UV-Vis spectrum and the circular dichroism spectrum

  • extract information on IR and Raman vibrations

  • plot the IR and Raman spectra, which may be scaled using general or individual scaling factors

  • Handle compressed log files (.zip, .gz, .bz2) as easily as regular log files.

Release Notes for Version 3.0.2:

  • Update in parsing library (to cclib 1.5)

  • No longer include cclib as part of the GaussSum source distribution

  • Create a DOS spectrum even where one or more eigen values are "nan" (e.g. asterisks in a Gaussian output file). Such values are simply ignored.

  • Correct the size of the About box (Daniel Liedert)

Release Notes for Version 3.0.1:

  • Update in parsing library (to cclib 1.3.1+) adding support for several additional computational chemistry packages

  • Avoid use of deprecated "oldnumeric" numpy module (Clyde Fare, Erlendur Jónsson)

  • Correct name of output folder to gausssum3 (Angelo Rossi)

  • Correct the size of the About box (Daniel Liedert)

Release Notes for Version 3.0:

  • This is the first version of GaussSum that uses Python 3 instead of Python 2

  • Use Matplotlib instead of Gnuplot

  • Update in parsing library (to cclib r1064)

Release Notes for Version 2.2.6.1: Bugfix for 2.2.6. Gnuplot location undefined for new users of GaussSum (Guillaume Lamoureux).

Release Notes for Version 2.2.6: A patch from Thomas Pijper was integrated to enable calculation of Raman intensities (from Raman activity). Support has been added for calculating charge density changes for unrestricted calculations (requested by Phil Schauer). Blank lines in Groups.txt are now ignored.

Release Notes for Version 2.2.5: Parser updated to cclib r923 (Ben Stein, Marius Retegan). Removed minus signs in output for TD-DFT (previously these indicated the sign of the contribution). Corrected equation used for circular dichroism to match that from Stephens and Harada (see circular dichroism docs for ref). Thanks to Li-She Gan for identifying this problem and pointing me to this paper.

Release Notes for Version 2.2.4: Parser updated to cclib r912 (Tiago Silva).

Release Notes for Version 2.2.3: Fix serious bug with EDDM (Carlo Nervi, Carlos Silva Lopez). Parser updated to cclib r884 (Mahesh Kumar, Dan Matusek).

Release Notes for Version 2.2.2: Fix problems with Linux version (Daniel Liedert). Minor doc fixes (Irena Efremenko).

Release Notes for Version 2.2.1: Fix bug in importing cclib (Daniel Liedert). Parser updated to handle Gaussian09 CD output (Rino Pescitelli).

Release Notes for Version 2.2.0:

  • Update in parsing library (to cclib r877)

  • Added support for creating EDDM maps with Gaussian

Release Notes for Version 2.1.6: Can now handle unrestricted TD-DFT calculations correctly (previously there were errors in the contribution descriptions in UVData.txt).

Release Notes for Version 2.1.5: Updated cclib to cclib 0.9+ (r840). Fixed problem reparsing GeoOpts. Fixed problem with exe on Windows with default Gnuplot and Docs locations.

Release Notes for Version 2.1.4: Bugfixes for UVData.txt which had incorrect % contributions of singly-excited configurations and incorrect changes in electron density of groups.

Release Notes for Version 2.1.3: Bugfixes for incorrect data for energies in CDSpectrum.txt and incorrect units in heading in UVData.txt. Updated cclib to cclib 0.8 beta

Release Notes for Version 2.1.2: Bugfix for off-by-one error in orbital names in major and minor contributions in UVData.txt.

Release Notes for Version 2.1.1: Updated the code to save results to gausssum2.1 subfolder, along with some minor documentation fixes

Release Notes for Version 2.1.0:

  • Major update in parsing library (upgraded from cclib 0.6.1 to cclib 0.8dev)

  • Jaguar log files now supported

  • Compressed log files (.zip, .gz., .bz2) supported

  • Underlying code now uses Numpy for numerical calculation, rather than the deprecated Numeric

  • Fixed error in the output of DOS_spectrum.txt where the 'Total' column was equal to the values for the first group

  • Fixed problem plotting the COOP

Release Notes for Version 2.0.6: Plotting the PDOS was failing due to 'type' issues with Numeric arrays (due to changes in cclib 0.6.1).

Release Notes for Version 2.0.5: Parsing was failing for Gaussian files with "pop=regular".

Release Notes for Version 2.0.4: Plotting vibrational frequencies now works for GAMESS calculations that have imaginary frequencies (bug fix in cclib).

Release Notes for Version 2.0.3: Plotting vibrational frequencies now works for frequencies that don't have symmetry labels.

Release Notes for Version 2.0.2: COOP now works for unrestricted calculations.

Release Notes for Version 2.0: main differences compared to GaussSum 1.0

  • This is the first release of GaussSum that uses cclib to parse output files.

  • Calculation of the DOS and COOP uses matrix algebra now, and is almost instant.

  • Images can now be saved as .png files.

  • Groups can be described in terms of atomic orbitals now (and not just atoms).

GaussSum-3.0.2/Docs/pr02.html0000666000175000017500000005356513222437274014330 0ustar noelnoel Citation

Citation

If you use GaussSum to obtain results for publication, please cite it as follows:

N. M. O'Boyle, A. L. Tenderholt and K. M. Langner. J. Comp. Chem., 2008, 29, 839-845.

Here is a list of some papers that cite GaussSum from 2004 to 2009. There are many more papers since 2009 and I thank you for your continued support.

  1. Ligand-Selective Photodissociation from [Ru(bpy)(4AP)4]2+: a Spectroscopic and Computational Study Luca Salassa, Claudio Garino, Giovanni Salassa, Carlo Nervi, Roberto Gobetto, Carlo Lamberti, Diego Gianolio, Ranieri Bizzarri and Peter J. Sadler Inorg. Chem., 2009, 48 (4), pp 1469-1481

  2. Localised to intraligand charge-transfer states in cyclometalated platinum complexes: an experimental and theoretical study into the influence of electron-rich pendants and modulation of excited states by ion binding David L. Rochester, Stephanie Develay, Stanislav Zali, J. A. Gareth Williams, Dalton Trans., 2009, (10),1728-1741

  3. Synthetic, structural, photophysical and computational studies of -conjugated bis- and tris-1,3,2-benzodiazaboroles and related bis(boryl) dithiophenes Lothar Weber, Vanessa Werner, Mark A. Fox, Todd B. Marder, Stefanie Schwedler, Andreas Brockhinke, Hans-Georg Stammler, Beate Neumann, Dalton Trans., 2009, (8),1339-1351

  4. The Chromophore Structure of the Cyanobacterial Phytochrome Cph1 As Predicted by Time-Dependent Density Functional Theory Ricardo A. Matute and Renato Contreras, Guillermo Prez-Hernndez and Leticia Gonzlez J. Phys. Chem. B, 2008, 112 (51), pp 16253-16256

  5. Comparison of adsorption mechanism on colloidal silver surface of alafosfalin and its analogs Journal of Raman Spectroscopy Edyta Podstawka, Marcin Andrzejak, Pawelstrok Kafarski, Leonard M. Proniewicz Volume 39, Issue 9, Date: September 2008, Pages: 1238-1249

  6. Computational and Spectroscopic Studies of New Rhenium(I) Complexes Containing Pyridylimidazo[1,5-a]pyridine Ligands: Charge Transfer and Dual Emission by Fine-Tuning of Excited States Luca Salassa, Claudio Garino, Andrea Albertino, Giorgio Volpi, Carlo Nervi, Roberto Gobetto and Kenneth I. Hardcastle Organometallics, 2008, 27 (7), pp 1427-1435

  7. A Computational Study of the Ground and Excited State Structure and Absorption Spectra of Free-Base N-Confused Porphine and Free-Base N-Confused Tetraphenylporphyrin Shubham Vyas, Christopher M. Hadad and David A. Modarelli J. Phys. Chem. A, 2008, 112 (29), pp 6533-6549

  8. Determination of Absolute Configuration of Chiral Hemicage Metal Complexes Using Time-Dependent Density Functional Theory Frederick J. Coughlin, Karl D. Oyler, Robert A. Pascal, Jr., and Stefan Bernhard Inorg. Chem., 2008, 47 (3), pp 974-979

  9. Effect of an aliphatic spacer group on the adsorption mechanism of phosphonodipeptides containing N-terminal glycine on the colloidal silver surface Journal of Raman Spectroscopy Volume 39, Issue 10, Date: October 2008, Pages: 1396-1407 Edyta Podstawka, Pawelstrok Kafarski, Leonard M. Proniewicz

  10. Effect of an aliphatic spacer group on the adsorption mechanism on the colloidal silver surface of L-proline phosphonodipeptides Journal of Raman Spectroscopy Edyta Podstawka, Pawelstrok Kafarski, Leonard M. Proniewicz Volume 39, Issue 12, Date: December 2008, Pages: 1726-1739

  11. Electronic structure and reactivity analysis for a set of Zn-chelates with substituted 8-hydroxyquinoline ligands and their application in OLED Ricardo Vivas-Reyes, Francisco Nunez-Zarur, Emiliano Martinez Organic Electronics, Volume 9, Issue 5, October 2008, Pages 625-634

  12. A laser flash photolysis, matrix isolation, and DFT investigation of (?6-C6H5Y)Cr(CO)3 (Y = NH2, OCH3, H, CHO, or CO2CH3) Mohammed A.H. Alamiry, Peter Brennan, Conor Long, Mary T. Pryce, Journal of Organometallic Chemistry, Volume 693, Issue 17, 15 August 2008, Pages 2907-2914

  13. Mechanism of Forster-type hopping of charge transfer and excitation energy transfer along blocked oligothiophenes by Si-atoms Yong Ding, Xiangsi Wang, Fengcai Ma Chemical Physics, Volume 348, Issues 1-3, 2 June 2008, Pages 31-38

  14. Mechanism of Ligand Photodissociation in Photoactivable [Ru(bpy)2L2]2+ Complexes: A Density Functional Theory Study Luca Salassa, Claudio Garino, Giovanni Salassa, Roberto Gobetto and Carlo Nervi J. Am. Chem. Soc., 2008, 130 (29), pp 9590-9597

  15. Nature of Charge Carriers in Long Doped Oligothiophenes: The Effect of Counterions Natalia Zamoshchik, Ulrike Salzner and Michael Bendikov J. Phys. Chem. C, 2008, 112 (22), pp 8408-8418

  16. Photoinduced Se?C Insertion Following Photolysis of (?5-C4H4Se)Cr(CO)3. A Picosecond and Nanosecond Time-Resolved Infrared, Matrix Isolation, and DFT Investigation Peter Brennan, Michael W. George, Omar S. Jina, Conor Long, Jennifer McKenna, Mary T. Pryce, Xue-Zhong Sun and Khuong Q. Vuong Organometallics, 2008, 27 (15), pp 3671-3680

  17. Quantum chemical studies on the potentially important imidates Tarek M. El-Gogary Journal of Molecular Structure: THEOCHEM, Volume 861, Issues 1-3, 30 July 2008, Pages 62-67

  18. Reversible Intramolecular C?C Bond Formation/Breaking and Color Switching Mediated by a N,C-Chelate in (2-ph-py)BMes2 and (5-BMes2-2-ph-py)BMes2 Ying-Li Rao, Hazem Amarne, Shu-Bin Zhao, Theresa M. McCormick, Sanela Marti, Yi Sun, Rui-Yao Wang and Suning Wang J. Am. Chem. Soc., 2008, 130 (39), pp 12898-12900

  19. Ruthenium-carbonyl complexes of 1-alkyl-2-(arylazo)imidazoles: Synthesis, structure, spectra and redox properties T.K. Mondal, S.K. Sarker, P. Raghavaiah, C. Sinha Polyhedron, Volume 27, Issue 13, 10 September 2008, Pages 3020-3028

  20. Spectroscopic and theoretical studies on axial coordination of bis(pyrrol-2-ylmethyleneamine)phenyl complexes Jia-Mei Chen, Wen-Juan Ruan, Liang Meng, Feng Gao, Zhi-Ang Zhu Spectrochimica Acta Part A: Molecular and Biomolecular Spectroscopy, Volume 71, Issue 1, 1 November 2008, Pages 191-198

  21. Structural Properties of l-X-l-Met-l-Ala Phosphonate Tripeptides: A Combined FT-IR, FT-RS, and SERS Spectroscopy Studies and DFT Calculations Edyta Podstawka, Pawe? Kafarski and Leonard M. Proniewicz J. Phys. Chem. A, 2008, 112 (46), pp 11744-11755

  22. Structures and Bonding on a Colloidal Silver Surface of the Various Length Carboxyl Terminal Fragments of Bombesin Edyta Podstawka, Yukihiro Ozaki and Leonard M. Proniewicz Langmuir, 2008, 24 (19), pp 10807-10816

  23. Structure?Property Relationships of Polyselenoethers [?(CH2)ySe?]x (y = 1, 2, and 3) and Related Polyethers and Polysulfides Yuji Sasanuma, Akinori Watanabe and Kenta Tamura J. Phys. Chem. B, 2008, 112 (32), pp 9613-9624

  24. Structure, spectra and electrochemistry of ruthenium-carbonyl complexes of naphthylazoimidazole Inorganica Chimica Acta, Volume 361, Issue 8, 2 June 2008, Pages 2431-2438 Tapan Kumar Mondal, Joydev Dinda, Jack Cheng, Tian-Huey Lu, Chittaranjan Sinha

  25. Structure, Stereodynamics and Absolute Configuration of the Atropisomers of Hindered Arylanthraquinones Lodovico Lunazzi, Michele Mancinelli and Andrea Mazzanti J. Org. Chem., 2009, 74 (3), pp 1345-1348

  26. Synthesis, Separation, and Circularly Polarized Luminescence Studies of Enantiomers of Iridium(III) Luminophores Frederick J. Coughlin, Michael S. Westrol, Karl D. Oyler, Neal Byrne, Christina Kraml, Eli Zysman-Colman, Michael S. Lowry and Stefan Bernhard Inorg. Chem., 2008, 47 (6), pp 2039-2048

  27. Theoretical analysis on the electronic structures and properties of PPV fused with electron-withdrawing unit: Monomer, oligomer and polymer Yangwu Fu, Wei Shen, Ming Li Polymer, Volume 49, Issue 10, 13 May 2008, Pages 2614-2620

  28. Computational Study of Iron(II) Systems Containing Ligands with Nitrogen Heterocyclic Groups R. A. Kirgan and D. P. Rillema J. Phys. Chem. A, 2007, 111 (50), pp 13157-13162

  29. Electronic Spectroscopy of Nonalternant Hydrocarbons Inside Helium Nanodroplets Ozgur Birer, Paolo Moreschini, Kevin K. Lehmann, and Giacinto Scoles J. Phys. Chem. A, 2007, 111 (49), pp 12200-12209

  30. Spectroscopic and Computational Studies of a Ru(II) Terpyridine Complex: The Importance of Weak Intermolecular Forces to Photophysical Properties Claudio Garino, Roberto Gobetto, Carlo Nervi, Luca Salassa, Edward Rosenberg, J. B. Alexander Ross, Xi Chu, Kenneth I. Hardcastle, and Cristiana Sabatini Inorg. Chem., 2007, 46 (21), pp 8752-8762

  31. Influence of the Substituted Side Group on the Molecular Structure and Electronic Properties of TPP and Related Implications on Organic Zeolites Use Godefroid Gahungu, Bin Zhang, and Jingping Zhang J. Phys. Chem. B, 2007, 111 (19), pp 5031-5033

  32. Syntheses and structures of mononuclear lutetium imido complexes with very short Lu-N bonds Tarun K. Panda, Soren Randoll, Cristian G. Hrib, Peter G. Jones, Thomas Bannenberg, Matthias Tamm, Chem. Commun., 2007, (47),5007-5009

  33. A DFT/TDDFT study of the structural and spectroscopic properties of Al(III) complexes with 4-nitrocatechol in acidic aqueous solution Jean-Paul Cornard, Christine Lapouge, Jean-Claude Merlin Chemical Physics, Volume 340, Issues 1-3, 9 November 2007, Pages 273-282

  34. Adsorption mechanism of physiologically active l-phenylalanine phosphonodipeptide analogues: Comparison of colloidal silver and macroscopic silver substrates E. Podstawka, A. Kudelski, L.M. Proniewicz Surface Science, Volume 601, Issue 21, 1 November 2007, Pages 4971-4983

  35. Theoretical studies on electrochemistry of p-aminophenol Yuanzhi Song Spectrochimica Acta Part A: Molecular and Biomolecular Spectroscopy, Volume 67, Issues 3-4, July 2007, Pages 611-618

  36. Intramolecular hydrogen bonding and photoinduced intramolecular proton and electron transfer in 2-(2'-hydroxyphenyl)benzothiazole Dongjie Sun, Jinghai Fang, Guanghua Yu, Fengcai Ma Journal of Molecular Structure: THEOCHEM, Volume 806, Issues 1-3, 31 March 2007, Pages 105-112

  37. Photophysical properties and computational investigations of tricarbonylrhenium(I)[2-(4-methylpyridin-2-yl)benzo[d]-X-azole]L and tricarbonylrhenium(I)[2-(benzo[d]-X-azol-2-yl)-4-methylquinoline]L derivatives (X = N-CH3, O, or S; L = Cl-, pyridine) Andrea Albertino, Claudio Garino, Simona Ghiani, Roberto Gobetto, Carlo Nervi, Luca Salassa, Edward Rosenberg, Ayesha Sharmin, Guido Viscardi, Roberto Buscaino, Gianluca Croce, Marco Milanesio Journal of Organometallic Chemistry, Volume 692, Issue 6, 15 February 2007, Pages 1377-1391

  38. A Density Functional Theory Study of the Electronic Properties of Os(II) and Os(III) Complexes Immobilized on Au(111). O'Boyle, N. M.; Albrecht, T.; Murgida, D. H.; Cassidy, L.; Ulstrup, J.; Vos, J. G., Inorg. Chem., 2007, 46, 117.

  39. Photophysical and electrochemical properties of new ortho-metalated complexes of rhodium(III) containing 2,2-dipyridylketone and 2,2-dipyridylamine. An experimental and theoretical study Wei Lin Su, Yu Cheng Yu, Mei Ching Tseng, Shao Pin Wang and Wen Liang Huang Dalton Trans., 2007, 3440.

  40. Photochemical cis-trans Isomerization of cis-(eta6-1,2-Diphenylethene)Cr(CO)3 and the Molecular Structure of trans-(eta6-1,2-Diphenylethene)Cr(CO)3 A. Coleman, S.M. Draper, C. Long, and M.T. Pryce Organometallics, 2007, 26, 4128.

  41. Density Functional Studies on the Effects of Hydrogen Bonding on the Formation of a Charge-Transfer Complex between p-Benzoquinone and 2,6-Dimethoxyphenol Bangal, P. R. J. Phys. Chem. A.; (Article); 2007; 111(25); 5536-5543.

  42. Lone Pair-pi and pi-pi Interactions Play an Important Role in Proton-Coupled Electron Transfer Reactions DiLabio, G. A.; Johnson, E. R. J. Am. Chem. Soc.; (Article); 2007; 129(19); 6199-620

  43. Intramolecular hydrogen bonding and photoinduced intramolecular proton and electron transfer in 2-(2'-hydroxyphenyl)benzothiazole. D. Sun, J. Fang, G. Yu and F. Ma. J. Mol. Struct. THEOCHEM, 2007, 806, 105.

  44. Photophysical properties and computational investigations of tricarbonylrhenium(I)[2-(4-methylpyridin-2-yl)benzo[d]-X-azole]L and tricarbonylrhenium(I)[2-(benzo[d]-X-azol-2-yl)-4-methylquinoline]L derivatives (X = N--CH3, O, or S; L = Cl-, pyridine). A. Albertino, C. Garino, S. Ghiani, R. Gobetto, C. Nervi, L. Salassa, E. Rosenberg, A. Sharmin, G. Viscardi, R. Buscaino, G. Croce, and M. Milanesio, J. Organomet. Chem., 2007, 692, 1377.

  45. Electronic transitions and bonding properties in a series of five-coordinate "16-electron" complexes [Mn(CO)3(L2)]- (L2 = chelating redox-active p-donor ligand). F. Hartl, P. Rosa, L. Ricard, P. Le Floch and S. Zalis. Coord. Chem. Rev., 2007, 251, 557.

  46. Theoretical studies on electrochemistry of p-aminophenol Y. Song Spectrochimica Acta Part A: Molecular and Biomolecular Spectroscopy, 2007, 67, 611.

  47. The electronic and structural properties of nonclassical bicyclic thiophene: Monomer, oligomer and polymer W. Shen, M. Li, R. He, J. Zhang and W. Lei Polymer, 2007, 48, 3912-3918

  48. Spectroscopic and computational studies on self-assembly complexes of bis(pyrrol-2- ylmethyleneamine) ligands linked by alkyl spacers with Cu(II) W. Li, Y. Wang, L. Yang, A. Szeghalmi, Y. Ye, J. Ma, M. Luo, J.-m. Hu and W. Kiefer J. Raman. Spectros., 2007, 38, 483-495.

  49. CO2 Fixation and Transformation by a Dinuclear Copper Cryptate under Acidic Conditions J.-M. Chen, W. W., X.-L. Feng and T.-B. Lu Chemistry - An Asian Journal, 2007, 2, 710-719.

  50. A DFT study of the chemisorption of methoxy on clean and low oxygen precovered Ru(0 0 0 1) surfaces M.N.D.S. Cordeiro, A.S.S. Pinto and J.A.N.F. Gomes Surface Science, 2007, 601, 2473-2485

  51. Syntheses, crystallography and spectroelectrochemical studies of ruthenium azomethine complexes M.Z. Al-Noaimi, H. Saadeh, S.F. Haddad, M.I. El-Barghouthi, M. El-khateeb and R.J. Crutchley Polyhedron, 2007, 26, 3675.

  52. Field-induced conformational changes in bimetallic oligoaniline junctions J.C. Sotelo, L. Yan, M. Wang and J.M. Seminario Phys. Rev. A, 2007, 75, 022511

  53. Density functional theoretical study of Cun, Aln (n = 4-31) and copper doped aluminum clusters: Electronic properties and reactivity with atomic oxygen C. Lacaze-Dufaure, C. Blanc, G. Mankowski and C. Mijoule Surface Science, 2007, 601, 1544-1553

  54. Electronic Structure and Excited States of Rhenium(I) Amido and Phosphido Carbonyl-Bipyridine Complexes Studied by Picosecond Time-Resolved IR Spectroscopy and DFT Calculations. Gabrielsson, A.; Busby, M.; Matousek, P.; Towrie, M.; Hevia, E.; Cuesta, L.; Perez, J.; Zalis, S.; Vlcek, A., Jr., Inorg. Chem., 2006, 45, 9789.

  55. Spectroscopic and Computational Studies on the Coordination-Driven Self-Assembly Complexes (ZnL)2 and (NiL)2 [L= Bis(2,4-dimethyldipyrrin-3-yl)methane]. Li, W.; Wang, Y.-B.; Yang, L.-Y.; Shan, X.-F.; Cai, X.; Szeghalmi, A.; Ye, Y.; Ma, J.-S.; Luo, M.-D.; Hu, J.; Kiefer, W., J. Phys. Chem. B., 2006, 110, 21958.

  56. The hydrogen bond in the acetylene-2(HF) complex: A theoretical study about intramolecular and unusual PI...H interactions using DFT and AIM calculations. B.G. Oliveira, R.C.M.U. Araujo, A.B. Carvalho, E.F. Lima, W.L.V. Silva, M.N. Ramos and A.M. Tavares, J. Mol. Struct. THEOCHEM, 2006, 775, 39.

  57. Calculation of standard electrode potential of half reaction for benzoquinone and hydroquinone. Y. Song, J. Xie, Y. Song, H. Shu, G. Zhao, X. Lv and W. Xie, Spectrochimica Acta Part A: Molecular and Biomolecular Spectroscopy, 2006, 65, 333.

  58. A theoretical quantum study on the distribution of electrophilic and nucleophilic active sites on Ag(100) surfaces modeled as Finite Clusters. C. H. Rios-Reyes, R. L. Camacho-Mendoza and L. H. Mendoza-Huizar, J. Mex. Chem. Soc., 2006, 50, 19.

  59. Computational studies of the interactions between emeraldine and palladium atom. B. Bialek, Surf. Sci., 2006, 600, 1679.

  60. Excited States of Nitro-Polypyridine Metal Complexes and Their Ultrafast Decay. Time-Resolved IR Absorption, Spectroelectrochemistry, and TD-DFT Calculations of fac-[Re(Cl)(CO)3(5-Nitro-1,10-phenanthroline)]. A. Gabrielsson, P. Matousek, M. Towrie, F. Hartl, S. Zalis, and A. Vlcek, Jr., J. Phys. Chem. A, 2005, 109, 6147.

  61. Molecular geometry, electronic structure and optical properties study of meridianal tris(8-hydroxyquinolinato)gallium(III) with ab initio and DFT methods. G. Gahungu, and J. Zhang, J. Mol. Struct. THEOCHEM, 2005, 755, 19.

  62. CH/N Substituted mer-Gaq3 and mer-Alq3 Derivatives: An Effective Approach for the Tuning of Emitting Color. G. Gahungu and J. Zhang. J. Phys. Chem. B, 2005, 109, 17762.

  63. Ground- and excited-state electronic structure of an emissive pyrazine-bridged ruthenium(II) dinuclear complex. W.R. Browne, N.M. O'Boyle, W. Henry, A.L. Guckian, S. Horn, T. Fett, C.M. O'Connor, M. Duati, L. De Cola, C.G. Coates, K.L. Ronayne, J.J. McGarvey, and J.G. Vos, J. Am. Chem. Soc., 2005, 127, 1229.

  64. Bimetallic Clusters Pt6Au: Geometric and Electronic Structures within Density Functional Theory W. Quan Tian, M. Ge, F. Gu, and Y. Aoki, J. Phys. Chem. A, 2005, 109, 9860.

  65. Ground vs. excited state interaction in ruthenium-thienyl dyads: implications for through bond interactions in multicomponent systems. W. Henry, W.R. Browne, K.L. Ronayne, N.M. O'Boyle, J.G. Vos, and J.J. McGarvey, J. Mol. Struct., 2005, 735-736, 123.

  66. (NH3CH2CH2NH3)Ag2SnS4: a quaternary sulfide-containing chiral layers. Y. An, B. Menghe, L. Ye, M. Ji, X. Liu, and G. Ning, Inorg. Chem. Commun., 2005, 8, 301.

  67. Ligand-to-Diimine/Metal-to-Diimine Charge-Transfer Excited States of [Re(NCS)(CO)3(alpha-diimine)] (alpha-diimine = 2,2'-bipyridine, di-iPr-N,N-1,4-diazabutadiene). A Spectroscopic and Computational Study. A.M. Blanco Rodriguez, A. Gabrielsson, M. Motevalli, P. Matousek, M. Towrie, J. Syebera, S. Zalis, and Antonin Vlcek, Jr., J. Phys. Chem. A, 2005, 109, 5016.

  68. DFT and HF Studies of the Geometry, Electronic Structure, and Vibrational Spectra of 2-Nitrotetraphenylporphyrin and Zinc 2-Nitrotetraphenylporphyrin. W. Li, Y.-B. Wang, I. Pavel, Y. Ye, Z.-P. Chen, M.-D. Luo, J.-M. Hu, and W. Kiefer, J. Phys. Chem. A, 2004, 108, 6052.

  69. Assessment of intercomponent interaction in phenylene bridged dinuclear ruthenium(II) and osmium(II) polypyridyl complexes. A.L. Guckian, M.Doering, M. Ciesielski, O. Walter, J. Hjelm, N.M. O'Boyle, W. Henry, W.R. Browne, J.J. McGarvey, and J.G. Vos, Dalton Trans., 2004, 3943.

  70. Ab initio study of the electronic and structural properties of the crystalline polyethyleneimine polymer. G. Herlem and B. Lakard, J. Chem. Phys., 2004, 120, 9376.

GaussSum-3.0.2/Docs/pr03.html0000666000175000017500000001430113222437274014312 0ustar noelnoel Acknowledgments

Acknowledgments

A number of people provided helpful feedback during the development of GaussSum. The following names are listed in no particular order:

  • shaloncai reported an error in the data written in UVData.txt.

  • Rudy Coquet reported an error in the data written in CDSpectrum.txt.

  • Fabrizia Fabrizi de Biani reported an error in the labels used in UVData.txt.

  • Tong Glenna reported an error in the major and minor contributions in UVData.txt.

  • Christos Garoufalis reported a problem parsing PC-GAMESS files with large basis sets.

  • Emmanuel Koukaras reported a bug in the output of DOS_spectrum.txt, as well as a problem plotting the COOP.

  • Xinyu Huang reported a bug plotting the PDOS.

  • Yafei Dai reported problems parsing Gaussian files with "pop=regular".

  • Charles Bradshaw reported problems plotting the vibrational frequencies for GAMESS calculations.

  • Juan Sotelo-Campos pointed out that the COOP was only being calculated for alpha orbitals in unrestricted calculations.

  • Dr. Carlo Nervi, Torino, who found a bug in EDDM.py

  • James Hepburn, Aberdeen, who found that Hyperchem code had been neglected

  • Prof Ziyang Liu, Zhejiang University, P.R.China, who found a bug in the output of MO.py for unrestricted calculations

  • Fred Coughlin, Princeton, U.S., who found a couple of bugs in my code for CD spectra

  • Li Daobing and Jordan Mantha who have packaged GaussSum up for Debian and Ubuntu users

  • Neil Berry, Liverpool, who helped to increase GaussSum support for GAMESS files

  • Julien Chiron, Faculté des Sciences de Saint Jérôme, Marseille, France helped me add support for GAMESS and is perhaps the first Mac user of GaussSum (see screenshots)

  • Avril Coghlan, formerly of Trinity College Dublin, Ireland, thought of the name (it rhymes with awesome!) and suggested various web page improvements

  • Elmar Gerwalin, University of Kaiserslautern, Germany, who helped me enormously in getting GaussSum (a) to run in Linux and (b) to work for other people's calculations

  • Denis G. Golovanov, Russian Academy of Sciences, Moscow and his non-symmetry-containing logfile provided another challenge to GaussSum

  • Guillaume Herlam, Université de Franche-Comté, Besançon, France who requested and tested COOP diagrams

  • Roma Oakes, Queens University Belfast, made many useful comments regarding the initial development, especially regarding IR_Raman.py

  • Ullrich Siehl, University of Ulm, Germany, who made a number of suggestions that lead to the creation of version 0.9.

In order to create GaussSum, I had to learn a few things. I found the following resources very helpful:

GaussSum-3.0.2/Docs/style.css0000666000175000017500000000134613222437274014517 0ustar noelnoelp { font-size: 90%; color: #333300; line-height: 160%; font-family: Verdana,Arial,Helvetica,Sans-Serif,MS Sans Serif, sans-serif; text-align: justify; } a { font-size: 100%; line-height: 160%; font-family: Verdana,Arial,Helvetica,Sans-Serif,MS Sans Serif, sans-serif; text-align: justify } .application { color: red; } .year { font-weight: bold; } .journal { font-style: italic; } .volume { text-decoration: underline; } h2 { font-size: 110%; color: black; font-family: Georgia, Verdana, sans-serif; text-align: justify; line-height:50%; } GaussSum-3.0.2/GaussSum.ico0000666000175000017500000002267613222437274014231 0ustar noelnoel00 %(0` %! !!! !!! !!! !!! !!! !!! !!! !!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!kikRUR 1RQZ!!km{{  1! !! 9Z]U)(9{189   )0RE{mmQ1uRQZ{{{sy{s}{s}{s}RYZ  49Mc]{U{UUaueJ}{yJIR!(1) ces{}{}sysususu{sy{s}{s}{sskqs  ,1iki]Y{]}}qaIs!(9)! 1km{sususususqsq{sy{s}{sy{ky{ky!UZ!i{]s]{emem]4Z9ARsqsususqsukq{kq{Zy{J1!!!!u{ek]ke{e{Y{U{]M$J JMR!R]kcm{RisBes1ek!akikqs!!!qsecYc]ke{e{Y{Q{Q{ BJMZJMR ! )()0189 # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import os import sys if getattr(sys, 'frozen', False): # frozen here = os.path.dirname(sys.executable) os.chdir(here) from tkinter import * # GUI stuff import gausssum.gausssumgui if __name__=="__main__": root = Tk() root.title("GaussSum") app = gausssum.gausssumgui.App(root,sys.argv) # Set up the app... mainloop() # ...and sit back GaussSum-3.0.2/gausssum/0000777000175000017500000000000013222436700013611 5ustar noelnoelGaussSum-3.0.2/gausssum/__init__.py0000666000175000017500000000000013222437274015717 0ustar noelnoelGaussSum-3.0.2/gausssum/aboutbox.py0000666000175000017500000000615613222437274016025 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2015 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from tkinter import * # GUI stuff import webbrowser import tkinter.simpledialog import traceback import copy # For deepcopy...until I find a better way of doing this from cclib.parser import ADF, GAMESS, Gaussian import os, sys if hasattr(sys, "frozen"): # i.e. if using py2exe installlocation = os.path.dirname(sys.executable) else: import gausssum installlocation = gausssum.__path__[0] class AboutPopupBox(tkinter.simpledialog.Dialog): def __init__(self, parent, title = None): # Override (just to set the geometry!) Toplevel.__init__(self, parent) self.transient(parent) if title: self.title(title) self.parent = parent self.result = None body = Frame(self) self.initial_focus = self.body(body) body.pack(padx=5, pady=5) self.buttonbox() self.grab_set() if not self.initial_focus: self.initial_focus = self self.protocol("WM_DELETE_WINDOW", self.cancel) self.initial_focus.focus_set() self.wait_window(self) def body(self,master): # Override self.resizable(False,False) self.canvas2 = Canvas(master,width=340,height=260) self.canvas2.pack(side=TOP) self.photo2 = PhotoImage(file=os.path.join(installlocation,"mesh.gif")) self.item2 = self.canvas2.create_image(11,11,anchor=NW,image=self.photo2) Label(master,text="(c) 2006-2016 Noel O'Boyle").pack(side=TOP) Label(master,text="http://gausssum.sf.net").pack(side=TOP) Label(master,text="").pack(side=TOP) # Creates a bit of spacing at the bottom Label(master,text="Support GaussSum by citing:").pack(side=TOP) Label(master,text="N.M. O'Boyle, A.L. Tenderholt and K.M. Langner.",font=("Times",10,"bold")).pack(side=TOP) Label(master,text="J. Comp. Chem. 2008, 29, 839-845.",font=("Times",10,"bold")).pack(side=TOP) # Label(master,text="").pack(side=TOP) # Creates a bit of spacing at the bottom width, height = 354, 455 x = (652-width)//2 + self.parent.winfo_rootx() y = (480-height)//2 + self.parent.winfo_rooty() self.geometry("%dx%d+%d+%d" % (width, height, x, y)) # Place it in the centre of the root window def openmybrowser(self): # New webbrowser.open("http://gausssum.sf.net") def buttonbox(self): # Override box = Frame(self) w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE) w.pack(side=LEFT, padx=5, pady=5) self.bind("", self.ok) box.pack() GaussSum-3.0.2/gausssum/electrontrans.py0000666000175000017500000004526513222437274017071 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details import os import sys import math import stat import numpy import glob from gausssum.utils import GaussianSpectrum, levelname, percent from cclib.parser.utils import convertor # from Tkinter import * from .mpl import MPLPlot from .plot import DisplayPlot from .folder import folder def createEDDM(screen, logfile, contrib, gaussdir, unres): def cubman(cmds): if cmds[0] == "sc": output.write("echo Scaling %s by %s\n" % (cmds[1], cmds[-1])) elif cmds[0] == "a": output.write("echo Adding to %s\n" % cmds[3]) elif cmds[0] == "sq": output.write("echo Squaring %s\n" % cmds[1]) elif cmds[0] == "su": output.write("echo Subtracting %s from %s\n" % (cmds[1], cmds[3])) lines = [] lines.append("echo %s > tmp.txt" % cmds[0]) for cmd in cmds[1:]: lines.append("echo %s >> tmp.txt" % cmd) cmdname = syscmd[CAT] lines.append("%s tmp.txt | %s%scubman > tmp2.txt\n" % (cmdname, envvar('G03DIR'), os.sep)) output.write("\n".join(lines)) def envvar(x): if windows: return "%" + x + "%" else: return "${" + x + "}" def createcubes(mo): cube = "mo%s.cub" % getmo(mo) report = "echo Creating cubefile %s" % cube orb = mo[0] + 1 if unres: calctype = ['alpha', 'beta'][mo[1]] orb += len(logfile.moenergies[0]) * mo[1] cmd = "%s%scubegen 0 MO=%d %s %s -2 h\n" % ( envvar('G03DIR'), os.sep, orb, fchkpoint, cube) if windows: line = "if not exist %s %s & %s\n" % (cube, report, cmd) else: line = 'if [ ! -e "%s" ]\nthen\n %s\n %s\nfi\n' % (cube, report, cmd) output.write(line) def getmo(mo): suffix = "" if unres: suffix = ["A", "B"][mo[1]] return "%d%s" % (mo[0] + 1, suffix) def createsquares(mo): cube = "mo%s.cub" % getmo(mo) sq = "sq%s.cub" % getmo(mo) if windows: output.write("if not exist %s (\n" % sq) else: output.write("if [ ! -e %s ]\nthen\n" % sq) cubman(["sq", cube, "y", sq, "y"]) if windows: output.write(")\n") else: output.write("fi\n") def formchk(filename): filename = filename.split(fakeossep)[-1] fchkpoint = filename.replace('.chk', '.fck') report = "echo Formatting %s to %s" % (filename, fchkpoint) cmd = "%s%sformchk %s %s > tmp2.txt\n" % (envvar('G03DIR'), os.sep, filename, fchkpoint) if windows: line = "if not exist %s %s & %s\n" % (fchkpoint, report, cmd) else: line = 'if [ ! -e "%s" ]\nthen\n %s\n %s\nfi\n' % (fchkpoint, report, cmd) return fchkpoint, line windows = sys.platform == "win32" ## windows = False fakeossep = os.sep ## fakeossep = "\\" ## os.sep = "/" COPY, DELETE, CAT, MOVE = range(4) syscmd = ['cp', 'rm', 'cat', 'mv'] if windows: syscmd = ['copy', 'del', 'type', 'move'] fchkpoint = glob.glob(os.path.join(gaussdir, "*.fck")) + glob.glob(os.path.join(gaussdir, "*.fchk")) line = "" if len(fchkpoint) == 0: chkpoint = glob.glob(os.path.join(gaussdir, "*.chk")) fchkpoint, line = formchk(chkpoint[0]) else: fchkpoint = fchkpoint[0].split(fakeossep)[-1] # Error! screen.write("Creating the EDDM script file for %s\n" % fchkpoint) if windows: output = open(os.path.join(gaussdir, "eddm.bat"), "w") output.write("@echo off\n") else: finalsection = [] output = open(os.path.join(gaussdir, "eddm.sh"), "w") os.chmod(os.path.join(gaussdir, "eddm.sh"), stat.S_IRWXU) # Make executable if line: output.write(line) output.write("echo === Using formatted checkpoint %s ===\n" % fchkpoint) for i in range(len(logfile.etenergies)): # For each transition if windows: output.write("""if "%%1" == "%d" goto :tran%d\n""" % (i+1, i+1)) else: finalsection.append("""if [ "$1" == "%d" ]\nthen\n tran%d\nfi\n""" % (i+1, i+1)) line = "echo You need to specify a transition in the range 1 to %d\n" % len(logfile.etenergies) if windows: output.write("%s\ngoto :end\n" % line) else: finalsection.append(line) for i in range(len(logfile.etenergies)): # For each transition if windows: output.write(":tran%d\n" % (i+1)) else: output.write("function tran%d\n{\n" % (i+1)) totalcon = sum(contrib[i]) scales = [x / float(totalcon) for x in contrib[i]] minimum_scale = 0 # Don't include contributions that don't contribute! # Create any necessary cube and squared files alreadydone = set() for sec, scale in zip(logfile.etsecs[i], scales): if scale > minimum_scale: for M in range(2): if sec[M] not in alreadydone: createcubes(sec[M]) createsquares(sec[M]) alreadydone.add(sec[M]) N = 0 # Find the first transition with non-zero scale while N < len(scales) and scales[N] <= minimum_scale: N += 1 if N < len(scales): scale = scales[N] cubman(["sc","sq%s.cub" % getmo(logfile.etsecs[i][N][0]),"y","before.cub","y",str(scale)]) cubman(["sc","sq%s.cub" % getmo(logfile.etsecs[i][N][1]),"y","after.cub","y",str(scale)]) created_tmp = False for j in range(N + 1, len(logfile.etsecs[i])): scale = scales[j] if scale > minimum_scale: created_tmp = True cubman(["sc","sq%s.cub" % getmo(logfile.etsecs[i][j][0]),"y","tmp.cub","y",str(scale)]) cubman(["a","tmp.cub","y","before.cub","y","tmp2.cub","y"]) output.write("%s tmp2.cub before.cub\n" % syscmd[MOVE]) cubman(["sc","sq%s.cub" % getmo(logfile.etsecs[i][j][1]),"y","tmp.cub","y",str(scale)]) cubman(["a","tmp.cub","y","after.cub","y","tmp2.cub","y"]) output.write("%s tmp2.cub after.cub\n" % syscmd[MOVE]) if created_tmp: output.write("%s tmp.cub\n" % syscmd[DELETE]) cubman(["su","before.cub","y","after.cub","y", "trans%d.cub" % (i+1,),"y"]) else: output.write("echo No significant contributions found") if windows: output.write("goto :end\n") else: output.write("}\n") if windows: output.write(":end\n") else: output.write("\n".join(finalsection)) output.close() def readorbital_data(inputfile): # Reads in all data from orbital_data.txt line=inputfile.readline(); NBasis=int(line.split()[1]) line=inputfile.readline().split(); HOMO=[int(line[1])-1] unres=False if len(line)==3: unres=True # This is an unrestricted calculation HOMO.append(int(line[2])-1) line=inputfile.readline(); NGroups=int(line.split()[1]) groupname=[]; groupatoms=[] for i in range(NGroups): # Read in group info line=inputfile.readline() temp=line.split('\t') groupname.append(temp[0]) groupatoms.append(map(int,temp[1].split())) line=inputfile.readline() headers = inputfile.readline() # Contribs for orbital#1 will be in contrib[0][0-->NGroups] if not unres: contrib = numpy.zeros((1,NBasis,NGroups), "d") else: contrib = numpy.zeros((2,NBasis,NGroups), "d") evalues=[] for i in range(NBasis-1,-1,-1): line=inputfile.readline().split() evalue = [float(line[2])] more = line[4+NGroups:4+NGroups*2] # Strip off the crud at the start contrib[0,i,:] = [float(x) for x in more] if unres: evalue.append(float(line[6+NGroups*2])) more = line[8+NGroups*3:8+NGroups*4] contrib[1,i,:] = [float(x) for x in more] evalues.append(evalue) evalue.reverse() # Because you're reading them in backwards return HOMO,NBasis,NGroups,groupname,groupatoms,contrib,evalues def ET(root,screen,logfile,logfilename, start,end,numpts,FWHM,UVplot, EDDM): screen.write("Starting to analyse the electronic transitions\n") # Create output directory if necessary gaussdir=folder(screen,logfilename) unres = len(logfile.homos) > 1 CIS = logfile.etsecs if UVplot==True: ####################################################### # UV-Visible section # ####################################################### # Read in orbital_data.txt if it exists(which contains info on the contribs) NGroups=0 orbdata = False try: inputfile=open(os.path.join(gaussdir,"orbital_data.txt"),"r") except IOError: screen.write("orbital_data.txt not found\n") else: thisHOMO,NBasis,NGroups,groupname,groupatoms,contrib,evalue=readorbital_data(inputfile) inputfile.close() orbdata=True screen.write("Using orbital_data.txt\n") if thisHOMO != list(logfile.homos): screen.write("Disagreement on HOMO...orbital_data.txt says "+str(thisHOMO)+"\n"+logfile.filename+" says "+str(logfile.homos)+"\n") return False screenCD=[] for i in range(len(logfile.etenergies)): # For each transition screenCD.append("") # charge density [before, after] for each of the groups for each of the transitions majorCIS, minorCIS = [[] for x in logfile.etenergies], [[] for x in logfile.etenergies] allpercent = [[] for x in logfile.etenergies] for i in range(len(logfile.etenergies)): # For each transition if orbdata: CD=[ [0, 0] for x in range(NGroups)] totcontribs = 0 for j in range(len(CIS[i])): # For each contribution thisCIS = CIS[i][j] mycontrib = thisCIS[2] ** 2 totcontribs += mycontrib # tot up the contribs percontrib = int(mycontrib * 100 + .5) if orbdata: for k in range(NGroups): CD[k][0] += mycontrib * contrib[thisCIS[0][1], thisCIS[0][0], k] # Add to 'before' charge density CD[k][1] += mycontrib * contrib[thisCIS[1][1], thisCIS[1][0], k] # Add to 'after' charge density alphabeta = ["", ""] if unres: alphabeta = [["(A)", "(B)"][thisCIS[0][1]], ["(A)", "(B)"][thisCIS[1][1]]] CIStext = "%s%s->%s%s (%d%%)" % (levelname(thisCIS[0][0], logfile.homos[thisCIS[0][1]]), alphabeta[0], levelname(thisCIS[1][0], logfile.homos[thisCIS[1][1]]), alphabeta[1], percontrib) if percontrib >= 10: # Major contributions (>=10%) majorCIS[i].append(CIStext) elif percontrib >= 2: #Minor contributions (>=2%) minorCIS[i].append(CIStext) allpercent[i].append(percontrib) if orbdata: for j in range(len(groupname)): # The charge densities are scaled so that they add to one CD[j][0]=CD[j][0]/totcontribs CD[j][1]=CD[j][1]/totcontribs screenCD[i]=screenCD[i]+percent(CD[j][0])+"-->"+percent(CD[j][1])+" ("+percent(round(CD[j][1],2)-round(CD[j][0],2))+")\t" if EDDM: createEDDM(screen, logfile, allpercent, gaussdir, unres) # Write UVData.txt containing info on the transitions fileoutput = "" for i in range(len(logfile.etenergies)): # For each transition temp = [i+1,logfile.etenergies[i], convertor(logfile.etenergies[i],"cm-1","nm"), logfile.etoscs[i],logfile.etsyms[i], ", ".join(majorCIS[i]),", ".join(minorCIS[i])] if orbdata: temp.append(screenCD[i]) fileoutput += "\t".join(map(str,temp)) + "\n" screen.write("Writing the transition info to UVData.txt\n") outputfile=open(os.path.join(gaussdir,"UVData.txt"),"w") outputfile.write("HOMO is "+str(logfile.homos[0]+1)) if unres: outputfile.write("\t%d" % (logfile.homos[1] + 1,)) outputfile.write("\nNo.\tEnergy (cm-1)\tWavelength (nm)\tOsc. Strength\tSymmetry\tMajor contribs\tMinor contribs") for i in range(NGroups): outputfile.write("\t"+groupname[i]) outputfile.write("\n"+fileoutput) outputfile.close() endwaveno = convertor(start,"nm","cm-1") startwaveno = convertor(end,"nm","cm-1") t = GaussianSpectrum(startwaveno,endwaveno,numpts, ( logfile.etenergies,[[x*2.174e8/FWHM for x in logfile.etoscs]] ), FWHM) screen.write("Writing the spectrum to UVSpectrum.txt\n") outputfile=open(os.path.join(gaussdir,"UVSpectrum.txt"),"w") outputfile.write("Energy (cm-1)\tWavelength (nm)\tAbs\t<--UV Spectrum\tUV-Vis transitions-->\tEnergy (cm-1)\tWavelength (nm)\tOsc. strength\n") width=endwaveno-startwaveno for x in range(numpts): realx=width*x/numpts+startwaveno outputfile.write(str(realx)+"\t"+str(convertor(realx,"cm-1","nm"))+"\t"+str(t.spectrum[0,x])) if x\tWavelength (nm)\tEnergy (cm-1)\tR(length)\n") width = endwaveno - startwaveno for x in range(numpts): # Need to use float, otherwise it's an integer # realx = float(width)*x/numpts+start realx = width * x / numpts + startwaveno outputfile.write("%f\t%f\t%f" % (realx, 1.0e7/realx, t.spectrum[0,x])) if x < len(logfile.etenergies): # Write the R values out also outputfile.write( "\t\t\t%f\t%f\t%f" % (convertor(logfile.etenergies[x], "cm-1", "nm"), logfile.etenergies[x],logfile.etrotats[x]) ) outputfile.write("\n") outputfile.close() if root: # Plot the UV Spectrum using Gnuplot screen.write("Plotting using Gnuplot\n") if max(t.spectrum[0,:])<1E-8: # Gnuplot won't draw it if the spectrum is flat screen.write("There are no peaks in this wavelength range!\n") else: g = MPLPlot() g.setlabels("Wavelength (nm)", r"$\epsilon$") xvalues_nm = [convertor(x,"cm-1","nm") for x in t.xvalues] g.data(zip(xvalues_nm,t.spectrum[0,:])) energies_nm = [convertor(x,"cm-1","nm") for x in logfile.etenergies] oscdata = [(x, y) for x, y in zip(energies_nm, logfile.etrotats) if start < x < end] g.data(oscdata, vlines=True, y2axis="R (length) / $10^{-40}$") g.subplot.set_xlim(left=start, right=end) g.secondaxis.set_ylim(bottom=0) DisplayPlot(root, g, "Circular dichroism spectrum") screen.write("Finished") ####################################################### # End of main # ####################################################### GaussSum-3.0.2/gausssum/folder.py0000666000175000017500000000225713222437274015453 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2009 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # Creates a new output folder if it doesn't already exist # The folder is created in the same directory as the input file import os def folder(screen, logfilename, create=True): # Create the output directory if necessary logdir=os.path.dirname(logfilename) logname=os.path.basename(logfilename) gaussdir=os.path.join(logdir,"gausssum3") if create: if not os.path.isdir(gaussdir): screen.write("Creating new output folder\n") os.mkdir(gaussdir) else: screen.write("Using old output folder\n") return gaussdir GaussSum-3.0.2/gausssum/gausssumgui.py0000666000175000017500000006452113222437274016556 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2009 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from tkinter import * # GUI stuff import tkinter.messagebox # For the About Dialog import tkinter.filedialog # For the Open File and Save File import webbrowser import tkinter.simpledialog import traceback import copy # For deepcopy...until I find a better way of doing this import configparser # For writing the settings to an .ini file import logging import glob from cclib.parser import ADF, GAMESS, Gaussian, ccopen from gausssum.preferencesbox import PreferencesPopupBox from gausssum.aboutbox import AboutPopupBox from gausssum.popanalysis import Popanalysis from gausssum.electrontrans import ET from gausssum.geoopt import GeoOpt from gausssum.search import Search from gausssum.vibfreq import Vibfreq from gausssum.scf import SCF from gausssum.utils import * from gausssum.folder import folder import os, sys if hasattr(sys, "frozen"): # i.e. if using cx_Freeze installlocation = os.path.dirname(sys.executable) else: import gausssum installlocation = gausssum.__path__[0] class App: # This sets up the GUI def __init__(self,root,argv): self.root = root self.root.resizable(False,False) self.addmenubar() self.frame1=Frame(self.root) self.frame1.grid() frame2=Frame(self.root) frame2.grid(row=1) self.scrollbar=Scrollbar(frame2) self.scrollbar.pack(side=RIGHT,fill=Y) if sys.platform == "win32": self.txt=Text(frame2,font=("Courier New",8),yscrollcommand=self.scrollbar.set,width=90,height=21) else: # Avoid font problems (? I don't remember the reason for this) self.txt=Text(frame2,yscrollcommand=self.scrollbar.set,width=90,height=21) self.txt.pack(expand=1,fill=Y) self.scrollbar.config(command=self.txt.yview) self.screen=Redirect(self.txt.insert,self.root,[END,self.txt]) # Oh yeah! Could I have done it in a more roundabout way? self.screen.write("Support GaussSum by citing:\nN.M. O'Boyle, A.L. Tenderholt and K.M. Langner. J. Comp. Chem. 2008, 29, 839-845.\n") frame3=Frame(self.frame1,relief=GROOVE,borderwidth=3) frame3.pack(side=LEFT,anchor=W) self.middleframe=Frame(self.frame1,width=380,height=140) self.middleframe.pack(side=LEFT) # Thanks to the students from Ulm for the next line # which prevents self.middleframe resizing when you choose a different option self.middleframe.pack_propagate(0) self.frame4=Frame(self.middleframe) self.frame4.pack(side=LEFT) self.script = StringVar() self.b3=Radiobutton(frame3, text="Search file", variable=self.script, value="FIND",command=self.option,state=DISABLED) self.b3.pack(anchor=W) self.b0=Radiobutton(frame3, text="Monitor SCF", variable=self.script, value="SCF",command=self.option,state=DISABLED) self.b0.pack(anchor=W) self.b1=Radiobutton(frame3, text="Monitor GeoOpt", variable=self.script, value="GEOOPT",command=self.option,state=DISABLED) self.b1.pack(anchor=W) self.b2=Radiobutton(frame3, text="Frequencies", variable=self.script, value="IR_RAMAN",command=self.option,state=DISABLED) self.b2.pack(anchor=W) self.b5=Radiobutton(frame3, text="Orbitals", variable=self.script, value="MO",command=self.option,state=DISABLED) self.b5.pack(anchor=W) self.b4=Radiobutton(frame3, text="Electronic transitions", variable=self.script, value="UVVIS",command=self.option,state=DISABLED) self.b4.pack(anchor=W) ## self.b6=Radiobutton(frame3, text="EDDM.py", variable=self.script, value="EDDM", command=self.option,state=DISABLED) ## self.b6.pack(anchor=W) ## self.b7=Radiobutton(frame3, text="NMR.py (beta)", variable=self.script, value="NMR", command=self.option,state=DISABLED) ## self.b7.pack(anchor=W) self.b3.select() self.frame5=Frame(self.frame1) self.frame5.pack(side=LEFT) self.photo = PhotoImage(file=os.path.join(installlocation,"mesh2.gif")) # Doesn't work if don't use self. Button(self.frame5,image=self.photo,command=self.runscript).pack(side=LEFT) self.root.bind("", self.runscript) x = (self.root.winfo_screenwidth()-652)//2 # The window is 652x480 y = (self.root.winfo_screenheight()-580)//2 self.root.geometry("652x480+"+str(x)+"+"+str(y)) # Get the window dead-centre self.error=ErrorCatcher() # Read in the preferences from the preferences file. # If it doesn't exist, create one using the defaults. self.readprefs() if len(argv)>1: # What to do if a filename is passed as an argument if os.path.isfile(argv[1]): # Does it exist? self.inputfilename=os.path.basename(argv[1]) t=os.path.dirname(argv[1]) if t: os.chdir(t) # Create an instance of the parser self.logfile = ccopen(self.inputfilename) self.fileopenednow() else: self.screen.write(argv[1]+" does not exist or is not a valid filename\n") self.inputfilename=None else: self.inputfilename=None ### Read in the nmr standards file (if it exists) ## self.nmrstandards = NMRstandards(self.settings['nmr.data']) def option(self): # What to do when they choose a script s=self.script.get() self.frame4.destroy() self.frame4=Frame(self.middleframe,width=380) self.frame4.pack(side=LEFT) if s=="SCF" or s=="GEOOPT": Label(self.frame4,text="Leave out the first n points").pack(side=LEFT) self.numpts=Entry(self.frame4,width=3) self.numpts.pack(side=LEFT) self.numpts.insert(0,"0") self.reparse = IntVar() ckb = Checkbutton(self.frame4, text="Reparse first?", variable=self.reparse) ckb.pack(side=LEFT) elif s=="IR_RAMAN": frame5=Frame(self.frame4) frame5.pack(side=TOP) frame6=Frame(self.frame4) frame6.pack(side=TOP) frame7=Frame(self.frame4) frame7.pack(side=TOP) frame8=Frame(self.frame4) frame8.pack(side=TOP) frame9=Frame(self.frame4) frame9.pack(side=TOP) Label(frame5,text="Start:").pack(side=LEFT) self.start=Entry(frame5,width=5) self.start.pack(side=LEFT) self.start.insert(0,self.settings['ir_raman.start']) Label(frame5,text="End:").pack(side=LEFT) self.end=Entry(frame5,width=5) self.end.pack(side=LEFT) self.end.insert(0,self.settings['ir_raman.end']) Label(frame5,text="Num pts:").pack(side=LEFT) self.numpts=Entry(frame5,width=6) self.numpts.pack(side=LEFT) self.numpts.insert(0,self.settings['ir_raman.numpoints']) Label(frame5,text="FWHM").pack(side=LEFT) self.FWHM=Entry(frame5,width=3) self.FWHM.pack(side=LEFT) self.FWHM.insert(0,self.settings['ir_raman.fwhm']) Label(frame6,text="Scaling factors:").pack(side=LEFT) self.scale=StringVar() r=Radiobutton(frame6,text="General",variable=self.scale,value="Gen") r.pack(side=LEFT) self.scalefactor=Entry(frame6,width=5) self.scalefactor.insert(0,'1.00') self.scalefactor.pack(side=LEFT) r2=Radiobutton(frame6,text="Individual",variable=self.scale,value="Indiv") r2.pack(side=LEFT) r.select() Label(frame7, text="The following are used to calculate Raman intensities:").pack() Label(frame8, text="Exc. wavelength (nm)").pack(side=LEFT) self.excitation = Entry(frame8, width=6) self.excitation.pack(side=LEFT) self.excitation.insert(0, self.settings['ir_raman.excitation']) Label(frame8, text="Temp. (K)").pack(side=LEFT) self.temperature = Entry(frame8,width=6) self.temperature.pack(side=LEFT) self.temperature.insert(0, self.settings['ir_raman.temperature']) if not hasattr(self.data, "vibramans"): self.excitation.configure(state=DISABLED) self.temperature.configure(state=DISABLED) elif s=="FIND": frame6=Frame(self.frame4) frame6.pack(side=LEFT) frame7=Frame(self.frame4) frame7.pack(side=LEFT) self.searchrad=StringVar() for i in range(4): t="find.text%d" % (i+1) Radiobutton(frame6, text=self.settings[t], variable=self.searchrad, value=self.settings[t]).grid(sticky=W) r=Radiobutton(frame6, text="Custom", variable=self.searchrad, value="Custom") r.grid(sticky=W) r.select() self.customsearch=Entry(frame6,width=15) self.customsearch.grid(row=4,column=1) self.customsearch.insert(END,"Enter phrase here") self.casesensitive=IntVar() casetick=Checkbutton(frame6,text="Case sensitive",variable=self.casesensitive) casetick.grid(row=4,column=2) elif s=="MO": frame8=Frame(self.frame4) frame6=Frame(self.frame4) frame7=Frame(self.frame4) frame8.pack() frame6.pack(side=TOP) frame7.pack(side=TOP) self.MOplot=IntVar() self.MODOS=Radiobutton(frame8, text="DOS", variable=self.MOplot, value=False) self.MODOS.pack(anchor=W) self.MOCOOP=Radiobutton(frame8, text="COOP", variable=self.MOplot, value=True) self.MOCOOP.pack(anchor=W) self.MODOS.select() Label(frame6,text="Start:").pack(side=LEFT) self.start=Entry(frame6,width=5) self.start.pack(side=LEFT) self.start.insert(0,self.settings['mo.start']) Label(frame6,text="End:").pack(side=LEFT) self.end=Entry(frame6,width=5) self.end.pack(side=LEFT) self.end.insert(0,self.settings['mo.end']) Label(frame6,text="FWHM:").pack(side=LEFT) self.FWHM=Entry(frame6,width=5) self.FWHM.pack(side=LEFT) self.FWHM.insert(0,self.settings['mo.fwhm']) self.makeorigin=IntVar() self.makeoriginbtn=Checkbutton(frame7,text="Create originorbs.txt?",variable=self.makeorigin) self.makeoriginbtn.pack(anchor=W) elif s=="UVVIS": frame7=Frame(self.frame4) frame7.pack(side=TOP) frame6=Frame(self.frame4) frame6.pack() self.UVplot=IntVar() self.UVbox=Radiobutton(frame7, text="UV-Visible", variable=self.UVplot, command=self.UVupdate, value=True) self.UVbox.pack(anchor=W) self.CDbox=Radiobutton(frame7, text="Circular dichroism", variable=self.UVplot, command=self.UVupdate, value=False) self.CDbox.pack(anchor=W) self.UVbox.select() Label(frame6,text="Start:").grid(row=0,column=0) Label(frame6,text="nm").grid(row=1,column=1) self.start=Entry(frame6,width=5) self.start.grid(row=0,column=1) self.start.insert(0,self.settings['uvvis.start']) Label(frame6,text="End:").grid(row=0,column=2) Label(frame6,text="nm").grid(row=1,column=3) self.end=Entry(frame6,width=5) self.end.grid(row=0,column=3) self.end.insert(0,self.settings['uvvis.end']) Label(frame6,text="Num pts:").grid(row=0,column=4) self.numpts=Entry(frame6,width=5) self.numpts.grid(row=0,column=5) self.numpts.insert(0,self.settings['uvvis.numpoints']) self.fwhmlabel=Label(frame6,text="FWHM",width=6) self.fwhmlabel.grid(row=0,column=6) self.fwhmunits=Label(frame6,text="1/cm") self.fwhmunits.grid(row=1,column=7) self.FWHM=Entry(frame6,width=5) self.FWHM.grid(row=0,column=7) self.FWHM.insert(0,self.settings['uvvis.fwhm']) self.eddm = IntVar() self.eddmbtn = Checkbutton(frame7, text="Create EDDM script?", variable=self.eddm) self.eddmbtn.pack(anchor=W) gaussdir = folder(self.screen, self.logfile.filename, create=False) if (len(glob.glob(os.path.join(gaussdir, "*.fck"))) == 0 and len(glob.glob(os.path.join(gaussdir, "*.fchk"))) == 0 and len(glob.glob(os.path.join(gaussdir, "*.chk"))) == 0): self.eddmbtn.configure(state=DISABLED) def createnmrpanel(self,parent): # Sets up the Panel for the NMR options frame6=Frame(parent) frame6.grid(row=0,column=0) # Set up the Radiobuttons self.nmrrb = StringVar() # Extract, Comment, Listbox self.nmrrb1=Radiobutton(frame6, text="Just extract NMR data", variable=self.nmrrb, value="Extract",command=self.nmrrbcb) self.nmrrb1.pack(anchor=W) self.nmrrb2=Radiobutton(frame6, text="Take level of theory from comment", variable=self.nmrrb, value="Comment",command=self.nmrrbcb) self.nmrrb2.pack(anchor=W) self.nmrrb3=Radiobutton(frame6, text="Take level of theory from listbox", variable=self.nmrrb, value="Listbox",command=self.nmrrbcb) self.nmrrb3.pack(anchor=W) self.nmrrb1.select() # Set up the Listbox frame7=Frame(parent) frame7.grid(row=1,column=0) nmrscrlbar=Scrollbar(frame7,orient=VERTICAL) self.nmrlbx1=Listbox(frame7,yscrollcommand=nmrscrlbar.set,height=5) nmrscrlbar.config(command=self.nmrlbx1.yview) nmrscrlbar.pack(side=RIGHT,fill=Y) self.nmrlbx1.pack(side=LEFT,fill=BOTH,expand=1) for x in self.nmrstandards: self.nmrlbx1.insert(END,x['theory']) self.nmrlbx1.select_set(0) self.nmrlbx1.configure(state=DISABLED) # Set up more Radiobuttons frame8=Frame(parent) frame8.grid(row=0,column=1) self.nmrrb2 = StringVar() # Calculate, Standard self.nmrrb2a=Radiobutton(frame8, text="Calculate relative ppm", variable=self.nmrrb2, value="Calculate") self.nmrrb2a.pack(anchor=W) self.nmrrb2b=Radiobutton(frame8, text="Add new standard", variable=self.nmrrb2, value="Standard") self.nmrrb2b.pack(anchor=W) self.nmrrb2a.select() self.nmrrb2a.configure(state=DISABLED) self.nmrrb2b.configure(state=DISABLED) def nmrrbcb(self): # What to do when the user chooses one of the NMR radiobuttons # (NMR RadioButton CallBack) value=self.nmrrb.get() if value=="Listbox": # Configure the listbox self.nmrlbx1.configure(state=NORMAL) else: self.nmrlbx1.configure(state=DISABLED) if value=="Extract": # Configure everything self.nmrrb2a.configure(state=DISABLED) self.nmrrb2b.configure(state=DISABLED) elif value=="Listbox": self.nmrrb2a.configure(state=NORMAL) self.nmrrb2b.configure(state=DISABLED) else: self.nmrrb2a.configure(state=NORMAL) self.nmrrb2b.configure(state=NORMAL) def UVupdate(self): # What to do when the user chooses UVVis or CD for UVVis.py if self.UVplot.get()==False: # Choose CD self.fwhmlabel.configure(text="sigma:") self.fwhmunits.configure(text="eV") self.FWHM.delete(0,END) self.FWHM.insert(0,self.settings['uvvis.sigma']) else: # Choose UVVis self.fwhmlabel.configure(text="FWHM:") self.fwhmunits.configure(text="1/cm") self.FWHM.delete(0,END) self.FWHM.insert(0,self.settings['uvvis.fwhm']) def runscript(self,event=None): # What to do when the user clicks on the GaussSum logo # to run the script if not self.inputfilename: self.screen.write("You need to open a log file first\n") return # Do nothing if no file opened s = self.script.get() self.txt.delete(1.0, END) worked=False try: if s=="SCF": if self.reparse.get(): self.data = self.logfile.parse() worked = SCF(self.root,self.screen,self.data,int(self.numpts.get())) elif s=="GEOOPT": if self.reparse.get(): self.data = self.logfile.parse() worked = GeoOpt(self.root,self.screen,self.data,int(self.numpts.get())) elif s=="IR_RAMAN": worked = Vibfreq(self.root,self.screen,self.data,self.logfile.filename,int(self.start.get()),int(self.end.get()),int(self.numpts.get()),float(self.FWHM.get()),self.scale.get(),float(self.scalefactor.get()),float(self.excitation.get()),float(self.temperature.get())) elif s=="FIND": if self.searchrad.get()=="Custom": worked = Search(self.screen,self.logfile.filename,self.customsearch.get(),self.casesensitive.get()) else: worked = Search(self.screen,self.logfile.filename,self.searchrad.get(),1) elif s=="MO": worked = Popanalysis(self.root,self.screen,self.data,self.logfile.filename,float(self.start.get()),float(self.end.get()),self.MOplot.get(),float(self.FWHM.get()),self.makeorigin.get()) elif s=="UVVIS": worked = ET(self.root,self.screen,self.data,self.logfile.filename,int(self.start.get()),int(self.end.get()),int(self.numpts.get()),float(self.FWHM.get()),self.UVplot.get(),self.eddm.get()) ## elif s=="NMR": ## listboxvalue=self.nmrlbx1.curselection() ## try: # Works for both list of strings and list of ints (see Tkinter documentation for details) ## listboxvalue=map(int,listboxvalue) ## except ValueError: pass ## if len(listboxvalue)>0: ## selected = self.nmrlbx1.get(listboxvalue[0]) ## else: ## selected = [] ## worked=GaussSum.NMR.NMR(self.screen,self.logfile,self.nmrrb.get(), ## selected,self.nmrrb2.get(),self.nmrstandards) except: traceback.print_exc(file=self.error) # Catch errors from the python scripts (user GIGO errors, of course!) messagebox.showerror(title="The script is complaining...",message=self.error.log) self.error.clear() self.root.update() def addmenubar(self): """Set up the menubar.""" menu = Menu(self.root) self.root.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File", underline=0, menu=filemenu) filemenu.add_command(label="Open...", underline=0, command=self.fileopen) filemenu.add_command(label="Settings...",underline=0, command=self.preferences) filemenu.add_separator() filemenu.add_command(label="Exit", underline=1, command=self.fileexit) viewmenu=Menu(menu) menu.add_cascade(label="View", underline=0, menu=viewmenu) viewmenu.add_command(label="Error messages", underline=1, command=self.showerrors) helpmenu = Menu(menu) menu.add_cascade(label="Help", underline=0, menu=helpmenu) helpmenu.add_command(label="Documentation",underline=0, command=self.webdocs) helpmenu.add_separator() helpmenu.add_command(label="About...", underline=0, command=self.aboutdialog) def aboutdialog(self,event=None): # Soaks up event if provided d=AboutPopupBox(self.root,title="About GaussSum") def showerrors(self): self.screen.write("Log of error messages\n%s\n%s\n" % ('*'*20,self.error.longlog) ) def fileexit(self): self.root.destroy() def fileopen(self): if self.inputfilename!=None: mydir=os.path.dirname(self.inputfilename) else: mydir="." inputfilename = tkinter.filedialog.askopenfilename( filetypes=[ ("All files",".*"), ("Output Files",".out"), ("Log Files",".log"), ("ADF output",".adfout") ], initialdir=mydir ) if inputfilename!="": self.inputfilename=os.path.basename(inputfilename) os.chdir(os.path.dirname(inputfilename)) # Create an instance of the parser if hasattr(self, "logfile") and self.logfile!=None: self.logfile.logger.removeHandler(self.logfile.logger.handlers[0]) self.logfile = ccopen(self.inputfilename) self.fileopenednow() def fileopenednow(self): """What to do once a file is opened.""" if self.logfile==None: messagebox.showerror( title="Not a valid log file", message=("cclib does not recognise %s as a valid logfile.\n\n" "If the file *is* valid, please send an email to " "gausssum-help@lists.sourceforge.net\n describing the problem." % self.inputfilename) ) for button in [self.b0, self.b1, self.b2, self.b3, self.b4, self.b5]: button.configure(state=DISABLED) return # Prevent the logger writing to stdout; instead, write to screen self.logfile.logger.removeHandler(self.logfile.logger.handlers[0]) newhandler = logging.StreamHandler(self.screen) newhandler.setFormatter(logging.Formatter("[%(name)s %(levelname)s] %(message)s")) self.logfile.logger.addHandler(newhandler) try: self.data = self.logfile.parse() except: messagebox.showerror( title="Problems parsing the logfile", message=("cclib has problems parsing %s.\n\n" "If you think it shouldn't, please send an email to " "gausssum-help@lists.sourceforge.net\n describing the problem." % self.inputfilename) ) for button in [self.b0, self.b1, self.b2, self.b3, self.b4, self.b5]: button.configure(state=DISABLED) return self.screen.write("Opened and parsed %s.\n" % self.inputfilename) has = lambda x: hasattr(self.data, x) self.b3.configure(state=NORMAL) # Search if has("scftargets") and has("scfvalues"): self.b0.configure(state=NORMAL) else: self.b0.configure(state=DISABLED) if has("geotargets") and has("geovalues"): self.b1.configure(state=NORMAL) else: self.b1.configure(state=DISABLED) if has("vibfreqs") and (has("vibirs") or has("vibramans")): self.b2.configure(state=NORMAL) else: self.b2.configure(state=DISABLED) if has("etenergies") and has("etoscs"): self.b4.configure(state=NORMAL) else: self.b4.configure(state=DISABLED) self.b5.configure(state=NORMAL) # Orbitals ## self.b6.configure(state=NORMAL) # EDDM ## self.b7.configure(state=NORMAL) # NMR self.b3.invoke() # Click on Find.py self.root.title("GaussSum - "+self.inputfilename) def preferences(self): # The Preferences Dialog Box oldsettings=copy.deepcopy(self.settings) # Remember the old settings d=PreferencesPopupBox(self.root,self.settings,title="Settings") if self.settings!=oldsettings: # if there are any changes self.saveprefs() def getsettingsfile(self): # Check for GaussSum.ini in $APPDATA/GaussSum2.2 (XP) # or $HOME/.GaussSum2.2 (Linux) if sys.platform == "win32": settingsfile = os.path.join(os.getenv("APPDATA"),"GaussSum2.2","GaussSum.ini") else: settingsfile = os.path.join(os.getenv("HOME"), ".GaussSum2.2","GaussSum.ini") return settingsfile def saveprefs(self): # Save the settings settingsfile = self.getsettingsfile() writeoutconfigfile(self.settings,settingsfile) def readprefs(self): # The default settings are overwritten by any existing stored # settings. self.settings = { 'find.text1':'SCF Done', 'find.text2':'k 501%k502', 'find.text3':'imaginary', 'find.text4':'Framework', 'ir_raman.start':'0', 'ir_raman.end':'4000', 'ir_raman.numpoints':'500', 'ir_raman.fwhm':'10', 'ir_raman.excitation':'785', 'ir_raman.temperature':'293.15', 'mo.start':'-20', 'mo.end':'0', 'mo.fwhm':'0.3', 'uvvis.start':'300', 'uvvis.end':'800', 'uvvis.numpoints':'500', 'uvvis.fwhm':'3000', 'uvvis.sigma':'0.2', } settingsfile = self.getsettingsfile() if os.path.isfile(settingsfile): # Check for settings file # Found it! - so read it in. self.settings.update(readinconfigfile(settingsfile)) else: # Initialise the settings file (and directory) settingsdir = os.path.dirname(settingsfile) if not os.path.isdir(settingsdir): os.mkdir(settingsdir) self.saveprefs() # Save the inital settings file def webdocs(self): if hasattr(sys, "frozen"): # Using cx_Freeze webbrowser.open(os.path.join(installlocation, "Docs", "index.html")) else: webbrowser.open(os.path.join(installlocation, "..", "Docs", "index.html")) GaussSum-3.0.2/gausssum/geoopt.py0000666000175000017500000000372413222437274015475 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import os import sys import math # from Tkinter import * from .plot import DisplayPlot from .mpl import MPLPlot def GeoOpt(root, screen, logfile, numpts): screen.write("Starting GeoOpt.py\n") deviation = [] for i in range(len(logfile.geovalues)): dev = 0 for j in range(len(logfile.geotargets)): if abs(logfile.geovalues[i][j]) > logfile.geotargets[j]: dev += math.log(abs(logfile.geovalues[i][j]) / logfile.geotargets[j]) deviation.append(dev) if len(logfile.scfenergies) >= numpts+2: # If there are two points to plot g = MPLPlot() g.setlabels("Optimisation Step", "Energy") data = list(zip(range(len(logfile.scfenergies)-numpts), logfile.scfenergies[numpts:])) g.data(data) g.data(data, lines=False) DisplayPlot(root, g, "Geometry optimisation") if len(deviation) >= numpts+2: h = MPLPlot() h.setlabels("Optimisation Step", "Deviation from targets") data = list(zip(range(len(deviation)-numpts), deviation[numpts:])) h.data(data) h.data(data, lines=False) h.subplot.set_ylim(bottom=0) DisplayPlot(root, h, "Deviation from targets") else: screen.write("I need at least two points to plot\n") screen.write("Finishing GeoOpt.py\n") GaussSum-3.0.2/gausssum/mesh.gif0000666000175000017500000010427413222437274015253 0ustar noelnoelGIF89a@      .' !%" */+#-&?",%%)*5( 6381176<9F42<9%?77a4S8 CACA G>>KEJH RINKYH QG7OFGKNMP jJ PRTQYPtI aO[QULMRT}H SUaNLXY ]XaW\[yR Z[iX sU mW eZQ_UTMOS_[__^^__ VLJl`Wdc}] icv` [pc V^j^^c``ig kijd;_ ]{gnlf qnj d {mwo g `so ps i/\uq5h?q uo[twxpL}tt o zwh {nmspqyzw yz tvsu q ~}y }vs xv ~ ||~v|r1tOM%m   LEYTΜR2˗0PMgncg0D%H;~@AMϞaժ pj]٪n CIG]Ygbߨ ޺Tq 8.,>[~IgllHz$Z\MW 3TY_GFB7B >h2*qJˆne3e0WvjW-[L^a{_}L~0eQ7 -Rp!R>5HE4n"G0j iMJu&!I\KAW+KzQ`abI]L%CFV`eO~`umBFh ٕ*ɄFHBiDbl 4uJ+DmWe*| u3`cON LyS]6PXvŧi$ꧥ^\dz rޢg2l6&k)Agi MAhnhpt[mz_/}pcUZQcl{mGVineںcbU_īW*`LAVnGM-M)WIk  c"ݺGضd#) iƨcUbg̒p3}nJK[XN^)e}AMbSeJȵIimL$i4,CRR}rv+w(2E-J5% 0xsϥl%^TG4cAS+i0<+T\^3@MVCВC0ɶZQH~xl=T˽ OOG+QX0}p:={slBƔ"_z|iKͺc0|VObcE"b0RT$oxظ~me0fK+'@/}1Fᬗ=_h g3x ISYQr 3l4)^a!LVct^ UͰ@"mBLH @(0*Y sKuY`r88Q⼄ 1$`L)@ 2HDq/DJCf`d9E-+,YYט5 @@/&OH _ @@$H}#է. IM\I# I"蔧7ApU$7[h RzIR.1 fUb,V` K2k#(/"CgN EWd*C0 (e}̤[: E0sv_xH-IєJQsv PET/!, vCgj:$/I\*ǝLb}|k,{x]V) @Lmk;ynNt-._Ș=pYȘ7б.t? ;Ϸ"Oҗ?c{~Fӛ.u*|զu15p,K]wk@O0|(Z9[P+һ.O \`9Dlw}˦7P>o~Wu] @ uV%gO{kOUIJ1aD8icAb0q`5˻Z(@uxZ0F`Z`;F`CP[hhd𬅠ط[4p;H ݈]q{5 꺖l),YZx@`Qs kkۑp&)/ưN{G}Z{`;X`R hM j[ <\Yd`id@}'{$P{4G;ՈG&> +C2;ET\[: m q+@v._uUay9c+@t80ɓl|Z [nؚBL߻C0Năŗ;ż,ZI˕ 3K[td[I!B ݂{;52yL^!HPKɏ l@EpEjh |^n [j}d+3`{$T9˽x Sq:lllH 2W(z' |LBh =+@;$\69mP Am\p `n|ʪ JٗR0˵|$5{؈-$躴&m5O8ܹfU[ǡ:`1!DA` \N~0K Tm@ip6P ii@9\ɘ j @ ޝЙR+}z[,P =kG̗kHaߒS `];b+tl۷ULOLpl+Q-P.~i00}xBpiɜݭ 4Ȭiz k޳Qk z^~=̞d;`^81\Q 4U;A mcH,.WKJ͖y&+Pa128~}g`Q`pqP   @ `jX |ͺˊ] 4{ZZB Sl]HaPzd[tWIJ!vޡz^y_[qv/@*M.055(ꙮ2g0W=papBpx P ǀw{v=٬: [< Fy@mnbq z)YM>or6B JgNXo.J)th D „ٻҞG q3 ֦M>Dh,S̘2Fq]*&|CGTCT)tM:͖U^Ś* d~5!Ld ͆B31Ɛ =#Lћ٤~ih徣j.8l_;@oǙrA3cP !(F.g+: fdrq4tH(XYy-AXx'7GcA [ɛ<z!V7|nPDt|kG)(/"sߤ~/0= "(h\q W8 >0b "aBN׆*^1R)y:fB<E`r1D ֐ qB,eE=rALT|lXf刄,"Dib<8X<vӝ !Un`A!sعZ-D.ɦp4$4n(Pp? )8<JP,` .qJ q2&[04.rƌ\СE c.ѹ4f-M$pA`p-졜T#Q  ^VU#d ,=r\1:5%Bu01U"`OBʑ୥(F%{ VFA/=X_׸+FbXT9s2(`Oh 6 pD$›\젅 NDnӸEn;%HF8K֮ujh U Zկ ^PWO$_ {Vڃ 0g"?N i!rz9I3F1NʖWx7цVU3PGr},7w#A%ϐqe/]-Ut0Wz7!x)ޛ! =ޛU K0')@?, `c\LK 68Fq-kX "̀.d!Tq$("1"YbO?I?Zϵ"P!x"\$pt[U4 (g<33Xx!sU1vZ|ȃtQ#[ ,])<"EFoP>C8z!T>Uz#+\p;hˢ\0 _âĐ-!e29e# FA38 )ZɭBPh+( D.vs,*Ê1]h4ĭ(XY@91>}A$[2s!T@#$C2) ف((`0r13dF9!8eblj2ܟ#еs{6(#`P. @}P1cXD>,CshFtĂˊ9 ʓL<;UrT>uv2HBTL0]dX<ϊ)a3\4 e;y?mj sF5&шChPHa4qYKI]xG?Azè8D2*uɲ XE5W"Đ)NI1ʳ9.4iR3L?R&1ĦhF 06xFnFD=38,=JGr7Hq )YЅRH}lep̭8ċ8 (Ea/2)8iKP<념Tن#:]$lJf" -$"`GP>tRsMgɜJc6Z)*=%ĺφ0 2{A~", 4!+]PCT<@</(<X!"ӵN=cm iw0 :ELпC]H6 m+*-K%s)Ր q~i`lϪKĵSce]VM;X iVS Aқ+}ӪQ NA(xx0iJHs}2EKŒmeWk Ō#8A8I<"8$` L CO(Y(5)~Hٕ\VEY~Rs(z:(5=|-S%A4Mٟ֞mSzaUPr ځ8TܬM;,FNżC_$B4 0l:0@ 7lFYR] 8 oJ.+=8PU))\P\iEF٨R*> 6]zGx$W \$b|V2%VY<ځPLZc!"6 /Z<83fJ8\_0%ɸ<0iEf8fתmdCTm-PJ(Y-ٜ\>`9^;S;9c YP`j**]~'KdC)wuEJ+x3<ŢI*<S0gJ9KT^[8Ap/2b-D U ÃfĘ8H3]0Ȃ6hDD0hPXfMh^Yif=~'ϚG ]3Cgw+ 5u"w{0E]p9pQ2JV9qh[R13j/^#5$`.>_XƨKZ5U(hܚѽ$isc-8՗*>gHdt~޽Z8И8Tj(T"P 9--]<~ ^\#9ckvPeӞQ4b e:((i HZ4\-xf8iF]mۭtTP8 5yVT<<0 3mGQݶ6#\ w?kb 6cS^CQk,`O<ꮁ]P Y5R6 ~iE&*f}Vhg2ᣞ4K?"PZeAPspbPth _L=s!^+5X(U V<VP7lcL!W"GNw{Mبy uh%{7Z8 q3BaZ]TCKf-NN K:wv.QǸ#A(gXʂ"& D P%h"ƌ7^,%#Ȑ"A(i A(Wy|2"1&Μ9) Pi֬}Bg -jQ]#2m* pBĊ+Cc ?z|J1L+2Ҡ#L3~D s%͡0Qz!D߼q j +WzSڶۢES6,W,W@5'8B)p4B)|/a:Ǖ3,C U\0DҧOtiIWjwy{rJt/O?=3*iQ%A@X!PTrX-&XWA BCQEQ0(C]wW\1!iUaQ\cb+B,XH68sf=:ER"x۟HOdrg!7н P}D  `Oz._@sP946Dk:Tp1⋄+`sXhJWdfSjq6Z"1z 9U@_"ЈDYX6 h}CԺֶMq>AⵀJ@$_ӫ@}܁6,%,`p,qNu$X>d0d &C1e^j;D)kqbhՓ EHiZ+P >7 P!rn X0VF6+v]B6O{5ԫeƁc p@ ?1YB p@<t ի@q4F! RT+_fCR9Le3֢cJ$`7ISɈ*y4{qZ< cġV= }5x,l(?w#Or떵/ׂݦE(8~w &dl(R .?HM<Ԑ;<L$]M&x>8NtWN Nҿ 5z̔&@Q D8ԉ~ V!zC\F[to0BD~D0`ҮDt#Ex'@tK@ڐ5|݃@zRƀŠ cb%yUDE.5Yr}u Uf@G#-tڰ)ҍ qpCy"Lfy #SeETIJ  =B.]3׉]<9|gKz+r#׽9((| Hw#!aB1ۉJ7iFZe 01&0\68Ճ;1miDAiZ o.@A - p %4G_\-`A_y(NQ?PA~V,ԃ/W`Āŀ@ME\P,a`&`k,MR.QC48;6( }H3 P ɉp .Bh AXM C8%Y + D:Pߚ'u~pqd(C,OE]m!kƃ$ K,1 hTc4590 8XaMXDфA#腊AS!a(U"PXb0d""p". b**Id+~M(E0.RT;x]ׅp\[C1\ X @ @:(U mЬth%c.Q,TO/Ă8x(jH ׳t X~+V@L"B&҂&e)JDH?3TQdFׅp #,ȃl\`'EQ!(eZ̿I` H%4KC./0H5̐ZF[fLxmTB", A@M%\b&Y @ c`dBL_b`&Gx@% x&& <@|0 d͸E#vl_*1 We0Cû9jm3)lU ^ei̩i Ȁ~D܌% HdeAAAH \b'vi+BTr;x gnUT@=P \P\Ƭ >]hF(=!&< d@jI*%:C` TF1(T x[aBp  F ph|OB.לyIĸ\"B G(}b!@*dt8p<() H| 8*ǶpԵRB[ ea6,J9L@Ă,ɂ/,F[ N)8:&aBDg) ť -T@=/*)lcoT+&e{>e$(\ [k^Q\fJ(+lUXY$ lf 8jp Z[ԃ6(»D h8R0ZHN 38 B/Dܬ89Dô[ā Ch/փj`Qǿ1FȂ6,C# m ,6B,@ BL%BhDʫ?Iҍ'`++Dx ػ:ā ~ҶOkƃ[,@^oLo+D d!ܪnl/hCĪpEp ̮s.> j4BB4 )@"al/6/Ml0 Ciʉ'5!AD@"W V@ fM+ lxz!`\p F,5,!VƂ/hiHH#ʊ 4@1n 6+H,8':<>l@m)\*j>iad)hfƻUDJ /]A+_iO @#_? (ƋIC V%@H] | X8I>K=sZ;Bo4F"3do^%p(ZtX /a*;hbh B"D.'/_/YC,HHm\W.-U!ʕ/%J Ԁ5_JB63 LP@"I6d˃snx#8(MӲJ q5mvM*YnBm(%BpA @n;xCo'u/4½VrD\mYdEp3 J]6 @\n #(9-hKk68qo/ ܴ+xH Aքp@ D n[s?x/(W@b]^ OJopQ@@,(p (MR9[\6C,D `t#Zo _A/C򎣹B+/3|{#6| {Ҫk{#4iD ATSMA51 6uC:|TM(Lhdŧ4ϤTfQ;G zRW ,^4 l0<`,_o`d$;CC=l `cB=(4}:JE{6{T ֿM[1W\ԝ@RZ}K*lq/6 ̍`@cHǘFb_l:#~@9tWZD:@=>,@ZLF1p.LA€H(\uE(+bN#6wZ&>w5:W% S3aPޠOrHxJA]3ԧ tL%KRw&$/1'ށ~`˅EK.T6cq8j 0uv>cA0;@%40фPЦ8BKw6prYXBY( ֦m[yQ@!XGi|i kb#Q9K挣 u߭Dp!xJ| 6` 38cr.\̉976sC(7Ə-) ~8RnhWDX|qI_D!Yy)9Gbzi*Esebzb9^E88艟mVmdA0eQ&Vv]bF*ڳYS60Xڰ`T D'7K08.P"r%|/R_D9Xkp9v&s8  txSY|lשO-pΐA ?v׈CPpE ZG453K##LD?0UZ0gHC1>^E,rыaD#۰UM1}E.iQtY3>Id*q잢:pN(XA _c}OQ5eXCUpp4|5fOTC~U 2x!DR@m~2 ;-AV*CU~Zȵ˜Nh$ x 删Jx,nN<鎶I`)HJCB l'%r!A,lB}СyB(wnCzN:EF': G!؀ \( NfLoaK@ h>(Gl#P,b vD(uNFT0h+ȩ0BM`BƝB#Dmۺ(ۺ(\V$ᑈeдj *%GDގLo ڠ Ŵ20h, d 3@Ipdx0pu+: )QeLRÌ|bt]2^$( Eȝ6 ZlUazvNAN Ft3#@Dde垢   ') i,1K lZv fch&ϊIC \.988 E@þq.ŝ<࢏d d 8QvF  f'zAāG! o:⫢J8,= ͠]V " \2& FH')#hq2(G# `KOe*NT>Lr+ 1-D,-(|- hFaP8 AY`o0qtv$BBQ\AK{*l@l"QTϞNTCP*2m& &e Ps255a36 ɉNװ e u\N9̱8{ Nh“IoM:U]5`+F|0,D :JR(%\W$`kA&&~"3r/3AVkHr>l2@`4AA'f|Ҧ*4o+O"L3tmO^FZ:bd@oNJB@"h"DNcw\a?R#F*KaK"9)jɤ2LKe,˧DPSS!8?zLS-Bjx 9(4: t4ghr1jw <@eD;o;H&.QI4*fO "# {_C :r, 0J։|<&*8E@!=@GvWAe 8!,zZJ#3?%XbYJP:ZM0#C( ڀ J&IL5w])~3_ilWTH.,+ѱQ݅-!."; #|\T)\Ϙ#G,ȍvXA 9fo6TWθ*H h1  IX  `E-,Y𒃓c`|Oz֒LE֖k* *҂-IF1Z"#9 %`n}N2 !?$ ~,(Ka I+dމ+!p]J5wA`''t3Z`84gxdD ?{c-F={̠3qhJ ixG0g9&?EI#?J, ,!QZre :f&LN Pebbr'n۶۬1c6lX\T]РFx'LYBړ4:54 RoG5b׿ >81H ;f 2d*[9sf"+2\!d[J2ٳ{b1  [b 2zIg@d18i*GHz5)odru@b*&Y)LmL1+^U!G\aUVmZi}gDg(Kg$Bb\TW~`cb${(@ "l0eJj "iAF4v4"͵ޤ0H-mCh@V KWod$H'0w8E^Jas(vB)g;S)P2U/AX.8LUCB&+ANA lhs ^=] C~>/?1??^}Җ0Pp44TM 01iM>EZQ2u:)=W`ٯ9͒:%{2dD .sšQ,Ua\JC)J'D$ .@`5FH'\gZ zEj>#OD+πRl~x(-E cLD1+\8e dvHKME6{Ne[ X0_U`ppчDpLJ~,+KSP0SSЙb-H=ˆ$HtOChJy1Tݝbխnn ԠtyTW9-1qp1Z1rk3klٳf e;Wlv]h3zCFt5+ѓaPY{Ç)HnqQ@TvBA{&jwޱW"'iBMTSqcC ppx%5FLSQTp W13*T3.X*y1Ybbs,ZbeshlxtwK灅 !+U'UWu**h$/4@8+C"p8h'A3/Y&&*36UD[~Cx G ?91; n!Ex+esffs(pxhVEmVWHg "H`{@tn"%Q'Md|$awZ-ZBA\[akw ~Є,v> KB86r27m!x(E ҅a;S ,ӌZ&Ј֘Ⓧ$aOGHu\`69p'Ky/SRZ .lAf1/kAbG$C=Q:K@ bքʀ)[xYc1N Y"Ru@yʭQ*A|A1U-aAEij\zS C NAwIILH4S/Jw)31dKNNm0NC  >h%O0G/6`6PrZ-*7J~h hΧRD0"' { GX 88J !xbw> [ыI/-B89s8{< N_$Z QPF,hRplQܙ >V# P '.`i07k4fv1Jmw}}hzw0%(G):K!ëbFcqλ !_@Lm+ {{yFM`RlSLk,<Ĭ#-,\S0wѡh:wK@38@1 I5i ̰ 7jWmY=j:j 4C3oD]!@Eb "=?IЏPeELVC!^M0MPxF'KTc0* ْ] {2Ghv6R@!% BM%I`8v|$A(ȁ RKl+9 P q;U eJaBv[Ut If{׀C@RMpLkg˿#2mPٖ(68R>m7f7ɚ|+? q `Ss jy۸x3jMKL:2 !`i5(QYEճv=?޳ -䃭Rܬp"(# Q>ٕҙh#&#.!7UCFD1j9 L#4*kPHPT*W'dv;BkZE=O0"zB]VVeiZ`R꫎`[=pY.૑AԗR\x-ZC0 :="#^yՔBjG:k05FNv=Yj˾BMD'>d ߇اO!`Ռa9hqBC42*i[ ;گ#O%ȺqV 9Cb'ޘZV-镞l" ҐnM _SOwy0N o0I@F!;Ɏ i@<%_^;j@T T,NvdM6lPJl{lڥkh ANIFVV;Q?? X?[^/78v'S U(cT$x߯s \4Z㊟==w {`FF;BeNoΚ&^?c$(# .D8)O1N#J!W„9'J!BDȌaԨKWrꕋ+P@Waʬ1&sɓSQ;*Nܶh\bաCLs&MaDY o-¥H3ZaƯ#`)M $I$k Pe̙5(P lt{kd=un O"')F G+=a;(K^]+VSDk/fѢY5*T񕞳|.WD:HJH>k.P`C/5 L 4PP2)lD73N -6`mjF nG!: Id(:&O9%h*ҋFtK9ǝmI/zκ6"9@ 6@bA-Pt J{a C+²>{+\al D}`( +]>w4_? W x@(FM^)CnH4% oW!F\H!rO :B`!~6. R@7|A_gRTD#Z Z"EEQhB^0CEi^%KwrQC`"h-Bɑ\G0B =X &@ |.F4i LMr_"p%/ɯmR'7hy U"eP6Y>BO;Az01!b*F ^C /@Ih) q4ؔ6qDGtӛ<)N'vPNKcT'`g<K#a Tbfhsd( qU>PEQpRݔBz֑'dIWhw; )JkV9>*BЎ E\bXP jAACe%Lfv M(U",pVԊ4 '[HI !s{%kh[+vV ,X54P5 ' )n" H/lv kϖ(k8*ڔ6kH-jWLV{mt8qPorI,ZыXzAXPSoxJAMB[neT;62ro:F1k}S'귿26`$ B. slCXQ`SY60-\ ?R谡`K U&CnanwQ1 jC]s0iJ{ZxArl3)ND_*Lg8 xڈVlHuQ`!40 $2\n5{ kB" 1=CAHi`7щf"J4nK#9?p춍.zw?i,Z Rb;rA a(C&2q K~fIl/ NmW&{\sknw=FCl D;!QJ (Auɦ݃}A Rik8CR*'8 ^qV)fΙk  v%q߭W{| :|7ǹ#sG>Azl#/#]J 䎍?F+TkLX/ܐc9;}UD2ٻvf>w҉0n^/6 GLB}]xK^tݝyLo^h@zD}8=uPlk ;.N N[LPB(r,+`ɰK>勍{9>[/(MPACRXb[;7  @ /j@D{ +9p pUxRxAGx I>ۚG;)<xAyA$ J UBk(=%T=ܺs[=$-p8EX@kE_T5E؂[&8Cѻ7tl9O)<|LIh 㹝KD# 04x 0KDD0q8LĬ#<@\HʸӰ*)Ȅ;BUTW8;E(> L+RP+6`,9C :, WP<>>ԾMDF&lFG$;D6 M?xʒBQ*JuA:S{E|J+ [d2PXwȆ?P & 5H7Hc&!e|T<\U\h>GX`Ip<I'AFhDMD`T-\Ǻ#qECHʧE[H/۸+jJMz$,F9H\KXXXN>MX,X@\M גICDD9ܼLLpЂVLZ,JQ,Edz L..dY,5 +ZM w`TѨ&[kR]NNQQLM(O؂"T8!L)#ɜGoS2_TYDY'(b)N[]6kk`fF~7nc5FmTUTj޵[Y[[i[i]a9THI(OH[[I-HgI~]\gg~d~ ( hCTW$C\b^h6c i~a.]5vc]ZuFiXvipĮgdBPd jUYXICn7\U^jD~j|g ^j&ل^%H3+⇆h8]kي cmemk ݐgvZ6kenYiafkV`jVM`iT0pF^TW^B PwHnҶ^L6mNmO.4/H <$/hm7m~Yb~C__Slk7~nk6Ydn_dPang[霾ipl]ۛl?i ɹ\egdyd)GQ{^LMƥ$^p~b[\]hA: pgp;o8=lvgh_p_Hl®`8oC]uH0paU%d~j(oa)OML+wx~؇x]P52(>s45_hqus09n;a~c~@wa6tnaqq&wUp>vPKgSwj&uS[gU{{{nuf5p]ݖb_u3m9b G0lXg9gvufnphg%:sFp" ggaÊYU^Zu&ٴic!4hΊ_ Cf׬V`UG

LjaN5Qmܦ[M $o+S]:OAהtDtEEqZ)w7\ԘX3M^bمV|2,x-`PV]zg5`A @i!/YgF-'Lo:=\c9:r3t_#_[δۊOF ʲ2?l;|tzc:k^8^W\bv6w0EB$ V `eygFۣsrxG9tZ6ƎzoG;$T;̢?.AA(EFwU; Kx(^T(IT"lPR8#g7^эCs1r0 KcG;QiuyĒMdD(NF B h-rы`6~Do`Dz!O9Xvk_9>ǎwik3g>^j$|HNr %DE3 bU1-Zh`*hP*<.qoe,Ow#{a= >jn-hGigϜFю&^&%MI*O hqZE0Η-?Q/܉x,Ey;юv 43 aȈG(145fmzv"@B>rET$&Y>1Q>Хj^zqX!43hWWmeI*aX&2YQ+j ¶N}%O/ӁRoHZGp0B*s۩rd-x>79@@fiݝ1j=6N;GaussSum-3.0.2/gausssum/mesh2.gif0000666000175000017500000001336313222437274015333 0ustar noelnoelGIF89aZC!!!!!!!!!!!!!)11))))!1!1)!!)!+#6#9- 91991!!!)!!1!!11!9)!)!))))1))9))91)))11)1111911919B!B)B1B1B9B9BBJ1J1J9JBJBR)W3ZBe<JJRJZJkJJJRRZRcRkRRRZZcZkZcckckkB1*A;5?1tbE&8L$홲cqrġ+Ƭ>1F|%玏5{FO`UMrV8XbbeL22|ⶍ;13fck?z2Lc `dc0c꤉fe1`r 3X $@` 5Cu cNt6@̐'&}Mט$Ly &>t|6qCP0`3!|LL2f 䐌7p7Uc(S'zq0HS7@L69w Ca̐]ǠMyL5c04cM'2$rt p )`a%Ѩ 9a@ :!Kz#,f1E}XB= qU;ġ!3 `SMV! -ҩQ $d TĢr uc<ڊ@ &y+DtCD`TCtv9&,TAUJO_iH!!@Hݰ^OWd`8C4c83 0͋ICwPjN9URAOρɴhJ Y  H縇=t[a+GXpy{& a pN #^ܪV%a4G*I-A fMk\MA^@$5BHny{bGrc+1hBSD$`8A `"%ɐxZd@! Eiњ/dxK0 4l! $,QM0(ʣ6,ya]]zHʣP<<`c' 6d SDoz4.ha C]H`?QCr yB6BL`Q= LcVB"bj!N'm ]0D$C kD$@سAd}$`m i$H.1'?Ϯ7KKȂh4׼NC$FA\E$ܬVC;X\zЇ> O4@L!phqz<Êx7U8- qVoG"_Jq 6ObD\נHg~{z'? tdJ b0#4W5% ЂIq U|3,ʍ tݜ4UT[ @4jS<"Qguۮ qud#LM#VIm4EMnO\*_(6)8H5z#3) p0q~#ߵx@" z' -:e/}Tw-n7@QPB xp@[ X$_:K+n߼% 4 (>CTQԣ dj0 wr_ji  GSP}cq g@ 6s7p fe*|"q'x*" fi(nbg p},0\wG%`~uf`k6@ElW`VTjT fncZ&r `j'vZ`^3(}FECwx6\ H7d  ii ^StZY0 gŇ|f憼 vTje^ifYPUs@g t 𐅍 heWI`fbpV!V)ƃ>xuxrbb׀'`U#ۀ 2~p] ` &n0Duf[XN`DuYVr]i`bf"`az` Y3 :` vq7Vjjfhb_`N(Rjب'mFvq  Ɛ ptPD4,:( T`Rfa&Nj jqE` N( mPj Jv tf {! yIS4fUf+RUu&pN^f*mƏe& O @0DyWD `"qaai[-fb5 7nZTn ]jT|jn:ɍ0& ϴYi7ℛeeV_^ɏqvrnEW%wtx^H`X_k ~)DQD"GIe yVY m`V pnj؈(ckj pԑ &ĊjovYVEg0 ʧ PFy&_ 0ٚY-zMZ""&u8iUy, `ujnjZ" pVwRJ ܆^Vv_:٣8yG &n6hpXvؠ ÂYqeq%N&wV=ʍf kj g '&n&nXP[ pO)p 0WmqgkH x5TE0]u&Vy_g[k XX L Ib]| $6Z!j|Pz prh4`kL2~yaP$N2ZEJ rjuuj [Gr8 u + "`,p#* Yvqgbu櫿j Cd\0g<Py@ h ^ɈVZ]kZǍ`Zuf ]F[yw8 2\3A#~X,Q{ewPR`1[miXT|*ٳ@l.fvr@[ H`,})j*-D`;fe^' rP0jfjj'gl u5tt;oX ЕTR&;Z;ˍ鳟Evq\ P뿬2 ְ/u\YL,f5 ` odžXI>+ g;;hYrGK 0Sу}~ U,i*J(BOe :0>k{HNY'xJ!;Ucsx`*Y`GA5`Pƌȟ ?˾Hܻ&`'TDL@ 0qǀK-" f\ ]ԝԁ O΢P EZ}J31$0}Jjm*T`P׸ PѬ׫ LPO0XϧdJА `2`X6a}P P  ؁mN0-S aM=& /Н p @ ؽ P = =MN" Ӥ`ߑQ:9fِ P~ Ͱ p `.} ,x=y2,P -ٰ 3tQ p 9@GGJ0 `0(.` p:];c>5ܲ- !֠ ` h0۵ mFK@ АRN m-cN:@&ݡ ` ` 0 wm }NP`8 QT96*a a ~7M%eLPPP`7 P˾}0zO;GaussSum-3.0.2/gausssum/mpl.py0000666000175000017500000000374413222437274014772 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from matplotlib.figure import Figure from matplotlib import rcParams from matplotlib import pyplot rcParams.update({'figure.autolayout': True}) # Uncomment the following for XKCD-style plots # pyplot.xkcd() colors = "bgrcmyk" class MPLPlot(object): def __init__(self): self.figure = Figure(figsize=(6,5), dpi=100) self.subplot = self.figure.add_subplot(111) self.cindex =0 def data(self, mtuples, lines=True, title=None, vlines=False, y2axis=""): color = colors[self.cindex] if y2axis: new_axis = self.subplot.twinx() new_axis.set_ylabel(y2axis) self.secondaxis = new_axis axis = new_axis else: axis = self.subplot if not mtuples: return xvals, yvals = zip(*mtuples) if not lines: axis.plot(xvals, yvals, "x", color=color, label=title) else: if not vlines: axis.plot(xvals, yvals, color=color, label=title) else: for i, (xval, yval) in enumerate(zip(xvals, yvals)): axis.vlines(xval, yval, 0, color=color, label=title if i==0 else "") self.cindex += 1 if self.cindex == len(colors): self.cindex = 0 def setlabels(self, xaxis, yaxis): self.subplot.set_xlabel(xaxis) self.subplot.set_ylabel(yaxis) GaussSum-3.0.2/gausssum/plot.py0000666000175000017500000000406013222437274015150 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import os from tkinter import * # Matplotlib imports import matplotlib matplotlib.use('TkAgg') from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg from matplotlib.backend_bases import key_press_handler from matplotlib.figure import Figure class DisplayPlot(object): def __init__(self, root, g, title): self.popup = Toplevel(root) self.popup.focus_set() self.popup.title(title) self.title = title # do this better self.popup.resizable(False,False) self.frame1 = Frame(self.popup) self.frame1.pack() canvas = FigureCanvasTkAgg(g.figure, master=self.frame1) canvas.show() canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) toolbar = NavigationToolbar2TkAgg( canvas, self.frame1 ) toolbar.update() canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1) frame2 = Frame(self.frame1) frame2.pack(side=TOP) def on_key_event(event): key_press_handler(event, canvas, toolbar) def close(event=None): self.popup.destroy() Button(frame2, text="Close", underline=0, command=close).pack(side=LEFT) canvas.mpl_connect('key_press_event', on_key_event) self.popup.bind("",close) self.popup.bind("",close) self.popup.bind("",close) self.popup.protocol("WM_DELETE_WINDOW", close) GaussSum-3.0.2/gausssum/popanalysis.py0000666000175000017500000005053613222437274016545 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import string import os import sys import numpy from math import exp, log from .plot import DisplayPlot from .mpl import MPLPlot from .folder import folder from gausssum.utils import levelname from gausssum.utils import GaussianSpectrum from gausssum.utils import Groups def repr_of_evalue(evalue): if numpy.isnan(evalue): return "-" else: return "%.2f" % evalue def Popanalysis(root,screen,logfile,logfilename,start,end,COOP,FWHM,makeorigin): def DOSconvolute(orb_MPA,evalue): """Convolute the DOS spectrum""" heights = [x for x in numpy.swapaxes(orb_MPA,0,1)] # Remove any NAN eigenvalues from the convolution not_nans = ~numpy.isnan(evalue) nevalue = evalue[not_nans] nheights = [] for h in heights: nheights.append(h[not_nans]) spectrum = GaussianSpectrum(start, end, 1000, (nevalue, nheights), FWHM) return spectrum def tidy(num): # Changes +-0.155648 into +-0.16 if num>=0: rounded=int(num*100+.5)/100. return str(rounded)[:4] else: rounded=int(num*100-.5)/100. return str(rounded)[:5] def originoutput(MPA): """Write a file suitable for reading with Origin.""" outputfile=open(os.path.join(gaussdir,"origin_orbs.txt"),"w") for i in range(len(evalue[0])): if numgroups>0 and pop: total=0 for j in range(numgroups): outputfile.write(str(total)+"\t"+str(evalue[0][i])+"\t") total += MPA[0][i,j] outputfile.write("\n") total=0 for j in range(numgroups): total += MPA[0][i,j] outputfile.write(str(total)+"\t"+str(evalue[0][i])+"\t") outputfile.write("\n") else: outputfile.write("0\t"+str(evalue[0][i])+"\n") outputfile.write("1\t"+str(evalue[0][i])+"\n") if unres: for i in range(len(evalue[1])): if numgroups>0 and pop: total=0 for j in range(numgroups): outputfile.write(str(total)+"\t"+str(evalue[1][i])+"\t") total += MPA[1][i,j] outputfile.write("\n") total=0 for j in range(numgroups): total += MPA[1][i,j] outputfile.write(str(total)+"\t"+str(evalue[1][i])+"\t") outputfile.write("\n") else: outputfile.write("0\t"+str(evalue[1][i])+"\n") outputfile.write("1\t"+str(evalue[1][i])+"\n") outputfile.close() def densityofstates(): """Do the density of status calculation.""" groupnames = list(groups.groups.keys()) if groups else [] if groups and pop: contrib = [x * numpy.dot(x,overlap) for x in MOCoeff] if not unres: MPA = [numpy.zeros( (logfile.nmo,numgroups), "d")] else: MPA = [numpy.zeros( (logfile.nmo,numgroups), "d") for x in range(2)] for i,groupname in enumerate(groupnames): for basisfn in groups.groups[groupname]: MPA[0][:,i] += contrib[0][:,basisfn] if unres: MPA[1][:,i] += contrib[1][:,basisfn] else: # Set MPA to be all ones MPA = [numpy.ones( (logfile.nmo,1), "d")] if unres: MPA = [numpy.ones( (logfile.nmo,1), "d") for x in range(2)] # Write DOS and PDOS data to orbital_data.txt screen.write("Writing orbital data to orbital_data.txt\n") outputfile=open(os.path.join(gaussdir,"orbital_data.txt"),"w") outputfile.write("NBasis:\t"+str(NBsUse)+"\n") outputfile.write("HOMO:\t%s" % "\t".join([str(x+1) for x in HOMO])) if not (groups and pop): # No point outputting group info since we don't have the %contribs outputfile.write("\nGroups:\t0\n") else: outputfile.write("\nGroups:\t"+str(len(groups.groups))+"\n") line = [] for groupname in groupnames: v = groups.groups[groupname] line.append("%s\t%s" % (groupname," ".join(map(str,v)))) outputfile.write("\n".join(line) + "\n") if unres: outputfile.write("\nAlpha MO\t\teV\tSymmetry") else: outputfile.write("\nMO\t\teV\tSymmetry") if groups and pop: t = "\t".join(groupnames) outputfile.write("\t" + t+"\tAccurate values (for the Electronic Transitions module)") if unres: if groups and pop: outputfile.write("\t"*(len(groups.groups)-1)) outputfile.write("\tBeta MO\t\teV\tSymmetry") if groups and pop: outputfile.write(t+"\tAccurate values (for UVVis.py)") outputfile.write("\n") for i in range(max([len(x) for x in evalue])-1,-1,-1): # Print them out backwards line=str(i+1)+"\t"+levelname(i, HOMO[0])+"\t"+repr_of_evalue(evalue[0][i])+"\t"+symmetry[0][i] if groups and pop: for j in range(len(groups.groups)): line=line+"\t"+str(int(MPA[0][i,j]*100+.5)) for j in range(len(groups.groups)): line=line+"\t"+str(MPA[0][i,j]) if unres and i=len(evalue[1]): continue output.write(str(k+1)+"\t"+levelname(k, HOMO[j])+"\t"+str(evalue[j][k])) for fragx in range(len(groups.groups)-1): for fragy in range(fragx+1,len(groups.groups)): output.write("\t"+str(groupoverlap[j][k,fragx,fragy])) output.write("\n") output.close() # Convolute the COOP spectrum spectrum = [] for j in range(len(HOMO)): overlaps = [] for fragx in range(numgroups - 1): for fragy in range(fragx+1, numgroups): overlaps.append(groupoverlap[j][:,fragx,fragy]) spectrum.append(GaussianSpectrum(start, end, 1000, (evalue[j], overlaps), FWHM)) # Create COOP_spectrum.txt output = open(os.path.join(gaussdir,"COOP_spectrum.txt"),"w") output.write("\t") if unres: output.write("Alpha%sBeta%s" % ("\t"*numoverlaps,"\t"*numoverlaps)) output.write("Total\n") output.write("eV\t%s" % listofoverlaps) if unres: output.write("\t%s\t%s" % (listofoverlaps, listofoverlaps)) output.write("\n") for i in range(len(spectrum[0].xvalues)): output.write("%f" % spectrum[0].xvalues[i]) for k in range(len(spectrum)): for j in range(len(spectrum[k].spectrum[:,0])): output.write("\t%f" % spectrum[k].spectrum[j,i]) if unres: output.write("\t%f" % sum([spectrum[x].spectrum[j,i] for x in [0,1]])) output.write("\n") output.close() g = MPLPlot() i = 0 for fragx in range(numgroups-1): for fragy in range(fragx+1, numgroups): for j in range(len(spectrum)): if not unres: g.data( zip(spectrum[j].xvalues,spectrum[j].spectrum[i,:]), title='overlap of %s with %s' % (groupnames[fragx], groupnames[fragy])) else: g.data( zip(spectrum[j].xvalues,spectrum[j].spectrum[i,:]), title='%s overlap of %s with %s' % (['Alpha','Beta'][j], groupnames[fragx], groupnames[fragy])) ## if unres: # Plot the total or not? ## g.data( zip(spectrum[j].xvalues,spectrum[0].spectrum[i,:] + spectrum[1].spectrum[i,:]), ## title='Total overlap of %s with %s' % ( groupnames[fragx], groupnames[fragy])) i += 1 g.setlabels("Energy (eV)", "") g.subplot.set_xlim(left=start, right=end) g.subplot.legend(loc="upper right", prop={'size':8}) DisplayPlot(root,g,"COOP spectrum") return # End of crystalorbital() ############### START OF MAIN ################## screen.write("Starting to analyse the molecular orbitals\n") groupatoms=[]; groupname=[]; atomorb=[] # Create the output directory if necessary gaussdir=folder(screen,logfilename) # Read in the groups (if they exist!) filename = os.path.join(gaussdir,"Groups.txt") groups = False numgroups = 0 if not os.path.isfile(filename): screen.write("Groups.txt not found\n") elif not (hasattr(logfile, "atombasis") and hasattr(logfile, "atomnos")): screen.write("Groups.txt found but not used as logfile does not have" " atombasis or atomnos\n") # not necessary depending on the groups else: screen.write("Reading Groups.txt\n") if not hasattr(logfile, "aonames"): groups = Groups(filename, logfile.atomnos, None, logfile.atombasis) else: groups = Groups(filename, logfile.atomnos, logfile.aonames, logfile.atombasis) numgroups = len(groups.groups) screen.write("There are %d groups\n" % numgroups) NAtoms = logfile.natom NBasis = logfile.nbasis NBsUse = logfile.nmo # Verify that groups.txt is okay if groups: if COOP==False: status = groups.verify("DOS") else: status = groups.verify("COOP") if status: screen.write(status) return 1 screen.write("The number of atoms is "+str(NAtoms)+"\n") screen.write("NBasis is "+str(NBasis)+"\n") screen.write("NBsUse is "+str(NBsUse)+"\n") pop=False if hasattr(logfile, "aooverlaps") and hasattr(logfile, "mocoeffs"): screen.write("Found an overlap matrix and MO coefficients\n") pop=True # Assuming you never get an overlap matrix without the MOCoeffs MOCoeff = logfile.mocoeffs overlap = logfile.aooverlaps atomorb = logfile.aonames if len(MOCoeff)==2: screen.write("This is an unrestricted calculation - found the Beta MO coefficents\n") unres=False HOMO = logfile.homos if len(HOMO)==2: screen.write("This is an unrestricted calculation\n") unres=True evalue = logfile.moenergies if hasattr(logfile,"mosyms"): symmetry = logfile.mosyms else: symmetry = [["?" for x in evalue[0]]] if unres: symmetry.append(["?" for x in evalue[1]]) screen.write("Number of evalues found: %s\n" % " ".join([str(len(x)) for x in evalue])) screen.write("Number of orbital symmetries found: %s\n" % " ".join([str(len(x)) for x in symmetry])) if COOP==True: if not (groups and pop): screen.write("To calculate the COOP spectrum, you need Groups.txt and a log file containing a full population analysis\n") return 1 crystalorbital() else: # Density of States densityofstates() screen.write("Finished\n") GaussSum-3.0.2/gausssum/preferencesbox.py0000666000175000017500000002203113222437274017202 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from tkinter import * # GUI stuff import tkinter.messagebox # For the About Dialog import tkinter.simpledialog import os class PreferencesPopupBox(simpledialog.Dialog): def __init__(self, parent, settings, title = None): # Override (just to set the geometry!) Toplevel.__init__(self, parent) self.transient(parent) self.settings=settings # Note that changes to self.settings will affect the global self.settings thru 'settings' self.oldsettings = settings.copy() # Remember the current settings if title: self.title(title) self.parent = parent self.result = None body = Frame(self) self.initial_focus = self.body(body) body.pack(padx=5, pady=5) self.buttonbox() if not self.initial_focus: self.initial_focus = self self.protocol("WM_DELETE_WINDOW", self.cancel) self.initial_focus.focus_set() self.wait_window(self) def body(self,master): # Override # The content of the settings dialog box # Creation of the main sections self.resizable(False,False) self.frame1=Frame(master,relief=SUNKEN,borderwidth=2) self.frame1.pack() Label(self.frame1,text="Search file").pack() self.frame3=Frame(self.frame1) self.frame3.pack() Label(self.frame1,text="").pack() Label(self.frame1,text="Frequencies").pack() self.frame4=Frame(self.frame1) self.frame4.pack() Label(self.frame1,text="").pack() Label(self.frame1,text="Orbitals").pack() self.frame5=Frame(self.frame1) self.frame5.pack() Label(self.frame1,text="").pack() Label(self.frame1,text="Electronic transitions").pack() self.frame6=Frame(self.frame1) self.frame6.pack() Label(self.frame1,text="").pack() # The Find.py section Label(self.frame3,text="Search for:").grid(row=0,column=0) self.find=[None]*4 self.find[0]=Entry(self.frame3,width=15) self.find[1]=Entry(self.frame3,width=15) self.find[2]=Entry(self.frame3,width=15) self.find[3]=Entry(self.frame3,width=15) self.find[0].grid(row=0,column=1) self.find[1].grid(row=1,column=1) self.find[2].grid(row=0,column=2) self.find[3].grid(row=1,column=2) for i in range(4): self.find[i].delete(0,END) self.find[i].insert(0,self.settings[ 'find.text%d'%(i+1) ]) # The IR_Raman.py section self.frame4a = Frame(self.frame4) self.frame4a.pack() self.irraman=[None]*6 Label(self.frame4a,text="Start:").grid(row=0,column=0) self.irraman[0]=Entry(self.frame4a,width=5) self.irraman[0].grid(row=0,column=1) Label(self.frame4a,text="End:").grid(row=0,column=2) self.irraman[1]=Entry(self.frame4a,width=5) self.irraman[1].grid(row=0,column=3) Label(self.frame4a,text="Num pts:").grid(row=0,column=4) self.irraman[2]=Entry(self.frame4a,width=5) self.irraman[2].grid(row=0,column=5) Label(self.frame4a,text="FWHM:").grid(row=0,column=6) self.irraman[3]=Entry(self.frame4a,width=5) self.irraman[3].grid(row=0,column=7) self.frame4b = Frame(self.frame4) self.frame4b.pack() Label(self.frame4b,text="Exc. wavelength:").grid(row=0,column=0) self.irraman[4]=Entry(self.frame4b,width=5) self.irraman[4].grid(row=0,column=1) Label(self.frame4b,text="Temp:").grid(row=0,column=2) self.irraman[5]=Entry(self.frame4b,width=6) self.irraman[5].grid(row=0,column=3) a=['start','end','numpoints','fwhm','excitation','temperature'] for i in range(6): self.irraman[i].delete(0,END) self.irraman[i].insert(0,self.settings[ 'ir_raman.%s'%a[i] ]) # The MO.py section self.mo=[None]*3 Label(self.frame5,text="Start:").grid(row=0,column=0) self.mo[0]=Entry(self.frame5,width=5) self.mo[0].grid(row=0,column=1) Label(self.frame5,text="End:").grid(row=0,column=2) self.mo[1]=Entry(self.frame5,width=5) self.mo[1].grid(row=0,column=3) Label(self.frame5,text="FWHM").grid(row=0,column=4) self.mo[2]=Entry(self.frame5,width=5) self.mo[2].grid(row=0,column=5) a=['start','end','fwhm'] for i in range(3): self.mo[i].delete(0,END) self.mo[i].insert(0,self.settings['mo.%s'%(a[i])]) # UVVis.py section self.uvvis=[None]*5 Label(self.frame6,text="Start:").grid(row=0,column=0) self.uvvis[0]=Entry(self.frame6,width=5) self.uvvis[0].grid(row=0,column=1) Label(self.frame6,text="End:").grid(row=0,column=2) self.uvvis[1]=Entry(self.frame6,width=5) self.uvvis[1].grid(row=0,column=3) Label(self.frame6,text="Num pts:").grid(row=0,column=4) self.uvvis[2]=Entry(self.frame6,width=5) self.uvvis[2].grid(row=0,column=5) Label(self.frame6,text="FWHM:").grid(row=0,column=6) self.uvvis[3]=Entry(self.frame6,width=5) self.uvvis[3].grid(row=0,column=7) Label(self.frame6,text="sigma:").grid(row=0,column=8) self.uvvis[4]=Entry(self.frame6,width=5) self.uvvis[4].grid(row=0,column=9) a=['start','end','numpoints','fwhm','sigma'] for i in range(5): self.uvvis[i].delete(0,END) self.uvvis[i].insert(0,self.settings['uvvis.%s'%(a[i])]) x = (652-450)//2 + self.parent.winfo_rootx() y = (480-410)//2 + self.parent.winfo_rooty() self.geometry("450x460+"+str(x)+"+"+str(y)) # Place it in the centre of the root window def buttonbox(self): # Override box = Frame(self) cancel=Button(box,text="Cancel",width=10,command=self.cancel,default=ACTIVE) cancel.pack(side=LEFT,padx=5,pady=5) self.save = Button(box, text="Save", width=10, command=self.ok, default=ACTIVE) self.save.pack(side=LEFT, padx=5, pady=5) self.bind("",self.ok) self.bind("",self.cancel) box.pack() def checkcubman(self, event=None): # Checks for existence of cubman at specificed location if not os.path.isfile(self.cubman.get()): messagebox.showerror(title="No such file", message=''' There isn't any file with this name. Make sure you include the full path, filename and extension (if any). For example (in Windows): C:\\Program Files\\Gaussian\\cubman.exe''' ) def checkformchk(self, event=None): # Checks for existence of formchk at specificed location if not os.path.isfile(self.formchk.get()): messagebox.showerror(title="No such file", message=''' There isn't any file with this name. Make sure you include the full path, filename and extension (if any). For example (in Windows): C:\\Program Files\\Gaussian\\formchk.exe''' ) def checkcubegen(self, event=None): # Checks for existence of formchk at specificed location if not os.path.isfile(self.cubegen.get()): messagebox.showerror(title="No such file", message=''' There isn't any file with this name. Make sure you include the full path, filename and extension (if any). For example (in Windows): C:\\Program Files\\Gaussian\\cubegen.exe''' ) def ok(self, event=None): # Override # Remembers the settings # If they are different from before, they will be saved by 'preferences()' a=['start','end','numpoints','fwhm','excitation','temperature'] for i in range(6): self.settings['ir_raman.%s'%(a[i])]=self.irraman[i].get() a=['start','end','numpoints','fwhm'] for i in range(4): self.settings['find.text%d'%(i+1)]=self.find[i].get() self.settings['uvvis.%s'%(a[i])]=self.uvvis[i].get() self.settings['uvvis.sigma']=self.uvvis[4].get() a=['start','end','fwhm'] for i in range(3): self.settings['mo.%s'%(a[i])]=self.mo[i].get() if not self.validate(): self.initial_focus.focus_set() # put focus back return self.withdraw() self.update_idletasks() self.apply() self.cancel() GaussSum-3.0.2/gausssum/scf.py0000666000175000017500000000332413222437274014747 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import os import sys import math from .plot import DisplayPlot from .mpl import MPLPlot def SCF(root,screen,logfile,numpoints): screen.write("Starting to analyse the progress of the SCF\n") scfvalues = logfile.scfvalues[-1] # The most recent in the logfile scftargets = logfile.scftargets[-1] # Ditto deviation = [] for i in range(len(scfvalues)): # Which SCF cycle dev = 0 for j in range(len(scftargets)): # Which target if abs(scfvalues[i][j]) > scftargets[j]: dev += math.log(abs(scfvalues[i][j]) / scftargets[j]) deviation.append(dev) if len(deviation)>=numpoints+2: # If there are two points to plot h = MPLPlot() h.setlabels("SCF convergence step", "Deviation from targets") data = list(zip(range(len(deviation)-numpoints),deviation[numpoints:])) h.data(data) h.data(data, lines=False) h.subplot.set_ylim(bottom=0) DisplayPlot(root,h,"Plot of SCF deviation vs Iteration") else: screen.write("I need at least two points to plot\n") screen.write("Finished\n") GaussSum-3.0.2/gausssum/search.py0000666000175000017500000000254213222437274015442 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2009 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. def Search(screen, logfilename, searchstring, case_sensitive): screen.write("Starting to search\n") searchterm = searchstring.split("%") inputfile = open(logfilename, "r") if not case_sensitive: # change all the searchterms to lowercase temp=[] for x in searchterm: temp.append(x.lower()) searchterm=temp screenoutput = [] for line in inputfile: searchline = line if not case_sensitive: searchline = line.lower() for x in searchterm: if searchline.find(x) >= 0: screenoutput.append(line) break inputfile.close() screen.write("".join(screenoutput)) screen.write("Finished searching\n") GaussSum-3.0.2/gausssum/utils.py0000666000175000017500000003130513222437274015334 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. from tkinter import * import configparser # For writing the settings to an .ini file from cclib.parser.utils import PeriodicTable import numpy import os import sys import math # This class allows Find.py, etc. to write directly to the 'console screen' # in GaussSum.py. # It also allows Find.py, etc. to write to stdout when testing. class Redirect: def __init__(self,write_function,root,other): self.outputfn=write_function self.args=other self.root=root def write(self,text): if self.args=="None": self.outputfn(text) else: self.outputfn(self.args[0],text) self.root.update() # so it shows it immediately self.args[1].see(END) # scroll if necessary to see last text inserted def flush(self): pass def readinconfigfile(inifile): # Taken from the Python Cookbook (O'Reilly): # reads in configuration information from a # Windows-style .ini file, and returns a # dictionary of settings. # # Uses the Python module configparser for the complicated stuff. cp = configparser.ConfigParser(interpolation=None) cp.read(inifile) config={} for sec in cp.sections(): name = sec.lower() for opt in cp.options(sec): config[name+"."+opt.lower()] = cp.get(sec,opt).strip() return config def writeoutconfigfile(config,inifile): # The companion to readinconfigile # Written by me! cp = configparser.ConfigParser(interpolation=None) for key,value in config.items(): sec=key.split('.')[0] opt=key.split('.')[1] if not cp.has_section(sec): cp.add_section(sec) cp.set(sec,opt,value) out=open(inifile,"w") cp.write(out) out.close() class NMRstandards(object): def __init__(self,location): """ Read in the nmr standards file (if it exists) Returns a list of dictionaries: nmrdata=[dict_1,dict_2,dict_3...] dict_n=['theory':'B3LYP/6-31G(d)','name':'TMS','C':12.23,'H':123] """ self.location = location self.nmrdata = [] # Check for nmr standards file in location described in settings try: readin = open(self.location,"r") except IOError: # File does not exist - i.e. no settings yet pass else: for line in readin: if not line.lstrip().startswith("#"): # Ignore comments temp=line.split("\t") adict={} adict['theory']=temp[0] adict['name']=temp[1] for i in range(2,len(temp),2): # Read in the calculated shifts adict[temp[i]]=float(temp[i+1]) self.nmrdata.append(adict) readin.close() def __getitem__(self,index): """Shortcut to access the data directly.""" return self.nmrdata[index] def save(self): """Write the NMR standards to disk.""" outputfile = open(self.location,"w") lines = [] for adict in self.nmrdata: output = [adict['theory'],adict['name']] for k,v in adict.items(): if k not in ["theory","name"]: output.append(k) output.append(str(v)) lines.append("\t".join(output)) outputfile.write("\n".join(lines)) outputfile.close() class ErrorCatcher: def __init__(self): self.log="" self.longlog="" def write(self,text): self.log=self.log+text def clear(self): self.longlog=self.longlog+self.log self.log="" def percent(number): return str(int(round(number*100))) # round leaves .0 at the end of a number def levelname(i,HOMO): if iHOMO+1: level='L+'+str(i-HOMO-1) elif i==HOMO+1: level="LUMO" else: level="HOMO" return level def lorentzian(x,peak,height,width): """The lorentzian curve. f(x) = a/(1+a) where a is FWHM**2/4 """ a = width**2./4. return float(height)*a/( (peak-x)**2 + a ) class Spectrum(object): """Convolutes and stores spectrum data. Usage: Spectrum(start,end,numpts,peaks,width,formula) where peaks is [(pos,height),...] formula is a function such as gaussianpeak or delta >>> t = Spectrum(0,50,11,[[(10,1),(30,0.9),(35,1)]],5,delta) >>> t.spectrum array([[ 0. ], [ 1. ], [ 1. ], [ 1. ], [ 0. ], [ 0.89999998], [ 1.89999998], [ 1.89999998], [ 1. ], [ 0. ], [ 0. ]],'d') """ def __init__(self,start,end,numpts,peaks,width,formula): self.start = start self.end = end self.numpts = numpts self.peaks = peaks self.width = width self.formula = formula # len(peaks) is the number of spectra in this object self.spectrum = numpy.zeros( (numpts,len(peaks)),"d") self.xvalues = numpy.arange(numpts)*float(end-start)/(numpts-1) + start for i in range(numpts): x = self.xvalues[i] for spectrumno in range(len(peaks)): for (pos,height) in peaks[spectrumno]: self.spectrum[i,spectrumno] = self.spectrum[i,spectrumno] + formula(x,pos,height,width) class GaussianSpectrum(object): """An optimised version of Spectrum for convoluting gaussian curves. Usage: GaussianSpectrum(start,end,numpts,peaks,width) where peaks -- ( [List of peaks],[ [list of heights],[list of heights],..] ) """ def __init__(self,start,end,numpts,peaks,width): self.start = start self.end = end self.numpts = numpts self.peaks = peaks[0] self.heights = peaks[1] self.width = width # make heights a local variable as it's accessed in the inner loop heights = self.heights # len(heights) is the number of spectra in this object data = [] self.xvalues = numpy.arange(self.numpts)*float(self.end-self.start)/(self.numpts-1) + self.start A = -2.7726/self.width**2 for x in self.xvalues: tot = [0]*len(self.heights) # The total for each spectrum for this x value for peakno in range(len(self.peaks)): # For each peak pos = self.peaks[peakno] exponent = math.exp(A*(pos-x)**2) for spectrumno in range(len(heights)): tot[spectrumno] += heights[spectrumno][peakno]*exponent data.append(tot) self.spectrum = numpy.swapaxes(numpy.array(data),0,1) class Groups(object): """Stores the groups to be used for a DOS or COOP calculation Essentially, the groups are a partitioning of the orbitals among atoms or a group of atoms. Usage: Groups(filename, atomnos, aonames, atombasis) where atomnos is a list of the atomic numbers of the atoms aonames is a list of the 'names' of each atomic orbital atombasis is a list for each atom of the indices of the basis fns on that atom Attributes: groups -- a dictionary of the partition of the orbitals among groups """ def __init__(self, filename, atomnos, aonames, atombasis): self.atomnos = atomnos self.aonames = aonames self.atombasis = atombasis self._makeatomnames() if not self.aonames: self._makeaonames() self._readfile(filename) self._setup() def _readfile(self,filename): """Read group info from a file. File format: First line must be one of "orbitals","atoms","allorbitals","allatoms". The remainder of the file is ignored in the case of allatoms/allorbitals. Otherwise a series of groups must be described with a name by itself on one line and a list of group members on the following line. As an example: atoms Phenyl ring 1,4-6,8 The rest 2,3,7 """ inputfile = open(filename,"r") grouptype = next(inputfile).strip() while not grouptype: # Ignore blank lines grouptype = next(inputfile).strip() groups = {} for line in inputfile: if not line.strip(): continue # Ignore blank lines groupname = line.strip() atoms = [] line = next(inputfile) parts = line.split(",") for x in parts: temp = x.split("-") if len(temp)==1: atoms.append(int(temp[0])) else: atoms.extend(range(int(temp[0]),int(temp[1])+1)) groups[groupname] = atoms inputfile.close() self.filegroups = groups self.grouptype = grouptype def _makeatomnames(self): """Create unique names for the atoms""" pt = PeriodicTable() d = {} names = [] for atomno in self.atomnos: if atomno in d: d[atomno] += 1 else: d[atomno] = 1 names.append(pt.element[atomno] + str(d[atomno])) self.atomnames = names def _makeaonames(self): """Create unique names for the atomic basis if needed""" d = {} for atomname, ab in zip(self.atomnames, self.atombasis): names.extend([atomname + "_" + x for x in range(len(ab))]) self.aonames = names def __str__(self): """Return a string representation of this object.""" ans = [] for k,v in self.groups.items(): ans.append("%s: %s" % (k,",".join(map(str,v)))) return "\n".join(ans) def _setup(self): """Create the groups attribute.""" type = self.grouptype.lower() if not self.filegroups: if type=="allorbitals": self.groups = {} for i in range(len(self.aonames)): orbital = self.aonames[i] self.groups[orbital] = [i] elif type=="allatoms": self.groups = dict(zip(self.atomnames, self.atombasis)) else: raise TypeError("You need to specify groups") else: if type=="orbitals": self.groups = {} for k,v in self.filegroups.items(): # Convert the indices to start from 0 self.groups[k] = [x-1 for x in v] elif type=="atoms": self.groups = {} for k,v in self.filegroups.items(): self.groups[k] = [] for x in v: # Convert the indices to start from 0 self.groups[k].extend(self.atombasis[x - 1]) else: raise TypeError("%s is not a valid type of group" % type) def verify(self,purpose): """Verify that the groups attribute is consistent. purpose is one of "DOS" or "COOP" """ status = "" # Create one big list of all of the atom orbitals in the groups all = [] for x in self.groups.values(): all += x all.sort() if purpose=="DOS": # Each atom orb must appear exactly once ok = (all==list(range(len(self.aonames)))) if not ok: status = "Problem with Groups.txt!\n(1)Every atom/orbital must " \ "be listed as a member of some group\n(2)No " \ "atom/orbital can be listed twice" elif purpose=="COOP": # No atom can appear twice (and cannot have any crazy atoms either) badatom = [x for x in all if x not in range(len(self.aonames))] if badatom: status = "Atomic orb number out of range in Groups.txt\n" else: for i in range(len(all)-1): if all[i]==all[i+1]: status += "Atomic orb %d has been included twice\n" % all[i] return status if __name__=="__main__": import doctest doctest.testmod(verbose=True) GaussSum-3.0.2/gausssum/vibfreq.py0000666000175000017500000001514713222437274015640 0ustar noelnoel# # GaussSum (http://gausssum.sf.net) # Copyright (C) 2006-2013 Noel O'Boyle # # This program is free software; you can redistribute and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. import os import math import gausssum.utils from .plot import DisplayPlot from .mpl import MPLPlot from .folder import folder def activity_to_intensity(activity, frequency, excitation, temperature): """Convert Raman acitivity to Raman intensity according to Krishnakumar et al, J. Mol. Struct., 2004, 702, 9.""" excitecm = 1 / (1e-7 * excitation) f = 1e-13 above = f * (excitecm - frequency)**4 * activity exponential = -6.626068e-34 * 299792458 * frequency / (1.3806503e-23 * temperature) below = frequency * (1 - math.exp(exponential)) return above / below def get_scaling_factors(filename, scale): """Read in scaling factors from an existing output file. Note: Scale is prepopulated with the general scaling factor """ inputfile = open(filename, "r") line = inputfile.readline() line = inputfile.readline() i = 0 line = inputfile.readline().split('\t') while len(line) > 6: # Read in the individual scaling factors sf = line[-2] if sf != '': scale[i] = float(sf) i += 1 line = inputfile.readline().split('\t') inputfile.close() return scale def Vibfreq(root,screen,logfile,logfilename,start,end,numpts,FWHM,typeofscale,scalefactor,excitation,temperature): def dofreqs(name,act): screen.write("\n************* Doing the "+name+" *****************\n") filename=name+"Spectrum.txt" freq = logfile.vibfreqs.copy() # Copy so that it won't be changed by the routine if hasattr(logfile, "vibsyms"): vibsyms = logfile.vibsyms else: vibsyms = ['?'] * len(freq) # Handle the scaling of the frequencies scale = [scalefactor] * len(freq) if typeofscale == "Gen": screen.write("Going to scale with a scaling factor of "+str(scalefactor)+"\n") general = True else: screen.write("Going to use individual scaling factors\n") screen.write("Looking for scaling factors in "+filename+"...") inputfilename = os.path.join(gaussdir,filename) if not os.path.isfile(inputfilename): screen.write("not found\nGoing to use general scale factor of "+str(scalefactor)+" instead\n") general = True else: screen.write("found\n") general = False get_scaling_factors(inputfilename, scale) # Update scaling factors in 'scale' from file for i in range(len(freq)): # Scale the freqs freq[i] = freq[i]*scale[i] # Convolute the spectrum spectrum = gausssum.utils.Spectrum(start,end,numpts, [list(zip(freq,act))], FWHM,gausssum.utils.lorentzian) if name == "Raman": intensity = [activity_to_intensity(activity, frequency, excitation, temperature) for activity, frequency in zip(act, freq)] spectrum_intensity = gausssum.utils.Spectrum(start,end,numpts, [list(zip(freq, intensity))], FWHM,gausssum.utils.lorentzian) outputfile = open(os.path.join(gaussdir,filename),"w") screen.write("Writing scaled spectrum to "+filename+"\n") outputfile.write("Spectrum\t%s\t\tNormal Modes\n" % ["", "\t"][name=="Raman"]) outputfile.write("Freq (cm-1)\t%s act\t%s\tMode\tLabel\tFreq (cm-1)\t%s act\t" % (name, ["", "Intensity\t"][name=="Raman"],name)) outputfile.write("%sScaling factors\tUnscaled freq\n" % ["", "Intensity\t"][name=="Raman"]) width = end-start for x in range(0,numpts): if spectrum.spectrum[x,0]<1e-20: spectrum.spectrum[x,0] = 0. realx = width*(x+1)/numpts+start outputfile.write(str(realx)+"\t"+str(spectrum.spectrum[x,0])) if name == "Raman": outputfile.write("\t%f" % spectrum_intensity.spectrum[x,0]) if x>KEJH RINKYH QG7OFGKNMP jJ PRTQYPtI aO[QULMRT}H SUaNLXY ]XaW\[yR Z[iX sU mW eZQ_UTMOS_[__^^__ VLJl`Wdc}] icv` [pc V^j^^c``ig kijd;_ ]{gnlf qnj d {mwo g `so ps i/\uq5h?q uo[twxpL}tt o zwh {nmspqyzw yz tvsu q ~}y }vs xv ~ ||~v|r1tOM%m   LEYTΜR2˗0PMgncg0D%H;~@AMϞaժ pj]٪n CIG]Ygbߨ ޺Tq 8.,>[~IgllHz$Z\MW 3TY_GFB7B >h2*qJˆne3e0WvjW-[L^a{_}L~0eQ7 -Rp!R>5HE4n"G0j iMJu&!I\KAW+KzQ`abI]L%CFV`eO~`umBFh ٕ*ɄFHBiDbl 4uJ+DmWe*| u3`cON LyS]6PXvŧi$ꧥ^\dz rޢg2l6&k)Agi MAhnhpt[mz_/}pcUZQcl{mGVineںcbU_īW*`LAVnGM-M)WIk  c"ݺGضd#) iƨcUbg̒p3}nJK[XN^)e}AMbSeJȵIimL$i4,CRR}rv+w(2E-J5% 0xsϥl%^TG4cAS+i0<+T\^3@MVCВC0ɶZQH~xl=T˽ OOG+QX0}p:={slBƔ"_z|iKͺc0|VObcE"b0RT$oxظ~me0fK+'@/}1Fᬗ=_h g3x ISYQr 3l4)^a!LVct^ UͰ@"mBLH @(0*Y sKuY`r88Q⼄ 1$`L)@ 2HDq/DJCf`d9E-+,YYט5 @@/&OH _ @@$H}#է. IM\I# I"蔧7ApU$7[h RzIR.1 fUb,V` K2k#(/"CgN EWd*C0 (e}̤[: E0sv_xH-IєJQsv PET/!, vCgj:$/I\*ǝLb}|k,{x]V) @Lmk;ynNt-._Ș=pYȘ7б.t? ;Ϸ"Oҗ?c{~Fӛ.u*|զu15p,K]wk@O0|(Z9[P+һ.O \`9Dlw}˦7P>o~Wu] @ uV%gO{kOUIJ1aD8icAb0q`5˻Z(@uxZ0F`Z`;F`CP[hhd𬅠ط[4p;H ݈]q{5 꺖l),YZx@`Qs kkۑp&)/ưN{G}Z{`;X`R hM j[ <\Yd`id@}'{$P{4G;ՈG&> +C2;ET\[: m q+@v._uUay9c+@t80ɓl|Z [nؚBL߻C0Năŗ;ż,ZI˕ 3K[td[I!B ݂{;52yL^!HPKɏ l@EpEjh |^n [j}d+3`{$T9˽x Sq:lllH 2W(z' |LBh =+@;$\69mP Am\p `n|ʪ JٗR0˵|$5{؈-$躴&m5O8ܹfU[ǡ:`1!DA` \N~0K Tm@ip6P ii@9\ɘ j @ ޝЙR+}z[,P =kG̗kHaߒS `];b+tl۷ULOLpl+Q-P.~i00}xBpiɜݭ 4Ȭiz k޳Qk z^~=̞d;`^81\Q 4U;A mcH,.WKJ͖y&+Pa128~}g`Q`pqP   @ `jX |ͺˊ] 4{ZZB Sl]HaPzd[tWIJ!vޡz^y_[qv/@*M.055(ꙮ2g0W=papBpx P ǀw{v=٬: [< Fy@mnbq z)YM>or6B JgNXo.J)th D „ٻҞG q3 ֦M>Dh,S̘2Fq]*&|CGTCT)tM:͖U^Ś* d~5!Ld ͆B31Ɛ =#Lћ٤~ih徣j.8l_;@oǙrA3cP !(F.g+: fdrq4tH(XYy-AXx'7GcA [ɛ<z!V7|nPDt|kG)(/"sߤ~/0= "(h\q W8 >0b "aBN׆*^1R)y:fB<E`r1D ֐ qB,eE=rALT|lXf刄,"Dib<8X<vӝ !Un`A!sعZ-D.ɦp4$4n(Pp? )8<JP,` .qJ q2&[04.rƌ\СE c.ѹ4f-M$pA`p-졜T#Q  ^VU#d ,=r\1:5%Bu01U"`OBʑ୥(F%{ VFA/=X_׸+FbXT9s2(`Oh 6 pD$›\젅 NDnӸEn;%HF8K֮ujh U Zկ ^PWO$_ {Vڃ 0g"?N i!rz9I3F1NʖWx7цVU3PGr},7w#A%ϐqe/]-Ut0Wz7!x)ޛ! =ޛU K0')@?, `c\LK 68Fq-kX "̀.d!Tq$("1"YbO?I?Zϵ"P!x"\$pt[U4 (g<33Xx!sU1vZ|ȃtQ#[ ,])<"EFoP>C8z!T>Uz#+\p;hˢ\0 _âĐ-!e29e# FA38 )ZɭBPh+( D.vs,*Ê1]h4ĭ(XY@91>}A$[2s!T@#$C2) ف((`0r13dF9!8eblj2ܟ#еs{6(#`P. @}P1cXD>,CshFtĂˊ9 ʓL<;UrT>uv2HBTL0]dX<ϊ)a3\4 e;y?mj sF5&шChPHa4qYKI]xG?Azè8D2*uɲ XE5W"Đ)NI1ʳ9.4iR3L?R&1ĦhF 06xFnFD=38,=JGr7Hq )YЅRH}lep̭8ċ8 (Ea/2)8iKP<념Tن#:]$lJf" -$"`GP>tRsMgɜJc6Z)*=%ĺφ0 2{A~", 4!+]PCT<@</(<X!"ӵN=cm iw0 :ELпC]H6 m+*-K%s)Ր q~i`lϪKĵSce]VM;X iVS Aқ+}ӪQ NA(xx0iJHs}2EKŒmeWk Ō#8A8I<"8$` L CO(Y(5)~Hٕ\VEY~Rs(z:(5=|-S%A4Mٟ֞mSzaUPr ځ8TܬM;,FNżC_$B4 0l:0@ 7lFYR] 8 oJ.+=8PU))\P\iEF٨R*> 6]zGx$W \$b|V2%VY<ځPLZc!"6 /Z<83fJ8\_0%ɸ<0iEf8fתmdCTm-PJ(Y-ٜ\>`9^;S;9c YP`j**]~'KdC)wuEJ+x3<ŢI*<S0gJ9KT^[8Ap/2b-D U ÃfĘ8H3]0Ȃ6hDD0hPXfMh^Yif=~'ϚG ]3Cgw+ 5u"w{0E]p9pQ2JV9qh[R13j/^#5$`.>_XƨKZ5U(hܚѽ$isc-8՗*>gHdt~޽Z8И8Tj(T"P 9--]<~ ^\#9ckvPeӞQ4b e:((i HZ4\-xf8iF]mۭtTP8 5yVT<<0 3mGQݶ6#\ w?kb 6cS^CQk,`O<ꮁ]P Y5R6 ~iE&*f}Vhg2ᣞ4K?"PZeAPspbPth _L=s!^+5X(U V<VP7lcL!W"GNw{Mبy uh%{7Z8 q3BaZ]TCKf-NN K:wv.QǸ#A(gXʂ"& D P%h"ƌ7^,%#Ȑ"A(i A(Wy|2"1&Μ9) Pi֬}Bg -jQ]#2m* pBĊ+Cc ?z|J1L+2Ҡ#L3~D s%͡0Qz!D߼q j +WzSڶۢES6,W,W@5'8B)p4B)|/a:Ǖ3,C U\0DҧOtiIWjwy{rJt/O?=3*iQ%A@X!PTrX-&XWA BCQEQ0(C]wW\1!iUaQ\cb+B,XH68sf=:ER"x۟HOdrg!7н P}D  `Oz._@sP946Dk:Tp1⋄+`sXhJWdfSjq6Z"1z 9U@_"ЈDYX6 h}CԺֶMq>AⵀJ@$_ӫ@}܁6,%,`p,qNu$X>d0d &C1e^j;D)kqbhՓ EHiZ+P >7 P!rn X0VF6+v]B6O{5ԫeƁc p@ ?1YB p@<t ի@q4F! RT+_fCR9Le3֢cJ$`7ISɈ*y4{qZ< cġV= }5x,l(?w#Or떵/ׂݦE(8~w &dl(R .?HM<Ԑ;<L$]M&x>8NtWN Nҿ 5z̔&@Q D8ԉ~ V!zC\F[to0BD~D0`ҮDt#Ex'@tK@ڐ5|݃@zRƀŠ cb%yUDE.5Yr}u Uf@G#-tڰ)ҍ qpCy"Lfy #SeETIJ  =B.]3׉]<9|gKz+r#׽9((| Hw#!aB1ۉJ7iFZe 01&0\68Ճ;1miDAiZ o.@A - p %4G_\-`A_y(NQ?PA~V,ԃ/W`Āŀ@ME\P,a`&`k,MR.QC48;6( }H3 P ɉp .Bh AXM C8%Y + D:Pߚ'u~pqd(C,OE]m!kƃ$ K,1 hTc4590 8XaMXDфA#腊AS!a(U"PXb0d""p". b**Id+~M(E0.RT;x]ׅp\[C1\ X @ @:(U mЬth%c.Q,TO/Ă8x(jH ׳t X~+V@L"B&҂&e)JDH?3TQdFׅp #,ȃl\`'EQ!(eZ̿I` H%4KC./0H5̐ZF[fLxmTB", A@M%\b&Y @ c`dBL_b`&Gx@% x&& <@|0 d͸E#vl_*1 We0Cû9jm3)lU ^ei̩i Ȁ~D܌% HdeAAAH \b'vi+BTr;x gnUT@=P \P\Ƭ >]hF(=!&< d@jI*%:C` TF1(T x[aBp  F ph|OB.לyIĸ\"B G(}b!@*dt8p<() H| 8*ǶpԵRB[ ea6,J9L@Ă,ɂ/,F[ N)8:&aBDg) ť -T@=/*)lcoT+&e{>e$(\ [k^Q\fJ(+lUXY$ lf 8jp Z[ԃ6(»D h8R0ZHN 38 B/Dܬ89Dô[ā Ch/փj`Qǿ1FȂ6,C# m ,6B,@ BL%BhDʫ?Iҍ'`++Dx ػ:ā ~ҶOkƃ[,@^oLo+D d!ܪnl/hCĪpEp ̮s.> j4BB4 )@"al/6/Ml0 Ciʉ'5!AD@"W V@ fM+ lxz!`\p F,5,!VƂ/hiHH#ʊ 4@1n 6+H,8':<>l@m)\*j>iad)hfƻUDJ /]A+_iO @#_? (ƋIC V%@H] | X8I>K=sZ;Bo4F"3do^%p(ZtX /a*;hbh B"D.'/_/YC,HHm\W.-U!ʕ/%J Ԁ5_JB63 LP@"I6d˃snx#8(MӲJ q5mvM*YnBm(%BpA @n;xCo'u/4½VrD\mYdEp3 J]6 @\n #(9-hKk68qo/ ܴ+xH Aքp@ D n[s?x/(W@b]^ OJopQ@@,(p (MR9[\6C,D `t#Zo _A/C򎣹B+/3|{#6| {Ҫk{#4iD ATSMA51 6uC:|TM(Lhdŧ4ϤTfQ;G zRW ,^4 l0<`,_o`d$;CC=l `cB=(4}:JE{6{T ֿM[1W\ԝ@RZ}K*lq/6 ̍`@cHǘFb_l:#~@9tWZD:@=>,@ZLF1p.LA€H(\uE(+bN#6wZ&>w5:W% S3aPޠOrHxJA]3ԧ tL%KRw&$/1'ށ~`˅EK.T6cq8j 0uv>cA0;@%40фPЦ8BKw6prYXBY( ֦m[yQ@!XGi|i kb#Q9K挣 u߭Dp!xJ| 6` 38cr.\̉976sC(7Ə-) ~8RnhWDX|qI_D!Yy)9Gbzi*Esebzb9^E88艟mVmdA0eQ&Vv]bF*ڳYS60Xڰ`T D'7K08.P"r%|/R_D9Xkp9v&s8  txSY|lשO-pΐA ?v׈CPpE ZG453K##LD?0UZ0gHC1>^E,rыaD#۰UM1}E.iQtY3>Id*q잢:pN(XA _c}OQ5eXCUpp4|5fOTC~U 2x!DR@m~2 ;-AV*CU~Zȵ˜Nh$ x 删Jx,nN<鎶I`)HJCB l'%r!A,lB}СyB(wnCzN:EF': G!؀ \( NfLoaK@ h>(Gl#P,b vD(uNFT0h+ȩ0BM`BƝB#Dmۺ(ۺ(\V$ᑈeдj *%GDގLo ڠ Ŵ20h, d 3@Ipdx0pu+: )QeLRÌ|bt]2^$( Eȝ6 ZlUazvNAN Ft3#@Dde垢   ') i,1K lZv fch&ϊIC \.988 E@þq.ŝ<࢏d d 8QvF  f'zAāG! o:⫢J8,= ͠]V " \2& FH')#hq2(G# `KOe*NT>Lr+ 1-D,-(|- hFaP8 AY`o0qtv$BBQ\AK{*l@l"QTϞNTCP*2m& &e Ps255a36 ɉNװ e u\N9̱8{ Nh“IoM:U]5`+F|0,D :JR(%\W$`kA&&~"3r/3AVkHr>l2@`4AA'f|Ҧ*4o+O"L3tmO^FZ:bd@oNJB@"h"DNcw\a?R#F*KaK"9)jɤ2LKe,˧DPSS!8?zLS-Bjx 9(4: t4ghr1jw <@eD;o;H&.QI4*fO "# {_C :r, 0J։|<&*8E@!=@GvWAe 8!,zZJ#3?%XbYJP:ZM0#C( ڀ J&IL5w])~3_ilWTH.,+ѱQ݅-!."; #|\T)\Ϙ#G,ȍvXA 9fo6TWθ*H h1  IX  `E-,Y𒃓c`|Oz֒LE֖k* *҂-IF1Z"#9 %`n}N2 !?$ ~,(Ka I+dމ+!p]J5wA`''t3Z`84gxdD ?{c-F={̠3qhJ ixG0g9&?EI#?J, ,!QZre :f&LN Pebbr'n۶۬1c6lX\T]РFx'LYBړ4:54 RoG5b׿ >81H ;f 2d*[9sf"+2\!d[J2ٳ{b1  [b 2zIg@d18i*GHz5)odru@b*&Y)LmL1+^U!G\aUVmZi}gDg(Kg$Bb\TW~`cb${(@ "l0eJj "iAF4v4"͵ޤ0H-mCh@V KWod$H'0w8E^Jas(vB)g;S)P2U/AX.8LUCB&+ANA lhs ^=] C~>/?1??^}Җ0Pp44TM 01iM>EZQ2u:)=W`ٯ9͒:%{2dD .sšQ,Ua\JC)J'D$ .@`5FH'\gZ zEj>#OD+πRl~x(-E cLD1+\8e dvHKME6{Ne[ X0_U`ppчDpLJ~,+KSP0SSЙb-H=ˆ$HtOChJy1Tݝbխnn ԠtyTW9-1qp1Z1rk3klٳf e;Wlv]h3zCFt5+ѓaPY{Ç)HnqQ@TvBA{&jwޱW"'iBMTSqcC ppx%5FLSQTp W13*T3.X*y1Ybbs,ZbeshlxtwK灅 !+U'UWu**h$/4@8+C"p8h'A3/Y&&*36UD[~Cx G ?91; n!Ex+esffs(pxhVEmVWHg "H`{@tn"%Q'Md|$awZ-ZBA\[akw ~Є,v> KB86r27m!x(E ҅a;S ,ӌZ&Ј֘Ⓧ$aOGHu\`69p'Ky/SRZ .lAf1/kAbG$C=Q:K@ bքʀ)[xYc1N Y"Ru@yʭQ*A|A1U-aAEij\zS C NAwIILH4S/Jw)31dKNNm0NC  >h%O0G/6`6PrZ-*7J~h hΧRD0"' { GX 88J !xbw> [ыI/-B89s8{< N_$Z QPF,hRplQܙ >V# P '.`i07k4fv1Jmw}}hzw0%(G):K!ëbFcqλ !_@Lm+ {{yFM`RlSLk,<Ĭ#-,\S0wѡh:wK@38@1 I5i ̰ 7jWmY=j:j 4C3oD]!@Eb "=?IЏPeELVC!^M0MPxF'KTc0* ْ] {2Ghv6R@!% BM%I`8v|$A(ȁ RKl+9 P q;U eJaBv[Ut If{׀C@RMpLkg˿#2mPٖ(68R>m7f7ɚ|+? q `Ss jy۸x3jMKL:2 !`i5(QYEճv=?޳ -䃭Rܬp"(# Q>ٕҙh#&#.!7UCFD1j9 L#4*kPHPT*W'dv;BkZE=O0"zB]VVeiZ`R꫎`[=pY.૑AԗR\x-ZC0 :="#^yՔBjG:k05FNv=Yj˾BMD'>d ߇اO!`Ռa9hqBC42*i[ ;گ#O%ȺqV 9Cb'ޘZV-镞l" ҐnM _SOwy0N o0I@F!;Ɏ i@<%_^;j@T T,NvdM6lPJl{lڥkh ANIFVV;Q?? X?[^/78v'S U(cT$x߯s \4Z㊟==w {`FF;BeNoΚ&^?c$(# .D8)O1N#J!W„9'J!BDȌaԨKWrꕋ+P@Waʬ1&sɓSQ;*Nܶh\bաCLs&MaDY o-¥H3ZaƯ#`)M $I$k Pe̙5(P lt{kd=un O"')F G+=a;(K^]+VSDk/fѢY5*T񕞳|.WD:HJH>k.P`C/5 L 4PP2)lD73N -6`mjF nG!: Id(:&O9%h*ҋFtK9ǝmI/zκ6"9@ 6@bA-Pt J{a C+²>{+\al D}`( +]>w4_? W x@(FM^)CnH4% oW!F\H!rO :B`!~6. R@7|A_gRTD#Z Z"EEQhB^0CEi^%KwrQC`"h-Bɑ\G0B =X &@ |.F4i LMr_"p%/ɯmR'7hy U"eP6Y>BO;Az01!b*F ^C /@Ih) q4ؔ6qDGtӛ<)N'vPNKcT'`g<K#a Tbfhsd( qU>PEQpRݔBz֑'dIWhw; )JkV9>*BЎ E\bXP jAACe%Lfv M(U",pVԊ4 '[HI !s{%kh[+vV ,X54P5 ' )n" H/lv kϖ(k8*ڔ6kH-jWLV{mt8qPorI,ZыXzAXPSoxJAMB[neT;62ro:F1k}S'귿26`$ B. slCXQ`SY60-\ ?R谡`K U&CnanwQ1 jC]s0iJ{ZxArl3)ND_*Lg8 xڈVlHuQ`!40 $2\n5{ kB" 1=CAHi`7щf"J4nK#9?p춍.zw?i,Z Rb;rA a(C&2q K~fIl/ NmW&{\sknw=FCl D;!QJ (Auɦ݃}A Rik8CR*'8 ^qV)fΙk  v%q߭W{| :|7ǹ#sG>Azl#/#]J 䎍?F+TkLX/ܐc9;}UD2ٻvf>w҉0n^/6 GLB}]xK^tݝyLo^h@zD}8=uPlk ;.N N[LPB(r,+`ɰK>勍{9>[/(MPACRXb[;7  @ /j@D{ +9p pUxRxAGx I>ۚG;)<xAyA$ J UBk(=%T=ܺs[=$-p8EX@kE_T5E؂[&8Cѻ7tl9O)<|LIh 㹝KD# 04x 0KDD0q8LĬ#<@\HʸӰ*)Ȅ;BUTW8;E(> L+RP+6`,9C :, WP<>>ԾMDF&lFG$;D6 M?xʒBQ*JuA:S{E|J+ [d2PXwȆ?P & 5H7Hc&!e|T<\U\h>GX`Ip<I'AFhDMD`T-\Ǻ#qECHʧE[H/۸+jJMz$,F9H\KXXXN>MX,X@\M גICDD9ܼLLpЂVLZ,JQ,Edz L..dY,5 +ZM w`TѨ&[kR]NNQQLM(O؂"T8!L)#ɜGoS2_TYDY'(b)N[]6kk`fF~7nc5FmTUTj޵[Y[[i[i]a9THI(OH[[I-HgI~]\gg~d~ ( hCTW$C\b^h6c i~a.]5vc]ZuFiXvipĮgdBPd jUYXICn7\U^jD~j|g ^j&ل^%H3+⇆h8]kي cmemk ݐgvZ6kenYiafkV`jVM`iT0pF^TW^B PwHnҶ^L6mNmO.4/H <$/hm7m~Yb~C__Slk7~nk6Ydn_dPang[霾ipl]ۛl?i ɹ\egdyd)GQ{^LMƥ$^p~b[\]hA: pgp;o8=lvgh_p_Hl®`8oC]uH0paU%d~j(oa)OML+wx~؇x]P52(>s45_hqus09n;a~c~@wa6tnaqq&wUp>vPKgSwj&uS[gU{{{nuf5p]ݖb_u3m9b G0lXg9gvufnphg%:sFp" ggaÊYU^Zu&ٴic!4hΊ_ Cf׬V`UG

LjaN5Qmܦ[M $o+S]:OAהtDtEEqZ)w7\ԘX3M^bمV|2,x-`PV]zg5`A @i!/YgF-'Lo:=\c9:r3t_#_[δۊOF ʲ2?l;|tzc:k^8^W\bv6w0EB$ V `eygFۣsrxG9tZ6ƎzoG;$T;̢?.AA(EFwU; Kx(^T(IT"lPR8#g7^эCs1r0 KcG;QiuyĒMdD(NF B h-rы`6~Do`Dz!O9Xvk_9>ǎwik3g>^j$|HNr %DE3 bU1-Zh`*hP*<.qoe,Ow#{a= >jn-hGigϜFю&^&%MI*O hqZE0Η-?Q/܉x,Ey;юv 43 aȈG(145fmzv"@B>rET$&Y>1Q>Хj^zqX!43hWWmeI*aX&2YQ+j ¶N}%O/ӁRoHZGp0B*s۩rd-x>79@@fiݝ1j=6N;GaussSum-3.0.2/mesh2.gif0000666000175000017500000001336313222437274013464 0ustar noelnoelGIF89aZC!!!!!!!!!!!!!)11))))!1!1)!!)!+#6#9- 91991!!!)!!1!!11!9)!)!))))1))9))91)))11)1111911919B!B)B1B1B9B9BBJ1J1J9JBJBR)W3ZBe<JJRJZJkJJJRRZRcRkRRRZZcZkZcckckkB1*A;5?1tbE&8L$홲cqrġ+Ƭ>1F|%玏5{FO`UMrV8XbbeL22|ⶍ;13fck?z2Lc `dc0c꤉fe1`r 3X $@` 5Cu cNt6@̐'&}Mט$Ly &>t|6qCP0`3!|LL2f 䐌7p7Uc(S'zq0HS7@L69w Ca̐]ǠMyL5c04cM'2$rt p )`a%Ѩ 9a@ :!Kz#,f1E}XB= qU;ġ!3 `SMV! -ҩQ $d TĢr uc<ڊ@ &y+DtCD`TCtv9&,TAUJO_iH!!@Hݰ^OWd`8C4c83 0͋ICwPjN9URAOρɴhJ Y  H縇=t[a+GXpy{& a pN #^ܪV%a4G*I-A fMk\MA^@$5BHny{bGrc+1hBSD$`8A `"%ɐxZd@! Eiњ/dxK0 4l! $,QM0(ʣ6,ya]]zHʣP<<`c' 6d SDoz4.ha C]H`?QCr yB6BL`Q= LcVB"bj!N'm ]0D$C kD$@سAd}$`m i$H.1'?Ϯ7KKȂh4׼NC$FA\E$ܬVC;X\zЇ> O4@L!phqz<Êx7U8- qVoG"_Jq 6ObD\נHg~{z'? tdJ b0#4W5% ЂIq U|3,ʍ tݜ4UT[ @4jS<"Qguۮ qud#LM#VIm4EMnO\*_(6)8H5z#3) p0q~#ߵx@" z' -:e/}Tw-n7@QPB xp@[ X$_:K+n߼% 4 (>CTQԣ dj0 wr_ji  GSP}cq g@ 6s7p fe*|"q'x*" fi(nbg p},0\wG%`~uf`k6@ElW`VTjT fncZ&r `j'vZ`^3(}FECwx6\ H7d  ii ^StZY0 gŇ|f憼 vTje^ifYPUs@g t 𐅍 heWI`fbpV!V)ƃ>xuxrbb׀'`U#ۀ 2~p] ` &n0Duf[XN`DuYVr]i`bf"`az` Y3 :` vq7Vjjfhb_`N(Rjب'mFvq  Ɛ ptPD4,:( T`Rfa&Nj jqE` N( mPj Jv tf {! yIS4fUf+RUu&pN^f*mƏe& O @0DyWD `"qaai[-fb5 7nZTn ]jT|jn:ɍ0& ϴYi7ℛeeV_^ɏqvrnEW%wtx^H`X_k ~)DQD"GIe yVY m`V pnj؈(ckj pԑ &ĊjovYVEg0 ʧ PFy&_ 0ٚY-zMZ""&u8iUy, `ujnjZ" pVwRJ ܆^Vv_:٣8yG &n6hpXvؠ ÂYqeq%N&wV=ʍf kj g '&n&nXP[ pO)p 0WmqgkH x5TE0]u&Vy_g[k XX L Ib]| $6Z!j|Pz prh4`kL2~yaP$N2ZEJ rjuuj [Gr8 u + "`,p#* Yvqgbu櫿j Cd\0g<Py@ h ^ɈVZ]kZǍ`Zuf ]F[yw8 2\3A#~X,Q{ewPR`1[miXT|*ٳ@l.fvr@[ H`,})j*-D`;fe^' rP0jfjj'gl u5tt;oX ЕTR&;Z;ˍ鳟Evq\ P뿬2 ְ/u\YL,f5 ` odžXI>+ g;;hYrGK 0Sу}~ U,i*J(BOe :0>k{HNY'xJ!;Ucsx`*Y`GA5`Pƌȟ ?˾Hܻ&`'TDL@ 0qǀK-" f\ ]ԝԁ O΢P EZ}J31$0}Jjm*T`P׸ PѬ׫ LPO0XϧdJА `2`X6a}P P  ؁mN0-S aM=& /Н p @ ؽ P = =MN" Ӥ`ߑQ:9fِ P~ Ͱ p `.} ,x=y2,P -ٰ 3tQ p 9@GGJ0 `0(.` p:];c>5ܲ- !֠ ` h0۵ mFK@ АRN m-cN:@&ݡ ` ` 0 wm }NP`8 QT96*a a ~7M%eLPPP`7 P˾}0zO;