Exemple #1
0
def test_ftest_nb():
    """Test for narrowband fitter class F-test."""
    m = tm.get_model(os.path.join(datadir, "B1855+09_NANOGrav_9yv1.gls.par"))
    t = toa.get_TOAs(os.path.join(datadir, "B1855+09_NANOGrav_9yv1.tim"))
    f = fitter.WLSFitter(toas=t, model=m)
    f.fit_toas()
    # Test adding parameters
    FD4 = param.prefixParameter(parameter_type="float",
                                name="FD4",
                                value=0.0,
                                units=u.s,
                                frozen=False)
    ft = f.ftest(FD4, "FD", remove=False)
    assert isinstance(ft["ft"], float) or isinstance(ft["ft"], bool)
    # Test return the full output
    Ftest_dict = f.ftest(FD4, "FD", remove=False, full_output=True)
    assert isinstance(Ftest_dict["ft"], float) or isinstance(
        Ftest_dict["ft"], bool)
    # Test removing parameter
    FD3 = param.prefixParameter(parameter_type="float",
                                name="FD3",
                                value=0.0,
                                units=u.s,
                                frozen=False)
    ft = f.ftest(FD3, "FD", remove=True)
    assert isinstance(ft["ft"], float) or isinstance(ft["ft"], bool)
    Ftest_dict = f.ftest(FD3, "FD", remove=True, full_output=True)
    assert isinstance(Ftest_dict["ft"], float) or isinstance(
        Ftest_dict["ft"], bool)
Exemple #2
0
def test_ftest_nb():
    """Test for narrowband fitter class F-test."""
    m = tm.get_model(os.path.join(datadir, "J0023+0923_ell1_simple.par"))
    t = toa.make_fake_toas(56000.0, 56001.0, 10, m, freq=1400.0, obs="AO")
    f = fitter.WLSFitter(toas=t, model=m)
    f.fit_toas()
    # Test adding parameters
    F2 = param.prefixParameter(
        parameter_type="float",
        name="F2",
        value=0.0,
        units=u.Hz / u.s / u.s,
        frozen=False,
    )
    ft = f.ftest(F2, "Spindown", remove=False)
    assert isinstance(ft["ft"], float) or isinstance(ft["ft"], bool)
    # Test return the full output
    Ftest_dict = f.ftest(F2, "Spindown", remove=False, full_output=True)
    assert isinstance(Ftest_dict["ft"], float) or isinstance(Ftest_dict["ft"], bool)
    # Test removing parameter
    F1 = param.prefixParameter(
        parameter_type="float", name="F1", value=0.0, units=u.Hz / u.s, frozen=False
    )
    ft = f.ftest(F1, "Spindown", remove=True)
    assert isinstance(ft["ft"], float) or isinstance(ft["ft"], bool)
    Ftest_dict = f.ftest(F1, "Spindown", remove=True, full_output=True)
    assert isinstance(Ftest_dict["ft"], float) or isinstance(Ftest_dict["ft"], bool)
Exemple #3
0
    def __init__(self):
        super(Spindown, self).__init__()
        self.add_param(
            floatParameter(
                name="F0",
                value=0.0,
                units="Hz",
                description="Spin-frequency",
                long_double=True,
            ))
        self.add_param(
            prefixParameter(
                name="F1",
                value=0.0,
                units="Hz/s^1",
                description="Spindown-rate",
                unit_template=self.F_unit,
                description_template=self.F_description,
                type_match="float",
                long_double=True,
            ))
        self.add_param(
            MJDParameter(
                name="PEPOCH",
                description="Reference epoch for spin-down",
                time_scale="tdb",
            ))

        self.phase_funcs_component += [self.spindown_phase]
        self.phase_derivs_wrt_delay += [self.d_spindown_phase_d_delay]
Exemple #4
0
    def __init__(self):
        super(DispersionDM, self).__init__()
        self.add_param(
            floatParameter(
                name="DM",
                units="pc cm^-3",
                value=0.0,
                description="Dispersion measure",
                long_double=True,
            ))
        self.add_param(
            prefixParameter(
                name="DM1",
                value=0.0,
                units="pc cm^-3/yr^1",
                description=
                "First order time derivative of the dispersion measure",
                unit_template=self.DM_dervative_unit,
                description_template=self.DM_dervative_description,
                type_match="float",
                long_double=True,
            ))
        self.add_param(
            MJDParameter(name="DMEPOCH",
                         description="Epoch of DM measurement",
                         time_scale="tdb"))

        self.dm_value_funcs += [self.base_dm]
        self.delay_funcs_component += [self.constant_dispersion_delay]
Exemple #5
0
    def __init__(self):
        super(Wave, self).__init__()

        self.add_param(
            floatParameter(
                name="WAVE_OM",
                description="Base frequency of wave solution",
                units="1/d",
            )
        )
        self.add_param(
            prefixParameter(
                name="WAVE1",
                units="s",
                description="Wave components",
                type_match="pair",
                long_double=True,
                parameter_type="pair",
            )
        )
        self.add_param(
            MJDParameter(
                name="WAVEEPOCH",
                description="Reference epoch for wave solution",
                time_scale="tdb",
            )
        )
        self.phase_funcs_component += [self.wave_phase]
Exemple #6
0
 def __init__(self):
     super(DispersionDMX, self).__init__()
     # DMX is for info output right now
     self.add_param(
         floatParameter(
             name="DMX",
             units="pc cm^-3",
             value=0.0,
             description="Dispersion measure",
         )
     )
     self.add_param(
         prefixParameter(
             name="DMX_0001",
             units="pc cm^-3",
             value=0.0,
             unit_template=lambda x: "pc cm^-3",
             description="Dispersion measure variation",
             description_template=lambda x: "Dispersion measure",
             paramter_type="float",
         )
     )
     self.add_param(
         prefixParameter(
             name="DMXR1_0001",
             units="MJD",
             unit_template=lambda x: "MJD",
             description="Beginning of DMX interval",
             description_template=lambda x: "Beginning of DMX interval",
             parameter_type="MJD",
             time_scale="utc",
         )
     )
     self.add_param(
         prefixParameter(
             name="DMXR2_0001",
             units="MJD",
             unit_template=lambda x: "MJD",
             description="End of DMX interval",
             description_template=lambda x: "End of DMX interval",
             parameter_type="MJD",
             time_scale="utc",
         )
     )
     self.dm_value_funcs += [self.dmx_dm]
     self.set_special_params(["DMX_0001", "DMXR1_0001", "DMXR2_0001"])
     self.delay_funcs_component += [self.DMX_dispersion_delay]
Exemple #7
0
    def __init__(self):
        super(FD, self).__init__()
        self.add_param(
            prefixParameter(
                name="FD1",
                units="second",
                value=0.0,
                descriptionTplt=lambda x: ("%d term of frequency"
                                           " dependent  coefficients" % x),
                unitTplt=lambda x: "second",
                type_match="float",
            ))

        self.delay_funcs_component += [self.FD_delay]
Exemple #8
0
    def __init__(self):
        super(IFunc, self).__init__()

        self.add_param(
            floatParameter(name="SIFUNC",
                           description="Type of interpolation",
                           units=""))
        self.add_param(
            prefixParameter(
                name="IFUNC1",
                units="s",
                description="Interpolation Components (MJD+delay)",
                type_match="pair",
                long_double=True,
                parameter_type="pair",
            ))
        self.phase_funcs_component += [self.ifunc_phase]
Exemple #9
0
def test_pickle_prefixparameter():
    parfile = pint.config.examplefile("NGC6440E.par")
    m = get_model(parfile)

    modelcomponent = m.components["Spindown"]
    p = param.prefixParameter(
        parameter_type="float",
        name="F2",
        value=0,
        units=modelcomponent.F_unit(2),
        uncertainty=0,
        description=modelcomponent.F_description(2),
        longdouble=True,
        frozen=False,
    )
    modelcomponent.add_param(p, setup=True)
    m.validate()
    s = pickle.dumps(m)
Exemple #10
0
    def __init__(self):
        super().__init__()
        self.add_param(
            prefixParameter(
                name="FD1",
                units="second",
                value=0.0,
                description=
                "Coefficient of delay as a polynomial function of log-frequency",
                # descriptionTplt=lambda x: (
                #    "%d term of frequency" " dependent  coefficients" % x
                # ),
                descriptionTplt=self._description_template,
                # unitTplt=lambda x: "second",
                type_match="float",
            ))

        self.delay_funcs_component += [self.FD_delay]
Exemple #11
0
def test_grid_3param_prefix_multiprocessor():
    parfile = pint.config.examplefile("NGC6440E.par")
    timfile = pint.config.examplefile("NGC6440E.tim")
    m, t = get_model_and_toas(parfile, timfile)

    # add a F2 to the model
    modelcomponent = m.components["Spindown"]
    p = param.prefixParameter(
        parameter_type="float",
        name="F2",
        value=0,
        units=modelcomponent.F_unit(2),
        uncertainty=0,
        description=modelcomponent.F_description(2),
        longdouble=True,
        frozen=False,
    )
    modelcomponent.add_param(p, setup=True)
    m.validate()

    f = WLSFitter(t, m)
    f.fit_toas()
    bestfit = f.resids.chi2

    F0 = np.linspace(
        f.model.F0.quantity - 3 * f.model.F0.uncertainty,
        f.model.F0.quantity + 3 * f.model.F0.uncertainty,
        3,
    )
    F1 = np.linspace(
        f.model.F1.quantity - 3 * f.model.F1.uncertainty,
        f.model.F1.quantity + 3 * f.model.F1.uncertainty,
        7,
    )
    F2 = np.linspace(
        f.model.F2.quantity - 3 * f.model.F2.uncertainty,
        f.model.F2.quantity + 3 * f.model.F2.uncertainty,
        5,
    )
    chi2grid, _ = pint.gridutils.grid_chisq(f, ("F0", "F1", "F2"),
                                            (F0, F1, F2),
                                            ncpu=ncpu)

    assert np.isclose(bestfit, chi2grid.min())
Exemple #12
0
    def __init__(self):
        super(Glitch, self).__init__()

        self.add_param(
            prefixParameter(
                name="GLPH_1",
                units="pulse phase",
                value=0.0,
                descriptionTplt=lambda x: "Phase change for glitch %d" % x,
                unitTplt=lambda x: "pulse phase",
                type_match="float",
            )
        )
        # FIXME: should this be long double?
        self.add_param(
            prefixParameter(
                name="GLEP_1",
                units="day",
                descriptionTplt=lambda x: "Epoch of glitch %d" % x,
                unitTplt=lambda x: "day",
                type_match="MJD",
                time_scale="tdb",
            )
        )
        self.add_param(
            prefixParameter(
                name="GLF0_1",
                units="Hz",
                value=0.0,
                descriptionTplt=lambda x: "Permanent frequency change"
                " for glitch %d" % x,
                unitTplt=lambda x: "Hz",
                type_match="float",
            )
        )
        self.add_param(
            prefixParameter(
                name="GLF1_1",
                units="Hz/s",
                value=0.0,
                descriptionTplt=lambda x: "Permanent frequency-"
                "derivative change for glitch"
                " %d " % x,
                unitTplt=lambda x: "Hz/s",
            )
        )
        self.add_param(
            prefixParameter(
                name="GLF2_1",
                units="Hz/s^2",
                value=0.0,
                descriptionTplt=lambda x: "Permanent second frequency-"
                "derivative change for glitch"
                " %d " % x,
                unitTplt=lambda x: "Hz/s^2",
            )
        )
        self.add_param(
            prefixParameter(
                name="GLF0D_1",
                units="Hz",
                value=0.0,
                descriptionTplt=lambda x: "Decaying frequency change "
                "for glitch %d " % x,
                unitTplt=lambda x: "Hz",
                type_match="float",
            )
        )

        self.add_param(
            prefixParameter(
                name="GLTD_1",
                units="day",
                value=0.0,
                descriptionTplt=lambda x: "Decay time constant for" " glitch %d" % x,
                unitTplt=lambda x: "day",
                type_match="float",
            )
        )
        self.phase_funcs_component += [self.glitch_phase]
Exemple #13
0
    def __init__(self):
        super().__init__()

        self.add_param(
            prefixParameter(
                name="GLPH_1",
                units="pulse phase",
                value=0.0,
                description_template=self._description_glitch_phase,
                type_match="float",
            ))
        self.add_param(
            prefixParameter(
                name="GLEP_1",
                units="MJD",
                description_template=self._description_glitch_epoch,
                parameter_type="MJD",
                time_scale="tdb",
            ))
        self.add_param(
            prefixParameter(
                name="GLF0_1",
                units="Hz",
                value=0.0,
                description_template=self._description_glitch_frequencychange,
                type_match="float",
            ))
        self.add_param(
            prefixParameter(
                name="GLF1_1",
                units="Hz/s",
                value=0.0,
                description_template=self.
                _description_glitch_frequencyderivativechange,
            ))
        self.add_param(
            prefixParameter(
                name="GLF2_1",
                units="Hz/s^2",
                value=0.0,
                description_template=self.
                _description_glitch_frequencysecondderivativechange,
            ))
        self.add_param(
            prefixParameter(
                name="GLF0D_1",
                units="Hz",
                value=0.0,
                description_template=self.
                _description_decaying_frequencychange,
                type_match="float",
            ))

        self.add_param(
            prefixParameter(
                name="GLTD_1",
                units="day",
                value=0.0,
                description_template=self._description_decaytimeconstant,
                type_match="float",
            ))
        self.phase_funcs_component += [self.glitch_phase]
Exemple #14
0
    def add_DMX_range(self,
                      mjd_start,
                      mjd_end,
                      index=None,
                      dmx=0,
                      frozen=True):
        """Add DMX range to a dispersion model with specified start/end MJDs and DMX.

        Parameters
        ----------

        mjd_start : float
            MJD for beginning of DMX event.
        mjd_end : float
            MJD for end of DMX event.
        index : int, None
            Integer label for DMX event. If None, will increment largest used index by 1.
        dmx : float
            Change in DM during DMX event.
        frozen : bool
            Indicates whether DMX will be fit.

        Returns
        -------

        index : int
            Index that has been assigned to new DMX event.

        """

        #### Setting up the DMX title convention. If index is None, want to increment the current max DMX index by 1.
        if index is None:
            dct = self.get_prefix_mapping_component("DMX_")
            index = np.max(list(dct.keys())) + 1
        i = f"{int(index):04d}"

        if mjd_end is not None and mjd_start is not None:
            if mjd_end < mjd_start:
                raise ValueError("Starting MJD is greater than ending MJD.")
        elif mjd_start != mjd_end:
            raise ValueError("Only one MJD bound is set.")

        if int(index) in self.get_prefix_mapping_component("DMX_"):
            raise ValueError(
                "Index '%s' is already in use in this model. Please choose another."
                % index)

        self.add_param(
            prefixParameter(
                name="DMX_" + i,
                units="pc cm^-3",
                value=dmx,
                description="Dispersion measure variation",
                parameter_type="float",
                frozen=frozen,
            ))
        self.add_param(
            prefixParameter(
                name="DMXR1_" + i,
                units="MJD",
                description="Beginning of DMX interval",
                parameter_type="MJD",
                time_scale="utc",
                value=mjd_start,
            ))
        self.add_param(
            prefixParameter(
                name="DMXR2_" + i,
                units="MJD",
                description="End of DMX interval",
                parameter_type="MJD",
                time_scale="utc",
                value=mjd_end,
            ))
        self.setup()
        self.validate()
        return index
Exemple #15
0
    assert par2.compare_key_value(par1)
    assert par3.compare_key_value(par1)
    par4 = maskParameter(name="Test4", key="-k1", key_value=[2000, 3000])
    par5 = maskParameter(name="Test5", key="-k1", key_value=[3000, 2000])
    assert par4.compare_key_value(par5)
    assert par5.compare_key_value(par4)
    par6 = maskParameter(name="Test6",
                         key="-k1",
                         key_value=["430", "guppi", "puppi"])
    par7 = maskParameter(name="Test7",
                         key="-k1",
                         key_value=["puppi", "guppi", "430"])
    assert par6.compare_key_value(par7)
    assert par7.compare_key_value(par6)


@pytest.mark.parametrize(
    "p",
    [
        boolParameter(name="FISH"),
        intParameter(name="FISH"),
        strParameter(name="FISH"),
        pytest.param(maskParameter(name="JUMP"), ),
        pytest.param(prefixParameter(name="F0"), ),
        pairParameter(name="WEAVE"),
        AngleParameter(name="BEND"),
    ],
)
def test_parameter_can_be_pickled(p):
    pickle.dumps(p)
#
# Note, `Component` class also has the attribute `params`, which is only for the parameters in the component.

# %%
print(tm.components["DispersionDMX"].params)

# %% [markdown]
# ### Add DMX parameters
#
# Since we already have DMX_0001, we will add DMX_0003, just want to show that for DMX model, DMX index('0001' part) does not have to follow the consecutive order.
#
# The prefix type of parameters have to use `prefixParameter` class from `pint.models.parameter` module.
# %%
# Add prefix parameters
dmx_0003 = p.prefixParameter(parameter_type="float",
                             name="DMX_0003",
                             value=None,
                             units=u.pc / u.cm**3)

tm.components["DispersionDMX"].add_param(dmx_0003, setup=True)
# tm.add_param_from_top(dmx_0003, "DispersionDMX", setup=True)
# # Component should given by its name string. use setup=True make sure new parameter get registered.

# %% [markdown]
# ### Check if the parameter and component setup correctly.

# %%
display(tm.params)
display(
    tm.delay_deriv_funcs.keys())  # the derivative function should be added.

# %% [markdown]
Exemple #17
0
    def __init__(self):
        super().__init__()

        self.add_param(
            prefixParameter(
                name="PWSTART_1",
                units="MJD",
                description_template=self._description_solution_epochstart,
                parameter_type="MJD",
                time_scale="tdb",
            ))

        self.add_param(
            prefixParameter(
                name="PWSTOP_1",
                units="MJD",
                description_template=self._description_solution_epochstop,
                parameter_type="MJD",
                time_scale="tdb",
            ))
        self.add_param(
            prefixParameter(
                name="PWEP_1",
                units="MJD",
                description_template=self._description_solution_epoch,
                parameter_type="MJD",
                time_scale="tdb",
            ))
        self.add_param(
            prefixParameter(
                name="PWPH_1",
                units="",
                value=0.0,
                description_template=self._description_solution_startphase,
                type_match="float",
                uncertainty=1,
            ))
        self.add_param(
            prefixParameter(
                name="PWF0_1",
                units="Hz",
                value=0.0,
                description_template=self._description_solution_frequency,
                type_match="float",
            ))
        self.add_param(
            prefixParameter(
                name="PWF1_1",
                units="Hz/s",
                value=0.0,
                description_template=self.
                _description_solution_frequencyderivative,
            ))
        self.add_param(
            prefixParameter(
                name="PWF2_1",
                units="Hz/s^2",
                value=0.0,
                description_template=self.
                _description_solution_secondfrequencyderivative,
            ))

        self.phase_funcs_component += [self.piecewise_phase]
Exemple #18
0
 def __init__(self,):
     super(PulsarBinary, self).__init__()
     self.binary_model_name = None
     self.barycentric_time = None
     self.binary_model_class = None
     self.add_param(
         floatParameter(
             name="PB", units=u.day, description="Orbital period", long_double=True
         )
     )
     self.add_param(
         floatParameter(
             name="PBDOT",
             units=u.day / u.day,
             description="Orbital period derivitve respect to time",
             unit_scale=True,
             scale_factor=1e-12,
             scale_threshold=1e-7,
         )
     )
     self.add_param(
         floatParameter(
             name="A1", units=ls, description="Projected semi-major axis, a*sin(i)"
         )
     )
     # NOTE: the DOT here takes the value and times 1e-12, tempo/tempo2 can
     # take both.
     self.add_param(
         floatParameter(
             name="A1DOT",
             aliases=["XDOT"],
             units=ls / u.s,
             description="Derivative of projected semi-major axis, da*sin(i)/dt",
             unit_scale=True,
             scale_factor=1e-12,
             scale_threshold=1e-7,
         )
     )
     self.add_param(
         floatParameter(
             name="ECC", units="", aliases=["E"], description="Eccentricity"
         )
     )
     self.add_param(
         floatParameter(
             name="EDOT",
             units="1/s",
             description="Eccentricity derivitve respect to time",
             unit_scale=True,
             scale_factor=1e-12,
             scale_threshold=1e-7,
         )
     )
     self.add_param(
         MJDParameter(
             name="T0", description="Epoch of periastron passage", time_scale="tdb"
         )
     )
     self.add_param(
         floatParameter(
             name="OM",
             units=u.deg,
             description="Longitude of periastron",
             long_double=True,
         )
     )
     self.add_param(
         floatParameter(
             name="OMDOT",
             units="deg/year",
             description="Longitude of periastron",
             long_double=True,
         )
     )
     self.add_param(
         floatParameter(
             name="M2",
             units=u.M_sun,
             description="Mass of companian in the unit Sun mass",
         )
     )
     self.add_param(
         floatParameter(
             name="SINI", units="", description="Sine of inclination angle"
         )
     )
     self.add_param(
         prefixParameter(
             name="FB0",
             value=None,
             units="1/s^1",
             description="0th time derivative of frequency of orbit",
             unit_template=self.FBX_unit,
             aliases=["FB"],
             description_template=self.FBX_description,
             type_match="float",
             long_double=True,
         )
     )
     self.interal_params = []
     self.warn_default_params = ["ECC", "OM"]
     # Set up delay function
     self.delay_funcs_component += [self.binarymodel_delay]
Exemple #19
0
    def __init__(self):
        super(PiecewiseSpindown, self).__init__()

        self.add_param(
            prefixParameter(
                name="PWSTART_1",
                units="MJD",
                unit_template=lambda x: "MJD",
                description_template=lambda x: "Epoch of solution piece %d" %
                x,
                parameter_type="MJD",
                time_scale="tdb",
            ))

        self.add_param(
            prefixParameter(
                name="PWSTOP_1",
                units="MJD",
                unit_template=lambda x: "MJD",
                description_template=lambda x: "Epoch of solution piece %d" %
                x,
                parameter_type="MJD",
                time_scale="tdb",
            ))
        self.add_param(
            prefixParameter(
                name="PWEP_1",
                units="MJD",
                unit_template=lambda x: "MJD",
                description_template=lambda x: "Epoch of solution piece %d" %
                x,
                parameter_type="MJD",
                time_scale="tdb",
            ))
        self.add_param(
            prefixParameter(
                name="PWPH_1",
                units="",
                value=0.0,
                description_template=lambda x:
                "Starting phase of solution piece %d" % x,
                unit_template=lambda x: "",
                type_match="float",
                uncertainty=1,
            ))
        self.add_param(
            prefixParameter(
                name="PWF0_1",
                units="Hz",
                value=0.0,
                description_template=lambda x: "Frequency of solution piece %d"
                % x,
                unit_template=lambda x: "Hz",
                type_match="float",
            ))
        self.add_param(
            prefixParameter(
                name="PWF1_1",
                units="Hz/s",
                value=0.0,
                description_template=lambda x:
                "Frequency-derivative of solution piece"
                " %d " % x,
                unit_template=lambda x: "Hz/s",
            ))
        self.add_param(
            prefixParameter(
                name="PWF2_1",
                units="Hz/s^2",
                value=0.0,
                description_template=lambda x: "Second frequency-"
                "derivative of solution piece"
                " %d " % x,
                unit_template=lambda x: "Hz/s^2",
            ))

        self.phase_funcs_component += [self.piecewise_phase]