diff --git a/src/Vela.jl b/src/Vela.jl index 644b1672..7e08fbf6 100644 --- a/src/Vela.jl +++ b/src/Vela.jl @@ -17,6 +17,7 @@ export GQ include("toa/ephemeris.jl") include("toa/toa.jl") include("toa/wideband_toa.jl") +include("toa/photon.jl") include("parameter/parameter.jl") include("model/component.jl") include("model/kernel.jl") @@ -48,6 +49,7 @@ include("model/dispersion_measurement_noise.jl") include("model/marginalized_timing_model.jl") include("model/timing_model.jl") include("model/wideband_model.jl") +include("model/photon_model.jl") include("prior/prior.jl") include("prior/prior_scaling.jl") include("prior/simple_prior.jl") diff --git a/src/model/photon_model.jl b/src/model/photon_model.jl new file mode 100644 index 00000000..9bbac7d2 --- /dev/null +++ b/src/model/photon_model.jl @@ -0,0 +1,14 @@ +"""Update a `CorrectedWidebandTOA` object. +Most components only affect the TOA part and not the DM part.""" +correct_toa( + component::Component, + photon::Photon, + photcorr::PhotonCorrection, + params::NamedTuple, +) = PhotonCorrection( + correct_toa(component, photon.toa, photcorr.arrival_time_correction, params), +) + +"""Update a `WidebandTOA` object using a timing model.""" +correct_toa(model::TimingModel, wtoa::Photon, params::NamedTuple) = + correct_toa(model, wtoa, PhotonCorrection(), params) diff --git a/src/toa/photon.jl b/src/toa/photon.jl new file mode 100644 index 00000000..74ea207f --- /dev/null +++ b/src/toa/photon.jl @@ -0,0 +1,37 @@ +export Photon + +struct Photon <: TOABase + arrival_time::TOA + weight::GQ{0,Float64} + + function Photon(arrival_time, frequency, weight, ephem, index) + toa = TOA(arrival_time, time(0.0), frequency, dimensionless(0.0), ephem, index) + return new(toa, weight) + end +end + +struct PhotonCorrection <: TOACorrectionBase + arrival_time_correction::TOACorrection +end + +function PhotonCorrection(delay, phase, ssb_psr_pos) + @assert all(iszero.(ssb_psr_pos)) || dot(ssb_psr_pos, ssb_psr_pos) ≈ dimensionless(1.0) "ssb_psr_pos must be a zero vector (representing pending computation) or a unit vector." + + return PhotonCorrection( + TOACorrection( + delay, + phase, + dimensionless(1.0), + GQ{2}(0.0), + frequency(0.0), + dimensionless(1.1), + ssb_psr_pos, + ), + ) +end + +PhotonCorrection() = + PhotonCorrection(time(0.0), dimensionless(0.0), dimensionless.((0.0, 0.0, 0.0))) + +fractional_phase(photcorr::PhotonCorrection) = + photcorr.arrival_time_correction.phase - round(photcorr.arrival_time_correction.phase)