Update app.py
Browse files
app.py
CHANGED
@@ -87,9 +87,125 @@ st.markdown("1. **Goals:** Develop accurate and extendible force fields for larg
|
|
87 |
|
88 |
# Display Search Results with a table
|
89 |
st.write("### 📅 Summary of Search Results")
|
90 |
-
search_data = [
|
91 |
-
{"Date": "08 Dec 2023", "Title": "Machine-learned molecular mechanics force field for the simulation of protein-ligand systems and beyond", "Abstract Link": "https://arxiv.org/abs/2307.07085", "PDF Link": "https://arxiv.org/pdf/2307.07085"},
|
92 |
-
{"Date": "11 Apr 2023", "Title": "Design, Integration, and Field Evaluation of a Robotic Blossom Thinning System for Tree Fruit Crops", "Abstract Link": "https
|
93 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
95 |
|
|
|
87 |
|
88 |
# Display Search Results with a table
|
89 |
st.write("### 📅 Summary of Search Results")
|
|
|
|
|
|
|
90 |
|
91 |
+
import streamlit as st
|
92 |
+
import pandas as pd
|
93 |
+
import plotly.express as px
|
94 |
+
from datetime import datetime
|
95 |
+
|
96 |
+
# Load data
|
97 |
+
@st.cache_data
|
98 |
+
def load_data():
|
99 |
+
data = [
|
100 |
+
{"date": "08 Dec 2023", "title": "Machine-learned molecular mechanics force field for the simulation of protein-ligand systems and beyond", "authors": "Kenichiro Takaba, et al."},
|
101 |
+
{"date": "11 Apr 2023", "title": "Design, Integration, and Field Evaluation of a Robotic Blossom Thinning System for Tree Fruit Crops", "authors": "Uddhav Bhattarai, Qin Zhang, Manoj Karkee"},
|
102 |
+
{"date": "02 Jun 2021", "title": "An Extendible, Graph-Neural-Network-Based Approach for Accurate Force Field Development of Large Flexible Organic Molecules", "authors": "Xufei Wang, et al."},
|
103 |
+
{"date": "20 Jun 2023", "title": "CHGNet: Pretrained universal neural network potential for charge-informed atomistic modeling", "authors": "Bowen Deng, et al."},
|
104 |
+
{"date": "18 Apr 2022", "title": "End-to-End Differentiable Molecular Mechanics Force Field Construction", "authors": "Yuanqing Wang, et al."},
|
105 |
+
{"date": "30 Oct 2023", "title": "A Planning-and-Exploring Approach to Extreme-Mechanics Force Fields", "authors": "Pengjie Shi, Zhiping Xu"},
|
106 |
+
{"date": "15 Sep 2019", "title": "A Genetic Algorithm Enabled Similarity-Based Attack on Cancellable Biometrics", "authors": "Xingbo Dong, et al."},
|
107 |
+
{"date": "02 Jun 2021", "title": "Machine-Learning Non-Conservative Dynamics for New-Physics Detection", "authors": "Ziming Liu, et al."},
|
108 |
+
{"date": "15 Jun 2021", "title": "Graphical Gaussian Process Regression Model for Aqueous Solvation Free Energy Prediction of Organic Molecules in Redox Flow Battery", "authors": "Peiyuan Gao, et al."},
|
109 |
+
{"date": "08 Jun 2021", "title": "BIGDML: Towards Exact Machine Learning Force Fields for Materials", "authors": "Huziel E. Sauceda, et al."},
|
110 |
+
{"date": "26 Sep 2022", "title": "Learned Force Fields Are Ready For Ground State Catalyst Discovery", "authors": "Michael Schaarschmidt, et al."},
|
111 |
+
{"date": "08 Nov 2023", "title": "General Framework to Evaluate Unlinkability in Biometric Template Protection Systems", "authors": "Marta Gomez-Barrero, et al."},
|
112 |
+
{"date": "22 Jan 2023", "title": "Victoria Amazonica Optimization (VAO): An Algorithm Inspired by the Giant Water Lily Plant", "authors": "Seyed Muhammad Hossein Mousavi"},
|
113 |
+
{"date": "09 Dec 2019", "title": "Automated Fitting of Neural Network Potentials at Coupled Cluster Accuracy: Protonated Water Clusters as Testing Ground", "authors": "Christoph Schran, et al."},
|
114 |
+
{"date": "30 Oct 2022", "title": "Regimes of charged particle dynamics in current sheets: the machine learning approach", "authors": "Alexander Lukin, et al."},
|
115 |
+
{"date": "22 Feb 2023", "title": "Controllable Mechanical-domain Energy Accumulators", "authors": "Sung Y. Kim, David J. Braun"},
|
116 |
+
{"date": "02 Nov 2023", "title": "Investigating the Behavior of Diffusion Models for Accelerating Electronic Structure Calculations", "authors": "Daniel Rothchild, et al."},
|
117 |
+
{"date": "05 Jun 2023", "title": "Machine Learning Force Fields with Data Cost Aware Training", "authors": "Alexander Bukharin, et al."},
|
118 |
+
{"date": "23 Jan 2024", "title": "Force sensing to reconstruct potential energy landscapes for cluttered large obstacle traversal", "authors": "Yaqing Wang, et al."},
|
119 |
+
{"date": "06 Mar 2024", "title": "Beyond MD17: the reactive xxMD dataset", "authors": "Zihan Pengmei, et al."}
|
120 |
+
]
|
121 |
+
df = pd.DataFrame(data)
|
122 |
+
df['date'] = pd.to_datetime(df['date'], format='%d %b %Y')
|
123 |
+
return df
|
124 |
+
|
125 |
+
df = load_data()
|
126 |
+
|
127 |
+
# Streamlit app
|
128 |
+
st.title("🧪 Force Field Research Explorer")
|
129 |
+
|
130 |
+
# Sidebar
|
131 |
+
st.sidebar.header("Filters")
|
132 |
+
date_range = st.sidebar.date_input("Date Range", [df['date'].min(), df['date'].max()])
|
133 |
+
filtered_df = df[(df['date'] >= pd.Timestamp(date_range[0])) & (df['date'] <= pd.Timestamp(date_range[1]))]
|
134 |
+
|
135 |
+
# Main content
|
136 |
+
st.header("Research Papers Timeline")
|
137 |
+
fig = px.timeline(filtered_df, x_start="date", y="title", color="authors", hover_name="title")
|
138 |
+
fig.update_yaxes(autorange="reversed")
|
139 |
+
st.plotly_chart(fig)
|
140 |
+
|
141 |
+
st.header("Paper Details")
|
142 |
+
selected_paper = st.selectbox("Select a paper", filtered_df['title'])
|
143 |
+
paper_details = filtered_df[filtered_df['title'] == selected_paper].iloc[0]
|
144 |
+
st.write(f"**Date:** {paper_details['date'].strftime('%d %b %Y')}")
|
145 |
+
st.write(f"**Authors:** {paper_details['authors']}")
|
146 |
+
st.write(f"**Title:** {paper_details['title']}")
|
147 |
+
|
148 |
+
# Word cloud of paper titles
|
149 |
+
from wordcloud import WordCloud
|
150 |
+
import matplotlib.pyplot as plt
|
151 |
+
|
152 |
+
st.header("Title Word Cloud")
|
153 |
+
text = " ".join(title for title in filtered_df['title'])
|
154 |
+
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)
|
155 |
+
|
156 |
+
fig, ax = plt.subplots(figsize=(10, 5))
|
157 |
+
ax.imshow(wordcloud, interpolation='bilinear')
|
158 |
+
ax.axis('off')
|
159 |
+
st.pyplot(fig)
|
160 |
+
|
161 |
+
# Author network graph
|
162 |
+
import networkx as nx
|
163 |
+
|
164 |
+
st.header("Author Collaboration Network")
|
165 |
+
G = nx.Graph()
|
166 |
+
for _, row in filtered_df.iterrows():
|
167 |
+
authors = [author.strip() for author in row['authors'].split(',')]
|
168 |
+
for i in range(len(authors)):
|
169 |
+
for j in range(i+1, len(authors)):
|
170 |
+
if G.has_edge(authors[i], authors[j]):
|
171 |
+
G[authors[i]][authors[j]]['weight'] += 1
|
172 |
+
else:
|
173 |
+
G.add_edge(authors[i], authors[j], weight=1)
|
174 |
+
|
175 |
+
pos = nx.spring_layout(G)
|
176 |
+
fig, ax = plt.subplots(figsize=(12, 8))
|
177 |
+
nx.draw(G, pos, with_labels=True, node_color='lightblue',
|
178 |
+
node_size=1000, font_size=8, font_weight='bold')
|
179 |
+
edge_labels = nx.get_edge_attributes(G, 'weight')
|
180 |
+
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
|
181 |
+
st.pyplot(fig)
|
182 |
+
|
183 |
+
# Topic modeling
|
184 |
+
from sklearn.feature_extraction.text import CountVectorizer
|
185 |
+
from sklearn.decomposition import LatentDirichletAllocation
|
186 |
+
|
187 |
+
st.header("Topic Modeling")
|
188 |
+
vectorizer = CountVectorizer(stop_words='english')
|
189 |
+
doc_term_matrix = vectorizer.fit_transform(filtered_df['title'])
|
190 |
+
|
191 |
+
LDA = LatentDirichletAllocation(n_components=5, random_state=42)
|
192 |
+
LDA.fit(doc_term_matrix)
|
193 |
+
|
194 |
+
topics = []
|
195 |
+
for idx, topic in enumerate(LDA.components_):
|
196 |
+
top_words = [vectorizer.get_feature_names_out()[i] for i in topic.argsort()[:-10 - 1:-1]]
|
197 |
+
topics.append(f"Topic {idx + 1}: {', '.join(top_words)}")
|
198 |
+
|
199 |
+
for topic in topics:
|
200 |
+
st.write(topic)
|
201 |
+
|
202 |
+
st.header("Research Trends")
|
203 |
+
year_counts = filtered_df.groupby(filtered_df['date'].dt.year).size().reset_index(name='count')
|
204 |
+
fig = px.line(year_counts, x='date', y='count', title='Number of Papers per Year')
|
205 |
+
st.plotly_chart(fig)
|
206 |
+
|
207 |
+
# Footer
|
208 |
+
st.markdown("---")
|
209 |
+
st.write("Data last updated: March 2024")
|
210 |
|
211 |
|