Monday, 23 March 2026

Cracking the Cosmic Code: Fermi’s Latest Gamma-Ray Map

The universe is a noisy place, but much of that noise is invisible to the human eye. Recently, the Fermi team released its second catalog from the Large Area Telescope (LAT), providing a massive inventory of 1,873 gamma-ray point-sources. While mapping these high-energy beacons is a huge milestone, the real challenge lies in the "unidentified" sources—the cosmic ghosts that show up on the map but don't have a name. The Mystery of the Unidentified 572 Out of the nearly 1,900 sources detected, 572 remained a mystery. To narrow the search, the Japanese Suzaku X-ray Observatory zoomed in on a small sample of 11 unidentified sources. The results were a major win for deep-space detective work: * The Big Winners: 6 were identified as pulsars (dense, spinning remnants of exploded stars). * The Galactic Guest: 1 was a blazar, a galaxy powered by a massive black hole. * The Local: 1 was a standard flaring star. * The Holdouts: 3 sources still refuse to be identified. Why This Matters The fact that over half of the Suzaku sample turned out to be pulsars is a huge clue. It suggests that our galaxy might be more crowded with these "cosmic lighthouses" than we previously thought. As we refine our X-ray and gamma-ray data, the "unknown" parts of our map are finally starting to take shape. A python code was written for this purpose.


import numpy as np
import matplotlib.pyplot as plt

# --- Initial Data from Fermi/LAT Survey ---
# Source: Second catalog of gamma-ray point-sources (1,873 total)
initial_sources = {
    "Blazar Galaxy": 1069,
    "Pulsars": 115,
    "Supernovae": 77,
    "Active Galaxies": 20,
    "Normal Galaxies & Stars": 20,
    "Unknown Objects": 572
}

# --- Data Preparation for Initial Visualization ---
categories = list(initial_sources.keys())
counts = np.array(list(initial_sources.values()))
total_initial = np.sum(counts)

# Print initial summary report using f-strings for alignment
print(f"{'--- INITIAL FERMI/LAT DATA ---':^45}")
print(f"{'Source Category':<30} | {'Initial Count':>10}")
print("-" * 45)
for category, count in initial_sources.items():
    print(f"{category:<30} | {count:>10}")

# Generate Initial Pie Chart
fig1, ax1 = plt.subplots(figsize=(10, 7))
ax1.pie(counts, labels=categories, autopct='%1.1f%%', startangle=140)
ax1.set_title(f"Initial Distribution of Fermi/LAT Sources (Total: {total_initial})")
plt.show()

# --- Suzaku Extrapolation Logic ---
# Suzaku studied a sample of 11 of the 572 unidentified sources
suzaku_sample_size = 11
unknown_pool = initial_sources["Unknown Objects"]

# Suzaku's specific findings from that sample
suzaku_findings = {
    "Pulsars": 6,
    "Blazar Galaxy": 1,
    "Normal Galaxies & Stars": 1,
    "Unknown Objects": 3
}

# Create a copy to store updated numbers without mutating the original
updated_sources = initial_sources.copy()

# Recalculate distribution based on Suzaku proportions
for category, sample_count in suzaku_findings.items():
    if category != "Unknown Objects":
        # Proportionally reassign unknown objects to identified categories
        extrapolated_count = (sample_count / suzaku_sample_size) * unknown_pool
        
        # Add extrapolated count to existing category
        updated_sources[category] += extrapolated_count
        
        # Deduct the same amount from the "Unknown Objects" pool
        updated_sources["Unknown Objects"] -= extrapolated_count

# --- Final Updated Report ---
print(f"\n{'--- EXTRAPOLATED SUZAKU UPDATES ---':^45}")
print(f"{'Source Category':<30} | {'Updated Count':>10}")
print("-" * 45)
for category, count in updated_sources.items():
    # Use f-strings to round counts to 0 decimal places for a clean display
    print(f"{category:<30} | {count:>10.0f}")

# Generate Updated Pie Chart
updated_counts = np.array(list(updated_sources.values()))
fig2, ax2 = plt.subplots(figsize=(10, 7))
ax2.pie(updated_counts, labels=categories, autopct='%1.1f%%', startangle=140)
ax2.set_title(f"Extrapolated Distribution After Suzaku Follow-up")
plt.show()

No comments:

Post a Comment

Visualizing Particle Kinematics with Python

Understanding the relationship between position, velocity, and acceleration is fundamental to physics. However, seeing how these variables e...