Source code for aimstools.postprocessing.charge_analysis

from aimstools.misc import *
from aimstools.postprocessing import FHIAimsOutputReader
from aimstools.structuretools import Structure

import os

logger = logging.getLogger("root")


[docs]class HirshfeldReader(FHIAimsOutputReader): """ A simple class to evaluate Hirshfeld charge analysis from AIMS. Args: output (pathlib object): Directory of outputfile or outputfile. Attributes: charges (dict): Dictionary of (index, species) tuples and hirshfeld charges. tot_charges (dict): Dictionary of species and summed hirshfeld charges. """ def __init__(self, output): super().__init__(output) self.charges = self.read_charges() self.total_charges = self.sum_charges()
[docs] def read_charges(self): with open(self.outputfile, "r") as file: ats = [] charges = [] read = False for line in file.readlines(): if "Performing Hirshfeld analysis" in line: read = True i = 0 if read: if "Atom" in line: ats.append( (int(line.split()[-2].strip(":")) - 1, line.split()[-1]) ) if "Hirshfeld charge :" in line: charges.append(float(line.split()[-1])) i += 1 if i == self.structure.get_global_number_of_atoms(): read = False charges = dict(zip(ats, charges)) return charges
[docs] def sum_charges(self, fragment_indices=[]): """ Sums charges of given indices of atoms for the same species. Args: filter (list): List of atom indices. If None, all atoms of same species will be summed up. """ indices = {i: j for i, j in self.charges.keys()} fragment_filter = ( [i[0] for i in self.charges.keys()] if fragment_indices == [] else fragment_indices ) sum_charges = {} for atom in fragment_filter: species = indices[atom] if species not in sum_charges.keys(): sum_charges[species] = self.charges[(atom, species)] else: sum_charges[species] += self.charges[(atom, species)] return sum_charges