phanerozoic commited on
Commit
7167664
·
verified ·
1 Parent(s): 0934df7

Add the ROSAT-to-eRASS1, FIR-radio and quiet-spotted searches and read HECATE's AGN flags correctly

Browse files
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 nuclear-activity flags and its inclination | 6, every one with an active nucleus; the quiescent galaxies' 22 um heat per mass runs 0.035 solar at the median and 0.55 at the 99th percentile |
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 nuclear-activity flags and the inclination 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
  | 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
- 518 runs of 406 approaches; 514356 per-target rows over 432573 distinct target identifiers.
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 nuclear-activity flags and its inclination
2116
 
2117
  **Runs.** `hecate_warm_quiet`: 38 galaxies, 6 per-target rows, 6 vetted
2118
 
2119
- **Result.** 6, every one with an active nucleus; the quiescent galaxies' 22 um heat per mass runs 0.035 solar at the median and 0.55 at the 99th percentile
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:3e4ac89c6fdf68b1deeeb0cd0aac966058a55c3c924db87bf2546e83357f3e73
3
- size 110522368
 
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
- Rt = torch.as_tensor(np.nan_to_num(R * w[None, :], nan=0.0), dtype=torch.float32, device=dev)
 
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.nan_to_num(R * w[None, :], nan=0.0) * Wt[None, :]
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
- v = binaries_velocities(spectra, Trv, band=giants_band(inst))
4501
- P, tp, e, w, k1, gamma, rms = binaries_refit(t, v, *binaries_orbit(target)[:5])
 
 
 
 
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
- agn = bool((g["AGNs17"] or "").strip() or (g["AGNh"] or "").strip() or (g["Nuclear"] or "").strip() not in ("", "0"))
 
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 three flags and for an edge-on disc, whose dust lanes hide the young stars.
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=bool((r["AGNs17"] or "").strip() or (r["AGNh"] or "").strip() or (r["Nuclear"] or "").strip() not in ("", "0")),
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 None
 
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; %d unexplained" % (len(hits), sum(g["vet"] == "background-galaxy" for g in hits), sum(g["vet"] == "dust-lane" for g in hits),
3552
- len(left)),
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),