Arp peculiars galaxies catalog __ First steps with Multi-Order Coverage map’s#

Stefania Amodeo¹, Katarina A. Lutz¹, Manon Marchand¹

  1. 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.cds import cds
from astroquery.vizier import Vizier

# Sky visualization
from ipyaladin import Aladin

Find and download tables from VizieR#

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)
WARNING: UnitsWarning: Unit 'Sun' not supported by the VOUnit standard. Did you mean uN? [astropy.units.format.vounit]
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/630/784 :  UBVR observations of nearby galaxies (Taylor+, 2005)
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/872/202 :  CFHT ugi photometry of globular clusters in M85 (Ko+, 2019)
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/833 :  Photometry in elliptical galaxies (Michard+, 2004)
J/A+A/423/867 :  Abundances of distant luminous infrared galaxies (Liang+, 2004)
J/A+A/429/819 :  Photometry in elliptical galaxies. II. (Michard+, 2005)
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/666/A12 :  QSO-DLA and MW stars column densities (Konstantopoulou+, 2022)
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/PAZh/27/403 :  CCD R photometry in the UMa supercluster (Kopylova+, 2001)
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 the TAP query we already see that there are two tables in this catalogue: VII/192/arplist and VII/192/arpord. To be able to work with these data, let’s load them into this notebook.

Again we can use either astroquery or pyvo. Which one you chose is up to you and which one you like better.

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
Table length=592
ArpNameVTu_VTdim1dim2u_dim2MTypeUchartRAJ2000DEJ2000SimbadNED
magarcminarcmin
int16str16float32str1float32float32str1str14int16str10str9str6str3
249UGC 1289116.2------00 00 19.3+22 59 26SimbadNED
249UGC 1289116.21.30.5--00 00 21.6+22 59 42SimbadNED
112NGC 780513.31.20.9SAB0^0: pec8900 01 26.9+31 26 02SimbadNED
112NGC 780613.51.10.8SA(rs)bc? pec8900 01 30.2+31 26 33SimbadNED
130IC 537815.60.5--SBc--00 02 37.7+16 39 08SimbadNED
130IC 537815.3----E--00 02 37.8+16 38 37SimbadNED
51MGC-02-01-2415.00.8----00 06 16.8-13 26 53SimbadNED
144NGC 782814.40.90.5Ring A26000 06 27.1-13 24 58SimbadNED
144NGC 782914.60.7--Ring B pec26000 06 29.0-13 25 15SimbadNED
146ARP 146--0.70.6Ring A--00 06 44.0-06 38 07SimbadNED
.......................................
295MCG-01-60-02114.51.90.3Sc--23 41 47.9-03 40 37SimbadNED
295ARP 29514.60.90.5?Sb pec--23 42 04.1-03 35 21SimbadNED
86NGC 775214.30.80.5?I0:8923 46 58.5+29 27 32SimbadNED
86NGC 775312.03.32.1SAB(rs)bc I8923 47 04.7+29 29 01SimbadNED
68NGC 775712.72.51.8SAB(rs)c21523 48 45.1+04 10 24SimbadNED
323NGC 778313.01.30.6S0^0: sp21523 54 10.0+00 22 58SimbadNED
323NGC 7783B14.00.40.3S021523 54 12.0+00 22 38SimbadNED
262MCG+03-01-00314.60.50.4S12523 56 43.8+16 48 27SimbadNED
262UGC 1285613.22.4--IB(s)m12523 56 44.9+16 48 45SimbadNED
50IC 152014.00.50.5--23 57 58.0-14 01 48SimbadNED

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 wiht 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
Table length=592
recnoArpNameVTu_VTdim1dim2u_dim2MTypeUchartRAJ2000DEJ2000
magarcminarcmindegdeg
int32int16objectfloat64str1float64float64str1objectint16float64float64
112333NGC 102412.13.91.4(R')SA(r)ab17539.8008333333333310.847222222222221
120200NGC 113412.12.50.9S?17543.4212499999999913.015277777777776
119190UGC 0232015.20.50.3Multiple Sys--42.5829166666666612.889444444444443
89290IC 019514.31.60.8S0--30.93583333333332814.708611111111109
90290IC 019614.22.81.4S0---30.9583333333333314.73972222222222
111258UGC 02140A15.50.90.2SB.0*/--39.7887499999999918.367499999999996
110258UGC 0214015.41.70.7IBS9P--39.7758333333333318.382777777777775
109258Hickson 18C16.1----S?--39.77458333333332518.388333333333332
108258Hickson 18D14.6----S?--39.7691666666666618.393888888888885
105276IC 180114.81.30.6SBB:--37.04916666666666519.57333333333333
....................................
465261ARP 26114.5----IB(s)m pec--222.3870833333333-10.164166666666665
464261ARP 261--------222.38624999999996-10.163055555555554
463261ARP 261--------222.38624999999996-10.156666666666665
54914NGC 731410.94.62.1SAB(rs)c: II347338.94041666666664-26.05083333333333
54793NGC 728411.92.11.5SB(s)0^0 pec347337.15-24.844166666666663
54893NGC 728511.92.41.4SB(rs)a pec347337.1583333333333-24.84083333333333
546226NGC 725211.42.01.6SAB0^0? pec347335.1866666666666-24.678611111111106
541325ESO 601- G 01816.1------331.6008333333333-21.079166666666662
540325ESO 601- G 01817.9------331.59666666666664-21.077499999999997
539325ESO 601- G 01818.11.70.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 enpoint, you can query SIMBAD just like that.

Aladin

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(show_fullscreen_control=True, 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 cds 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 = cds.find_datasets(meta_data="ID=*SDSS*")
info_sdss[["ID"]]
Table length=14
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 = cds.find_datasets(meta_data="ID=*GALEX*")
info_galex[["ID"]]
Table length=6
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 = cds.find_datasets(meta_data="ID=CDS/P/SDSS9/color", return_moc=True)
moc_galex = cds.find_datasets(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])

The last thing to do with our MOC is to visualise it. We can either plot it using matplotlib (see the MOCpy documentation, how to do this) or add it to our AladinLite widget:

aladin.add_moc_from_dict(
    moc_intersection.serialize(format="json"),
    {"color": "red", "opacity": 0.45},
)

Before leaving the tutorial, don’t forget to scroll back up and look at the results in the Aladin widget ;)