<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://vines.sh/feed.xml" rel="self" type="application/atom+xml"/><link href="https://vines.sh/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-07-17T01:53:23+00:00</updated><id>https://vines.sh/feed.xml</id><title type="html">blank</title><subtitle>Astronomer working on exoplanets, stellar characterisation, and scientific software. Based in Santiago, Chile. </subtitle><entry><title type="html">On reading papers for what they don’t say</title><link href="https://vines.sh/blog/2026/on-reading-papers-for-what-they-dont-say/" rel="alternate" type="text/html" title="On reading papers for what they don’t say"/><published>2026-04-22T00:00:00+00:00</published><updated>2026-04-22T00:00:00+00:00</updated><id>https://vines.sh/blog/2026/on-reading-papers-for-what-they-dont-say</id><content type="html" xml:base="https://vines.sh/blog/2026/on-reading-papers-for-what-they-dont-say/"><![CDATA[<h2 id="a-nice-paper">A nice paper</h2> <p>I stumbled upon a review article by Jose Perea in the <em>Notices of the AMS</em>, <a href="https://www.ams.org/journals/notices/201905/rnoti-p686.pdf"><em>Topological Time Series Analysis</em></a>. It walks you through Takens’ embedding theorem, sliding-window point clouds, persistent homology, and then applies the whole apparatus to problems like detecting wheezes in breath recordings and scoring genes by their circadian rhythmicity. For someone who doesn’t know much about topology, the mathematics is clean and understandable, the applications are eclectic and honest. Overall a fun and interesting read.</p> <p>What I couldn’t stop thinking about afterwards was Theorem 3.1, which is Takens’ embedding theorem dressed up for the sliding-window case. The theorem says, very roughly, that if you have a scalar measurement of a periodic dynamical system and you stack its time-shifted copies into vectors, the point cloud you get back is a topological copy of the underlying attractor. A circular orbit produces a loop. A Keplerian orbit at eccentricity 0.9 also produces a loop. They look different, but topologically they’re the same thing: one $\text{H}_1$ class, Betti number $\beta_1 = 1$. The <em>shape</em> of the loop depends on the waveform; its <em>existence</em> doesn’t.</p> <p>Every period-finding method I use in my day job assumes something about the shape of the signal. Lomb-Scargle assumes a sinusoid. BLS assumes a boxcar transit. TLS adds a transit model with limb darkening and ingress/egress. While BLS and TLS aren’t really affected by waveform mismatches (transits tend to generally look the smae or very similar), GLS does suffer from a waveform mismatch from orbital eccentricity: an eccentric Keplerian RV is a genuine multi-harmonic Fourier series, with power spreading across P, P/2, P/3 and beyond as eccentricity rises, and the absolute amplitude of the fundamental collapsing. <a href="https://academic.oup.com/mnras/article/354/4/1165/1052087">Cumming (2004)</a> documents the sensitivity loss, which gets painful for e $\gtrsim$ 0.5. The field handles this with dedicated Keplerian periodograms. BLS and TLS work fine on eccentric transits; what those methods actually miss, per <a href="https://arxiv.org/abs/1901.02015">Hippke &amp; Heller (2019)</a>, is small planets and shallow ingress/egress detail.</p> <p>Here was a framework that on paper didn’t care about any of that. It would build a loop whether the waveform was a sine, a sawtooth, or an eccentric Keplerian spike. And when I went looking, I couldn’t find anyone who had tried it on astronomical data. The review cites applications to biology, to engineering, to video; none to astronomy. None to the specific problem of exoplanet period search.</p> <p>So I built the thing.</p> <h2 id="building-it">Building it</h2> <p>What I built is a Python package, <code class="language-plaintext highlighter-rouge">takens_periodogram</code>, that does the natural thing. For each trial period P, construct the sliding-window delay embedding with lag $\tau = \frac{P}{m}$ in $m$ delay coordinates, compute the $\text{H}_1$ persistence of that cloud with Ripser, and return the max persistence as a function of trial period. Add the standard scaffolding: bootstrap false-alarm levels via phase-randomised surrogates, candidate detection, harmonic deduplication, NetCDF serialisation. Make it install with <code class="language-plaintext highlighter-rouge">uv</code>. Add injection-test notebooks for the canonical cases. The works.</p> <p>It works on synthetic data in the sense that the code runs and the numbers are reproducible. Whether it <em>finds periods</em> turned out to be a different question.</p> <h2 id="the-first-wall">The first wall</h2> <p>I ran a 16-case injection benchmark. Six circular-orbit periods (2, 3, 5, 15, 30, 80 days) at e = 0, plus P = 3 d at e = 0.5 and 0.7, each evaluated in both time-domain and phase-folded embedding. Clean white noise, a textbook Keplerian signal.</p> <p>Detection rate: <strong>2/16. 12.5 per cent.</strong></p> <p>And it wasn’t that the peaks were slightly off. They landed at completely wrong periods in 14 of 16 cases. Here’s one: a circular orbit at $P = 3$ d, the easiest regime you’d design a benchmark around. The algorithm places its top peak at about 7.86 d.</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/posts/takens-periodogram/periodogram_miss-480.webp 480w,/assets/img/posts/takens-periodogram/periodogram_miss-800.webp 800w,/assets/img/posts/takens-periodogram/periodogram_miss-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/posts/takens-periodogram/periodogram_miss.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" alt="Topological periodogram for an injected circular orbit at P=3 d. The green vertical line marks the true period; the red dashed line marks where the algorithm actually placed its maximum, near 7.86 d. The 95% and 99% bootstrap false-alarm levels are shown in grey. The landscape is multi-modal with no distinctive peak at the injected period." data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>The landscape is noisy and multi-modal. The literature period sits in a local dip. This isn’t a signal-to-noise problem; the $\frac{K}{\sigma}$ ratio of the injection is plenty.</p> <p>It gets worse with eccentricity. A 30-seed sweep at $P = 15$ d, $K = 10$ $\text{ms}^{-1}$, $N = 80$ observations shows $\pi(P)$ collapsing eight-fold from $e = 0$ to $e = 0.6$ in phase-folded mode, five-fold in time-domain. The first harmonic 2P overtakes the fundamental at $e \approx 0.3$ for time-domain, $e \approx 0.5$ for phase-folded:</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/posts/takens-periodogram/eccentricity_collapse-480.webp 480w,/assets/img/posts/takens-periodogram/eccentricity_collapse-800.webp 800w,/assets/img/posts/takens-periodogram/eccentricity_collapse-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/posts/takens-periodogram/eccentricity_collapse.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" alt="H1 persistence at the true period and its first harmonic as a function of eccentricity, for phase-folded and time-domain Takens embeddings. The true-period peak drops by almost an order of magnitude by e=0.6; the first harmonic crosses it at e~0.3 in the time-domain embedding and e~0.5 in the phase-folded variant." data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>The physical picture is clear. Eccentric orbits spend most of their time near apastron, so the periastron arc of the embedded loop becomes a sparsely sampled gap and the $\text{H}_1$ feature breaks. Folding at 2P doubles the periastron sampling, which is why 2P wins.</p> <p>Over the next couple of months I tried eight variants. Time-domain and phase-folded embeddings, adaptive tolerance floors, adaptive embedding dimensions, a joint RV+photometry mode, peak refinement, FAL smoothing, a hybrid of time-domain and phase-folded. Each was motivated and each was honestly tested. None moved the detection rate above about 12 per cent.</p> <p>Some of them helped with subsidiary problems, foe example, phase-folded embedding cleanly fixed a short-period NaN issue that time-domain suffered, but fixing that didn’t lift the detection rate. The real issue was that max $\text{H}_1$ persistence wasn’t a sharp enough period statistic. The contrast ratio between the true period and the largest spurious peak was $1.5-2\times$. That’s not going to cut it; you need more like $5\times$.</p> <p>At some point I sat with the numbers for a while and accepted that the core periodogram was dead.</p> <h2 id="rescue-attempt-a-diagnostic">Rescue attempt: a diagnostic</h2> <p>I didn’t want to write the whole project off, so I looked at what had fallen out of the work that might survive the verdict on the periodogram itself. Two things had: a lifetime-ratio statistic (ℓ, comparing the top $\text{H}_1$ persistence to the second) and an epoch-split stability test I was calling S_norm. It was basically a discretised Wasserstein-1 distance on per-phase-bin means, comparing the first and second halves of the baseline. The intuition: a Keplerian signal is temporally stable (the phase-folded curve looks the same in both halves); stellar activity isn’t (spots grow, decay, migrate).</p> <p>On 40 synthetic injection cases, S_norm looked really clean:</p> <table> <thead> <tr> <th>Signal class</th> <th>S_norm median</th> </tr> </thead> <tbody> <tr> <td>Keplerian, $e \leq 0.5$</td> <td>1.3</td> </tr> <tr> <td>GP quasi-periodic</td> <td>6.1</td> </tr> <tr> <td>Evolving activity</td> <td>4.3</td> </tr> <tr> <td>White noise</td> <td>0.9</td> </tr> </tbody> </table> <p>Factor-2.5 separation between any planet-like and any activity-like signal, eccentricity-independent, 100 per cent flagging of activity with zero false positives on planets. If it held on real data it would have been a letter on its own. Planet/activity disambiguation is a genuinely live problem in precision RV surveys.</p> <p>So I ran it on 19 HARPS systems where the literature verdict is known: seven confirmed planets (Pi Mensae, $\epsilon$ Indi A, GJ 887, $\nu^2$ Lupi, HD 114613, HD 192310, HD 38858), three retracted activity false positives (HD 41248, Kapteyn’s star, GJ 581), six controversial cases, three quiet calibrators.</p> <p>Every one of the seven confirmed planets got flagged as “evolving” (activity) at the top GLS peak.</p> <p>Pi Mensae: S = 229. $\epsilon$ Indi A: S = 25. HD 38858: S = 34. The median S for confirmed planets came in at <strong>4.50</strong>. For retracted activity false positives it was <strong>2.22</strong>. The diagnostic was <em>inverted</em>: confirmed planets looked more activity-like than known activity.</p> <p>I spent an afternoon or two trying to rescue it. The formal RV uncertainties from the DRS pipeline are photon-limited, but real RV scatter on solar-type stars is floor-limited by granulation, oscillations, and instrumental systematics. So the S_norm denominator was too small by a factor of several, and the statistic blew up for any real signal regardless of its temporal stability. I swapped in an empirical-variance denominator (in-half sample variance instead of propagated formal error), per-instrument-per-half offset fitting to absorb the HARPS fibre-upgrade discontinuity, and Keplerian-subtracted residuals at the known planet period. The inversion went away:</p> <table> <thead> <tr> <th>class</th> <th>median S_norm (rescued)</th> </tr> </thead> <tbody> <tr> <td>confirmed planets</td> <td>1.49</td> </tr> <tr> <td>activity FPs</td> <td>1.16</td> </tr> <tr> <td>controversial</td> <td>1.88</td> </tr> </tbody> </table> <p>But the factor-2.5 separation didn’t come back. 1.49 vs 1.16 is a 29 % gap, and the within-class spreads are much wider than that. Confirmed planets ranged from 1.40 to 11.17; activity FPs from 1.06 to 2.30. The synthetic-clean separation was an artefact of two things: formal errors being calibrated exactly to the injected noise, and the injected Keplerian being the <em>only</em> structure in the data. Real stars violate both.</p> <p>That was the second burial.</p> <h2 id="a-side-quest">A side quest</h2> <p>While I was working on the diagnostics, I got curious about a tangential question. Persistent homology is supposed to find topology in point clouds. Does it see the known structure in the exoplanet <em>population itself</em>. The Neptune Desert, the radius gap, the hot-Jupiter clump, that kind of thing.</p> <p>I pulled the <a href="https://exoplanetarchive.ipac.caltech.edu/cgi-bin/TblView/nph-tblView?app=ExoTbls&amp;config=PSCompPars">NASA Exoplanet Archive Composite catalog</a>, subsampled down to 2000 planets via farthest-point sampling, and ran persistent homology up to $\text{H}_2$ on the 4D point cloud (log P, log M, log R, log insolation). Null: permute each coordinate independently across 20 surrogates, compare to the real distribution.</p> <table> <thead> <tr> <th>dim</th> <th>data max persistence</th> <th>null max persistence</th> <th>p-value</th> </tr> </thead> <tbody> <tr> <td>H0</td> <td>2.88</td> <td>$2.48 \pm 0.42$</td> <td>0.10</td> </tr> <tr> <td>H1</td> <td>0.33</td> <td>$0.51 \pm 0.06$</td> <td>1.00</td> </tr> <tr> <td>H2</td> <td>0.15</td> <td>$0.28 \pm 0.03$</td> <td>1.00</td> </tr> </tbody> </table> <p>The population has comparable H0 persistence to the null and <em>suppressed</em> H1 and H2. I had to stop and think about why.</p> <p>Persistent homology on an unweighted point cloud probes the topology of the <em>support</em>: where the distribution is connected, where it has holes, where it has enclosed voids. The Neptune Desert is not a hole in the support; it’s a density depression inside a continuous distribution. A Vietoris-Rips filtration on the unweighted cloud just doesn’t see that unless the depression is deep enough to disconnect the cloud, which it isn’t. So persistent homology doesn’t recover the known astrophysical structure, and not because the structure is absent. It’s because the structure isn’t topological in the sense the tool measures.</p> <p>Clean result, but not one that rescued anything.</p> <h2 id="going-denser">Going denser</h2> <p>The most sympathetic steelman of the periodogram failure was: “you tested on sparse RV. Of course it struggles. Try it on a signal where you have a lot of data per cycle.” Which is roughly what pulsating variable stars are. RR Lyrae, especially RRab pulsators, are non-sinusoidal (sawtooth in flux), well understood, and densely sampled by modern photometric surveys. If a waveform-agnostic periodogram was ever going to show its worth, it would be here.</p> <p>I grabbed Kepler Q1 photometry of RR Lyrae itself: KIC 7198959, the prototype of the class. 1624 long-cadence points over 33 days, sampling 59 cycles of the literature period $P = 0.5668$ d. Ran the package across four configurations: phase-folded and time-domain, with embedding dimensions m = 3 and m = 5.</p> <table> <thead> <tr> <th>configuration</th> <th>top peak (d)</th> <th>offset</th> <th>$\pi(P_\text{lit})$</th> <th>$\pi(\text{runner-up})$</th> <th>contrast</th> </tr> </thead> <tbody> <tr> <td>phase-folded, m = 3</td> <td>0.998</td> <td>76 %</td> <td>0.43</td> <td>1.45</td> <td>0.29</td> </tr> <tr> <td>phase-folded, m = 5</td> <td>0.740</td> <td>31 %</td> <td>2.02</td> <td>2.61</td> <td>0.78</td> </tr> <tr> <td>time-domain, m = 3</td> <td>0.232</td> <td>59 %</td> <td>0.66</td> <td>1.60</td> <td>0.41</td> </tr> <tr> <td>time-domain, m = 5</td> <td>0.292</td> <td>48 %</td> <td>1.82</td> <td>2.22</td> <td>0.82</td> </tr> </tbody> </table> <p>GLS on the same light curve hits the literature period at 0.5676 d, off by 0.13 %.</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/posts/takens-periodogram/rrlyr_four_configs-480.webp 480w,/assets/img/posts/takens-periodogram/rrlyr_four_configs-800.webp 800w,/assets/img/posts/takens-periodogram/rrlyr_four_configs-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/posts/takens-periodogram/rrlyr_four_configs.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" alt="Topological periodogram of RR Lyrae Kepler Q1 photometry across four package configurations. Phase-folded modes (top row) produce a comb-noise landscape; time-domain modes (bottom row) are smoother but peak at the short-period edge of the search range. In every panel the literature period (green) sits at lower persistence than the algorithm's chosen peak (red dashed)." data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>Every contrast ratio is below one. The literature period carries <em>less</em> $\text{H}_1$ persistence than the algorithm’s chosen peak in every configuration. Higher $m$ raises the persistence at the true period by roughly $4\times$, but raises spurious-peak persistence by a similar factor. The landscape gets more topologically interesting everywhere, not sharper where it should be.</p> <p>So denser sampling didn’t rescue it either. If anything it did <em>worse</em> than the exoplanet tests: the contrast ratio of $0.29-0.82$ at RRab is <em>below</em> the $1.5-2\times$ of the exoplanet regime. Not the result I wanted.</p> <h2 id="back-to-the-math-with-actual-attention">Back to the math, with actual attention</h2> <p>At this point I was out of empirical rescue attempts and went back to Perea with a different question. Not “how do I tune this to work?” but “why does it not work?”</p> <p>The paper’s Theorem 5.1 gives the semi-axes of the sliding-window ellipse for a pure sinusoid $\zeta(t) = \sin(Lt + \phi)$:</p> \[a^2,\ b^2 \;\propto\; (d+1) \pm \left|\frac{\sin(L(d+1)\tau)}{\sin(L\tau)}\right|\] <p>The ellipse becomes a <em>perfect circle</em> and $\text{mp}_1$ reaches its maximum exactly when the numerator $\sin(L(d+1)\tau)$ vanishes. That happens at $\tau = n\pi / (L(d+1)) = (n/2) \cdot P / (d+1)$ for every positive integer n. The paper’s “optimal $\tau$” ($\tau_d = 2\pi / (L(d+1))$) is just the $n = 2$ case.</p> <p>My lag rule was $\tau = P/(d+1)$ (the natural choice: it makes the embedding window span one period). Plug that in and you get circular optima at</p> \[P \;=\; \tfrac{n}{2}\,P_\mathrm{true}\quad\text{for every } n = 1, 2, 3, \dots\] <p>P_true, P_true/2, 3P_true/2, 2P_true, 5P_true/2: every half-integer multiple. The optima are <em>dense</em>. Add harmonics (eccentric orbits, sawtooth RRab waveforms) and each harmonic contributes its own family. The comb gets denser still.</p> <p>This is why the spurious peaks at RR Lyr landed at 0.232 $\approx$ P/2, 0.740 $\approx$ 4P/3, and 0.998 $\approx$ 7P/4. Those aren’t bugs. They’re optima.</p> <p>The paper doesn’t say any of this, not because the paper is wrong, but because every one of its applications uses $\text{mp}_1$ as a feature at a single known $\tau$. Sweeping $\tau$ across a range of trial periods is just not a thing the paper does. The multi-modal optima structure is implicit in Theorem 5.1 (it’s three lines of trig) and nobody had written it down, including me until after the empirical failures forced me to look.</p> <p>A quick check on the simplest possible case, a pure sinusoid at P = 1 with $\tau$ swept across the range, confirms the derivation directly:</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/posts/takens-periodogram/sinusoid_optima-480.webp 480w,/assets/img/posts/takens-periodogram/sinusoid_optima-800.webp 800w,/assets/img/posts/takens-periodogram/sinusoid_optima-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/posts/takens-periodogram/sinusoid_optima.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" alt="Pure sinusoid at P=1, d=10: max H1 persistence as a function of the lag tau. The predicted circular optima at tau_n=n/22 for n=1 to 10 are marked with dotted vertical lines. mp1 sits near its maximum value of about 4.0 across the entire interior plateau, with sharp drops only at the edges where sin(L tau) approaches zero." data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>$\text{mp}_1$($\tau$) sits at its maximum of about 4.0 across essentially the entire interior of the $\tau$ range, with sharp drops only at $\tau$ = 0 and $\tau$ = P/2 where sin(L$\tau$) itself vanishes and the ellipse collapses. The ten predicted circular optima at $\tau$ = n/22 for n = 1, 2, …, 10 all sit on a single plateau. A peak-finder picks off the boundary ones but the interior ones are indistinguishable.</p> <p>The corresponding Perea-faithful diagnostic on RR Lyr, at d = 20 (the embedding dimension Perea recommends for waveforms with $\lesssim$ 10 harmonics), shows the same pattern on real data. $\pi$(P) = 4.59 $\pm$ 0.08 across 80 trial periods from 0.30 to 0.85 days, with the literature period sitting right in the flat region. The white-noise null shows how much loop structure is actually in the real signal. The framework clearly <em>sees</em> something (67 $\sigma$ above Gaussian noise). The phase-randomised null is nearly indistinguishable from the real signal. Phase-randomised RR Lyr is still periodic at the same frequency, just with shuffled phase relationships between harmonics, and its SW cloud has similar topology to the real one:</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/posts/takens-periodogram/perea_diagnostic-480.webp 480w,/assets/img/posts/takens-periodogram/perea_diagnostic-800.webp 800w,/assets/img/posts/takens-periodogram/perea_diagnostic-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/posts/takens-periodogram/perea_diagnostic.png" class="img-fluid rounded z-depth-1" width="100%" height="auto" alt="Perea-faithful diagnostic on RR Lyr Kepler Q1 photometry at d=20. Blue curve is mp1 swept across 80 trial periods, essentially flat at 4.59 plus or minus 0.08. Pink band is the phase-randomised null at 4.03 plus or minus 0.44. Grey band is the white-noise null at 0.67 plus or minus 0.06. The literature period (green) sits in the flat region with no special peak." data-zoomable="" loading="lazy" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <p>The framework picks out real signals from white noise at 67 $\sigma$. It doesn’t distinguish the coherent signal from its phase-shuffled counterpart. It doesn’t produce a swept landscape with a peak at the right period.</p> <h2 id="the-punchline">The punchline</h2> <p>What I had built was a sweep over $\tau$ whose output was $\text{mp}_1$. What the theory actually supports is an <em>evaluation</em> of $\text{mp}_1$ at a single $\tau$ picked to match an expected period. These have the same inputs and outputs. They’re not the same operation.</p> <p>Max $\text{H}_1$ persistence of a sliding-window embedding is a periodicity <em>statistic</em>, not a <em>periodogram</em>. The property that makes the feature useful (robustness of $\text{mp}_1$ to the choice of $(d, \tau)$ near the optimum) is exactly what kills the periodogram interpretation. A periodogram needs a sharp peak at the right period; $\text{mp}_1$($\tau$) has a plateau of circular optima at every half-integer multiple of the true period.</p> <p>Every application cited in Perea’s review uses $\text{mp}_1$ as a feature:</p> <ul> <li><a href="https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0645-6"><strong>SW1PerS</strong></a> (<a href="https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0645-6">Perea, Deckard, Haase, Harer 2015</a>): rank genes by circadian periodicity at the known 24-hour cycle.</li> <li>Wheeze detection (<a href="https://doi.org/10.1109/LSP.2014.2305700">Emrani, Gentimis, Krim 2014</a>): classify breath recordings.</li> <li>Chatter detection in machining (<a href="https://doi.org/10.1016/j.ymssp.2015.09.046">Khasawneh &amp; Munch 2016</a>): classify.</li> <li>Motion recognition from wearable sensors (<a href="https://doi.org/10.1109/GlobalSIP.2016.7906045">Dirafzoon, Lokare, Lobaton 2016</a>): classify.</li> <li>Video quasiperiodicity quantification (<a href="https://doi.org/10.1137/17M1137642">Tralie &amp; Perea 2018</a>): known-period scoring.</li> </ul> <p>Not one of them searches for an unknown period. That pattern was the informative thing I didn’t read correctly going in.</p> <h2 id="what-i-take-from-this">What I take from this</h2> <p><strong>Real data sooner, don’t focus on synthetic.</strong> The most expensive mistake was extensively validating every variant on clean injection tests, and spending weeks optimising hyperparameters on those tests, before putting real HARPS or Kepler data anywhere near the pipeline. When I finally did, the conclusions I’d drawn on synthetics got contradicted. Synthetic- first is attractive because it’s fast and controllable. That’s exactly what can make it a bad test bed: real-world noise structure, instrumental systematics, stellar jitter. These are exactly the things a clean injection test doesn’t contain.</p> <p><strong>Trust the early null.</strong> The core failure mode was visible in the first serious injection run. I remember thinking “that’s strange, but it’s probably the tolerance parameter.” Then “that’s strange, but it’s probably the embedding dimension.” Then “that’s strange, but the phase-folded variant will fix it.” At each step there was a local reason to keep going. In retrospect there wasn’t a global one.</p> <p><strong>Define the kill criterion before the first experiment.</strong> I kept moving the goalposts, which is what an invested and hopeful person does. Define a proper kill criterion before you invest too much time and effort into an idea, or at the very least heed the early warning signs and proceed with caution.</p> <h2 id="to-finish-off">To finish off</h2> <p>There isn’t enough discourse online about failures in experimentation. There are enough self pat-in-the-backs and victory stories that create false expectations for the community. Moreover, I don’t want to lean on platitudes about resilience that turn a specific failure into a generic life lesson, or frame the failure as noble. That’s the positive-result framing in a mirror. Neither version is useful to the next person.</p> <p>What I hope this post does instead: if you’re considering persistent homology on delay embeddings as a periodogram for astronomical time series, the repository contains the injection tests, the eccentricity sweep, the HARPS diagnostic benchmark, the RR Lyrae test, and the Perea-faithful d = 20 diagnostic. Decide for yourself whether to try anyway. If you have an idea that escapes the dense-optima plateau (sliding-window persistence <em>landscapes</em> instead of max persistence, supervised TDA features trained against a known catalog, something else), the scaffolding is a reasonable starting point. If you don’t, you’ve saved whatever fraction of my time you would otherwise have spent reaching the same conclusion.</p> <p>Two things I won’t try to sell: that the failure was a learning experience in some deep sense, or that you should keep going regardless of the evidence. The first is self-congratulatory, the second is often wrong. Projects end for reasons. Writing them up is the useful part.</p> <p><strong>Repository</strong>: <a href="https://github.com/jvines/takens_periodogram">github.com/jvines/takens_periodogram</a>.</p> <hr/> <h3 id="references">References</h3> <ul> <li>Takens, F. 1981, <em>Detecting Strange Attractors in Turbulence</em>, in Dynamical Systems and Turbulence, Warwick 1980, Lecture Notes in Mathematics 898, 366. The original delay-embedding theorem.</li> <li>Perea, J. A. 2019, <em>Topological Time Series Analysis</em>, Notices of the AMS 66(5), 686. <a href="https://doi.org/10.1090/noti1869">doi:10.1090/noti1869</a>. The review that launched this project.</li> <li>Perea, J. A., Deckard, A., Haase, S. B. &amp; Harer, J. 2015, <em>SW1PerS: Sliding windows and 1-persistence scoring; discovering periodicity in gene expression time series data</em>, BMC Bioinformatics 16, 257. <a href="https://doi.org/10.1186/s12859-015-0645-6">doi:10.1186/s12859-015-0645-6</a>. The canonical $\text{mp}_1$-as-periodicity-score implementation.</li> <li>Bauer, U. 2021, <em>Ripser: efficient computation of Vietoris–Rips persistence barcodes</em>, Journal of Applied and Computational Topology 5, 391. <a href="https://doi.org/10.1007/s41468-021-00071-5">doi:10.1007/s41468-021-00071-5</a>. The homology engine the code is built on.</li> <li>Cumming, A. 2004, <em>Detectability of extrasolar planets in radial velocity surveys</em>, MNRAS 354(4), 1165. <a href="https://doi.org/10.1111/j.1365-2966.2004.08275.x">doi:10.1111/j.1365-2966.2004.08275.x</a>. The canonical reference for LS sensitivity loss at high eccentricity.</li> <li>Hippke, M. &amp; Heller, R. 2019, <em>Optimized transit detection algorithm to search for periodic transits of small planets</em>, A&amp;A 623, A39. <a href="https://doi.org/10.1051/0004-6361/201834672">doi:10.1051/0004-6361/201834672</a>. The TLS paper; documents what BLS actually misses and what adding a transit model with limb darkening and ingress/egress recovers.</li> <li>Emrani, S., Gentimis, T. &amp; Krim, H. 2014, <em>Persistent homology of delay embeddings and its application to wheeze detection</em>, IEEE Signal Processing Letters 21(4), 459. <a href="https://doi.org/10.1109/LSP.2014.2305700">doi:10.1109/LSP.2014.2305700</a>. $\text{mp}_1$ as a feature for binary wheeze classification.</li> <li>Khasawneh, F. A. &amp; Munch, E. 2016, <em>Chatter detection in turning using persistent homology</em>, Mechanical Systems and Signal Processing 70–71, 527. <a href="https://doi.org/10.1016/j.ymssp.2015.09.046">doi:10.1016/j.ymssp.2015.09.046</a>. $\text{mp}_1$ as a feature for machining-chatter classification.</li> <li>Dirafzoon, A., Lokare, N. &amp; Lobaton, E. 2016, <em>Action classification from motion capture data using topological data analysis</em>, IEEE Global Conference on Signal and Information Processing (GlobalSIP), <ol> <li><a href="https://doi.org/10.1109/GlobalSIP.2016.7906045">doi:10.1109/GlobalSIP.2016.7906045</a>. $\text{mp}_1$ as a feature for motion classification.</li> </ol> </li> <li>Tralie, C. J. &amp; Perea, J. A. 2018, <em>(Quasi)Periodicity Quantification in Video Data, Using Topology</em>, SIAM Journal on Imaging Sciences 11(2), 1049. <a href="https://doi.org/10.1137/17M1137642">doi:10.1137/17M1137642</a>. $\text{mp}_1$ as a score at a known (or searched-by-grid) period for video recurrence.</li> </ul>]]></content><author><name></name></author><category term="research"/><category term="exoplanets"/><category term="tda"/><category term="negative-results"/><summary type="html"><![CDATA[A nice paper]]></summary></entry><entry><title type="html">FEROS Exposure Time Calculator</title><link href="https://vines.sh/blog/2019/feros-etc/" rel="alternate" type="text/html" title="FEROS Exposure Time Calculator"/><published>2019-09-17T00:00:00+00:00</published><updated>2019-09-17T00:00:00+00:00</updated><id>https://vines.sh/blog/2019/feros-etc</id><content type="html" xml:base="https://vines.sh/blog/2019/feros-etc/"><![CDATA[<p>Sources: <a href="http://slittlefair.staff.shef.ac.uk/teaching/phy217/lectures/instruments/L14/index.html">University of Sheffield</a>, <a href="https://www.eso.org/observing/etc/doc/formulabook/node6.html">ESO-ETC</a>.</p> <h2 id="astronomy-and-its-tools">Astronomy and its tools</h2> <p>Astronomy is done through observing stars, galaxies, or other regions of space from various telescopes and through different instruments. One common instrument used in exoplanetary science are echelle spectrographs — and one such instrument is FEROS, mounted on the MPG/ESO 2.2-m telescope at La Silla Observatory, Chile. That’s the instrument for which we’ll build an Exposure Time Calculator (ETC).</p> <h2 id="what-is-an-exposure-time-calculator">What is an Exposure Time Calculator?</h2> <p>When observing through a telescope one does not blindly point at a star for an arbitrary amount of time. Instead, the exposure time is estimated to reach a target signal-to-noise ratio. The signal-to-noise ratio compares signal level to background noise: the higher the ratio, the more signal is in your data.</p> <h2 id="understanding-photons">Understanding photons</h2> <p>The signal we collect from stars comes in the form of photons, so understanding how much signal we get means understanding how many photons we can detect.</p> <p>In statistics, the probability of a given number of events occurring in a fixed interval of time — for example <strong>how many photons hit a telescope’s detector</strong> — is described by the Poisson distribution:</p> \[P(k) = e^{-\lambda}\frac{\lambda^{k}}{k!}\] <p>where \(\lambda\) is the event rate and \(k\) the number of events. An important property of the Poisson distribution is that its mean and standard deviation are \(\lambda\) and \(\sqrt{\lambda}\) respectively. In the limit of large \(k\) the Poisson distribution tends to a Normal distribution with mean and variance both equal to \(\lambda\).</p> <h2 id="charge-coupled-device">Charge-Coupled Device</h2> <p>Another important component of telescopes is the Charge-Coupled Device (CCD) — the “camera” where photons land. When a photon hits a CCD pixel with enough energy, it excites and frees electrons. After an integration time \(t\), all pixels are shifted toward a final pixel where the electronics read them out as numbers.</p> <p>Two CCD-specific noise sources matter here:</p> <ol> <li><strong>Dark current</strong> — electrons freed by the intrinsic thermal activity of the CCD. The longer the CCD runs, the more of these accumulate.</li> <li><strong>Read-out noise</strong> — time-independent noise added by the CCD while reading out.</li> </ol> <h2 id="the-equation">The equation</h2> <p>We have four sources of noise:</p> <ul> <li>Noise from the source object</li> <li>Noise from the sky background</li> <li>Noise from the dark current</li> <li>Read-out noise</li> </ul> <p>All but the read-out noise are Poissonian. If the number of electrons freed by the object, sky, and dark current are \(S_o\), \(S_b\), and \(S_d\), then their individual noises are \(\sqrt{S_o}\), \(\sqrt{S_b}\), and \(\sqrt{S_d}\). Assuming independence and the large-\(k\) Gaussian limit, variances add, so with read-out noise \(R\):</p> \[N = \sqrt{S_o + S_b + S_d + R^{2}}\] <p>The signal-to-noise ratio is then</p> \[S_o/N = \frac{S_o}{\sqrt{S_o + S_b + S_d + R^{2}}}.\] <h2 id="in-practice">In practice</h2> <p>Dark current and read-out noise are given by the instrument specs. Source and sky electron counts we compute ourselves.</p> <p>Consider a star with visual magnitude \(m_V\), sky brightness \(m_{sky}\) in the V band, total efficiency \(\epsilon\), telescope mirror area \(A\), \(n_{pix}\) integration pixels, and spectral bin \(\Delta_S\) (wavelength range per pixel).</p> <p>First correct the magnitude for airmass \(X\) and extinction \(k\):</p> \[m_{Vc} = m_V + k \cdot X.\] <p>Then the flux:</p> \[F = 10^{-0.4\,m_{Vc}} \cdot f_{0}\] <p>with \(f_0 = 3.60994 \times 10^{-9}\;\text{erg}/\text{cm}^{2}/\text{s}/\text{Å}\) for the V band.</p> <p>The energy carried by a single photon is</p> \[E = \frac{h\,c}{\lambda},\] <p>so the electrons freed by the source are</p> \[S = \frac{F \cdot \Delta_S \cdot \epsilon \cdot A}{E}.\] <p>The sky calculation is identical. Over integration time \(t\) the counts scale as \(S \cdot t\).</p> <p>Putting it together:</p> \[S/N = \frac{S_o \cdot t}{\sqrt{S_o\,t + S_b\,t\,n_{pix} + S_d\,t\,n_{pix} + R^{2}\,n_{pix}}}.\] <h2 id="results">Results</h2> <p>Plugging in the MPG/ESO 2.2-m + FEROS numbers with an assumed extinction of 0.1 and a full-moon sky, below are signal-to-noise ratios for exposure times 10–60 min, magnitudes 6–20, and airmasses 1.0–2.5.</p> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_1.00.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_1.20.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_1.50.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_1.70.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_2.00.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <iframe src="/assets/html/Bokeh/FEROS_ETC/S_N_mag_feros_X_2.50.html" sandbox="allow-same-origin allow-scripts" width="100%" height="810" scrolling="no" seamless="" frameborder="0"></iframe> <p>Code for reproducing these plots is available <a href="https://github.com/jvines/FEROS_ETC">on GitHub</a>.</p>]]></content><author><name></name></author><category term="notes"/><category term="astronomy"/><category term="telescopes"/><category term="python"/><summary type="html"><![CDATA[Building an exposure time calculator for the FEROS echelle spectrograph from first principles.]]></summary></entry></feed>