def test_ess_factory(self): """Test identifying the electronic structure software from the log file""" gaussian_log_path1 = os.path.join(self.data_path, 'gaussian', 'ethylene_G3.log') gaussian_log_path2 = os.path.join(self.data_path, 'gaussian', 'oxygen.log') molpro_log_path1 = os.path.join(self.data_path, 'molpro', 'HOSI_ccsd_t1.out') molpro_log_path2 = os.path.join(self.data_path, 'molpro', 'molpro_mrci+q.out') orca_path_1 = os.path.join(self.data_path, 'orca', 'Orca_dlpno_test.log') orca_path_2 = os.path.join(self.data_path, 'orca', 'Orca_opt_freq_test.log') orca_path_3 = os.path.join(self.data_path, 'orca', 'Orca_TS_test.log') qchem_log_path1 = os.path.join(self.data_path, 'qchem', 'CH4_sp.out') qchem_log_path2 = os.path.join(self.data_path, 'qchem', 'co.out') terachem_log_path_1 = os.path.join(self.data_path, 'terachem', 'ethane_minimize_output.out') terachem_log_path_2 = os.path.join( self.data_path, 'terachem', 'formaldehyde_sp_terachem_output.out') terachem_log_path_3 = os.path.join( self.data_path, 'terachem', 'formaldehyde_sp_terachem_results.dat') terachem_log_path_4 = os.path.join(self.data_path, 'terachem', 'formaldehyde_coords.xyz') terachem_log_path_5 = os.path.join(self.data_path, 'terachem', 'formaldehyde_output.geometry') non_ess_log_path = os.path.abspath( os.path.join(self.data_path, 'methoxy.py')) self.assertIsInstance(ess_factory(gaussian_log_path1), GaussianLog) self.assertIsInstance(ess_factory(gaussian_log_path2), GaussianLog) self.assertIsInstance(ess_factory(molpro_log_path1), MolproLog) self.assertIsInstance(ess_factory(molpro_log_path2), MolproLog) for orca_path in [orca_path_1, orca_path_2, orca_path_3]: self.assertIsInstance(ess_factory(orca_path), OrcaLog) self.assertIsInstance(ess_factory(qchem_log_path1), QChemLog) self.assertIsInstance(ess_factory(qchem_log_path2), QChemLog) for terachem_path in [ terachem_log_path_1, terachem_log_path_2, terachem_log_path_3, terachem_log_path_4, terachem_log_path_5 ]: self.assertIsInstance(ess_factory(terachem_path), TeraChemLog) with self.assertRaises(InputError): ess_factory(non_ess_log_path)
def setUp(cls): """A method that is run before each unit test in this class""" freqpath = os.path.join(RMG_PATH, 'arkane', 'data', 'TolueneFreq.log') rotpath = os.path.join(RMG_PATH, 'arkane', 'data', 'TolueneRot1.log') log = ess_factory(freqpath) conf, unscaled_freqs = log.load_conformer(symmetry=1, spin_multiplicity=1, optical_isomers=1, label='Toulene') coordinates, number, mass = log.load_geometry() conf.coordinates = (coordinates, "angstroms") conf.number = number conf.mass = (mass, "amu") hessian = log.load_force_constant_matrix() cls.hdnd = HinderedRotorClassicalND(pivots=[[3, 12]], tops=[[12, 13, 14, 15]], sigmas=[6.0], calc_path=rotpath, conformer=conf, F=hessian, semiclassical=True)
def read_scan(self): """ Read quantum optimization job files at self.calc_path to determine vectors of angles (self.phi1s, self.phi2s), xyz coordinates (self.xyzs) energies (self.Es) and atom numbers (self.atnums) for each point """ from arkane.common import symbol_by_number from arkane.ess.factory import ess_factory phi1s = [] phi2s = [] xyzs = [] Es = [] atnums = [] for f in os.listdir(self.calc_path): if len(f.split('_')) != 4: continue s, name, phi1, phi2 = f.split('_') # scangeom_r0_0.0_360.0.log phi2, identifier = '.'.join( phi2.split('.')[:-1]), phi2.split('.')[-1] if identifier != 'out': continue phi1s.append(float(phi1)) phi2s.append(float(phi2.split(".")[0])) fpath = os.path.join(self.calc_path, f) lg = ess_factory(fpath) Es.append(lg.load_energy()) xyz, atnums, _ = lg.load_geometry() xyzs.append(xyz) self.xyzs = xyzs self.phi1s = phi1s self.phi2s = phi2s self.Es = Es self.atnums = atnums self.element_names = [symbol_by_number[k] for k in self.atnums]
def read_scan(self): """ Read quantum optimization job files at self.calc_path to determine vectors of angles self.phis, xyz coordinates (self.xyzs) energies (self.Es) and atom numbers (self.atnums) for each point """ from arkane.ess.factory import ess_factory if os.path.isdir(self.calc_path): massdict = {el.number: el.mass for el in element_list if el.isotope == -1} N = len(self.pivots) phis = [] xyzs = [] Es = [] atnums = [] for f in os.listdir(self.calc_path): name, identifier = '.'.join(f.split('.')[:-1]), f.split('.')[-1] if identifier != 'out': continue outs = name.split('_') phivals = [float(x) for x in outs[-N:]] phivals = fill360s(phivals) fpath = os.path.join(self.calc_path, f) lg = ess_factory(fpath) E = lg.load_energy() xyz, atnum, _ = lg.load_geometry() for phival in phivals: phis.append(np.array(phival)) Es.append(lg.load_energy()) xyzs.append(xyz) if not self.atnums: atnums.append(atnum) if atnums: self.atnums = atnums q = len(phis) for i in range(N): # add the negative values to improve fit near 0.0 for j in range(q): phi = phis[j] if np.isclose(phi[i], 360.0): continue nvec = deepcopy(phi) nvec[i] -= 360.0 if any([np.array_equal(nvec, x) for x in phis]): continue phis.append(nvec) Es.append(Es[j]) xyzs.append(xyzs[j]) atnums.append(atnums[j]) self.xyzs = np.array(xyzs) self.Es = np.array(Es) self.E0 = self.Es.min() self.Es -= self.E0 self.phis = np.array(phis) self.phis *= np.pi / 180.0 inds = None if len(self.phis[0]) == 1: self.phis = np.array([phi[0] for phi in self.phis]) inds = np.argsort(self.phis) self.confs = [ Conformer(number=self.atnums, coordinates=(self.xyzs[k], "angstrom"), mass=(np.array([massdict[x] for x in self.atnums]), "amu")) for k in range(len(self.xyzs)) ] self.rootDs = np.array([ np.prod([conf.get_internal_reduced_moment_of_inertia(self.pivots[k], self.tops[k], option=3) for k in range(len(self.pivots))]) ** 0.5 for conf in self.confs ]) if inds is not None: self.rootDs = self.rootDs[inds] self.phis = self.phis[inds] self.Es = self.Es[inds] self.xyzs = self.xyzs[inds] elif os.path.isfile(self.calc_path): # reading a 1-D scan file, assume internal reduced moment of inertia is constant N = len(self.pivots) lg = ess_factory(self.calc_path) self.Es, self.phis = lg.load_scan_energies() self.atnums = self.conformer.number rootD = self.conformer.get_internal_reduced_moment_of_inertia(self.pivots[0], self.tops[0]) ** 0.5 self.rootDs = [rootD for i in range(len(self.Es))] phis = self.phis.tolist() for j, phi in enumerate(self.phis): # add the negative values to improve fit near 0.0 if phi != 2.0 * np.pi: phis.append(phi - 2.0 * np.pi) phis = np.array(phis) inds = np.argsort(phis) self.phis = phis[inds] Es = self.Es.tolist() Es.extend(Es[1:]) self.Es = np.array(Es)[inds] self.rootDs.extend(self.rootDs[1:]) self.rootDs = np.array(self.rootDs)[inds].tolist() else: raise IOError("path {} is not a file or a directory".format(self.calc_path))