Create an app that can be used to plan and schedule experiments in an semiconductor R&D production environment
Drop files here
or click to upload
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float, Text, ForeignKey
from sqlalchemy.orm import Session, DeclarativeBase, relationship
# Database setup
class Base(DeclarativeBase):
pass
class Experiment(Base):
__tablename__ = "experiments"
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
description = Column(Text)
equipment = Column(String(100))
start_time = Column(DateTime)
duration_hours = Column(Float)
status = Column(String(20))
results = Column(Text)
created_at = Column(DateTime, default=datetime.now)
engine = create_engine("sqlite:///semiconductor_experiments.sqlite")
Base.metadata.create_all(bind=engine)
# App title
st.title("Semiconductor R&D Experiment Planner")
# Sidebar for adding new experiments
st.sidebar.header("Add New Experiment")
# Input form
with st.sidebar.form("new_experiment"):
name = st.text_input("Experiment Name")
description = st.text_area("Description")
equipment = st.selectbox(
"Equipment",
["CVD Reactor", "Ion Implanter", "Plasma Etcher", "Oxidation Furnace", "Other"]
)
start_date = st.date_input("Start Date")
start_time = st.time_input("Start Time")
duration = st.number_input("Duration (hours)", min_value=0.5, step=0.5)
status = st.selectbox(
"Status",
["Planned", "In Progress", "Completed", "Cancelled"]
)
submit_button = st.form_submit_button("Add Experiment")
if submit_button:
with Session(engine) as session:
start_datetime = datetime.combine(start_date, start_time)
new_experiment = Experiment(
name=name,
description=description,
equipment=equipment,
start_time=start_datetime,
duration_hours=duration,
status=status
)
session.add(new_experiment)
session.commit()
st.sidebar.success("Experiment added successfully!")
# Main content area
tab1, tab2 = st.tabs(["Schedule View", "Experiment List"])
with tab1:
st.subheader("Weekly Schedule")
# Date range selector
col1, col2 = st.columns(2)
with col1:
view_start = st.date_input("View from", datetime.now().date())
with col2:
view_end = st.date_input("View to", (datetime.now() + timedelta(days=7)).date())
# Fetch experiments for the selected date range
with Session(engine) as session:
experiments = session.query(Experiment).filter(
Experiment.start_time >= datetime.combine(view_start, datetime.min.time()),
Experiment.start_time <= datetime.combine(view_end, datetime.max.time())
).all()
# Create schedule dataframe
if experiments:
schedule_data = []
for exp in experiments:
schedule_data.append({
"Experiment": exp.name,
"Equipment": exp.equipment,
"Start": exp.start_time,
"Duration (hrs)": exp.duration_hours,
"Status": exp.status
})
schedule_df = pd.DataFrame(schedule_data)
st.dataframe(schedule_df)
else:
st.info("No experiments scheduled for the selected date range.")
with tab2:
st.subheader("All Experiments")
# Fetch all experiments
with Session(engine) as session:
all_experiments = session.query(Experiment).all()
if all_experiments:
# Create detailed view dataframe
detailed_data = []
for exp in all_experiments:
detailed_data.append({
"ID": exp.id,
"Name": exp.name,
"Description": exp.description,
"Equipment": exp.equipment,
"Start Time": exp.start_time,
"Duration (hrs)": exp.duration_hours,
"Status": exp.status,
"Created": exp.created_at
})
detailed_df = pd.DataFrame(detailed_data)
# Add edit functionality
selected_exp = st.selectbox("Select experiment to edit:", detailed_df["ID"].tolist())
if selected_exp:
exp_to_edit = session.query(Experiment).filter_by(id=selected_exp).first()
with st.form("edit_experiment"):
st.write(f"Editing experiment: {exp_to_edit.name}")
new_status = st.selectbox(
"Update Status",
["Planned", "In Progress", "Completed", "Cancelled"],
index=["Planned", "In Progress", "Completed", "Cancelled"].index(exp_to_edit.status)
)
new_results = st.text_area("Results", value=exp_to_edit.results if exp_to_edit.results else "")
if st.form_submit_button("Update Experiment"):
exp_to_edit.status = new_status
exp_to_edit.results = new_results
session.commit()
st.success("Experiment updated successfully!")
# Display all experiments
st.dataframe(detailed_df)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?