Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 3,763 Bytes
1a9eacc 70b543a 1a9eacc 70b543a 1a9eacc 70b543a 1a9eacc 70b543a 1a9eacc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import gradio as gr
from pymatgen.ext.matproj import MPRester
from pymatgen.analysis.phase_diagram import PhaseDiagram, PDPlotter
from pymatgen.core.composition import Composition
import plotly.graph_objs as go
import os
from pymatgen.entries.computed_entries import ComputedEntry
from pymatgen.core import Composition
from datasets import load_dataset
# Load only the train split of the dataset
dataset = load_dataset("LeMaterial/leDataset", split="train")
# Convert the train split to a pandas DataFrame
train_df = dataset.to_pandas()
def create_phase_diagram(elements, max_e_above_hull, color_scheme, plot_style, functional, finite_temp):
# Split elements and remove any whitespace
element_list = [el.strip() for el in elements.split('-')]
# Fetch all entries from the Materials Project database
entries = [ComputedEntry(
Composition(row["chemical_formula_descriptive"]),
energy = row['energy'],
correction = row['energy_corrected']-row['energy'],
entry_id = row['immutable_id']) for n,row in df.iterrows() if len(
set(row['elements']).intersection(element_list))>0 and set(
row['elements']).issubset(element_list)]
# Fetch elemental entries (they are usually GGA calculations)
elemental_entries = [e for e in entries if e.composition.is_element]
# Filter entries based on functional
if functional == "GGA":
entries = [e for e in entries if not e.parameters.get("run_type", "").startswith("GGA+U")]
elif functional == "GGA+U":
entries = [e for e in entries if e.parameters.get("run_type", "").startswith("GGA+U")]
# Add elemental entries to ensure they are included
entries.extend([e for e in elemental_entries if e not in entries])
# Build the phase diagram
try:
phase_diagram = PhaseDiagram(entries)
except ValueError as e:
return go.Figure().add_annotation(text=str(e))
# Generate plotly figure
if plot_style == "2D":
plotter = PDPlotter(phase_diagram, show_unstable=True, backend="plotly")
fig = plotter.get_plot()
else:
# For 3D plots, limit to ternary systems
if len(element_list) == 3:
plotter = PDPlotter(phase_diagram, show_unstable=True, backend="plotly", ternary_style='3d')
fig = plotter.get_plot()
else:
return go.Figure().add_annotation(text="3D plots are only available for ternary systems.")
# Adjust the maximum energy above hull
# (This is a placeholder as PDPlotter does not support direct filtering)
# Return the figure
return fig
# Define Gradio interface components
elements_input = gr.Textbox(label="Elements (e.g., 'Li-Fe-O')", placeholder="Enter elements separated by '-'",
value="Li-Fe-O")
max_e_above_hull_slider = gr.Slider(minimum=0, maximum=1, value=0.1, label="Maximum Energy Above Hull (eV)")
color_scheme_dropdown = gr.Dropdown(choices=["Energy Above Hull", "Formation Energy"], label="Color Scheme")
plot_style_dropdown = gr.Dropdown(choices=["2D", "3D"], label="Plot Style")
functional_dropdown = gr.Dropdown(choices=["GGA", "GGA+U", "Both"], label="Functional")
finite_temp_toggle = gr.Checkbox(label="Enable Finite Temperature Estimation")
# Create Gradio interface
iface = gr.Interface(
fn=create_phase_diagram,
inputs=[
elements_input,
max_e_above_hull_slider,
color_scheme_dropdown,
plot_style_dropdown,
functional_dropdown,
finite_temp_toggle
],
outputs=gr.Plot(label="Phase Diagram"),
title="Materials Project Phase Diagram",
description="Generate a phase diagram for a set of elements using Materials Project data."
)
# Launch the app
iface.launch()
|