Introduction to Euclid Q1 PHZ catalog#

Learning Goals#

By the end of this tutorial, you will:

  • Understand the basic characteristics of Euclid Q1 photo-z catalog and how to match it with MER mosaics.

  • Understand what PHZ catalogs are available and how to view the columns in those catalogs.

  • How to query with ADQL in the PHZ catalog to find galaxies between a redshift of 1.4 and 1.6.

  • Pull and plot a spectrum of one of the galaxies in that catalog.

  • Cutout an image of the galaxy to view it close up.

  • Learn how to upload images and catalogs to Firefly to inspect individual sources in greater detail.

Introduction#

Euclid is a European Space Agency (ESA) space mission with NASA participation, to study the geometry and nature of the dark Universe. The Quick Data Release 1 (Q1) are the first data release from the Euclid mission after the Early Release Observations (ERO). On March 19, 2025 the data will be available on the ESA archive (https://easidr.esac.esa.int/sas/) and on the IRSA archive (https://irsa.ipac.caltech.edu).

These notebooks focus on how to access, download, and process Euclid Q1 data from the IRSA archive. At the end of the notebook, we also include some information for how to access the Q1 data from the ESA archive. If you have any issues accessing data from the archives, please contact the helpdesk directly: IRSA (irsasupport@ipac.caltech.edu) and ESA (https://support.cosmos.esa.int/euclid).

The photometry of every source is processed through a photometric redshift fitting pipeline, producing several different catalogs. This notebook provides an introduction to photo-z catalog released as part of Euclid Q1. Other Euclid notebooks show how to use other data products released as part of Euclid Q1.

Imports#

# Uncomment the next line to install dependencies if needed.
# !pip install requests matplotlib pandas astropy>5.2 pyvo fsspec firefly_client
from io import BytesIO
import os
import re

import requests
import matplotlib.pyplot as plt

from astropy.coordinates import SkyCoord
from astropy.io import fits
from astropy.nddata import Cutout2D
from astropy.table import Table
from astropy import units as u
from astropy.utils.data import download_file
from astropy.visualization import ImageNormalize, PercentileInterval, AsinhStretch, LogStretch
from astropy.wcs import WCS

from firefly_client import FireflyClient
import pyvo as vo

1. Find the MER Tile ID that corresponds to a given RA and Dec#

In this case, choose random coordinates to show a different MER mosaic image. Search a radius around these coordinates.

ra = 268
dec = 66
search_radius= 10 * u.arcsec

coord = SkyCoord(ra, dec, unit='deg', frame='icrs')

Use IRSA to search for all Euclid data on this target#

This searches specifically in the euclid_DpdMerBksMosaic “collection” which is the MER images and catalogs.

irsa_service= vo.dal.sia2.SIA2Service('https://irsa.ipac.caltech.edu/SIA')

image_table = irsa_service.search(pos=(coord, search_radius), collection='euclid_DpdMerBksMosaic').to_table()

Note

This table lists all MER mosaic images available in this position. These mosaics include the Euclid VIS, Y, J, H images, as well as ground-based telescopes which have been put on the same pixel scale. For more information, see the Euclid documentation at IPAC.

# Convert the table to pandas dataframe
df_im_irsa=image_table.to_pandas()
df_im_euclid=df_im_irsa[ (df_im_irsa['dataproduct_subtype']=='science') &  (df_im_irsa['facility_name']=='Euclid')]

df_im_euclid.head()
s_ra s_dec facility_name instrument_name dataproduct_subtype calib_level dataproduct_type energy_bandpassname energy_emband obs_id ... t_resolution t_xel obs_publisher_did s_fov em_xel pol_states pol_xel cloud_access o_ucd upload_row_id
1 267.667698 66.000014 Euclid NISP science 3 image H Infrared 102159190_NISP ... NaN <NA> ivo://irsa.ipac/euclid_DpdMerBksMosaic?1021591... 0.533333 <NA> <NA> {"aws": {"bucket_name": "nasa-irsa-euclid-q1",... 1
17 267.667698 66.000014 Euclid NISP science 3 image Y Infrared 102159190_NISP ... NaN <NA> ivo://irsa.ipac/euclid_DpdMerBksMosaic?1021591... 0.533333 <NA> <NA> {"aws": {"bucket_name": "nasa-irsa-euclid-q1",... 1
34 267.667698 66.000014 Euclid NISP science 3 image J Infrared 102159190_NISP ... NaN <NA> ivo://irsa.ipac/euclid_DpdMerBksMosaic?1021591... 0.533333 <NA> <NA> {"aws": {"bucket_name": "nasa-irsa-euclid-q1",... 1
43 267.667698 66.000014 Euclid VIS science 3 image VIS Optical 102159190_VIS ... NaN <NA> ivo://irsa.ipac/euclid_DpdMerBksMosaic?1021591... 0.533333 <NA> <NA> {"aws": {"bucket_name": "nasa-irsa-euclid-q1",... 1

4 rows × 51 columns

Choose the VIS image and pull the filename and tileID

filename=df_im_euclid[df_im_euclid['energy_bandpassname']=='VIS']['access_url'].to_list()[0]

tileID=re.search(r'TILE\s*(\d{9})', filename).group(1)
print('The MER tile ID for this object is :',tileID)
The MER tile ID for this object is : 102159190

2. Download PHZ catalog from IRSA#

## Use IRSA to search for catalogs

service = vo.dal.TAPService("https://irsa.ipac.caltech.edu/TAP")


## Search for all tables in IRSA labled as euclid_q1
tables = service.tables
for tablename in tables.keys():
    if "tap_schema" not in tablename and "euclid_q1" in tablename:
            tables[tablename].describe()
euclid.artifact_euclid_q1
    Euclid Q1 CAOM Artifact Table

euclid.observation_euclid_q1
    Euclid Q1 CAOM Observation Table
euclid.plane_euclid_q1
    Euclid Q1 CAOM Plane Table
euclid_q1_mer_catalogue
    Euclid Q1 MER Catalog

euclid_q1_mer_morphology
    Euclid Q1 MER Morphology
euclid_q1_phz_photo_z
    Euclid Q1 PHZ Photo-z Catalog

euclid_q1_spe_lines_atomic_indices
    Euclid Q1 SPE Lines Catalog - Atomic Indices
euclid_q1_spe_lines_continuum_features
    Euclid Q1 SPE Lines Catalog - Continuum Features

euclid_q1_spe_lines_line_features
    Euclid Q1 SPE Lines Catalog - Spectral Lines
euclid_q1_spe_lines_molecular_indices
    Euclid Q1 SPE Lines Catalog - Molecular Indices

euclid_q1_spectro_zcatalog_spe_classification
    Euclid Q1 SPE Redshift Catalog - Classification
euclid_q1_spectro_zcatalog_spe_galaxy_candidates
    Euclid Q1 SPE Redshift Catalog - Galaxy Candidates

euclid_q1_spectro_zcatalog_spe_qso_candidates
    Euclid Q1 SPE Redshift Catalog - QSO Candidates
euclid_q1_spectro_zcatalog_spe_quality
    Euclid Q1 SPE Redshift Catalog - Quality

euclid_q1_spectro_zcatalog_spe_star_candidates
    Euclid Q1 SPE Redshift Catalog - Star Candidates
table_mer= 'euclid_q1_mer_catalogue'
table_phz= 'euclid_q1_phz_photo_z'
table_1dspectra= 'euclid.objectid_spectrafile_association_q1'

Learn some information about the table:#

  • How many columns are there?

  • List the column names

columns = tables[table_phz].columns
print(len(columns))
67
for col in columns:
    print(f'{f"{col.name}":30s}  {col.unit}  {col.description}') ## Currently no descriptions
object_id                       None  Unique ID of the object in the survey, as set by MER
phz_median                      None  The median of the PHZ PDF
phz_mode_1                      None  The first mode of the PHZ PDF
phz_mode_1_area                 None  The total area of the first mode
phz_mode_2                      None  The second mode of the PHZ PDF
phz_mode_2_area                 None  The total area of the second mode
bias_id                         None  The identifier to be used for retrieving the bias correction shift from the bias correction map
tom_bin_id                      None  The identifier of the tomographic bin the source belongs to (Equipopulated-bins)
alt_tom_bin_id                  None  The identifier of the alternate tomographic bin the source belongs to (Equidistant-bins)
pos_tom_bin_id                  None  The identifier of the photometric clustering tomographic bin the source belongs to (Equipopulated-bins)
flag_som_tomobin                None  Flag telling if the source belong to a combination of SOM cell and Tom. bin which can be calibrated (=1) or not (=0).
flag_som_alt_tomobin            None  Flag telling if the source belong to a combination of SOM cell and Alt Tom. bin which can be calibrated (=1) or not (=0).
flag_som_pos_tomobin            None  Flag telling if the source belong to a combination of SOM cell and POS Tom. bin which can be calibrated (=1) or not (=0).
flux_u_ext_decam_unif           uJy  Unified flux recomputed after correction from galactic extinction and filter shifts
flux_g_ext_decam_unif           uJy  None
flux_r_ext_decam_unif           uJy  None
flux_i_ext_decam_unif           uJy  None
flux_z_ext_decam_unif           uJy  None
flux_u_ext_lsst_unif            uJy  None
flux_g_ext_lsst_unif            uJy  None
flux_r_ext_lsst_unif            uJy  None
flux_i_ext_lsst_unif            uJy  None
flux_z_ext_lsst_unif            uJy  None
flux_u_ext_megacam_unif         uJy  None
flux_g_ext_hsc_unif             uJy  None
flux_r_ext_megacam_unif         uJy  None
flux_i_ext_panstarrs_unif       uJy  None
flux_z_ext_hsc_unif             uJy  None
flux_vis_unif                   uJy  None
flux_y_unif                     uJy  None
flux_j_unif                     uJy  None
flux_h_unif                     uJy  None
fluxerr_u_ext_decam_unif        uJy  None
fluxerr_g_ext_decam_unif        uJy  None
fluxerr_r_ext_decam_unif        uJy  None
fluxerr_i_ext_decam_unif        uJy  None
fluxerr_z_ext_decam_unif        uJy  None
fluxerr_u_ext_lsst_unif         uJy  None
fluxerr_g_ext_lsst_unif         uJy  None
fluxerr_r_ext_lsst_unif         uJy  None
fluxerr_i_ext_lsst_unif         uJy  None
fluxerr_z_ext_lsst_unif         uJy  None
fluxerr_u_ext_megacam_unif      uJy  None
fluxerr_g_ext_hsc_unif          uJy  None
fluxerr_r_ext_megacam_unif      uJy  None
fluxerr_i_ext_panstarrs_unif    uJy  None
fluxerr_z_ext_hsc_unif          uJy  None
fluxerr_vis_unif                uJy  None
fluxerr_y_unif                  uJy  None
fluxerr_j_unif                  uJy  None
fluxerr_h_unif                  uJy  None
photometric_system              None  Encode the Photometric band configuration (indicating also the number of missing columns)
phz_classification              None  Classification flag: 1 if the source is accepted as star, 2 if it is accepted as a galaxy, 4 if it is accepted as a QSO, 8 if the source is acce..."
phz_flags                       None  An integer containing the flags of the PHZ processing. Meaning: 0 => OK, 1 => NNPZ flag: no close neighbor, 10 not VIS detected, 11 missing band, 12 t...
phz_weight                      NA  Probability to be a usable source at VIS MAG=23.5
best_chi2                       None  Chi2 of the best fit model or the closest neighbor
phz_70_int1                     None  The smallest PHZ PDF interval containing 70% of the probability - lower value
phz_70_int2                     None  The smallest PHZ PDF interval containing 70% of the probability - upper value
phz_90_int1                     None  The smallest PHZ PDF interval containing 90% of the probability - lower value
phz_90_int2                     None  The smallest PHZ PDF interval containing 90% of the probability - upper value
phz_95_int1                     None  The smallest PHZ PDF interval containing 95% of the probability - upper value
phz_95_int2                     None  None
ie_cuts_weights1                None  Vector of probability to be a usable source for VIS MAG cut 20.25
ie_cuts_weights2                None  Vector of probability to be a usable source for VIS MAG cut 21.25
ie_cuts_weights3                None  Vector of probability to be a usable source for VIS MAG cut 22.25
ie_cuts_weights4                None  Vector of probability to be a usable source for VIS MAG cut 24.5
cntr                            None  entry counter (key) number (unique within table)

The PHZ catalog contains 67 columns, below are a few highlights:

  • object_id

  • flux_vis_unif, flux_y_unif, flux_j_unif, flux_h_unif

  • median redshift (phz_median)

  • phz_classification

  • phz_90_int1, phz_90_int2 (The phz PDF interval containing 90% of the probability, upper and lower values)

Note

The phz_catalog on IRSA has more columns than it does on the ESA archive. This is because the ESA catalog stores some information in one column (for example, phz_90_int is stored as [lower, upper], rather than in two separate columns).

The fluxes are different from the fluxes derived in the MER catalog. The _unif fluxes are: “Unified flux recomputed after correction from galactic extinction and filter shifts”.

Find some galaxies between 1.4 and 1.6 at a selected RA and Dec#

We specify the following conditions on our search:

  • We select just the galaxies where the flux is greater than zero, to ensure the appear in all four of the Euclid MER images.

  • Select only objects in a circle (search radius selected below) around our selected RA and Dec

  • phz_classification =2 means we select only galaxies

  • Using the phz_90_int1 and phz_90_int2, we select just the galaxies where the error on the photometric redshift is less than 20%

  • Select just the galaxies between a median redshift of 1.4 and 1.6

  • We search just a 3 arcminute box around an RA and Dec

Search based on tileID:

######################## User defined section ############################
## How large do you want the image cutout to be?
im_cutout= 5 * u.arcmin

## What is the center of the cutout?
ra_cutout = 267.8
dec_cutout =  66
 
coords_cutout = SkyCoord(ra_cutout, dec_cutout, unit=(u.deg, u.deg), frame='icrs')
##########################################################################
im_cutout_deg=im_cutout.to(u.deg).value

## Create ra and dec bounds for the box
ra0=ra_cutout-im_cutout_deg/2
ra1=ra_cutout+im_cutout_deg/2

dec0=dec_cutout-im_cutout_deg/2
dec1=dec_cutout+im_cutout_deg/2
adql = f"SELECT DISTINCT mer.object_id,mer.ra, mer.dec, phz.flux_vis_unif, phz.flux_y_unif, \
phz.flux_j_unif, phz.flux_h_unif, phz.phz_classification, phz.phz_median, phz.phz_90_int1, phz.phz_90_int2 \
FROM {table_mer} AS mer \
JOIN {table_phz} as phz \
ON mer.object_id = phz.object_id \
WHERE 1 = CONTAINS(POINT('ICRS', mer.ra, mer.dec), CIRCLE('ICRS', {ra_cutout}, {dec_cutout}, {im_cutout_deg/2})) \
AND phz.flux_vis_unif> 0 \
AND  phz.flux_y_unif > 0 \
AND phz.flux_j_unif > 0 \
AND phz.flux_h_unif > 0 \
AND phz.phz_classification = 2 \
AND ((phz.phz_90_int2 - phz.phz_90_int1) / (1 + phz.phz_median)) < 0.20 \
AND phz.phz_median BETWEEN 1.4 AND 1.6 \
"
adql


## Use TAP with this ADQL string using pyvo
result = service.search(adql)


## Convert table to pandas dataframe
df_g_irsa = result.to_table().to_pandas()

# Display first few rows
df_g_irsa.head()
object_id ra dec flux_vis_unif flux_y_unif flux_j_unif flux_h_unif phz_classification phz_median phz_90_int1 phz_90_int2
0 2678009942660367473 267.800994 66.036747 0.717974 2.652854 3.846101 5.242285 2 1.52 1.35 1.75
1 2678076394659719061 267.807639 65.971906 1.432410 3.936189 4.907444 6.222691 2 1.60 1.48 1.82
2 2678000211660381851 267.800021 66.038185 1.055092 2.605536 3.240130 3.793177 2 1.60 1.47 1.89
3 2678361447659819278 267.836145 65.981928 1.994731 4.426666 5.284164 6.400697 2 1.52 1.43 1.85
4 2678367137659823778 267.836714 65.982378 0.425276 0.970150 1.033773 1.096939 2 1.59 1.43 1.88
len(df_g_irsa)
25

3. Read in a cutout of the MER image from IRSA directly#

## Use fsspec to interact with the fits file without downloading the full file
hdu = fits.open(filename, use_fsspec=True)

## Store the header
header = hdu[0].header

## Read in the cutout of the image that you want
cutout_data = Cutout2D(hdu[0].section, position=coords_cutout, size=im_cutout, wcs=WCS(hdu[0].header))

## Define a new fits file based on this smaller cutout, with accurate WCS based on the cutout size
new_hdu = fits.PrimaryHDU(data=cutout_data.data, header=header)
new_hdu.header.update(cutout_data.wcs.to_header())
im_mer_irsa = new_hdu.data
im_mer_irsa.shape
(3000, 3000)
norm = ImageNormalize(im_mer_irsa, interval=PercentileInterval(99.9), stretch=AsinhStretch())
plt.imshow(im_mer_irsa, cmap='gray', origin='lower', norm=norm)
<matplotlib.image.AxesImage at 0x7f8010fdfb50>
../../_images/aa579ff18a91cad2c142fb8a9ef999074c09b0daa316d44fa3f6002f9e977c9d.png

4. Overplot the catalog on the MER mosaic image#

## Use the WCS package to extract the coordinates from the header of the image
head_mer_irsa=new_hdu.header
wcs_irsa=WCS(head_mer_irsa) # VIS
## Convert the catalog to match the pixels in the image
xy_irsa = wcs_irsa.all_world2pix(df_g_irsa["ra"],df_g_irsa["dec"],0)
df_g_irsa['x_pix']=xy_irsa[0]
df_g_irsa['y_pix']=xy_irsa[1]

Due to the large field of view of the MER mosaic, let’s cut out a smaller section (3’x3’)of the MER mosaic to inspect the image

Plot MER catalog sources on the Euclid VIS image 3’x3’ cutout

plt.imshow(im_mer_irsa, cmap='gray', origin='lower', norm=ImageNormalize(im_mer_irsa, interval=PercentileInterval(99.9), stretch=LogStretch()))
colorbar = plt.colorbar()
plt.scatter(df_g_irsa['x_pix'], df_g_irsa['y_pix'], s=36, facecolors='none', edgecolors='red')

plt.title('Galaxies between z = 1.4 and 1.6')
plt.show()
../../_images/f2d74a7fc158a7f418152b5556e8b605e66374dde98a03124f8874deb1dc668f.png

Pull the spectra on the top brightest source based on object ID

df_g_irsa_sort=df_g_irsa.sort_values(by='flux_h_unif',ascending=False)
df_g_irsa_sort.iloc[0:3]
object_id ra dec flux_vis_unif flux_y_unif flux_j_unif flux_h_unif phz_classification phz_median phz_90_int1 phz_90_int2 x_pix y_pix
9 2677562455660233171 267.756246 66.023317 0.937663 6.932369 13.774872 18.160760 2 1.42 1.31 1.55 2141.132859 2337.331217
15 2678376290659863203 267.837629 65.986320 1.795683 6.656511 8.965490 12.903601 2 1.54 1.49 1.61 946.955338 1007.903635
17 2678016284659732166 267.801628 65.973217 1.291915 5.271050 7.114690 10.886375 2 1.42 1.26 1.48 1473.369876 534.895459
obj_id=df_g_irsa_sort['object_id'].iloc[2]
redshift = df_g_irsa_sort['phz_median'].iloc[2]

## Pull the data on these objects
adql_object = f"SELECT * \
FROM {table_1dspectra} \
WHERE objectid = {obj_id}"

## Pull the data on this particular galaxy
result2 = service.search(adql_object)
df2=result2.to_table().to_pandas()
df2
objectid tileid uri hdu cntr
0 2678016284659732166 102159190 ibe/data/euclid/q1/SIR/102159190/EUC_SIR_W-COM... 1525 59948
## Create the full filename/url
irsa_url='https://irsa.ipac.caltech.edu/'

file_url=irsa_url+df2['uri'].iloc[0]
file_url
'https://irsa.ipac.caltech.edu/ibe/data/euclid/q1/SIR/102159190/EUC_SIR_W-COMBSPEC_102159190_2024-11-05T16:14:02.114614Z.fits'
## Open the large FITS file without loading it entirely into memory
## pulling out just the extension we want for the 1D spectra of our object
response = requests.get(file_url)

with fits.open(BytesIO(response.content), memmap=True) as hdul:
    hdu = hdul[df2['hdu'].iloc[0]]
    dat = Table.read(hdu, format='fits', hdu=1)
    df_obj_irsa = dat.to_pandas()
WARNING: UnitsWarning: 'erg/s/cm2/Angstrom' contains multiple slashes, which is discouraged by the FITS standard [astropy.units.format.generic]
WARNING: UnitsWarning: 'Number' did not parse as fits unit: At col 0, Unit 'Number' not supported by the FITS standard.  If this is meant to be a custom unit, define it with 'u.def_unit'. To have it recognized inside a file reader or other code, enable it with 'u.add_enabled_units'. For details, see https://docs.astropy.org/en/latest/units/combining_and_defining.html [astropy.units.core]
WARNING: UnitsWarning: 'Number' did not parse as fits unit: At col 0, Unit 'Number' not supported by the FITS standard.  If this is meant to be a custom unit, define it with 'u.def_unit'. To have it recognized inside a file reader or other code, enable it with 'u.add_enabled_units'. For details, see https://docs.astropy.org/en/latest/units/combining_and_defining.html [astropy.units.core]
WARNING: UnitsWarning: 'erg2/s2/cm4/Angstrom2' contains multiple slashes, which is discouraged by the FITS standard [astropy.units.format.generic]
WARNING: UnitsWarning: 'Number' did not parse as fits unit: At col 0, Unit 'Number' not supported by the FITS standard.  If this is meant to be a custom unit, define it with 'u.def_unit'. To have it recognized inside a file reader or other code, enable it with 'u.add_enabled_units'. For details, see https://docs.astropy.org/en/latest/units/combining_and_defining.html [astropy.units.core]

Now the data are read in, plot the spectrum#

Divide by 10000 to convert from Angstrom to micron

plt.plot(df_obj_irsa['WAVELENGTH']/10000., df_obj_irsa['SIGNAL'])

plt.xlabel('Wavelength (microns)')
plt.ylabel('Flux (erg / (s cm2))')
plt.xlim(1.25, 1.85)
plt.ylim(-0.5,0.5)
plt.title('Object ID is '+str(obj_id)+'with phz_median='+str(redshift))
Text(0.5, 1.0, 'Object ID is 2678016284659732166with phz_median=1.42')
../../_images/8e6f241f9e6ac0f4736859ab8d3574ab4718da33d01a0ad490aaf4763b9bec9d.png

Let’s cut out a very small patch of the MER image to see what this galaxy looks like

## How large do you want the image cutout to be?
im_cutout= 2.0 * u.arcsec

## Use the ra and dec of the galaxy
ra = df_g_irsa[df_g_irsa['object_id']==obj_id]['ra'].iloc[0]
dec =  df_g_irsa[df_g_irsa['object_id']==obj_id]['dec'].iloc[0]

coords_cutout = SkyCoord(ra, dec, unit=(u.deg,u.deg), frame='icrs')

Use fsspec to obtain a cutout of the fits file

hdu = fits.open(filename, use_fsspec=True)

header = hdu[0].header
## Read in the cutout of the image that you want
cutout_data = Cutout2D(hdu[0].section, position=coords_cutout, size=im_cutout, wcs=WCS(hdu[0].header))
new_hdu = fits.PrimaryHDU(data=cutout_data.data, header=header)
new_hdu.header.update(cutout_data.wcs.to_header())
## Plot a quick simple plot to show the cutout on the galaxy

plt.imshow(new_hdu.data, cmap='gray', origin='lower',
           norm=ImageNormalize(new_hdu.data, interval=PercentileInterval(99.9), stretch=AsinhStretch()))
colorbar = plt.colorbar()
../../_images/c9a23f118344d8c9a8822acbabe9f7610f5754f0a94cbfb160691fde4f696594.png

5. Load the image on Firefly to be able to interact with the data directly#

Save the data locally if you have not already done so, in order to upload to IRSA viewer.

download_path = "data"
if os.path.exists(download_path):
    print("Output directory already created.")
else:
    print("Creating data directory.")
    os.mkdir(download_path)
Creating data directory.

Vizualize the image with Firefly#

First initialize the client, then set the path to the image, upload it to firefly, load it and align with WCS.

Note this can take a while to upload the full MER image.

fc = FireflyClient.make_client('https://irsa.ipac.caltech.edu/irsaviewer')

fc.show_fits(url=filename)

fc.align_images(lock_match=True)
{'success': True}

Save the table as a CSV for Firefly upload#

csv_path = os.path.join(download_path, "mer_df.csv")
df_g_irsa.to_csv(csv_path, index=False)

Upload the CSV table to Firefly and display as an overlay on the FITS image#

uploaded_table = fc.upload_file(csv_path)
print(f"Uploaded Table URL: {uploaded_table}")

fc.show_table(uploaded_table)
Uploaded Table URL: ${upload-dir}/upload_4931246916344372166_mer_df.csv
{'success': True}

About this Notebook#

Author: Tiffany Meshkat, Anahita Alavi, Anastasia Laity, Andreas Faisst, Brigitta Sipőcz, Dan Masters, Harry Teplitz, Jaladh Singhal, Shoubaneh Hemmati.

Updated: 2025-03-26

Contact: the IRSA Helpdesk with questions or reporting problems.