File size: 4,891 Bytes
b6d30d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b616ac6
1c9f0c5
 
 
 
 
 
 
 
 
 
 
 
b6d30d7
b616ac6
b6d30d7
 
29cfaca
b6d30d7
 
1c9f0c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6d30d7
 
 
 
 
 
1c9f0c5
 
 
 
 
b6d30d7
1c9f0c5
 
 
 
 
b6d30d7
1c9f0c5
1de773f
 
1c9f0c5
 
 
 
 
 
b6d30d7
 
 
 
 
 
 
1c9f0c5
 
 
 
 
 
 
 
 
 
 
 
b6d30d7
1c9f0c5
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
136
137
138
139
140
141
142
143
144
145
import gradio as gr
from Bio import Entrez
from datetime import datetime
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, start_date, end_date):
    if not mesh_terms or not email:
        return "Please provide MeSH terms and email.", None, None
    
    # Convert date objects to string format
    try:
        # If start_date and end_date are strings, parse them first
        if isinstance(start_date, str):
            start_date = datetime.strptime(start_date, "%Y-%m-%d")
        if isinstance(end_date, str):
            end_date = datetime.strptime(end_date, "%Y-%m-%d")
        
        start_date_str = start_date.strftime("%Y-%m-%d")
        end_date_str = end_date.strftime("%Y-%m-%d")
    except ValueError as e:
        return f"Error processing dates: {str(e)}", None, None

    # 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 Thyroid AI 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
        )
    
    with gr.Row():
        start_date = gr.DateTime(label="Start Date", value="2025-01-01")  # Changed from DateTime to Date
        end_date = gr.DateTime(label="End Date", value="2025-01-07")      # Changed from DateTime to Date
        
    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, start_date, end_date],
        outputs=[status_output, markdown_file, text_file]
    )


app.launch()