Warning: Can not open [/home/conf/public_html/cgi-bin/show_python.log]. Ignore No title

Download script from get_phonon.py
Related files:


import os
import sys
import pandas as pd
import matplotlib.pyplot as plt
import json
from monty.json import MontyEncoder

from mp_api.client import MPRester
from emmet.core.electronic_structure import BSPathType
from pymatgen.phonon.plotter import PhononBSPlotter, PhononDosPlotter


API_KEY = os.getenv('MP_APIKEY')
if API_KEY is None:
        print("\nError: Can not get MP API Key from the environment var MP_APIKEY\n")
        exit()

formula = None
kpath = None


def usage():
    print()
    print(f"Usage: python {sys.argv[0]} formula\n")

def update_vars():
    global formula

    argv = sys.argv
    narg = len(argv)
    if narg <= 1:
        print("\nError: Chemical formula must be given as the first arg\n")
        input("Press ENTER to terminate>>\n")
        exit()

    formula = argv[1]
    if narg >= 3: kpath = argv[2]

def get_MPReser(API_KEY = None):
    if not API_KEY: API_KEY = os.getenv('MP_APIKEY')
    if API_KEY is None:
        print("\nError: Can not get MP API Key from the environment var MP_APIKEY\n")
        return None

    mpr = MPRester(API_KEY)
    if mpr is None:
        print(f"\nError: Can not get MPRester using the given API_KEY [{API_KEY}]\n")
        return None

    return mpr

def get_material_ids(formula, mpr):
    search_results = mpr.materials.search(formula = formula, fields = [])
    if not search_results:
        print(f"No data found for {formula}")
        return None

    mid_list = []
    for res in search_results:
        mid_list.append(res.material_id)

    return mid_list


def get_phonon_data():
    mpr = get_MPReser()
    if not mpr: exit()

    mid_list = get_material_ids(formula, mpr)
    print("Material IDs:", mid_list)

    print()
    for mid in mid_list:
        print(f"Search for material ID [{mid}]...")
        ph_bs = mpr.get_phonon_bandstructure_by_material_id(mid)
        ph_dos = mpr.get_phonon_dos_by_material_id(mid)
        if ph_bs is None:
            print(f" Phonon band data is not available: Skip")
            continue
        if ph_dos is None:
            print(f" Phonon DOS data is not available: Skip")
            continue

        with open(f'phonon_band_{formula}_{mid}.json', 'w') as f:
            json.dump(ph_bs.as_dict(), f, cls = MontyEncoder, indent = 2)

        with open(f'phonon_dos_{formula}_{mid}.json', 'w') as f:
            json.dump(ph_dos.as_dict(), f, cls = MontyEncoder, indent = 2)

        phonon_bs_data = []
        for band in ph_bs.bands:
            for qpoint, frequency in zip(ph_bs.qpoints, band):
                phonon_bs_data.append([qpoint.frac_coords, frequency])

        phonon_bs_df = pd.DataFrame(phonon_bs_data, columns=['Q-Point', 'Frequency'])
        phonon_bs_df.to_csv(f'phonon_band_{formula}_{mid}.csv', index=False)

        phonon_dos_data = []
        for frequency, density in zip(ph_dos.frequencies, ph_dos.densities):
            phonon_dos_data.append([frequency, density])

        phonon_dos_df = pd.DataFrame(phonon_dos_data, columns=['Frequency', 'Density of States'])
        phonon_dos_df.to_csv(f'phonon_dos_{formula}_{mid}.csv', index=False)

        phonon_bs_plotter = PhononBSPlotter(ph_bs)
        plt_phonon_bs = phonon_bs_plotter.get_plot()
        fig_phonon_bs = plt_phonon_bs.figure
        fig_phonon_bs.savefig(f'phonon_band_{formula}_{mid}.png')

        phonon_dos_plotter = PhononDosPlotter()
        phonon_dos_plotter.add_dos("Total DOS", ph_dos)
        plt_phonon_dos = phonon_dos_plotter.get_plot()
        fig_phonon_dos = plt_phonon_dos.figure
        fig_phonon_dos.savefig(f'phonon_dos_{formula}_{mid}.png')



def main():
    update_vars()

    get_phonon_data()

    usage()
    print()
    input("Press ENTER to terminate>>\n")
    exit()


if __name__ == "__main__":
    main()