Skip to content

FD delay is folded into tdis1/BAT, so the binary is evaluated at the wrong epoch #14

Description

@vhaasteren

Summary

Tempo2 accumulates the FD polynomial (and FDDC/FDDI) into tdis1 in dm_delays.C and subtracts tdis1 when forming BAT/bbat in formBats.C. Binary models then read ct = bbat (e.g. DDmodel.C), so orbital phase is evaluated at an epoch shifted by the FD delay.

That is the wrong frame. FD models frequency-dependent pulse-profile evolution, which originates in the pulsar magnetosphere (a frequency-dependent pulse phase), not in the ISM and not as a SAT/clock bias. The binary Rømer delay should be evaluated at the epoch of emission leaving the binary, then the profile delay applied — the same way Tempo2 already applies JUMP and FDJUMP as post-binary phase offsets in formResiduals.C.

PINT applies FD after the binary, in the pulsar frame. That is the physically correct order (Luo et al. 2021, ApJ 911, 45, §4.2 / Fig. 13; also the conclusion of nanograv/PINT#2035 after discussion with Abhimanyu Susobhanan). For typical µs-scale FD the residual difference is ~10 ns; for pathologically large FD it is hundreds of ns and shows up entirely as a binary-delay mismatch.

How this showed up

Found during MetaPulsar dual-engine parity tests: same published .par/.tim, no fit, PINT vs Tempo2 residuals compared TOA-by-TOA.

NANOGrav 15-year J1022+1001 (BINARY DD, five FD terms, max |FDi| ≈ 7 ms) disagreed at ~479 ns RMS. Clocks, site coordinates, and the FD delay values themselves agree; the entire gap is the binary delay. The same pulsar in other PTA releases (smaller FD) sits at ~1–4 ns.

On that NG15 pair:

Experiment PINT−Tempo2 residual RMS
Baseline (Tempo2: FD in tdis1 before binary) ~479 ns
Strip FD1…FD5 from the par ~1.2 ns
Reorder PINT so FD runs before BinaryDD (i.e. imitate Tempo2) ~1.2 ns

PINT’s FD delay vs Tempo2’s tdis1 FD piece: 0 ns (same formula, same barycentric frequency). Residual difference vs (pint_binary + tempo2_binary): correlation ≈ −1. Other large-FD binaries show the same pattern at smaller amplitude (NG15 J0610−2100 ~17 ns, J1012+5307 ~10 ns; PPTA DR3 J0437−4715 ~13 ns). Across 98 FD binaries the amplitude tracks (2π A₁ / P_b) · std(Δ_FD) at r ≈ 0.998.

Root cause

In dm_delays.C the FD polynomial is added to the same accumulator as DM:

/* Add frequency dependent delay term */
if (psr[p].param[param_fddc].paramSet[0]==1 && freqf>1)
    psr[p].obsn[i].tdis1 += ... FDDC/FDDI ...
for (k=0; k<psr[p].param[param_fd].aSize; k++) {
    if (psr[p].param[param_fd].paramSet[k]==1 && freqf>1)
        psr[p].obsn[i].tdis1 += psr[p].param[param_fd].val[k]
            * pow(log(freqf/1e9), k+1);
}

formBats.C then subtracts tdis1 when forming BAT/bbat. DDmodel.C (and ELL1/T2/…) uses ct = psr[p].obsn[ipos].bbat.

A millisecond FD-induced epoch shift in the DD Rømer delay is enough to produce the ~0.5 µs structure on J1022+1001:

Δ ≈ (dRoemer/dt) · Δ_FD ≈ (2π A₁ / P_b) · Δ_FD

Why this is a Tempo2 bug, not a PINT bug

FD (Arzoumanian et al. 2015, NG9 Eq. 2) is a phenomenological log-polynomial for pulse-profile evolution with radio frequency. That structure is generated in the magnetosphere: a frequency-dependent pulse phase, not a dispersive ISM delay and not a measured SAT bias.

Delay chain, SAT → emission:

SAT → SS delays → DM → binary → magnetosphere / profile phase → spindown

PINT’s DEFAULT_ORDER already follows that (pulsar_system then frequency_dependent). Luo et al. 2021 documented the split as a deliberate PINT choice and measured ~10 ns on NG11 FD values.

Tempo2 is also internally inconsistent:

  • Global FD* / FDDC go into tdis1 and shift bbat (before binary).
  • FDJUMP* / FDxJUMP are applied later as phaseJ in formResiduals.C (after binary), same place as ordinary JUMP.

If “frequency-dependent profile delay belongs with DM” were a physics rule, FDJUMP would not live in the phase-jump block. FD-in-tdis1 reads as “it was added in the DM function,” not as a frame choice.

(The J1022 FD amplitude of several ms is a large fraction of the pulse period, i.e. a template/profile-shape phase shift, not a geometric magnetosphere light-travel time. That still belongs in pulsar proper time: it should not move the epoch at which the binary is evaluated.)

Suggested fix

  1. Stop adding FD* (and, for the same reason, FDDC/FDDI) to tdis1.
  2. Apply them as a post-binary phase offset in formResiduals.C, next to JUMP / FDJUMP (phaseJ += F0 * FD_delay). That matches Tempo2’s own FDJUMP frame and PINT’s pulsar-frame FD.
  3. Document the change as breaking for published Tempo2-fit solutions with large FD (the binary coupling is ~10 ns for typical coefficients; hundreds of ns only for pathological FD). NANOGrav 15-year solutions were fit with PINT and already assume the pulsar-frame order, so those pars stay valid.
  4. A regression test: large-FD binary pulsar, Tempo2 residuals vs PINT (or vs Tempo2 with FD stripped and applied only as phaseJ) should agree at ~1 ns once BAT no longer includes FD.

Happy to provide the NG15 J1022+1001 .par/.tim pair if useful.

Context

Reported by Rutger van Haasteren while developing MetaPulsar and running MetaPulsar–PINT–Tempo2 consistency checks on current public PTA data releases. Originally filed as a PINT ordering bug (nanograv/PINT#2035); after discussion with Abhimanyu Susobhanan the conclusion is that PINT’s order is the physical one and Tempo2 should move FD out of tdis1.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions