← Back to Academic Work

Research Tools & Resources

The analytical tools and methodological infrastructure I use to perform symbolic calculations, build models, and follow the literature in my research on theoretical physics, differential geometry, and general relativity.

My Research Workflow: I generally follow new work through arXiv, filter relevant papers with Python scripts, explore citation connections with Litmaps, organize my notes in Overleaf, and prepare bibliographies with BibGuru.

arXiv - Subscription

I use arXiv's daily email announcement system to follow the latest literature in theoretical physics and general relativity on a regular basis. arXiv sends a well-organized daily email containing the new papers published in the categories you select.

How to Subscribe to the Daily arXiv Digest

You can follow these steps to receive newly published papers in your inbox every day:

  • Create an Account / Sign In: Sign in to your account through the arXiv login page .
  • Subscribe to Categories: Visit the arXiv subscription management page . From there, select the fields that interest you—such as Mathematical Physics (math-ph) and General Relativity and Quantum Cosmology (gr-qc) —and enable email notifications.
  • Daily Digest: Every weekday, you will receive an automated email containing the titles, abstracts, authors, and direct links for all preprints published in your selected categories.
arXiv - Python Filtering

Automated Email Filtering with Python

To avoid spending time filtering out dozens of papers unrelated to my research, I use a personal Python script. After I paste the raw daily email into the script in VS Code, it categorizes the papers according to my areas of interest and displays their titles, authors, and links.

import re

INTERESTS = {
    "Superintegrability & Integrable Systems": [
        "superintegrable", "superintegrability", "liouville integrability",
        "integrable system", "lax pair", "hamilton-jacobi", "separation of variables"
    ],
    "Clifford Structures & Killing Geometries": [
        "clifford algebroid", "killing-yano", "super-carter", "carter constant",
        "spinor", "killing tensor", "hidden symmetry"
    ],
    "Linearization Instability & Gravitational Perturbations": [
        "linearization instability", "penrose diagram", "perturbed kerr",
        "perturbed schwarzschild", "linearized gravity", "gravitational perturbations"
    ],
    "Conserved Charges & Modified Gravity": [
        "conserved charges", "conserved quantities", "abbott-deser-tekin", "adt charges",
        "massive gravity", "topologically massive", "critical gravity", "gauss-bonnet"
    ]
}


def analyze_expanded_arxiv_mail(raw_text):
    raw_papers = re.split(r"-{10,}", raw_text)

    categorized_papers = {category: [] for category in INTERESTS}
    categorized_papers["Other (Outside Areas of Interest)"] = []

    for block in raw_papers:
        if not block.strip() or "Title:" not in block:
            continue

        title_match = re.search(
            r"Title:\s*(.*?)(?=\n(?:Authors:|Categories:|Comments:|Report-no:)|$)",
            block,
            re.DOTALL,
        )
        authors_match = re.search(
            r"Authors:\s*(.*?)(?=\n(?:Comments:|Categories:|MSC-class:|Report-no:|\\)|$)",
            block,
            re.DOTALL,
        )

        title = (
            title_match.group(1).replace("\n", " ").strip()
            if title_match
            else "Unknown Title"
        )

        authors_raw = (
            authors_match.group(1).replace("\n", " ").strip()
            if authors_match
            else "Unknown Authors"
        )

        link_match = re.search(
            r"https://arxiv\.org/abs/\d{4}\.\d{4,5}",
            block,
        )

        if link_match:
            paper_link = link_match.group(0)
        else:
            id_match = re.search(r"arXiv:\d{4}\.\d{4,5}", block)
            paper_link = (
                f"https://arxiv.org/abs/{id_match.group(0).split(':')[1]}"
                if id_match
                else "Link Not Found"
            )

        authors_cleaned = re.sub(r"\(.*?\)", "", authors_raw)
        clean_authors = [
            author.strip()
            for author in re.split(r",| and ", authors_cleaned)
            if author.strip()
        ]

        block_lower = block.lower()
        matched_any_category = False

        for category, keywords in INTERESTS.items():
            if any(keyword in block_lower for keyword in keywords):
                categorized_papers[category].append(
                    {
                        "title": title,
                        "authors": clean_authors,
                        "link": paper_link,
                    }
                )
                matched_any_category = True
                break

        if not matched_any_category:
            categorized_papers["Other (Outside Areas of Interest)"].append(
                {
                    "title": title,
                    "authors": clean_authors,
                    "link": paper_link,
                }
            )

    return categorized_papers


def print_results(categorized_data):
    for category, papers in categorized_data.items():
        if not papers:
            continue

        print(f"\n=== {category} ({len(papers)} Papers) ===")

        for index, paper in enumerate(papers, start=1):
            authors_str = ", ".join(paper["authors"])

            print(f"{index}. Title: {paper['title']}")
            print(f"   Authors: {authors_str}")
            print(f"   Link: {paper['link']}")
            print("-" * 40)


email_content = r"""
PASTE THE EMAIL CONTENT HERE
"""

results = analyze_expanded_arxiv_mail(email_content)
print_results(results)

AI-Assisted Intelligent arXiv Paper Scanner

One of the most time-consuming aspects of academic research is finding exactly the literature we need without becoming lost among hundreds of papers. Traditional keyword searches can sometimes produce results that are either too narrow or too broad. To automate this process and create a personalized "relevant paper ranking system", we developed an intelligent scanning script with the help of artificial intelligence and Python’s official arxiv library.

How Does the Code Work?

  • Modular Query Structure: It separates the main topic from its subtopics and creates dynamic queries using logical operators.
  • Duplicate Removal: It automatically removes duplicate papers returned by different queries.
  • Personalized Relevance Scoring: It assigns weighted scores to papers according to important terms appearing in their titles and abstracts.
  • Intelligent Ranking: It presents all results according to the highest relevance score and most recent publication date.
import arxiv


def fetch_arxiv_papers():
    main_topic_terms = ""
    first_subtopic_terms = ""
    second_subtopic_terms = ""
    third_subtopic_terms = ""

    queries = {}

    if main_topic_terms:
        queries["Main topic"] = main_topic_terms

    if main_topic_terms and first_subtopic_terms:
        queries["Main topic + First subtopic"] = (
            f"({main_topic_terms}) AND ({first_subtopic_terms})"
        )

    if main_topic_terms and second_subtopic_terms:
        queries["Main topic + Second subtopic"] = (
            f"({main_topic_terms}) AND ({second_subtopic_terms})"
        )

    if main_topic_terms and third_subtopic_terms:
        queries["Main topic + Third subtopic"] = (
            f"({main_topic_terms}) AND ({third_subtopic_terms})"
        )

    if not queries:
        print("You must define at least one search term or query.")
        return

    client = arxiv.Client(
        page_size=100,
        delay_seconds=3,
        num_retries=3,
    )

    unique_papers = {}

    for search_name, query in queries.items():
        print("\n" + "=" * 100)
        print(f"SEARCH TITLE: {search_name}")
        print("=" * 100)

        search = arxiv.Search(
            query=query,
            max_results=100,
            sort_by=arxiv.SortCriterion.Relevance,
            sort_order=arxiv.SortOrder.Descending,
        )

        try:
            results = list(client.results(search))
        except Exception as error:
            print(f"An error occurred while running the query: {error}")
            continue

        print(f"Number of results found for this query: {len(results)}")

        for paper in results:
            paper_id = paper.entry_id.rstrip("/").split("/")[-1]

            if paper_id not in unique_papers:
                unique_papers[paper_id] = {
                    "paper": paper,
                    "matched_searches": [],
                }

            unique_papers[paper_id]["matched_searches"].append(search_name)

    print("\n" + "#" * 100)
    print(f"TOTAL NUMBER OF UNIQUE PAPERS: {len(unique_papers)}")
    print("#" * 100)

    if not unique_papers:
        print("No papers related to the supplied queries were found.")
        return

    keyword_scores = {}
    title_keyword_scores = {}
    ranked_papers = []

    for paper_id, data in unique_papers.items():
        paper = data["paper"]

        title = " ".join(paper.title.split()).lower()
        summary = " ".join(paper.summary.split()).lower()
        combined_text = f"{title} {summary}"

        score = 0

        for keyword, weight in keyword_scores.items():
            if keyword.lower() in combined_text:
                score += weight

        for keyword, weight in title_keyword_scores.items():
            if keyword.lower() in title:
                score += weight

        ranked_papers.append(
            {
                "score": score,
                "paper": paper,
                "matched_searches": data["matched_searches"],
            }
        )

    ranked_papers.sort(
        key=lambda item: (
            item["score"],
            item["paper"].published,
        ),
        reverse=True,
    )

    for index, item in enumerate(ranked_papers, start=1):
        paper = item["paper"]
        score = item["score"]

        authors = ", ".join(author.name for author in paper.authors)
        abstract = " ".join(paper.summary.split())
        published = paper.published.strftime("%d %B %Y")
        updated = paper.updated.strftime("%d %B %Y")

        print("\n" + "-" * 100)
        print(f"[{index}] RELEVANCE SCORE : {score}")
        print(f"TITLE             : {paper.title}")
        print(f"AUTHORS           : {authors}")
        print(f"PUBLICATION DATE  : {published}")
        print(f"LAST UPDATED      : {updated}")
        print(f"PRIMARY CATEGORY  : {paper.primary_category}")

        categories = ", ".join(paper.categories)
        print(f"ALL CATEGORIES    : {categories}")
        print(f"ARXIV PAGE        : {paper.entry_id}")
        print(f"PDF               : {paper.pdf_url}")
        print(
            "MATCHED SEARCHES  : "
            + ", ".join(item["matched_searches"])
        )
        print(f"ABSTRACT          : {abstract}")


if __name__ == "__main__":
    fetch_arxiv_papers()

Installation and Usage

Before using the script, install the official Python client with the following command:

pip install arxiv

You can then customize the main topic, subtopics, queries, and scoring dictionaries according to your own research field before running the script.

Overleaf

I use Overleaf to organize my academic notes, mathematical derivations, and project documents.

After learning the basic structure and workflow of LaTeX, I prefer not to write long pieces of code entirely by hand. Instead, I give my own notes and equations to an AI system and ask it to convert them into LaTeX code. I then check the generated code in Overleaf and edit it when necessary.

This approach saves time, especially with dense mathematical content, and allows me to focus primarily on the underlying physical and mathematical ideas.

Litmaps

During a literature review, I use Litmaps to find related studies starting from an important paper.

Being able to follow citation relationships visually makes it easier to discover earlier work and later developments in a topic. I find it especially useful for seeing chains of papers when entering a new research area.

BibGuru

I use BibGuru when creating bibliographies and references.

It helps me quickly organize the bibliographic information for articles, books, and other academic sources and convert it into the appropriate reference format. It is particularly useful for speeding up reference management in documents prepared with LaTeX.