File size: 4,272 Bytes
b6d30d7
 
1e510a5
b6d30d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e510a5
b6d30d7
 
 
1e510a5
 
 
 
 
 
1c9f0c5
b6d30d7
b616ac6
b6d30d7
 
29cfaca
b6d30d7
 
1c9f0c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6d30d7
 
 
a58582b
b6d30d7
 
1c9f0c5
 
 
 
 
b6d30d7
1c9f0c5
 
 
 
 
b6d30d7
1c9f0c5
 
 
 
 
b6d30d7
 
 
 
 
 
 
1c9f0c5
 
 
 
 
 
 
 
1e510a5
1c9f0c5
 
 
55a4f2f
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import gradio as gr
from Bio import Entrez
from datetime import datetime, timedelta
import os

# Function to fetch PubMed articles
def fetch_pubmed(query, email, start_date, end_date, max_results=100):
    Entrez.email = email
    handle = Entrez.esearch(
        db="pubmed",
        term=query,
        retmax=max_results,
        sort="pub_date",
        mindate=start_date,
        maxdate=end_date,
        datetype="pdat"
    )
    results = Entrez.read(handle)
    handle.close()
    ids = results["IdList"]
    return ids

# Function to fetch article details
def fetch_details(pubmed_ids):
    handle = Entrez.efetch(db="pubmed", id=",".join(pubmed_ids), retmode="xml")
    records = Entrez.read(handle)
    handle.close()
    return records

# Function to compile Markdown content
def compile_summaries(records):
    content = "# PubMed Search Results\n\n"
    for record in records["PubmedArticle"]:
        title = record["MedlineCitation"]["Article"]["ArticleTitle"]
        abstract = record["MedlineCitation"]["Article"].get("Abstract", {}).get("AbstractText", ["No abstract available."])[0]
        url = f'https://pubmed.ncbi.nlm.nih.gov/{record["MedlineCitation"]["PMID"]}/'
        content += f"## [{title}]({url})\n\n{abstract}\n\n"
    return content

# Main function for the Gradio interface
def pubmed_search(mesh_terms, email):
    if not mesh_terms or not email:
        return "Please provide MeSH terms and email.", None, None
    
    # Set default dates
    end_date = datetime.now()
    start_date = end_date - timedelta(days=7)

    start_date_str = start_date.strftime("%Y-%m-%d")
    end_date_str = end_date.strftime("%Y-%m-%d")

    # Join MeSH terms for query
    query = " AND ".join([f'"{term}"[MeSH Terms]' for term in mesh_terms.split(",")])
    
    # Fetch PubMed IDs
    pubmed_ids = fetch_pubmed(query, email, start_date_str, end_date_str)
    if not pubmed_ids:
        return "No articles found for the given search terms and date range.", None, None

    # Fetch article details
    try:
        records = fetch_details(pubmed_ids)
    except Exception as e:
        return f"Error fetching article details: {str(e)}", None, None

    # Compile markdown content
    markdown_content = compile_summaries(records)

    # Create temporary files
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    markdown_filename = f"pubmed_results_{timestamp}.md"
    text_filename = f"pubmed_results_{timestamp}.txt"

    # Save files
    try:
        with open(markdown_filename, "w", encoding="utf-8") as f:
            f.write(markdown_content)
        with open(text_filename, "w", encoding="utf-8") as f:
            f.write(markdown_content)
    except Exception as e:
        return f"Error saving files: {str(e)}", None, None

    return "Search completed successfully!", markdown_filename, text_filename

# Logic for adding MeSH terms
def add_mesh_term(term, terms):
    if term.strip():
        terms = terms.split(",") if terms else []
        terms.append(term.strip())
        return ", ".join(terms)
    return terms

# Gradio interface components
with gr.Blocks() as app:
    gr.Markdown("# PubMed Search Tool for Research")
    
    with gr.Row():
        mesh_term_input = gr.Textbox(
            label="Enter a MeSH Term",
            placeholder="e.g., thyroid",
            interactive=True
        )
        add_button = gr.Button("Add MeSH Term")
        mesh_terms_box = gr.Textbox(
            label="Added MeSH Terms",
            interactive=False,
            lines=2
        )
    
    email_input = gr.Textbox(
        label="Email",
        placeholder="Your email (required by PubMed API)",
        interactive=True
    )
    
    search_button = gr.Button("Search PubMed")
    status_output = gr.Textbox(label="Status")
    markdown_file = gr.File(label="Markdown File", interactive=False)
    text_file = gr.File(label="Text File", interactive=False)

    # Bind functions to interface
    add_button.click(
        fn=add_mesh_term,
        inputs=[mesh_term_input, mesh_terms_box],
        outputs=mesh_terms_box
    )
    
    search_button.click(
        fn=pubmed_search,
        inputs=[mesh_terms_box, email_input],
        outputs=[status_output, markdown_file, text_file]
    )

app.launch()