Example #1
0
def loadConfiguration(energyLog, geomLog, statesLog, extSymmetry, spinMultiplicity, freqScaleFactor, linear, rotors, atoms, bonds, E0=None, TS=False):
    
    logging.debug('    Reading optimized geometry...')
    log = GaussianLog(geomLog)
    geom = log.loadGeometry()
    
    logging.debug('    Reading energy...')
    if E0 is None:
        if energyLog is not None: log = GaussianLog(energyLog)
        E0 = log.loadEnergy()
    else:
        E0 *= 4.35974394e-18 * constants.Na     # Hartree/particle to J/mol
    E0 = applyEnergyCorrections(E0, modelChemistry, atoms, bonds)
    logging.debug('         E0 (0 K) = %g kcal/mol' % (E0 / 4184))
    
    logging.debug('    Reading molecular degrees of freedom...')
    log = GaussianLog(statesLog)
    states = log.loadStates(symmetry=extSymmetry)
    states.spinMultiplicity = spinMultiplicity
    
    F = log.loadForceConstantMatrix()
    
    if F is not None and len(geom.mass) > 1 and len(rotors) > 0:
        
        logging.debug('    Fitting %i hindered rotors...' % len(rotors))
        for scanLog, pivots, top, symmetry in rotors:
            log = GaussianLog(scanLog)
            fourier = log.fitFourierSeriesPotential()
            inertia = geom.getInternalReducedMomentOfInertia(pivots, top)
            rotor = HinderedRotor(inertia=(inertia*constants.Na*1e23,"amu*angstrom^2"), symmetry=symmetry, fourier=(fourier,"J/mol"))
            states.modes.append(rotor)
            
            #import numpy
            #import pylab
            #import math
            #Vlist = log.loadScanEnergies()
            #Vlist = Vlist[:-1]
            #angle = numpy.arange(0.0, 2*math.pi+0.00001, 2*math.pi/(len(Vlist)-1), numpy.float64)
            #phi = numpy.arange(0, 6.3, 0.02, numpy.float64)
            #pylab.plot(angle, Vlist / 4184, 'ok')
            #pylab.plot(phi, rotor.getPotential(phi) / 4184, '-k')
        #pylab.show()
        
        logging.debug('    Determining frequencies from reduced force constant matrix...')
        frequencies = list(projectRotors(geom, F, rotors, linear, TS))
        
    elif len(states.modes) > 2:
        frequencies = states.modes[2].frequencies.values
        rotors = []
    else:
        frequencies = []
        rotors = []

    for mode in states.modes:
        if isinstance(mode, HarmonicOscillator):
            mode.frequencies.values = numpy.array(frequencies, numpy.float) * freqScaleFactor

    return E0, geom, states
Example #2
0
def loadTransitionState(label, geomLog, statesLog, extSymmetry, spinMultiplicity, freqScaleFactor, linear, rotors, atoms, bonds, directory=None, E0=None, energyLog=None):
    global modelChemistry
    logging.info('Loading transition state %s...' % label)
    if directory:
        geomLog = os.path.join(directory, geomLog)
        statesLog = os.path.join(directory, statesLog)
        if energyLog: energyLog = os.path.join(directory, energyLog)
    E0, geom, states = loadConfiguration(energyLog, geomLog, statesLog, extSymmetry, spinMultiplicity, freqScaleFactor, linear, rotors, atoms, bonds, E0, TS=True)
    log = GaussianLog(statesLog)
    frequency = log.loadNegativeFrequency()
    transitionStateDict[label] = TransitionState(label=label, states=states, frequency=(frequency,"cm^-1"), E0=(E0/1000.,"kJ/mol"))
    geometryDict[label] = geom
Example #3
0
def loadConfiguration(energyLog, geomLog, statesLog, extSymmetry, spinMultiplicity, freqScaleFactor, linear, rotors, atoms, bonds, E0=None, TS=False):
    
    logging.debug('    Reading optimized geometry...')
    log = GaussianLog(geomLog)
    geom = log.loadGeometry()
    
    logging.debug('    Reading energy...')
    if E0 is None:
        if energyLog is not None: log = GaussianLog(energyLog)
        E0 = log.loadEnergy()
    else:
        E0 *= 4.35974394e-18 * constants.Na     # Hartree/particle to J/mol
    E0 = applyEnergyCorrections(E0, modelChemistry, atoms, bonds)
    logging.debug('         E0 (0 K) = %g kcal/mol' % (E0 / 4184))
    
    logging.debug('    Reading molecular degrees of freedom...')
    log = GaussianLog(statesLog)
    states = log.loadStates(symmetry=extSymmetry)
    states.spinMultiplicity = spinMultiplicity
    
    F = log.loadForceConstantMatrix()
    
    if F is not None and len(geom.mass) > 1 and len(rotors) > 0:
        
        logging.debug('    Fitting %i hindered rotors...' % len(rotors))
        for scanLog, pivots, top, symmetry in rotors:
            log = GaussianLog(scanLog)
            
            Vlist, angle = log.loadScanEnergies()
            
            inertia = geom.getInternalReducedMomentOfInertia(pivots, top)
            
            barr, symm = log.fitCosinePotential()
            cosineRotor = HinderedRotor(inertia=(inertia*constants.Na*1e23,"amu*angstrom^2"), symmetry=symm, barrier=(barr/4184.,"kcal/mol"))
            fourier = log.fitFourierSeriesPotential()
            fourierRotor = HinderedRotor(inertia=(inertia*constants.Na*1e23,"amu*angstrom^2"), symmetry=symmetry, fourier=(fourier,"J/mol"))
                
            Vlist_cosine = cosineRotor.getPotential(angle)
            Vlist_fourier = fourierRotor.getPotential(angle)
            
            rms_cosine = numpy.sqrt(numpy.sum((Vlist_cosine - Vlist) * (Vlist_cosine - Vlist)) / (len(Vlist) - 1)) / 4184.
            rms_fourier = numpy.sqrt(numpy.sum((Vlist_fourier - Vlist) * (Vlist_fourier - Vlist))/ (len(Vlist) - 1)) / 4184.
            print rms_cosine, rms_fourier, symm, symmetry
            
            # Keep the rotor with the most accurate potential
            rotor = cosineRotor if rms_cosine < rms_fourier else fourierRotor
            # However, keep the cosine rotor if it is accurate enough, the
            # fourier rotor is not significantly more accurate, and the cosine
            # rotor has the correct symmetry 
            if rms_cosine < 0.05 and rms_cosine / rms_fourier > 0.25 and rms_cosine / rms_fourier < 4.0 and symmetry == symm:
                rotor = cosineRotor
            
            states.modes.append(rotor)
            
            import pylab
            phi = numpy.arange(0, 6.3, 0.02, numpy.float64)
            fig = pylab.figure()
            pylab.plot(angle, Vlist / 4184, 'ok')
            linespec = '-r' if rotor is cosineRotor else '--r'
            pylab.plot(phi, cosineRotor.getPotential(phi) / 4184, linespec)
            linespec = '-b' if rotor is fourierRotor else '--b'
            pylab.plot(phi, fourierRotor.getPotential(phi) / 4184, linespec)
            pylab.legend(['scan', 'cosine', 'fourier'], loc=1)
            pylab.xlim(0, 2*math.pi)
            
            axes = fig.get_axes()[0]
            axes.set_xticks([float(j*math.pi/4) for j in range(0,9)])
            axes.set_xticks([float(j*math.pi/8) for j in range(0,17)], minor=True)
            axes.set_xticklabels(['$0$', '$\pi/4$', '$\pi/2$', '$3\pi/4$', '$\pi$', '$5\pi/4$', '$3\pi/2$', '$7\pi/4$', '$2\pi$'])

            
        pylab.show()
        
        logging.debug('    Determining frequencies from reduced force constant matrix...')
        frequencies = list(projectRotors(geom, F, rotors, linear, TS))
        
    elif len(states.modes) > 2:
        frequencies = states.modes[2].frequencies.values
        rotors = []
    else:
        frequencies = []
        rotors = []

    for mode in states.modes:
        if isinstance(mode, HarmonicOscillator):
            mode.frequencies.values = numpy.array(frequencies, numpy.float) * freqScaleFactor

    return E0, geom, states
Example #4
0
from gaussian import GaussianCom, GaussianLog

print("Trying to read qm_modred_gen.com, a simple gassian.com file")
gaussian_file_name = "qm_modred_gen.com"
gaussian_com = GaussianCom(gaussian_file_name)
print("List of atoms:\n", gaussian_com.atoms_list)
print("Everything seems ok\n\n")

print("Trying to read oniom.com, a simple ONIOM gassian.com file")
gaussian_file_name = "oniom.com"
gaussian_com = GaussianCom(gaussian_file_name)
print("List of atoms:\n", gaussian_com.atoms_list[0:100], " ... ")
print("Everything seems ok\n\n")

print("Trying to read oniom_pdb.com, a ONIOM gassian.com file with pdb info")
gaussian_file_name = "oniom_pdb.com"
gaussian_com = GaussianCom(gaussian_file_name)
print("List of atoms:\n", gaussian_com.atoms_list[0:100], " ... ")
print("Everything seems ok\n\n")

print("Trying to read oniom_pdb.log, a ONIOM gassian.log file with pdb info")
gaussian_file_name = "oniom_pdb.log"
gaussian_log = GaussianLog(gaussian_file_name)
print("Everything seems ok\n\n")

print("Trying to read big_scan_oniom.log, a 1.2 GB ONIOM gassian.log file")
gaussian_file_name = "big_scan_oniom.log"
gaussian_log = GaussianLog(gaussian_file_name)
print("Everything seems ok\n\n")
Example #5
0
    if len(sys.argv) == 1 or sys.argv[1] in ["-h", "--help"]:
        print("Como usar: {0} file.log ").format(sys.argv[0])
        sys.exit()

    #ficheiro entrada (output do gaussian)
    global filein
    filein = sys.argv[1]
    #transformar o ficheiro log aberto numa variavel global (ler com o GaussianLog)



############## INICIO ############## 
main()

#ler os bytes de todo o ficheiro e fazer todos os atributos d
gaussianlog = GaussianLog(filein)
for i, scan_step in enumerate( gaussianlog.grep_bytes['Step number'] ):
    print( "Scan", i, ": ", len(gaussianlog.grep_bytes['Step number'][i]), "opt steps" )

scan_step = input('Type "scan_step" that you which to extract. Options: scan_step="all": ')
opt_step = input('Type "opt_step" that you which to extract. Options: opt_step="all": ')

#verificar se existe o ficheiro
output = input('Type the name of the output file: ')
if path.exists(output + '.pdb'):
    raise RuntimeError('%s already exists' %(str(output)+".pdb"))
open_output = open(str(output) + ".pdb", "w")

#casos em que extraio todos os scans
if str(scan_step) == 'all':
    print(len(gaussianlog.grep_bytes['orientation:']))
        distpair = tuple([int(x) for x in line.split()])
        dists.append(distpair)

input_file_list = sys.argv[2:]  #com files

results_dict = OrderedDict([])

for input_file in input_file_list:
    input_file_no_suf = input_file[:-4]
    results_dict[input_file_no_suf] = []
    #print(input_file)
    if input_file.endswith(".com"):
        gaussian_file = GaussianCom(input_file)
        structure = gaussian_file.atoms_list
    else:
        gaussian_file = GaussianLog(input_file)
        structure = gaussian_file.final_geometry
    for pair in dists:
        atom_a = structure[pair[0] - 1]
        atom_b = structure[pair[1] - 1]
        this_dist = atom_a.distance(atom_b)
        if len(pair) == 2:
            results_dict[input_file_no_suf].append(
                "{0:7.5f}".format(this_dist))
            #print("{0:>3}{2[0]:<4}-{1:>3}{2[1]:<4}        :   {3:7.3f}".format(atom_a,atom_b,pair,this_dist))
        elif len(pair) == 3:
            atom_c = structure[pair[2] - 1]
            this_angle = atom_b.angle(atom_a, atom_c)
            this_angle = math.degrees(this_angle)
            results_dict[input_file_no_suf].append(
                "{0:7.3f}".format(this_angle))
Example #7
0
from elements_database import ATOMIC_NUMBER_DICT

try:
    reactants_folder = sys.argv[1]
    ts_folder = sys.argv[2]
    original_ts_energy = float(sys.argv[3])
except:
    print(
        "Usage: residel_energies.py <reactants_folder> <ts_folder> <ts_energy>"
    )
    sys.exit()

for reactants_filename in os.listdir(reactants_folder):
    if reactants_filename.endswith(".log"):
        try:
            reactants_energy = GaussianLog("{0}/{1}"\
            .format(reactants_folder,reactants_filename)).energies_list[-1][-1]
        except IndexError:
            reactants_energy = None

        try:
            ts_filenames = os.listdir(ts_folder)
            ts_filename_end = "_".join(reactants_filename.split("_")[-2:])
            ts_filename = ts_folder + "_" + ts_filename_end
            ts_energy = GaussianLog("{0}/{1}"\
                   .format(ts_folder,ts_filename)).energies_list[-1][-1]
        except IndexError:
            ts_energy = None

        if reactants_energy and ts_energy:
            print(
                ts_filename_end[:-4],