6
$\begingroup$

My aim is to voxelize a CHGCAR file. I am trying to build up a workflow to do the same. With the aid of the Matter Modeling community members, I have figured out a way to convert a CHGCAR file into the CUBE format. Now I want to further process the CUBE file, in an attempt to voxelize it.

$\endgroup$
1
  • $\begingroup$ I read here that "Voxelization is the process of converting data structures that store geometric information in a continuous domain (such as a 3D triangular mesh) into a rasterized image (a discrete grid)." A cube file stores information on a discrete 3d grid, i.e. it already is "voxelized". $\endgroup$ – leopold.talirz Jun 27 at 11:17
8
$\begingroup$

I'm not sure precisely what you mean, but if you want to convert a Cube file to an ($N\times4$) matrix where $N$ is the number of points and the 4 columns are (x,y,z,value), you can try the following code snippet taken from my GitHub repository here, which I reproduce below:


cube_filepath = '/path/to/mycube.cube' # Path to Cube File

def cube_to_xyzval(cube_file):
    """
    Converts cube to pandas DataFrame

    Args:
        cube_file (string): path to cube file
    
    Returns:
        pd_data (Pandas dataframe): dataframe of (x,y,z,val) grid
    """
    at_coord=[]
    spacing_vec=[]
    nline = 0
    values=[]
    data = []
    with open(cube_file,'r') as f:
        for line in f:
            nline += 1
            if nline == 3:
                nat=int(line.split()[0])
            elif nline >3 and nline <= 6:
                spacing_vec.append(line.split())
            elif nline > 6 and nline <= 6+nat:
                at_coord.append(line.split())
            elif nline > 5 and nline > 6+nat:
                for i in line.split():
                    values.append(float(i))
    idx = -1
    for i in range(0,int(spacing_vec[0][0])):
        for j in range(0,int(spacing_vec[1][0])):
            for k in range(0,int(spacing_vec[2][0])):
                idx += 1
                x,y,z = i*float(spacing_vec[0][1]),j*float(spacing_vec[1][2]),k*float(spacing_vec[2][3])
                data.append([x,y,z,values[idx]])
    pd_data = pd.DataFrame(data)
    return pd_data

df = cube_to_xyzval(cube_filepath)
df.columns = ['x','y','z','val']
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.