def get_standard_orientation(self): stdsect = section_by_pattern(self.contents, pattern="Standard Nuclear Orientation")[1] coord_lines = section_by_pattern(stdsect, pattern="--------------------------------------")[1][1:] keys = ["I", "element", "x", "y", "z"] parsed = lines_to_dct(coord_lines, keys) self.elements = parsed['element'] arr_cols = [parsed['x'], parsed['y'], parsed['z']] self.std_coords = np.array(arr_cols, dtype=np.float64).transpose() self.n_atoms = len(self.elements)
def get_method(self): rem = section_by_pattern(self.contents, pattern="\$rem")[1] rembody = section_by_pattern(rem, pattern="\$end")[0] for line in rembody: if "method" in line.lower() and "solvent" not in line.lower(): self.method = line.split()[1].strip().upper() if "basis" in line.lower(): self.basis = line.split()[1].strip().upper() return self.method
def get_solvation(self): try: smx = section_by_pattern(self.contents, pattern="\$smx")[1] smxbody = section_by_pattern(smx, pattern="\$end")[0] for line in smxbody: if "solvent" in line.lower(): self.solvent = line.split()[1].strip().lower() self.solvate = True except IndexError: self.solvate = False self.solvent = None
def get_coordinates(self): molecule = section_by_pattern(self.contents, pattern="\$molecule")[1] molbody = section_by_pattern(molecule, pattern="\$end")[0] mollines = [x.strip() for x in molbody] mollines = [x for x in mollines if x] self.charge, self.multiplicity = map(int, mollines[1].split()) keys = ["element", "x", "y", "z"] self.parsed_coords = lines_to_dct(mollines[2:], keys) xyzs = [self.parsed_coords[col] for col in ["x", "y", "z"]] coordinates = np.array(xyzs, dtype=np.float64) self.coordinates = np.transpose(coordinates)
def get_standard_orientation(self): sto = section_by_pattern(self.contents, pattern="Standard orientation") stdsect = section_by_pattern(self.contents, pattern="Standard orientation")[-1] coord_lines = section_by_pattern(stdsect, pattern="--------------------------------------")[2][1:] keys = ["center", "at_z", "at_type", "x", "y", "z"] parsed = lines_to_dct(coord_lines, keys) arr_cols = [parsed['x'], parsed['y'], parsed['z']] try: self.std_coords = np.array(arr_cols, dtype=np.float64).transpose() except ValueError: print(self.filename) raise ValueError self.n_atoms = len(parsed['x']) self.at_z = np.array(parsed['at_z'], dtype=int)
def get_dft_details(self, verbose=0, scale=False, **kwargs): try: thermochem = section_by_pattern(self.contents, pattern="Thermochemistry")[1:][-1] self.thermochemistry = thermochem if verbose > 2: print("Thermochemistry found.") factors = scaling_factors["DEFAULT"] if scale: try: factors = scaling_factors[self.method][self.basis] except KeyError: printred(f"{self.method} {self.basis} scaling factors not specified yet.") self.__dict__.update(factors) if verbose > 2: print("\n".join([f"{k:>20}: {v}" for k, v in factors.items()])) self.temperature = float(self.search("Temperature", lines=thermochem).split()[1]) self.mass_total = float(self.search("Molecular mass", lines=thermochem).split(":")[1].strip().split()[0]) self.mass_total_kg = self.mass_total*AMU_TO_KG atom_lines = [x for x in thermochem if "Atom " in x] self.mass_atoms = [float(x.strip().split()[-1]) for x in atom_lines] if verbose > 2: print(f"""\ Temperature: {self.temperature} K Molecular mass: {self.mass_total_kg} kg \ """) self.check_frequencies(verbose=verbose) self.get_entropy(verbose=verbose) self.get_zero_point(verbose=verbose) self.get_hlc(verbose=verbose) self.get_thermal_correction(verbose=verbose) except: pass
def get_solvation(self): try: scrf_lines = section_by_pattern(self.contents, pattern="SCRF")[1][:2] scrf = "".join(scrf_lines) smodel, solvent_ = scrf.split("SCRF=(")[-1].strip().split(",") self.solvate = True self.solvent_model = smodel solvent = solvent_.split("=")[1].strip().split(")")[0].strip() if solvent == "h2o": self.solvent = "water" else: self.solvent = solvent except (ValueError, IndexError): self.solvate = False self.solvent = None self.solvent_model = None return dict(solvate=self.solvate, solvent=self.solvent, solvent_model=self.solvent_model)