Arp peculiars galaxies catalog __ First steps with Multi-Order Coverage map’s#
Stefania Amodeo¹, Katarina A. Lutz¹, Manon Marchand¹
Université de Strasbourg, CNRS, Observatoire Astronomique de Strasbourg, UMR 7550, F-67000, Strasbourg, France
Introduction#
In this tutorial, we will explore Arp’s Catalog of peculiar galaxies. Using Multi-Order Coverage maps, we will find in seconds wich galaxies are present in the Sloan Digital Sky Survey (SDSS) and have been observed by the Galaxy Evolution Explorer (GALEX) satellite.
Figure: Arp147 taken by Joachim Dietrich. Credit: NASA & ESA
# Astronomy tools
import astropy.units as u
from astropy.coordinates import SkyCoord
# Access astronomical databases
import pyvo
from astroquery.mocserver import MOCServer
from astroquery.vizier import Vizier
# Sky visualization
from ipyaladin import Aladin
Find and download tables from VizieR#
We use the Vizier
sub-module from the astroquery
module.
We will explore the Arp’s Catalog of Peculiar Galaxies compiled by Halton C. Arp and published by Denis Webb.
Hence, we ask Vizier
to find all catalogues that have a match with the keywords ‘Arp Galaxies’ and write the result into the variable catalog_list_arp
(first line of code). Then we tell Python to print
out the query result in a readable way (second line of code).
catalog_list_arp = Vizier.find_catalogs("peculiar galaxies")
for name, item in catalog_list_arp.items():
print(name, ": ", item.description)
VI/76 : Simulation Atlas of Tidal Features in Galaxies (Howard+ 1993)
VII/74A : Atlas of Peculiar Galaxies (Arp 1966)
VII/170 : Catalogue of Southern Peculiar Galaxies and Associations (Arp+, 1987)
VII/192 : Arp's Peculiar Galaxies (Webb 1996)
VII/198 : Mark III Catalog of Galaxy Peculiar Velocities (Willick+ 1997)
J/ApJ/645/228 : Velocities of satellites of external disk galaxies (Azzaro+ 2006)
J/ApJ/663/734 : Interacting Galaxies in GEMS and GOODS (Elmegreen+, 2007)
J/ApJ/769/39 : SN Ibn PS1-12sk optical and NIR light curves (Sanders+, 2013)
J/ApJ/897/183 : Chemical abundances of 3 stars in Grus II galaxy (Hansen+, 2020)
J/ApJ/903/110 : Radial velocity and g-i color in M85 globular clusters (Ko+, 2020)
J/ApJ/921/91 : Catastrophic cooling in superwinds. II. (Danehkar+, 2021)
J/ApJS/81/413 : Southern sky survey of 1355 spiral galaxies (Mathewson+, 1992)
J/ApJS/106/1 : EFAR cluster and galaxy selection (Wegner+, 1996)
J/A+A/397/463 : The Hamburg/SAO Survey for BCGs. I. (Ugryumov+, 2003)
J/A+A/422/941 : Gas content in 1038 interacting galaxies (Casasola+, 2004)
J/A+A/423/867 : Abundances of distant luminous infrared galaxies (Liang+, 2004)
J/A+A/447/473 : R I CN TiO photometry of DDO190 carbon stars (Battinelli+, 2006)
J/A+A/465/71 : 21cm observations of 452 galaxies (Theureau+, 2007)
J/A+A/482/53 : Radial velocities of four LSB galaxies (Pizzella+, 2008)
J/A+A/543/A131 : NGC1316 globular cluster candidates photometry (Richtler+, 2012)
J/A+A/550/A41 : CO line survey in 0.2<z<1 of galaxies (Combes+, 2013)
J/A+A/554/A11 : CO observations of polar ring galaxies (Combes+, 2013)
J/A+A/569/A41 : Radial velocities of NGC1316 globular clusters (Richtler+, 2014)
J/A+A/582/A21 : Merging galaxies (mis)alignments (Barrera-Ballesteros+, 2015)
J/A+A/588/A77 : NGC 3923 MegaCam image (Bilek+, 2016)
J/A+A/592/A122 : Starburst galaxies in the COSMOS field (Hinojosa-Goni+, 2016)
J/A+A/597/A134 : Kohonen selected E+A galaxies from SDSS DR7 (Meusinger+, 2017)
J/A+A/605/A54 : ESO 435-02/ESO 435-016 ATCA HI images (Kim+, 2017)
J/A+A/611/A95 : Diffuse ionized gas in the Antennae galaxy (Weilbacher+, 2018)
J/A+A/617/A113 : GalMer S0 remnants morphological properties (Eliche-Moral+, 2018)
J/A+A/621/A25 : Arp 240 Fabry-Perot interferometry (Fuentes-Carrera+, 2019)
J/A+A/640/A30 : Galaxies in the Perseus cluster field (Meusinger+, 2020)
J/A+A/645/A97 : ALMA cube and GMC catalog of J1023+1952 (Querejeta+, 2021)
J/A+A/682/A18 : 121 compact extragalactic radio sources (Meusinger+, 2024)
J/A+A/687/A229 : Element abundances of 4 metal-poor stars (Mishenina+, 2024)
J/A+A/689/A301 : ILTJ001121.28+321638.8 GMRT, LOFAR and XMM images (Kumari+, 2024)
J/A+AS/129/357 : Morphology of peculiar ring galaxies (Faundez-Abans+ 1998)
J/A+AS/136/519 : Mg2 indices for early-type galaxies (Golev+, 1999)
J/AJ/104/2078 : cD Galaxy in Abell 2107 (Oegerle+ 1992)
J/AJ/128/62 : Catalog of double nucleus disk galaxies (Gimeno+, 2004)
J/AJ/128/163 : Galaxy morphological classification (Lotz+, 2004)
J/MNRAS/292/499 : EFAR photometric data (Saglia+, 1997)
J/MNRAS/305/259 : EFAR galaxies redshifts & velocity dispersions (Wegner+, 1999)
J/MNRAS/321/277 : EFAR Catalog. VII. (Colless+, 2001)
J/MNRAS/368/651 : A3653 galaxies redshift catalogue (Pimbblet+, 2006)
J/MNRAS/402/1005 : Stellar cluster dynamical masses in NGC3310 (Hagele+, 2010)
J/MNRAS/406/382 : Early-type galaxies in the SDSS Stripe82 (Kaviraj, 2010)
J/MNRAS/418/1526 : Dark matter in dSph galaxies (Charbonnier+, 2011)
J/MNRAS/442/2216 : Redshifts of galaxies in Abell 1351 field (Barrena+, 2014)
J/MNRAS/443/3528 : SDSS peculiar galaxy pairs list (Shamir+, 2014)
J/MNRAS/444/2428 : Disturbance levels of SNe host galaxies (Hakobyan+, 2014)
J/MNRAS/445/2677 : Peculiar velocities in 6dFGS (Springob+, 2014)
J/MNRAS/446/2330 : Overmassive black holes (Savorgnan+, 2015)
J/MNRAS/456/2829 : Radial velocities of galaxies in A523 field (Girardi+, 2016)
J/MNRAS/465/316 : Lyman continuum LAEs and LBGs in SSA22 field (Micheva+, 2017)
J/MNRAS/487/2061 : Distances for 2062 nearby spiral galaxies (Hong+, 2019)
J/MNRAS/492/468 : Chemical abundances of Seyfert 2 AGNs - I (Dors+, 2020)
J/MNRAS/496/2902 : Lithium and beryllium in Gaia-Enceladus galaxy (Molaro+, 2020)
J/MNRAS/497/672 : Abundance determination in HII regions (Arellano-Cordova+, 2020)
J/MNRAS/498/2575 : Rapidly evolving transients discovered by DES (Wiseman+, 2020)
J/MNRAS/499/2327 : Ages and abundances from spectral fitting (Goncalves+, 2020)
J/MNRAS/500/889 : S2 stream. Shreds of a primitive dwarf galaxy (Aguado+, 2021)
J/MNRAS/500/1261 : Resolved molecular gas in nearby galaxies (Chown+, 2021)
J/MNRAS/501/1370 : Chemical abundances of Seyfert 2 AGNs IV (Dors+, 2021)
J/other/RMxAA/44.161 : HII regions in NGC 5055 (Rozas+, 2008)
J/other/BSAO/50.5 : Velocities of RFGC galaxies (Karachentsev+, 2000)
J/other/Ap/49.450 : Peculiar velocities of 2MFGC spirals (Karachentsev+, 2006)
The catalogue that we are interested in today is VII/192
and its description is “Arp’s Peculiar Galaxies (Webb 1996)”.
In oder to get the full catalogue with astroquery
, we first set the row limit to infinite (i.e. -1
in the notation of this package) and then ask Vizier
to write the content of the catalogue into the variable catalogs_arp
:
catalogs_arp = Vizier(row_limit=-1).get_catalogs("VII/192")
catalogs_arp
TableList with 2 tables:
'0:VII/192/arpord' with 12 column(s) and 338 row(s)
'1:VII/192/arplist' with 13 column(s) and 592 row(s)
Now let’s inspect, what we got:
for catalog in catalogs_arp:
print(f"{catalog.meta['ID']}: {catalog.meta['description']}")
VII_192_arpord: list of Arp views with imaging data
VII_192_arplist: list and info for involved galaxies
As we have seen in the first part of the tutorial, the catalogue “Arp’s Peculiar Galaxies (Webb 1996)” comes with two tables: arpord and arplist. As you can see from the printout Vizier
has downloaded both of them. However, we are still only interested in the arplist (index 1
in the TableList). Therefore, we write only the arplist table into a new variable table_arplist
(first line) and then display the table (second line):
table_arplist = catalogs_arp[1]
table_arplist
Arp | Name | VT | u_VT | dim1 | dim2 | u_dim2 | MType | Uchart | RAJ2000 | DEJ2000 | Simbad | NED |
---|---|---|---|---|---|---|---|---|---|---|---|---|
mag | arcmin | arcmin | ||||||||||
int16 | str16 | float32 | str1 | float32 | float32 | str1 | str14 | int16 | str10 | str9 | str6 | str3 |
249 | UGC 12891 | 16.2 | -- | -- | -- | 00 00 19.3 | +22 59 26 | Simbad | NED | |||
249 | UGC 12891 | 16.2 | 1.3 | 0.5 | -- | 00 00 21.6 | +22 59 42 | Simbad | NED | |||
112 | NGC 7805 | 13.3 | 1.2 | 0.9 | SAB0^0: pec | 89 | 00 01 26.9 | +31 26 02 | Simbad | NED | ||
112 | NGC 7806 | 13.5 | 1.1 | 0.8 | SA(rs)bc? pec | 89 | 00 01 30.2 | +31 26 33 | Simbad | NED | ||
130 | IC 5378 | 15.6 | 0.5 | -- | SBc | -- | 00 02 37.7 | +16 39 08 | Simbad | NED | ||
130 | IC 5378 | 15.3 | -- | -- | E | -- | 00 02 37.8 | +16 38 37 | Simbad | NED | ||
51 | MGC-02-01-24 | 15.0 | 0.8 | -- | -- | 00 06 16.8 | -13 26 53 | Simbad | NED | |||
144 | NGC 7828 | 14.4 | 0.9 | 0.5 | Ring A | 260 | 00 06 27.1 | -13 24 58 | Simbad | NED | ||
144 | NGC 7829 | 14.6 | 0.7 | -- | Ring B pec | 260 | 00 06 29.0 | -13 25 15 | Simbad | NED | ||
146 | ARP 146 | -- | 0.7 | 0.6 | Ring A | -- | 00 06 44.0 | -06 38 07 | Simbad | NED | ||
146 | VV 790 | -- | -- | -- | Pec | -- | 00 06 44.4 | -06 38 10 | Simbad | NED | ||
146 | ARP 146 | -- | 0.7 | 0.6 | Ring A | -- | 00 06 44.8 | -06 38 14 | Simbad | NED | ||
246 | NGC 7837 | 14.4 | 0.4 | 0.2 | 170 | 00 06 51.4 | +08 21 05 | Simbad | NED | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
284 | NGC 7714 | 12.5 | 1.9 | 1.4 | SB:(s)b? pec | 259 | 23 36 14.1 | +02 09 18 | Simbad | NED | ||
284 | NGC 7715 | 14.2 | 2.6 | 0.5 | Sa? pec sp | 259 | 23 36 22.0 | +02 09 24 | Simbad | NED | ||
222 | NGC 7727 | 10.6 | 4.7 | 3.6 | SAB:(s?)0/a p | 260 | 23 39 54.2 | -12 17 31 | Simbad | NED | ||
295 | MCG-01-60-021 | 14.5 | 1.9 | 0.3 | Sc | -- | 23 41 47.9 | -03 40 37 | Simbad | NED | ||
295 | ARP 295 | 14.6 | 0.9 | 0.5 | ? | Sb pec | -- | 23 42 04.1 | -03 35 21 | Simbad | NED | |
86 | NGC 7752 | 14.3 | 0.8 | 0.5 | ? | I0: | 89 | 23 46 58.5 | +29 27 32 | Simbad | NED | |
86 | NGC 7753 | 12.0 | 3.3 | 2.1 | SAB(rs)bc I | 89 | 23 47 04.7 | +29 29 01 | Simbad | NED | ||
68 | NGC 7757 | 12.7 | 2.5 | 1.8 | SAB(rs)c | 215 | 23 48 45.1 | +04 10 24 | Simbad | NED | ||
323 | NGC 7783 | 13.0 | 1.3 | 0.6 | S0^0: sp | 215 | 23 54 10.0 | +00 22 58 | Simbad | NED | ||
323 | NGC 7783B | 14.0 | 0.4 | 0.3 | S0 | 215 | 23 54 12.0 | +00 22 38 | Simbad | NED | ||
262 | MCG+03-01-003 | 14.6 | 0.5 | 0.4 | S | 125 | 23 56 43.8 | +16 48 27 | Simbad | NED | ||
262 | UGC 12856 | 13.2 | 2.4 | -- | IB(s)m | 125 | 23 56 44.9 | +16 48 45 | Simbad | NED | ||
50 | IC 1520 | 14.0 | 0.5 | 0.5 | -- | 23 57 58.0 | -14 01 48 | Simbad | NED |
Nice, we got the data we want. Before moving on, let’s have a look at how to use pyVO
to get the same table with a Table Access Protocol (TAP) query.
First, we set the TAPService
of pyvo
to the server of Vizier that will receive our TAP query.
Then we write a simple query telling VizieR that we want all the rows and all (all is written *
in SQL) the columns from the table VII/192/arplist
. Note that we have to encompass the table name with quotation marks due to the special character /
in the table name.
tap_vizier = pyvo.dal.TAPService("https://tapvizier.cds.unistra.fr/TAPVizieR/tap/")
query = """SELECT * FROM "VII/192/arplist" """
table_arplist = tap_vizier.search(query).to_table()
table_arplist
recno | Arp | Name | VT | u_VT | dim1 | dim2 | u_dim2 | MType | Uchart | RAJ2000 | DEJ2000 |
---|---|---|---|---|---|---|---|---|---|---|---|
mag | arcmin | arcmin | deg | deg | |||||||
int32 | int16 | object | float64 | str1 | float64 | float64 | str1 | object | int16 | float64 | float64 |
112 | 333 | NGC 1024 | 12.1 | 3.9 | 1.4 | (R')SA(r)ab | 175 | 39.80083333333333 | 10.847222222222221 | ||
120 | 200 | NGC 1134 | 12.1 | 2.5 | 0.9 | S? | 175 | 43.42124999999999 | 13.015277777777776 | ||
119 | 190 | UGC 02320 | 15.2 | 0.5 | 0.3 | Multiple Sys | -- | 42.58291666666666 | 12.889444444444443 | ||
89 | 290 | IC 0195 | 14.3 | 1.6 | 0.8 | S0 | -- | 30.935833333333328 | 14.708611111111109 | ||
90 | 290 | IC 0196 | 14.2 | 2.8 | 1.4 | S0- | -- | 30.95833333333333 | 14.73972222222222 | ||
111 | 258 | UGC 02140A | 15.5 | 0.9 | 0.2 | SB.0*/ | -- | 39.78874999999999 | 18.367499999999996 | ||
110 | 258 | UGC 02140 | 15.4 | 1.7 | 0.7 | IBS9P | -- | 39.77583333333333 | 18.382777777777775 | ||
109 | 258 | Hickson 18C | 16.1 | -- | -- | S? | -- | 39.774583333333325 | 18.388333333333332 | ||
108 | 258 | Hickson 18D | 14.6 | -- | -- | S? | -- | 39.76916666666666 | 18.393888888888885 | ||
105 | 276 | IC 1801 | 14.8 | 1.3 | 0.6 | SBB: | -- | 37.049166666666665 | 19.57333333333333 | ||
104 | 276 | NGC 0935 | 12.9 | 1.7 | 1.1 | Scd: | 130 | 37.04541666666666 | 19.59972222222222 | ||
82 | 56 | UGC 01432 | 14.6 | 0.9 | 0.6 | Sbc | -- | 29.35708333333333 | 17.217499999999998 | ||
87 | 78 | NGC 0770 | 13.9 | 1.1 | 0.7 | E3 | -- | 29.80666666666666 | 18.95444444444444 | ||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
399 | 153 | NGC 5128 | 6.8 | 25.9 | 20.1 | S0 pec | 403 | 201.36499999999998 | -43.01916666666666 | ||
475 | 254 | NGC 5917 | 14.5 | 1.5 | 0.9 | Sb pec? | 289 | 230.38416666666663 | -7.377222222222221 | ||
462 | 261 | MCG-02-38-016 | 13.4 | -- | -- | IB(s)m pec | -- | 222.3770833333333 | -10.173055555555553 | ||
465 | 261 | ARP 261 | 14.5 | -- | -- | IB(s)m pec | -- | 222.3870833333333 | -10.164166666666665 | ||
464 | 261 | ARP 261 | -- | -- | -- | -- | 222.38624999999996 | -10.163055555555554 | |||
463 | 261 | ARP 261 | -- | -- | -- | -- | 222.38624999999996 | -10.156666666666665 | |||
549 | 14 | NGC 7314 | 10.9 | 4.6 | 2.1 | SAB(rs)c: II | 347 | 338.94041666666664 | -26.05083333333333 | ||
547 | 93 | NGC 7284 | 11.9 | 2.1 | 1.5 | SB(s)0^0 pec | 347 | 337.15 | -24.844166666666663 | ||
548 | 93 | NGC 7285 | 11.9 | 2.4 | 1.4 | SB(rs)a pec | 347 | 337.1583333333333 | -24.84083333333333 | ||
546 | 226 | NGC 7252 | 11.4 | 2.0 | 1.6 | SAB0^0? pec | 347 | 335.1866666666666 | -24.678611111111106 | ||
541 | 325 | ESO 601- G 018 | 16.1 | -- | -- | -- | 331.6008333333333 | -21.079166666666662 | |||
540 | 325 | ESO 601- G 018 | 17.9 | -- | -- | -- | 331.59666666666664 | -21.077499999999997 | |||
539 | 325 | ESO 601- G 018 | 18.1 | 1.7 | 0.7 | -- | 331.5925 | -21.072499999999998 |
There we go, we now know two nifty ways to get VizieR tables with Python. Obviously there are many other things you can do with this tools. For example if you set your TAP endpoint to https://simbad.cds.unistra.fr/simbad/sim-tap
instead of the VizieR endpoint, you can query SIMBAD just like that.
If you want to learn more about the TAP interface, you can have a look at VizieR’s documentation.
Note that not all rows but only the first and last 10 rows for all columns are shown in the display. To finish off this little excursion, we now want to visualise the location of the entries of this table in an Aladin Lite widget. To do so, we tell Python to take the variable aladin
and add the table table_arplist
to it:
aladin = Aladin(height=600)
aladin
aladin.add_table(table_arplist)
Now explore the Aladin Lite widget. You will find that the location of the sources in the arplist table are marked with coloured symbols. You can zoom in and out to look at the different sources and check their peculiarity. If you click on one of the colour symbols, you will be able to see the corresponding row in the bottom of the Aladin Lite widget.
Note if you are using Jupyter Lab instead of single Jupyter notebooks, you can open two notebooks that share a kernel. Then one notebook could contain your working environment, where you get and work on your tables ect. The other notebook could contain the Aladin Lite widget, and just remain visible all the time. This way there would be no need to scroll up and down.
MOCs in Python#
We can use MOCs to find out whether any of these galaxies have been observed both by SDSS and GALEX. For this task we use the mocserver
module of astroquery
and the functionalities of MOCpy
to get the intersection of the MOCs. First let’s query the MOC server for all things SDSS and all things GALEX.
info_sdss = MOCServer.query_region(
meta_data="ID=*SDSS*"
) # if we don't give a region to query_region, it looks in the whole sky
info_sdss[["ID"]]
ID |
---|
str25 |
CDS/J/ApJ/749/10/SDSS-obs |
CDS/P/HLA/SDSSg |
CDS/P/HLA/SDSSr |
CDS/P/HLA/SDSSz |
CDS/P/HST/SDSSg |
CDS/P/HST/SDSSr |
CDS/P/HST/SDSSz |
CDS/P/SDSS9/color |
CDS/P/SDSS9/color-alt |
CDS/P/SDSS9/g |
CDS/P/SDSS9/i |
CDS/P/SDSS9/r |
CDS/P/SDSS9/u |
CDS/P/SDSS9/z |
info_galex = MOCServer.query_region(meta_data="ID=*GALEX*")
info_galex[["ID"]]
ID |
---|
str24 |
CDS/P/GALEXGR6/AIS/FUV |
CDS/P/GALEXGR6/AIS/NUV |
CDS/P/GALEXGR6/AIS/color |
CDS/P/GALEXGR6_7/FUV |
CDS/P/GALEXGR6_7/NUV |
CDS/P/GALEXGR6_7/color |
Now that we know what the relevant data sets are called, we can move on to download the corresponding MOCs,
moc_sdss = MOCServer.query_region(meta_data="ID=CDS/P/SDSS9/color", return_moc=True)
moc_galex = MOCServer.query_region(
meta_data="ID=CDS/P/GALEXGR6/AIS/color", return_moc=True
)
and calculate the intersection of these two MOCs.
moc_intersection = moc_sdss & moc_galex
print(
f"The intersection of SDSS and GALEX covers"
f" {round(moc_intersection.sky_fraction *100., 1)}% of the sky",
)
The intersection of SDSS and GALEX covers 31.2% of the sky
Now we can use this MOC to filter our table of Peculiar Galaxies.
coords = SkyCoord(
ra=table_arplist["RAJ2000"],
dec=table_arplist["DEJ2000"],
unit=(u.deg, u.deg),
)
mask = moc_intersection.contains_skycoords(coords)
print(
f"Among the {len(table_arplist)} peculiar galaxies, {len(table_arplist[mask])} are observed by both GALEX and SDSS!",
)
Among the 592 peculiar galaxies, 420 are observed by both GALEX and SDSS!
mask
is a boolean table that is True
where a peculiar galaxy is contained in the intersection of SDSS and GALEX MOCs. Doing table_arplist[mask]
results in a smaller table corresponding to the lines that are True
in mask
.
To visualise only the galaxies within the MOC, we can add the filtered table to the AladinLite widget. This table will show up in a different colour than the first one we visualised.
aladin.add_table(
table_arplist[mask],
color="lightblue",
name="observed_by_GALEX_and_SDSS",
shape="circle",
source_size=13,
)
The last thing to do with our MOC is to visualise it. We can either plot it using matplotlib
(see MOCPy’s documentation) or add it to our ipyaladin widget:
aladin.add_moc(moc_intersection, color="pink", opacity=0.45)
Before leaving the tutorial, don’t forget to scroll back up and look at the results in the Aladin widget where you can check that the peculiar galaxies are indeed in the MOC ;)