Source code for spinguin.core.data_io

"""
This module contains functions for reading data from files and converting it
into suitable formats.
"""

# Imports
import numpy as np

[docs] def read_array(file_path: str, data_type: type) -> np.ndarray: """ Reads a .txt file where values are stored in a space-separated format and converts that into a NumPy array. Parameters ---------- file_path : str Path to the file to be read. data_type : type Data type of the values to be read (e.g., float or str). Returns ------- value_array : ndarray A NumPy array containing the values read from the file. """ # Open the file with open(file_path, 'r') as file: # Read the values into a NumPy array value_array = np.loadtxt(file, delimiter=None, dtype=data_type) return value_array
[docs] def read_xyz(file_path: str) -> np.ndarray: """ Reads a .xyz file where the first line specifies the number of atoms, the second line contains a comment, and the subsequent lines contain the atom symbols and Cartesian coordinates. Parameters ---------- file_path : str Path to the .xyz file to be read. Returns ------- xyz : ndarray A NumPy array containing the atom symbols and Cartesian coordinates. """ # Open the file with open(file_path, 'r') as file: # Initialize a list for the xyz coordinates xyz = [] # Read the number of atoms and skip the comment line n_atoms = int(file.readline()) file.readline() # Extract the coordinates for each atom for _ in range(n_atoms): # Read only the coordinates xyz.append(file.readline().split()[1:]) # Convert the list to a NumPy array xyz = np.array(xyz, dtype=float) return xyz
[docs] def read_tensors(file_path: str) -> np.ndarray: """ Reads a file containing Cartesian interaction tensors (from quantum chemistry calculations) for each spin or spin pair. The file should have the following format: - The first column is the index of the spin. - The subsequent columns represent the components of a 3x3 tensor. This structure is repeated for each spin. TODO: Input mahdollinen ilman nollatensoreita? Parameters ---------- file_path : str Path to the file containing the tensors. Returns ------- tensors : ndarray A NumPy array containing the tensors. """ # Initialize the lists and the current index tensors = [] matrix_rows = [] current_index = None # Open the file with open(file_path, 'r') as file: # Process each line for line in file: # Handle lines with spin indices differently if line.strip().split()[0].isdigit() and len(line.strip().split()) == 4: if current_index is not None: tensors.append(np.array(matrix_rows, dtype=float)) current_index = int(line.strip().split()[0]) matrix_rows = [list(map(float, line.strip().split()[1:]))] else: matrix_rows.append(list(map(float, line.strip().split()))) # Append the last tensor if current_index is not None: tensors.append(np.array(matrix_rows, dtype=float)) # Convert to a NumPy array tensors = np.array(tensors, dtype=float) return tensors