Add the ROSAT-to-eRASS1, FIR-radio and quiet-spotted searches and read HECATE's AGN flags correctly
Browse files- LEDGER.md +4 -1
- README.md +4 -1
- RESULTS.md +27 -3
- coverage.db +2 -2
- setitools/composition.py +29 -9
- setitools/flashes.py +71 -1
- setitools/highenergy.py +102 -0
- setitools/infrared.py +108 -9
LEDGER.md
CHANGED
|
@@ -270,7 +270,7 @@ is its docstring, and its calls are in the recipes of `README.md`.
|
|
| 270 |
| Planets in step with their star's spin | NASA Exoplanet Archive composite table: 178 planets whose host carries a rotation period and whose orbital period is 1.5-20.5 times it, those at a whole multiple within 0.5 per cent against the half-integer windows and uniform fractions, each read for the source of the rotation period | 12 at whole multiples against 10.1 expected and 13 at half-integers (Poisson p 0.32) |
|
| 271 |
| Nearby light bluer than any star | Gaia Catalogue of Nearby Stars: sources within 100 pc with BP-RP below -0.65, bluer than the Rayleigh-Jeans tail of any photosphere gives in Gaia's bands, each read for its BP/RP flux excess, image-peak and RUWE flags, white-dwarf probability and SIMBAD type | 1, a G 17 source with a BP/RP flux excess of 26 over the single-star relation, a blend or a corrupted BP and no bluer star |
|
| 272 |
| Comets pushed toward the Sun | JPL Small-Body Database: 32 comets and 3 asteroids whose radial non-gravitational term A1 is negative, those negative at three sigma, each read for its arc and condition code, its transverse term A2 and the asymmetric outgassing parameter DT | 27 at three sigma: 1 on a short arc, 6 with a larger transverse term or a shifted outgassing law; 20 comets keep a radial term toward the Sun of 2e-10 to 6e-7 au per day squared on arcs of 3-75 years, which the symmetric outgassing law returns for a nucleus venting mostly after perihelion, and they await refits with an asymmetric law; the asteroid 4179 Toutatis's -3.1e-13 at 3.4 sigma is the lowest of the 22 asteroids SBDB fits a radial term for, whose median lies at +3.1 sigma, outward as sunlight pushes |
|
| 273 |
-
| Galaxies warm without star formation | HECATE: 669 galaxies within 150 Mpc with GSWLC stellar masses and ultraviolet-optical star-formation rates and with WISE 22 um and IRAS far-infrared luminosities, the 38 quiescent ones (specific rate below 1e-11 per year) radiating more than a tenth of a solar luminosity per solar mass at 22 um within a factor of three of their far-infrared, against the quiescent population's own distribution; each read for HECATE's
|
| 274 |
| Stars that dimmed since Hipparcos | Hipparcos new reduction and Gaia DR3: 17285 Hipparcos stars within 100 pc with a Gaia best neighbour, G against Hp through the sample's running median of G - Hp in BP-RP, those fainter by 0.5 mag and those brighter by as much, each read for Hipparcos's scatter and variability, Gaia's variability flag and RUWE, SIMBAD's type, a pair's name or component letter and a Gaia neighbour within 10 arcsec | 297 fainter against 4 brighter: 274 are pairs whose joint light Hipparcos measured and Gaia resolves, most by 0.75 mag, 23 are variables and 4 rest on Hipparcos records without a scatter; none unexplained |
|
| 275 |
| Asteroids on polar orbits | JPL Small-Body Database: 51 bound orbits of asteroids and comets within 3 deg of 90 deg inclination, those within 0.5 deg of polar against a flat inclination density and the bands either side, each read for its arc and condition code | 9 against 8.5 expected (Poisson p 0.48): 8 long-period and Halley-type comets and one trans-Neptunian object |
|
| 276 |
| Stars enriched evenly in every heavy element | GALAH DR4: 46868 stars with clean measurements of all eleven neutron-capture elements Sr, Y, Zr, Mo, Ru, Ba, La, Ce, Nd, Sm and Eu, those with every [X/Fe] above +0.4 dex and a spread below 0.1 dex across the eleven, against the stars depleted as evenly and the sample's own spread | none of the 41 stars enriched above +0.4 dex carries a flat pattern, and none is depleted evenly; the sample's spread across the elements runs 0.12 dex at the median against errors of 0.09 |
|
|
@@ -413,6 +413,9 @@ is its docstring, and its calls are in the recipes of `README.md`.
|
|
| 413 |
| Deep temporary fades | Gaia Catalogue of Nearby Stars objects within 100 pc at G 13.5-19 north of -28 deg joined on IRSA to ZTF DR24 objects: 123,529 stars with 50 or more good points in both g and r | the faintest good point a magnitude below the median in both bands with the brightness skewed faint: 93; in their light curves 60 are faint on three nights or fewer, 3 are eclipsing binaries, 9 are fast movers (182-492 mas/yr) whose ZTF object steps down by 1.0-2.6 mag in both bands once the star has moved 1.1-1.8 arcsec from it, the newer object at the same star holding its brightness, and 21 hold faint nights in one band alone; no fade in both bands lasting more than a night (`ztf_deep_fades`, not recorded) |
|
| 414 |
| Under our own radar fence at 217 MHz | the Gaia Catalogue of Nearby Stars within 10 pc at declinations 0 to +33 deg, which NAVSPASUR's 216.98 MHz fence has swept since 1961, carried to 2013.8; GLEAM EGC (VIII/100) within 2 arcmin and in the surrounding degree, the 216-223 MHz sub-band against the power law of the other nineteen | 3 GLEAM sources within 2 arcmin of the 86 stars, all 66-105 arcsec off and two of them one source beside the pair at 5.1 pc, against 2.0 from the fields' density (p 0.31), none above its power law at 216-223 MHz, where none of the 1596 field sources stands 3 sigma above either; limits 0.05-0.51 Jy at 3 sigma (median 0.12), 2e15 W isotropic over the 7.68 MHz sub-band at 5 pc for 0.1 Jy (`gleam_radar_fence`) |
|
| 415 |
| Technetium in the nearest polluted white dwarf | van Maanen 2 (WD 0046+051, 4.3 pc): the ESO X-shooter UVB spectrum of 2016 (S/N 224), flat and free of metal lines across 4205-4312 A; NIST ASD lines and gf | Gaussians of the star's Fe I width (sigma 0.89 A) fixed at the Tc I resonance lines 4238.19, 4262.27 and 4297.06 A in the star's frame (-15.4 km/s from 15 Fe I lines): EW +2.0 +- 4.2, -1.3 +- 4.2 and -4.5 +- 4.5 mA against random places at robust sd 8.0 mA, 3-sigma 22.9 mA per line, the strength of a ground-term Fe I line of log gf -1.57 on the star's own curve of growth: N(Tc)/N(Fe) below about 0.03, partition functions and ionisation taken as equal; FEROS and UVES carry order-merging ripples there (`vma2_technetium`, not recorded) |
|
|
|
|
|
|
|
|
|
|
| 416 |
|
| 417 |
## Queued
|
| 418 |
|
|
|
|
| 270 |
| Planets in step with their star's spin | NASA Exoplanet Archive composite table: 178 planets whose host carries a rotation period and whose orbital period is 1.5-20.5 times it, those at a whole multiple within 0.5 per cent against the half-integer windows and uniform fractions, each read for the source of the rotation period | 12 at whole multiples against 10.1 expected and 13 at half-integers (Poisson p 0.32) |
|
| 271 |
| Nearby light bluer than any star | Gaia Catalogue of Nearby Stars: sources within 100 pc with BP-RP below -0.65, bluer than the Rayleigh-Jeans tail of any photosphere gives in Gaia's bands, each read for its BP/RP flux excess, image-peak and RUWE flags, white-dwarf probability and SIMBAD type | 1, a G 17 source with a BP/RP flux excess of 26 over the single-star relation, a blend or a corrupted BP and no bluer star |
|
| 272 |
| Comets pushed toward the Sun | JPL Small-Body Database: 32 comets and 3 asteroids whose radial non-gravitational term A1 is negative, those negative at three sigma, each read for its arc and condition code, its transverse term A2 and the asymmetric outgassing parameter DT | 27 at three sigma: 1 on a short arc, 6 with a larger transverse term or a shifted outgassing law; 20 comets keep a radial term toward the Sun of 2e-10 to 6e-7 au per day squared on arcs of 3-75 years, which the symmetric outgassing law returns for a nucleus venting mostly after perihelion, and they await refits with an asymmetric law; the asteroid 4179 Toutatis's -3.1e-13 at 3.4 sigma is the lowest of the 22 asteroids SBDB fits a radial term for, whose median lies at +3.1 sigma, outward as sunlight pushes |
|
| 273 |
+
| Galaxies warm without star formation | HECATE: 669 galaxies within 150 Mpc with GSWLC stellar masses and ultraviolet-optical star-formation rates and with WISE 22 um and IRAS far-infrared luminosities, the 38 quiescent ones (specific rate below 1e-11 per year) radiating more than a tenth of a solar luminosity per solar mass at 22 um within a factor of three of their far-infrared, against the quiescent population's own distribution; each read for HECATE's two active-nucleus flags, its inclination and its homogenised star-formation rate, which counts the infrared | 6: 3 active nuclei, 1 edge-on disc, and CGCG 105-099 and UGC 12633, quiescent by their ultraviolet-optical rates and forming 10-15 solar masses a year once the infrared is counted; the quiescent galaxies' 22 um heat per mass runs 0.035 solar at the median and 0.55 at the 99th percentile (`hecate_warm_quiet`) |
|
| 274 |
| Stars that dimmed since Hipparcos | Hipparcos new reduction and Gaia DR3: 17285 Hipparcos stars within 100 pc with a Gaia best neighbour, G against Hp through the sample's running median of G - Hp in BP-RP, those fainter by 0.5 mag and those brighter by as much, each read for Hipparcos's scatter and variability, Gaia's variability flag and RUWE, SIMBAD's type, a pair's name or component letter and a Gaia neighbour within 10 arcsec | 297 fainter against 4 brighter: 274 are pairs whose joint light Hipparcos measured and Gaia resolves, most by 0.75 mag, 23 are variables and 4 rest on Hipparcos records without a scatter; none unexplained |
|
| 275 |
| Asteroids on polar orbits | JPL Small-Body Database: 51 bound orbits of asteroids and comets within 3 deg of 90 deg inclination, those within 0.5 deg of polar against a flat inclination density and the bands either side, each read for its arc and condition code | 9 against 8.5 expected (Poisson p 0.48): 8 long-period and Halley-type comets and one trans-Neptunian object |
|
| 276 |
| Stars enriched evenly in every heavy element | GALAH DR4: 46868 stars with clean measurements of all eleven neutron-capture elements Sr, Y, Zr, Mo, Ru, Ba, La, Ce, Nd, Sm and Eu, those with every [X/Fe] above +0.4 dex and a spread below 0.1 dex across the eleven, against the stars depleted as evenly and the sample's own spread | none of the 41 stars enriched above +0.4 dex carries a flat pattern, and none is depleted evenly; the sample's spread across the elements runs 0.12 dex at the median against errors of 0.09 |
|
|
|
|
| 413 |
| Deep temporary fades | Gaia Catalogue of Nearby Stars objects within 100 pc at G 13.5-19 north of -28 deg joined on IRSA to ZTF DR24 objects: 123,529 stars with 50 or more good points in both g and r | the faintest good point a magnitude below the median in both bands with the brightness skewed faint: 93; in their light curves 60 are faint on three nights or fewer, 3 are eclipsing binaries, 9 are fast movers (182-492 mas/yr) whose ZTF object steps down by 1.0-2.6 mag in both bands once the star has moved 1.1-1.8 arcsec from it, the newer object at the same star holding its brightness, and 21 hold faint nights in one band alone; no fade in both bands lasting more than a night (`ztf_deep_fades`, not recorded) |
|
| 414 |
| Under our own radar fence at 217 MHz | the Gaia Catalogue of Nearby Stars within 10 pc at declinations 0 to +33 deg, which NAVSPASUR's 216.98 MHz fence has swept since 1961, carried to 2013.8; GLEAM EGC (VIII/100) within 2 arcmin and in the surrounding degree, the 216-223 MHz sub-band against the power law of the other nineteen | 3 GLEAM sources within 2 arcmin of the 86 stars, all 66-105 arcsec off and two of them one source beside the pair at 5.1 pc, against 2.0 from the fields' density (p 0.31), none above its power law at 216-223 MHz, where none of the 1596 field sources stands 3 sigma above either; limits 0.05-0.51 Jy at 3 sigma (median 0.12), 2e15 W isotropic over the 7.68 MHz sub-band at 5 pc for 0.1 Jy (`gleam_radar_fence`) |
|
| 415 |
| Technetium in the nearest polluted white dwarf | van Maanen 2 (WD 0046+051, 4.3 pc): the ESO X-shooter UVB spectrum of 2016 (S/N 224), flat and free of metal lines across 4205-4312 A; NIST ASD lines and gf | Gaussians of the star's Fe I width (sigma 0.89 A) fixed at the Tc I resonance lines 4238.19, 4262.27 and 4297.06 A in the star's frame (-15.4 km/s from 15 Fe I lines): EW +2.0 +- 4.2, -1.3 +- 4.2 and -4.5 +- 4.5 mA against random places at robust sd 8.0 mA, 3-sigma 22.9 mA per line, the strength of a ground-term Fe I line of log gf -1.57 on the star's own curve of growth: N(Tc)/N(Fe) below about 0.03, partition functions and ionisation taken as equal; FEROS and UVES carry order-merging ripples there (`vma2_technetium`, not recorded) |
|
| 416 |
+
| X-ray sources that went out | 2RXS (ROSAT All-Sky Survey, 1990-1991): 13,869 point sources at existence likelihood 10 or more and 0.05 ct/s or brighter, ten times eRASS1's limit, at Galactic longitude 181-359 deg, against the eRASS1 main catalogue (2019-2020) within 120 arcsec; SIMBAD within 90 arcsec, Gaia DR3 within 20 arcsec, AllWISE colours | 532 gone, all explained: 254 pieces of extended emission (galaxy clusters, SN 1006, three or more missing detections within half a degree), 161 variable nuclei, X-ray binaries and cataclysmic variables, 64 stars caught in a flare, 37 beside sources of 10 ct/s such as Sco X-1, 1 ROSAT variable, and 15 at likelihood 10-17, where 22 per cent of the sample lies and all 15 do (p 1.5e-10), the catalogue's spurious tail (`rosat_erass1_gone`) |
|
| 417 |
+
| Heat without cosmic rays | HECATE: 820 galaxies within 200 Mpc north of -40 deg with IRAS 60 and 100 um fluxes bright enough for NVSS to reach q 3.3; NVSS components summed within each galaxy's D25 semi-major axis (45 arcsec to 3 arcmin); q = log of far-infrared over 1.4 GHz flux, 2.34 +- 0.26 in nature (Yun et al. 2001) | q median 2.34, scatter 0.17 over the 814 detected; 11 above 3.3, none unexplained: with NED's 1.4 GHz flux integrated over the galaxy's map M31, M33, M101 and IC 356 return to q 2.2-2.7 (IC 356's 30 mJy from Condon, Cotton and Broderick 2002, where NVSS's component list holds nothing, its cold dust at a 100/60 um ratio of 6.4 putting it where the coldest galaxies run, median q 2.65), 4 more discs are wider than the radio sum covers (NGC 300, NGC 247, NGC 6822, NGC 4753), 1 lies in the Galactic plane's cirrus, NGC 1317 has an active nucleus and NGC 1377 is the radio-deficient nascent starburst of Roussel et al. (2003) (`fir_radio_quiet`) |
|
| 418 |
+
| Quiet but spotted | McQuillan et al. (2014) Kepler rotation periods and spot amplitudes: 104 dwarfs below 4000 K spinning faster than 10 d with amplitudes above their peers' median and a Gaia DR3 match, against the Kepler flare stars of Yang and Liu (2019) | 103 flare; the one quiet star is a binary at RUWE above 1.4, against 1.0 quiet star expected from the brightness bins' quiet shares; none unexplained (`kepler_quiet_spotted`) |
|
| 419 |
|
| 420 |
## Queued
|
| 421 |
|
README.md
CHANGED
|
@@ -428,9 +428,11 @@ on any vet that is not a code.
|
|
| 428 |
| Planets in step with their star's spin | planets of the composite table whose host carries a rotation period; an orbital period at a whole multiple of 2-20 of the rotation within 0.5 per cent, against the half-integer windows and uniform fractions, each with the source of the rotation period | `seti.py transits spinsteps [record] [--tol-rel 0.005] [--n-max 20]` |
|
| 429 |
| Nearby light bluer than any star | Gaia Catalogue of Nearby Stars objects with BP-RP below -0.65; the BP/RP flux excess, the image-peak and RUWE flags, the white-dwarf probability and SIMBAD's type as vets | `seti.py ultraviolet bluest [record] [--colour-max -0.65] [--excess-max 0.2]` |
|
| 430 |
| Comets pushed toward the Sun | comets and asteroids of the Small-Body Database with a negative radial non-gravitational term A1 at three sigma; the arc, condition code, transverse term and asymmetric outgassing parameter as vets | `seti.py solar_system sunward [record] [--sigma 3]` |
|
| 431 |
-
| Galaxies warm without star formation | quiescent HECATE galaxies within 150 Mpc with GSWLC masses and rates; a 22 um luminosity above a tenth of a solar luminosity per solar mass and within a factor of three of the far-infrared, against the quiescent population, with the
|
|
|
|
| 432 |
| Stars that dimmed since Hipparcos | Hipparcos stars within 100 pc with a Gaia DR3 best neighbour; G - Hp against the running median in BP-RP, a step of 0.5 mag either way, with Hipparcos's scatter and variability, Gaia's variability flag and RUWE, SIMBAD's type, pair names and Gaia neighbours as vets | `seti.py dimming hipdim [record] [--dmag 0.5] [--plx-min 10] [--bright-g 3] [--pair-arcsec 10]` |
|
| 433 |
| Single-transit flashes in Hipparcos | Hipparcos epoch photometry of quiet stars within 100 pc; one transit 0.3 mag and five robust deviations brighter than the median against the transits as much fainter, with catalogue-wide events, recurrence, variability and RUWE as vets and the pass partner as the test of a real flash | `seti.py flashes hipflash [record] [--mag 0.3] [--sig 5] [--quiet 0.02] [--pair-days 0.02] [--plx-min 10]` |
|
|
|
|
| 434 |
| Asteroids on polar orbits | asteroids and comets of the Small-Body Database on bound orbits within 3 deg of 90 deg inclination; those within 0.5 deg of polar against a flat density and the bands either side, each read for its arc and condition code | `seti.py solar_system polar [record] [--half-width-deg 0.5] [--band-deg 3] [--condition-max 6]` |
|
| 435 |
| Stars enriched evenly in every heavy element | GALAH DR4 stars with all eleven neutron-capture elements clean; every [X/Fe] above +0.4 dex with a spread below 0.1 dex, against the stars depleted as evenly and the sample's own spread | `seti.py composition evenheavy [record] [--mean-min 0.4] [--spread-max 0.1]` |
|
| 436 |
| Transits longer than the star allows | transiting planets of the composite table; a duration beyond 1.25 times the central circular maximum at the catalogued geometry, with the duration error, the sources of duration and radius and the eccentricity as vets | `seti.py transits longtransits [record] [--excess 1.25] [--err-max 0.2]` |
|
|
@@ -504,6 +506,7 @@ on any vet that is not a code.
|
|
| 504 |
| Retrograde co-orbitals of the giant planets | SBDB bodies sharing a giant planet's semi-major axis on retrograde orbits of modest eccentricity, read against the published cases and the arcs | `seti.py solar_system retroco [record] [--a-tol 0.05] [--i-min 90] [--e-max 0.5] [--arc-min-d 365]` |
|
| 505 |
| Radio sources that switched off | Compact NVSS sources of 1995 absent from the VLASS quick-look components of 2019, read against SIMBAD, bright neighbours, RACS-low and the catalogue's holes, then the later surveys, the lobes of brighter sources and the VLASS images themselves | `seti.py radio_sky switchoff [record] [--flux-min-mjy 100] [--major-max-arcsec 25] [--radius-arcsec 20] [--dec-min -40] [--hole-deg 0.25] [--b-min 10] [--bright-jy 5] [--bright-deg 0.5] [--racs-dec-max 41] [--later-arcsec 30] [--lobe-arcsec 90] [--image-sigma 10]` |
|
| 506 |
| Under our own radar fence at 217 MHz | Gaia Catalogue of Nearby Stars within 10 pc in the strip NAVSPASUR's 216.98 MHz fence sweeps; GLEAM EGC within 2 arcmin against the density of the surrounding degree, the 216-223 MHz sub-band against the power law of the other nineteen, and three times the sub-band's local noise as the limit where nothing is found | `seti.py radio_sky radarfence [record] [--dist-pc 10] [--dec-min 0] [--dec-max 33] [--near-arcmin 2] [--field-deg 1] [--sigma 3] [--epoch 2013.8]` |
|
|
|
|
| 507 |
| Bodies pushed out of their orbital planes | SBDB bodies whose normal non-gravitational term rivals the radial, read against jets, dark comets and arcs | `seti.py solar_system outofplane [record] [--sigma 3] [--ratio-min 0.5] [--arc-min-d 1000]` |
|
| 508 |
| Gamma rays harder than any shock | 4FGL sources whose photon index is harder than any accelerator gives, read against their associations and extension | `seti.py highenergy hardgamma [record] [--index-max 1.3] [--sig-min 10]` |
|
| 509 |
| Stars whose distance changed since Hipparcos | Hipparcos against Gaia parallaxes with scaled errors, outliers read for misidentification, binarity, solution quality and the Gaussian tail | `seti.py neighbourhood receded [record] [--sigma 5] [--min-mas 2] [--g-sat 6] [--f2-max 3] [--match-mag 2]` |
|
|
|
|
| 428 |
| Planets in step with their star's spin | planets of the composite table whose host carries a rotation period; an orbital period at a whole multiple of 2-20 of the rotation within 0.5 per cent, against the half-integer windows and uniform fractions, each with the source of the rotation period | `seti.py transits spinsteps [record] [--tol-rel 0.005] [--n-max 20]` |
|
| 429 |
| Nearby light bluer than any star | Gaia Catalogue of Nearby Stars objects with BP-RP below -0.65; the BP/RP flux excess, the image-peak and RUWE flags, the white-dwarf probability and SIMBAD's type as vets | `seti.py ultraviolet bluest [record] [--colour-max -0.65] [--excess-max 0.2]` |
|
| 430 |
| Comets pushed toward the Sun | comets and asteroids of the Small-Body Database with a negative radial non-gravitational term A1 at three sigma; the arc, condition code, transverse term and asymmetric outgassing parameter as vets | `seti.py solar_system sunward [record] [--sigma 3]` |
|
| 431 |
+
| Galaxies warm without star formation | quiescent HECATE galaxies within 150 Mpc with GSWLC masses and rates; a 22 um luminosity above a tenth of a solar luminosity per solar mass and within a factor of three of the far-infrared, against the quiescent population, with the active-nucleus flags, the inclination and the infrared-inclusive star-formation rate as vets | `seti.py infrared warmgalaxies [record] [--d-max-mpc 150] [--ssfr-max -11] [--heat-min -1.0] [--warm-min -0.5] [--edge-on-deg 70]` |
|
| 432 |
+
| Heat without cosmic rays | HECATE galaxies with IRAS fluxes against NVSS summed over the disc; the far-infrared to radio ratio q above 3.3, with NED's flux integrated over the map, the Galactic plane, discs wider than the sum, active nuclei, SIMBAD types and published explanations as vets | `seti.py infrared radioquiet [record] [--d-max-mpc 200] [--q-flag 3.3] [--nvss-limit-mjy 2.5] [--b-min 10] [--extent-arcmin 6]` |
|
| 433 |
| Stars that dimmed since Hipparcos | Hipparcos stars within 100 pc with a Gaia DR3 best neighbour; G - Hp against the running median in BP-RP, a step of 0.5 mag either way, with Hipparcos's scatter and variability, Gaia's variability flag and RUWE, SIMBAD's type, pair names and Gaia neighbours as vets | `seti.py dimming hipdim [record] [--dmag 0.5] [--plx-min 10] [--bright-g 3] [--pair-arcsec 10]` |
|
| 434 |
| Single-transit flashes in Hipparcos | Hipparcos epoch photometry of quiet stars within 100 pc; one transit 0.3 mag and five robust deviations brighter than the median against the transits as much fainter, with catalogue-wide events, recurrence, variability and RUWE as vets and the pass partner as the test of a real flash | `seti.py flashes hipflash [record] [--mag 0.3] [--sig 5] [--quiet 0.02] [--pair-days 0.02] [--plx-min 10]` |
|
| 435 |
+
| Quiet but spotted | Kepler M dwarfs spinning faster than 10 days with large spot amplitudes against the Kepler flare list, in brightness bins where most peers flare; Gaia neighbours, RUWE and colour as vets | `seti.py flashes quietspots [record] [--teff-max 4000] [--prot-max 10] [--frac-min 0.7] [--g-step 1] [--beam-arcsec 4]` |
|
| 436 |
| Asteroids on polar orbits | asteroids and comets of the Small-Body Database on bound orbits within 3 deg of 90 deg inclination; those within 0.5 deg of polar against a flat density and the bands either side, each read for its arc and condition code | `seti.py solar_system polar [record] [--half-width-deg 0.5] [--band-deg 3] [--condition-max 6]` |
|
| 437 |
| Stars enriched evenly in every heavy element | GALAH DR4 stars with all eleven neutron-capture elements clean; every [X/Fe] above +0.4 dex with a spread below 0.1 dex, against the stars depleted as evenly and the sample's own spread | `seti.py composition evenheavy [record] [--mean-min 0.4] [--spread-max 0.1]` |
|
| 438 |
| Transits longer than the star allows | transiting planets of the composite table; a duration beyond 1.25 times the central circular maximum at the catalogued geometry, with the duration error, the sources of duration and radius and the eccentricity as vets | `seti.py transits longtransits [record] [--excess 1.25] [--err-max 0.2]` |
|
|
|
|
| 506 |
| Retrograde co-orbitals of the giant planets | SBDB bodies sharing a giant planet's semi-major axis on retrograde orbits of modest eccentricity, read against the published cases and the arcs | `seti.py solar_system retroco [record] [--a-tol 0.05] [--i-min 90] [--e-max 0.5] [--arc-min-d 365]` |
|
| 507 |
| Radio sources that switched off | Compact NVSS sources of 1995 absent from the VLASS quick-look components of 2019, read against SIMBAD, bright neighbours, RACS-low and the catalogue's holes, then the later surveys, the lobes of brighter sources and the VLASS images themselves | `seti.py radio_sky switchoff [record] [--flux-min-mjy 100] [--major-max-arcsec 25] [--radius-arcsec 20] [--dec-min -40] [--hole-deg 0.25] [--b-min 10] [--bright-jy 5] [--bright-deg 0.5] [--racs-dec-max 41] [--later-arcsec 30] [--lobe-arcsec 90] [--image-sigma 10]` |
|
| 508 |
| Under our own radar fence at 217 MHz | Gaia Catalogue of Nearby Stars within 10 pc in the strip NAVSPASUR's 216.98 MHz fence sweeps; GLEAM EGC within 2 arcmin against the density of the surrounding degree, the 216-223 MHz sub-band against the power law of the other nineteen, and three times the sub-band's local noise as the limit where nothing is found | `seti.py radio_sky radarfence [record] [--dist-pc 10] [--dec-min 0] [--dec-max 33] [--near-arcmin 2] [--field-deg 1] [--sigma 3] [--epoch 2013.8]` |
|
| 509 |
+
| X-ray sources that went out | 2RXS point sources ten times eRASS1's limit in eRASS1's half of the sky against the eRASS1 main catalogue; SIMBAD types, Gaia stars, WISE AGN colours, bright neighbours, clumps of missing detections and the likelihood of what is left as vets | `seti.py highenergy rosatgone [record] [--exi-min 10] [--crate-min 0.05] [--match-arcsec 120] [--edge-deg 1] [--simbad-arcsec 90] [--gaia-arcsec 20] [--bright-ct 10] [--bright-deg 0.5] [--clump-deg 0.5] [--spur-exi 20]` |
|
| 510 |
| Bodies pushed out of their orbital planes | SBDB bodies whose normal non-gravitational term rivals the radial, read against jets, dark comets and arcs | `seti.py solar_system outofplane [record] [--sigma 3] [--ratio-min 0.5] [--arc-min-d 1000]` |
|
| 511 |
| Gamma rays harder than any shock | 4FGL sources whose photon index is harder than any accelerator gives, read against their associations and extension | `seti.py highenergy hardgamma [record] [--index-max 1.3] [--sig-min 10]` |
|
| 512 |
| Stars whose distance changed since Hipparcos | Hipparcos against Gaia parallaxes with scaled errors, outliers read for misidentification, binarity, solution quality and the Gaussian tail | `seti.py neighbourhood receded [record] [--sigma 5] [--min-mas 2] [--g-sat 6] [--f2-max 3] [--match-mag 2]` |
|
RESULTS.md
CHANGED
|
@@ -4,7 +4,7 @@ Generated by `python -I seti.py store table` from the Searched table of `LEDGER.
|
|
| 4 |
|
| 5 |
A run is one row of the store's `searches` table. Its sample is the number of things it searched (`n_targets`) in the unit named (`n_unit`), and samples in different units are never added. Its rows are its rows in the `coverage` table, one for each target for which it recorded a statistic, a limit or a vet; many runs record only their flagged targets, so a run's rows are not its sample. A vetted row carries the codes of `README.md` for the explanations that removed it.
|
| 6 |
|
| 7 |
-
|
| 8 |
|
| 9 |
## Curved drift tracks, radio
|
| 10 |
|
|
@@ -2112,11 +2112,11 @@ A run is one row of the store's `searches` table. Its sample is the number of th
|
|
| 2112 |
|
| 2113 |
## Galaxies warm without star formation
|
| 2114 |
|
| 2115 |
-
**Data.** HECATE: 669 galaxies within 150 Mpc with GSWLC stellar masses and ultraviolet-optical star-formation rates and with WISE 22 um and IRAS far-infrared luminosities, the 38 quiescent ones (specific rate below 1e-11 per year) radiating more than a tenth of a solar luminosity per solar mass at 22 um within a factor of three of their far-infrared, against the quiescent population's own distribution; each read for HECATE's
|
| 2116 |
|
| 2117 |
**Runs.** `hecate_warm_quiet`: 38 galaxies, 6 per-target rows, 6 vetted
|
| 2118 |
|
| 2119 |
-
**Result.** 6,
|
| 2120 |
|
| 2121 |
## Stars that dimmed since Hipparcos
|
| 2122 |
|
|
@@ -3253,3 +3253,27 @@ A run is one row of the store's `searches` table. Its sample is the number of th
|
|
| 3253 |
**Runs.** none in the store
|
| 3254 |
|
| 3255 |
**Result.** Gaussians of the star's Fe I width (sigma 0.89 A) fixed at the Tc I resonance lines 4238.19, 4262.27 and 4297.06 A in the star's frame (-15.4 km/s from 15 Fe I lines): EW +2.0 +- 4.2, -1.3 +- 4.2 and -4.5 +- 4.5 mA against random places at robust sd 8.0 mA, 3-sigma 22.9 mA per line, the strength of a ground-term Fe I line of log gf -1.57 on the star's own curve of growth: N(Tc)/N(Fe) below about 0.03, partition functions and ionisation taken as equal; FEROS and UVES carry order-merging ripples there (`vma2_technetium`, not recorded)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
A run is one row of the store's `searches` table. Its sample is the number of things it searched (`n_targets`) in the unit named (`n_unit`), and samples in different units are never added. Its rows are its rows in the `coverage` table, one for each target for which it recorded a statistic, a limit or a vet; many runs record only their flagged targets, so a run's rows are not its sample. A vetted row carries the codes of `README.md` for the explanations that removed it.
|
| 6 |
|
| 7 |
+
521 runs of 409 approaches; 514900 per-target rows over 433116 distinct target identifiers.
|
| 8 |
|
| 9 |
## Curved drift tracks, radio
|
| 10 |
|
|
|
|
| 2112 |
|
| 2113 |
## Galaxies warm without star formation
|
| 2114 |
|
| 2115 |
+
**Data.** HECATE: 669 galaxies within 150 Mpc with GSWLC stellar masses and ultraviolet-optical star-formation rates and with WISE 22 um and IRAS far-infrared luminosities, the 38 quiescent ones (specific rate below 1e-11 per year) radiating more than a tenth of a solar luminosity per solar mass at 22 um within a factor of three of their far-infrared, against the quiescent population's own distribution; each read for HECATE's two active-nucleus flags, its inclination and its homogenised star-formation rate, which counts the infrared
|
| 2116 |
|
| 2117 |
**Runs.** `hecate_warm_quiet`: 38 galaxies, 6 per-target rows, 6 vetted
|
| 2118 |
|
| 2119 |
+
**Result.** 6: 3 active nuclei, 1 edge-on disc, and CGCG 105-099 and UGC 12633, quiescent by their ultraviolet-optical rates and forming 10-15 solar masses a year once the infrared is counted; the quiescent galaxies' 22 um heat per mass runs 0.035 solar at the median and 0.55 at the 99th percentile (`hecate_warm_quiet`)
|
| 2120 |
|
| 2121 |
## Stars that dimmed since Hipparcos
|
| 2122 |
|
|
|
|
| 3253 |
**Runs.** none in the store
|
| 3254 |
|
| 3255 |
**Result.** Gaussians of the star's Fe I width (sigma 0.89 A) fixed at the Tc I resonance lines 4238.19, 4262.27 and 4297.06 A in the star's frame (-15.4 km/s from 15 Fe I lines): EW +2.0 +- 4.2, -1.3 +- 4.2 and -4.5 +- 4.5 mA against random places at robust sd 8.0 mA, 3-sigma 22.9 mA per line, the strength of a ground-term Fe I line of log gf -1.57 on the star's own curve of growth: N(Tc)/N(Fe) below about 0.03, partition functions and ionisation taken as equal; FEROS and UVES carry order-merging ripples there (`vma2_technetium`, not recorded)
|
| 3256 |
+
|
| 3257 |
+
## X-ray sources that went out
|
| 3258 |
+
|
| 3259 |
+
**Data.** 2RXS (ROSAT All-Sky Survey, 1990-1991): 13,869 point sources at existence likelihood 10 or more and 0.05 ct/s or brighter, ten times eRASS1's limit, at Galactic longitude 181-359 deg, against the eRASS1 main catalogue (2019-2020) within 120 arcsec; SIMBAD within 90 arcsec, Gaia DR3 within 20 arcsec, AllWISE colours
|
| 3260 |
+
|
| 3261 |
+
**Runs.** `rosat_erass1_gone`: 13,869 sources, 532 per-target rows, 532 vetted
|
| 3262 |
+
|
| 3263 |
+
**Result.** 532 gone, all explained: 254 pieces of extended emission (galaxy clusters, SN 1006, three or more missing detections within half a degree), 161 variable nuclei, X-ray binaries and cataclysmic variables, 64 stars caught in a flare, 37 beside sources of 10 ct/s such as Sco X-1, 1 ROSAT variable, and 15 at likelihood 10-17, where 22 per cent of the sample lies and all 15 do (p 1.5e-10), the catalogue's spurious tail (`rosat_erass1_gone`)
|
| 3264 |
+
|
| 3265 |
+
## Heat without cosmic rays
|
| 3266 |
+
|
| 3267 |
+
**Data.** HECATE: 820 galaxies within 200 Mpc north of -40 deg with IRAS 60 and 100 um fluxes bright enough for NVSS to reach q 3.3; NVSS components summed within each galaxy's D25 semi-major axis (45 arcsec to 3 arcmin); q = log of far-infrared over 1.4 GHz flux, 2.34 +- 0.26 in nature (Yun et al. 2001)
|
| 3268 |
+
|
| 3269 |
+
**Runs.** `fir_radio_quiet`: 820 galaxies, 11 per-target rows, 11 vetted
|
| 3270 |
+
|
| 3271 |
+
**Result.** q median 2.34, scatter 0.17 over the 814 detected; 11 above 3.3, none unexplained: with NED's 1.4 GHz flux integrated over the galaxy's map M31, M33, M101 and IC 356 return to q 2.2-2.7 (IC 356's 30 mJy from Condon, Cotton and Broderick 2002, where NVSS's component list holds nothing, its cold dust at a 100/60 um ratio of 6.4 putting it where the coldest galaxies run, median q 2.65), 4 more discs are wider than the radio sum covers (NGC 300, NGC 247, NGC 6822, NGC 4753), 1 lies in the Galactic plane's cirrus, NGC 1317 has an active nucleus and NGC 1377 is the radio-deficient nascent starburst of Roussel et al. (2003) (`fir_radio_quiet`)
|
| 3272 |
+
|
| 3273 |
+
## Quiet but spotted
|
| 3274 |
+
|
| 3275 |
+
**Data.** McQuillan et al. (2014) Kepler rotation periods and spot amplitudes: 104 dwarfs below 4000 K spinning faster than 10 d with amplitudes above their peers' median and a Gaia DR3 match, against the Kepler flare stars of Yang and Liu (2019)
|
| 3276 |
+
|
| 3277 |
+
**Runs.** `kepler_quiet_spotted`: 104 stars, 1 per-target row, 1 vetted
|
| 3278 |
+
|
| 3279 |
+
**Result.** 103 flare; the one quiet star is a binary at RUWE above 1.4, against 1.0 quiet star expected from the brightness bins' quiet shares; none unexplained (`kepler_quiet_spotted`)
|
coverage.db
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:36338eb3e6cdf3a9c0b100540ba5357a9e4ba5d1a21a5ec90bc38e853ec716bc
|
| 3 |
+
size 110686208
|
setitools/composition.py
CHANGED
|
@@ -3387,6 +3387,12 @@ def giants_residuals(spectra, vsys, whiten=True, band="optical"):
|
|
| 3387 |
master = np.nanmedian(F[~ins], axis=0)
|
| 3388 |
with np.errstate(all="ignore"):
|
| 3389 |
R, ER = F / master, E / master
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3390 |
x = (np.arange(len(g)) - len(g) / 2.0) / len(g)
|
| 3391 |
for i in range(len(R)):
|
| 3392 |
good = np.isfinite(R[i])
|
|
@@ -3427,7 +3433,8 @@ def giants_ccf(R, T, sd=None, vmax=300):
|
|
| 3427 |
dev = "cuda" if torch.cuda.is_available() else "cpu"
|
| 3428 |
n = R.shape[1]
|
| 3429 |
w = 1.0 / (sd if sd is not None else np.ones(n))
|
| 3430 |
-
|
|
|
|
| 3431 |
Wt = torch.as_tensor(np.where(np.isfinite(R).all(0), w, 0.0), dtype=torch.float32, device=dev)
|
| 3432 |
Tt = torch.as_tensor(T, dtype=torch.float32, device=dev)
|
| 3433 |
out = torch.zeros((R.shape[0], 2 * vmax + 1), device=dev)
|
|
@@ -3446,7 +3453,7 @@ def giants_ccf_fft(R, T, sd=None, vmax=300):
|
|
| 3446 |
n = R.shape[1]
|
| 3447 |
w = 1.0 / (sd if sd is not None else np.ones(n))
|
| 3448 |
Wt = np.where(np.isfinite(R).all(0), w, 0.0)
|
| 3449 |
-
X = np.
|
| 3450 |
Tt = np.asarray(T, float)
|
| 3451 |
m = 1 << int(np.ceil(np.log2(2 * n)))
|
| 3452 |
ft = np.conj(np.fft.rfft(Tt, m))
|
|
@@ -3813,6 +3820,12 @@ def companions_residuals(spectra, vsys, band, align=True, info=None):
|
|
| 3813 |
info["vstar"] = np.array([(meta["rv"] if meta.get("rv") is not None else vsys) + (dv if mv else 0.0) for (_, _, _, meta), dv, mv in zip(spectra, shifts, moved)])
|
| 3814 |
with np.errstate(all="ignore"):
|
| 3815 |
R = F / master
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3816 |
x = (np.arange(len(g)) - len(g) / 2.0) / len(g)
|
| 3817 |
for i in range(len(R)):
|
| 3818 |
good = np.isfinite(R[i])
|
|
@@ -4253,7 +4266,7 @@ binaries_DOC = r"""Companions of single-lined binaries along their known orbits:
|
|
| 4253 |
python -I seti.py composition binaries template NAME [--inst HARPS] [--out FILE.npy] a primary's line depths from its own spectra at its catalogue orbit's velocities
|
| 4254 |
python -I seti.py composition binaries template --spectra DIR --object NAME [NAME ...] --out FILE.npy a star's line depths from its spectra in DIR in its own frame
|
| 4255 |
python -I seti.py composition binaries build NAME [NAME ...] [--inst HARPS] [--min-snr 10] [--per-star 300] [--keep] [--template FILE.npy] [--variant V] [--band LO HI]
|
| 4256 |
-
[--inject RATIO --inject-k2 KMS [--inject-shift 0.25] [--inject-template FILE.npy]] each binary's rows: ROOT/rows or ROOT/rows_V
|
| 4257 |
python -I seti.py composition binaries search [NAME ...] [--inst HARPS] [--dv 1.0] the summit over K2 at a fixed systemic offset: ROOT/results
|
| 4258 |
python -I seti.py composition binaries calibrate [NAME ...] [--inst HARPS] [--draws 10000] [--window 5] the summits' false-alarm probabilities: ROOT/calibrate
|
| 4259 |
python -I seti.py composition binaries calibrate --aggregate [--inst HARPS] the survey's binaries taken together: ROOT/calibrate/survey_<inst>.json
|
|
@@ -4479,8 +4492,8 @@ def binaries_planck(w, t2, t1):
|
|
| 4479 |
|
| 4480 |
|
| 4481 |
def binaries_build(names, inst="HARPS", min_snr=10.0, per_star=300, streams=4, rv_template=None, template=None, keep=False, variant=None, band=None,
|
| 4482 |
-
inject=0.0, inject_k2=None, inject_shift=0.25, inject_dv=1.0, inject_template=None, teff1=6000.0, teff2=3400.0):
|
| 4483 |
-
"""Each named binary's rows: its spectra's velocities measured against RV_TEMPLATE and the orbit fitted to them, each spectrum put in the primary's frame at its own velocity, the residuals cross-correlated with the M-dwarf TEMPLATE (zero outside BAND where given) and the star's pattern taken out, kept as ROOT/rows/<tag>.npz, or ROOT/rows_<VARIANT>, with a note; INJECT lays the lines of INJECT_TEMPLATE (the M-dwarf template unless given) into every spectrum at that V-band flux ratio, scaled as a TEFF2 black body against a TEFF1 one, along the orbit moved by INJECT_SHIFT of a period at INJECT_K2 and offset INJECT_DV."""
|
| 4484 |
rv_template = rv_template or os.path.join(binaries_ROOT, "templates", "rv.npy")
|
| 4485 |
template = template or os.path.join(binaries_ROOT, "templates", "mdwarf.npy")
|
| 4486 |
Trv, T = np.load(rv_template), np.load(template)
|
|
@@ -4497,8 +4510,12 @@ def binaries_build(names, inst="HARPS", min_snr=10.0, per_star=300, streams=4, r
|
|
| 4497 |
print("%s: %d spectra loaded of %d listed; too few" % (target["name"], len(spectra), listed), flush=True)
|
| 4498 |
continue
|
| 4499 |
t = np.array([s[3]["mjd"] for s in spectra])
|
| 4500 |
-
|
| 4501 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4502 |
for s, x in zip(spectra, v):
|
| 4503 |
s[3]["rv"] = float(x)
|
| 4504 |
if inject:
|
|
@@ -4508,7 +4525,9 @@ def binaries_build(names, inst="HARPS", min_snr=10.0, per_star=300, streams=4, r
|
|
| 4508 |
spectra = [(wl, fl * (1.0 - inject * scale(wl) * np.interp(wl, g * (1.0 + x / 299792.458), Ti, left=0.0, right=0.0)), er, meta)
|
| 4509 |
for (wl, fl, er, meta), x in zip(spectra, v2)]
|
| 4510 |
info = {}
|
| 4511 |
-
R, sd, _ = companions_residuals(spectra, gamma, giants_band(inst), info=info)
|
|
|
|
|
|
|
| 4512 |
ccf = companions_unpattern(giants_ccf(R, Tc, sd))
|
| 4513 |
tag = binaries_tag(target)
|
| 4514 |
np.savez_compressed(os.path.join(folder, tag + ".npz"), ccf=ccf.astype(np.float32), mjd=t, berv=np.array([s[3]["berv"] for s in spectra], float),
|
|
@@ -4920,6 +4939,7 @@ def binaries_cli():
|
|
| 4920 |
p.add_argument("--dv-fixed", type=float, default=1.0)
|
| 4921 |
p.add_argument("--components", type=int, default=None)
|
| 4922 |
p.add_argument("--shift", type=float, default=0.0, help="measure: the track moved by this fraction of a period")
|
|
|
|
| 4923 |
a = p.parse_args()
|
| 4924 |
if a.mode == "plan":
|
| 4925 |
binaries_plan(a.min)
|
|
@@ -4927,7 +4947,7 @@ def binaries_cli():
|
|
| 4927 |
binaries_template(a.names[0] if a.names else None, a.inst, a.out, a.spectra, a.object)
|
| 4928 |
elif a.mode == "build":
|
| 4929 |
binaries_build(a.names, a.inst, a.min_snr, a.per_star, a.streams, a.rv_template, a.template, a.keep, a.variant, a.band, a.inject, a.inject_k2, a.inject_shift,
|
| 4930 |
-
a.inject_dv, a.inject_template)
|
| 4931 |
elif a.mode == "search":
|
| 4932 |
binaries_search(a.names, a.inst, a.dv, a.draws or 300, a.detect)
|
| 4933 |
elif a.mode == "calibrate":
|
|
|
|
| 3387 |
master = np.nanmedian(F[~ins], axis=0)
|
| 3388 |
with np.errstate(all="ignore"):
|
| 3389 |
R, ER = F / master, E / master
|
| 3390 |
+
if band == "nir":
|
| 3391 |
+
# in the near infrared the median spectrum falls toward zero in the water bands, where the ratio would swamp each row's cubic, so the
|
| 3392 |
+
# telluric bands and the samples where the median lies at 0.2 or below are set aside before the fit
|
| 3393 |
+
R[:, ~(master > 0.2)] = np.nan
|
| 3394 |
+
for lo, hi in giants_BANDS[band]["telluric"]:
|
| 3395 |
+
R[:, (g > lo) & (g < hi)] = np.nan
|
| 3396 |
x = (np.arange(len(g)) - len(g) / 2.0) / len(g)
|
| 3397 |
for i in range(len(R)):
|
| 3398 |
good = np.isfinite(R[i])
|
|
|
|
| 3433 |
dev = "cuda" if torch.cuda.is_available() else "cpu"
|
| 3434 |
n = R.shape[1]
|
| 3435 |
w = 1.0 / (sd if sd is not None else np.ones(n))
|
| 3436 |
+
# a non-finite sample, infinite as well as missing, counts as zero, since an infinite one would meet its zero weight as a NaN
|
| 3437 |
+
Rt = torch.as_tensor(np.where(np.isfinite(R), R * w[None, :], 0.0), dtype=torch.float32, device=dev)
|
| 3438 |
Wt = torch.as_tensor(np.where(np.isfinite(R).all(0), w, 0.0), dtype=torch.float32, device=dev)
|
| 3439 |
Tt = torch.as_tensor(T, dtype=torch.float32, device=dev)
|
| 3440 |
out = torch.zeros((R.shape[0], 2 * vmax + 1), device=dev)
|
|
|
|
| 3453 |
n = R.shape[1]
|
| 3454 |
w = 1.0 / (sd if sd is not None else np.ones(n))
|
| 3455 |
Wt = np.where(np.isfinite(R).all(0), w, 0.0)
|
| 3456 |
+
X = np.where(np.isfinite(R), R * w[None, :], 0.0) * Wt[None, :]
|
| 3457 |
Tt = np.asarray(T, float)
|
| 3458 |
m = 1 << int(np.ceil(np.log2(2 * n)))
|
| 3459 |
ft = np.conj(np.fft.rfft(Tt, m))
|
|
|
|
| 3820 |
info["vstar"] = np.array([(meta["rv"] if meta.get("rv") is not None else vsys) + (dv if mv else 0.0) for (_, _, _, meta), dv, mv in zip(spectra, shifts, moved)])
|
| 3821 |
with np.errstate(all="ignore"):
|
| 3822 |
R = F / master
|
| 3823 |
+
if band == "nir":
|
| 3824 |
+
# in the near infrared the median spectrum falls toward zero in the water bands, where the ratio would swamp each row's cubic, so the
|
| 3825 |
+
# telluric bands and the samples where the median lies at 0.2 or below are set aside before the fit
|
| 3826 |
+
R[:, ~(master > 0.2)] = np.nan
|
| 3827 |
+
for lo, hi in giants_BANDS[band]["telluric"]:
|
| 3828 |
+
R[:, (g > lo) & (g < hi)] = np.nan
|
| 3829 |
x = (np.arange(len(g)) - len(g) / 2.0) / len(g)
|
| 3830 |
for i in range(len(R)):
|
| 3831 |
good = np.isfinite(R[i])
|
|
|
|
| 4266 |
python -I seti.py composition binaries template NAME [--inst HARPS] [--out FILE.npy] a primary's line depths from its own spectra at its catalogue orbit's velocities
|
| 4267 |
python -I seti.py composition binaries template --spectra DIR --object NAME [NAME ...] --out FILE.npy a star's line depths from its spectra in DIR in its own frame
|
| 4268 |
python -I seti.py composition binaries build NAME [NAME ...] [--inst HARPS] [--min-snr 10] [--per-star 300] [--keep] [--template FILE.npy] [--variant V] [--band LO HI]
|
| 4269 |
+
[--inject RATIO --inject-k2 KMS [--inject-shift 0.25] [--inject-template FILE.npy]] [--orbit-frames] each binary's rows: ROOT/rows or ROOT/rows_V
|
| 4270 |
python -I seti.py composition binaries search [NAME ...] [--inst HARPS] [--dv 1.0] the summit over K2 at a fixed systemic offset: ROOT/results
|
| 4271 |
python -I seti.py composition binaries calibrate [NAME ...] [--inst HARPS] [--draws 10000] [--window 5] the summits' false-alarm probabilities: ROOT/calibrate
|
| 4272 |
python -I seti.py composition binaries calibrate --aggregate [--inst HARPS] the survey's binaries taken together: ROOT/calibrate/survey_<inst>.json
|
|
|
|
| 4492 |
|
| 4493 |
|
| 4494 |
def binaries_build(names, inst="HARPS", min_snr=10.0, per_star=300, streams=4, rv_template=None, template=None, keep=False, variant=None, band=None,
|
| 4495 |
+
inject=0.0, inject_k2=None, inject_shift=0.25, inject_dv=1.0, inject_template=None, teff1=6000.0, teff2=3400.0, orbit_frames=False):
|
| 4496 |
+
"""Each named binary's rows: its spectra's velocities measured against RV_TEMPLATE and the orbit fitted to them, each spectrum put in the primary's frame at its own velocity, the residuals cross-correlated with the M-dwarf TEMPLATE (zero outside BAND where given) and the star's pattern taken out, kept as ROOT/rows/<tag>.npz, or ROOT/rows_<VARIANT>, with a note; with ORBIT_FRAMES each spectrum is put at the plan orbit's velocity instead and left unaligned, as in the near infrared, where a solar-type primary's own lines are too few to place it; INJECT lays the lines of INJECT_TEMPLATE (the M-dwarf template unless given) into every spectrum at that V-band flux ratio, scaled as a TEFF2 black body against a TEFF1 one, along the orbit moved by INJECT_SHIFT of a period at INJECT_K2 and offset INJECT_DV."""
|
| 4497 |
rv_template = rv_template or os.path.join(binaries_ROOT, "templates", "rv.npy")
|
| 4498 |
template = template or os.path.join(binaries_ROOT, "templates", "mdwarf.npy")
|
| 4499 |
Trv, T = np.load(rv_template), np.load(template)
|
|
|
|
| 4510 |
print("%s: %d spectra loaded of %d listed; too few" % (target["name"], len(spectra), listed), flush=True)
|
| 4511 |
continue
|
| 4512 |
t = np.array([s[3]["mjd"] for s in spectra])
|
| 4513 |
+
if orbit_frames:
|
| 4514 |
+
P, tp, e, w, k1, gamma = binaries_orbit(target)
|
| 4515 |
+
v, rms = gamma + k1 * binaries_radial(t, P, tp, e, w), 0.0
|
| 4516 |
+
else:
|
| 4517 |
+
v = binaries_velocities(spectra, Trv, band=giants_band(inst))
|
| 4518 |
+
P, tp, e, w, k1, gamma, rms = binaries_refit(t, v, *binaries_orbit(target)[:5])
|
| 4519 |
for s, x in zip(spectra, v):
|
| 4520 |
s[3]["rv"] = float(x)
|
| 4521 |
if inject:
|
|
|
|
| 4525 |
spectra = [(wl, fl * (1.0 - inject * scale(wl) * np.interp(wl, g * (1.0 + x / 299792.458), Ti, left=0.0, right=0.0)), er, meta)
|
| 4526 |
for (wl, fl, er, meta), x in zip(spectra, v2)]
|
| 4527 |
info = {}
|
| 4528 |
+
R, sd, _ = companions_residuals(spectra, gamma, giants_band(inst), align=not orbit_frames, info=info)
|
| 4529 |
+
if "vstar" not in info:
|
| 4530 |
+
info["vstar"] = np.asarray(v, float)
|
| 4531 |
ccf = companions_unpattern(giants_ccf(R, Tc, sd))
|
| 4532 |
tag = binaries_tag(target)
|
| 4533 |
np.savez_compressed(os.path.join(folder, tag + ".npz"), ccf=ccf.astype(np.float32), mjd=t, berv=np.array([s[3]["berv"] for s in spectra], float),
|
|
|
|
| 4939 |
p.add_argument("--dv-fixed", type=float, default=1.0)
|
| 4940 |
p.add_argument("--components", type=int, default=None)
|
| 4941 |
p.add_argument("--shift", type=float, default=0.0, help="measure: the track moved by this fraction of a period")
|
| 4942 |
+
p.add_argument("--orbit-frames", action="store_true", help="build: each spectrum at the plan orbit's velocity, unaligned, as for the near infrared")
|
| 4943 |
a = p.parse_args()
|
| 4944 |
if a.mode == "plan":
|
| 4945 |
binaries_plan(a.min)
|
|
|
|
| 4947 |
binaries_template(a.names[0] if a.names else None, a.inst, a.out, a.spectra, a.object)
|
| 4948 |
elif a.mode == "build":
|
| 4949 |
binaries_build(a.names, a.inst, a.min_snr, a.per_star, a.streams, a.rv_template, a.template, a.keep, a.variant, a.band, a.inject, a.inject_k2, a.inject_shift,
|
| 4950 |
+
a.inject_dv, a.inject_template, orbit_frames=a.orbit_frames)
|
| 4951 |
elif a.mode == "search":
|
| 4952 |
binaries_search(a.names, a.inst, a.dv, a.draws or 300, a.detect)
|
| 4953 |
elif a.mode == "calibrate":
|
setitools/flashes.py
CHANGED
|
@@ -3807,7 +3807,8 @@ def sndeficit_main(record=False, d_max_mpc=20.0, sn_per_msun=0.01, year_min=1980
|
|
| 3807 |
tir, uv, ltir = core.num(g["logSFRTIR"]), core.num(g["logSFRGSW"]), core.num(g["logLTIR"])
|
| 3808 |
# a luminous infrared galaxy hides its supernovae in dust; an active nucleus lends its infrared to the rate
|
| 3809 |
dusty = (tir is not None and uv is not None and tir - uv > math.log10(dust_ratio)) or (ltir is not None and ltir > ltir_max)
|
| 3810 |
-
|
|
|
|
| 3811 |
out.append(dict(pgc=g["PGC"], name=(g["NED"] or "").strip(), d=float(g["D"]), sfr=round(sfr, 2), expected=round(exp, 1), seen=n, p=p, dusty=dusty, agn=agn,
|
| 3812 |
vet="dust" if dusty else "background-galaxy" if agn else None))
|
| 3813 |
short = sorted([o for o in out if o["p"] < p_max], key=lambda o: o["p"])
|
|
@@ -4907,6 +4908,74 @@ def chirps_main(record=False, rate_max=60.0, rate_min=1.0, p_max=1e-12, tmag_max
|
|
| 4907 |
print("recorded")
|
| 4908 |
|
| 4909 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4910 |
hipflash_DOC = r"""Single-transit brightenings in Hipparcos epoch photometry: stars within 100 pc with a Gaia DR3 best neighbour and a robust scatter below 0.02 mag, a clean transit brighter than the star's median by 0.3 mag and five robust deviations, against the transits as much fainter, the mirror; each read for a catalogue-wide event (two or more other stars within half an hour, the satellite's own), a recurrence on the same star, Hipparcos's variability type, SIMBAD's type and RUWE, and for the pass partner 20.6 minutes away, which sees the same star through the other field of view and shares a real flash.
|
| 4911 |
|
| 4912 |
python -I seti.py flashes hipflash [record] [--mag 0.3] [--sig 5] [--quiet 0.02] [--pair-days 0.02] [--plx-min 10]"""
|
|
@@ -4985,6 +5054,7 @@ def hipflash_main(record=False, mag=0.3, sig=5.0, quiet=0.02, pair_days=0.02, pl
|
|
| 4985 |
|
| 4986 |
APPROACHES = {
|
| 4987 |
"hipflash": (lambda: core.run_cli(hipflash_main), hipflash_DOC),
|
|
|
|
| 4988 |
"chirps": (lambda: core.run_cli(chirps_main), chirps_DOC),
|
| 4989 |
"tones": (lambda: core.run_cli(tones_main), tones_DOC),
|
| 4990 |
"flareecho": (lambda: core.run_cli(flareecho_main), flareecho_DOC),
|
|
|
|
| 3807 |
tir, uv, ltir = core.num(g["logSFRTIR"]), core.num(g["logSFRGSW"]), core.num(g["logLTIR"])
|
| 3808 |
# a luminous infrared galaxy hides its supernovae in dust; an active nucleus lends its infrared to the rate
|
| 3809 |
dusty = (tir is not None and uv is not None and tir - uv > math.log10(dust_ratio)) or (ltir is not None and ltir > ltir_max)
|
| 3810 |
+
# HECATE writes its two active-nucleus flags as Y, N or ?, and Nuclear as -1 where no emission-line class exists
|
| 3811 |
+
agn = "Y" in (str(g["AGNs17"]).strip(), str(g["AGNh"]).strip())
|
| 3812 |
out.append(dict(pgc=g["PGC"], name=(g["NED"] or "").strip(), d=float(g["D"]), sfr=round(sfr, 2), expected=round(exp, 1), seen=n, p=p, dusty=dusty, agn=agn,
|
| 3813 |
vet="dust" if dusty else "background-galaxy" if agn else None))
|
| 3814 |
short = sorted([o for o in out if o["p"] < p_max], key=lambda o: o["p"])
|
|
|
|
| 4908 |
print("recorded")
|
| 4909 |
|
| 4910 |
|
| 4911 |
+
quietspots_DOC = r"""Quiet but spotted: a fast-spinning, heavily spotted M dwarf runs a saturated dynamo, and its peers flare, so one that never flares while its spots show the dynamo at work is a star whose flaring something suppresses; McQuillan et al. (2014) Kepler rotation periods and spot amplitudes of the dwarfs below 4000 K spinning faster than 10 days with an amplitude above the median of their peers, against the Kepler stars Yang and Liu (2019) found flaring, matched to Gaia DR3 for brightness, colour, distance and RUWE; a quiet star is one in a brightness bin where most of its peers flare, the expected count of quiet stars is the sum of each bin's quiet share, and each quiet star is read for a Gaia neighbour within 4 arcsec and 3 mag (spots or light from another star), RUWE above 1.4 (a binary whose companion carries the spots), and a Gaia colour or absolute magnitude that is not an M dwarf's.
|
| 4912 |
+
|
| 4913 |
+
python -I seti.py flashes quietspots [record] [--teff-max 4000] [--prot-max 10] [--frac-min 0.7] [--g-step 1] [--beam-arcsec 4]"""
|
| 4914 |
+
|
| 4915 |
+
|
| 4916 |
+
def quietspots_main(record=False, teff_max=4000.0, prot_max=10.0, frac_min=0.7, g_step=1.0, beam_arcsec=4.0):
|
| 4917 |
+
rot = core.tap("vizier", 'SELECT KIC, Teff, "log(g)", Prot, Rper, _RA, _DE FROM "J/ApJS/211/24/table1" WHERE Teff < %g AND Prot < %g' % (teff_max, prot_max), timeout=600)
|
| 4918 |
+
flaring = {str(r["KIC"]).strip(): num(r["Nf"]) for r in core.tap("vizier", 'SELECT KIC, Nf FROM "J/ApJS/241/29/table1"', timeout=600)}
|
| 4919 |
+
st = [dict(source_id=str(r["KIC"]).strip(), ra=float(r["_RA"]), dec=float(r["_DE"]), teff=num(r["Teff"]), logg=num(r["log(g)"]), prot=num(r["Prot"]), amp=num(r["Rper"]))
|
| 4920 |
+
for r in rot if num(r["log(g)"]) and num(r["log(g)"]) > 4.0 and num(r["Rper"])]
|
| 4921 |
+
med = float(np.median([s["amp"] for s in st]))
|
| 4922 |
+
st = [s for s in st if s["amp"] >= med]
|
| 4923 |
+
gaia = {}
|
| 4924 |
+
for m in core.xmatch(st, "I/355/gaiadr3", 2.0):
|
| 4925 |
+
if m["source_id"] not in gaia or float(m["angDist"]) < float(gaia[m["source_id"]]["angDist"]):
|
| 4926 |
+
gaia[m["source_id"]] = m
|
| 4927 |
+
st = [s for s in st if s["source_id"] in gaia and num(gaia[s["source_id"]].get("Gmag")) is not None]
|
| 4928 |
+
for s in st:
|
| 4929 |
+
g = gaia[s["source_id"]]
|
| 4930 |
+
s["g"], s["bprp"], s["plx"], s["ruwe"] = num(g["Gmag"]), num(g.get("BP-RP")), num(g.get("Plx")), num(g.get("RUWE"))
|
| 4931 |
+
s["nf"] = flaring.get(s["source_id"])
|
| 4932 |
+
s["bin"] = int(math.floor(s["g"] / g_step))
|
| 4933 |
+
bins = {}
|
| 4934 |
+
for s in st:
|
| 4935 |
+
bins.setdefault(s["bin"], []).append(s)
|
| 4936 |
+
share = {b: sum(x["nf"] is not None for x in v) / len(v) for b, v in bins.items()}
|
| 4937 |
+
quiet = [s for s in st if s["nf"] is None and share[s["bin"]] >= frac_min]
|
| 4938 |
+
expected = sum(1 - share[b] for b, v in bins.items() if share[b] >= frac_min for _ in v)
|
| 4939 |
+
near = {}
|
| 4940 |
+
for k in range(0, len(quiet), 50):
|
| 4941 |
+
chunk = quiet[k:k + 50]
|
| 4942 |
+
where = " OR ".join("1 = CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', %.6f, %.6f, %.6f))" % (s["ra"], s["dec"], beam_arcsec / 3600) for s in chunk)
|
| 4943 |
+
for r in core.tap("gaia", "SELECT source_id, ra, dec, phot_g_mean_mag FROM gaiadr3.gaia_source WHERE " + where):
|
| 4944 |
+
for s in chunk:
|
| 4945 |
+
if core.sep_arcsec(float(r["ra"]), float(r["dec"]), s["ra"], s["dec"]) < beam_arcsec and num(r["phot_g_mean_mag"]) is not None \
|
| 4946 |
+
and abs(num(r["phot_g_mean_mag"]) - s["g"]) > 0.01 and num(r["phot_g_mean_mag"]) < s["g"] + 3:
|
| 4947 |
+
near.setdefault(s["source_id"], []).append(round(num(r["phot_g_mean_mag"]), 1))
|
| 4948 |
+
for s in quiet:
|
| 4949 |
+
mg = s["g"] + 5 * math.log10(s["plx"] / 100) if s["plx"] and s["plx"] > 0 else None
|
| 4950 |
+
s["mg"] = mg
|
| 4951 |
+
s["near"] = near.get(s["source_id"], [])
|
| 4952 |
+
s["vet"] = ("blend" if s["near"] else "binary" if s["ruwe"] and s["ruwe"] > 1.4 else
|
| 4953 |
+
"misidentified" if (s["bprp"] is not None and s["bprp"] < 1.5) or mg is None or mg < 5.0 else None)
|
| 4954 |
+
left = [s for s in quiet if s["vet"] is None]
|
| 4955 |
+
print("%d Kepler dwarfs below %g K spinning faster than %g d with spot amplitudes above their median (%.0f), %d with Gaia; flaring in Yang and Liu (2019): %d; "
|
| 4956 |
+
"quiet in brightness bins where %.0f per cent or more flare: %d against %.1f expected from those bins' quiet shares; %d blends, %d binaries, %d not M dwarfs; %d left" % (
|
| 4957 |
+
len(rot), teff_max, prot_max, med, len(st), sum(s["nf"] is not None for s in st), 100 * frac_min, len(quiet), expected,
|
| 4958 |
+
sum(s["vet"] == "blend" for s in quiet), sum(s["vet"] == "binary" for s in quiet), sum(s["vet"] == "misidentified" for s in quiet), len(left)))
|
| 4959 |
+
for b in sorted(bins):
|
| 4960 |
+
print(" G %.0f-%.0f: %d stars, %.0f per cent flaring" % (b * g_step, (b + 1) * g_step, len(bins[b]), 100 * share[b]))
|
| 4961 |
+
for s in left:
|
| 4962 |
+
print(" KIC %s: G %.2f, BP-RP %s, M_G %s, Teff %.0f, P %.2f d, amplitude %.0f, RUWE %s" % (
|
| 4963 |
+
s["source_id"], s["g"], "%.2f" % s["bprp"] if s["bprp"] is not None else "-", "%.2f" % s["mg"] if s["mg"] is not None else "-", s["teff"], s["prot"], s["amp"], s["ruwe"]))
|
| 4964 |
+
if record:
|
| 4965 |
+
p_left = 1.0 - sum(math.exp(-expected) * expected ** i / math.factorial(i) for i in range(len(quiet)))
|
| 4966 |
+
core.record_run(
|
| 4967 |
+
"kepler_quiet_spotted", "Quiet but spotted", "McQuillan et al. (2014) Kepler rotation (J/ApJS/211/24); Yang and Liu (2019) Kepler flares (J/ApJS/241/29); Gaia DR3 by CDS XMatch",
|
| 4968 |
+
"%d Kepler dwarfs below %g K faster than %g d with spot amplitudes above their median" % (len(st), teff_max, prot_max), os.path.abspath(__file__), "quietspots",
|
| 4969 |
+
len(st), "stars", dict(teff_max=teff_max, prot_max=prot_max, frac_min=frac_min, g_step=g_step, beam_arcsec=beam_arcsec),
|
| 4970 |
+
dict(flaring=sum(s["nf"] is not None for s in st), quiet=len(quiet), expected=expected, p=p_left),
|
| 4971 |
+
"a spotted fast rotator absent from the flare list in a brightness bin where %.0f per cent of its peers flare" % (100 * frac_min),
|
| 4972 |
+
"%d quiet against %.1f expected (p %.2f): %d blends, %d binaries, %d not M dwarfs; %d left" % (len(quiet), expected, p_left, sum(s["vet"] == "blend" for s in quiet),
|
| 4973 |
+
sum(s["vet"] == "binary" for s in quiet), sum(s["vet"] == "misidentified" for s in quiet), len(left)),
|
| 4974 |
+
[dict(target="kic:%s" % s["source_id"], stat=s["prot"], unit="rotation period, d, no flare", vet=s["vet"] or ("chance-rate" if p_left > 0.01 else None),
|
| 4975 |
+
note="G %.2f, BP-RP %s, Teff %.0f, amplitude %.0f, RUWE %s, neighbours %s" % (s["g"], s["bprp"], s["teff"], s["amp"], s["ruwe"], s["near"] or "none")) for s in quiet])
|
| 4976 |
+
print("recorded")
|
| 4977 |
+
|
| 4978 |
+
|
| 4979 |
hipflash_DOC = r"""Single-transit brightenings in Hipparcos epoch photometry: stars within 100 pc with a Gaia DR3 best neighbour and a robust scatter below 0.02 mag, a clean transit brighter than the star's median by 0.3 mag and five robust deviations, against the transits as much fainter, the mirror; each read for a catalogue-wide event (two or more other stars within half an hour, the satellite's own), a recurrence on the same star, Hipparcos's variability type, SIMBAD's type and RUWE, and for the pass partner 20.6 minutes away, which sees the same star through the other field of view and shares a real flash.
|
| 4980 |
|
| 4981 |
python -I seti.py flashes hipflash [record] [--mag 0.3] [--sig 5] [--quiet 0.02] [--pair-days 0.02] [--plx-min 10]"""
|
|
|
|
| 5054 |
|
| 5055 |
APPROACHES = {
|
| 5056 |
"hipflash": (lambda: core.run_cli(hipflash_main), hipflash_DOC),
|
| 5057 |
+
"quietspots": (lambda: core.run_cli(quietspots_main), quietspots_DOC),
|
| 5058 |
"chirps": (lambda: core.run_cli(chirps_main), chirps_DOC),
|
| 5059 |
"tones": (lambda: core.run_cli(tones_main), tones_DOC),
|
| 5060 |
"flareecho": (lambda: core.run_cli(flareecho_main), flareecho_DOC),
|
setitools/highenergy.py
CHANGED
|
@@ -3363,7 +3363,109 @@ def gasunder_main(record=False, l_deg=312.07, b_deg=0.0, radius_deg=2.0):
|
|
| 3363 |
print("recorded")
|
| 3364 |
|
| 3365 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3366 |
APPROACHES = {
|
|
|
|
| 3367 |
"gasunder": (lambda: core.run_cli(gasunder_main), gasunder_DOC),
|
| 3368 |
"hgpsoverlap": (lambda: core.run_cli(hgpsoverlap_main), hgpsoverlap_DOC),
|
| 3369 |
"unasclass": (lambda: core.run_cli(unasclass_main), unasclass_DOC),
|
|
|
|
| 3363 |
print("recorded")
|
| 3364 |
|
| 3365 |
|
| 3366 |
+
rosatgone_DOC = r"""X-ray sources that went out: the 2RXS catalogue of the ROSAT All-Sky Survey (1990-1991) in the half of the sky eROSITA-DE's first survey covers (Galactic longitude 180-360 deg), point sources at existence likelihood 10 or more and 0.05 ct/s or brighter, ten times eRASS1's limit, a degree clear of the half's edges, against the eRASS1 main catalogue (2019-2020) within 120 arcsec, the reach of a faint 2RXS position; eRASS1 covers its half whole, so a source with no counterpart faded by an order of magnitude in thirty years; each read for SIMBAD's type within 90 arcsec (flare stars caught in a flare, galaxy clusters whose gas eRASS1 catalogues as one extended source, variable AGN, X-ray binaries and cataclysmic variables in quiescence, transients), a Gaia DR3 star brighter than G 13 or within 500 pc within 20 arcsec, WISE AGN colours (W1-W2 above 0.8), a source of 10 ct/s within half a degree, three or more missing detections within half a degree (one extended source cut up), extent, and the ROSAT light curve's own variability; what is left is the catalogue's spurious tail when every such source lies below likelihood 20, against the share of the sample there.
|
| 3367 |
+
|
| 3368 |
+
python -I seti.py highenergy rosatgone [record] [--exi-min 10] [--crate-min 0.05] [--match-arcsec 120] [--edge-deg 1] [--simbad-arcsec 90] [--gaia-arcsec 20] [--bright-ct 10] [--bright-deg 0.5] [--clump-deg 0.5] [--spur-exi 20]"""
|
| 3369 |
+
|
| 3370 |
+
# SIMBAD's types as CDS XMatch writes them, long names and short codes alike
|
| 3371 |
+
ROSATGONE_CLUSTER = ("ClG", "GtowardsCl", "BrightestCG", "GroupG", "GrG", "CGG", "SCG", "C?G", "SuperClG", "SNRemnant", "SNR")
|
| 3372 |
+
ROSATGONE_VARIABLE = ("AGN", "QSO", "Seyfert", "Sy1", "Sy2", "SyG", "BLLac", "Blazar", "BLL", "Bla", "LINER", "LIN", "XrayB", "XB", "LXB", "HXB", "CataclyV", "CV", "Nova", "No*",
|
| 3373 |
+
"SN", "GRB", "TDE", "Pulsar", "Psr")
|
| 3374 |
+
|
| 3375 |
+
|
| 3376 |
+
def rosatgone_kind(t):
|
| 3377 |
+
"""A SIMBAD type read as a galaxy cluster or remnant, a star, a variable extragalactic or accreting source, or none of these."""
|
| 3378 |
+
if any(t.startswith(k) for k in ROSATGONE_CLUSTER):
|
| 3379 |
+
return "cluster"
|
| 3380 |
+
if any(k in t for k in ROSATGONE_VARIABLE):
|
| 3381 |
+
return "variable"
|
| 3382 |
+
if t.endswith("*") or t.startswith("Star") or t in ("**", "*", "Star?"):
|
| 3383 |
+
return "star"
|
| 3384 |
+
return "other" if t else None
|
| 3385 |
+
|
| 3386 |
+
|
| 3387 |
+
def rosatgone_main(record=False, exi_min=10.0, crate_min=0.05, match_arcsec=120.0, edge_deg=1.0, simbad_arcsec=90.0, gaia_arcsec=20.0, bright_ct=10.0, bright_deg=0.5, clump_deg=0.5, spur_exi=20.0):
|
| 3388 |
+
path = core.data("rosatgone", "cat2rxs.tsv")
|
| 3389 |
+
if not os.path.exists(path):
|
| 3390 |
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
| 3391 |
+
cols = "2RXS,ExiML,CRate,e_CRate,RAJ2000,DEJ2000,GLON,GLAT,Ext,FAll,Fluxp,sigExc"
|
| 3392 |
+
open(path, "wb").write(core.get("https://vizier.cds.unistra.fr/viz-bin/asu-tsv?-source=J/A%2BA/588/A103/cat2rxs&-out.max=unlimited&-out=" + cols, timeout=900))
|
| 3393 |
+
lines = [l for l in open(path, encoding="utf-8", errors="replace").read().splitlines() if l and not l.startswith("#")]
|
| 3394 |
+
head = lines[0].split("\t")
|
| 3395 |
+
rows = [dict(zip(head, l.split("\t"))) for l in lines[3:]]
|
| 3396 |
+
src = []
|
| 3397 |
+
for r in rows:
|
| 3398 |
+
ra, dec, l, exi, cr = (num(r.get(k)) for k in ("RAJ2000", "DEJ2000", "GLON", "ExiML", "CRate"))
|
| 3399 |
+
if None in (ra, dec, l, exi, cr) or not 180.0 + edge_deg <= l < 360.0 - edge_deg or exi < exi_min or cr < crate_min:
|
| 3400 |
+
continue
|
| 3401 |
+
src.append(dict(source_id=r["2RXS"].strip(), ra=ra, dec=dec, cr=cr, ecr=num(r.get("e_CRate")), exi=exi, ext=num(r.get("Ext")) or 0.0,
|
| 3402 |
+
flux=num(r.get("Fluxp")), sigexc=num(r.get("sigExc"))))
|
| 3403 |
+
near = {}
|
| 3404 |
+
for k in range(0, len(src), 20000):
|
| 3405 |
+
for m in core.xmatch(src[k:k + 20000], "J/A+A/682/A34/erass1-m", match_arcsec):
|
| 3406 |
+
d = float(m["angDist"])
|
| 3407 |
+
near[m["source_id"]] = min(near.get(m["source_id"], 1e9), d)
|
| 3408 |
+
gone = [s for s in src if near.get(s["source_id"], 1e9) > match_arcsec]
|
| 3409 |
+
covered = gone
|
| 3410 |
+
print("%d 2RXS point sources in the eRASS1 half at likelihood %g and %g ct/s or brighter; %d without an eRASS1 source within %g arcsec" % (
|
| 3411 |
+
len(src), exi_min, crate_min, len(gone), match_arcsec), flush=True)
|
| 3412 |
+
sim, gaia = {}, {}
|
| 3413 |
+
for m in core.xmatch(covered, "simbad", simbad_arcsec):
|
| 3414 |
+
if m["source_id"] not in sim or float(m["angDist"]) < sim[m["source_id"]][0]:
|
| 3415 |
+
sim[m["source_id"]] = (float(m["angDist"]), (m.get("main_id") or "").strip(), (m.get("main_type") or m.get("otype") or "").strip())
|
| 3416 |
+
for m in core.xmatch(covered, "I/355/gaiadr3", gaia_arcsec):
|
| 3417 |
+
g, plx = num(m.get("Gmag")), num(m.get("Plx"))
|
| 3418 |
+
# a bright star, or any star within 500 pc, of which M dwarfs flare by an order of magnitude
|
| 3419 |
+
if g is not None and (g < 13 or (plx or 0) > 2.0) and (m["source_id"] not in gaia or g < gaia[m["source_id"]]):
|
| 3420 |
+
gaia[m["source_id"]] = g
|
| 3421 |
+
agn = {m["source_id"] for m in core.xmatch(covered, "II/328/allwise", gaia_arcsec)
|
| 3422 |
+
if num(m.get("W1mag")) is not None and num(m.get("W2mag")) is not None and num(m["W1mag"]) - num(m["W2mag"]) > 0.8}
|
| 3423 |
+
# a source ROSAT saw at bright_ct or more spoils its surroundings; three or more missing detections within clump_deg are one extended source cut up
|
| 3424 |
+
bright = [x for x in src if x["cr"] >= bright_ct]
|
| 3425 |
+
for s in covered:
|
| 3426 |
+
s["bright"] = next((b["source_id"] for b in bright if b is not s and sep_arcsec(b["ra"], b["dec"], s["ra"], s["dec"]) < bright_deg * 3600), None)
|
| 3427 |
+
s["clump"] = sum(1 for x in covered if sep_arcsec(x["ra"], x["dec"], s["ra"], s["dec"]) < clump_deg * 3600)
|
| 3428 |
+
for s in covered:
|
| 3429 |
+
s["simbad"] = sim.get(s["source_id"])
|
| 3430 |
+
t = s["simbad"][2] if s["simbad"] else ""
|
| 3431 |
+
s["gaia_g"] = gaia.get(s["source_id"])
|
| 3432 |
+
s["vet"] = ("bright-neighbour" if s["bright"] else
|
| 3433 |
+
"diffuse-emission" if s["ext"] > 0 or s["clump"] >= 3 or rosatgone_kind(t) == "cluster" else
|
| 3434 |
+
"flare" if rosatgone_kind(t) == "star" or s["gaia_g"] is not None else
|
| 3435 |
+
"natural-type" if rosatgone_kind(t) == "variable" or s["source_id"] in agn else
|
| 3436 |
+
"variable-star" if s["sigexc"] and s["sigexc"] > 3 else
|
| 3437 |
+
"natural-type" if t else None)
|
| 3438 |
+
# the rest are spurious detections when they all sit at the catalogue's lowest likelihoods, which few of the sample do
|
| 3439 |
+
low = sum(x["exi"] < spur_exi for x in src) / max(len(src), 1)
|
| 3440 |
+
rest = [s for s in covered if s["vet"] is None]
|
| 3441 |
+
p_low = low ** sum(s["exi"] < spur_exi for s in rest) if rest else 1.0
|
| 3442 |
+
if rest and all(s["exi"] < spur_exi for s in rest) and p_low < 1e-3:
|
| 3443 |
+
for s in rest:
|
| 3444 |
+
s["vet"] = "artefact"
|
| 3445 |
+
print("%d left by the other vets, %d of them below likelihood %g, where %.0f per cent of the sample lies (p %.1e)" % (
|
| 3446 |
+
len(rest), sum(s["exi"] < spur_exi for s in rest), spur_exi, 100 * low, p_low))
|
| 3447 |
+
left = [s for s in covered if s["vet"] is None]
|
| 3448 |
+
counts = {}
|
| 3449 |
+
for s in covered:
|
| 3450 |
+
counts[s["vet"]] = counts.get(s["vet"], 0) + 1
|
| 3451 |
+
print("vets %s; %d unexplained" % (counts, len(left)))
|
| 3452 |
+
for s in sorted(left, key=lambda s: -s["cr"])[:30]:
|
| 3453 |
+
print(" 2RXS %s: %.3f +- %.3f ct/s at RA %.4f Dec %+.4f, likelihood %.0f" % (s["source_id"], s["cr"], s["ecr"] or 0, s["ra"], s["dec"], s["exi"]))
|
| 3454 |
+
if record:
|
| 3455 |
+
core.record_run(
|
| 3456 |
+
"rosat_erass1_gone", "X-ray sources that went out", "2RXS (VizieR J/A+A/588/A103) and eRASS1 main (J/A+A/682/A34/erass1-m) by CDS XMatch; SIMBAD; Gaia DR3",
|
| 3457 |
+
"%d 2RXS point sources at likelihood %g and %g ct/s or brighter at Galactic longitude 180-360 deg" % (len(src), exi_min, crate_min), os.path.abspath(__file__), "rosatgone",
|
| 3458 |
+
len(src), "sources", dict(exi_min=exi_min, crate_min=crate_min, match_arcsec=match_arcsec, edge_deg=edge_deg, simbad_arcsec=simbad_arcsec, gaia_arcsec=gaia_arcsec, bright_ct=bright_ct, bright_deg=bright_deg, clump_deg=clump_deg, spur_exi=spur_exi),
|
| 3459 |
+
dict(gone=len(gone), vets=counts), "a 2RXS source ten times eRASS1's limit with no eRASS1 source within %g arcsec" % match_arcsec,
|
| 3460 |
+
"%d of %d without an eRASS1 counterpart: %s; %d unexplained" % (len(covered), len(src), ", ".join("%d %s" % (v, k) for k, v in sorted(counts.items(), key=lambda x: -x[1]) if k), len(left)),
|
| 3461 |
+
[dict(target="2rxs:%s" % s["source_id"], stat=round(s["cr"], 3), unit="ROSAT ct/s, absent from eRASS1", vet=s["vet"],
|
| 3462 |
+
note="likelihood %.0f; SIMBAD %s; Gaia G %s" % (s["exi"], s["simbad"], "%.1f" % s["gaia_g"] if s["gaia_g"] is not None else "-"))
|
| 3463 |
+
for s in covered])
|
| 3464 |
+
print("recorded")
|
| 3465 |
+
|
| 3466 |
+
|
| 3467 |
APPROACHES = {
|
| 3468 |
+
"rosatgone": (lambda: core.run_cli(rosatgone_main), rosatgone_DOC),
|
| 3469 |
"gasunder": (lambda: core.run_cli(gasunder_main), gasunder_DOC),
|
| 3470 |
"hgpsoverlap": (lambda: core.run_cli(hgpsoverlap_main), hgpsoverlap_DOC),
|
| 3471 |
"unasclass": (lambda: core.run_cli(unasclass_main), unasclass_DOC),
|
setitools/infrared.py
CHANGED
|
@@ -3502,13 +3502,13 @@ def ksexcess_main(record=False, widths=5.0, errors=5.0, w1_widths=2.0, colour_mi
|
|
| 3502 |
print("recorded")
|
| 3503 |
|
| 3504 |
|
| 3505 |
-
warmgalaxies_DOC = r"""Galaxies warm without star formation: HECATE galaxies within 150 Mpc with a GSWLC stellar mass and ultraviolet-optical star-formation rate and with WISE 22 um and IRAS far-infrared luminosities, the quiescent ones (specific star-formation rate below 1e-11 per year) whose 22 um luminosity exceeds a tenth of a solar luminosity per solar mass and lies within a factor of three of their far-infrared luminosity; star-forming dust at 20-40 K peaks at 60-100 um and old stars warm little dust, so mid-infrared heat without young stars or cold dust is what structures at room temperature around a galaxy's stars would radiate. Each read for an active nucleus in HECATE's
|
| 3506 |
|
| 3507 |
python -I seti.py infrared warmgalaxies [record] [--d-max-mpc 150] [--ssfr-max -11] [--heat-min -1.0] [--warm-min -0.5] [--edge-on-deg 70]"""
|
| 3508 |
|
| 3509 |
|
| 3510 |
def warmgalaxies_main(record=False, d_max_mpc=150.0, ssfr_max=-11.0, heat_min=-1.0, warm_min=-0.5, edge_on_deg=70.0):
|
| 3511 |
-
rows = core.tap("vizier", 'SELECT PGC, NED, RAJ2000, DEJ2000, D, i, logLTIR, logLFIR, logL22um, logL12um, logMGSW, logSFRGSW, logSFRTIR, Nuclear, AGNs17, AGNh, W3mag, W4mag '
|
| 3512 |
'FROM "J/MNRAS/506/1896/hecate" WHERE D < %g AND logSFRGSW IS NOT NULL AND logMGSW IS NOT NULL AND logL22um IS NOT NULL AND logLFIR IS NOT NULL'
|
| 3513 |
% d_max_mpc, timeout=900)
|
| 3514 |
gal = []
|
|
@@ -3518,8 +3518,8 @@ def warmgalaxies_main(record=False, d_max_mpc=150.0, ssfr_max=-11.0, heat_min=-1
|
|
| 3518 |
continue
|
| 3519 |
# HECATE's luminosities are in erg/s; a solar luminosity is 3.828e33 erg/s
|
| 3520 |
l22, lfir = l22 - 33.583, lfir - 33.583
|
| 3521 |
-
gal.append(dict(pgc=r["PGC"], name=(r["NED"] or "").strip(), d=num(r["D"]), inc=num(r["i"]), m=m, ssfr=sfr - m, heat=l22 - m, warm=l22 - lfir, l22=l22, lfir=lfir,
|
| 3522 |
-
ltir=num(r["logLTIR"]), agn=
|
| 3523 |
w34=(num(r["W3mag"]) - num(r["W4mag"])) if num(r["W3mag"]) is not None and num(r["W4mag"]) is not None else None))
|
| 3524 |
quiet = [g for g in gal if g["ssfr"] < ssfr_max]
|
| 3525 |
forming = [g for g in gal if g["ssfr"] >= ssfr_max]
|
|
@@ -3527,14 +3527,15 @@ def warmgalaxies_main(record=False, d_max_mpc=150.0, ssfr_max=-11.0, heat_min=-1
|
|
| 3527 |
warm_q = np.array([g["warm"] for g in quiet])
|
| 3528 |
hits = [g for g in quiet if g["heat"] > heat_min and g["warm"] > warm_min]
|
| 3529 |
for g in hits:
|
| 3530 |
-
g["vet"] = "background-galaxy" if g["agn"] else "dust-lane" if g["inc"] is not None and g["inc"] > edge_on_deg else
|
|
|
|
| 3531 |
left = [g for g in hits if g["vet"] is None]
|
| 3532 |
print("%d galaxies within %g Mpc with masses, ultraviolet-optical star-formation rates, 22 um and far-infrared luminosities; quiescent (specific rate below 1e%g): %d, "
|
| 3533 |
"whose 22 um heat per stellar mass runs median %.2f (99th percentile %.2f) and 22 um over far-infrared median %.2f (99th %.2f); above %g per solar mass and within "
|
| 3534 |
-
"%g dex of the far-infrared: %d, %d with active nuclei, %d edge-on; unexplained %d" % (
|
| 3535 |
len(gal), d_max_mpc, ssfr_max, len(quiet), float(np.median(heat_q)) if len(heat_q) else 0, float(np.percentile(heat_q, 99)) if len(heat_q) else 0,
|
| 3536 |
float(np.median(warm_q)) if len(warm_q) else 0, float(np.percentile(warm_q, 99)) if len(warm_q) else 0, heat_min, warm_min, len(hits),
|
| 3537 |
-
sum(g["vet"] == "background-galaxy" for g in hits), sum(g["vet"] == "dust-lane" for g in hits), len(left)))
|
| 3538 |
for g in sorted(hits, key=lambda g: -g["heat"]):
|
| 3539 |
print(" %s (PGC %s, %s Mpc): log M %.2f, specific rate %.2f, 22 um per mass %.2f, 22 um over far-infrared %+.2f, W3-W4 %s, inclination %s; %s" % (
|
| 3540 |
g["name"], g["pgc"], g["d"], g["m"], g["ssfr"], g["heat"], g["warm"], "%.2f" % g["w34"] if g["w34"] is not None else "-", g["inc"], g["vet"] or "unexplained"))
|
|
@@ -3548,8 +3549,8 @@ def warmgalaxies_main(record=False, d_max_mpc=150.0, ssfr_max=-11.0, heat_min=-1
|
|
| 3548 |
"galaxies apart" % (float(np.median(heat_q)) if len(heat_q) else 0, float(np.percentile(heat_q, 99)) if len(heat_q) else 0,
|
| 3549 |
float(np.median(warm_q)) if len(warm_q) else 0, float(np.percentile(warm_q, 99)) if len(warm_q) else 0, len(forming)),
|
| 3550 |
"a quiescent galaxy radiating a tenth of a solar luminosity per solar mass at 22 um with little cold dust",
|
| 3551 |
-
"%d: %d with active nuclei, %d edge-on
|
| 3552 |
-
|
| 3553 |
[dict(target="pgc:%s" % g["pgc"], stat=g["heat"], unit="log 22 um luminosity per stellar mass, solar units", vet=g["vet"],
|
| 3554 |
note="%s, %s Mpc, log M %.2f, specific rate %.2f, 22 um over far-infrared %+.2f, inclination %s" % (g["name"], g["d"], g["m"], g["ssfr"], g["warm"], g["inc"]))
|
| 3555 |
for g in hits])
|
|
@@ -4644,7 +4645,105 @@ def pvedge_main(record=False, widths=5.0, jk_widths=2.0, emax=0.03, beam_arcsec=
|
|
| 4644 |
print("recorded")
|
| 4645 |
|
| 4646 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4647 |
APPROACHES = {
|
|
|
|
| 4648 |
"pvedge": (lambda: core.run_cli(pvedge_main), pvedge_DOC),
|
| 4649 |
"coldcomp": (lambda: core.run_cli(coldcomp_main), coldcomp_DOC),
|
| 4650 |
"diskvoids": (lambda: core.run_cli(diskvoids_main), diskvoids_DOC),
|
|
|
|
| 3502 |
print("recorded")
|
| 3503 |
|
| 3504 |
|
| 3505 |
+
warmgalaxies_DOC = r"""Galaxies warm without star formation: HECATE galaxies within 150 Mpc with a GSWLC stellar mass and ultraviolet-optical star-formation rate and with WISE 22 um and IRAS far-infrared luminosities, the quiescent ones (specific star-formation rate below 1e-11 per year) whose 22 um luminosity exceeds a tenth of a solar luminosity per solar mass and lies within a factor of three of their far-infrared luminosity; star-forming dust at 20-40 K peaks at 60-100 um and old stars warm little dust, so mid-infrared heat without young stars or cold dust is what structures at room temperature around a galaxy's stars would radiate. Each read for an active nucleus in HECATE's two flags, for an edge-on disc, whose dust lanes hide the young stars, and for HECATE's homogenised star-formation rate, which counts the infrared and puts a galaxy whose young stars dust hides from the ultraviolet and optical back among the star-forming.
|
| 3506 |
|
| 3507 |
python -I seti.py infrared warmgalaxies [record] [--d-max-mpc 150] [--ssfr-max -11] [--heat-min -1.0] [--warm-min -0.5] [--edge-on-deg 70]"""
|
| 3508 |
|
| 3509 |
|
| 3510 |
def warmgalaxies_main(record=False, d_max_mpc=150.0, ssfr_max=-11.0, heat_min=-1.0, warm_min=-0.5, edge_on_deg=70.0):
|
| 3511 |
+
rows = core.tap("vizier", 'SELECT PGC, NED, RAJ2000, DEJ2000, D, i, logLTIR, logLFIR, logL22um, logL12um, logMGSW, logSFRGSW, logSFRTIR, logSFRh, Nuclear, AGNs17, AGNh, W3mag, W4mag '
|
| 3512 |
'FROM "J/MNRAS/506/1896/hecate" WHERE D < %g AND logSFRGSW IS NOT NULL AND logMGSW IS NOT NULL AND logL22um IS NOT NULL AND logLFIR IS NOT NULL'
|
| 3513 |
% d_max_mpc, timeout=900)
|
| 3514 |
gal = []
|
|
|
|
| 3518 |
continue
|
| 3519 |
# HECATE's luminosities are in erg/s; a solar luminosity is 3.828e33 erg/s
|
| 3520 |
l22, lfir = l22 - 33.583, lfir - 33.583
|
| 3521 |
+
gal.append(dict(pgc=r["PGC"], name=(r["NED"] or "").strip(), d=num(r["D"]), inc=num(r["i"]), m=m, ssfr=sfr - m, ssfr_h=(num(r["logSFRh"]) - m) if num(r["logSFRh"]) is not None else None, heat=l22 - m, warm=l22 - lfir, l22=l22, lfir=lfir,
|
| 3522 |
+
ltir=num(r["logLTIR"]), agn="Y" in (str(r["AGNs17"]).strip(), str(r["AGNh"]).strip()),
|
| 3523 |
w34=(num(r["W3mag"]) - num(r["W4mag"])) if num(r["W3mag"]) is not None and num(r["W4mag"]) is not None else None))
|
| 3524 |
quiet = [g for g in gal if g["ssfr"] < ssfr_max]
|
| 3525 |
forming = [g for g in gal if g["ssfr"] >= ssfr_max]
|
|
|
|
| 3527 |
warm_q = np.array([g["warm"] for g in quiet])
|
| 3528 |
hits = [g for g in quiet if g["heat"] > heat_min and g["warm"] > warm_min]
|
| 3529 |
for g in hits:
|
| 3530 |
+
g["vet"] = ("background-galaxy" if g["agn"] else "dust-lane" if g["inc"] is not None and g["inc"] > edge_on_deg else
|
| 3531 |
+
"dust" if g["ssfr_h"] is not None and g["ssfr_h"] > ssfr_max + 1 else None)
|
| 3532 |
left = [g for g in hits if g["vet"] is None]
|
| 3533 |
print("%d galaxies within %g Mpc with masses, ultraviolet-optical star-formation rates, 22 um and far-infrared luminosities; quiescent (specific rate below 1e%g): %d, "
|
| 3534 |
"whose 22 um heat per stellar mass runs median %.2f (99th percentile %.2f) and 22 um over far-infrared median %.2f (99th %.2f); above %g per solar mass and within "
|
| 3535 |
+
"%g dex of the far-infrared: %d, %d with active nuclei, %d edge-on, %d star-forming by the infrared rate; unexplained %d" % (
|
| 3536 |
len(gal), d_max_mpc, ssfr_max, len(quiet), float(np.median(heat_q)) if len(heat_q) else 0, float(np.percentile(heat_q, 99)) if len(heat_q) else 0,
|
| 3537 |
float(np.median(warm_q)) if len(warm_q) else 0, float(np.percentile(warm_q, 99)) if len(warm_q) else 0, heat_min, warm_min, len(hits),
|
| 3538 |
+
sum(g["vet"] == "background-galaxy" for g in hits), sum(g["vet"] == "dust-lane" for g in hits), sum(g["vet"] == "dust" for g in hits), len(left)))
|
| 3539 |
for g in sorted(hits, key=lambda g: -g["heat"]):
|
| 3540 |
print(" %s (PGC %s, %s Mpc): log M %.2f, specific rate %.2f, 22 um per mass %.2f, 22 um over far-infrared %+.2f, W3-W4 %s, inclination %s; %s" % (
|
| 3541 |
g["name"], g["pgc"], g["d"], g["m"], g["ssfr"], g["heat"], g["warm"], "%.2f" % g["w34"] if g["w34"] is not None else "-", g["inc"], g["vet"] or "unexplained"))
|
|
|
|
| 3549 |
"galaxies apart" % (float(np.median(heat_q)) if len(heat_q) else 0, float(np.percentile(heat_q, 99)) if len(heat_q) else 0,
|
| 3550 |
float(np.median(warm_q)) if len(warm_q) else 0, float(np.percentile(warm_q, 99)) if len(warm_q) else 0, len(forming)),
|
| 3551 |
"a quiescent galaxy radiating a tenth of a solar luminosity per solar mass at 22 um with little cold dust",
|
| 3552 |
+
"%d: %d with active nuclei, %d edge-on, %d star-forming once the infrared is counted; %d unexplained" % (
|
| 3553 |
+
len(hits), sum(g["vet"] == "background-galaxy" for g in hits), sum(g["vet"] == "dust-lane" for g in hits), sum(g["vet"] == "dust" for g in hits), len(left)),
|
| 3554 |
[dict(target="pgc:%s" % g["pgc"], stat=g["heat"], unit="log 22 um luminosity per stellar mass, solar units", vet=g["vet"],
|
| 3555 |
note="%s, %s Mpc, log M %.2f, specific rate %.2f, 22 um over far-infrared %+.2f, inclination %s" % (g["name"], g["d"], g["m"], g["ssfr"], g["warm"], g["inc"]))
|
| 3556 |
for g in hits])
|
|
|
|
| 4645 |
print("recorded")
|
| 4646 |
|
| 4647 |
|
| 4648 |
+
radioquiet_DOC = r"""Heat without cosmic rays: star formation heats dust and, through its supernovae, lights synchrotron, so the far-infrared to 1.4 GHz ratio q holds at 2.34 with 0.26 dex of scatter over four decades of luminosity (Yun, Reddy and Condon 2001), and waste heat from engines carries no synchrotron with it; HECATE galaxies within 200 Mpc north of -40 deg with IRAS 60 and 100 um fluxes, the far-infrared flux 1.26e-14 (2.58 S60 + S100) W/m^2, against every NVSS component within the galaxy's D25 semi-major axis, at least 45 arcsec and at most 3 arcmin, q above 3.3 (four times the scatter), or NVSS's 2.5 mJy giving a lower limit above it; each read for an IRAS source in the Galactic plane's cirrus (|b| below 10 deg), a disc wider than 6 arcmin, whose synchrotron the 3 arcmin sum misses, HECATE's active-nucleus flags or WISE AGN colours (W1-W2 above 0.8), NED's largest 1.4 GHz flux integrated over the galaxy's map, which holds a faint disc NVSS's component list breaks up, SIMBAD's active-nucleus types, NGC 1377's published nascent starburst, and a 60 um flux IRAS flags as an upper limit.
|
| 4649 |
+
|
| 4650 |
+
python -I seti.py infrared radioquiet [record] [--d-max-mpc 200] [--q-flag 3.3] [--nvss-limit-mjy 2.5] [--b-min 10] [--extent-arcmin 6]"""
|
| 4651 |
+
|
| 4652 |
+
|
| 4653 |
+
# galaxies the literature has already explained: PGC to reading
|
| 4654 |
+
RADIOQUIET_KNOWN = {"13324": "a nascent starburst too young for its supernovae to have lit synchrotron (Roussel et al. 2003)"}
|
| 4655 |
+
|
| 4656 |
+
|
| 4657 |
+
def radioquiet_ned_1p4(name):
|
| 4658 |
+
"""The largest integrated 1.4 GHz flux density (mJy) NED holds for a galaxy, or None."""
|
| 4659 |
+
t = core.get("https://ned.ipac.caltech.edu/cgi-bin/datasearch?" + urllib.parse.urlencode(dict(search_type="Photometry", objname=name, of="ascii_bar", meas_type="bot")),
|
| 4660 |
+
timeout=120, soft=True)
|
| 4661 |
+
best = None
|
| 4662 |
+
for line in (t or b"").decode(errors="replace").splitlines():
|
| 4663 |
+
c = [x.strip() for x in line.split("|")]
|
| 4664 |
+
# columns: number, band, value, uncertainty, units, frequency (Hz), flux in Jy
|
| 4665 |
+
# the continuum alone: the 21 cm line sits at 1.42 GHz in Jy Hz
|
| 4666 |
+
if len(c) > 6 and c[4] in ("mJy", "Jy") and "HI" not in c[1] and "21 cm" not in c[1] and num(c[5]) and abs(num(c[5]) - 1.4e9) < 0.03e9 and num(c[6]) and "<" not in c[3]:
|
| 4667 |
+
best = max(best or 0.0, 1000.0 * num(c[6]))
|
| 4668 |
+
return best
|
| 4669 |
+
|
| 4670 |
+
|
| 4671 |
+
def radioquiet_main(record=False, d_max_mpc=200.0, q_flag=3.3, nvss_limit_mjy=2.5, b_min=10.0, extent_arcmin=6.0):
|
| 4672 |
+
from astropy.coordinates import SkyCoord
|
| 4673 |
+
import astropy.units as u
|
| 4674 |
+
rows = core.tap("vizier", 'SELECT PGC, NED, RAJ2000, DEJ2000, D, MajAxis, F60um, F100um, q_F60um, q_F100um, W1mag, W2mag, logSFRh, Nuclear, AGNs17, AGNh '
|
| 4675 |
+
'FROM "J/MNRAS/506/1896/hecate" WHERE D < %g AND DEJ2000 > -40 AND F60um > 0 AND F100um > 0' % d_max_mpc, timeout=900)
|
| 4676 |
+
gal = []
|
| 4677 |
+
for r in rows:
|
| 4678 |
+
s60, s100 = num(r["F60um"]), num(r["F100um"])
|
| 4679 |
+
fir = 1.26e-14 * (2.58 * s60 + s100)
|
| 4680 |
+
# testable only where NVSS's limit would put q above the flag
|
| 4681 |
+
if math.log10(fir / 3.75e12 / (nvss_limit_mjy * 1e-29)) <= q_flag:
|
| 4682 |
+
continue
|
| 4683 |
+
maj = num(r["MajAxis"]) or 0.0
|
| 4684 |
+
gal.append(dict(source_id=str(r["PGC"]), name=(r["NED"] or "").strip(), ra=float(r["RAJ2000"]), dec=float(r["DEJ2000"]), d=num(r["D"]), maj=maj, fir=fir,
|
| 4685 |
+
upper=str(r["q_F60um"]).strip() == "1", agn="Y" in (str(r["AGNs17"]).strip(), str(r["AGNh"]).strip()),
|
| 4686 |
+
w12=(num(r["W1mag"]) - num(r["W2mag"])) if num(r["W1mag"]) is not None and num(r["W2mag"]) is not None else None, s1=0.0))
|
| 4687 |
+
# HECATE's MajAxis is the D25 semi-major axis in arcmin
|
| 4688 |
+
radius = {g["source_id"]: max(45.0, min(60.0 * g["maj"], 180.0)) for g in gal}
|
| 4689 |
+
byid = {g["source_id"]: g for g in gal}
|
| 4690 |
+
for k in range(0, len(gal), 20000):
|
| 4691 |
+
for m in core.xmatch(gal[k:k + 20000], "VIII/65/nvss", 180.0):
|
| 4692 |
+
if float(m["angDist"]) <= radius[m["source_id"]]:
|
| 4693 |
+
byid[m["source_id"]]["s1"] += num(m.get("S1.4")) or 0.0
|
| 4694 |
+
b = SkyCoord([g["ra"] for g in gal] * u.deg, [g["dec"] for g in gal] * u.deg).galactic.b.deg
|
| 4695 |
+
for g, bb in zip(gal, b):
|
| 4696 |
+
g["b"] = float(bb)
|
| 4697 |
+
g["limit"] = g["s1"] <= 0
|
| 4698 |
+
g["q"] = math.log10(g["fir"] / 3.75e12 / (max(g["s1"], nvss_limit_mjy) * 1e-29))
|
| 4699 |
+
# NVSS's component list breaks a faint extended disc into nothing; NED holds the flux integrated over the map (Condon, Cotton and Broderick 2002)
|
| 4700 |
+
for g in [g for g in gal if g["q"] > q_flag]:
|
| 4701 |
+
g["ned"] = radioquiet_ned_1p4(g["name"]) if g["name"] else None
|
| 4702 |
+
if g["ned"] and g["ned"] > g["s1"]:
|
| 4703 |
+
g["q_ned"] = math.log10(g["fir"] / 3.75e12 / (g["ned"] * 1e-29))
|
| 4704 |
+
qs = np.array([g["q"] for g in gal if not g["limit"]])
|
| 4705 |
+
high = [g for g in gal if g["q"] > q_flag]
|
| 4706 |
+
simbad = {m["source_id"]: (m.get("main_type") or "").strip() for m in core.xmatch(high, "simbad", 30.0)} if high else {}
|
| 4707 |
+
for g in high:
|
| 4708 |
+
# NVSS's components are summed within 3 arcmin of the centre, so a disc wider than twice that loses its extended synchrotron
|
| 4709 |
+
g["vet"] = ("catalogue-dropped" if g.get("q_ned") is not None and g["q_ned"] <= q_flag else
|
| 4710 |
+
"diffuse-emission" if abs(g["b"]) < b_min else
|
| 4711 |
+
"out-of-reach" if 2 * g["maj"] > extent_arcmin else
|
| 4712 |
+
"published-classification" if g["agn"] or (g["w12"] is not None and g["w12"] > 0.8) else
|
| 4713 |
+
"natural-type" if any(k in simbad.get(g["source_id"], "") for k in ("AGN", "Seyfert", "LINER", "QSO", "Sy")) else
|
| 4714 |
+
"young-star" if g["source_id"] in RADIOQUIET_KNOWN else
|
| 4715 |
+
"single-record" if g["upper"] else None)
|
| 4716 |
+
left = [g for g in high if g["vet"] is None]
|
| 4717 |
+
print("%d HECATE galaxies within %g Mpc north of -40 deg bright enough in the far infrared that NVSS reaches q %g; %d detected, q median %.2f, robust scatter %.2f; "
|
| 4718 |
+
"above %g: %d (%d upper limits), %d active nuclei, %d in the plane, %d larger than %g arcmin, %d with a 60 um limit; unexplained %d" % (
|
| 4719 |
+
len(gal), d_max_mpc, q_flag, len(qs), float(np.median(qs)), 1.4826 * float(np.median(np.abs(qs - np.median(qs)))), q_flag, len(high), sum(g["limit"] for g in high),
|
| 4720 |
+
sum(g["vet"] == "published-classification" for g in high), sum(g["vet"] == "diffuse-emission" for g in high), sum(g["vet"] == "out-of-reach" for g in high), extent_arcmin,
|
| 4721 |
+
sum(g["vet"] == "single-record" for g in high), len(left)))
|
| 4722 |
+
for g in sorted(high, key=lambda g: -g["q"])[:40]:
|
| 4723 |
+
print(" %s (PGC %s, %.0f Mpc): q %s%.2f, NVSS %.1f mJy within %.0f arcsec, NED %s mJy%s, major axis %.1f arcmin, b %+.1f; %s" % (
|
| 4724 |
+
g["name"], g["source_id"], g["d"] or 0, ">" if g["limit"] else "", g["q"], g["s1"], radius[g["source_id"]], "%.1f" % g["ned"] if g.get("ned") else "-",
|
| 4725 |
+
" (q %.2f)" % g["q_ned"] if g.get("q_ned") is not None else "", g["maj"], g["b"], g["vet"] or "unexplained"))
|
| 4726 |
+
if record:
|
| 4727 |
+
core.record_run(
|
| 4728 |
+
"fir_radio_quiet", "Heat without cosmic rays", "HECATE (J/MNRAS/506/1896) with its IRAS fluxes; NVSS (VIII/65) by CDS XMatch",
|
| 4729 |
+
"%d HECATE galaxies within %g Mpc north of -40 deg with IRAS 60 and 100 um fluxes bright enough for NVSS to reach q %g" % (len(gal), d_max_mpc, q_flag),
|
| 4730 |
+
os.path.abspath(__file__), "radioquiet", len(gal), "galaxies", dict(d_max_mpc=d_max_mpc, q_flag=q_flag, nvss_limit_mjy=nvss_limit_mjy, b_min=b_min, extent_arcmin=extent_arcmin),
|
| 4731 |
+
dict(detected=len(qs), q_median=float(np.median(qs)), q_scatter=1.4826 * float(np.median(np.abs(qs - np.median(qs))))),
|
| 4732 |
+
"q above %g, four times the natural relation's 0.26 dex above its 2.34" % q_flag,
|
| 4733 |
+
"%d above q %g of %d (%d of them NVSS limits): %d back under it with NED's flux integrated over the map%s, %d larger than NVSS recovers, %d in the plane's cirrus, %d active nuclei, %d nascent starburst (NGC 1377), %d on IRAS limits; "
|
| 4734 |
+
"%d unexplained%s" % (
|
| 4735 |
+
len(high), q_flag, len(gal), sum(g["limit"] for g in high), sum(g["vet"] == "catalogue-dropped" for g in high),
|
| 4736 |
+
" (%s)" % ", ".join("%s, %.0f mJy, q %.2f" % (g["name"], g["ned"], g["q_ned"]) for g in high if g["vet"] == "catalogue-dropped") if any(g["vet"] == "catalogue-dropped" for g in high) else "",
|
| 4737 |
+
sum(g["vet"] == "out-of-reach" for g in high), sum(g["vet"] == "diffuse-emission" for g in high),
|
| 4738 |
+
sum(g["vet"] in ("published-classification", "natural-type") for g in high), sum(g["vet"] == "young-star" for g in high), sum(g["vet"] == "single-record" for g in high),
|
| 4739 |
+
len(left), " (%s)" % ", ".join("%s, q above %.2f" % (g["name"], g["q"]) for g in left) if left else ""),
|
| 4740 |
+
[dict(target="pgc:%s" % g["source_id"], stat=round(g["q"], 2), unit="q, far-infrared over 1.4 GHz" + (" (lower limit)" if g["limit"] else ""), vet=g["vet"],
|
| 4741 |
+
note="%s, %s Mpc; NVSS %.1f mJy; major axis %.1f arcmin; b %+.1f" % (g["name"], g["d"], g["s1"], g["maj"], g["b"])) for g in high])
|
| 4742 |
+
print("recorded")
|
| 4743 |
+
|
| 4744 |
+
|
| 4745 |
APPROACHES = {
|
| 4746 |
+
"radioquiet": (lambda: core.run_cli(radioquiet_main), radioquiet_DOC),
|
| 4747 |
"pvedge": (lambda: core.run_cli(pvedge_main), pvedge_DOC),
|
| 4748 |
"coldcomp": (lambda: core.run_cli(coldcomp_main), coldcomp_DOC),
|
| 4749 |
"diskvoids": (lambda: core.run_cli(diskvoids_main), diskvoids_DOC),
|