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
- Stop adding
FD* (and, for the same reason, FDDC/FDDI) to tdis1.
- 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.
- 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.
- 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.
Summary
Tempo2 accumulates the FD polynomial (and
FDDC/FDDI) intotdis1indm_delays.Cand subtractstdis1when forming BAT/bbatinformBats.C. Binary models then readct = 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
JUMPandFDJUMPas post-binary phase offsets informResiduals.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:
tdis1before binary)FD1…FD5from the parPINT’s FD delay vs Tempo2’s
tdis1FD 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.Cthe FD polynomial is added to the same accumulator as DM:formBats.Cthen subtractstdis1when forming BAT/bbat.DDmodel.C(and ELL1/T2/…) usesct = 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:
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:
PINT’s
DEFAULT_ORDERalready follows that (pulsar_systemthenfrequency_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:
FD*/FDDCgo intotdis1and shiftbbat(before binary).FDJUMP*/FDxJUMPare applied later asphaseJinformResiduals.C(after binary), same place as ordinaryJUMP.If “frequency-dependent profile delay belongs with DM” were a physics rule, FDJUMP would not live in the phase-jump block. FD-in-
tdis1reads 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
FD*(and, for the same reason,FDDC/FDDI) totdis1.formResiduals.C, next toJUMP/FDJUMP(phaseJ += F0 * FD_delay). That matches Tempo2’s own FDJUMP frame and PINT’s pulsar-frame FD.phaseJ) should agree at ~1 ns once BAT no longer includes FD.Happy to provide the NG15 J1022+1001
.par/.timpair 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.