def classify_gauss_outputs(gauss_files, only_converged=False): """ Classify the gaussian output files into single point ('sp'), frequency ('freq') and scan ('scan') Args: gauss_files (list): A list of paths to gaussian output file Returns: classified (dict): A dict indicates the files and some properties """ classified = {'sp': [], 'freq': [], 'scan': []} for gauss_file in gauss_files: options = parse_gauss_options(gauss_file) job_type = get_gauss_job_type(options) converged = get_gauss_termination_status(gauss_file) if job_type in ['opt', 'opt+freq', 'composite']: if not only_converged or converged: log = GaussianLog(gauss_file) energy = log.load_energy() / Na / E_h ts = 'TS' if 'opt' in options.keys() and 'ts' in options['opt'] else 'nonTS' classified['sp'].append((gauss_file, converged, options['method'][0], energy, ts)) if job_type in ['freq', 'opt+freq', 'composite']: if not only_converged or converged: freqs = get_gauss_frequencies(gauss_file) classified['freq'].append((gauss_file, converged, options['method'][0], freqs)) if job_type == 'scan': if not only_converged or converged: scan_info = parse_gauss_scan_info(gauss_file) classified['scan'].append((gauss_file, converged, options['method'][0], scan_info)) return classified
def testLoadEthyleneFromGaussianLog_G3(self): """ Uses a Gaussian03 log file for ethylene (C2H4) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog( os.path.join(os.path.dirname(__file__), 'data', 'ethylene_G3.log')) conformer, unscaled_frequencies = log.loadConformer() E0 = log.loadEnergy() self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, NonlinearRotor) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HinderedRotor) ]) == 0) trans = [ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ][0] rot = [ mode for mode in conformer.modes if isinstance(mode, NonlinearRotor) ][0] vib = [ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ][0] Tlist = numpy.array([298.15], numpy.float64) self.assertAlmostEqual(trans.getPartitionFunction(Tlist), 5.83338e6, delta=1e1) self.assertAlmostEqual(rot.getPartitionFunction(Tlist), 2.53410e3, delta=1e-2) self.assertAlmostEqual(vib.getPartitionFunction(Tlist), 1.0304e0, delta=1e-4) self.assertAlmostEqual(E0 / constants.Na / constants.E_h, -78.562189, 4) self.assertEqual(conformer.spinMultiplicity, 1) self.assertEqual(conformer.opticalIsomers, 1)
def testLoadOxygenFromGaussianLog(self): """ Uses a Gaussian03 log file for oxygen (O2) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog(os.path.join(os.path.dirname(__file__),'data','oxygen.log')) conformer = log.loadConformer(symfromlog=True) E0 = log.loadEnergy() self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,LinearRotor)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HinderedRotor)]) == 0) trans = [mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)][0] rot = [mode for mode in conformer.modes if isinstance(mode,LinearRotor)][0] vib = [mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)][0] Tlist = numpy.array([298.15], numpy.float64) self.assertAlmostEqual(trans.getPartitionFunction(Tlist), 7.11169e6, delta=1e1) self.assertAlmostEqual(rot.getPartitionFunction(Tlist), 7.13316e1, delta=1e-4) self.assertAlmostEqual(vib.getPartitionFunction(Tlist), 1.00037e0, delta=1e-4) self.assertAlmostEqual(E0 / constants.Na / constants.E_h, -150.3784877, 4) self.assertEqual(conformer.spinMultiplicity, 3) self.assertEqual(conformer.opticalIsomers, 1)
def testLoadOxygenFromGaussianLog(self): """ Uses a Gaussian03 log file for oxygen (O2) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog(os.path.join(os.path.dirname(__file__),'data','oxygen.log')) conformer, unscaled_frequencies = log.loadConformer() E0 = log.loadEnergy() self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,LinearRotor)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HinderedRotor)]) == 0) trans = [mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)][0] rot = [mode for mode in conformer.modes if isinstance(mode,LinearRotor)][0] vib = [mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)][0] Tlist = numpy.array([298.15], numpy.float64) self.assertAlmostEqual(trans.getPartitionFunction(Tlist), 7.11169e6, delta=1e1) self.assertAlmostEqual(rot.getPartitionFunction(Tlist), 7.13316e1, delta=1e-4) self.assertAlmostEqual(vib.getPartitionFunction(Tlist), 1.00037e0, delta=1e-4) self.assertAlmostEqual(E0 / constants.Na / constants.E_h, -150.3784877, 4) self.assertEqual(conformer.spinMultiplicity, 3) self.assertEqual(conformer.opticalIsomers, 1)
def testLoadEthyleneFromGaussianLog_CBSQB3(self): """ Uses a Gaussian03 log file for ethylene (C2H4) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog(os.path.join(os.path.dirname(__file__),'data','ethylene.log')) conformer, unscaled_frequencies = log.loadConformer() E0 = log.loadEnergy() self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,NonlinearRotor)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)]) == 1) self.assertTrue(len([mode for mode in conformer.modes if isinstance(mode,HinderedRotor)]) == 0) trans = [mode for mode in conformer.modes if isinstance(mode,IdealGasTranslation)][0] rot = [mode for mode in conformer.modes if isinstance(mode,NonlinearRotor)][0] vib = [mode for mode in conformer.modes if isinstance(mode,HarmonicOscillator)][0] Tlist = numpy.array([298.15], numpy.float64) self.assertAlmostEqual(trans.getPartitionFunction(Tlist), 5.83338e6, delta=1e1) self.assertAlmostEqual(rot.getPartitionFunction(Tlist), 2.59622e3, delta=1e-2) self.assertAlmostEqual(vib.getPartitionFunction(Tlist), 1.0481e0, delta=1e-4) self.assertAlmostEqual(E0 / constants.Na / constants.E_h, -78.467452, 4) self.assertEqual(conformer.spinMultiplicity, 1) self.assertEqual(conformer.opticalIsomers, 1)
def test_load_ethylene_from_gaussian_log_cbsqb3(self): """ Uses a Gaussian03 log file for ethylene (C2H4) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog( os.path.join(os.path.dirname(__file__), 'data', 'ethylene.log')) conformer, unscaled_frequencies = log.load_conformer() e0 = log.load_energy() self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, NonlinearRotor) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HinderedRotor) ]) == 0) trans = [ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ][0] rot = [ mode for mode in conformer.modes if isinstance(mode, NonlinearRotor) ][0] vib = [ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ][0] t_list = np.array([298.15], np.float64) self.assertAlmostEqual(trans.get_partition_function(t_list), 5.83338e6, delta=1e1) self.assertAlmostEqual(rot.get_partition_function(t_list), 2.59622e3, delta=1e-2) self.assertAlmostEqual(vib.get_partition_function(t_list), 1.0481e0, delta=1e-4) self.assertAlmostEqual(e0 / constants.Na / constants.E_h, -78.467452, 4) self.assertEqual(conformer.spin_multiplicity, 1) self.assertEqual(conformer.optical_isomers, 1)
def test_load_oxygen_from_gaussian_log(self): """ Uses a Gaussian03 log file for oxygen (O2) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog( os.path.join(os.path.dirname(__file__), 'data', 'oxygen.log')) conformer, unscaled_frequencies = log.load_conformer() e0 = log.load_energy() self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, LinearRotor) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ]) == 1) self.assertTrue( len([ mode for mode in conformer.modes if isinstance(mode, HinderedRotor) ]) == 0) trans = [ mode for mode in conformer.modes if isinstance(mode, IdealGasTranslation) ][0] rot = [ mode for mode in conformer.modes if isinstance(mode, LinearRotor) ][0] vib = [ mode for mode in conformer.modes if isinstance(mode, HarmonicOscillator) ][0] t_list = np.array([298.15], np.float64) self.assertAlmostEqual(trans.get_partition_function(t_list), 7.11169e6, delta=1e1) self.assertAlmostEqual(rot.get_partition_function(t_list), 7.13316e1, delta=1e-4) self.assertAlmostEqual(vib.get_partition_function(t_list), 1.00037e0, delta=1e-4) self.assertAlmostEqual(e0 / constants.Na / constants.E_h, -150.3784877, 4) self.assertEqual(conformer.spin_multiplicity, 3) self.assertEqual(conformer.optical_isomers, 1)
def setUp(cls): """A method that is run before each unit test in this class""" spc = Species().fromSMILES('CCO') log = GaussianLog(os.path.join(os.path.dirname(__file__), 'data', 'ethylene.log')) spc.conformer = log.loadConformer()[0] coords, numbers, masses = log.loadGeometry() spc.conformer.coordinates = coords, 'angstroms' spc.conformer.number = numbers spc.conformer.mass = masses, 'amu' cls.thermo_job = ThermoJob(species=spc, thermoClass='NASA')
def determine_qm_software(fullpath): """ Given a path to the log file of a QM software, determine whether it is Gaussian, Molpro, or QChem """ with open(fullpath, 'r') as f: line = f.readline() software_log = None while line != '': if 'gaussian' in line.lower(): f.close() software_log = GaussianLog(fullpath) break elif 'qchem' in line.lower(): f.close() software_log = QChemLog(fullpath) break elif 'molpro' in line.lower(): f.close() software_log = MolproLog(fullpath) break line = f.readline() else: raise InputError( 'File at {0} could not be identified as a Gaussian, ' 'QChem or Molpro log file.'.format(fullpath)) return software_log
def test_get_str_xyz(self): """Test generating an xyz string from the species.conformer object""" log = GaussianLog( os.path.join(os.path.dirname(__file__), 'data', 'ethylene_G3.log')) conformer = log.load_conformer()[0] coords, number, mass = log.load_geometry() conformer.coordinates, conformer.number, conformer.mass = ( coords, "angstroms"), number, (mass, "amu") spc1 = Species(smiles='C=C') spc1.conformer = conformer xyz_str = get_str_xyz(spc1) expected_xyz_str = """C 0.00545100 0.00000000 0.00339700 H 0.00118700 0.00000000 1.08823200 H 0.97742900 0.00000000 -0.47841600 C -1.12745800 0.00000000 -0.70256500 H -1.12319800 0.00000000 -1.78740100 H -2.09943900 0.00000000 -0.22075700""" self.assertEqual(xyz_str, expected_xyz_str)
def testLoadSymmetryAndOptics(self): """ Uses a Gaussian03 log file for oxygen (O2) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog(os.path.join(os.path.dirname(__file__),'data','oxygen.log')) optical, symmetry = log.get_optical_isomers_and_symmetry_number() self.assertEqual(optical,1) self.assertEqual(symmetry,2) conf = log.loadConformer()[0] self.assertEqual(conf.opticalIsomers, 1) found_rotor = False for mode in conf.modes: if isinstance(mode,LinearRotor): self.assertEqual(mode.symmetry,2) found_rotor = True self.assertTrue(found_rotor)
def testLoadSymmetryAndOptics(self): """ Uses a Gaussian03 log file for oxygen (O2) to test that its molecular degrees of freedom can be properly read. """ log = GaussianLog( os.path.join(os.path.dirname(__file__), 'data', 'oxygen.log')) optical, symmetry = log.get_optical_isomers_and_symmetry_number() self.assertEqual(optical, 1) self.assertEqual(symmetry, 2) conf = log.loadConformer()[0] self.assertEqual(conf.opticalIsomers, 1) found_rotor = False for mode in conf.modes: if isinstance(mode, LinearRotor): self.assertEqual(mode.symmetry, 2) found_rotor = True self.assertTrue(found_rotor)