diff --git a/AUTHORS.rst b/AUTHORS.rst index 3769f4853..07bbac26c 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -16,11 +16,12 @@ Contributors Active developers are indicated by (*). Authors of the PINT paper are indicated by (#). +* Gabriella Agazie (*) * Akash Anumarlapudi (*) * Anne Archibald (#*) * Matteo Bachetti (#) * Bastian Beischer -* Deven Bhakta +* Deven Bhakta (*) * Chloe Champagne (#) * Jonathan Colen (#) * Thankful Cromartie @@ -28,6 +29,7 @@ Active developers are indicated by (*). Authors of the PINT paper are indicated * Paul Demorest (#) * Julia Deneva * Justin Ellis +* William Fiore (*) * Fabian Jankowski * Rick Jenet (#) * Ross Jennings (#*) diff --git a/CHANGELOG-unreleased.md b/CHANGELOG-unreleased.md index cdd971e4f..726dfaef5 100644 --- a/CHANGELOG-unreleased.md +++ b/CHANGELOG-unreleased.md @@ -9,23 +9,17 @@ the released changes. ## Unreleased ### Changed -- Applied `sourcery` refactors to the entire codebase -- Changed threshold for `test_model_derivatives` test to avoid CI failures -- Unreleased CHANGELOG entries should now be entered in `CHANGELOG-unreleased.md` instead of `CHANGELOG.md`. Updated documentation accordingly. +- `WAVE` parameters can be added to a `Wave` model with `add_wave_component()` in `wave.py` +- Moved design matrix normalization code from `pint.fitter` to the new `pint.utils.normalize_designmatrix()` function. +- Made `Residuals` independent of `GLSFitter` (GLS chi2 is now computed using the new function `Residuals._calc_gls_chi2()`). ### Added -- `SpindownBase` as the abstract base class for `Spindown` and `PeriodSpindown` in the `How_to_build_a_timing_model_component.py` example. -- `SolarWindDispersionBase` as the abstract base class for solar wind dispersion components. -- `validate_component_types` method for more rigorous validation of timing model components. -- roundtrip test to make sure clock corrections are not written to tim files -- `calc_phase_mean` and `calc_time_mean` methods in `Residuals` class to compute the residual mean. -- - `PhaseOffset` component (overall phase offset between physical and TZR toas) -- `tzr` attribute in `TOAs` class to identify TZR TOAs -- Documentation: Explanation for offsets -- Example: `phase_offset_example.py` -- method `AllComponents.param_to_unit` to get units for any parameter, and then made function `utils.get_unit` -- can override/add parameter values when reading models -- docs now include list of observatories along with google maps links and clock files +- Added `WaveX` model as a `DelayComponent` with Fourier amplitudes as fitted parameters ### Fixed -- fixed docstring for `add_param_from_top` -- Gridded calculations now respect logger settings -### Removed \ No newline at end of file +- Wave model `validate()` can correctly use PEPOCH to assign WAVEEPOCH parameter +- Fixed RTD by specifying theme explicitly. +- `.value()` now works for pairParameters +- Setting `model.PARAM1 = model.PARAM2` no longer overrides the name of `PARAM1` +- Fixed an incorrect docstring in `pbprime()` functions. +- Fix ICRS -> ECL conversion when parameter uncertainties are not set. +- `get_TOAs` raises an exception upon finding mixed narrowband and wideband TOAs in a tim file. `TOAs.is_wideband` returns True only if *ALL* TOAs have the -pp_dm flag. +### Removed diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c2067855..80b59fade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,57 @@ and this project, at least loosely, adheres to [Semantic Versioning](https://sem This file contains the released changes to the codebase. See CHANGELOG-unreleased.md for the unreleased changes. This file should only be changed while tagging a new version. +## [0.9.7] 2023-08-24 +### Changed +- Third-order Roemer delay terms to ELL1 model +- Made the addition of a TZR TOA (`AbsPhase`) in the `TimingModel` explicit in `Residuals` class. +- Updated `CONTRIBUTING.rst` with the latest information. +- Made `TimingModel.params` and `TimingModel.ordered_params` identical. Deprecated `TimingModel.ordered_params`. +### Added +- Third-order Roemer delay terms to ELL1 model +- Options to add a TZR TOA (`AbsPhase`) during the creation of a `TimingModel` using `ModelBuilder.__call__`, `get_model`, and `get_model_and_toas` +- `pint.print_info()` function for bug reporting +- Added an autocorrelation function to check for chain convergence in `event_optimize` +- A hacky implementation of system-dependent FD parameters (FDJUMP) +- Minor doc updates to explain default NHARMS and missing derivative functions +### Fixed +- Deleting JUMP1 from flag tables will not prevent fitting +- Simulating TOAs from tim file when PLANET_SHAPIRO is true now works +- Docstrings for `get_toas()` and `get_model_and_toas()` +- Set `DelayComponent_list` and `NoiseComponent_list` to empty list if such components are absent +- Fix invalid access of `PLANET_SHAPIRO` in models without `Astrometry` +### Removed + + +## [0.9.6] 2023-06-22 +### Changed +- Applied `sourcery` refactors to the entire codebase +- Changed threshold for `test_model_derivatives` test to avoid CI failures +- Unreleased CHANGELOG entries should now be entered in `CHANGELOG-unreleased.md` instead of `CHANGELOG.md`. Updated documentation accordingly. +- Changed tests to remove `unittest` and use pure pytest format +- Changed deprecated `sampler.chain` usage +- Download data automatically in the profiling script `high_level_benchmark.py` instead of silently giving wrong results. +### Added +- `SpindownBase` as the abstract base class for `Spindown` and `PeriodSpindown` in the `How_to_build_a_timing_model_component.py` example. +- `SolarWindDispersionBase` as the abstract base class for solar wind dispersion components. +- `validate_component_types` method for more rigorous validation of timing model components. +- roundtrip test to make sure clock corrections are not written to tim files +- `calc_phase_mean` and `calc_time_mean` methods in `Residuals` class to compute the residual mean. +- `PhaseOffset` component (overall phase offset between physical and TZR toas) +- `tzr` attribute in `TOAs` class to identify TZR TOAs +- Documentation: Explanation for offsets +- Example: `phase_offset_example.py` +- method `AllComponents.param_to_unit` to get units for any parameter, and then made function `utils.get_unit` +- can override/add parameter values when reading models +- docs now include list of observatories along with google maps links and clock files +### Fixed +- fixed docstring for `add_param_from_top` +- Gridded calculations now respect logger settings +- Event TOAs now have default error that is non-zero, and can set as desired +- Model conversion ICRS <-> ECL works if PM uncertainties are not set +- Fix `merge_TOAs()` to allow lists of length 1 +### Removed + ## [0.9.5] 2023-05-01 ### Changed - Changed minimum supported version of `scipy` to 1.4.1 diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 968f8a891..f20ad9483 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -20,8 +20,9 @@ Report bugs at https://github.com/nanograv/pint/issues. If you are reporting a bug, please include: -* Your operating system name and version. -* The output of ``pint.__version__`` and ``pint.__file__`` +* The output of ``pint.print_info()``. This command provides the version information of + the OS, Python, PINT, and the various dependencies along with other information about + your system. * Any details about your local setup that might be helpful in troubleshooting, such as the command used to install PINT and whether you are using a virtualenv, conda environment, etc. @@ -76,22 +77,37 @@ to write good documentation, you come to understand the code very well. Get Started! ------------ -Ready to contribute? Here's how to set up PINT for local development. +Ready to contribute? Here's how to set up `PINT` for local development. -1. Fork_ the ``pint`` repo on GitHub. +1. Fork_ the `PINT` repo on GitHub. 2. Clone your fork locally:: $ git clone git@github.com:your_name_here/pint.git -3. Install your local copy into a virtualenv. Assuming you have - virtualenvwrapper installed, this is how you set up your fork for local +3. Install your local copy into a `conda`_ environment. Assuming you have + `conda` installed, this is how you set up your fork for local development:: - $ mkvirtualenv pint + $ conda create -n pint-devel python=3.10 + $ conda activate pint-devel + $ cd PINT/ + $ conda install -c conda-forge --file requirements_dev.txt + $ conda install -c conda-forge --file requirements.txt + $ pip install -e . + $ pre-commit install + + The last command installs pre-commit hooks which will squawk at you while trying + to commit changes that don't adhere to our `Coding Style`_. + + Alternatively, this can also be done using `virtualenv`. Assuming you have + `virtualenvwrapper` installed, this is how you set up your fork for local + development:: + + $ mkvirtualenv pint-devel $ cd PINT/ $ pip install -r requirements_dev.txt - $ pip install -r requirements.txt $ pip install -e . + $ pre-commit install 4. Create a branch for local development:: @@ -109,13 +125,13 @@ Ready to contribute? Here's how to set up PINT for local development. 6. Commit your changes and push your branch to GitHub:: $ git add . - $ git commit -m "Your detailed description of your changes." + $ git commit -m "Detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature 7. Submit a pull request through the GitHub website. -8. Check that our automatic testing "Travis CI" passes your code. If - problems crop up, fix them, commit the changes, and push a new version, +8. Check that our automatic testing in "GitHub Actions" passes for your code. + If problems crop up, fix them, commit the changes, and push a new version, which will automatically update the pull request:: $ git add pint/file-i-just-fixed.py @@ -127,13 +143,14 @@ Ready to contribute? Here's how to set up PINT for local development. functional changes. If accepted, it will be merged into the master branch. .. _Fork: https://help.github.com/en/articles/fork-a-repo +.. _`conda`: https://docs.conda.io/ Pull Request Guidelines ----------------------- Before you submit a pull request, check that it meets these guidelines: -1. Try to write clear :ref:`pythonic` code, follow our :ref:`CodingStyle`, and think +1. Try to write clear `Pythonic`_ code, follow our `Coding Style`_, and think about how others might use your new code. 2. The pull request should include tests that cover both the expected behavior and sensible error reporting when given bad input. @@ -141,8 +158,13 @@ Before you submit a pull request, check that it meets these guidelines: be updated. Put your new functionality into a function with a docstring. Check the HTML documentation produced by ``make docs`` to make sure your new documentation appears and looks reasonable. + If the new functionality needs a more detailed explanation than can be + put in a docstring, add it to ``docs/explanation.rst``. Make sure that + the docstring contains a brief description as well. 4. The pull request should work for and 3.8+. Make sure that all the CI tests for the pull request pass. -5. Update `CHANGELOG-unreleased.md` with an appropriate entry. Please note - that `CHANGELOG.md` should not be updated for pull requests. +5. Update ``CHANGELOG-unreleased.md`` with an appropriate entry. Please note + that ``CHANGELOG.md`` should not be updated for pull requests. +.. _`Pythonic`: https://peps.python.org/pep-0008/ +.. _`Coding Style`: https://nanograv-pint.readthedocs.io/en/latest/coding-style.html \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 56c379396..6a0476968 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -182,8 +182,10 @@ def setup(app): # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. on_rtd = os.environ.get("READTHEDOCS", None) == "True" -if not on_rtd: # only import and set the theme if we're building docs locally - html_theme = "sphinx_rtd_theme" +# if not on_rtd: # only import and set the theme if we're building docs locally +# html_theme = "sphinx_rtd_theme" +# it seems that we need to specify it anyway +html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a # theme further. For a list of options available for each theme, see the diff --git a/docs/examples/MCMC_walkthrough.broken b/docs/examples/MCMC_walkthrough.broken index 4bc55a9ec..bb910e1b6 100644 --- a/docs/examples/MCMC_walkthrough.broken +++ b/docs/examples/MCMC_walkthrough.broken @@ -127,7 +127,8 @@ To make this run relatively fast for demonstration purposes, nsteps was purposef ```python fitter.phaseogram() -samples = sampler.sampler.chain[:, 10:, :].reshape((-1, fitter.n_fit_params)) +samples = np.transpose(sampler.sampler.get_chain(discard=10), (1, 0, 2)).reshape( + (-1, fitter.n_fit_params)) ranges = map( lambda v: (v[1], v[2] - v[1], v[1] - v[0]), zip(*np.percentile(samples, [16, 50, 84], axis=0)), @@ -192,7 +193,7 @@ fitter2.fit_toas(maxiter=nsteps2, pos=None) ``` ```python -samples2 = sampler2.sampler.chain[:, :, :].reshape((-1, fitter2.n_fit_params)) +samples2 = np.transpose(sampler2.sampler.get_chain(), (1, 0, 2)).reshape((-1, fitter2.n_fit_params)) ranges2 = map( lambda v: (v[1], v[2] - v[1], v[1] - v[0]), zip(*np.percentile(samples2, [16, 50, 84], axis=0)), diff --git a/docs/examples/fit_NGC6440E_MCMC.py b/docs/examples/fit_NGC6440E_MCMC.py index 9615c2a14..ea4fa718c 100644 --- a/docs/examples/fit_NGC6440E_MCMC.py +++ b/docs/examples/fit_NGC6440E_MCMC.py @@ -87,8 +87,9 @@ def plot_chains(chain_dict, file=False): plot_chains(chains, file=f"{f.model.PSR.value}_chains.png") # triangle plot -# this doesn't include burn-in because we're not using it here, otherwise would have middle ':' --> 'burnin:' -samples = sampler.sampler.chain[:, :, :].reshape((-1, f.n_fit_params)) +# this doesn't include burn-in because we're not using it here, otherwise set get_chain(discard=burnin) +# samples = sampler.sampler.chain[:, :, :].reshape((-1, f.n_fit_params)) +samples = np.transpose(sampler.get_chain(), (1, 0, 2)).reshape((-1, ndim)) with contextlib.suppress(ImportError): import corner diff --git a/docs/examples/understanding_fitters.py b/docs/examples/understanding_fitters.py index 9908c7d55..8647386a3 100644 --- a/docs/examples/understanding_fitters.py +++ b/docs/examples/understanding_fitters.py @@ -144,7 +144,7 @@ # straightforward but the full covariance matrix may be enormous. # If False, an algorithm is used that takes advantage of the structure # of the covariance matrix, based on information provided by the noise -# model. The two algorithms should give the same result to numerical +# model. The two algorithms should give the same result up to numerical # accuracy where they both can be applied. # %% [markdown] @@ -178,11 +178,6 @@ # %% glsfit.fit_toas(maxiter=1) -# %% -# Not sure how to do this properly yet. -# glsfit2 = pint.fitter.GLSFitter(toas=t, model=glsfit.model, residuals=glsfit.resids) -# glsfit2.fit_toas(maxiter=0) - # %% glsfit.print_summary() @@ -206,7 +201,8 @@ # %% [markdown] # ## Choosing fitters # -# You can use the automatic fitter selection to help you choose between `WLSFitter`, `GLSFitter`, and their wideband variants. The default `Downhill` fitters generally have better performance than the plain variants. +# You can use the automatic fitter selection to help you choose between `WLSFitter`, `GLSFitter`, and their wideband variants. +# The default `Downhill` fitters generally have better performance than the plain variants. # %% autofit = pint.fitter.Fitter.auto(toas=ts1855, model=m1855) @@ -221,4 +217,5 @@ # The results are (thankfully) identical. # %% [markdown] -# The MCMC fitter is considerably more complicated, so it has its own dedicated walkthroughs in `MCMC_walkthrough.ipynb` (for photon data) and `examples/fit_NGC6440E_MCMC.py` (for fitting TOAs). +# The MCMC fitter is considerably more complicated, so it has its own dedicated walkthroughs in `MCMC_walkthrough.ipynb` +# (for photon data) and `examples/fit_NGC6440E_MCMC.py` (for fitting TOAs). diff --git a/docs/explanation.rst b/docs/explanation.rst index 432aac8e3..d7df0766e 100644 --- a/docs/explanation.rst +++ b/docs/explanation.rst @@ -16,8 +16,6 @@ you will find PINT sufficient for all your needs! .. _TEMPO: http://tempo.sourceforge.net/ .. _TEMPO2: https://www.atnf.csiro.au/research/pulsar/tempo2/ -.. sectnum:: - Time ---- @@ -718,13 +716,16 @@ model and data require different calculations - narrowband (TOA-only) versus wideband (TOA and DM measurements) and uncorrelated errors versus correlated errors. -The TEMPO/TEMPO2 and default PINT fitting algorithms (:class:`pint.fitter.WidebandTOAFitter` for example), leaving aside the rank-reduced case, proceed like: +The TEMPO/TEMPO2 and default PINT fitting algorithms (:class:`pint.fitter.WidebandTOAFitter`, for example), +leaving aside the rank-reduced case, proceed like: 1. Evaluate the model and its derivatives at the starting point :math:`x`, producing a set of residuals :math:`\delta y` and a Jacobian `M`. 2. Compute :math:`\delta x` to minimize :math:`\left| M\delta x - \delta y \right|_C`, where :math:`\left| \cdot \right|_C` is the squared amplitude of a vector with respect to the data uncertainties/covariance :math:`C`. 3. Update the starting point by :math:`\delta x`. -TEMPO and TEMPO2 can check whether the predicted improvement of chi-squared, assuming the linear model is correct, is enough to warrant continuing; if so, they jump back to step 1 unless the maximum number of iterations is reached. PINT does not contain this check. +TEMPO and TEMPO2 can check whether the predicted improvement of chi-squared, assuming +the linear model is correct, is enough to warrant continuing; if so, they jump back to +step 1 unless the maximum number of iterations is reached. PINT does not contain this check. This algorithm is the Gauss-Newton_algorithm_ for solving nonlinear least-squares problems, and even in one-complex-dimensional cases can exhibit @@ -746,9 +747,16 @@ PINT contains a slightly more sophisticated algorithm, implemented in 4. Evaluate the model at the starting point plus :math:`\lambda \delta x`. If this is invalid or worse than the starting point, divide :math:`\lambda` by two and repeat this step. If :math:`\lambda` is too small, accept the best point seen to date and exit without convergence. 5. If the model improved but only slightly with :math:`\lambda=1`, exit with convergence. If the maximum number of iterations was reached, exit without convergence. Otherwise update the starting point and return to step 1. -This ensures that PINT tries taking smaller steps if problems arise, and claims convergence only if a normal step worked. It does not solve the problems that arise if some parameters are nearly degenerate, enough to cause problems with the numerical linear algebra. +This ensures that PINT tries taking smaller steps if problems arise, and claims convergence +only if a normal step worked. It does not solve the problems that arise if some parameters are +nearly degenerate, enough to cause problems with the numerical linear algebra. -As a rule, this kind of problem is addressed with the Levenberg-Marquardt algorithm, which operates on the same principle of taking reduced steps when the derivative appears not to match the function, but does so in a way that also reduces issues with degenerate parameters; unfortunately it is not clear how to adapt this problem to the rank-reduced case. Nevertheless PINT contains an implementation, in :class:`pint.fitter.WidebandLMFitter`, but it does not perform as well as one might hope in practice and must be considered experimental. +As a rule, this kind of problem is addressed with the Levenberg-Marquardt algorithm, which +operates on the same principle of taking reduced steps when the derivative appears not to +match the function, but does so in a way that also reduces issues with degenerate parameters; +unfortunately it is not clear how to adapt this problem to the rank-reduced case. Nevertheless, +PINT contains an implementation in :class:`pint.fitter.WidebandLMFitter`, but it does not perform as +well as one might hope in practice and must be considered experimental. .. _Gauss-Newton_algorithm: https://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm .. _chaotic: https://en.wikipedia.org/wiki/Newton_fractal diff --git a/profiling/.gitignore b/profiling/.gitignore new file mode 100644 index 000000000..f07669415 --- /dev/null +++ b/profiling/.gitignore @@ -0,0 +1,2 @@ +J0740+6620.cfr+19.tim +bench_*_summary \ No newline at end of file diff --git a/profiling/high_level_benchmark.py b/profiling/high_level_benchmark.py index 9049b7926..d9c8ad5d2 100644 --- a/profiling/high_level_benchmark.py +++ b/profiling/high_level_benchmark.py @@ -16,6 +16,7 @@ import sys import os import platform +import urllib.request from prfparser import parse_file @@ -67,11 +68,19 @@ def get_results(script, outfile): parser = argparse.ArgumentParser( description="High-level summary of python file timing." ) + + if not os.path.isfile("J0740+6620.cfr+19.tim"): + print("Downloading data file J0740+6620.cfr+19.tim ...") + urllib.request.urlretrieve( + "https://data.nanograv.org/static/data/J0740+6620.cfr+19.tim", + "J0740+6620.cfr+19.tim", + ) + + script1 = "bench_load_TOAs.py" script2 = "bench_chisq_grid.py" script3 = "bench_chisq_grid_WLSFitter.py" script4 = "bench_MCMC.py" - script1 = "bench_load_TOAs.py" # time scripts output1 = bench_file(script1) output2 = bench_file(script2) diff --git a/requirements_dev.txt b/requirements_dev.txt index 54cdeeab1..a00511840 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -3,10 +3,10 @@ pip>=9.0.1 setuptools>=41.0 coverage>=4.3.4 traitlets -Sphinx>=2.2,!=5.1.0 +Sphinx==6.2.1 astropy>=4.0,!=4.0.1,!=4.0.1.post1 #astropy-helpers>=1.3 -sphinx-rtd-theme>=1.1.1 +sphinx-rtd-theme==1.2.2 coveralls>=1.1 wheel>=0.29.0 pytest>=4.3 diff --git a/src/pint/__init__.py b/src/pint/__init__.py index 5f9acd0b9..f2bb62790 100644 --- a/src/pint/__init__.py +++ b/src/pint/__init__.py @@ -24,6 +24,7 @@ from pint.pulsar_ecliptic import PulsarEcliptic from pint.pulsar_mjd import PulsarMJD, time_to_longdouble # ensure always loaded +from pint.utils import info_string __all__ = [ "__version__", @@ -109,3 +110,8 @@ raise ValueError( f"astropy version must be >=4 (currently it is {astropy.version.major})" ) + + +def print_info(): + """Print the OS version, Python version, PINT version, versions of the dependencies etc.""" + print(info_string(detailed=True)) diff --git a/src/pint/binaryconvert.py b/src/pint/binaryconvert.py index 2b46e5cd2..b23b36fb7 100644 --- a/src/pint/binaryconvert.py +++ b/src/pint/binaryconvert.py @@ -560,6 +560,10 @@ def convert_binary(model, output, NHARMS=3, useSTIGMA=False, KOM=0 * u.deg): Returns ------- outmodel : pint.models.timing_model.TimingModel + + Notes + ----- + Default value in `pint` for `NHARMS` is 7, while in `tempo2` it is 4. """ # Do initial checks if output not in binary_types: diff --git a/src/pint/event_toas.py b/src/pint/event_toas.py index 3f1fc112c..a2768d4c9 100644 --- a/src/pint/event_toas.py +++ b/src/pint/event_toas.py @@ -1,15 +1,55 @@ -"""Generic function to load TOAs from events files.""" +"""Generic functions to load TOAs from events files, along with specific implementations for different missions. +The versions that look like ``get_..._TOAs()`` are preferred: the others are retained for backward compatibility. + +**Instrument-specific Functions** + +.. autofunction:: pint.event_toas.get_NuSTAR_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.get_NICER_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.get_RXTE_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.get_IXPE_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.get_Swift_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.get_XMM_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_NuSTAR_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_NICER_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_RXTE_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_IXPE_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_Swift_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) +.. autofunction:: pint.event_toas.load_XMM_TOAs(eventname [, minmjd, maxmjd, errors, ephem, planets]) + +""" import os +from functools import partial import astropy.io.fits as pyfits from astropy.time import Time from astropy.coordinates import EarthLocation +from astropy import units as u import numpy as np from loguru import logger as log import pint.toa as toa from pint.fits_utils import read_fits_event_mjds_tuples +""" +Default TOA (event) uncertainty depending on facility + +* RXTE: https://ui.adsabs.harvard.edu/abs/1998ApJ...501..749R/abstract +* IXPE: https://ui.adsabs.harvard.edu/abs/2019SPIE11118E..0VO/abstract +* XMM: https://ui.adsabs.harvard.edu/abs/2012A%26A...545A.126M/abstract +* NuSTAR: https://ui.adsabs.harvard.edu/abs/2021ApJ...908..184B/abstract +* Swift: https://ui.adsabs.harvard.edu/abs/2005SPIE.5898..377C/abstract +* NICER: https://heasarc.gsfc.nasa.gov/docs/nicer/mission_guide/ +""" +_default_uncertainty = { + "NICER": 0.1 * u.us, + "RXTE": 2.5 * u.us, + "IXPE": 20 * u.us, + "XMM": 48 * u.us, + "NuSTAR": 65 * u.us, + "Swift": 300 * u.us, + "default": 1 * u.us, +} + __all__ = [ "load_fits_TOAs", @@ -210,6 +250,7 @@ def load_fits_TOAs( timeref=None, minmjd=-np.inf, maxmjd=np.inf, + errors=_default_uncertainty, ): """ Read photon event times out of a FITS file as a list of PINT :class:`~pint.toa.TOA` objects. @@ -239,6 +280,9 @@ def load_fits_TOAs( minimum MJD timestamp to return maxmjd : float, default "infinity" maximum MJD timestamp to return + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -261,6 +305,7 @@ def load_fits_TOAs( timeref=timeref, minmjd=minmjd, maxmjd=maxmjd, + errors=errors, ) return toas.to_TOA_list() @@ -279,6 +324,7 @@ def get_fits_TOAs( planets=False, include_bipm=False, include_gps=False, + errors=_default_uncertainty["default"], ): """ Read photon event times out of a FITS file as :class:`pint.toa.TOAs` object @@ -318,6 +364,9 @@ def get_fits_TOAs( Use TT(BIPM) instead of TT(TAI) include_gps : bool, optional Apply GPS to UTC clock corrections + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -367,6 +416,9 @@ def get_fits_TOAs( if weights is not None: new_kwargs["weights"] = weights + if not isinstance(errors, u.Quantity): + errors = errors * u.microsecond + # mask out times/columns outside of mjd range mjds_float = np.asarray([r[0] + r[1] for r in mjds]) idx = (minmjd < mjds_float) & (mjds_float < maxmjd) @@ -394,16 +446,23 @@ def get_fits_TOAs( return toa.get_TOAs_array( t, obs, - errors=0, include_gps=include_gps, include_bipm=include_bipm, planets=planets, ephem=ephem, flags=flags, + errors=errors, ) -def load_event_TOAs(eventname, mission, weights=None, minmjd=-np.inf, maxmjd=np.inf): +def load_event_TOAs( + eventname, + mission, + weights=None, + minmjd=-np.inf, + maxmjd=np.inf, + errors=_default_uncertainty["default"], +): """ Read photon event times out of a FITS file as PINT :class:`~pint.toa.TOA` objects. @@ -426,6 +485,9 @@ def load_event_TOAs(eventname, mission, weights=None, minmjd=-np.inf, maxmjd=np. minimum MJD timestamp to return maxmjd : float, default "infinity" maximum MJD timestamp to return + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -453,6 +515,7 @@ def load_event_TOAs(eventname, mission, weights=None, minmjd=-np.inf, maxmjd=np. extension=extension, minmjd=minmjd, maxmjd=maxmjd, + errors=errors, ) @@ -466,6 +529,7 @@ def get_event_TOAs( planets=False, include_bipm=False, include_gps=False, + errors=_default_uncertainty["default"], ): """ Read photon event times out of a FITS file as a :class:`pint.toa.TOAs` object @@ -499,6 +563,9 @@ def get_event_TOAs( Use TT(BIPM) instead of TT(TAI) include_gps : bool, optional Apply GPS to UTC clock corrections + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -523,182 +590,13 @@ def get_event_TOAs( planets=planets, include_bipm=include_bipm, include_gps=include_gps, + errors=errors, ) -def load_RXTE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a RXTE file as PINT :class:`~pint.toa.TOA` objects. - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - - Returns - ------- - toalist : list of :class:`~pint.toa.TOA` objects - - Note - ---- - This list should be converted into a :class:`~pint.toa.TOAs` object with :func:`pint.toa.get_TOAs_list` for most operations - - See Also - -------- - :func:`get_RXTE_TOAs` - """ - return load_event_TOAs(eventname, "xte", minmjd=minmjd, maxmjd=maxmjd) - - -def load_NICER_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a NICER file as PINT :class:`~pint.toa.TOA` objects. - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - - Returns - ------- - toalist : list of :class:`~pint.toa.TOA` objects - - Note - ---- - This list should be converted into a :class:`~pint.toa.TOAs` object with :func:`pint.toa.get_TOAs_list` for most operations - - See Also - -------- - :func:`get_NICER_TOAs` - """ - return load_event_TOAs(eventname, "nicer", minmjd=minmjd, maxmjd=maxmjd) - - -def load_IXPE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a IXPE file as PINT :class:`~pint.toa.TOA` objects. - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - - Returns - ------- - toalist : list of :class:`~pint.toa.TOA` objects - - Note - ---- - This list should be converted into a :class:`~pint.toa.TOAs` object with :func:`pint.toa.get_TOAs_list` for most operations - - See Also - -------- - :func:`get_IXPE_TOAs` - """ - return load_event_TOAs(eventname, "ixpe", minmjd=minmjd, maxmjd=maxmjd) - - -def load_XMM_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a XMM file as PINT :class:`~pint.toa.TOA` objects. - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - - Returns - ------- - toalist : list of :class:`~pint.toa.TOA` objects - - Note - ---- - This list should be converted into a :class:`~pint.toa.TOAs` object with :func:`pint.toa.get_TOAs_list` for most operations - - See Also - -------- - :func:`get_XMM_TOAs` - """ - return load_event_TOAs(eventname, "xmm", minmjd=minmjd, maxmjd=maxmjd) - - -def load_NuSTAR_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a NuSTAR file as PINT :class:`~pint.toa.TOA` objects. - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - - Returns - ------- - toalist : list of :class:`~pint.toa.TOA` objects - - Note - ---- - This list should be converted into a :class:`~pint.toa.TOAs` object with :func:`pint.toa.get_TOAs_list` for most operations - - See Also - -------- - :func:`get_NuSTAR_TOAs` - """ - return load_event_TOAs(eventname, "nustar", minmjd=minmjd, maxmjd=maxmjd) - - -def load_Swift_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): - """ - Read photon event times out of a Swift file as PINT :class:`~pint.toa.TOA` objects. +# generic docstring for these functions +_load_event_docstring = """ + Read photon event times out of a {} file as PINT :class:`~pint.toa.TOA` objects. Correctly handles raw event files, or ones processed with axBary to have barycentered TOAs. Different conditions may apply to different missions. @@ -714,6 +612,9 @@ def load_Swift_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): minimum MJD timestamp to return maxmjd : float, default "infinity" maximum MJD timestamp to return + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -725,82 +626,43 @@ def load_Swift_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf): See Also -------- - :func:`get_Swift_TOAs` - """ - return load_event_TOAs(eventname, "swift", minmjd=minmjd, maxmjd=maxmjd) - - -def get_RXTE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False): + :func:`get_{}_TOAs` + :func:`load_event_TOAs` """ - Read photon event times out of a RXTE file as a :class:`pint.toa.TOAs` object - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. +load_RXTE_TOAs = partial( + load_event_TOAs, mission="xte", errors=_default_uncertainty["RXTE"] +) +load_RXTE_TOAs.__doc__ = _load_event_docstring.format("RXTE", "RXTE") - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. +load_NICER_TOAs = partial( + load_event_TOAs, mission="nicer", errors=_default_uncertainty["NICER"] +) +load_NICER_TOAs.__doc__ = _load_event_docstring.format("NICER", "NICER") - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - ephem : str, optional - The name of the solar system ephemeris to use; defaults to "DE421". - planets : bool, optional - Whether to apply Shapiro delays based on planet positions. Note that a - long-standing TEMPO2 bug in this feature went unnoticed for years. - Defaults to False. - - Returns - ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "xte", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) - - -def get_NICER_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False): - """ - Read photon event times out of a NICER file as a :class:`pint.toa.TOAs` object - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. +load_IXPE_TOAs = partial( + load_event_TOAs, mission="ixpe", errors=_default_uncertainty["IXPE"] +) +load_IXPE_TOAs.__doc__ = _load_event_docstring.format("IXPE", "IXPE") - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - ephem : str, optional - The name of the solar system ephemeris to use; defaults to "DE421". - planets : bool, optional - Whether to apply Shapiro delays based on planet positions. Note that a - long-standing TEMPO2 bug in this feature went unnoticed for years. - Defaults to False. +load_XMM_TOAs = partial( + load_event_TOAs, mission="xmm", errors=_default_uncertainty["XMM"] +) +load_XMM_TOAs.__doc__ = _load_event_docstring.format("XMM", "XMM") - Returns - ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "nicer", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) +load_NuSTAR_TOAs = partial( + load_event_TOAs, mission="nustar", errors=_default_uncertainty["NuSTAR"] +) +load_NuSTAR_TOAs.__doc__ = _load_event_docstring.format("NuSTAR", "NuSTAR") +load_Swift_TOAs = partial( + load_event_TOAs, mission="swift", errors=_default_uncertainty["Swift"] +) +load_Swift_TOAs.__doc__ = _load_event_docstring.format("Swift", "Swift") -def get_IXPE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False): - """ - Read photon event times out of a IXPE file as a :class:`pint.toa.TOAs` object +# generic docstring for these functions +_get_event_docstring = """ + Read photon event times out of a {} file as a :class:`pint.toa.TOAs` object Correctly handles raw event files, or ones processed with axBary to have barycentered TOAs. Different conditions may apply to different missions. @@ -816,6 +678,9 @@ def get_IXPE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets= minimum MJD timestamp to return maxmjd : float, default "infinity" maximum MJD timestamp to return + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds ephem : str, optional The name of the solar system ephemeris to use; defaults to "DE421". planets : bool, optional @@ -825,112 +690,39 @@ def get_IXPE_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets= Returns ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "ixpe", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) - - -def get_XMM_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False): - """ - Read photon event times out of a XMM file as a :class:`pint.toa.TOAs` object - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. + pint.toa.TOAs - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - ephem : str, optional - The name of the solar system ephemeris to use; defaults to "DE421". - planets : bool, optional - Whether to apply Shapiro delays based on planet positions. Note that a - long-standing TEMPO2 bug in this feature went unnoticed for years. - Defaults to False. - - Returns - ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "xmm", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) - - -def get_NuSTAR_TOAs( - eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False -): - """ - Read photon event times out of a NuSTAR file as a :class:`pint.toa.TOAs` object - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - ephem : str, optional - The name of the solar system ephemeris to use; defaults to "DE421". - planets : bool, optional - Whether to apply Shapiro delays based on planet positions. Note that a - long-standing TEMPO2 bug in this feature went unnoticed for years. - Defaults to False. - - Returns - ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "nustar", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) - - -def get_Swift_TOAs(eventname, minmjd=-np.inf, maxmjd=np.inf, ephem=None, planets=False): - """ - Read photon event times out of a Swift file as a :class:`pint.toa.TOAs` object - - Correctly handles raw event files, or ones processed with axBary to have - barycentered TOAs. Different conditions may apply to different missions. - - The minmjd/maxmjd parameters can be used to avoid instantiation of TOAs - we don't want, which can otherwise be very slow. - - Parameters - ---------- - eventname : str - File name of the FITS event list - minmjd : float, default "-infinity" - minimum MJD timestamp to return - maxmjd : float, default "infinity" - maximum MJD timestamp to return - ephem : str, optional - The name of the solar system ephemeris to use; defaults to "DE421". - planets : bool, optional - Whether to apply Shapiro delays based on planet positions. Note that a - long-standing TEMPO2 bug in this feature went unnoticed for years. - Defaults to False. - - Returns - ------- - pint.toa.TOAs - """ - return get_event_TOAs( - eventname, "swift", minmjd=minmjd, maxmjd=maxmjd, ephem=ephem, planets=planets - ) + See Also + -------- + :func:`get_event_TOAs` + """ + +get_RXTE_TOAs = partial( + get_event_TOAs, mission="xte", errors=_default_uncertainty["RXTE"] +) +get_RXTE_TOAs.__doc__ = _get_event_docstring.format("RXTE") + +get_NICER_TOAs = partial( + get_event_TOAs, mission="nicer", errors=_default_uncertainty["NICER"] +) +get_NICER_TOAs.__doc__ = _get_event_docstring.format("NICER") + +get_IXPE_TOAs = partial( + get_event_TOAs, mission="ixpe", errors=_default_uncertainty["IXPE"] +) +get_IXPE_TOAs.__doc__ = _get_event_docstring.format("IXPE") + +get_XMM_TOAs = partial( + get_event_TOAs, mission="xmm", errors=_default_uncertainty["XMM"] +) +get_XMM_TOAs.__doc__ = _get_event_docstring.format("XMM") + +get_NuSTAR_TOAs = partial( + get_event_TOAs, mission="nustar", errors=_default_uncertainty["NuSTAR"] +) +get_NuSTAR_TOAs.__doc__ = _get_event_docstring.format("NuSTAR") + +get_Swift_TOAs = partial( + get_event_TOAs, mission="swift", errors=_default_uncertainty["Swift"] +) +get_Swift_TOAs.__doc__ = _get_event_docstring.format("Swift") diff --git a/src/pint/fermi_toas.py b/src/pint/fermi_toas.py index 183cbf60c..00b2f8671 100644 --- a/src/pint/fermi_toas.py +++ b/src/pint/fermi_toas.py @@ -11,8 +11,10 @@ from pint.fits_utils import read_fits_event_mjds_tuples from pint.observatory import get_observatory +# default TOA (event) uncertainty depending on facility +_default_uncertainty = 1 * u.us -__all__ = ["load_Fermi_TOAs"] +__all__ = ["load_Fermi_TOAs", "get_Fermi_TOAs"] def calc_lat_weights(energies, angseps, logeref=4.1, logesig=0.5): @@ -76,6 +78,7 @@ def load_Fermi_TOAs( minmjd=-np.inf, maxmjd=np.inf, fermiobs="Fermi", + errors=_default_uncertainty, ): """ Read photon event times out of a Fermi FT1 file and return a list of PINT :class:`~pint.toa.TOA` objects. @@ -105,6 +108,9 @@ def load_Fermi_TOAs( fermiobs: str The default observatory name is Fermi, and must have already been registered. The user can specify another name + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -131,6 +137,7 @@ def load_Fermi_TOAs( minmjd=minmjd, maxmjd=maxmjd, fermiobs=fermiobs, + errors=errors, ) return t.to_TOA_list() @@ -149,6 +156,7 @@ def get_Fermi_TOAs( planets=False, include_bipm=False, include_gps=False, + errors=_default_uncertainty, ): """ Read photon event times out of a Fermi FT1 file and return a :class:`pint.toa.TOAs` object @@ -187,6 +195,9 @@ def get_Fermi_TOAs( Use TT(BIPM) instead of TT(TAI) include_gps : bool, optional Apply GPS to UTC clock corrections + errors : astropy.units.Quantity or float, optional + The uncertainty on the TOA; if it's a float it is assumed to be + in microseconds Returns ------- @@ -249,6 +260,9 @@ def get_Fermi_TOAs( energies = energies[idx] weights = weights[idx] + if not isinstance(errors, u.Quantity): + errors = errors * u.microsecond + # limit the TOAs to ones in selected MJD range mjds_float = np.asarray([r[0] + r[1] for r in mjds]) idx = (minmjd < mjds_float) & (mjds_float < maxmjd) @@ -301,7 +315,7 @@ def get_Fermi_TOAs( return toa.get_TOAs_array( t, obs, - errors=0, + errors=errors, include_gps=include_gps, include_bipm=include_bipm, planets=planets, @@ -312,7 +326,7 @@ def get_Fermi_TOAs( return toa.get_TOAs_array( t, obs, - errors=0, + errors=errors, include_gps=False, include_bipm=False, planets=planets, diff --git a/src/pint/fitter.py b/src/pint/fitter.py index 844d15db9..61bcd9532 100644 --- a/src/pint/fitter.py +++ b/src/pint/fitter.py @@ -83,12 +83,11 @@ ) from pint.residuals import Residuals, WidebandTOAResiduals from pint.toa import TOAs -from pint.utils import FTest +from pint.utils import FTest, normalize_designmatrix __all__ = [ "Fitter", - "auto", "WLSFitter", "GLSFitter", "WidebandTOAFitter", @@ -363,7 +362,7 @@ def get_summary(self, nodmx=False): # to handle all parameter names, determine the longest length for the first column longestName = 0 # optionally specify the minimum length here instead of 0 - for pn in self.model.params_ordered: + for pn in self.model.params: if nodmx and pn.startswith("DMX"): continue if len(pn) > longestName: @@ -378,7 +377,7 @@ def get_summary(self, nodmx=False): s += ("{:<" + spacingName + "s} {:>20s} {:>28s} {}\n").format( "=" * longestName, "=" * 20, "=" * 28, "=" * 5 ) - for pn in self.model.params_ordered: + for pn in self.model.params: if nodmx and pn.startswith("DMX"): continue prefitpar = getattr(self.model_init, pn) @@ -1303,9 +1302,7 @@ def step(self): # NOTE, We remove subtract mean value here, since it did not give us a # fast converge fitting. # M[:,1:] -= M[:,1:].mean(axis=0) - fac = np.sqrt((M**2).mean(axis=0)) - fac[fac == 0] = 1.0 - M /= fac + M, fac = normalize_designmatrix(M, params) # Singular value decomp of design matrix: # M = U s V^T # Dimensions: @@ -1457,15 +1454,7 @@ def step(self): M = np.hstack((M, Mn)) # normalize the design matrix - norm = np.sqrt(np.sum(M**2, axis=0)) - for c in np.where(norm == 0)[0]: - warn( - f"Parameter degeneracy; the following parameter yields " - f"almost no change: {params[c]}", - DegeneracyWarning, - ) - norm[norm == 0] = 1 - M /= norm + M, norm = normalize_designmatrix(M, params) self.M = M self.fac = norm @@ -2014,10 +2003,7 @@ def fit_toas(self, maxiter=1, threshold=None, debug=False): # NOTE, We remove subtract mean value here, since it did not give us a # fast converge fitting. # M[:,1:] -= M[:,1:].mean(axis=0) - fac = np.sqrt((M**2).mean(axis=0)) - # fac[0] = 1.0 - fac[fac == 0] = 1.0 - M /= fac + M, fac = normalize_designmatrix(M, params) # Singular value decomp of design matrix: # M = U s V^T # Dimensions: @@ -2165,7 +2151,11 @@ def fit_toas(self, maxiter=1, threshold=0, full_cov=False, debug=False): fitperrs = self.model.get_params_dict("free", "uncertainty") # Define the linear system + # normalize the design matrix M, params, units = self.get_designmatrix() + # M /= norm + + ntmpar = len(fitp) # Get residuals and TOA uncertainties in seconds if i == 0: @@ -2182,18 +2172,11 @@ def fit_toas(self, maxiter=1, threshold=0, full_cov=False, debug=False): phiinv = np.concatenate((phiinv, 1 / phi)) M = np.hstack((M, Mn)) - # normalize the design matrix - norm = np.sqrt(np.sum(M**2, axis=0)) ntmpar = len(fitp) - for c in np.where(norm == 0)[0]: - warn( - f"Parameter degeneracy; the following parameter yields " - f"almost no change: {params[c]}", - DegeneracyWarning, - ) - norm[norm == 0] = 1 + + # normalize the design matrix + M, norm = normalize_designmatrix(M, params) self.fac = norm - M /= norm # compute covariance matrices if full_cov: @@ -2537,17 +2520,10 @@ def fit_toas(self, maxiter=1, threshold=0, full_cov=False, debug=False): new_d_matrix.param_units, ) - # normalize the design matrix - norm = np.sqrt(np.sum(M**2, axis=0)) ntmpar = len(fitp) - for c in np.where(norm == 0)[0]: - warn( - f"Parameter degeneracy; the following parameter yields " - f"almost no change: {params[c]}", - DegeneracyWarning, - ) - norm[norm == 0] = 1 - M /= norm + + # normalize the design matrix + M, norm = normalize_designmatrix(M, params) self.fac = norm # compute covariance matrices diff --git a/src/pint/models/__init__.py b/src/pint/models/__init__.py index 8d17fc9b4..2c7de7ebd 100644 --- a/src/pint/models/__init__.py +++ b/src/pint/models/__init__.py @@ -36,11 +36,13 @@ from pint.models.solar_system_shapiro import SolarSystemShapiro from pint.models.solar_wind_dispersion import SolarWindDispersion, SolarWindDispersionX from pint.models.spindown import Spindown +from pint.models.fdjump import FDJump # Import the main timing model classes from pint.models.timing_model import DEFAULT_ORDER, TimingModel from pint.models.troposphere_delay import TroposphereDelay from pint.models.wave import Wave +from pint.models.wavex import WaveX # Define a standard basic model StandardTimingModel = TimingModel( diff --git a/src/pint/models/astrometry.py b/src/pint/models/astrometry.py index 6f0af367e..1d737849c 100644 --- a/src/pint/models/astrometry.py +++ b/src/pint/models/astrometry.py @@ -550,8 +550,16 @@ def as_ECL(self, epoch=None, ecl="IERS2010"): ra=self.RAJ.quantity, dec=self.DECJ.quantity, obstime=self.POSEPOCH.quantity, - pm_ra_cosdec=self.RAJ.uncertainty * np.cos(self.DECJ.quantity) / dt, - pm_dec=self.DECJ.uncertainty / dt, + pm_ra_cosdec=( + self.RAJ.uncertainty * np.cos(self.DECJ.quantity) / dt + if self.RAJ.uncertainty is not None + else 0 * self.RAJ.units / dt + ), + pm_dec=( + self.DECJ.uncertainty / dt + if self.DECJ.uncertainty is not None + else 0 * self.DECJ.units / dt + ), frame=coords.ICRS, ) c_ECL = c.transform_to(PulsarEcliptic(ecl=ecl)) @@ -563,8 +571,16 @@ def as_ECL(self, epoch=None, ecl="IERS2010"): ra=self.RAJ.quantity, dec=self.DECJ.quantity, obstime=self.POSEPOCH.quantity, - pm_ra_cosdec=self.PMRA.uncertainty, - pm_dec=self.PMDEC.uncertainty, + pm_ra_cosdec=( + self.PMRA.uncertainty + if self.PMRA.uncertainty is not None + else 0 * self.PMRA.units + ), + pm_dec=( + self.PMDEC.uncertainty + if self.PMDEC.uncertainty is not None + else 0 * self.PMDEC.units + ), frame=coords.ICRS, ) c_ECL = c.transform_to(PulsarEcliptic(ecl=ecl)) @@ -943,8 +959,16 @@ def as_ECL(self, epoch=None, ecl="IERS2010"): lat=self.ELAT.quantity, obliquity=OBL[self.ECL.value], obstime=self.POSEPOCH.quantity, - pm_lon_coslat=self.ELONG.uncertainty * np.cos(self.ELAT.quantity) / dt, - pm_lat=self.ELAT.uncertainty / dt, + pm_lon_coslat=( + self.ELONG.uncertainty * np.cos(self.ELAT.quantity) / dt + if self.ELONG.uncertainty is not None + else 0 * self.ELONG.units / dt + ), + pm_lat=( + self.ELAT.uncertainty / dt + if self.ELAT.uncertainty is not None + else 0 * self.ELAT.units / dt + ), frame=PulsarEcliptic, ) c_ECL = c.transform_to(PulsarEcliptic(ecl=ecl)) @@ -957,8 +981,16 @@ def as_ECL(self, epoch=None, ecl="IERS2010"): lat=self.ELAT.quantity, obliquity=OBL[self.ECL.value], obstime=self.POSEPOCH.quantity, - pm_lon_coslat=self.PMELONG.uncertainty, - pm_lat=self.PMELAT.uncertainty, + pm_lon_coslat=( + self.PMELONG.uncertainty + if self.PMELONG.uncertainty is not None + else 0 * self.PMELONG.units + ), + pm_lat=( + self.PMELAT.uncertainty + if self.PMELAT.uncertainty is not None + else 0 * self.PMELAT.units + ), frame=PulsarEcliptic, ) c_ECL = c.transform_to(PulsarEcliptic(ecl=ecl)) @@ -1007,8 +1039,12 @@ def as_ICRS(self, epoch=None): lat=self.ELAT.quantity, obliquity=OBL[self.ECL.value], obstime=self.POSEPOCH.quantity, - pm_lon_coslat=self.ELONG.uncertainty * np.cos(self.ELAT.quantity) / dt, - pm_lat=self.ELAT.uncertainty / dt, + pm_lon_coslat=self.ELONG.uncertainty * np.cos(self.ELAT.quantity) / dt + if self.ELONG.uncertainty is not None + else 0 * self.ELONG.units / dt, + pm_lat=self.ELAT.uncertainty / dt + if self.ELAT.uncertainty is not None + else 0 * self.ELAT.units / dt, frame=PulsarEcliptic, ) c_ICRS = c.transform_to(coords.ICRS) @@ -1021,8 +1057,12 @@ def as_ICRS(self, epoch=None): lat=self.ELAT.quantity, obliquity=OBL[self.ECL.value], obstime=self.POSEPOCH.quantity, - pm_lon_coslat=self.PMELONG.uncertainty, - pm_lat=self.PMELAT.uncertainty, + pm_lon_coslat=self.PMELONG.uncertainty + if self.PMELONG.uncertainty is not None + else 0 * self.PMELONG.units, + pm_lat=self.PMELAT.uncertainty + if self.PMELAT.uncertainty is not None + else 0 * self.PMELAT.units, frame=PulsarEcliptic, ) c_ICRS = c.transform_to(coords.ICRS) diff --git a/src/pint/models/binary_dd.py b/src/pint/models/binary_dd.py index 1c9a464e4..ad855ffe8 100644 --- a/src/pint/models/binary_dd.py +++ b/src/pint/models/binary_dd.py @@ -100,11 +100,11 @@ def validate(self): # If any *DOT is set, we need T0 for p in ("PBDOT", "OMDOT", "EDOT", "A1DOT"): if hasattr(self, p) and getattr(self, p).value is None: - getattr(self, p).set("0") + getattr(self, p).value = 0.0 getattr(self, p).frozen = True if hasattr(self, "GAMMA") and self.GAMMA.value is None: - self.GAMMA.set("0") + self.GAMMA.value = 0.0 self.GAMMA.frozen = True # If eccentricity is zero, freeze some parameters to 0 @@ -112,7 +112,7 @@ def validate(self): if self.ECC.value == 0 or self.ECC.value is None: for p in ("ECC", "OM", "OMDOT", "EDOT"): if hasattr(self, p): - getattr(self, p).set("0") + getattr(self, p).value = 0.0 getattr(self, p).frozen = True diff --git a/src/pint/models/binary_ell1.py b/src/pint/models/binary_ell1.py index aeafda299..f23c1b51e 100644 --- a/src/pint/models/binary_ell1.py +++ b/src/pint/models/binary_ell1.py @@ -60,7 +60,7 @@ class BinaryELL1(PulsarBinary): This binary model uses a rectangular representation for the eccentricity of an orbit, resolving complexities that arise with periastron-based parameters in nearly-circular - orbits. It also makes certain approximations (up to O(e^2)) that are invalid when the eccentricity + orbits. It also makes certain approximations (up to O(e^3)) that are invalid when the eccentricity is "large"; what qualifies as "large" depends on your data quality. A formula exists to determine when the approximations this model makes are sufficiently accurate. @@ -79,21 +79,25 @@ class BinaryELL1(PulsarBinary): ---------- - Lange et al. (2001), MNRAS, 326 (1), 274–282 [1]_ - Zhu et al. (2019), MNRAS, 482 (3), 3249-3260 [2]_ + - Fiore et al. (2023), arXiv:2305.13624 [astro-ph.HE] [3]_ .. [1] https://ui.adsabs.harvard.edu/abs/2019MNRAS.482.3249Z/abstract .. [2] https://ui.adsabs.harvard.edu/abs/2001MNRAS.326..274L/abstract - + .. [3] https://arxiv.org/abs/2305.13624 Notes ----- This includes o(e^2) expression for Roemer delay from Norbert Wex and Weiwei Zhu - This is equaiton (1) of Zhu et al (2019) but with a corrected typo: + This is equation (1) of Zhu et al (2019) but with a corrected typo: In the first line of that equation, ex->e1 and ey->e2 In the other lines, ex->e2 and ey->e1 - See Email from Norbert and Weiwei to David on 2019-Aug-08 - The dre expression comes from Norbert and Weiwei; the derivatives + See Email from NW and WZ to David Nice on 2019-Aug-08 + The dre expression comes from NW and WZ; the derivatives were calculated by hand for PINT + Also includes o(e^3) expression from equation (4) of Fiore et al. (2023) + (derivatives also calculated by hand) + """ register = True @@ -308,10 +312,12 @@ class BinaryELL1H(BinaryELL1): .. paramtable:: :class: pint.models.binary_ell1.BinaryELL1H - Note - ---- + Notes + ----- Only the Medium-inclination case model is implemented. + Default value in `pint` for `NHARMS` is 7, while in `tempo2` it is 4. + References ---------- - Freire & Wex (2010), MNRAS, 409 (1), 199-212 [1]_ diff --git a/src/pint/models/fdjump.py b/src/pint/models/fdjump.py new file mode 100644 index 000000000..9cec3354e --- /dev/null +++ b/src/pint/models/fdjump.py @@ -0,0 +1,205 @@ +"""System and frequency dependent delays to model profile evolution.""" + +import re +from warnings import warn + +import astropy.units as u +import numpy as np + +from pint.models.parameter import boolParameter, maskParameter +from pint.models.timing_model import DelayComponent + +fdjump_max_index = 20 + + +class FDJump(DelayComponent): + """A timing model for system-dependent frequency evolution of pulsar + profiles. + + This model expresses the delay as a polynomial function of the + observing frequency/logarithm of observing frequency in the SSB frame. + This is intended to compensate for the delays introduced by frequency-dependent + profile structure when a different profiles are used for different systems. + + The default behavior is to have FDJUMPs as polynomials of the observing + frequency (rather than log-frequency). This is different from the convention + used for global FD parameters. This choice is made to be compatible with tempo2. + This is controlled using the FDJUMPLOG parameter. "FDJUMPLOG Y" may not be + tempo2-compatible. + + Note + ---- + FDJUMPs have two indices: the polynomial/FD/prefix index and the system/mask + index. i.e., they have properties of both maskParameters such as JUMPs and + prefixParameters such as FDs. There is currently no elegant way in PINT to implement + such parameters due to the way parameter indexing is implemented; there is no way to + distinguish between mask and prefix indices. + + Hence, they are implemented here as maskParameters as a stopgap measure. + This means that there must be an upper limit for the FD indices. This is controlled + using the `pint.models.fdjump.fdjump_max_index` variable, and is 20 by default. + Note that this is strictly a limitation of the implementation and not a property + of FDJUMPs themselves. + + FDJUMPs appear in tempo2-format par files as "FDJUMPp", where p is the FD index. + The mask index is not explicitly mentioned in par files similar to JUMPs. + PINT understands both "FDJUMPp" and "FDpJUMP" as the same parameter in par files, + but the internal representation is always "FDpJUMPq", where q is the mask index. + + PINT understands 'q' as the mask parameter just fine, but the identification of 'p' + as the prefix parameter is done in a hacky way. + + This implementation may be overhauled in the future. + + Parameters supported: + + .. paramtable:: + :class: pint.models.fdjump.FDJump + """ + + register = True + category = "fdjump" + + def __init__(self): + super().__init__() + + # Matches "FDpJUMPq" where p and q are integers. + self.param_regex = re.compile("^FD(\\d+)JUMP(\\d+)") + + self.add_param( + boolParameter( + name="FDJUMPLOG", + value=False, + description="Whether to use log-frequency (Y) or linear-frequency (N) for computing FDJUMPs.", + ) + ) + for j in range(1, fdjump_max_index + 1): + self.add_param( + maskParameter( + name=f"FD{j}JUMP", + units="second", + description=f"System-dependent FD parameter of polynomial index {j}", + ) + ) + + self.delay_funcs_component += [self.fdjump_delay] + + def setup(self): + super().setup() + + self.fdjumps = [ + mask_par + for mask_par in self.get_params_of_type("maskParameter") + if self.param_regex.match(mask_par) + ] + + for fdj in self.fdjumps: + # prevents duplicates from being added to phase_deriv_funcs + if fdj in self.deriv_funcs.keys(): + del self.deriv_funcs[fdj] + self.register_deriv_funcs(self.d_delay_d_FDJUMP, fdj) + + def get_fd_index(self, par): + """Extract the FD index from an FDJUMP parameter name. In a parameter name + "FDpJUMPq", p is the FD/prefix index and q is the mask index. + + Parameters + ---------- + par: Parameter name (str) + + Returns + ------- + FD index (int) + """ + if m := self.param_regex.match(par): + return int(m.groups()[0]) + else: + raise ValueError( + f"The given parameter {par} does not correspond to an FDJUMP." + ) + + def get_freq_y(self, toas): + """Get frequency or log-frequency in GHz based on the FDJUMPLOG value. + Returns (freq/1_GHz) if FDJUMPLOG==N and log(freq/1_GHz) if FDJUMPLOG==Y. + Any non-finite values are replaced by zero. + + Parameters + ---------- + toas: pint.toa.TOAs + + Returns + ------- + (freq/1_GHz) or log(freq/1_GHz) depending on the value of FDJUMPLOG (float). + """ + tbl = toas.table + try: + freq = self._parent.barycentric_radio_freq(toas) + except AttributeError: + warn("Using topocentric frequency for frequency dependent delay!") + freq = tbl["freq"] + + y = ( + np.log(freq.to(u.GHz).value) + if self.FDJUMPLOG.value + else freq.to(u.GHz).value + ) + non_finite = np.invert(np.isfinite(y)) + y[non_finite] = 0.0 + + return y + + def fdjump_delay(self, toas, acc_delay=None): + """Calculate frequency dependent delay. + + If FDJUMPLOG is Y, use the following expression (similar to global FD parameters): + + FDJUMP_delay = sum_i(c_i * (log(obs_freq/1GHz))^i) + + If FDJUMPLOG is N, use the following expression (same as in tempo2, default): + + FDJUMP_delay = sum_i(c_i * (obs_freq/1GHz)^i) + """ + y = self.get_freq_y(toas) + + delay = np.zeros_like(y) + for fdjump in self.fdjumps: + fdj = getattr(self, fdjump) + if fdj.quantity is not None: + mask = fdj.select_toa_mask(toas) + ymask = y[mask] + fdidx = self.get_fd_index(fdjump) + fdcoeff = fdj.value + delay[mask] += fdcoeff * ymask**fdidx + + return delay * u.s + + def d_delay_d_FDJUMP(self, toas, param, acc_delay=None): + """Derivative of delay w.r.t. FDJUMP parameters.""" + assert ( + bool(self.param_regex.match(param)) + and hasattr(self, param) + and getattr(self, param).quantity is not None + ), f"{param} is not present in the FDJUMP model." + + y = self.get_freq_y(toas) + mask = getattr(self, param).select_toa_mask(toas) + ymask = y[mask] + fdidx = self.get_fd_index(param) + + delay_derivative = np.zeros_like(y) + delay_derivative[mask] = ymask**fdidx + + return delay_derivative * u.dimensionless_unscaled + + def print_par(self, format="pint"): + par = super().print_par(format) + + if format != "tempo2": + return par + + for fdjump in self.fdjumps: + if getattr(self, fdjump).quantity is not None: + j = self.get_fd_index(fdjump) + par = par.replace(f"FD{j}JUMP", f"FDJUMP{j}") + + return par diff --git a/src/pint/models/frequency_dependent.py b/src/pint/models/frequency_dependent.py index c78359cd0..00afaeb8e 100644 --- a/src/pint/models/frequency_dependent.py +++ b/src/pint/models/frequency_dependent.py @@ -24,7 +24,7 @@ class FD(DelayComponent): @classmethod def _description_template(cls, x): - return "%d term of frequency dependent coefficients" % x + return f"{x} term of frequency dependent coefficients" register = True category = "frequency_dependent" @@ -72,7 +72,7 @@ def FD_delay(self, toas, acc_delay=None): Time Measurements, and Analysis of 37 Millisecond Pulsars, The Astrophysical Journal, Volume 813, Issue 1, article id. 65, 31 pp.(2015). Eq.(2): - FDdelay = sum(c_i * (log(obs_freq/1GHz))^i) + FD_delay = sum_i(c_i * (log(obs_freq/1GHz))^i) """ tbl = toas.table try: diff --git a/src/pint/models/jump.py b/src/pint/models/jump.py index 7c7095fef..17e231d25 100644 --- a/src/pint/models/jump.py +++ b/src/pint/models/jump.py @@ -117,7 +117,11 @@ def jump_phase(self, toas, delay): F0. """ tbl = toas.table - jphase = numpy.zeros(len(tbl)) * (self.JUMP1.units * self._parent.F0.units) + # base this on the first available jump (doesn't have to be JUMP1) + jphase = numpy.zeros(len(tbl)) * ( + getattr(self, self.get_params_of_type("maskParameter")[0]).units + * self._parent.F0.units + ) for jump in self.jumps: jump_par = getattr(self, jump) mask = jump_par.select_toa_mask(toas) diff --git a/src/pint/models/model_builder.py b/src/pint/models/model_builder.py index 53304b4af..0f6243d62 100644 --- a/src/pint/models/model_builder.py +++ b/src/pint/models/model_builder.py @@ -7,6 +7,7 @@ from pathlib import Path from astropy import units as u from loguru import logger as log +import re from pint.models.astrometry import Astrometry from pint.models.parameter import maskParameter @@ -64,6 +65,28 @@ def parse_parfile(parfile): return parfile_dict +def _replace_fdjump_in_parfile_dict(pardict): + """Replace parameter names s of the form "FDJUMPp" by "FDpJUMP" + while reading the par file, where p is the prefix index. + + Ideally, this should have been done using the parameter alias + mechanism, but there is no easy way to do this currently due to the + mask and prefix indices being treated in an identical manner. + + See :class:`~pint.models.fdjump.FDJump` for more details.""" + fdjumpn_regex = re.compile("^FDJUMP(\\d+)") + pardict_new = {} + for key, value in pardict.items(): + if m := fdjumpn_regex.match(key): + j = int(m.groups()[0]) + new_key = f"FD{j}JUMP" + pardict_new[new_key] = value + else: + pardict_new[key] = value + + return pardict_new + + class ModelBuilder: """Class for building a `TimingModel` object from a parameter file. @@ -84,7 +107,14 @@ def __init__(self): self._validate_components() self.default_components = [] - def __call__(self, parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): + def __call__( + self, + parfile, + allow_name_mixing=False, + allow_tcb=False, + toas_for_tzr=None, + **kwargs, + ): """Callable object for making a timing model from .par file. Parameters @@ -104,6 +134,10 @@ def __call__(self, parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): converted to TDB upon read. If "raw", an unconverted malformed TCB TimingModel object will be returned. + toas_for_tzr : TOAs or None, optional + If this is not None, a TZR TOA (AbsPhase) will be created using the + given TOAs object. + kwargs : dict Any additional parameter/value pairs that will add to or override those in the parfile. @@ -176,6 +210,16 @@ def __call__(self, parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): else: getattr(tm, k).value = v + # Explicitly add a TZR TOA from a given TOAs object. + if "AbsPhase" not in tm.components and toas_for_tzr is not None: + log.info("Creating a TZR TOA (AbsPhase) using the given TOAs object.") + tm.add_tzr_toa(toas_for_tzr) + + if not hasattr(tm, "DelayComponent_list"): + setattr(tm, "DelayComponent_list", []) + if not hasattr(tm, "NoiseComponent_list"): + setattr(tm, "NoiseComponent_list", []) + return tm def _validate_components(self): @@ -309,6 +353,11 @@ def _pintify_parfile(self, parfile, allow_name_mixing=False): parfile_dict = parse_parfile(parfile) else: parfile_dict = parfile + + # This is a special-case-hack to deal with FDJUMP parameters. + # @TODO: Implement a general mechanism to deal with cases like this. + parfile_dict = _replace_fdjump_in_parfile_dict(parfile_dict) + for k, v in parfile_dict.items(): try: pint_name, init0 = self.all_components.alias_to_pint_param(k) @@ -606,7 +655,9 @@ def _report_conflict(self, conflict_graph): raise ComponentConflict(f"Can not decide the one component from: {cf_cps}") -def get_model(parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): +def get_model( + parfile, allow_name_mixing=False, allow_tcb=False, toas_for_tzr=None, **kwargs +): """A one step function to build model from a parfile. Parameters @@ -626,6 +677,10 @@ def get_model(parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): converted to TDB upon read. If "raw", an unconverted malformed TCB TimingModel object will be returned. + toas_for_tzr : TOAs or None, optional + If this is not None, a TZR TOA (AbsPhase) will be created using the + given TOAs object. + kwargs : dict Any additional parameter/value pairs that will add to or override those in the parfile. @@ -640,13 +695,23 @@ def get_model(parfile, allow_name_mixing=False, allow_tcb=False, **kwargs): contents = None if contents is not None: return model_builder( - StringIO(contents), allow_name_mixing, allow_tcb=allow_tcb, **kwargs + StringIO(contents), + allow_name_mixing, + allow_tcb=allow_tcb, + toas_for_tzr=toas_for_tzr, + **kwargs, ) # # parfile is a filename and can be handled by ModelBuilder # if _model_builder is None: # _model_builder = ModelBuilder() - model = model_builder(parfile, allow_name_mixing, allow_tcb=allow_tcb, **kwargs) + model = model_builder( + parfile, + allow_name_mixing, + allow_tcb=allow_tcb, + toas_for_tzr=toas_for_tzr, + **kwargs, + ) model.name = parfile return model @@ -667,6 +732,7 @@ def get_model_and_toas( allow_name_mixing=False, limits="warn", allow_tcb=False, + add_tzr_to_model=True, **kwargs, ): """Load a timing model and a related TOAs, using model commands as needed @@ -677,6 +743,9 @@ def get_model_and_toas( The parfile name, or a file-like object to read the parfile contents from timfile : str The timfile name, or a file-like object to read the timfile contents from + ephem : str, optional + If not None (default), this ephemeris will be used to create the TOAs object. + Default is to use the EPHEM parameter from the timing model. include_bipm : bool or None Whether to apply the BIPM clock correction. Defaults to True. bipm_version : string or None @@ -711,6 +780,9 @@ def get_model_and_toas( error upon encountering TCB par files. If True, the par file will be converted to TDB upon read. If "raw", an unconverted malformed TCB TimingModel object will be returned. + add_tzr_to_model : bool, optional + Create a TZR TOA in the timing model using the created TOAs object. Default is + True. kwargs : dict Any additional parameter/value pairs that will add to or override those in the parfile. @@ -718,7 +790,9 @@ def get_model_and_toas( ------- A tuple with (model instance, TOAs instance) """ + mm = get_model(parfile, allow_name_mixing, allow_tcb=allow_tcb, **kwargs) + tt = get_TOAs( timfile, include_pn=include_pn, @@ -733,4 +807,9 @@ def get_model_and_toas( picklefilename=picklefilename, limits=limits, ) + + if "AbsPhase" not in mm.components and add_tzr_to_model: + log.info("Creating a TZR TOA (AbsPhase) using the given TOAs object.") + mm.add_tzr_toa(tt) + return mm, tt diff --git a/src/pint/models/parameter.py b/src/pint/models/parameter.py index 8a14e0106..016687563 100644 --- a/src/pint/models/parameter.py +++ b/src/pint/models/parameter.py @@ -776,6 +776,9 @@ def _get_value(self, quan): return None elif isinstance(quan, (float, np.longdouble)): return quan + elif isinstance(quan, list): + # for pairParamters + return [x.to(self.units).value for x in quan] else: return quan.to(self.units).value diff --git a/src/pint/models/stand_alone_psr_binaries/ELL1H_model.py b/src/pint/models/stand_alone_psr_binaries/ELL1H_model.py index 995a0b625..a976baef1 100644 --- a/src/pint/models/stand_alone_psr_binaries/ELL1H_model.py +++ b/src/pint/models/stand_alone_psr_binaries/ELL1H_model.py @@ -27,6 +27,10 @@ class ELL1Hmodel(ELL1BaseModel): Thus, :class:`~pint.models.binary_ell1.BinaryELL1H` uses the series from the third harmonic and higher. + Notes + ----- + Default value in `pint` for `NHARMS` is 7, while in `tempo2` it is 4. + References ---------- - Freire and Wex (2010), MNRAS, 409, 199 [1]_ diff --git a/src/pint/models/stand_alone_psr_binaries/ELL1_model.py b/src/pint/models/stand_alone_psr_binaries/ELL1_model.py index 5a80787e9..b3fd8133d 100644 --- a/src/pint/models/stand_alone_psr_binaries/ELL1_model.py +++ b/src/pint/models/stand_alone_psr_binaries/ELL1_model.py @@ -218,7 +218,7 @@ def ELL1_T0(self): ############################### def d_delayR_da1(self): - """ELL1 Roemer delay in proper time divided by a1/c, including second order corrections + """ELL1 Roemer delay in proper time divided by a1/c, including third order corrections typo corrected from Zhu et al., following: https://github.com/nanograv/tempo/blob/master/src/bnryell1.f @@ -227,14 +227,28 @@ def d_delayR_da1(self): eps1 = self.eps1() eps2 = self.eps2() return ( - np.sin(Phi) + 0.5 * (eps2 * np.sin(2 * Phi) - eps1 * np.cos(2 * Phi)) - ) - (1.0 / 8) * ( - 5 * eps2**2 * np.sin(Phi) - - 3 * eps2**2 * np.sin(3 * Phi) - - 2 * eps2 * eps1 * np.cos(Phi) - + 6 * eps2 * eps1 * np.cos(3 * Phi) - + 3 * eps1**2 * np.sin(Phi) - + 3 * eps1**2 * np.sin(3 * Phi) + np.sin(Phi) + + 0.5 * (eps2 * np.sin(2 * Phi) - eps1 * np.cos(2 * Phi)) + - (1.0 / 8) + * ( + 5 * eps2**2 * np.sin(Phi) + - 3 * eps2**2 * np.sin(3 * Phi) + - 2 * eps2 * eps1 * np.cos(Phi) + + 6 * eps2 * eps1 * np.cos(3 * Phi) + + 3 * eps1**2 * np.sin(Phi) + + 3 * eps1**2 * np.sin(3 * Phi) + ) + - (1.0 / 12) + * ( + 5 * eps2**3 * np.sin(2 * Phi) + + 3 * eps1**2 * eps2 * np.sin(2 * Phi) + - 6 * eps1 * eps2**2 * np.cos(2 * Phi) + - 4 * eps1**3 * np.cos(2 * Phi) + - 4 * eps2**3 * np.sin(4 * Phi) + + 12 * eps1**2 * eps2 * np.sin(4 * Phi) + + 12 * eps1 * eps2**2 * np.cos(4 * Phi) + - 4 * eps1**3 * np.cos(4 * Phi) + ) ) def d_d_delayR_dPhi_da1(self): @@ -255,6 +269,17 @@ def d_d_delayR_dPhi_da1(self): + 3 * eps1**2 * np.cos(Phi) + 9 * eps1**2 * np.cos(3 * Phi) ) + - (1.0 / 12) + * ( + 10 * eps2**3 * np.cos(2 * Phi) + + 6 * eps1**2 * eps2 * np.cos(2 * Phi) + + 12 * eps1 * eps2**2 * np.sin(2 * Phi) + + 8 * eps1**3 * np.sin(2 * Phi) + - 16 * eps2**3 * np.cos(4 * Phi) + + 48 * eps1**2 * eps2 * np.cos(4 * Phi) + - 48 * eps1 * eps2**2 * np.sin(4 * Phi) + + 16 * eps1**3 * np.sin(4 * Phi) + ) ) def d_dd_delayR_dPhi_da1(self): @@ -275,12 +300,24 @@ def d_dd_delayR_dPhi_da1(self): - 3 * eps1**2 * np.sin(Phi) - 27 * eps1**2 * np.sin(3 * Phi) ) + - (1.0 / 12) + * ( + -20 * eps2**3 * np.sin(2 * Phi) + - 12 * eps1**2 * eps2 * np.sin(2 * Phi) + + 24 * eps1 * eps2**2 * np.cos(2 * Phi) + + 16 * eps1**3 * np.cos(2 * Phi) + + 64 * eps2**3 * np.sin(4 * Phi) + - 192 * eps1**2 * eps2 * np.sin(4 * Phi) + - 192 * eps1 * eps2**2 * np.cos(4 * Phi) + + 64 * eps1**3 * np.cos(4 * Phi) + ) ) def delayR(self): """ELL1 Roemer delay in proper time. - Include terms up to second order in eccentricity + Include terms up to third order in eccentricity Zhu et al. (2019), Eqn. 1 + Fiore et al. (2023), Eqn. 4 """ return ((self.a1() / c.c) * self.d_delayR_da1()).decompose() @@ -312,8 +349,18 @@ def d_Dre_d_par(self, par): + 6 * eps1 * np.sin(Phi) + 6 * eps1 * np.sin(3 * Phi) ) + - (1.0 / 12) + * ( + 6 * eps1 * eps2 * np.sin(2 * Phi) + - 6 * eps2**2 * np.cos(2 * Phi) + - 12 * eps1**2 * np.cos(2 * Phi) + + 24 * eps1 * eps2 * np.sin(4 * Phi) + + 12 * eps2**2 * np.cos(4 * Phi) + - 12 * eps1**2 * np.cos(4 * Phi) + ) ) ) + d_Dre_d_eps2 = ( a1 / c.c @@ -326,6 +373,15 @@ def d_Dre_d_par(self, par): + 10 * eps2 * np.sin(Phi) - 6 * eps2 * np.sin(3 * Phi) ) + - (1.0 / 12) + * ( + 15 * eps2**2 * np.sin(2 * Phi) + + 3 * eps1**2 * np.sin(2 * Phi) + - 12 * eps1 * eps2 * np.cos(2 * Phi) + - 12 * eps2**2 * np.sin(4 * Phi) + + 12 * eps1**2 * np.sin(4 * Phi) + + 24 * eps1 * eps2 * np.cos(4 * Phi) + ) ) ) @@ -373,8 +429,18 @@ def d_Drep_d_par(self, par): + 2 * eps2 * np.sin(Phi) - 18 * eps2 * np.sin(3 * Phi) ) + - (1.0 / 12) + * ( + 12 * eps1 * eps2 * np.cos(2 * Phi) + + 12 * eps2**2 * np.sin(2 * Phi) + + 16 * eps1**2 * np.sin(2 * Phi) + + 96 * eps1 * eps2 * np.cos(4 * Phi) + - 48 * eps2**2 * np.sin(4 * Phi) + + 48 * eps1**2 * np.sin(4 * Phi) + ) ) ) + d_Drep_d_eps2 = ( a1 / c.c @@ -387,6 +453,15 @@ def d_Drep_d_par(self, par): + 10 * eps2 * np.cos(Phi) - 18 * eps2 * np.cos(3 * Phi) ) + - (1.0 / 12) + * ( + 30 * eps2**2 * np.cos(2 * Phi) + + 6 * eps1**2 * np.cos(2 * Phi) + + 24 * eps1 * eps2 * np.sin(2 * Phi) + - 48 * eps2**2 * np.cos(4 * Phi) + + 48 * eps1**2 * np.cos(4 * Phi) + - 96 * eps1 * eps2 * np.sin(4 * Phi) + ) ) ) @@ -432,8 +507,20 @@ def d_Drepp_d_par(self, par): - 3 * eps1**2 * np.cos(Phi) - 81 * eps1**2 * np.cos(3 * Phi) ) + - (1.0 / 12) + * ( + -40 * eps2**3 * np.cos(2 * Phi) + - 24 * eps1**2 * eps2 * np.cos(2 * Phi) + - 48 * eps1 * eps2**2 * np.sin(2 * Phi) + - 32 * eps1**3 * np.sin(2 * Phi) + + 256 * eps2**3 * np.cos(4 * Phi) + - 768 * eps1**2 * eps2 * np.cos(4 * Phi) + + 768 * eps1 * eps2**2 * np.sin(4 * Phi) + - 256 * eps1**3 * np.sin(4 * Phi) + ) ) ) + d_Phi_d_par = self.prtl_der("Phi", par) d_Drepp_d_eps1 = ( a1 @@ -447,6 +534,15 @@ def d_Drepp_d_par(self, par): + 2 * eps2 * np.cos(Phi) - 54 * eps2 * np.cos(3 * Phi) ) + - (1.0 / 12) + * ( + -24 * eps1 * eps2 * np.sin(2 * Phi) + + 24 * eps2**2 * np.cos(2 * Phi) + + 48 * eps1**2 * np.cos(2 * Phi) + - 384 * eps1 * eps2 * np.sin(4 * Phi) + - 192 * eps2**2 * np.cos(4 * Phi) + + 192 * eps1**2 * np.cos(4 * Phi) + ) ) ) d_Drepp_d_eps2 = ( @@ -461,6 +557,15 @@ def d_Drepp_d_par(self, par): - 10 * eps2 * np.sin(Phi) + 54 * eps2 * np.sin(3 * Phi) ) + - (1.0 / 12) + * ( + -60 * eps2**2 * np.sin(2 * Phi) + - 12 * eps1**2 * np.sin(2 * Phi) + + 48 * eps1 * eps2 * np.cos(2 * Phi) + + 192 * eps2**2 * np.sin(4 * Phi) + - 192 * eps1**2 * np.sin(4 * Phi) + - 384 * eps1 * eps2 * np.cos(4 * Phi) + ) ) ) diff --git a/src/pint/models/stand_alone_psr_binaries/binary_orbits.py b/src/pint/models/stand_alone_psr_binaries/binary_orbits.py index 7ee4f6b81..3a1d60bbb 100644 --- a/src/pint/models/stand_alone_psr_binaries/binary_orbits.py +++ b/src/pint/models/stand_alone_psr_binaries/binary_orbits.py @@ -29,7 +29,7 @@ def orbit_phase(self): return (orbits - norbits) * 2 * np.pi * u.rad def pbprime(self): - """Derivative of binary period with respect to time.""" + """Instantaneous binary period as a function of time.""" raise NotImplementedError def pbdot_orbit(self): @@ -105,7 +105,7 @@ def orbits(self): ).decompose() def pbprime(self): - """Derivative of binary period with respect to time.""" + """Instantaneous binary period as a function of time.""" return self.PB + self.PBDOT * self.tt0 def pbdot_orbit(self): @@ -186,7 +186,7 @@ def orbits(self): return orbits.decompose() def pbprime(self): - """Derivative of binary period with respect to time.""" + """Instantaneous binary period as a function of time.""" orbit_freq = taylor_horner_deriv(self.tt0, self._FBXs(), 1) return 1.0 / orbit_freq diff --git a/src/pint/models/tcb_conversion.py b/src/pint/models/tcb_conversion.py index c4adccfed..13dd65fc6 100644 --- a/src/pint/models/tcb_conversion.py +++ b/src/pint/models/tcb_conversion.py @@ -9,7 +9,7 @@ "IFTE_K", "scale_parameter", "transform_mjd_parameter", - "convert_tcb_to_tdb", + "convert_tcb_tdb", ] # These constants are taken from Irwin & Fukushima 1999. diff --git a/src/pint/models/timing_model.py b/src/pint/models/timing_model.py index 4951a58c5..1f02b8c75 100644 --- a/src/pint/models/timing_model.py +++ b/src/pint/models/timing_model.py @@ -117,6 +117,7 @@ "spindown", "phase_jump", "wave", + "wavex", ] @@ -183,12 +184,11 @@ class TimingModel: removed with methods on this object, and for many of them additional parameters in families (``DMXEP_1234``) can be added. - Parameters in a TimingModel object are listed in the ``model.params`` and - ``model.params_ordered`` objects. Each Parameter can be set as free or - frozen using its ``.frozen`` attribute, and a list of the free parameters - is available through the ``model.free_params`` property; this can also - be used to set which parameters are free. Several methods are available - to get and set some or all parameters in the forms of dictionaries. + Parameters in a TimingModel object are listed in the ``model.params`` object. + Each Parameter can be set as free or frozen using its ``.frozen`` attribute, + and a list of the free parameters is available through the ``model.free_params`` + property; this can also be used to set which parameters are free. Several methods + are available to get and set some or all parameters in the forms of dictionaries. TimingModel objects also support a number of functions for computing various things like orbital phase, and barycentric versions of TOAs, @@ -499,21 +499,41 @@ def __getattr__(self, name): f"Attribute {name} not found in TimingModel or any Component" ) - @property_exists - def params(self): - """List of all parameter names in this model and all its components (order is arbitrary).""" - # FIXME: any reason not to just use params_ordered here? - p = self.top_level_params - for cp in self.components.values(): - p = p + cp.params - return p + def __setattr__(self, name, value): + """Mostly this just sets ``self.name = value``. But in the case where they are both :class:`Parameter` instances + with different names, this copies the ``quantity``, ``uncertainty``, ``frozen`` attributes only. + """ + if isinstance(value, (Parameter, prefixParameter)) and name != value.name: + for p in ["quantity", "uncertainty", "frozen"]: + setattr(getattr(self, name), p, getattr(value, p)) + else: + super().__setattr__(name, value) @property_exists def params_ordered(self): + """List of all parameter names in this model and all its components. + This is the same as `params`.""" + + # Historically, this was different from `params` because Python + # dictionaries were unordered until Python 3.7. Now there is no reason for + # them to be different. + + warn( + "`TimingModel.params_ordered` is now deprecated and may be removed in the future. " + "Use `TimingModel.params` instead. It gives the same output as `TimingModel.params_ordered`.", + DeprecationWarning, + ) + + return self.params + + @property_exists + def params(self): """List of all parameter names in this model and all its components, in a sensible order.""" + # Define the order of components in the list # Any not included will be printed between the first and last set. # FIXME: make order completely canonical (sort components by name?) + start_order = ["astrometry", "spindown", "dispersion"] last_order = ["jump_delay"] compdict = self.get_components_by_category() @@ -551,7 +571,7 @@ def params_ordered(self): def free_params(self): """List of all the free parameters in the timing model. Can be set to change which are free. - These are ordered as ``self.params_ordered`` does. + These are ordered as ``self.params`` does. Upon setting, order does not matter, and aliases are accepted. ValueError is raised if a parameter is not recognized. @@ -559,7 +579,7 @@ def free_params(self): On setting, parameter aliases are converted with :func:`pint.models.timing_model.TimingModel.match_param_aliases`. """ - return [p for p in self.params_ordered if not getattr(self, p).frozen] + return [p for p in self.params if not getattr(self, p).frozen] @free_params.setter def free_params(self, params): @@ -620,7 +640,7 @@ def get_params_dict(self, which="free", kind="quantity"): if which == "free": ps = self.free_params elif which == "all": - ps = self.params_ordered + ps = self.params else: raise ValueError("get_params_dict expects which to be 'all' or 'free'") c = OrderedDict() @@ -1317,17 +1337,18 @@ def phase(self, toas, abs_phase=None): # False. Of course, if you manually set it, it will use that setting. if abs_phase is None: abs_phase = "AbsPhase" in list(self.components.keys()) + + # This function gets called in `Residuals.calc_phase_resids()` with `abs_phase=True` + # by default. Hence, this branch is not run by default. if not abs_phase: return phase + if "AbsPhase" not in list(self.components.keys()): + log.info("Creating a TZR TOA (AbsPhase) using the given TOAs object.") + # if no absolute phase (TZRMJD), add the component to the model and calculate it - from pint.models import absolute_phase + self.add_tzr_toa(toas) - self.add_component(absolute_phase.AbsPhase(), validate=False) - self.make_TZR_toa( - toas - ) # TODO:needs timfile to get all toas, but model doesn't have access to timfile. different place for this? - self.validate() tz_toa = self.get_TZR_toa(toas) tz_delay = self.delay(tz_toa) tz_phase = Phase(np.zeros(len(toas.table)), np.zeros(len(toas.table))) @@ -1335,6 +1356,15 @@ def phase(self, toas, abs_phase=None): tz_phase += Phase(pf(tz_toa, tz_delay)) return phase - tz_phase + def add_tzr_toa(self, toas): + """Create a TZR TOA for the given TOAs object and add it to + the timing model. This corresponds to TOA closest to the PEPOCH.""" + from pint.models.absolute_phase import AbsPhase + + self.add_component(AbsPhase(), validate=False) + self.make_TZR_toa(toas) + self.validate() + def total_dm(self, toas): """Calculate dispersion measure from all the dispersion type of components.""" # Here we assume the unit would be the same for all the dm value function. @@ -1715,7 +1745,7 @@ def d_delay_d_param(self, toas, param, acc_delay=None): if param not in list(delay_derivs.keys()): raise AttributeError( "Derivative function for '{param}' is not provided" - " or not registered. " + " or not registered; parameter '{param}' may not be fittable. " ) for df in delay_derivs[param]: result += df(toas, param, acc_delay).to( @@ -1876,6 +1906,7 @@ def designmatrix(self, toas, acc_delay=None, incfrozen=False, incoffset=True): the_unit = u.Unit("") / getattr(self, param).units M[:, ii] = q.to_value(the_unit) / F0.value units.append(the_unit / F0.unit) + return M, params, units def compare( @@ -2003,10 +2034,7 @@ def compare( log.debug("Check verbosity - only warnings/info will be displayed") othermodel = copy.deepcopy(othermodel) - if ( - "POSEPOCH" in self.params_ordered - and "POSEPOCH" in othermodel.params_ordered - ): + if "POSEPOCH" in self.params and "POSEPOCH" in othermodel.params: if ( self.POSEPOCH.value is not None and othermodel.POSEPOCH.value is not None @@ -2017,7 +2045,7 @@ def compare( % (other_model_name, model_name) ) othermodel.change_posepoch(self.POSEPOCH.value) - if "PEPOCH" in self.params_ordered and "PEPOCH" in othermodel.params_ordered: + if "PEPOCH" in self.params and "PEPOCH" in othermodel.params: if ( self.PEPOCH.value is not None and self.PEPOCH.value != othermodel.PEPOCH.value @@ -2026,7 +2054,7 @@ def compare( "Updating PEPOCH in %s to match %s" % (other_model_name, model_name) ) othermodel.change_pepoch(self.PEPOCH.value) - if "DMEPOCH" in self.params_ordered and "DMEPOCH" in othermodel.params_ordered: + if "DMEPOCH" in self.params and "DMEPOCH" in othermodel.params: if ( self.DMEPOCH.value is not None and self.DMEPOCH.value != othermodel.DMEPOCH.value @@ -2061,7 +2089,7 @@ def compare( f"{model_name} is in ECL({self.ECL.value}) coordinates but {other_model_name} is in ICRS coordinates and convertcoordinates=False" ) - for pn in self.params_ordered: + for pn in self.params: par = getattr(self, pn) if par.value is None: continue @@ -2288,8 +2316,8 @@ def compare( ) # Now print any parameters in othermodel that were missing in self. - mypn = self.params_ordered - for opn in othermodel.params_ordered: + mypn = self.params + for opn in othermodel.params: if opn in mypn and getattr(self, opn).value is not None: continue if nodmx and opn.startswith("DMX"): diff --git a/src/pint/models/wave.py b/src/pint/models/wave.py index 7abe4ed79..194b2b5b8 100644 --- a/src/pint/models/wave.py +++ b/src/pint/models/wave.py @@ -28,7 +28,13 @@ class Wave(PhaseComponent): def __init__(self): super().__init__() - + self.add_param( + MJDParameter( + name="WAVEEPOCH", + description="Reference epoch for wave solution", + time_scale="tdb", + ) + ) self.add_param( floatParameter( name="WAVE_OM", @@ -46,13 +52,6 @@ def __init__(self): 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] def setup(self): @@ -64,14 +63,14 @@ def validate(self): super().validate() self.setup() if self.WAVEEPOCH.quantity is None: - if self.PEPOCH.quantity is None: + if self._parent.PEPOCH.quantity is None: raise MissingParameter( "Wave", "WAVEEPOCH", "WAVEEPOCH or PEPOCH are required if " "WAVE_OM is set.", ) else: - self.WAVEEPOCH = self.PEPOCH + self.WAVEEPOCH.quantity = self._parent.PEPOCH.quantity if (not hasattr(self._parent, "F0")) or (self._parent.F0.quantity is None): raise MissingParameter( @@ -95,6 +94,52 @@ def print_par(self, format="pint"): return result + def add_wave_component(self, amps, index=None): + """Add Wave Component + + Parameters + ---------- + + index : int + Interger label for Wave components. + amps : tuple of float or astropy.quantity.Quantity + Sine and cosine amplitudes + + Returns + ------- + + index : + Index that has been assigned to new Wave component + """ + #### If index is None, increment the current max Wave index by 1. Increment using WAVE + if index is None: + dct = self.get_prefix_mapping_component("WAVE") + index = np.max(list(dct.keys())) + 1 + i = f"{int(index):04d}" + + if int(index) in self.get_prefix_mapping_component("WAVE"): + raise ValueError( + f"Index '{index}' is already in use in this model. Please choose another" + ) + + for amp in amps: + if isinstance(amp, u.quantity.Quantity): + amp = amp.to_value(u.s) + self.add_param( + prefixParameter( + name=f"WAVE{index}", + value=amps, + units="s", + description="Wave components", + type_match="pair", + long_double=True, + parameter_type="pair", + ) + ) + self.setup() + self.validate() + return f"{index}" + def wave_phase(self, toas, delays): times = 0 wave_names = ["WAVE%d" % ii for ii in range(1, self.num_wave_terms + 1)] diff --git a/src/pint/models/wavex.py b/src/pint/models/wavex.py new file mode 100644 index 000000000..2861308c1 --- /dev/null +++ b/src/pint/models/wavex.py @@ -0,0 +1,389 @@ +"""Delays expressed as a sum of sinusoids.""" +import astropy.units as u +import numpy as np +from loguru import logger as log +from warnings import warn + +from pint.models.parameter import MJDParameter, floatParameter, prefixParameter +from pint.models.timing_model import DelayComponent, MissingParameter + + +class WaveX(DelayComponent): + """ + Implementation of the wave model as a delay correction + + Delays are expressed as a sum of sinusoids. + + Used for decomposition of timing noise into a series of sine/cosine components with the amplitudes as fitted parameters. + + Parameters supported: + + .. paramtable:: + :class: pint.models.wavex.WaveX + + This is an extension of the L13 method described in Lentati et al., 2013 doi: 10.1103/PhysRevD.87.104021 + This model is similar to the TEMPO2 WAVE model parameters and users can convert a `TimingModel` with a Wave model + to a WaveX model and produce the same results. The main differences are that the WaveX frequencies are explicitly stated, + they do not necessarily need to be harmonics of some base frequency, the wave amplitudes are fittable parameters, and the + sine and cosine amplutides are reported as separate `prefixParameter`s rather than as a single `pairParameter`. + + Analogous parameters in both models have the same units: + WAVEEPOCH is the same as WXEPOCH + WAVEOM and WXFREQ_000N have units of 1/d + WAVEN and WXSIN_000N/WXCOS_000N have units of seconds + + The `pint.utils` functions `translate_wave_to_wavex()` and `translate_wavex_to_wave()` can be used to go back and forth between + two model. + + WARNING: If the choice of WaveX frequencies in a `TimingModel` doesn't correspond to harmonics of some base + freqeuncy, it will not be possible to convert it to a Wave model. + + To set up a WaveX model, users can use the `pint.utils` function `wavex_setup()` with either a list of frequencies or a choice + of harmonics of a base frequency determined by 2 * pi /Timespan + """ + + register = True + category = "wavex" + + def __init__(self): + super().__init__() + self.add_param( + MJDParameter( + name="WXEPOCH", + description="Reference epoch for Fourier representation of red noise", + time_scale="tdb", + ) + ) + self.add_wavex_component(0.1, index=1, wxsin=0, wxcos=0, frozen=False) + self.set_special_params(["WXFREQ_0001", "WXSIN_0001", "WXCOS_0001"]) + self.delay_funcs_component += [self.wavex_delay] + + def add_wavex_component(self, wxfreq, index=None, wxsin=0, wxcos=0, frozen=True): + """ + Add WaveX component + + Parameters + ---------- + + wxfreq : float or astropy.quantity.Quantity + Base frequency for WaveX component + index : int, None + Interger label for WaveX component. If None, will increment largest used index by 1. + wxsin : float or astropy.quantity.Quantity + Sine amplitude for WaveX component + wxcos : float or astropy.quantity.Quantity + Cosine amplitude for WaveX component + frozen : iterable of bool or bool + Indicates whether wavex will be fit + + Returns + ------- + + index : int + Index that has been assigned to new WaveX component + """ + + #### If index is None, increment the current max WaveX index by 1. Increment using WXFREQ + if index is None: + dct = self.get_prefix_mapping_component("WXFREQ_") + index = np.max(list(dct.keys())) + 1 + i = f"{int(index):04d}" + + if int(index) in self.get_prefix_mapping_component("WXFREQ_"): + raise ValueError( + f"Index '{index}' is already in use in this model. Please choose another" + ) + + if isinstance(wxsin, u.quantity.Quantity): + wxsin = wxsin.to_value(u.s) + if isinstance(wxcos, u.quantity.Quantity): + wxcos = wxcos.to_value(u.s) + if isinstance(wxfreq, u.quantity.Quantity): + wxfreq = wxfreq.to_value(1 / u.d) + self.add_param( + prefixParameter( + name=f"WXFREQ_{i}", + description="Component frequency for Fourier representation of red noise", + units="1/d", + value=wxfreq, + parameter_type="float", + ) + ) + self.add_param( + prefixParameter( + name=f"WXSIN_{i}", + description="Sine amplitudes for Fourier representation of red noise", + units="s", + value=wxsin, + frozen=frozen, + parameter_type="float", + ) + ) + self.add_param( + prefixParameter( + name=f"WXCOS_{i}", + description="Cosine amplitudes for Fourier representation of red noise", + units="s", + value=wxcos, + frozen=frozen, + parameter_type="float", + ) + ) + self.setup() + self.validate() + return index + + def add_wavex_components( + self, wxfreqs, indices=None, wxsins=0, wxcoses=0, frozens=True + ): + """ + Add WaveX components with specified base frequencies + + Parameters + ---------- + + wxfreqs : iterable of float or astropy.quantity.Quantity + Base frequencies for WaveX components + indices : iterable of int, None + Interger labels for WaveX components. If None, will increment largest used index by 1. + wxsins : iterable of float or astropy.quantity.Quantity + Sine amplitudes for WaveX components + wxcoses : iterable of float or astropy.quantity.Quantity + Cosine amplitudes for WaveX components + frozens : iterable of bool or bool + Indicates whether sine adn cosine amplitudes of wavex components will be fit + + Returns + ------- + + indices : list + Indices that have been assigned to new WaveX components + """ + + if indices is None: + indices = [None] * len(wxfreqs) + wxsins = np.atleast_1d(wxsins) + wxcoses = np.atleast_1d(wxcoses) + if len(wxsins) == 1: + wxsins = np.repeat(wxsins, len(wxfreqs)) + if len(wxcoses) == 1: + wxcoses = np.repeat(wxcoses, len(wxfreqs)) + if len(wxsins) != len(wxfreqs): + raise ValueError( + f"Number of base frequencies {len(wxfreqs)} doesn't match number of sine ampltudes {len(wxsins)}" + ) + if len(wxcoses) != len(wxfreqs): + raise ValueError( + f"Number of base frequencies {len(wxfreqs)} doesn't match number of cosine ampltudes {len(wxcoses)}" + ) + frozens = np.atleast_1d(frozens) + if len(frozens) == 1: + frozens = np.repeat(frozens, len(wxfreqs)) + if len(frozens) != len(wxfreqs): + raise ValueError( + f"Number of base frequencies must match number of frozen values" + ) + #### If indices is None, increment the current max WaveX index by 1. Increment using WXFREQ + dct = self.get_prefix_mapping_component("WXFREQ_") + last_index = np.max(list(dct.keys())) + added_indices = [] + for wxfreq, index, wxsin, wxcos, frozen in zip( + wxfreqs, indices, wxsins, wxcoses, frozens + ): + if index is None: + index = last_index + 1 + last_index += 1 + elif index in list(dct.keys()): + raise ValueError( + f"Attempting to insert WXFREQ_{index:04d} but it already exists" + ) + added_indices.append(index) + i = f"{int(index):04d}" + + if int(index) in dct: + raise ValueError( + f"Index '{index}' is already in use in this model. Please choose another" + ) + if isinstance(wxfreq, u.quantity.Quantity): + wxfreq = wxfreq.to_value(u.d**-1) + if isinstance(wxsin, u.quantity.Quantity): + wxsin = wxsin.to_value(u.s) + if isinstance(wxcos, u.quantity.Quantity): + wxcos = wxcos.to_value(u.s) + log.trace(f"Adding WXSIN_{i} and WXCOS_{i} at frequency WXFREQ_{i}") + self.add_param( + prefixParameter( + name=f"WXFREQ_{i}", + description="Component frequency for Fourier representation of red noise", + units="1/d", + value=wxfreq, + parameter_type="float", + ) + ) + self.add_param( + prefixParameter( + name=f"WXSIN_{i}", + description="Sine amplitude for Fourier representation of red noise", + units="s", + value=wxsin, + parameter_type="float", + frozen=frozen, + ) + ) + self.add_param( + prefixParameter( + name=f"WXCOS_{i}", + description="Cosine amplitude for Fourier representation of red noise", + units="s", + value=wxcos, + parameter_type="float", + frozen=frozen, + ) + ) + self.setup() + self.validate() + return added_indices + + def remove_wavex_component(self, index): + """ + Remove all WaveX components associated with a given index or list of indices + + Parameters + ---------- + index : float, int, list, np.ndarray + Number or list/array of numbers corresponding to WaveX indices to be removed from model. + """ + + if isinstance(index, (int, float, np.int64)): + indices = [index] + elif isinstance(index, (list, set, np.ndarray)): + indices = index + else: + raise TypeError( + f"index most be a float, int, set, list, or array - not {type(index)}" + ) + for index in indices: + index_rf = f"{int(index):04d}" + for prefix in ["WXFREQ_", "WXSIN_", "WXCOS_"]: + self.remove_param(prefix + index_rf) + self.validate() + + def get_indices(self): + """ + Returns an array of intergers corresponding to WaveX component parameters using WXFREQs + + Returns + ------- + inds : np.ndarray + Array of WaveX indices in model. + """ + inds = [int(p.split("_")[-1]) for p in self.params if "WXFREQ_" in p] + return np.array(inds) + + # Initialize setup + def setup(self): + super().setup() + # Get WaveX mapping and register WXSIN and WXCOS derivatives + for prefix_par in self.get_params_of_type("prefixParameter"): + if prefix_par.startswith("WXSIN_"): + self.register_deriv_funcs(self.d_wavex_delay_d_WXSIN, prefix_par) + if prefix_par.startswith("WXCOS_"): + self.register_deriv_funcs(self.d_wavex_delay_d_WXCOS, prefix_par) + self.wave_freqs = list(self.get_prefix_mapping_component("WXFREQ_").keys()) + self.num_wave_freqs = len(self.wave_freqs) + + def validate(self): + # Validate all the WaveX parameters + super().validate() + self.setup() + WXFREQ_mapping = self.get_prefix_mapping_component("WXFREQ_") + WXSIN_mapping = self.get_prefix_mapping_component("WXSIN_") + WXCOS_mapping = self.get_prefix_mapping_component("WXCOS_") + if WXFREQ_mapping.keys() != WXSIN_mapping.keys(): + raise ValueError( + "WXFREQ_ parameters do not match WXSIN_ parameters." + "Please check your prefixed parameters" + ) + if WXFREQ_mapping.keys() != WXCOS_mapping.keys(): + raise ValueError( + "WXFREQ_ parameters do not match WXCOS_ parameters." + "Please check your prefixed parameters" + ) + # if len(WXFREQ_mapping.keys()) != len(WXSIN_mapping.keys()): + # raise ValueError( + # "The number of WXFREQ_ parameters do not match the number of WXSIN_ parameters." + # "Please check your prefixed parameters" + # ) + # if len(WXFREQ_mapping.keys()) != len(WXCOS_mapping.keys()): + # raise ValueError( + # "The number of WXFREQ_ parameters do not match the number of WXCOS_ parameters." + # "Please check your prefixed parameters" + # ) + if WXSIN_mapping.keys() != WXCOS_mapping.keys(): + raise ValueError( + "WXSIN_ parameters do not match WXCOS_ parameters." + "Please check your prefixed parameters" + ) + if len(WXSIN_mapping.keys()) != len(WXCOS_mapping.keys()): + raise ValueError( + "The number of WXSIN_ and WXCOS_ parameters do not match" + "Please check your prefixed parameters" + ) + wfreqs = np.zeros(len(WXFREQ_mapping)) + for j, index in enumerate(WXFREQ_mapping): + if (getattr(self, f"WXFREQ_{index:04d}").value == 0) or ( + getattr(self, f"WXFREQ_{index:04d}").quantity is None + ): + raise ValueError( + f"WXFREQ_{index:04d} is zero or None. Please check your prefixed parameters" + ) + if getattr(self, f"WXFREQ_{index:04d}").value < 0.0: + warn(f"Frequency WXFREQ_{index:04d} is negative") + wfreqs[j] = getattr(self, f"WXFREQ_{index:04d}").value + wfreqs.sort() + if np.any(np.diff(wfreqs) <= (1.0 / (2.0 * 364.25))): + warn("Frequency resolution is greater than 1/yr") + if self.WXEPOCH.value is None: + if self._parent is not None: + if self._parent.PEPOCH.value is None: + raise MissingParameter( + "WXEPOCH or PEPOCH are required if WaveX is being used" + ) + else: + self.WXEPOCH.quantity = self._parent.PEPOCH.quantity + + def validate_toas(self, toas): + return super().validate_toas(toas) + + def wavex_delay(self, toas, delays): + total_delay = np.zeros(toas.ntoas) * u.s + wave_freqs = self.get_prefix_mapping_component("WXFREQ_") + wave_sins = self.get_prefix_mapping_component("WXSIN_") + wave_cos = self.get_prefix_mapping_component("WXCOS_") + + base_phase = ( + toas.table["tdbld"].data * u.d - self.WXEPOCH.value * u.d - delays.to(u.d) + ) + for idx, param in wave_freqs.items(): + freq = getattr(self, param).quantity + wxsin = getattr(self, wave_sins[idx]).quantity + wxcos = getattr(self, wave_cos[idx]).quantity + arg = 2.0 * np.pi * freq * base_phase + total_delay += wxsin * np.sin(arg.value) + wxcos * np.cos(arg.value) + return total_delay + + def d_wavex_delay_d_WXSIN(self, toas, param, delays, acc_delay=None): + par = getattr(self, param) + freq = getattr(self, f"WXFREQ_{int(par.index):04d}").quantity + base_phase = toas.table["tdbld"].data * u.d - self.WXEPOCH.value * u.d + arg = 2.0 * np.pi * freq * base_phase + deriv = np.sin(arg.value) + return deriv * u.s / par.units + + def d_wavex_delay_d_WXCOS(self, toas, param, delays, acc_delay=None): + par = getattr(self, param) + freq = getattr(self, f"WXFREQ_{int(par.index):04d}").quantity + base_phase = toas.table["tdbld"].data * u.d - self.WXEPOCH.value * u.d + arg = 2.0 * np.pi * freq * base_phase + deriv = np.cos(arg.value) + return deriv * u.s / par.units diff --git a/src/pint/pintk/plk.py b/src/pint/pintk/plk.py index 14831aefb..368e19599 100644 --- a/src/pint/pintk/plk.py +++ b/src/pint/pintk/plk.py @@ -1506,11 +1506,7 @@ def canvasKeyEvent(self, event): self.psr.selected_toas = self.psr.all_toas[cluster_bool] jump_name = self.psr.add_jump(cluster_bool) self.updateJumped(jump_name) - if ( - self.selected is not None - and self.selected is not [] - and all(self.selected) - ): + if self.selected is not None and self.selected != [] and all(self.selected): self.psr.selected_toas = self.all_toas[self.selected] self.fitboxesWidget.addFitCheckBoxes(self.psr.prefit_model) self.randomboxWidget.addRandomCheckbox(self) diff --git a/src/pint/residuals.py b/src/pint/residuals.py index b12b67dd0..736c5798b 100644 --- a/src/pint/residuals.py +++ b/src/pint/residuals.py @@ -12,12 +12,13 @@ import astropy.units as u import numpy as np -from scipy.linalg import LinAlgError +import scipy +from scipy.linalg import LinAlgError, cho_factor, cho_solve from loguru import logger as log from pint.models.dispersion_model import Dispersion from pint.phase import Phase -from pint.utils import weighted_mean, taylor_horner_deriv +from pint.utils import normalize_designmatrix, weighted_mean, taylor_horner_deriv __all__ = [ "Residuals", @@ -84,6 +85,7 @@ def __new__( subtract_mean=True, use_weighted_mean=True, track_mode=None, + use_abs_phase=True, ): if cls is Residuals: try: @@ -104,6 +106,7 @@ def __init__( subtract_mean=True, use_weighted_mean=True, track_mode=None, + use_abs_phase=True, ): self.toas = toas self.model = model @@ -115,6 +118,8 @@ def __init__( ) self.subtract_mean = subtract_mean and "PhaseOffset" not in model.components + self.use_abs_phase = use_abs_phase + self.use_weighted_mean = use_weighted_mean if track_mode is None: if getattr(self.model, "TRACK").value == "-2": @@ -139,6 +144,7 @@ def __init__( else: self.phase_resids = None self.time_resids = None + # delay chi-squared computation until needed to avoid infinite recursion # also it's expensive # only relevant if there are correlated errors @@ -296,7 +302,9 @@ def get_PSR_freq(self, calctype="modelF0"): elif calctype.lower() == "numerical": return self.model.d_phase_d_toa(self.toas) - def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): + def calc_phase_resids( + self, subtract_mean=None, use_weighted_mean=None, use_abs_phase=None + ): """Compute timing model residuals in pulse phase. if ``subtract_mean`` or ``use_weighted_mean`` is None, will use the values set for the object itself @@ -304,7 +312,12 @@ def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): Parameters ---------- subtract_mean : bool or None, optional + Subtract the mean of the residuals. This is ignored if the `PhaseOffset` component + is present in the model. Default is to use the class attribute. use_weighted_mean : bool or None, optional + Whether to use weighted mean for mean subtraction. Default is to use the class attribute. + use_abs_phase : bool or None, optional + Whether to use absolute phase (w.r.t. the TZR TOA). Default is to use the class attribute. Returns ------- @@ -322,12 +335,17 @@ def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): if use_weighted_mean is None: use_weighted_mean = self.use_weighted_mean + + if use_abs_phase is None: + use_abs_phase = self.use_abs_phase + # Read any delta_pulse_numbers that are in the TOAs table. # These are for PHASE statements, -padd flags, as well as user-inserted phase jumps # Check for the column, and if not there then create it as zeros if "delta_pulse_number" not in self.toas.table.colnames: self.toas.table["delta_pulse_number"] = np.zeros(len(self.toas.get_mjds())) delta_pulse_numbers = Phase(self.toas.table["delta_pulse_number"]) + # Track on pulse numbers, if requested if self.track_mode == "use_pulse_numbers": pulse_num = self.toas.get_pulse_numbers() @@ -339,7 +357,8 @@ def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): # we need absolute phases, since TZRMJD serves as the pulse # number reference. modelphase = ( - self.model.phase(self.toas, abs_phase=True) + delta_pulse_numbers + self.model.phase(self.toas, abs_phase=use_abs_phase) + + delta_pulse_numbers ) # First assign each TOA to the correct relative pulse number, including # and delta_pulse_numbers (from PHASE lines or adding phase jumps in GUI) @@ -365,6 +384,7 @@ def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): full = residualphase.int + residualphase.frac else: raise ValueError(f"Invalid track_mode '{self.track_mode}'") + # If we are using pulse numbers, do we really want to subtract any kind of mean? if not subtract_mean: return full @@ -379,6 +399,7 @@ def calc_phase_resids(self, subtract_mean=None, use_weighted_mean=None): ) w = 1.0 / (self.get_data_error().value ** 2) mean, err = weighted_mean(full, w) + return full - mean def calc_phase_mean(self, weighted=True): @@ -425,7 +446,11 @@ def calc_time_mean(self, calctype="taylor", weighted=True): return mean def calc_time_resids( - self, calctype="taylor", subtract_mean=None, use_weighted_mean=None + self, + calctype="taylor", + subtract_mean=None, + use_weighted_mean=None, + use_abs_phase=None, ): """Compute timing model residuals in time (seconds). @@ -442,8 +467,12 @@ def calc_time_resids( If `calctype` == "numerical", then try a numerical derivative If `calctype` == "taylor", evaluate the frequency with a Taylor series subtract_mean : bool or None, optional + Subtract the mean of the residuals. This is ignored if the `PhaseOffset` component + is present in the model. Default is to use the class attribute. use_weighted_mean : bool or None, optional - + Whether to use weighted mean for mean subtraction. Default is to use the class attribute. + use_abs_phase : bool or None, optional + Whether to use absolute phase (w.r.t. the TZR TOA). Default is to use the class attribute. Returns ------- @@ -458,23 +487,74 @@ def calc_time_resids( # if we are using the defaults, save the calculation if self.phase_resids is None: self.phase_resids = self.calc_phase_resids( - subtract_mean=subtract_mean, use_weighted_mean=use_weighted_mean + subtract_mean=subtract_mean, + use_weighted_mean=use_weighted_mean, + use_abs_phase=use_abs_phase, ) phase_resids = self.phase_resids else: phase_resids = self.calc_phase_resids( - subtract_mean=subtract_mean, use_weighted_mean=use_weighted_mean + subtract_mean=subtract_mean, + use_weighted_mean=use_weighted_mean, + use_abs_phase=use_abs_phase, ) return (phase_resids / self.get_PSR_freq(calctype=calctype)).to(u.s) - def calc_chi2(self, full_cov=False): + def _calc_gls_chi2(self): + """Compute the chi2 when correlated noise is present in the timing model. + If the system is not singular, it uses Cholesky factorization to evaluate this. + If the system is singular, it uses singular value decomposition instead.""" + self.update() + + residuals = self.time_resids.to(u.s).value + + M = self.model.noise_model_designmatrix(self.toas) + phi = self.model.noise_model_basis_weight(self.toas) + phiinv = 1 / phi + + # For implicit offset subtraction + if "PHOFF" not in self.model: + M = np.append(M, np.ones((len(self.toas), 1)), axis=1) + phiinv = np.append(phiinv, [0]) + + M, norm = normalize_designmatrix(M, None) + + phiinv /= norm**2 + Nvec = self.model.scaled_toa_uncertainty(self.toas).to(u.s).value ** 2 + cinv = 1 / Nvec + mtcm = np.dot(M.T, cinv[:, None] * M) + mtcm += np.diag(phiinv) + mtcy = np.dot(M.T, cinv * residuals) + + try: + c = cho_factor(mtcm) + xhat = cho_solve(c, mtcy) + except LinAlgError as e: + log.warning( + f"Degenerate conditions encountered when computing chi-squared: {e}" + ) + + U, s, Vt = scipy.linalg.svd(mtcm, full_matrices=False) + + bad = np.where(s <= 0)[0] + s[bad] = np.inf + + xhat = np.dot(Vt.T, np.dot(U.T, mtcy) / s) + + newres = residuals - np.dot(M, xhat) + + chi2 = np.dot(newres, cinv * newres) + np.dot(xhat, phiinv * xhat) + + return chi2 + + def calc_chi2(self): """Return the weighted chi-squared for the model and toas. If the errors on the TOAs are independent this is a straightforward calculation, but if the noise model introduces correlated errors then obtaining a meaningful chi-squared value requires a Cholesky - decomposition. This is carried out, here, by constructing a GLSFitter - and asking it to do the chi-squared computation but not a fit. + decomposition. This is carried out using the :method:`~pint.residuals.Residuals._calc_gls_chi2` + helper function. The return value here is available as self.chi2, which will not redo the computation unless necessary. @@ -487,21 +567,7 @@ def calc_chi2(self, full_cov=False): correctly return infinity. """ if self.model.has_correlated_errors: - log.trace("Using GLS fitter to compute residual chi2") - # Use GLS but don't actually fit - from pint.fitter import GLSFitter - - m = copy.deepcopy(self.model) - m.free_params = [] - f = GLSFitter(self.toas, m, residuals=self) - try: - return f.fit_toas(maxiter=1, full_cov=full_cov) - except LinAlgError as e: - log.warning( - "Degenerate conditions encountered when " - "computing chi-squared: %s" % (e,) - ) - return np.inf + return self._calc_gls_chi2() else: # Residual units are in seconds. Error units are in microseconds. toa_errors = self.get_data_error() diff --git a/src/pint/sampler.py b/src/pint/sampler.py index e4f49c6a1..53d09bddf 100644 --- a/src/pint/sampler.py +++ b/src/pint/sampler.py @@ -150,7 +150,7 @@ def get_chain(self): """ if self.sampler is None: raise ValueError("MCMCSampler object has not called initialize_sampler()") - return self.sampler.chain + return self.sampler.get_chain() def chains_to_dict(self, names): """ @@ -158,7 +158,8 @@ def chains_to_dict(self, names): """ if self.sampler is None: raise ValueError("MCMCSampler object has not called initialize_sampler()") - chains = [self.sampler.chain[:, :, ii].T for ii in range(len(names))] + samples = np.transpose(self.sampler.get_chain(), (1, 0, 2)) + chains = [samples[:, :, ii].T for ii in range(len(names))] return dict(zip(names, chains)) def run_mcmc(self, pos, nsteps): diff --git a/src/pint/scripts/convert_parfile.py b/src/pint/scripts/convert_parfile.py index a0b7ec749..55b45415b 100644 --- a/src/pint/scripts/convert_parfile.py +++ b/src/pint/scripts/convert_parfile.py @@ -44,9 +44,9 @@ def main(argv=None): ) parser.add_argument( "--nharms", - default=3, + default=7, type=int, - help="Number of harmonics (convert to ELL1H only)", + help="Number of harmonics (convert to ELL1H only); note that default value for tempo2 is 4", ) parser.add_argument( "--usestigma", diff --git a/src/pint/scripts/event_optimize.py b/src/pint/scripts/event_optimize.py index 23b05fc06..97ae53796 100755 --- a/src/pint/scripts/event_optimize.py +++ b/src/pint/scripts/event_optimize.py @@ -247,6 +247,82 @@ def get_fit_keyvals(model, phs=0.0, phserr=0.1): return fitkeys, np.asarray(fitvals), np.asarray(fiterrs) +def run_sampler_autocorr(sampler, pos, nsteps, burnin, csteps=100, crit1=10): + """Runs the sampler and checks for chain convergence. Return the converged sampler and the mean autocorrelation time per 100 steps + Parameters + ---------- + Sampler + The Emcee Ensemble Sampler + pos + The Initial positions of the walkers + nsteps : int + The number of integration steps + csteps : int + The interval at which the autocorrelation time is computed. + crit1 : int + The ratio of chain length to autocorrelation time to satisfy convergence + Returns + ------- + The sampler and the mean autocorrelation times + Note + ---- + The function checks for convergence of the chains every specified number of steps. + The criteria to check for convergence is: + 1. the chain has to be longer than the specified ratio times the estimated autocorrelation time + 2. the change in the estimated autocorrelation time is less than 1% + """ + autocorr = [] + old_tau = np.inf + converged1 = False + converged2 = False + for sample in sampler.sample(pos, iterations=nsteps, progress=True): + if not converged1: + # Checks if the iteration is past the burnin and checks for convergence at 10% tau change + if sampler.iteration >= burnin and sampler.iteration % csteps == 0: + tau = sampler.get_autocorr_time(tol=0, quiet=True) + if np.any(np.isnan(tau)): + continue + else: + x = np.mean(tau) + autocorr.append(x) + converged1 = np.all(tau * crit1 < sampler.iteration) + converged1 &= np.all(np.abs(old_tau - tau) / tau < 0.1) + # log.info("The mean estimated integrated autocorrelation step is: " + str(x)) + old_tau = tau + if converged1: + log.info( + "10 % convergence reached with a mean estimated integrated step: " + + str(x) + ) + else: + continue + else: + continue + else: + if not converged2: + # Checks for convergence at every 25 steps instead of 100 and tau change is 1% + if sampler.iteration % int(csteps / 4) == 0: + tau = sampler.get_autocorr_time(tol=0, quiet=True) + if np.any(np.isnan(tau)): + continue + else: + x = np.mean(tau) + autocorr.append(x) + converged2 = np.all(tau * crit1 < sampler.iteration) + converged2 &= np.all(np.abs(old_tau - tau) / tau < 0.01) + # log.info("The mean estimated integrated autocorrelation step is: " + str(x)) + old_tau = tau + converge_step = sampler.iteration + else: + continue + if converged2 and (sampler.iteration - burnin) >= 1000: + log.info(f"Convergence reached at {converge_step}") + break + else: + continue + return autocorr + + class emcee_fitter(Fitter): def __init__( self, toas=None, model=None, template=None, weights=None, phs=0.5, phserr=0.03 @@ -545,6 +621,13 @@ def main(argv=None): default=False, action="store_true", ) + parser.add_argument( + "--no-autocorr", + help="Turn the autocorrelation check function off", + default=False, + action="store_true", + dest="noautocorr", + ) args = parser.parse_args(argv) pint.logging.setup( @@ -820,7 +903,10 @@ def unwrapped_lnpost(theta): pool=pool, backend=backend, ) - sampler.run_mcmc(pos, nsteps) + if args.noautocorr: + sampler.run_mcmc(pos, nsteps, progress=True) + else: + autocorr = run_sampler_autocorr(sampler, pos, nsteps, burnin) pool.close() pool.join() except ImportError: @@ -828,16 +914,22 @@ def unwrapped_lnpost(theta): sampler = emcee.EnsembleSampler( nwalkers, ndim, ftr.lnposterior, blobs_dtype=dtype, backend=backend ) - sampler.run_mcmc(pos, nsteps) + if args.noautocorr: + sampler.run_mcmc(pos, nsteps, progress=True) + else: + autocorr = run_sampler_autocorr(sampler, pos, nsteps, burnin) else: sampler = emcee.EnsembleSampler( nwalkers, ndim, ftr.lnposterior, blobs_dtype=dtype, backend=backend ) - # The number is the number of points in the chain - sampler.run_mcmc(pos, nsteps) + if args.noautocorr: + sampler.run_mcmc(pos, nsteps, progress=True) + else: + autocorr = run_sampler_autocorr(sampler, pos, nsteps, burnin) def chains_to_dict(names, sampler): - chains = [sampler.chain[:, :, ii].T for ii in range(len(names))] + samples = np.transpose(sampler.get_chain(), (1, 0, 2)) + chains = [samples[:, :, ii].T for ii in range(len(names))] return dict(zip(names, chains)) def plot_chains(chain_dict, file=False): @@ -859,7 +951,9 @@ def plot_chains(chain_dict, file=False): plot_chains(chains, file=filename + "_chains.png") # Make the triangle plot. - samples = sampler.chain[:, burnin:, :].reshape((-1, ndim)) + samples = np.transpose(sampler.get_chain(discard=burnin), (1, 0, 2)).reshape( + (-1, ndim) + ) blobs = sampler.get_blobs() lnprior_samps = blobs["lnprior"] diff --git a/src/pint/scripts/event_optimize_MCMCFitter.py b/src/pint/scripts/event_optimize_MCMCFitter.py index bde72ed93..bbab8ccee 100755 --- a/src/pint/scripts/event_optimize_MCMCFitter.py +++ b/src/pint/scripts/event_optimize_MCMCFitter.py @@ -358,7 +358,10 @@ def plot_chains(chain_dict, file=False): plot_chains(chains, file=ftr.model.PSR.value + "_chains.png") # Make the triangle plot. - samples = sampler.sampler.chain[:, burnin:, :].reshape((-1, ftr.n_fit_params)) + # samples = sampler.sampler.chain[:, burnin:, :].reshape((-1, ftr.n_fit_params)) + samples = np.transpose( + sampler.sampler.get_chain(discard=burnin), (1, 0, 2) + ).reshape((-1, ftr.n_fit_params)) try: import corner diff --git a/src/pint/scripts/event_optimize_multiple.py b/src/pint/scripts/event_optimize_multiple.py index eda745c4e..41316a000 100755 --- a/src/pint/scripts/event_optimize_multiple.py +++ b/src/pint/scripts/event_optimize_multiple.py @@ -426,7 +426,10 @@ def plot_chains(chain_dict, file=False): plot_chains(chains, file=f"{ftr.model.PSR.value}_chains.png") # Make the triangle plot. - samples = sampler.sampler.chain[:, burnin:, :].reshape((-1, ftr.n_fit_params)) + # samples = sampler.sampler.chain[:, burnin:, :].reshape((-1, ftr.n_fit_params)) + samples = np.transpose( + sampler.sampler.get_chain(discard=burnin), (1, 0, 2) + ).reshape((-1, ftr.n_fit_params)) with contextlib.suppress(ImportError): import corner diff --git a/src/pint/simulation.py b/src/pint/simulation.py index 6185505c3..45b9eb5c8 100644 --- a/src/pint/simulation.py +++ b/src/pint/simulation.py @@ -294,7 +294,7 @@ def make_fake_toas_uniform( include_bipm=clk_version["include_bipm"], bipm_version=clk_version["bipm_version"], include_gps=clk_version["include_gps"], - planets=model["PLANET_SHAPIRO"].value, + planets=model["PLANET_SHAPIRO"].value if "PLANET_SHAPIRO" in model else False, ) ts.table["error"] = error @@ -426,7 +426,7 @@ def make_fake_toas_fromtim(timfile, model, add_noise=False, name="fake"): -------- :func:`make_fake_toas` """ - input_ts = pint.toa.get_TOAs(timfile) + input_ts = pint.toa.get_TOAs(timfile, planets=model.PLANET_SHAPIRO.value) if input_ts.is_wideband(): dm_errors = input_ts.get_dm_errors() diff --git a/src/pint/toa.py b/src/pint/toa.py index f0c2c6bee..682ca60ce 100644 --- a/src/pint/toa.py +++ b/src/pint/toa.py @@ -3,7 +3,7 @@ In particular, single TOAs are represented by :class:`pint.toa.TOA` objects, and if you want to manage a collection of these we recommend you use a :class:`pint.toa.TOAs` object as this makes certain operations much more convenient. You probably want to load one with -:func:`pint.toa.get_TOAs` (from a ``.tim`` file) or :func:`pint.toa.get_TOAs_array` (from a +:func:`pint.toa.get_TOAs` (from a ``.tim`` file) or :func:`pint.toa.get_TOAs_array` (from a :class:`numpy.ndarray` or :class:`astropy.time.Time` object). Warning @@ -150,7 +150,8 @@ def get_TOAs( timfile : str or list of strings or file-like Filename, list of filenames, or file-like object containing the TOA data. ephem : str or None - The name of the solar system ephemeris to use; defaults to ``pint.toa.EPHEM_default`` if ``None`` + The name of the solar system ephemeris to use; defaults to the EPHEM parameter + in the timing model (`model`) if it is given, otherwise defaults to ``pint.toa.EPHEM_default``. include_bipm : bool or None Whether to apply the BIPM clock correction. Defaults to True. bipm_version : str or None @@ -167,7 +168,7 @@ def get_TOAs( model : pint.models.timing_model.TimingModel or None If a valid timing model is passed, model commands (such as BIPM version, planet shapiro delay, and solar system ephemeris) that affect TOA loading - are applied. + are applied. The solar system ephemeris is superseded by the `ephem` parameter. usepickle : bool Whether to try to use pickle-based caching of loaded clock-corrected TOAs objects. tdb_method : str @@ -218,7 +219,11 @@ def get_TOAs( f'CLOCK = {model["CLOCK"].value} is not implemented. ' f"Using TT({bipm_default}) instead." ) - if planets is None and model["PLANET_SHAPIRO"].value: + if ( + planets is None + and "PLANET_SHAPIRO" in model + and model["PLANET_SHAPIRO"].value + ): planets = True log.debug("Using PLANET_SHAPIRO = True from the given model") @@ -316,6 +321,14 @@ def get_TOAs( if "pulse_number" in t.table.colnames and not include_pn: log.warning("'pulse_number' column exists but not being read in") t.remove_pulse_numbers() + + dm_data, valid_data = t.get_flag_value("pp_dm", as_type=float) + if len(valid_data) not in [0, len(t)]: + raise ValueError( + "Mixing narrowband and wideband toas in a TOAs object is not allowed. " + "Make sure that either all or no TOAs have the -pp_dm flag." + ) + return t @@ -1626,7 +1639,7 @@ def is_wideband(self): # there may be a more elegant way to do this dm_data, valid_data = self.get_flag_value("pp_dm", as_type=float) - return valid_data != [] + return len(valid_data) == len(self) def get_all_flags(self): """Return a list of all the flags used by any TOA.""" @@ -2692,7 +2705,8 @@ def merge_TOAs(TOAs_list, strict=False): """ # don't duplicate code: just use the existing method t = copy.deepcopy(TOAs_list[0]) - t.merge(*TOAs_list[1:], strict=strict) + if len(TOAs_list) > 1: + t.merge(*TOAs_list[1:], strict=strict) return t @@ -2980,4 +2994,5 @@ def get_TOAs_array( t.compute_TDBs(method=tdb_method, ephem=ephem) if "ssb_obs_pos" not in t.table.colnames: t.compute_posvels(ephem, planets) + return t diff --git a/src/pint/utils.py b/src/pint/utils.py index 2795d587c..8cfbd95bf 100644 --- a/src/pint/utils.py +++ b/src/pint/utils.py @@ -39,6 +39,8 @@ import textwrap from contextlib import contextmanager from pathlib import Path +from warnings import warn +import scipy import uncertainties import astropy.constants as const @@ -49,12 +51,18 @@ from astropy.time import Time from loguru import logger as log from scipy.special import fdtrc +from copy import deepcopy +import warnings import pint import pint.pulsar_ecliptic from pint.toa_select import TOASelect + __all__ = [ + "PINTPrecisionError", + "check_longdouble_precision", + "require_longdouble_precision", "PosVel", "numeric_partial", "numeric_partials", @@ -68,26 +76,39 @@ "lines_of", "interesting_lines", "pmtot", - "dmxselections", - "dmxparse", - "dmxstats", + "dmxrange", + "sum_print", "dmx_ranges_old", "dmx_ranges", + "dmxselections", + "dmxstats", + "dmxparse", + "get_prefix_timerange", + "get_prefix_timeranges", + "find_prefix_bytime", + "merge_dmx", + "split_dmx", + "split_swx", + "wavex_setup", + "translate_wave_to_wavex", + "get_wavex_freqs", + "get_wavex_amps", + "translate_wavex_to_wave", "weighted_mean", "ELL1_check", "FTest", "add_dummy_distance", "remove_dummy_distance", "info_string", - "print_color_examples", + "list_parameters", "colorize", + "print_color_examples", "group_iterator", "compute_hash", - "PINTPrecisionError", - "check_longdouble_precision", - "require_longdouble_precision", "get_conjunction", "divide_times", + "convert_dispersion_measure", + "parse_time", "get_unit", ] @@ -862,7 +883,7 @@ def dmxstats(model, toas, file=sys.stdout): """ mjds = toas.get_mjds() freqs = toas.table["freq"] - selected = np.zeros(len(toas), dtype=np.bool8) + selected = np.zeros(len(toas), dtype=np.bool_) DMX_mapping = model.get_prefix_mapping("DMX_") select_idx = dmxselections(model, toas) for ii in DMX_mapping: @@ -940,7 +961,7 @@ def dmxparse(fitter, save=False): DMX_Errs = np.zeros(len(dmx_epochs)) DMX_R1 = np.zeros(len(dmx_epochs)) DMX_R2 = np.zeros(len(dmx_epochs)) - mask_idxs = np.zeros(len(dmx_epochs), dtype=np.bool8) + mask_idxs = np.zeros(len(dmx_epochs), dtype=np.bool_) # Get DMX values (will be in units of 10^-3 pc cm^-3) for ii, epoch in enumerate(dmx_epochs): DMXs[ii] = getattr(fitter.model, "DMX_{:}".format(epoch)).value @@ -1265,6 +1286,342 @@ def split_swx(model, time): return index, newindex +def wavex_setup(model, T_span, freqs=None, n_freqs=None): + """ + Set-up a WaveX model based on either an array of user-provided frequencies or the wave number + frequency calculation. Sine and Cosine amplitudes are initially set to zero + + User specifies T_span and either freqs or n_freqs. This function assumes that the timing model does not already + have any WaveX components. See add_wavex_component() or add_wavex_components() to add WaveX components + to an existing WaveX model. + + Parameters + ---------- + + model : pint.models.timing_model.TimingModel + freqs : iterable of float or astropy.quantity.Quantity, None + User inputed base frequencies + n_freqs : int, None + Number of wave frequencies to calculate using the equation: freq_n = 2 * pi * n / T_span + Where n is the wave number, and T_span is the total time span of the toas in the fitter object + T_span : float, astropy.quantity.Quantity + Time span used to calculate nyquist frequency when using freqs + Time span used to calculate WaveX frequencies when using n_freqs + Usually to be set as the length of the timing baseline the model is being used for + + Returns + ------- + + indices : list + Indices that have been assigned to new WaveX components + """ + from pint.models.wavex import WaveX + + if (freqs is None) and (n_freqs is None): + raise ValueError( + "WaveX component base frequencies are not specified. " + "Please input either freqs or n_freqs" + ) + + if (freqs is not None) and (n_freqs is not None): + raise ValueError( + "Both freqs and n_freqs are specified. Only one or the other should be used" + ) + + if n_freqs <= 0: + raise ValueError("Must use a non-zero number of wave frequencies") + model.add_component(WaveX()) + if isinstance(T_span, u.quantity.Quantity): + T_span.to(u.d) + else: + T_span *= u.d + + nyqist_freq = 1.0 / (2.0 * T_span) + if freqs is not None: + if isinstance(freqs, u.quantity.Quantity): + freqs.to(u.d**-1) + else: + freqs *= u.d**-1 + if len(freqs) == 1: + model.WXFREQ_0001.quantity = freqs + else: + np.array(freqs) + freqs.sort() + if min(np.diff(freqs)) < nyqist_freq: + warnings.warn( + "Wave frequency spacing is finer than frequency resolution of data" + ) + model.WXFREQ_0001.quantity = freqs[0] + model.components["WaveX"].add_wavex_components(freqs[1:]) + + if n_freqs is not None: + if n_freqs == 1: + wave_freq = 2.0 * np.pi / T_span + model.WXFREQ_0001.quantity = wave_freq + else: + wave_numbers = np.arange(1, n_freqs + 1) + wave_freqs = 2.0 * np.pi * wave_numbers / T_span + model.WXFREQ_0001.quantity = wave_freqs[0] + model.components["WaveX"].add_wavex_components(wave_freqs[1:]) + return model.components["WaveX"].get_indices() + + +def _translate_wave_freqs(om, k): + """ + Use Wave model WAVEOM parameter to calculate a WaveX WXFREQ_ frequency parameter for wave number k + + Parameters + ---------- + + om : float or astropy.quantity.Quantity + Base frequency of Wave model solution - parameter WAVEOM + If float is given default units of 1/d assigned + k : int + wave number to use to calculate WaveX WXFREQ_ frequency parameter + + Returns + ------- + + WXFREQ_ quantity in units 1/d that can be used in WaveX model + """ + if isinstance(om, u.quantity.Quantity): + om.to(u.d**-1) + else: + om *= u.d**-1 + return (om * (k + 1)) / (2.0 * np.pi) + + +def _translate_wavex_freqs(wxfreq, k): + """ + Use WaveX model WXFREQ_ parameters and wave number k to calculate the Wave model WAVEOM frequency parameter. + + Parameters + ---------- + + wxfreq : float or astropy.quantity.Quantity + WaveX frequency from which the WAVEOM parameter will be calculated + If float is given default units of 1/d assigned + k : int + wave number to use to calculate Wave WAVEOM parameter + + Returns + ------- + + WAVEOM quantity in units 1/d that can be used in Wave model + """ + if isinstance(wxfreq, u.quantity.Quantity): + wxfreq.to(u.d**-1) + else: + wxfreq *= u.d**-1 + if len(wxfreq) == 1: + return (2.0 * np.pi * wxfreq) / (k + 1.0) + else: + wave_om = [ + ((2.0 * np.pi * wxfreq[i]) / (k[i] + 1.0)) for i in range(len(wxfreq)) + ] + if np.allclose(wave_om, wave_om[0], atol=1e-3): + om = sum(wave_om) / len(wave_om) + return om + else: + return False + + +def translate_wave_to_wavex(model): + """ + Go from a Wave model to a WaveX model + + WaveX frequencies get calculated based on the Wave model WAVEOM parameter and the number of WAVE parameters. + WXFREQ_000k = [WAVEOM * (k+1)] / [2 * pi] + + WaveX amplitudes are taken from the WAVE pair parameters + + Paramters + --------- + model : pint.models.timing_model.TimingModel + TimingModel containing a Wave model to be converted to a WaveX model + + Returns + ------- + New timing model with converted WaveX model included + """ + from pint.models.wavex import WaveX + + new_model = deepcopy(model) + wave_names = [ + f"WAVE{ii}" for ii in range(1, model.components["Wave"].num_wave_terms + 1) + ] + wave_terms = [getattr(model.components["Wave"], name) for name in wave_names] + wave_om = model.components["Wave"].WAVE_OM.quantity + wave_epoch = model.components["Wave"].WAVEEPOCH.quantity + new_model.remove_component("Wave") + new_model.add_component(WaveX()) + new_model.WXEPOCH.value = wave_epoch.value + for k, wave_term in enumerate(wave_terms): + wave_sin_amp, wave_cos_amp = wave_term.quantity + wavex_freq = _translate_wave_freqs(wave_om, k) + if k == 0: + new_model.WXFREQ_0001.value = wavex_freq.value + new_model.WXSIN_0001.value = -wave_sin_amp.value + new_model.WXCOS_0001.value = -wave_cos_amp.value + else: + new_model.components["WaveX"].add_wavex_component( + wavex_freq, wxsin=-wave_sin_amp, wxcos=-wave_cos_amp + ) + return new_model + + +def get_wavex_freqs(model, index=None, quantity=False): + """ + Return the WaveX frequencies for a timing model. + + If index is specified, returns the frequencies corresponding to the user-provided indices. + If index isn't specified, returns all WaveX frequencies in timing model + + Parameters + ---------- + model : pint.models.timing_model.TimingModel + Timing model from which to return WaveX frequencies + index : float, int, list, np.ndarray, None + Number or list/array of numbers corresponding to WaveX frequencies to return + quantity : bool + If set to True, returns a list of astropy.quanitity.Quantity rather than a list of prefixParameters + + Returns + ------- + List of WXFREQ_ parameters + """ + if index is None: + freqs = model.components["WaveX"].get_prefix_mapping_component("WXFREQ_") + if len(freqs) == 1: + values = getattr(model.components["WaveX"], freqs.values()) + else: + values = [ + getattr(model.components["WaveX"], param) for param in freqs.values() + ] + elif isinstance(index, (int, float, np.int64)): + idx_rf = f"{int(index):04d}" + values = getattr(model.components["WaveX"], "WXFREQ_" + idx_rf) + elif isinstance(index, (list, set, np.ndarray)): + idx_rf = [f"{int(idx):04d}" for idx in index] + values = [getattr(model.components["WaveX"], "WXFREQ_" + ind) for ind in idx_rf] + else: + raise TypeError( + f"index most be a float, int, set, list, array, or None - not {type(index)}" + ) + if quantity: + if len(values) == 1: + values = [values[0].quantity] + else: + values = [v.quantity for v in values] + return values + + +def get_wavex_amps(model, index=None, quantity=False): + """ + Return the WaveX amplitudes for a timing model. + + If index is specified, returns the sine/cosine amplitudes corresponding to the user-provided indices. + If index isn't specified, returns all WaveX sine/cosine amplitudes in timing model + + Parameters + ---------- + model : pint.models.timing_model.TimingModel + Timing model from which to return WaveX frequencies + index : float, int, list, np.ndarray, None + Number or list/array of numbers corresponding to WaveX amplitudes to return + quantity : bool + If set to True, returns a list of tuples of astropy.quanitity.Quantity rather than a list of prefixParameters tuples + + Returns + ------- + List of WXSIN_ and WXCOS_ parameters + """ + if index is None: + indices = ( + model.components["WaveX"].get_prefix_mapping_component("WXSIN_").keys() + ) + if len(indices) == 1: + values = ( + getattr(model.components["WaveX"], "WXSIN_" + f"{int(indices):04d}"), + getattr(model.components["WaveX"], "WXCOS_" + f"{int(indices):04d}"), + ) + else: + values = [ + ( + getattr(model.components["WaveX"], "WXSIN_" + f"{int(idx):04d}"), + getattr(model.components["WaveX"], "WXCOS_" + f"{int(idx):04d}"), + ) + for idx in indices + ] + elif isinstance(index, (int, float, np.int64)): + idx_rf = f"{int(index):04d}" + values = ( + getattr(model.components["WaveX"], "WXSIN_" + idx_rf), + getattr(model.components["WaveX"], "WXCOS_" + idx_rf), + ) + elif isinstance(index, (list, set, np.ndarray)): + idx_rf = [f"{int(idx):04d}" for idx in index] + values = [ + ( + getattr(model.components["WaveX"], "WXSIN_" + ind), + getattr(model.components["WaveX"], "WXCOS_" + ind), + ) + for ind in idx_rf + ] + else: + raise TypeError( + f"index most be a float, int, set, list, array, or None - not {type(index)}" + ) + if quantity: + if isinstance(values, tuple): + values = tuple(v.quantity for v in values) + if isinstance(values, list): + values = [tuple((v[0].quantity, v[1].quantity)) for v in values] + return values + + +def translate_wavex_to_wave(model): + """ + Go from a WaveX timing model to a Wave timing model. + WARNING: Not every WaveX model can be appropriately translated into a Wave model. This is dependent on the user's choice of frequencies in the WaveX model. + In order for a WaveX model to be able to be converted into a Wave model, every WaveX frequency must produce the same value of WAVEOM in the calculation: + + WAVEOM = [2 * pi * WXFREQ_000k] / (k + 1) + Paramters + --------- + model : pint.models.timing_model.TimingModel + TimingModel containing a WaveX model to be converted to a Wave model + + Returns + ------- + New timing model with converted Wave model included + """ + from pint.models.wave import Wave + + new_model = deepcopy(model) + indices = model.components["WaveX"].get_indices() + wxfreqs = get_wavex_freqs(model, indices, quantity=True) + wave_om = _translate_wavex_freqs(wxfreqs, (indices - 1)) + if wave_om == False: + raise ValueError( + "This WaveX model cannot be properly translated into a Wave model due to the WaveX frequencies not producing a consistent WAVEOM value" + ) + wave_amps = get_wavex_amps(model, index=indices, quantity=True) + new_model.remove_component("WaveX") + new_model.add_component(Wave()) + new_model.WAVEEPOCH.quantity = model.WXEPOCH.quantity + new_model.WAVE_OM.quantity = wave_om + new_model.WAVE1.quantity = tuple(w * -1.0 for w in wave_amps[0]) + if len(indices) > 1: + for i in range(1, len(indices)): + print(wave_amps[i]) + wave_amps[i] = tuple(w * -1.0 for w in wave_amps[i]) + new_model.components["Wave"].add_wave_component( + wave_amps[i], index=indices[i] + ) + return new_model + + def weighted_mean(arrin, weights_in, inputmean=None, calcerr=False, sdev=False): """Compute weighted mean of input values @@ -1333,10 +1690,10 @@ def ELL1_check( Checks whether the assumptions that allow ELL1 to be safely used are satisfied. To work properly, we should have: - :math:`asini/c e^3 \ll {\\rm timing precision} / \sqrt N_{\\rm TOA}` - or :math:`A1 E^3 \ll TRES / \sqrt N_{\\rm TOA}` + :math:`asini/c e^4 \ll {\\rm timing precision} / \sqrt N_{\\rm TOA}` + or :math:`A1 E^4 \ll TRES / \sqrt N_{\\rm TOA}` - since the ELL1 model now includes terms up to O(E^2) + since the ELL1 model now includes terms up to O(E^3) Parameters ---------- @@ -1357,12 +1714,12 @@ def ELL1_check( If outstring is True then returns a string summary instead. """ - lhs = A1 / const.c * E**3.0 + lhs = A1 / const.c * E**4.0 rhs = TRES / np.sqrt(NTOA) if outstring: s = "Checking applicability of ELL1 model -- \n" - s += " Condition is asini/c * ecc**3 << timing precision / sqrt(# TOAs) to use ELL1\n" - s += " asini/c * ecc**3 = {:.3g} \n".format(lhs.to(u.us)) + s += " Condition is asini/c * ecc**4 << timing precision / sqrt(# TOAs) to use ELL1\n" + s += " asini/c * ecc**4 = {:.3g} \n".format(lhs.to(u.us)) s += " TRES / sqrt(# TOAs) = {:.3g} \n".format(rhs.to(u.us)) if lhs * 50.0 < rhs: if outstring: @@ -1582,7 +1939,7 @@ def remove_dummy_distance(c): return c -def info_string(prefix_string="# ", comment=None): +def info_string(prefix_string="# ", comment=None, detailed=False): """Returns an informative string about the current state of PINT. Adds: @@ -1602,6 +1959,8 @@ def info_string(prefix_string="# ", comment=None): comment or similar) comment: str, optional a free-form comment string to be included if present + detailed: bool, optional + Include detailed version info on dependencies. Returns ------- @@ -1692,13 +2051,61 @@ def info_string(prefix_string="# ", comment=None): except (configparser.NoOptionError, configparser.NoSectionError, ImportError): username = getpass.getuser() - s = f""" - Created: {datetime.datetime.now().isoformat()} - PINT_version: {pint.__version__} - User: {username} - Host: {platform.node()} - OS: {platform.platform()} - """ + info_dict = { + "Created": f"{datetime.datetime.now().isoformat()}", + "PINT_version": pint.__version__, + "User": username, + "Host": platform.node(), + "OS": platform.platform(), + "Python": sys.version, + } + + if detailed: + from numpy import __version__ as numpy_version + from scipy import __version__ as scipy_version + from astropy import __version__ as astropy_version + from erfa import __version__ as erfa_version + from jplephem import __version__ as jpleph_version + from matplotlib import __version__ as matplotlib_version + from loguru import __version__ as loguru_version + from pint import __file__ as pint_file + + info_dict.update( + { + "endian": sys.byteorder, + "numpy_version": numpy_version, + "numpy_longdouble_precision": np.dtype(np.longdouble).name, + "scipy_version": scipy_version, + "astropy_version": astropy_version, + "pyerfa_version": erfa_version, + "jplephem_version": jpleph_version, + "matplotlib_version": matplotlib_version, + "loguru_version": loguru_version, + "Python_prefix": sys.prefix, + "PINT_file": pint_file, + } + ) + + if "CONDA_PREFIX" in os.environ: + conda_prefix = os.environ["CONDA_PREFIX"] + info_dict.update( + { + "Environment": "conda", + "conda_prefix": conda_prefix, + } + ) + elif "VIRTUAL_ENV" in os.environ: + venv_prefix = os.environ["VIRTUAL_ENV"] + info_dict.update( + { + "Environment": "virtualenv", + "virtualenv_prefix": venv_prefix, + } + ) + + s = "" + for key, val in info_dict.items(): + s += f"{key}: {val}\n" s = textwrap.dedent(s) # remove blank lines @@ -2079,3 +2486,36 @@ def get_unit(parname): ac = AllComponents() return ac.param_to_unit(parname) + + +def normalize_designmatrix(M, params): + """Normalize each row of the design matrix. + + This is used while computing the GLS chi2 and the GLS fitting step. The + normalized and unnormalized design matrices Mn and M are related by + M = Mn @ S + where S is a diagonal matrix containing the norms. This normalization is + OK because the GLS operations (fitting step, chi2 computation etc.) involve + the form + M @ (M.T @ N.inv() @ M).inv() @ M.T + and it is easy to see that the above expression doesn't change if we replace + M -> Mn. + + Different parameters can have different units and numerically vastly different + design matrix entries. The normalization step forces the design matrix entries + to have similar numericall values and hence improves the numerical precision of + the matrix operations. + """ + from pint.fitter import DegeneracyWarning + + norm = np.sqrt(np.sum(M**2, axis=0)) + + bad_params = [params[i] for i in np.where(norm == 0)[0]] + if len(bad_params) > 0 and params is not None: + warn( + f"Parameter degeneracy found in designmatrix! The offending parameters are {bad_params}.", + DegeneracyWarning, + ) + norm[norm == 0] = 1 + + return M / norm, norm diff --git a/tests/datafile/J1909-3744.NB.par b/tests/datafile/J1909-3744.NB.par new file mode 100644 index 000000000..e358891c1 --- /dev/null +++ b/tests/datafile/J1909-3744.NB.par @@ -0,0 +1,53 @@ +# Created: 2023-08-04T12:11:27.791090 +# PINT_version: 0.9.6+53.g447cc061.dirty +# User: Abhimanyu S (abhimanyu) +# Host: abhimanyu-HP-Notebook +# OS: Linux-5.15.0-71-generic-x86_64-with-glibc2.35 +# Python: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) +# [GCC 10.3.0] +# Format: pint +PSRJ J1909-3744 +EPHEM DE440 +CLK TT(BIPM2019) +UNITS TDB +START 58260.0274418715905556 +FINISH 59496.4896411149411921 +TIMEEPH FB90 +T2CMETHOD IAU2000B +DILATEFREQ N +DMDATA N +NTOA 446 +CHI2 13166.811752135152 +RAJ 19:09:47.42480160 0 0.00000036670717903709 +DECJ -37:44:14.90754000 0 0.00001603708497544348 +PMRA -9.51261566578421 0 0.001606518013582412 +PMDEC -35.776735309087286 0 0.0057765724888464666 +PX 0.881638358140426 0 0.013674560477413309 +POSEPOCH 58999.9997541495914071 +F0 339.31569192154273734 1 1.2497063444336193814e-12 +F1 -1.6123419575084687074e-15 1 4.3048206597047727197e-20 +F2 0.0 +PEPOCH 58999.9997541495914071 +CORRECT_TROPOSPHERE Y +PLANET_SHAPIRO N +NE_SW 0.0 +SWM 0.0 +DM 10.3912220010111820715 1 5.91828415377580018e-06 +DM1 0.000118226481794639765015 1 5.4915807592283010527e-06 +DM2 0.0 +DMEPOCH 59629.9997443813168694 +BINARY ELL1 +PB 1.5334494515017690281 0 1.3220826895008462359e-12 +PBDOT 5.053209847126312e-13 0 2.521391425976759e-15 +A1 1.8979910746557984 0 2.117833848195567e-08 +XDOT -3.9210500492434694e-16 0 7.037623119797259e-17 +M2 0.2086645878980989 0 0.0012758962708215615 +SINI 0.9980748600209708 0 5.844811546142236e-05 +TASC 55015.4279066849879101 0 9.73762114761625686e-10 +EPS1 2.6338029192577372046e-08 0 1.033583508265e-08 +EPS2 -1.0054034660955184656e-07 0 5.72187338209e-09 +# ECC 1.0393292586143181096e-07 +# OM 165.32038917886206575 +TZRMJD 59000.9659140826392014 +TZRSITE gmrt +TZRFRQ 1310.097656 diff --git a/tests/datafile/J1909-3744.NB.tim b/tests/datafile/J1909-3744.NB.tim new file mode 100644 index 000000000..73ca66135 --- /dev/null +++ b/tests/datafile/J1909-3744.NB.tim @@ -0,0 +1,448 @@ +FORMAT 1 +MODE 1 + J1909-3744_58260.018105_500.rfiClean.fits.tmp 431.20117200 58260.02744187417019361 4.04700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1620 -tmplt J1909-3744_b3_200.UB103.0001_0000.0604 -gof 0.0604 -nbin 32 -nch 128 -prof_snr 9.68 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58260.018105_500.rfiClean.fits.tmp 468.70117200 58260.02744187127044384 5.05300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1620 -tmplt J1909-3744_b3_200.UB103.0001_0000.157 -gof 0.157 -nbin 32 -nch 128 -prof_snr 27.59 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58260.018105_500.rfiClean.fits.tmp 481.20117200 58260.02744189119308160 7.53300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1620 -tmplt J1909-3744_b3_200.UB103.0001_0000.42 -gof 0.42 -nbin 32 -nch 128 -prof_snr 13.98 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 406.20117200 58276.89075233969991530 2.59400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0468 -gof 0.0468 -nbin 32 -nch 128 -prof_snr 8.05 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 418.70117200 58276.89075236643785161 2.03500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0265 -gof 0.0265 -nbin 32 -nch 128 -prof_snr 23.74 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 431.20117200 58276.89075234020707938 2.25500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.034 -gof 0.034 -nbin 32 -nch 128 -prof_snr 16.50 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 443.70117200 58276.89075236164423188 6.07400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.178 -gof 0.178 -nbin 32 -nch 128 -prof_snr 11.35 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 456.20117200 58276.89075236110978651 3.87600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0636 -gof 0.0636 -nbin 32 -nch 128 -prof_snr 23.39 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883898_500.rfiClean.fits.tmp 468.70117200 58276.89075233716987512 6.67000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.269 -gof 0.269 -nbin 32 -nch 128 -prof_snr 15.92 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58276.883836_1460.rfiClean.fits.tmp 1447.45117200 58276.89075207747612595 8.25300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1202.6 -tmplt J1909-3744_b5_200.UB103.0001_0000.302 -gof 0.302 -nbin 32 -nch 256 -prof_snr 12.89 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 406.20117200 58322.71355307555783298 3.96000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.118 -gof 0.118 -nbin 32 -nch 128 -prof_snr 8.49 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 418.70117200 58322.71355310236780767 2.54900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.0382 -gof 0.0382 -nbin 32 -nch 128 -prof_snr 19.49 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 431.20117200 58322.71355307612740049 4.57100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.0837 -gof 0.0837 -nbin 32 -nch 128 -prof_snr 8.58 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 443.70117200 58322.71355309765415242 3.31300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.063 -gof 0.063 -nbin 32 -nch 128 -prof_snr 32.80 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 456.20117200 58322.71355309706476788 2.68600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.0472 -gof 0.0472 -nbin 32 -nch 128 -prof_snr 17.67 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 468.70117200 58322.71355307323177541 6.15800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.24 -gof 0.24 -nbin 32 -nch 128 -prof_snr 10.23 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705298_500.rfiClean.fits.tmp 481.20117200 58322.71355309322670024 3.68600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1436.1 -tmplt J1909-3744_b3_200.UB103.0001_0000.0613 -gof 0.0613 -nbin 32 -nch 128 -prof_snr 16.00 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58322.705173_1460.rfiClean.fits.tmp 1372.45117200 58322.71343740788874399 3.36300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0677 -gof 0.0677 -nbin 32 -nch 256 -prof_snr 15.32 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58322.705173_1460.rfiClean.fits.tmp 1422.45117200 58322.71343742368262042 3.12900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0627 -gof 0.0627 -nbin 32 -nch 256 -prof_snr 41.65 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58322.705173_1460.rfiClean.fits.tmp 1447.45117200 58322.71343741523816817 6.58200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.228 -gof 0.228 -nbin 32 -nch 256 -prof_snr 15.92 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 406.20117200 58340.67935173040566355 5.08200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.131 -gof 0.131 -nbin 32 -nch 128 -prof_snr 9.38 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 418.70117200 58340.67935172312879644 3.63000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0722 -gof 0.0722 -nbin 32 -nch 128 -prof_snr 30.12 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 431.20117200 58340.67935173102694080 4.54100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.112 -gof 0.112 -nbin 32 -nch 128 -prof_snr 16.44 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 443.70117200 58340.67935175247785651 3.74100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0877 -gof 0.0877 -nbin 32 -nch 128 -prof_snr 34.34 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 456.20117200 58340.67935175201582609 3.25100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0934 -gof 0.0934 -nbin 32 -nch 128 -prof_snr 15.17 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 468.70117200 58340.67935172812905265 5.08800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.196 -gof 0.196 -nbin 32 -nch 128 -prof_snr 14.06 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.671113_500.rfiClean.fits.tmp 481.20117200 58340.67935174799753284 5.60600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1435.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.212 -gof 0.212 -nbin 32 -nch 128 -prof_snr 8.69 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58340.670989_1460.rfiClean.fits.tmp 1372.45117200 58340.67929364668714598 3.59200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0628 -gof 0.0628 -nbin 32 -nch 256 -prof_snr 13.63 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58340.670989_1460.rfiClean.fits.tmp 1397.45117200 58340.67929367146860997 7.49700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.251 -gof 0.251 -nbin 32 -nch 256 -prof_snr 34.78 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58355.627317_500.rfiClean.fits.tmp 406.20117200 58355.63560151723300606 3.92800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1438.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0652 -gof 0.0652 -nbin 32 -nch 128 -prof_snr 36.99 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58355.627317_500.rfiClean.fits.tmp 418.70117200 58355.63560154402996716 3.25700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1438.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0637 -gof 0.0637 -nbin 32 -nch 128 -prof_snr 26.50 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58355.627317_500.rfiClean.fits.tmp 456.20117200 58355.63560153881704906 2.22800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1438.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.0318 -gof 0.0318 -nbin 32 -nch 128 -prof_snr 21.30 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58355.627317_500.rfiClean.fits.tmp 468.70117200 58355.63560154899387911 5.32500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1438.8 -tmplt J1909-3744_b3_200.UB103.0001_0000.183 -gof 0.183 -nbin 32 -nch 128 -prof_snr 8.25 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58355.627255_1460.rfiClean.fits.tmp 1397.45117200 58355.63554372475302046 7.07300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.226 -gof 0.226 -nbin 32 -nch 256 -prof_snr 41.06 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58355.627255_1460.rfiClean.fits.tmp 1422.45117200 58355.63554371580709912 3.88700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0785 -gof 0.0785 -nbin 32 -nch 256 -prof_snr 15.09 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58355.627255_1460.rfiClean.fits.tmp 1447.45117200 58355.63554370730237864 5.75800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.169 -gof 0.169 -nbin 32 -nch 256 -prof_snr 9.78 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58371.623689_1460.rfiClean.fits.tmp 1372.45117200 58371.63195596767072360 7.67000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1440.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.156 -gof 0.156 -nbin 32 -nch 256 -prof_snr 10.59 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58389.515006_500.rfiClean.fits.tmp 431.20117200 58389.52321765361052286 6.59200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1433.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.217 -gof 0.217 -nbin 32 -nch 128 -prof_snr 12.95 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58389.515006_500.rfiClean.fits.tmp 443.70117200 58389.52321767528335172 2.96700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1433.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0594 -gof 0.0594 -nbin 32 -nch 128 -prof_snr 22.12 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58389.515006_500.rfiClean.fits.tmp 456.20117200 58389.52321767460782453 8.07400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1433.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.312 -gof 0.312 -nbin 32 -nch 128 -prof_snr 13.58 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58389.515006_500.rfiClean.fits.tmp 481.20117200 58389.52321767087434878 5.38400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1433.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.118 -gof 0.118 -nbin 32 -nch 128 -prof_snr 17.09 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 406.20117200 58440.46430533562529064 3.63000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0591 -gof 0.0591 -nbin 32 -nch 128 -prof_snr 14.61 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 418.70117200 58440.46430536242543141 2.90300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0502 -gof 0.0502 -nbin 32 -nch 128 -prof_snr 12.99 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 431.20117200 58440.46430533621471071 4.03500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0957 -gof 0.0957 -nbin 32 -nch 128 -prof_snr 28.46 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 443.70117200 58440.46430535763573033 5.71100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.202 -gof 0.202 -nbin 32 -nch 128 -prof_snr 9.70 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 456.20117200 58440.46430535715311905 2.44800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.041 -gof 0.041 -nbin 32 -nch 128 -prof_snr 43.10 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 468.70117200 58440.46430533336031132 3.35900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0777 -gof 0.0777 -nbin 32 -nch 128 -prof_snr 31.96 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453925_500.rfiClean.fits.tmp 481.20117200 58440.46430535332330436 3.62500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1799.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0893 -gof 0.0893 -nbin 32 -nch 128 -prof_snr 15.38 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58440.453863_1460.rfiClean.fits.tmp 1372.45117200 58440.46424738706902602 3.01300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1800.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0537 -gof 0.0537 -nbin 32 -nch 256 -prof_snr 24.78 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58440.453863_1460.rfiClean.fits.tmp 1447.45117200 58440.46424739443782670 5.11200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1800.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.134 -gof 0.134 -nbin 32 -nch 256 -prof_snr 19.58 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58467.359093_1460.rfiClean.fits.tmp 1372.45117200 58467.36771978819641760 4.40000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1500.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0967 -gof 0.0967 -nbin 32 -nch 256 -prof_snr 15.16 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58481.328778_500.rfiClean.fits.tmp 406.20117200 58481.33565947195513246 6.70400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.215 -gof 0.215 -nbin 32 -nch 128 -prof_snr 10.66 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58481.328778_500.rfiClean.fits.tmp 443.70117200 58481.33565949395783790 4.83300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0849 -gof 0.0849 -nbin 32 -nch 128 -prof_snr 8.81 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58481.328778_500.rfiClean.fits.tmp 456.20117200 58481.33565949338228762 6.34400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.239 -gof 0.239 -nbin 32 -nch 128 -prof_snr 8.47 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58481.328778_500.rfiClean.fits.tmp 481.20117200 58481.33565948938316836 7.70600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.416 -gof 0.416 -nbin 32 -nch 128 -prof_snr 13.57 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58481.328654_1460.rfiClean.fits.tmp 1372.45117200 58481.33554387190131152 7.57400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1200.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.215 -gof 0.215 -nbin 32 -nch 256 -prof_snr 13.13 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58481.328654_1460.rfiClean.fits.tmp 1397.45117200 58481.33554389670688778 8.33400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1200.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.314 -gof 0.314 -nbin 32 -nch 256 -prof_snr 10.90 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58481.328654_1460.rfiClean.fits.tmp 1422.45117200 58481.33554388769866250 3.32900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1200.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.0565 -gof 0.0565 -nbin 32 -nch 256 -prof_snr 21.96 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 406.20117200 58524.24115715143936711 4.62900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0942 -gof 0.0942 -nbin 32 -nch 128 -prof_snr 26.51 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 418.70117200 58524.24115717825272043 2.85400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0609 -gof 0.0609 -nbin 32 -nch 128 -prof_snr 17.85 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 431.20117200 58524.24115715194062659 3.00700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0516 -gof 0.0516 -nbin 32 -nch 128 -prof_snr 13.60 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 443.70117200 58524.24115717346655430 2.02700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.029 -gof 0.029 -nbin 32 -nch 128 -prof_snr 66.02 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 456.20117200 58524.24115717283101645 1.98300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0304 -gof 0.0304 -nbin 32 -nch 128 -prof_snr 218.81 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 468.70117200 58524.24115714894728058 3.29600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0582 -gof 0.0582 -nbin 32 -nch 128 -prof_snr 16.23 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233572_500.rfiClean.fits.tmp 481.20117200 58524.24115716896086425 4.30700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1319.4 -tmplt J1909-3744_b3_200.UB103.0001_0000.0966 -gof 0.0966 -nbin 32 -nch 128 -prof_snr 19.72 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58524.233447_1460.rfiClean.fits.tmp 1422.45117200 58524.24104140318195277 5.62300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1319.9 -tmplt J1909-3744_b5_200.UB103.0001_0000.137 -gof 0.137 -nbin 32 -nch 256 -prof_snr 23.35 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 406.20117200 58552.21766189769425637 3.81000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0841 -gof 0.0841 -nbin 32 -nch 128 -prof_snr 9.21 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 418.70117200 58552.21766189029021277 3.69400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0871 -gof 0.0871 -nbin 32 -nch 128 -prof_snr 24.79 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 431.20117200 58552.21766189818022497 3.71200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.0883 -gof 0.0883 -nbin 32 -nch 128 -prof_snr 18.13 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 443.70117200 58552.21766188554308386 5.63400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.235 -gof 0.235 -nbin 32 -nch 128 -prof_snr 35.17 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 456.20117200 58552.21766188476079051 5.34800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.153 -gof 0.153 -nbin 32 -nch 128 -prof_snr 28.40 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58552.210783_500.rfiClean.fits.tmp 468.70117200 58552.21766189513573408 4.13900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1197.2 -tmplt J1909-3744_b3_200.UB103.0001_0000.143 -gof 0.143 -nbin 32 -nch 128 -prof_snr 9.70 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 406.20117200 58567.03224519088930222 5.94600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.165 -gof 0.165 -nbin 32 -nch 128 -prof_snr 19.85 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 418.70117200 58567.03224521759619847 1.39600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0134 -gof 0.0134 -nbin 32 -nch 128 -prof_snr 44.72 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 431.20117200 58567.03224519135260806 2.96700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0547 -gof 0.0547 -nbin 32 -nch 128 -prof_snr 17.52 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 443.70117200 58567.03224521279961579 2.12000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0256 -gof 0.0256 -nbin 32 -nch 128 -prof_snr 13.11 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 456.20117200 58567.03224521226693255 2.48500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0397 -gof 0.0397 -nbin 32 -nch 128 -prof_snr 22.29 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 468.70117200 58567.03224518836461243 3.51900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.0943 -gof 0.0943 -nbin 32 -nch 128 -prof_snr 14.22 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025356_500.rfiClean.fits.tmp 481.20117200 58567.03224520831214051 4.87900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 12.5 -tobs 1199.3 -tmplt J1909-3744_b3_200.UB103.0001_0000.16 -gof 0.16 -nbin 32 -nch 128 -prof_snr 19.33 -pta InPTA -sys GM_GWB_500_100_b1 -group GM_GWB_500_100_b1_pre36 -bandno 3 + J1909-3744_58567.025294_1460.rfiClean.fits.tmp 1372.45117200 58567.03218731024035648 5.84500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 25 -tobs 1200.2 -tmplt J1909-3744_b5_200.UB103.0001_0000.158 -gof 0.158 -nbin 32 -nch 256 -prof_snr 15.73 -pta InPTA -sys GM_GWB_1460_100_b1 -group GM_GWB_1460_100_b1_pre36 -bandno 5 + J1909-3744_58413.563058_1460.rfiClean.fits.tmp 1310.09765600 58413.57672088701082913 0.42300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2371.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0123 -nbin 64 -nch 512 -prof_snr 103.87 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_pre36 -bandno 5 + J1909-3744_58413.563058_1460.rfiClean.fits.tmp 1410.09765600 58413.57672088134241051 1.18300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2371.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0682 -nbin 64 -nch 512 -prof_snr 60.24 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_pre36 -bandno 5 + J1909-3744_58431.518690_500.rfiClean.fits.tmp 411.71875000 58431.52908548918325948 5.09100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 1798.5 -tmplt J1909-3744_b3_200.UB103.std -gof 1.74 -nbin 256 -nch 16 -prof_snr 8.53 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_pre36 -bandno 3 + J1909-3744_58431.518690_500.rfiClean.fits.tmp 461.71875000 58431.52908550023324707 2.89700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 1798.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.774 -nbin 256 -nch 16 -prof_snr 8.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_pre36 -bandno 3 + J1909-3744_58431.518331_1460.rfiClean.fits.tmp 1410.09765600 58431.52891977399197287 1.24500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 1832.7 -tmplt J1909-3744_b5_200.UB103.std -gof 0.101 -nbin 64 -nch 512 -prof_snr 17.23 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_pre36 -bandno 5 + J1909-3744_59000.949438_500.rfiClean.fits.tmp 387.30468800 59000.96597200345442857 3.64000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2853.5 -tmplt J1909-3744_b3_200.UB103.std -gof 1.23 -nbin 128 -nch 64 -prof_snr 9.60 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59000.949438_500.rfiClean.fits.tmp 412.30468800 59000.96597198748037627 2.28400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2853.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.604 -nbin 128 -nch 64 -prof_snr 8.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59000.949438_500.rfiClean.fits.tmp 437.30468800 59000.96597200249215831 2.07900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2853.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.698 -nbin 128 -nch 64 -prof_snr 10.18 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59000.949438_500.rfiClean.fits.tmp 462.30468800 59000.96597200076813294 2.98900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2853.5 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 128 -nch 64 -prof_snr 14.88 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59000.949187_1460.rfiClean.fits.tmp 1310.09765600 59000.96591408264595202 1.35900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2883.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.099 -nbin 64 -nch 512 -prof_snr 28.43 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 312.30468800 59008.82146969937960890 0.68600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.676 -nbin 128 -nch 64 -prof_snr 39.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 337.30468800 59008.82146968531548126 0.71600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.438 -nbin 128 -nch 64 -prof_snr 39.26 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 362.30468800 59008.82146968072932935 0.87300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.92 -nbin 128 -nch 64 -prof_snr 22.36 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 387.30468800 59008.82146968328960668 0.39900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.507 -nbin 128 -nch 64 -prof_snr 65.53 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 412.30468800 59008.82146966729325399 0.41300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.572 -nbin 128 -nch 64 -prof_snr 94.43 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 437.30468800 59008.82146968232201800 0.56400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.96 -nbin 128 -nch 64 -prof_snr 37.61 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 462.30468800 59008.82146968058381020 0.46800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.875 -nbin 128 -nch 64 -prof_snr 113.39 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802359_500.rfiClean.fits.tmp 487.30468800 59008.82146968592691039 1.54600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.23 -nbin 128 -nch 64 -prof_snr 17.80 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59008.802202_1460.rfiClean.fits.tmp 1310.09765600 59008.82141193527299805 0.41300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3319.7 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00882 -nbin 64 -nch 512 -prof_snr 42.05 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59008.802202_1460.rfiClean.fits.tmp 1410.09765600 59008.82141196371551217 1.19800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3319.7 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0893 -nbin 64 -nch 512 -prof_snr 41.77 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 312.30468800 59015.93767357292886899 0.66900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.381 -nbin 128 -nch 64 -prof_snr 57.91 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 337.30468800 59015.93767355891340998 0.52100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.554 -nbin 128 -nch 64 -prof_snr 69.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 362.30468800 59015.93767355437023525 0.83900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.675 -nbin 128 -nch 64 -prof_snr 26.46 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 387.30468800 59015.93767355693090337 0.42000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.41 -nbin 128 -nch 64 -prof_snr 72.89 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 412.30468800 59015.93767354094857680 0.39100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.624 -nbin 128 -nch 64 -prof_snr 129.32 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 437.30468800 59015.93767355598487612 0.37200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.518 -nbin 128 -nch 64 -prof_snr 98.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 462.30468800 59015.93767355426194854 0.63500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.606 -nbin 128 -nch 64 -prof_snr 30.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918602_500.rfiClean.fits.tmp 487.30468800 59015.93767355960917342 0.77600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.55 -nbin 128 -nch 64 -prof_snr 24.66 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59015.918437_1460.rfiClean.fits.tmp 1310.09765600 59015.93767338610646433 1.01000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3321.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0587 -nbin 64 -nch 512 -prof_snr 14.35 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59015.918437_1460.rfiClean.fits.tmp 1410.09765600 59015.93767341451367159 3.68000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3321.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.85 -nbin 64 -nch 512 -prof_snr 12.85 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 312.30468800 59022.86684030216603603 0.44100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.37 -nbin 128 -nch 64 -prof_snr 79.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 337.30468800 59022.86684028808482338 0.48000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.512 -nbin 128 -nch 64 -prof_snr 86.71 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 362.30468800 59022.86684028347409736 0.47400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.558 -nbin 128 -nch 64 -prof_snr 61.58 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 387.30468800 59022.86684028601819918 0.25100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.338 -nbin 128 -nch 64 -prof_snr 134.66 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 412.30468800 59022.86684026999604313 0.29600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.396 -nbin 128 -nch 64 -prof_snr 184.92 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 437.30468800 59022.86684028500935995 0.24000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.335 -nbin 128 -nch 64 -prof_snr 251.50 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 462.30468800 59022.86684028327153939 0.36500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.568 -nbin 128 -nch 64 -prof_snr 110.07 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847789_500.rfiClean.fits.tmp 487.30468800 59022.86684028858755724 0.43800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.841 -nbin 128 -nch 64 -prof_snr 80.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59022.847632_1460.rfiClean.fits.tmp 1310.09765600 59022.86684011497468916 1.58500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3319.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.165 -nbin 64 -nch 512 -prof_snr 18.61 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 312.30468800 59032.78043964129703980 2.08300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.987 -nbin 128 -nch 64 -prof_snr 9.33 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 337.30468800 59032.78043962724803961 1.23300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.848 -nbin 128 -nch 64 -prof_snr 28.16 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 362.30468800 59032.78043962274331591 1.48400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.995 -nbin 128 -nch 64 -prof_snr 20.47 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 387.30468800 59032.78043962531478428 0.42000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.483 -nbin 128 -nch 64 -prof_snr 99.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 412.30468800 59032.78043960934706291 0.38100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.493 -nbin 128 -nch 64 -prof_snr 76.65 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 437.30468800 59032.78043962439922865 0.43300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.624 -nbin 128 -nch 64 -prof_snr 32.42 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 462.30468800 59032.78043962268510114 0.58600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 0.725 -nbin 128 -nch 64 -prof_snr 29.14 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759601_500.rfiClean.fits.tmp 487.30468800 59032.78043962803274525 2.36700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 128 -nch 64 -prof_snr 8.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59032.759420_1460.rfiClean.fits.tmp 1310.09765600 59032.78038177268469155 2.06100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3623.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.221 -nbin 64 -nch 512 -prof_snr 13.80 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59032.759420_1460.rfiClean.fits.tmp 1410.09765600 59032.78038180112969613 5.17900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3623.9 -tmplt J1909-3744_b5_200.UB103.std -gof 1.38 -nbin 64 -nch 512 -prof_snr 41.09 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 312.30468800 59044.89496511081765817 0.57600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.571 -nbin 128 -nch 64 -prof_snr 37.71 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 337.30468800 59044.89496509681621816 0.39500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.383 -nbin 128 -nch 64 -prof_snr 105.67 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 362.30468800 59044.89496509226535892 0.63800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.828 -nbin 128 -nch 64 -prof_snr 50.82 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 387.30468800 59044.89496509486053455 0.45800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.551 -nbin 128 -nch 64 -prof_snr 79.70 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 412.30468800 59044.89496507888123844 0.36100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.404 -nbin 128 -nch 64 -prof_snr 94.73 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 437.30468800 59044.89496509393284995 0.41300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.524 -nbin 128 -nch 64 -prof_snr 51.44 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 462.30468800 59044.89496509221446985 0.62400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.527 -nbin 128 -nch 64 -prof_snr 28.55 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875879_500.rfiClean.fits.tmp 487.30468800 59044.89496509755364428 0.56500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.738 -nbin 128 -nch 64 -prof_snr 55.12 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59044.875730_1460.rfiClean.fits.tmp 1310.09765600 59044.89496502645259568 1.39900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3320.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0991 -nbin 64 -nch 512 -prof_snr 18.30 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59044.875730_1460.rfiClean.fits.tmp 1410.09765600 59044.89496505492549261 1.61800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3320.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.182 -nbin 64 -nch 512 -prof_snr 32.42 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 312.30468800 59062.75121521255487878 0.53200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.514 -nbin 128 -nch 64 -prof_snr 124.93 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 337.30468800 59062.75121519855916574 0.46500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.388 -nbin 128 -nch 64 -prof_snr 96.52 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 362.30468800 59062.75121519403133874 0.66700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.788 -nbin 128 -nch 64 -prof_snr 40.34 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 387.30468800 59062.75121519661173508 0.47200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.709 -nbin 128 -nch 64 -prof_snr 99.25 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 412.30468800 59062.75121518064102943 0.43900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.483 -nbin 128 -nch 64 -prof_snr 64.35 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 437.30468800 59062.75121519569322359 0.48100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.71 -nbin 128 -nch 64 -prof_snr 51.84 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 462.30468800 59062.75121519397552206 0.56000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.694 -nbin 128 -nch 64 -prof_snr 50.43 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735445_500.rfiClean.fits.tmp 487.30468800 59062.75121519932519831 1.97700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2727.3 -tmplt J1909-3744_b3_200.UB103.std -gof 1.13 -nbin 128 -nch 64 -prof_snr 10.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59062.735280_1460.rfiClean.fits.tmp 1310.09765600 59062.75115734682985291 0.94100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2748.1 -tmplt J1909-3744_b5_200.UB103.std -gof 0.038 -nbin 64 -nch 512 -prof_snr 24.68 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59062.735280_1460.rfiClean.fits.tmp 1410.09765600 59062.75115737526717297 0.92500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2748.1 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0544 -nbin 64 -nch 512 -prof_snr 75.30 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 312.30468800 59075.66203688646991665 0.62100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.672 -nbin 128 -nch 64 -prof_snr 77.86 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 337.30468800 59075.66203687254741084 0.51600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.543 -nbin 128 -nch 64 -prof_snr 164.10 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 362.30468800 59075.66203686807009632 0.59700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.614 -nbin 128 -nch 64 -prof_snr 60.98 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 387.30468800 59075.66203687071829975 0.41800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.463 -nbin 128 -nch 64 -prof_snr 191.26 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 412.30468800 59075.66203685479185737 0.38200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.668 -nbin 128 -nch 64 -prof_snr 258.65 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 437.30468800 59075.66203686987652333 0.36200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.812 -nbin 128 -nch 64 -prof_snr 219.72 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642939_500.rfiClean.fits.tmp 462.30468800 59075.66203686818943552 0.36900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300 -tmplt J1909-3744_b3_200.UB103.std -gof 0.794 -nbin 128 -nch 64 -prof_snr 236.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59075.642774_1460.rfiClean.fits.tmp 1310.09765600 59075.66197901584238750 0.36500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3321.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00784 -nbin 64 -nch 512 -prof_snr 45.41 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59075.642774_1460.rfiClean.fits.tmp 1410.09765600 59075.66197904428538479 0.60900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3321.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0228 -nbin 64 -nch 512 -prof_snr 21.78 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 312.30468800 59082.67019667352520784 0.48500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.564 -nbin 128 -nch 64 -prof_snr 176.68 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 337.30468800 59082.67019665956486207 0.40900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.491 -nbin 128 -nch 64 -prof_snr 316.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 362.30468800 59082.67019665506121129 0.47700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.749 -nbin 128 -nch 64 -prof_snr 193.54 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 387.30468800 59082.67019665767913139 0.40400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.672 -nbin 128 -nch 64 -prof_snr 210.73 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 412.30468800 59082.67019664172822502 0.40000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.744 -nbin 128 -nch 64 -prof_snr 247.77 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 437.30468800 59082.67019665679713114 0.36000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.717 -nbin 128 -nch 64 -prof_snr 119.99 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 462.30468800 59082.67019665510057536 0.41400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.641 -nbin 128 -nch 64 -prof_snr 144.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.651116_500.rfiClean.fits.tmp 487.30468800 59082.67019666045609938 0.56200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.533 -nbin 128 -nch 64 -prof_snr 50.03 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59082.650928_1460.rfiClean.fits.tmp 1310.09765600 59082.67019645302661957 0.90400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3324.6 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0432 -nbin 64 -nch 512 -prof_snr 55.15 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59082.650928_1460.rfiClean.fits.tmp 1410.09765600 59082.67019648146987976 3.76600 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3324.6 -tmplt J1909-3744_b5_200.UB103.std -gof 0.726 -nbin 64 -nch 512 -prof_snr 13.71 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 312.30468800 59093.74508090818211770 0.71700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.925 -nbin 128 -nch 64 -prof_snr 29.77 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 337.30468800 59093.74508089422836932 0.53500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.558 -nbin 128 -nch 64 -prof_snr 102.87 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 362.30468800 59093.74508088971165165 0.53000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.609 -nbin 128 -nch 64 -prof_snr 74.90 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 387.30468800 59093.74508089233108166 0.44900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.684 -nbin 128 -nch 64 -prof_snr 82.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 412.30468800 59093.74508087637498122 0.57600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 128 -nch 64 -prof_snr 119.96 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 437.30468800 59093.74508089144561751 0.46900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.864 -nbin 128 -nch 64 -prof_snr 86.94 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 462.30468800 59093.74508088974247144 0.51700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.685 -nbin 128 -nch 64 -prof_snr 82.28 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725983_500.rfiClean.fits.tmp 487.30468800 59093.74508089511077458 0.48200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.667 -nbin 128 -nch 64 -prof_snr 52.49 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59093.725795_1460.rfiClean.fits.tmp 1310.09765600 59093.74502304176934331 1.35500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3325.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.107 -nbin 64 -nch 512 -prof_snr 17.07 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59093.725795_1460.rfiClean.fits.tmp 1410.09765600 59093.74502307021693781 1.49300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3325.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.137 -nbin 64 -nch 512 -prof_snr 28.94 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 312.30468800 59100.70480297626427202 0.84000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.88 -nbin 128 -nch 64 -prof_snr 41.53 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 337.30468800 59100.70480296241323614 0.67000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.712 -nbin 128 -nch 64 -prof_snr 49.97 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 362.30468800 59100.70480295798673964 0.64400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 1.1 -nbin 128 -nch 64 -prof_snr 85.39 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 387.30468800 59100.70480296068346604 0.41700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.59 -nbin 128 -nch 64 -prof_snr 182.59 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 412.30468800 59100.70480294478975480 0.41700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.534 -nbin 128 -nch 64 -prof_snr 75.10 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 437.30468800 59100.70480295992014774 0.38100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.737 -nbin 128 -nch 64 -prof_snr 141.23 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 462.30468800 59100.70480295826040873 0.34600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.523 -nbin 128 -nch 64 -prof_snr 121.00 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687517_500.rfiClean.fits.tmp 487.30468800 59100.70480296365370876 0.57200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2982.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.727 -nbin 128 -nch 64 -prof_snr 71.44 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59100.687367_1460.rfiClean.fits.tmp 1310.09765600 59100.70474530628587573 1.20700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3010.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0712 -nbin 64 -nch 512 -prof_snr 19.10 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59100.687367_1460.rfiClean.fits.tmp 1410.09765600 59100.70474533474925138 1.71400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3010.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.169 -nbin 64 -nch 512 -prof_snr 33.13 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 312.30468800 59113.58657389633759394 5.54200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.727 -nbin 128 -nch 64 -prof_snr 9.60 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 387.30468800 59113.58657388051592463 1.08300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.18 -nbin 128 -nch 64 -prof_snr 16.35 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 412.30468800 59113.58657386456390981 0.72000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 128 -nch 64 -prof_snr 34.83 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 437.30468800 59113.58657387964004570 0.34800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.617 -nbin 128 -nch 64 -prof_snr 108.90 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 462.30468800 59113.58657387794647775 0.43700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.935 -nbin 128 -nch 64 -prof_snr 71.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565751_500.rfiClean.fits.tmp 487.30468800 59113.58657388331123528 2.07000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3599.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.82 -nbin 128 -nch 64 -prof_snr 8.32 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59113.565547_1460.rfiClean.fits.tmp 1310.09765600 59113.58651609794936732 2.76400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3625.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.306 -nbin 64 -nch 512 -prof_snr 11.08 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59113.565547_1460.rfiClean.fits.tmp 1410.09765600 59113.58651612648167273 6.11800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3625.9 -tmplt J1909-3744_b5_200.UB103.std -gof 1.92 -nbin 64 -nch 512 -prof_snr 19.45 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 312.30468800 59133.44241894653324465 0.80400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.703 -nbin 128 -nch 64 -prof_snr 32.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 337.30468800 59133.44241893259953002 0.47300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.508 -nbin 128 -nch 64 -prof_snr 111.80 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 362.30468800 59133.44241892809880312 0.59700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.962 -nbin 128 -nch 64 -prof_snr 95.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 387.30468800 59133.44241893072287297 0.43700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.743 -nbin 128 -nch 64 -prof_snr 116.47 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 412.30468800 59133.44241891478215933 0.44500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.786 -nbin 128 -nch 64 -prof_snr 97.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 437.30468800 59133.44241892985715481 0.46200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.804 -nbin 128 -nch 64 -prof_snr 88.83 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 462.30468800 59133.44241892815681538 0.57700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.72 -nbin 128 -nch 64 -prof_snr 29.37 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423368_500.rfiClean.fits.tmp 487.30468800 59133.44241893351481210 1.62400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.976 -nbin 128 -nch 64 -prof_snr 12.62 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59133.423180_1460.rfiClean.fits.tmp 1310.09765600 59133.44241872612561295 2.34200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3325.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.214 -nbin 64 -nch 512 -prof_snr 11.15 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59133.423180_1460.rfiClean.fits.tmp 1410.09765600 59133.44241875456674862 2.40700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3325.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.39 -nbin 64 -nch 512 -prof_snr 32.11 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 312.10937500 59156.51498825089661793 0.58700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.06 -nbin 256 -nch 32 -prof_snr 58.70 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 337.10937500 59156.51498826972306588 0.48500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 56.06 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 362.10937500 59156.51498826422101374 0.62800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.892 -nbin 256 -nch 32 -prof_snr 23.94 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 387.10937500 59156.51498826609591575 0.45700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.894 -nbin 256 -nch 32 -prof_snr 57.68 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 412.10937500 59156.51498824957731770 0.32200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.834 -nbin 256 -nch 32 -prof_snr 100.53 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 437.10937500 59156.51498826419402377 0.32700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 256 -nch 32 -prof_snr 116.16 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 462.10937500 59156.51498826213757809 0.44000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 256 -nch 32 -prof_snr 102.70 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495892_500.rfiClean.fits.tmp 487.10937500 59156.51498826720612101 0.39900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 256 -nch 32 -prof_snr 109.54 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59156.495735_1460.rfiClean.fits.tmp 1310.09765600 59156.51498812630108759 0.53300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0159 -nbin 64 -nch 512 -prof_snr 52.43 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59156.495735_1460.rfiClean.fits.tmp 1410.09765600 59156.51498815475422433 1.01600 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0609 -nbin 64 -nch 512 -prof_snr 48.30 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 312.10937500 59166.41336783935703281 0.53800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.991 -nbin 256 -nch 32 -prof_snr 48.65 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 337.10937500 59166.41336785830362288 0.44700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.32 -nbin 256 -nch 32 -prof_snr 75.36 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 362.10937500 59166.41336785291183986 0.69000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.964 -nbin 256 -nch 32 -prof_snr 35.54 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 387.10937500 59166.41336785485246708 0.42100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.779 -nbin 256 -nch 32 -prof_snr 111.69 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 412.10937500 59166.41336783837297730 0.23900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.78 -nbin 256 -nch 32 -prof_snr 151.58 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 437.10937500 59166.41336785304654455 0.32800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.11 -nbin 256 -nch 32 -prof_snr 76.41 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 462.10937500 59166.41336785102564377 0.30100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.18 -nbin 256 -nch 32 -prof_snr 204.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59166.394275_500.rfiClean.fits.tmp 487.10937500 59166.41336785614436877 0.38400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.33 -nbin 256 -nch 32 -prof_snr 133.71 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 312.10937500 59175.38067110497760837 0.39300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.93 -nbin 256 -nch 32 -prof_snr 86.58 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 337.10937500 59175.38067112387023982 0.38800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.767 -nbin 256 -nch 32 -prof_snr 74.62 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 362.10937500 59175.38067111841586510 0.62400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.911 -nbin 256 -nch 32 -prof_snr 25.83 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 387.10937500 59175.38067112032387485 0.36600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.873 -nbin 256 -nch 32 -prof_snr 51.64 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 412.10937500 59175.38067110382368696 0.52900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 1.48 -nbin 256 -nch 32 -prof_snr 42.58 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 437.10937500 59175.38067111847081492 0.35700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 1.35 -nbin 256 -nch 32 -prof_snr 75.65 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 462.10937500 59175.38067111642827811 0.36500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 0.789 -nbin 256 -nch 32 -prof_snr 98.63 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59175.361582_500.rfiClean.fits.tmp 487.10937500 59175.38067112151517080 0.69000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.3 -tmplt J1909-3744_b3_200.UB103.std -gof 1.06 -nbin 256 -nch 32 -prof_snr 26.75 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 312.10937500 59196.38142360323529445 0.49300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 256 -nch 32 -prof_snr 69.09 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 337.10937500 59196.38142362199801738 0.44600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 256 -nch 32 -prof_snr 86.84 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 362.10937500 59196.38142361643802758 0.51400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 256 -nch 32 -prof_snr 35.06 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 387.10937500 59196.38142361825978810 0.31700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.895 -nbin 256 -nch 32 -prof_snr 105.50 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 412.10937500 59196.38142360169329947 0.32100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.816 -nbin 256 -nch 32 -prof_snr 105.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 437.10937500 59196.38142361627724242 0.28500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.32 -nbin 256 -nch 32 -prof_snr 157.44 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 462.10937500 59196.38142361418290349 0.30700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.12 -nbin 256 -nch 32 -prof_snr 99.91 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362360_500.rfiClean.fits.tmp 487.10937500 59196.38142361923869927 0.38300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.15 -nbin 256 -nch 32 -prof_snr 70.06 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59196.362164_1460.rfiClean.fits.tmp 1310.09765600 59196.38142337583112607 0.29900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00482 -nbin 64 -nch 512 -prof_snr 102.22 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59196.362164_1460.rfiClean.fits.tmp 1410.09765600 59196.38142340426798782 1.82700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.221 -nbin 64 -nch 512 -prof_snr 65.93 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 312.10937500 59208.41348353847577357 0.63900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.995 -nbin 256 -nch 32 -prof_snr 31.07 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 337.10937500 59208.41348355723272689 0.50500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 256 -nch 32 -prof_snr 46.77 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 362.10937500 59208.41348355168397077 0.62100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.38 -nbin 256 -nch 32 -prof_snr 39.17 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 387.10937500 59208.41348355348698362 0.49800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.859 -nbin 256 -nch 32 -prof_snr 42.75 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 412.10937500 59208.41348353691948958 0.38700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.33 -nbin 256 -nch 32 -prof_snr 51.83 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 437.10937500 59208.41348355151027150 0.37100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 256 -nch 32 -prof_snr 100.51 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 462.10937500 59208.41348354941106535 0.43100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 256 -nch 32 -prof_snr 62.69 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394347_500.rfiClean.fits.tmp 487.10937500 59208.41348355443760809 0.76900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.879 -nbin 256 -nch 32 -prof_snr 18.95 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59208.394128_1460.rfiClean.fits.tmp 1410.09765600 59208.41336791489031555 2.10100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3327.3 -tmplt J1909-3744_b5_200.UB103.std -gof 0.254 -nbin 64 -nch 512 -prof_snr 10.29 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 312.10937500 59217.28292800833458287 0.61900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.997 -nbin 256 -nch 32 -prof_snr 40.00 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 337.10937500 59217.28292802713938769 0.55800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.11 -nbin 256 -nch 32 -prof_snr 48.11 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 362.10937500 59217.28292802162112807 0.77300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.25 -nbin 256 -nch 32 -prof_snr 23.99 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 387.10937500 59217.28292802348464363 0.43600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.803 -nbin 256 -nch 32 -prof_snr 37.24 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 412.10937500 59217.28292800693452591 0.38500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.849 -nbin 256 -nch 32 -prof_snr 122.23 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 437.10937500 59217.28292802155418428 0.39200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.975 -nbin 256 -nch 32 -prof_snr 53.12 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 462.10937500 59217.28292801948358459 0.37300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.817 -nbin 256 -nch 32 -prof_snr 124.43 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263820_500.rfiClean.fits.tmp 487.10937500 59217.28292802454494037 0.56600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.12 -nbin 256 -nch 32 -prof_snr 30.61 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59217.263639_1460.rfiClean.fits.tmp 1310.09765600 59217.28287023394300803 0.90400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0415 -nbin 64 -nch 512 -prof_snr 30.54 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59217.263639_1460.rfiClean.fits.tmp 1410.09765600 59217.28287026235818402 1.03200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3323.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0649 -nbin 64 -nch 512 -prof_snr 36.61 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 312.11937500 59230.23078686136325288 0.57000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 48.93 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 337.11937500 59230.23078688007208825 0.40100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.968 -nbin 256 -nch 32 -prof_snr 171.07 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 362.11937500 59230.23078687448481361 0.83500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.847 -nbin 256 -nch 32 -prof_snr 28.70 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 387.11937500 59230.23078687630044215 0.32000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.641 -nbin 256 -nch 32 -prof_snr 62.20 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 412.11937500 59230.23078685972753021 0.27200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 100.37 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 437.11937500 59230.23078687429560318 0.26200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.731 -nbin 256 -nch 32 -prof_snr 172.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 462.11937500 59230.23078687219585703 0.36100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.884 -nbin 256 -nch 32 -prof_snr 49.92 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211687_500.rfiClean.fits.tmp 487.11937500 59230.23078687724612834 1.80600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.5 -tmplt J1909-3744_b3_200.UB103.std -gof 0.863 -nbin 256 -nch 32 -prof_snr 9.88 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59230.211553_1460.rfiClean.fits.tmp 1310.10765600 59230.23067128517423185 0.79000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.03 -nbin 64 -nch 512 -prof_snr 32.22 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59230.211553_1460.rfiClean.fits.tmp 1410.10765600 59230.23067131359772475 1.36000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.11 -nbin 64 -nch 512 -prof_snr 26.88 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 312.11937500 59238.32471056557042743 0.37400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 256 -nch 32 -prof_snr 81.28 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 337.11937500 59238.32471058439348965 0.40300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.88 -nbin 256 -nch 32 -prof_snr 161.06 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 362.11937500 59238.32471057888010080 0.38900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.33 -nbin 256 -nch 32 -prof_snr 73.82 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 387.11937500 59238.32471058073217307 0.33900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.97 -nbin 256 -nch 32 -prof_snr 83.50 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 412.11937500 59238.32471056418969013 0.39000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 101.64 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 437.11937500 59238.32471057879321208 0.37300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 256 -nch 32 -prof_snr 46.16 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 462.11937500 59238.32471057672466586 0.32300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.845 -nbin 256 -nch 32 -prof_snr 138.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305625_500.rfiClean.fits.tmp 487.11937500 59238.32471058178301959 0.47100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.963 -nbin 256 -nch 32 -prof_snr 72.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59238.305499_1460.rfiClean.fits.tmp 1310.10765600 59238.32465269126201335 1.21900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3312.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0714 -nbin 64 -nch 512 -prof_snr 28.10 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59238.305499_1460.rfiClean.fits.tmp 1410.10765600 59238.32465271970542275 2.01500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3312.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.214 -nbin 64 -nch 512 -prof_snr 11.39 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 312.11937500 59252.12853006084667129 0.27400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.771 -nbin 256 -nch 32 -prof_snr 158.90 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 337.11937500 59252.12853007964390173 0.27600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.889 -nbin 256 -nch 32 -prof_snr 280.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 362.11937500 59252.12853007411764139 0.34000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.775 -nbin 256 -nch 32 -prof_snr 64.66 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 387.11937500 59252.12853007596131150 0.29300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 256 -nch 32 -prof_snr 150.30 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 412.11937500 59252.12853005941309092 0.26400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.37 -nbin 256 -nch 32 -prof_snr 323.20 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 437.11937500 59252.12853007401148275 0.22800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.33 -nbin 256 -nch 32 -prof_snr 286.42 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 462.11937500 59252.12853007192276777 0.28800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.17 -nbin 256 -nch 32 -prof_snr 205.93 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109458_500.rfiClean.fits.tmp 487.11937500 59252.12853007695850849 0.70200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.866 -nbin 256 -nch 32 -prof_snr 21.27 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59252.109331_1460.rfiClean.fits.tmp 1310.10765600 59252.12847222165160943 0.30200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00479 -nbin 64 -nch 512 -prof_snr 102.22 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59252.109331_1460.rfiClean.fits.tmp 1410.10765600 59252.12847225008738050 1.24600 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0987 -nbin 64 -nch 512 -prof_snr 49.78 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 312.11937500 59264.15798600271113372 0.78700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 0.867 -nbin 256 -nch 32 -prof_snr 27.45 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 337.11937500 59264.15798602139024354 0.86100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 1.22 -nbin 256 -nch 32 -prof_snr 31.19 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 362.11937500 59264.15798601579682625 0.90900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 0.759 -nbin 256 -nch 32 -prof_snr 16.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 387.11937500 59264.15798601758379505 0.42800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 0.779 -nbin 256 -nch 32 -prof_snr 69.68 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 412.11937500 59264.15798600095779491 0.41200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 1.02 -nbin 256 -nch 32 -prof_snr 43.07 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 437.11937500 59264.15798601551711755 0.26900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 256 -nch 32 -prof_snr 189.32 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 462.11937500 59264.15798601339596630 0.23500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 256 -nch 32 -prof_snr 242.73 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138904_500.rfiClean.fits.tmp 487.11937500 59264.15798601841428450 0.41900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3297.7 -tmplt J1909-3744_b3_200.UB103.std -gof 1.44 -nbin 256 -nch 32 -prof_snr 70.78 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59264.138770_1460.rfiClean.fits.tmp 1310.10765600 59264.15798580894231407 0.26300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.6 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00423 -nbin 64 -nch 512 -prof_snr 137.81 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59264.138770_1460.rfiClean.fits.tmp 1410.10765600 59264.15798583737418781 1.13800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.6 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0754 -nbin 64 -nch 512 -prof_snr 132.56 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 312.11937500 59272.12123826262623183 1.08700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.957 -nbin 256 -nch 32 -prof_snr 21.76 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 337.11937500 59272.12123828135598558 0.73400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.958 -nbin 256 -nch 32 -prof_snr 28.63 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 362.11937500 59272.12123827579480562 1.60300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.833 -nbin 256 -nch 32 -prof_snr 13.59 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 387.11937500 59272.12123827764671447 0.86900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 22.22 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 412.11937500 59272.12123826105519342 1.04300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 256 -nch 32 -prof_snr 21.22 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 437.11937500 59272.12123827564338185 0.95400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1 -nbin 256 -nch 32 -prof_snr 25.06 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 462.11937500 59272.12123827355548400 1.06900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.976 -nbin 256 -nch 32 -prof_snr 14.93 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.102112_500.rfiClean.fits.tmp 487.11937500 59272.12123827862182068 1.91200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3300.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 256 -nch 32 -prof_snr 11.98 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59272.101993_1460.rfiClean.fits.tmp 1310.10765600 59272.12118042370470405 0.23000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3313.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00364 -nbin 64 -nch 512 -prof_snr 93.71 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59272.101993_1460.rfiClean.fits.tmp 1410.10765600 59272.12118045214162976 1.04200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3313.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0619 -nbin 64 -nch 512 -prof_snr 30.72 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 312.11937500 59281.08362267370583254 0.94100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 256 -nch 32 -prof_snr 16.72 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 337.11937500 59281.08362269241316866 0.61800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.15 -nbin 256 -nch 32 -prof_snr 52.78 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 362.11937500 59281.08362268680181728 1.86200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 256 -nch 32 -prof_snr 10.37 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 387.11937500 59281.08362268858081379 0.52200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.946 -nbin 256 -nch 32 -prof_snr 72.30 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 412.11937500 59281.08362267197330553 0.37100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.816 -nbin 256 -nch 32 -prof_snr 55.96 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 437.11937500 59281.08362268652196647 0.30100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.889 -nbin 256 -nch 32 -prof_snr 100.22 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 462.11937500 59281.08362268440627219 0.40500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.909 -nbin 256 -nch 32 -prof_snr 79.30 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064567_500.rfiClean.fits.tmp 487.11937500 59281.08362268943824702 0.99000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.968 -nbin 256 -nch 32 -prof_snr 17.01 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59281.064433_1460.rfiClean.fits.tmp 1310.10765600 59281.08356477108543814 0.52000 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0182 -nbin 64 -nch 512 -prof_snr 40.40 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59281.064433_1460.rfiClean.fits.tmp 1410.10765600 59281.08356479950712270 1.10900 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0704 -nbin 64 -nch 512 -prof_snr 19.77 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 312.11937500 59301.04218735704833776 0.86300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.23 -nbin 256 -nch 32 -prof_snr 28.47 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 337.11937500 59301.04218737575213183 0.63100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 256 -nch 32 -prof_snr 33.10 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 362.11937500 59301.04218737011310481 1.47400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.89 -nbin 256 -nch 32 -prof_snr 12.17 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 387.11937500 59301.04218737189760446 0.76700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 256 -nch 32 -prof_snr 31.14 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 412.11937500 59301.04218735530996298 0.58900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.819 -nbin 256 -nch 32 -prof_snr 43.52 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 437.11937500 59301.04218736985528082 0.59800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.736 -nbin 256 -nch 32 -prof_snr 24.74 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 462.11937500 59301.04218736773999865 0.87100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.01 -nbin 256 -nch 32 -prof_snr 17.05 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.023081_500.rfiClean.fits.tmp 487.11937500 59301.04218737276370632 2.38500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.977 -nbin 256 -nch 32 -prof_snr 8.26 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59301.022947_1460.rfiClean.fits.tmp 1310.10765600 59301.04212942028549094 0.67600 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0304 -nbin 64 -nch 512 -prof_snr 27.84 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59301.022947_1460.rfiClean.fits.tmp 1410.10765600 59301.04212944872497104 1.16400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0874 -nbin 64 -nch 512 -prof_snr 23.42 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59309.171314_500.rfiClean.fits.tmp 312.11937500 59309.17696719533727645 2.68600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 971.74 -tmplt J1909-3744_b3_200.UB103.std -gof 0.891 -nbin 256 -nch 32 -prof_snr 8.76 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59309.171314_500.rfiClean.fits.tmp 337.11937500 59309.17696721410243299 3.30700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 971.74 -tmplt J1909-3744_b3_200.UB103.std -gof 1.16 -nbin 256 -nch 32 -prof_snr 8.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59309.171314_500.rfiClean.fits.tmp 387.11937500 59309.17696721034608842 0.82300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 971.74 -tmplt J1909-3744_b3_200.UB103.std -gof 0.998 -nbin 256 -nch 32 -prof_snr 24.09 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59309.171314_500.rfiClean.fits.tmp 412.11937500 59309.17696719377674341 0.46000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 971.74 -tmplt J1909-3744_b3_200.UB103.std -gof 0.635 -nbin 256 -nch 32 -prof_snr 62.19 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59309.171314_500.rfiClean.fits.tmp 437.11937500 59309.17696720835692759 0.69700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 971.74 -tmplt J1909-3744_b3_200.UB103.std -gof 0.947 -nbin 256 -nch 32 -prof_snr 24.24 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59309.171273_1460.rfiClean.fits.tmp 1310.10765600 59309.17690973176366853 0.78100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 976.43 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0315 -nbin 64 -nch 512 -prof_snr 65.46 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59309.171273_1460.rfiClean.fits.tmp 1410.10765600 59309.17690976022413807 2.21500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 976.43 -tmplt J1909-3744_b5_200.UB103.std -gof 0.179 -nbin 64 -nch 512 -prof_snr 22.13 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 311.72875000 59349.00833327630839165 0.28400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.74 -nbin 512 -nch 16 -prof_snr 151.94 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 336.72875000 59349.00833329245056191 0.24300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.39 -nbin 512 -nch 16 -prof_snr 153.34 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 361.72875000 59349.00833328494758589 0.43400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.14 -nbin 512 -nch 16 -prof_snr 34.65 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 386.72875000 59349.00833328529584065 0.26600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.05 -nbin 512 -nch 16 -prof_snr 88.66 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 411.72875000 59349.00833326758195341 0.26000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 512 -nch 16 -prof_snr 75.22 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 436.72875000 59349.00833328127328770 0.29100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.35 -nbin 512 -nch 16 -prof_snr 81.54 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 461.72875000 59349.00833327847343668 0.39800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 512 -nch 16 -prof_snr 39.09 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989243_500.rfiClean.fits.tmp 486.72875000 59349.00833328293654034 0.41000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3299.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.75 -nbin 512 -nch 16 -prof_snr 93.66 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59348.989117_1460.rfiClean.fits.tmp 1310.10765600 59349.00833307027698638 0.87800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0375 -nbin 64 -nch 512 -prof_snr 15.87 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59348.989117_1460.rfiClean.fits.tmp 1410.10765600 59349.00833309872631105 2.47500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3311.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.271 -nbin 64 -nch 512 -prof_snr 14.80 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 311.72875000 59360.00607631470374415 0.72300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.94 -nbin 512 -nch 16 -prof_snr 29.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 336.72875000 59360.00607633082149661 0.55800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 2.97 -nbin 512 -nch 16 -prof_snr 48.90 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 361.72875000 59360.00607632329668562 0.78300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.55 -nbin 512 -nch 16 -prof_snr 35.05 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 386.72875000 59360.00607632362458688 0.58700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 3.31 -nbin 512 -nch 16 -prof_snr 61.89 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 411.72875000 59360.00607630590493713 0.64700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 2.24 -nbin 512 -nch 16 -prof_snr 50.30 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 436.72875000 59360.00607631957792876 0.64000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 3.36 -nbin 512 -nch 16 -prof_snr 67.80 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 461.72875000 59360.00607631677399922 0.52300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 3.17 -nbin 512 -nch 16 -prof_snr 90.59 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59359.988724_500.rfiClean.fits.tmp 486.72875000 59360.00607632123317359 0.74300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.92 -nbin 512 -nch 16 -prof_snr 43.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 311.72875000 59380.83153933373762712 0.71700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.18 -nbin 512 -nch 16 -prof_snr 30.54 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 336.72875000 59380.83153934985540445 0.45900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 512 -nch 16 -prof_snr 39.00 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 361.72875000 59380.83153934237285654 0.66700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 0.925 -nbin 512 -nch 16 -prof_snr 16.89 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 386.72875000 59380.83153934272135643 0.47600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 512 -nch 16 -prof_snr 29.63 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 411.72875000 59380.83153932501245009 0.31000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.22 -nbin 512 -nch 16 -prof_snr 60.46 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 436.72875000 59380.83153933870584495 0.19000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.38 -nbin 512 -nch 16 -prof_snr 207.77 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 461.72875000 59380.83153933591405860 0.24000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 0.997 -nbin 512 -nch 16 -prof_snr 85.78 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815942_500.rfiClean.fits.tmp 486.72875000 59380.83153934038784882 0.26400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.55 -nbin 512 -nch 16 -prof_snr 177.40 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59380.815808_1460.rfiClean.fits.tmp 1310.10765600 59380.83148131178735341 0.20300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2711.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0025 -nbin 64 -nch 512 -prof_snr 41.40 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59380.815808_1460.rfiClean.fits.tmp 1410.10765600 59380.83148134022631126 1.01600 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2711.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0631 -nbin 64 -nch 512 -prof_snr 30.55 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 311.72875000 59391.73258102660376068 0.45800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 512 -nch 16 -prof_snr 52.78 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 336.72875000 59391.73258104282072267 0.38300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 0.975 -nbin 512 -nch 16 -prof_snr 56.46 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 361.72875000 59391.73258103538097430 0.53800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.11 -nbin 512 -nch 16 -prof_snr 33.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 386.72875000 59391.73258103578232081 0.32200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 0.97 -nbin 512 -nch 16 -prof_snr 69.80 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 411.72875000 59391.73258101811053677 0.24800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.23 -nbin 512 -nch 16 -prof_snr 103.75 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 436.72875000 59391.73258103183508538 0.23300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.46 -nbin 512 -nch 16 -prof_snr 71.64 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 461.72875000 59391.73258102906638456 0.31100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 1.43 -nbin 512 -nch 16 -prof_snr 143.81 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715262_500.rfiClean.fits.tmp 486.72875000 59391.73258103358634941 1.49600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2998.4 -tmplt J1909-3744_b3_200.UB103.std -gof 0.897 -nbin 512 -nch 16 -prof_snr 11.47 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59391.715128_1460.rfiClean.fits.tmp 1310.10765600 59391.73252306951815527 0.22300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3011.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00302 -nbin 64 -nch 512 -prof_snr 131.01 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59391.715128_1460.rfiClean.fits.tmp 1410.10765600 59391.73252309796051307 0.98400 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3011.8 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0631 -nbin 64 -nch 512 -prof_snr 30.04 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 311.72875000 59403.80376141543482049 0.49300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.35 -nbin 512 -nch 16 -prof_snr 35.28 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 336.72875000 59403.80376143164354374 0.58800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.19 -nbin 512 -nch 16 -prof_snr 45.16 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 361.72875000 59403.80376142419944330 0.96200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.03 -nbin 512 -nch 16 -prof_snr 20.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 386.72875000 59403.80376142459104116 0.38400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.1 -nbin 512 -nch 16 -prof_snr 55.53 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 411.72875000 59403.80376140691921094 0.41300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.947 -nbin 512 -nch 16 -prof_snr 38.61 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 436.72875000 59403.80376142063404998 0.43700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.1 -nbin 512 -nch 16 -prof_snr 30.18 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 461.72875000 59403.80376141786067024 0.78600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.12 -nbin 512 -nch 16 -prof_snr 16.50 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786375_500.rfiClean.fits.tmp 486.72875000 59403.80376142236609383 0.71800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.25 -nbin 512 -nch 16 -prof_snr 22.74 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59403.786249_1460.rfiClean.fits.tmp 1310.10765600 59403.80370352883002028 0.23100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3012.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.00352 -nbin 64 -nch 512 -prof_snr 70.87 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59403.786249_1460.rfiClean.fits.tmp 1410.10765600 59403.80370355727308507 0.87200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3012.5 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0484 -nbin 64 -nch 512 -prof_snr 20.42 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59413.697607_500.rfiClean.fits.tmp 386.72875000 59413.71325207343159036 2.08700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.907 -nbin 512 -nch 16 -prof_snr 10.17 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59413.697607_500.rfiClean.fits.tmp 411.72875000 59413.71325205572945549 1.79400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 512 -nch 16 -prof_snr 10.64 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59413.697607_500.rfiClean.fits.tmp 436.72875000 59413.71325206946690045 2.15300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.1 -nbin 512 -nch 16 -prof_snr 11.34 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59413.697607_500.rfiClean.fits.tmp 461.72875000 59413.71325206669822094 2.12800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.96 -nbin 512 -nch 16 -prof_snr 8.71 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 311.71875000 59425.69427082502035020 1.90300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.14 -nbin 512 -nch 16 -prof_snr 10.02 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 336.71875000 59425.69427084125717897 0.56900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.01 -nbin 512 -nch 16 -prof_snr 67.98 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 361.71875000 59425.69427083384592692 0.71500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.13 -nbin 512 -nch 16 -prof_snr 31.94 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 386.71875000 59425.69427083426527858 0.36500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.16 -nbin 512 -nch 16 -prof_snr 92.69 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 411.71875000 59425.69427081661200774 0.27300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.29 -nbin 512 -nch 16 -prof_snr 85.52 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 436.71875000 59425.69427083036940829 0.26600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.27 -nbin 512 -nch 16 -prof_snr 155.98 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 461.71875000 59425.69427082760633496 0.48500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.983 -nbin 512 -nch 16 -prof_snr 33.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676956_500.rfiClean.fits.tmp 486.71875000 59425.69427083213812679 1.32500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 3000.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.894 -nbin 512 -nch 16 -prof_snr 13.12 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59425.676837_1460.rfiClean.fits.tmp 1310.09765600 59425.69421289843813483 2.01100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3011.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.201 -nbin 64 -nch 512 -prof_snr 25.23 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59425.676837_1460.rfiClean.fits.tmp 1410.09765600 59425.69421292687773573 1.68800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 3011.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.192 -nbin 64 -nch 512 -prof_snr 23.79 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 311.71875000 59441.68431693609923272 0.56500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.54 -nbin 512 -nch 16 -prof_snr 32.55 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 336.71875000 59441.68431695225065425 0.41900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.08 -nbin 512 -nch 16 -prof_snr 54.46 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 361.71875000 59441.68431694475764715 0.51100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.25 -nbin 512 -nch 16 -prof_snr 40.21 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 386.71875000 59441.68431694511575358 0.29800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.51 -nbin 512 -nch 16 -prof_snr 80.16 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 411.71875000 59441.68431692741305739 0.25200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.25 -nbin 512 -nch 16 -prof_snr 140.17 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 436.71875000 59441.68431694112154773 0.28500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.04 -nbin 512 -nch 16 -prof_snr 79.90 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 461.71875000 59441.68431693833709772 0.37200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.24 -nbin 512 -nch 16 -prof_snr 45.14 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670755_500.rfiClean.fits.tmp 486.71875000 59441.68431694280375055 1.00800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2342.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 512 -nch 16 -prof_snr 15.87 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59441.670598_1460.rfiClean.fits.tmp 1310.09765600 59441.68431676437041489 0.30200 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2361.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0062 -nbin 64 -nch 512 -prof_snr 101.89 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59441.670598_1460.rfiClean.fits.tmp 1410.09765600 59441.68431679281068725 1.65500 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2361.9 -tmplt J1909-3744_b5_200.UB103.std -gof 0.179 -nbin 64 -nch 512 -prof_snr 46.08 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 311.71875000 59449.55214093520880780 0.94800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 512 -nch 16 -prof_snr 22.14 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 336.71875000 59449.55214095139002239 0.34000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.31 -nbin 512 -nch 16 -prof_snr 44.91 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 361.71875000 59449.55214094391929081 0.38500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.14 -nbin 512 -nch 16 -prof_snr 58.56 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 386.71875000 59449.55214094429533134 0.28200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 512 -nch 16 -prof_snr 92.10 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 411.71875000 59449.55214092661347891 0.26800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.38 -nbin 512 -nch 16 -prof_snr 81.28 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 436.71875000 59449.55214094031637373 0.26100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 512 -nch 16 -prof_snr 88.48 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 461.71875000 59449.55214093753432181 0.37000 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.22 -nbin 512 -nch 16 -prof_snr 51.31 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536510_500.rfiClean.fits.tmp 486.71875000 59449.55214094202839803 0.51100 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2699.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.15 -nbin 512 -nch 16 -prof_snr 28.73 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59449.536337_1460.rfiClean.fits.tmp 1310.09765600 59449.55208301551882499 0.64100 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2714.7 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0261 -nbin 64 -nch 512 -prof_snr 152.98 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59449.536337_1460.rfiClean.fits.tmp 1410.09765600 59449.55208304396045449 1.55800 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2714.7 -tmplt J1909-3744_b5_200.UB103.std -gof 0.142 -nbin 64 -nch 512 -prof_snr 30.60 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 311.71875000 59460.55995352943187271 0.41200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.5 -nbin 512 -nch 16 -prof_snr 42.85 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 336.71875000 59460.55995354569197531 0.30300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.11 -nbin 512 -nch 16 -prof_snr 107.15 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 361.71875000 59460.55995353829848327 0.40200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.29 -nbin 512 -nch 16 -prof_snr 77.77 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 386.71875000 59460.55995353872836162 0.22400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.21 -nbin 512 -nch 16 -prof_snr 111.95 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 411.71875000 59460.55995352107889218 0.17200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.41 -nbin 512 -nch 16 -prof_snr 260.37 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 436.71875000 59460.55995353483068655 0.23900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.48 -nbin 512 -nch 16 -prof_snr 198.38 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 461.71875000 59460.55995353208183474 0.24400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.09 -nbin 512 -nch 16 -prof_snr 151.08 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59460.544356_500.rfiClean.fits.tmp 486.71875000 59460.55995353660092917 0.99900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.6 -tmplt J1909-3744_b3_200.UB103.std -gof 1.31 -nbin 512 -nch 16 -prof_snr 17.03 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 311.71875000 59469.51521966406345499 0.43300 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.68 -nbin 512 -nch 16 -prof_snr 113.51 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 336.71875000 59469.51521968026427345 0.31800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.88 -nbin 512 -nch 16 -prof_snr 83.26 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 361.71875000 59469.51521967281554382 0.48700 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.29 -nbin 512 -nch 16 -prof_snr 33.58 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 386.71875000 59469.51521967321400908 0.20900 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.25 -nbin 512 -nch 16 -prof_snr 173.87 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 411.71875000 59469.51521965554200122 0.16600 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 2.16 -nbin 512 -nch 16 -prof_snr 325.05 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 436.71875000 59469.51521966927197838 0.19500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.73 -nbin 512 -nch 16 -prof_snr 248.73 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 461.71875000 59469.51521966650299689 0.32800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.28 -nbin 512 -nch 16 -prof_snr 63.36 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499588_500.rfiClean.fits.tmp 486.71875000 59469.51521967100267574 1.06400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2697.8 -tmplt J1909-3744_b3_200.UB103.std -gof 1.15 -nbin 512 -nch 16 -prof_snr 12.57 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59469.499431_1460.rfiClean.fits.tmp 1310.09765600 59469.51516174314599184 0.46300 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2713.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0134 -nbin 64 -nch 512 -prof_snr 137.53 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59469.499431_1460.rfiClean.fits.tmp 1410.09765600 59469.51516177158951848 0.91700 gmrt -fe uGMRT_B5 -be GWB -f uGMRT_B5_GWB -bw 100 -tobs 2713.2 -tmplt J1909-3744_b5_200.UB103.std -gof 0.0546 -nbin 64 -nch 512 -prof_snr 89.09 -pta InPTA -sys GM_GWB_1460_200_b0 -group GM_GWB_1460_200_b0_post36 -bandno 5 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 311.71875000 59496.48964109834486180 0.57500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.2 -nbin 512 -nch 16 -prof_snr 26.09 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 336.71875000 59496.48964111462098003 0.35200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.1 -nbin 512 -nch 16 -prof_snr 46.84 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 361.71875000 59496.48964110723895615 0.63200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.894 -nbin 512 -nch 16 -prof_snr 23.52 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 386.71875000 59496.48964110768537950 0.32800 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.959 -nbin 512 -nch 16 -prof_snr 40.11 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 411.71875000 59496.48964109005301637 0.28400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.965 -nbin 512 -nch 16 -prof_snr 62.84 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 436.71875000 59496.48964110381832526 0.37200 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.33 -nbin 512 -nch 16 -prof_snr 48.03 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 461.71875000 59496.48964110107785075 0.44400 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 0.99 -nbin 512 -nch 16 -prof_snr 47.84 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 + J1909-3744_59496.474037_500.rfiClean.fits.tmp 486.71875000 59496.48964110561029628 0.72500 gmrt -fe uGMRT_B3 -be GWB -f uGMRT_B3_GWB -bw 25 -tobs 2700.1 -tmplt J1909-3744_b3_200.UB103.std -gof 1.11 -nbin 512 -nch 16 -prof_snr 21.46 -pta InPTA -sys GM_GWB_500_200_b1 -group GM_GWB_500_200_b1_post36 -bandno 3 diff --git a/tests/test_B1855.py b/tests/test_B1855.py index e55f23ce3..e1248e755 100644 --- a/tests/test_B1855.py +++ b/tests/test_B1855.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the B1855+09.""" import logging import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -14,11 +14,11 @@ from pinttestdata import datadir -class TestB1855(unittest.TestCase): +class TestB1855: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileB1855 = "B1855+09_NANOGrav_dfg+12_TAI_FB90.par" cls.timB1855 = "B1855+09_NANOGrav_dfg+12.tim" @@ -36,7 +36,7 @@ def setUpClass(cls): f"{cls.parfileB1855}.tempo2_test", skip_header=1, unpack=True ) - def test_B1855(self): + def test_b1855(self): pint_resids_us = Residuals( self.toasB1855, self.modelB1855, use_weighted_mean=False ).time_resids.to(u.s) diff --git a/tests/test_B1855_9yrs.py b/tests/test_B1855_9yrs.py index 1aadcd3d7..91a848895 100644 --- a/tests/test_B1855_9yrs.py +++ b/tests/test_B1855_9yrs.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the B1855+09.""" import logging import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -13,11 +13,11 @@ from pinttestdata import datadir -class TestB1855(unittest.TestCase): +class TestB1855: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileB1855 = "B1855+09_NANOGrav_9yv1.gls.par" cls.timB1855 = "B1855+09_NANOGrav_9yv1.tim" @@ -30,7 +30,7 @@ def setUpClass(cls): f"{cls.parfileB1855}.tempo2_test", skip_header=1, unpack=True ) - def test_B1855(self): + def test_b1855(self): pint_resids_us = Residuals( self.toasB1855, self.modelB1855, use_weighted_mean=False ).time_resids.to(u.s) diff --git a/tests/test_B1953.py b/tests/test_B1953.py index 7ba1de594..6b30077e7 100644 --- a/tests/test_B1953.py +++ b/tests/test_B1953.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the B1953+29.""" from astropy import log import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -13,11 +13,11 @@ from pinttestdata import datadir -class TestB1953(unittest.TestCase): +class TestB1953: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileB1953 = "B1953+29_NANOGrav_dfg+12_TAI_FB90.par" cls.timB1953 = "B1953+29_NANOGrav_dfg+12.tim" @@ -31,14 +31,14 @@ def setUpClass(cls): ) print(cls.ltres) - def test_B1953_binary_delay(self): + def test_b1953_binary_delay(self): # Calculate delays with PINT pint_binary_delay = self.modelB1953.binarymodel_delay(self.toasB1953, None) assert np.all( np.abs(pint_binary_delay.value + self.ltbindelay) < 1e-8 ), "B1953 binary delay test failed." - def test_B1953(self): + def test_b1953(self): pint_resids_us = Residuals( self.toasB1953, self.modelB1953, use_weighted_mean=False ).time_resids.to(u.s) diff --git a/tests/test_Galactic.py b/tests/test_Galactic.py index c101ee22d..dc2e6358c 100644 --- a/tests/test_Galactic.py +++ b/tests/test_Galactic.py @@ -1,6 +1,6 @@ import logging import os -import unittest +import pytest import astropy.units as u @@ -12,11 +12,11 @@ import astropy.time -class TestGalactic(unittest.TestCase): +class TestGalactic: """Test conversion from equatorial/ecliptic -> Galactic coordinates as astropy objects""" @classmethod - def setUpClass(cls): + def setup_class(cls): # J0613 is in equatorial cls.parfileJ0613 = os.path.join( datadir, "J0613-0200_NANOGrav_dfg+12_TAI_FB90.par" diff --git a/tests/test_J0613.py b/tests/test_J0613.py index ddfc2d2b8..1178afc7f 100644 --- a/tests/test_J0613.py +++ b/tests/test_J0613.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the J0623-0200.""" import logging import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -13,11 +13,11 @@ from pinttestdata import datadir -class TestJ0613(unittest.TestCase): +class TestJ0613: """Compare delays from the ELL1 model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileJ0613 = "J0613-0200_NANOGrav_dfg+12_TAI_FB90.par" cls.timJ0613 = "J0613-0200_NANOGrav_dfg+12.tim" @@ -31,14 +31,14 @@ def setUpClass(cls): ) print(cls.ltres) - def test_J0613_binary_delay(self): + def test_j0613_binary_delay(self): # Calculate delays with PINT pint_binary_delay = self.modelJ0613.binarymodel_delay(self.toasJ0613, None) assert np.all( np.abs(pint_binary_delay.value + self.ltbindelay) < 1e-8 ), "J0613 binary delay test failed." - def test_J0613(self): + def test_j0613(self): pint_resids_us = Residuals( self.toasJ0613, self.modelJ0613, use_weighted_mean=False ).time_resids.to(u.s) diff --git a/tests/test_TDB_method.py b/tests/test_TDB_method.py index 927ae72d8..a25670a2d 100644 --- a/tests/test_TDB_method.py +++ b/tests/test_TDB_method.py @@ -1,6 +1,6 @@ """tests for different compute TDB method.""" import os -import unittest +import pytest import numpy as np @@ -8,11 +8,11 @@ from pinttestdata import datadir -class TestTDBMethod(unittest.TestCase): +class TestTDBMethod: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.tim = "B1855+09_NANOGrav_9yv1.tim" diff --git a/tests/test_absphase.py b/tests/test_absphase.py index 199777b8f..f37615f08 100644 --- a/tests/test_absphase.py +++ b/tests/test_absphase.py @@ -1,5 +1,6 @@ +import pytest import os -import unittest +import pytest import pint.models import pint.toa @@ -9,7 +10,7 @@ timfile = os.path.join(datadir, "zerophase.tim") -class TestAbsPhase(unittest.TestCase): +class TestAbsPhase: def test_phase_zero(self): # Check that model phase is 0.0 for a TOA at exactly the TZRMJD model = pint.models.get_model(parfile) @@ -17,8 +18,8 @@ def test_phase_zero(self): ph = model.phase(toas, abs_phase=True) # Check that integer and fractional phase values are very close to 0.0 - self.assertAlmostEqual(ph.int.value, 0.0) - self.assertAlmostEqual(ph.frac.value, 0.0) + assert ph.int.value == pytest.approx(0.0) + assert ph.frac.value == pytest.approx(0.0) def test_tzr_attr(): diff --git a/tests/test_astropy_observatory.py b/tests/test_astropy_observatory.py index bbcb05f9e..eed66d4fc 100644 --- a/tests/test_astropy_observatory.py +++ b/tests/test_astropy_observatory.py @@ -1,15 +1,16 @@ +import pytest import logging -import unittest +import pytest import numpy as np import pint.observatory -class TestAstropyObservatory(unittest.TestCase): +class TestAstropyObservatory: """ Test fallback from PINT observatories to astropy observatories.""" @classmethod - def setUpClass(cls): + def setup_class(cls): # name and ITRF of an observatory that PINT should know about cls.pint_obsname = "gbt" cls.pint_itrf = [882589.65, -4924872.32, 3943729.348] @@ -70,4 +71,4 @@ def test_missing_observatory(self): """ try to instantiate a missing observatory. """ - self.assertRaises(KeyError, pint.observatory.Observatory.get, self.none_obsname) + pytest.raises(KeyError, pint.observatory.Observatory.get, self.none_obsname) diff --git a/tests/test_astropy_times.py b/tests/test_astropy_times.py index d21b5c307..0f3e5cabd 100644 --- a/tests/test_astropy_times.py +++ b/tests/test_astropy_times.py @@ -1,4 +1,4 @@ -import unittest +import pytest import astropy.coordinates import astropy.time @@ -6,7 +6,7 @@ from astropy.utils.iers import IERS_A, IERS_A_URL -class TestAstroPyTime(unittest.TestCase): +class TestAstroPyTime: """This class contains a sequence of time conversion tests. From the SOFA manual, these times are all equivalent: @@ -19,7 +19,7 @@ class TestAstroPyTime(unittest.TestCase): TCB 2006/01/15 21:25:56.893952 """ - def setUp(self): + def setup_method(self): self.lat = 19.48125 self.lon = -155.933222 earthloc = astropy.coordinates.EarthLocation.from_geodetic( @@ -38,7 +38,7 @@ def test_utc(self): y = "2006-01-15 21:24:37.500000" assert x == y - @unittest.skip + @pytest.mark.skip def test_utc_ut1(self): x = self.t.ut1.iso y = "2006-01-15 21:24:37.834078" @@ -70,7 +70,7 @@ def test_tt_tcb(self): y = "2006-01-15 21:25:56.893952" assert x == y - @unittest.skip + @pytest.mark.skip def test_iers_a_now(): # FIXME: might use cached IERS_A_URL? # FIXME: what would this actually be testing? diff --git a/tests/test_clockcorr.py b/tests/test_clockcorr.py index dbe449e15..ada505802 100644 --- a/tests/test_clockcorr.py +++ b/tests/test_clockcorr.py @@ -1,4 +1,4 @@ -import unittest +import pytest from os import path import io @@ -13,7 +13,7 @@ from pint.toa import get_TOAs -class TestClockcorrection(unittest.TestCase): +class TestClockcorrection: # Note, these tests currently depend on external data (TEMPO2 clock # files, which could potentially change. Values here are taken # from tempo2 version 2020-06-01 or so. diff --git a/tests/test_compare.py b/tests/test_compare.py index cde48af1d..ce5f3d488 100644 --- a/tests/test_compare.py +++ b/tests/test_compare.py @@ -1,4 +1,4 @@ -import unittest +import pytest import astropy import pint import pint.models as mod @@ -9,7 +9,7 @@ from pinttestdata import datadir -class TestCompare(unittest.TestCase): +class TestCompare: """Test model comparison method""" def test_paramchange(self): diff --git a/tests/test_covariance_matrix.py b/tests/test_covariance_matrix.py index 9020a2de4..c8ba789ff 100644 --- a/tests/test_covariance_matrix.py +++ b/tests/test_covariance_matrix.py @@ -15,7 +15,7 @@ class TestCovarianceMatrix: """Test for covariance matrix""" - def setup(self): + def setup_method(self): self.matrix1 = np.arange(16).reshape((4, 4)) self.label1 = [{"c": (0, 4, u.s)}] * 2 self.matrix2 = np.arange(9).reshape((3, 3)) diff --git a/tests/test_d_phase_d_toa.py b/tests/test_d_phase_d_toa.py index 13011963c..179b162a0 100644 --- a/tests/test_d_phase_d_toa.py +++ b/tests/test_d_phase_d_toa.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import numpy as np @@ -11,9 +11,9 @@ from pinttestdata import datadir, testdir -class TestD_phase_d_toa(unittest.TestCase): +class TestD_phase_d_toa: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileB1855 = "B1855+09_polycos.par" cls.timB1855 = "B1855_polyco.tim" @@ -24,7 +24,7 @@ def setUpClass(cls): # Read tempo style polycos. cls.plc = Polycos().read("B1855_polyco.dat", "tempo") - def testD_phase_d_toa(self): + def test_d_phase_d_toa(self): pint_d_phase_d_toa = self.modelB1855.d_phase_d_toa(self.toasB1855) mjd = np.array( [ diff --git a/tests/test_dd.py b/tests/test_dd.py index aafa43c69..8bbce7f2d 100644 --- a/tests/test_dd.py +++ b/tests/test_dd.py @@ -1,6 +1,6 @@ """Various tests to assess the performance of the DD model.""" import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -12,11 +12,11 @@ from copy import deepcopy -class TestDD(unittest.TestCase): +class TestDD: """Compare delays from the dd model with libstempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfileB1855 = "B1855+09_NANOGrav_dfg+12_modified_DD.par" cls.timB1855 = "B1855+09_NANOGrav_dfg+12.tim" @@ -29,7 +29,7 @@ def setUpClass(cls): f"{cls.parfileB1855}.tempo_test", unpack=True ) - def test_J1855_binary_delay(self): + def test_j1855_binary_delay(self): # Calculate delays with PINT pint_binary_delay = self.modelB1855.binarymodel_delay(self.toasB1855, None) assert np.all( @@ -37,7 +37,7 @@ def test_J1855_binary_delay(self): ), "DD B1855 TEST FAILED" # TODO: PINT can still increase the precision by adding more components - def test_B1855(self): + def test_b1855(self): pint_resids_us = Residuals( self.toasB1855, self.modelB1855, use_weighted_mean=False ).time_resids.to(u.s) diff --git a/tests/test_ddk.py b/tests/test_ddk.py index 5ddf5276d..a176db29f 100644 --- a/tests/test_ddk.py +++ b/tests/test_ddk.py @@ -3,7 +3,7 @@ import copy import logging import os -import unittest +import pytest from io import StringIO import warnings @@ -44,11 +44,11 @@ """ -class TestDDK(unittest.TestCase): +class TestDDK: """Compare delays from the ddk model with libstempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): cls.parfileJ1713 = "J1713+0747_NANOGrav_11yv0_short.gls.par" cls.ICRSparfileJ1713 = "J1713+0747_NANOGrav_11yv0_short.gls.ICRS.par" cls.timJ1713 = "J1713+0747_NANOGrav_11yv0_short.tim" @@ -84,7 +84,7 @@ def setUpClass(cls): :, index ] - def test_J1713_ECL_binary_delay(self): + def test_j1713_ecl_binary_delay(self): # Calculate delays with PINT pint_binary_delay = self.ECLmodelJ1713.binarymodel_delay(self.toasJ1713, None) print(f"{np.abs(pint_binary_delay.value + self.ECLltbindelay).max()}") @@ -93,7 +93,7 @@ def test_J1713_ECL_binary_delay(self): % np.abs(pint_binary_delay.value + self.ECLltbindelay).max() ) - def test_J1713_ICRS_binary_delay(self): + def test_j1713_icrs_binary_delay(self): # Calculate delays with PINT pint_binary_delay = self.ICRSmodelJ1713.binarymodel_delay(self.toasJ1713, None) print(f"{np.abs(pint_binary_delay.value + self.ECLltbindelay).max()}") @@ -102,7 +102,7 @@ def test_J1713_ICRS_binary_delay(self): % np.abs(pint_binary_delay.value + self.ICRSltbindelay).max() ) - def test_J1713_ECL(self): + def test_j1713_ecl(self): pint_resids_us = Residuals( self.toasJ1713, self.ECLmodelJ1713, use_weighted_mean=False ).time_resids.to(u.s) @@ -113,7 +113,7 @@ def test_J1713_ECL(self): % np.abs(diff - diff.mean()).max() ) - def test_J1713_ICRS(self): + def test_j1713_icrs(self): pint_resids_us = Residuals( self.toasJ1713, self.ICRSmodelJ1713, use_weighted_mean=False ).time_resids.to(u.s) @@ -143,7 +143,7 @@ def test_change_px(self): diff = bdelay0 - bdelay1 assert np.all(diff != 0) - def test_J1713_deriv(self): + def test_j1713_deriv(self): testp = tdu.get_derivative_params(self.ECLmodelJ1713) delay = self.ECLmodelJ1713.delay(self.toasJ1713) for p in testp.keys(): @@ -183,7 +183,7 @@ def test_J1713_deriv(self): else: continue - def test_K96(self): + def test_k96(self): modelJ1713 = copy.deepcopy(self.ECLmodelJ1713) log = logging.getLogger("TestJ1713 Switch of K96") modelJ1713.K96.value = False diff --git a/tests/test_design_matrix.py b/tests/test_design_matrix.py index 0b5e06e6e..443888015 100644 --- a/tests/test_design_matrix.py +++ b/tests/test_design_matrix.py @@ -110,3 +110,8 @@ def test_combine_designmatrix_all(self): ] == 0.0 ) + + def test_param_order(self): + params_dm = self.model.designmatrix(self.toas, incoffset=False)[1] + params_free = self.model.free_params + assert params_dm == params_free diff --git a/tests/test_determinism.py b/tests/test_determinism.py index 733c09c4b..a7ea7820b 100644 --- a/tests/test_determinism.py +++ b/tests/test_determinism.py @@ -83,9 +83,11 @@ def test_sampler(): # fitter.phaseogram() # samples = sampler.sampler.chain[:, 10:, :].reshape((-1, fitter.n_fit_params)) + samples = np.transpose(sampler.get_chain(), (1, 0, 2)) # r.append(np.random.randn()) - r.append(sampler.sampler.chain[0]) + # r.append(sampler.sampler.chain[0]) + r.append(samples[0]) assert_array_equal(r[0], r[1]) @@ -109,6 +111,7 @@ def log_prob(x, ivar): sampler.random_state = s sampler.run_mcmc(p0, 100) - samples = sampler.chain.reshape((-1, ndim)) + # samples = sampler.chain.reshape((-1, ndim)) + samples = np.transpose(sampler.get_chain(), (1, 0, 2)).reshape((-1, ndim)) r.append(samples[0, 0]) assert r[0] == r[1] diff --git a/tests/test_dmx.py b/tests/test_dmx.py index b304287c4..5f9c3cc4b 100644 --- a/tests/test_dmx.py +++ b/tests/test_dmx.py @@ -1,6 +1,6 @@ import logging import os -import unittest +import pytest import io import pytest @@ -36,15 +36,15 @@ """ -class TestDMX(unittest.TestCase): +class TestDMX: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.parf = os.path.join(datadir, "B1855+09_NANOGrav_dfg+12_DMX.par") cls.timf = os.path.join(datadir, "B1855+09_NANOGrav_dfg+12.tim") cls.DMXm = mb.get_model(cls.parf) cls.toas = toa.get_TOAs(cls.timf, ephem="DE405", include_bipm=False) - def test_DMX(self): + def test_dmx(self): print("Testing DMX module.") rs = ( residuals.Residuals(self.toas, self.DMXm, use_weighted_mean=False) diff --git a/tests/test_downhill_fitter.py b/tests/test_downhill_fitter.py index 9a79bf3ab..9574daf34 100644 --- a/tests/test_downhill_fitter.py +++ b/tests/test_downhill_fitter.py @@ -267,10 +267,7 @@ def test_degenerate_parameters_gls(model_eccentric_toas_ecorr, full_cov): f = pint.fitter.DownhillGLSFitter(toas, model_wrong) - with pytest.warns( - pint.fitter.DegeneracyWarning, - match=r".*degeneracy.*following parameter.*ELONG\b", - ): + with pytest.warns(pint.fitter.DegeneracyWarning): f.fit_toas(full_cov=full_cov, threshold=1e-14) assert abs(f.model.ECC.value - model_eccentric.ECC.value) < 1e-4 diff --git a/tests/test_early_chime_data.py b/tests/test_early_chime_data.py index 11f875aa6..96d4121fb 100644 --- a/tests/test_early_chime_data.py +++ b/tests/test_early_chime_data.py @@ -1,6 +1,6 @@ """Various tests to assess the performance of early CHIME data.""" import os -import unittest +import pytest import pint.models.model_builder as mb import pint.toa as toa @@ -8,11 +8,11 @@ from pinttestdata import datadir -class Test_CHIME_data(unittest.TestCase): +class Test_CHIME_data: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parfile = "B1937+21.basic.par" cls.tim = "B1937+21.CHIME.CHIME.NG.N.tim" diff --git a/tests/test_event_optimize.py b/tests/test_event_optimize.py index c0cda3acf..9fff6688f 100644 --- a/tests/test_event_optimize.py +++ b/tests/test_event_optimize.py @@ -79,7 +79,7 @@ def test_parallel(tmp_path): for i in range(samples1.shape[1]): assert stats.ks_2samp(samples1[:, i], samples2[:, i])[1] == 1.0 except ImportError: - pytest.skip + pytest.skip(f"Pathos multiprocessing package not found") finally: os.chdir(p) sys.stdout = saved_stdout @@ -104,11 +104,11 @@ def test_backend(tmp_path): samples = None # Running with backend + os.chdir(tmp_path) cmd = f"{eventfile} {parfile} {temfile} --weightcol=PSRJ0030+0451 --minWeight=0.9 --nwalkers=10 --nsteps=50 --burnin=10 --backend --clobber" event_optimize.maxpost = -9e99 event_optimize.numcalls = 0 event_optimize.main(cmd.split()) - reader = emcee.backends.HDFBackend("J0030+0451_chains.h5") samples = reader.get_chain(discard=10) assert samples is not None @@ -124,7 +124,32 @@ def test_backend(tmp_path): assert timestamp == os.path.getmtime("J0030+0451_chains.h5") except ImportError: - pytest.skip + pytest.skip(f"h5py package not found") finally: os.chdir(p) sys.stdout = saved_stdout + + +def test_autocorr(tmp_path): + # Defining a log posterior function based on the emcee tutorials + def ln_prob(theta): + ln_prior = -0.5 * np.sum((theta - 1.0) ** 2 / 100.0) + ln_prob = -0.5 * np.sum(theta**2) + ln_prior + return ln_prob + + # Setting a random starting position for 10 walkers with 5 dimenisions + coords = np.random.randn(10, 5) + nwalkers, ndim = coords.shape + + # Establishing the Sampler + nsteps = 500000 + sampler = emcee.EnsembleSampler(nwalkers, ndim, ln_prob) + + # Running the sampler with the autocorrelation check function from event_optimize + autocorr = event_optimize.run_sampler_autocorr(sampler, coords, nsteps, burnin=10) + + # Extracting the samples and asserting that the autocorrelation check + # stopped the sampler once convergence was reached + samples = np.transpose(sampler.get_chain(discard=10), (1, 0, 2)).reshape((-1, ndim)) + + assert len(samples) < nsteps diff --git a/tests/test_event_optimize_MCMCFitter.py b/tests/test_event_optimize_MCMCFitter.py index 2bdd8b396..c07f863ab 100644 --- a/tests/test_event_optimize_MCMCFitter.py +++ b/tests/test_event_optimize_MCMCFitter.py @@ -1,7 +1,7 @@ # This test is DISABLED because event_optimize requires PRESTO to be installed # to get the fftfit module. It can be run manually by people who have PRESTO import os -import unittest +import pytest from io import StringIO @@ -16,8 +16,8 @@ # SMR skipped this test as event_optimize_MCMCFitter isn't used anywhere # How/why is it different from event_optimize? -@unittest.skip -class TestEventOptimizeMCMCFitter(unittest.TestCase): +@pytest.mark.skip +class TestEventOptimizeMCMCFitter: def test_result(self): import pint.scripts.event_optimize_MCMCFitter as event_optimize diff --git a/tests/test_event_optimize_multiple.py b/tests/test_event_optimize_multiple.py index ea633e5e8..33c042d06 100644 --- a/tests/test_event_optimize_multiple.py +++ b/tests/test_event_optimize_multiple.py @@ -2,7 +2,7 @@ # to get the fftfit module. It can be run manually by people who have PRESTO import os import sys -import unittest +import pytest from io import StringIO @@ -12,8 +12,8 @@ eventfile = os.path.join(datadir, "evtfiles.txt") -@unittest.skip -class TestEventOptimizeMultiple(unittest.TestCase): +@pytest.mark.skip +class TestEventOptimizeMultiple: def test_result(self): # Delay import because of fftfit from pint.scripts import event_optimize_multiple diff --git a/tests/test_event_toas.py b/tests/test_event_toas.py index df126a41c..8e2720cf5 100644 --- a/tests/test_event_toas.py +++ b/tests/test_event_toas.py @@ -1,8 +1,11 @@ import os import pytest +import numpy as np + +from astropy import units as u from pint.event_toas import read_mission_info_from_heasoft, create_mission_config -from pint.event_toas import get_fits_TOAs +from pint.event_toas import get_fits_TOAs, get_NICER_TOAs, _default_uncertainty from pinttestdata import datadir @@ -60,3 +63,23 @@ def test_load_events_wrongext_text_raises(): # Anyway, here I'm testing another error get_fits_TOAs(eventfile_nicer_topo, mission="xdsgse", extension="dafasdfa") assert msg in str(excinfo.value) + + +def test_for_toa_errors_default(): + eventfile_nicer = datadir / "ngc300nicer_bary.evt" + + ts = get_NICER_TOAs( + eventfile_nicer, + ) + assert np.all(ts.get_errors() == _default_uncertainty["NICER"]) + + +@pytest.mark.parametrize("errors", [2, 2 * u.us]) +def test_for_toa_errors_manual(errors): + eventfile_nicer = datadir / "ngc300nicer_bary.evt" + + ts = get_NICER_TOAs( + eventfile_nicer, + errors=errors, + ) + assert np.all(ts.get_errors() == 2 * u.us) diff --git a/tests/test_explicit_absphase.py b/tests/test_explicit_absphase.py new file mode 100644 index 000000000..86dd3f18e --- /dev/null +++ b/tests/test_explicit_absphase.py @@ -0,0 +1,67 @@ +from pint.models import get_model, get_model_and_toas +from pint.simulation import make_fake_toas_uniform +from pint.residuals import Residuals +from io import StringIO +import pytest + +par = """ +F0 100 +PEPOCH 50000 +""" + + +@pytest.fixture +def fake_toas(): + m = get_model(StringIO(par)) + t = make_fake_toas_uniform(50000, 50100, 50, m, add_noise=True) + return t + + +@pytest.fixture +def model(): + return get_model(StringIO(par)) + + +def test_add_tzr_toa(model, fake_toas): + assert "AbsPhase" not in model.components + + model.add_tzr_toa(fake_toas) + + assert "AbsPhase" in model.components + assert hasattr(model, "TZRMJD") + assert hasattr(model, "TZRSITE") + assert hasattr(model, "TZRFRQ") + + with pytest.raises(ValueError): + model.add_tzr_toa(fake_toas) + + +@pytest.mark.parametrize("use_abs_phase", [True, False]) +def test_residuals(model, fake_toas, use_abs_phase): + res = Residuals(fake_toas, model, use_abs_phase=use_abs_phase) + res.calc_phase_resids() + assert ("AbsPhase" in model.components) == use_abs_phase + + +@pytest.mark.parametrize("use_abs_phase", [True, False]) +def test_residuals_2(model, fake_toas, use_abs_phase): + res = Residuals(fake_toas, model, use_abs_phase=False) + res.calc_phase_resids(use_abs_phase=use_abs_phase) + assert ("AbsPhase" in model.components) == use_abs_phase + + +@pytest.mark.parametrize("add_tzr", [True, False]) +def test_get_model(fake_toas, add_tzr): + toas_for_tzr = fake_toas if add_tzr else None + m = get_model(StringIO(par), toas_for_tzr=toas_for_tzr) + assert ("AbsPhase" in m.components) == add_tzr + + +@pytest.mark.parametrize("add_tzr", [True, False]) +def test_get_model_and_toas(fake_toas, add_tzr): + timfile = "fake_toas.tim" + fake_toas.write_TOA_file(timfile) + + m, t = get_model_and_toas(StringIO(par), timfile, add_tzr_to_model=add_tzr) + + assert ("AbsPhase" in m.components) == add_tzr diff --git a/tests/test_fake_toas.py b/tests/test_fake_toas.py index 419659ad9..dfa3d95f4 100644 --- a/tests/test_fake_toas.py +++ b/tests/test_fake_toas.py @@ -259,7 +259,7 @@ def test_fake_uniform(t1, t2): assert np.isclose(r.calc_time_resids().std(), 1 * u.us, rtol=0.2) -def test_fake_from_timfile(): +def test_fake_from_toas(): # FIXME: this file is unnecessarily huge m, t = get_model_and_toas( pint.config.examplefile("B1855+09_NANOGrav_9yv1.gls.par"), @@ -279,6 +279,29 @@ def test_fake_from_timfile(): ) +@pytest.mark.parametrize("planets", (True, False)) +def test_fake_from_timfile(planets): + m = get_model(pint.config.examplefile("NGC6440E.par.good")) + t = get_TOAs(pint.config.examplefile("NGC6440E.tim"), planets=planets) + + m.PLANET_SHAPIRO.value = planets + + r = pint.residuals.Residuals(t, m) + + t_sim = pint.simulation.make_fake_toas_fromtim( + pint.config.examplefile("NGC6440E.tim"), m, add_noise=True + ) + r_sim = pint.residuals.Residuals(t_sim, m) + + m, t = get_model_and_toas( + pint.config.examplefile("B1855+09_NANOGrav_9yv1.gls.par"), + pint.config.examplefile("B1855+09_NANOGrav_9yv1.tim"), + ) + assert np.isclose( + r.calc_time_resids().std(), r_sim.calc_time_resids().std(), rtol=2 + ) + + def test_fake_highF1(): m = get_model(os.path.join(datadir, "ngc300nicer.par")) m.F1.quantity *= 10 diff --git a/tests/test_fd.py b/tests/test_fd.py index 99e711863..75d1d7e4c 100644 --- a/tests/test_fd.py +++ b/tests/test_fd.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the FD model.""" import copy import os -import unittest +import pytest from io import StringIO import astropy.units as u @@ -14,9 +14,9 @@ import pint.toa as toa -class TestFD(unittest.TestCase): +class TestFD: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.parf = os.path.join(datadir, "test_FD.par") cls.timf = os.path.join(datadir, "test_FD.simulate.pint_corrected") cls.FDm = mb.get_model(cls.parf) @@ -24,7 +24,7 @@ def setUpClass(cls): # libstempo result cls.ltres, cls.ltbindelay = np.genfromtxt(f"{cls.parf}.tempo_test", unpack=True) - def test_FD(self): + def test_fd(self): print("Testing FD module.") rs = ( pint.residuals.Residuals(self.toas, self.FDm, use_weighted_mean=False) diff --git a/tests/test_fdjump.py b/tests/test_fdjump.py new file mode 100644 index 000000000..eaf1c50d0 --- /dev/null +++ b/tests/test_fdjump.py @@ -0,0 +1,120 @@ +from pinttestdata import datadir +from pint.models import get_model +from pint.simulation import make_fake_toas_fromtim +from pint.residuals import Residuals +from pint.fitter import DownhillWLSFitter + +import pytest +from io import StringIO +import numpy as np + + +@pytest.fixture +def model_and_toas(): + model_raw = get_model(datadir / "J1909-3744.NB.par") + fdlines = ( + "FD1JUMP -sys GM_GWB_500_100_b1 0.01 1\n" + "FD1JUMP -sys GM_GWB_1460_100_b1 0.02 1\n" + "FD2JUMP -sys GM_GWB_500_100_b1 0.001 1\n" + "FD2JUMP -sys GM_GWB_1460_100_b1 0.002 1\n" + ) + par = str(model_raw) + fdlines + + model = get_model(StringIO(par)) + toas = make_fake_toas_fromtim(datadir / "J1909-3744.NB.tim", model, add_noise=True) + + return model, toas + + +def test_params(model_and_toas): + model, toas = model_and_toas + + assert ( + hasattr(model, "FD1JUMP1") + and hasattr(model, "FD2JUMP1") + and hasattr(model, "FD1JUMP2") + and hasattr(model, "FD2JUMP2") + ) + + +def test_residuals(model_and_toas): + model, toas = model_and_toas + res = Residuals(toas, model) + + assert np.isfinite(res.chi2) and res.reduced_chi2 < 1.5 + + +def test_fitting(model_and_toas): + model, toas = model_and_toas + ftr = DownhillWLSFitter(toas, model) + ftr.fit_toas() + + assert np.isfinite(ftr.resids.chi2) and ftr.resids.reduced_chi2 < 1.5 + + +def test_refitting(model_and_toas): + model, toas = model_and_toas + FD1JUMP1_value_original = model.FD1JUMP1.value + model.FD1JUMP1.value = 0 + + ftr = DownhillWLSFitter(toas, model) + ftr.fit_toas() + + assert ( + np.abs(ftr.model.FD1JUMP1.value - FD1JUMP1_value_original) + / ftr.model.FD1JUMP1.uncertainty_value + < 2.5 + ) + + +def test_parfile_write(model_and_toas): + model, toas = model_and_toas + + par = str(model) + + assert par.count("FD1JUMP") == 2 and par.count("FD2JUMP") == 2 + + +def test_tempo2_parfile_read_write(): + model_raw = get_model(datadir / "J1909-3744.NB.par") + model_raw.PLANET_SHAPIRO.value = False + fdlines = ( + "FDJUMP1 -sys GM_GWB_500_100_b1 0.01 1\n" + "FDJUMP1 -sys GM_GWB_1460_100_b1 0.02 1\n" + "FDJUMP2 -sys GM_GWB_500_100_b1 0.001 1\n" + "FDJUMP2 -sys GM_GWB_1460_100_b1 0.002 1\n" + ) + par = str(model_raw) + fdlines + + model = get_model(StringIO(par)) + + assert ( + hasattr(model, "FD1JUMP1") + and hasattr(model, "FD2JUMP1") + and hasattr(model, "FD1JUMP2") + and hasattr(model, "FD2JUMP2") + ) + + par = model.as_parfile() + assert par.count("FD1JUMP") == 2 and par.count("FD2JUMP") == 2 + assert par.count("FDJUMP1") == 0 and par.count("FDJUMP1") == 0 + + par = model.as_parfile(format="tempo2") + assert par.count("FD1JUMP") == 0 and par.count("FD2JUMP") == 0 + assert par.count("FDJUMP1") == 2 and par.count("FDJUMP1") == 2 + + +def test_residual_change(model_and_toas): + model, toas = model_and_toas + + r_old = Residuals(toas, model, subtract_mean=False).calc_time_resids().value + + mask_FD1JUMP1 = model.FD1JUMP1.select_toa_mask(toas) + mask_FD1JUMP1_inv = np.setdiff1d(np.arange(len(toas)), mask_FD1JUMP1) + + model.FD1JUMP1.value = 0 + + r_new = Residuals(toas, model, subtract_mean=False).calc_time_resids().value + + assert not np.allclose(r_old[mask_FD1JUMP1], r_new[mask_FD1JUMP1]) + assert np.allclose(r_old[mask_FD1JUMP1_inv], r_new[mask_FD1JUMP1_inv]) diff --git a/tests/test_fermiphase.py b/tests/test_fermiphase.py index a34399e5c..1be357cb5 100644 --- a/tests/test_fermiphase.py +++ b/tests/test_fermiphase.py @@ -5,12 +5,15 @@ import pytest +import numpy as np + from astropy.io import fits +from astropy import units as u import pint.models import pint.scripts.fermiphase as fermiphase import pint.toa as toa -from pint.fermi_toas import get_Fermi_TOAs +from pint.fermi_toas import get_Fermi_TOAs, _default_uncertainty from pint.observatory.satellite_obs import get_satellite_observatory from pinttestdata import datadir @@ -82,3 +85,31 @@ def test_process_and_accuracy(): # require absolute phase to be within 500 ns; NB this relies on # GBT clock corrections since the TZR is referenced there assert max(abs(resids_mus)) < 0.5 + + +def test_for_toa_errors_default(): + get_satellite_observatory("Fermi", ft2file, overwrite=True) + ts = get_Fermi_TOAs( + eventfileraw, + weightcolumn="PSRJ0030+0451", + include_gps=False, + include_bipm=False, + planets=False, + ephem="DE405", + ) + assert np.all(ts.get_errors() == _default_uncertainty) + + +@pytest.mark.parametrize("errors", [2, 2 * u.us]) +def test_for_toa_errors_manual(errors): + get_satellite_observatory("Fermi", ft2file, overwrite=True) + ts = get_Fermi_TOAs( + eventfileraw, + weightcolumn="PSRJ0030+0451", + include_gps=False, + include_bipm=False, + planets=False, + ephem="DE405", + errors=errors, + ) + assert np.all(ts.get_errors() == 2 * u.us) diff --git a/tests/test_fitter_error_checking.py b/tests/test_fitter_error_checking.py index 53b59241b..bcdc7f3ac 100644 --- a/tests/test_fitter_error_checking.py +++ b/tests/test_fitter_error_checking.py @@ -94,12 +94,14 @@ def test_dmx_barycentered(Fitter): toas = make_fake_toas_uniform(58000, 58900, 10, model, obs="@", freq=np.inf) model.free_params = ["F0", "DM", "DMX_0001"] fitter = Fitter(toas, model) - with pytest.warns(pint.fitter.DegeneracyWarning, match=r".*degeneracy.*DM\b"): + with pytest.warns(pint.fitter.DegeneracyWarning, match=r".*degeneracy.*DM*\b"): fitter.fit_toas() for p in fitter.model.free_params: assert not np.isnan(fitter.model[p].value) fitter = Fitter(toas, model) - with pytest.warns(pint.fitter.DegeneracyWarning, match=r".*degeneracy.*DMX_0001\b"): + with pytest.warns( + pint.fitter.DegeneracyWarning, match=r".*degeneracy.*DMX_0001*\b" + ): fitter.fit_toas() for p in fitter.model.free_params: assert not np.isnan(fitter.model[p].value) @@ -185,10 +187,7 @@ def test_null_vector(Fitter): wideband_dm_error=1e-4 * u.pc * u.cm**-3, ) fitter = Fitter(toas, model) - with pytest.warns( - pint.fitter.DegeneracyWarning, - match=r".*degeneracy.*following parameter.*ELONG\b", - ): + with pytest.warns(pint.fitter.DegeneracyWarning): fitter.fit_toas(threshold=1e-14) for p in fitter.model.free_params: assert not np.isnan(fitter.model[p].value) diff --git a/tests/test_glitch.py b/tests/test_glitch.py index 5b1b4d444..4d7eac8ad 100644 --- a/tests/test_glitch.py +++ b/tests/test_glitch.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -15,9 +15,9 @@ timfile = os.path.join(datadir, "prefixtest.tim") -class TestGlitch(unittest.TestCase): +class TestGlitch: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.m = pint.models.get_model(parfile) cls.t = pint.toa.get_TOAs(timfile, ephem="DE405", include_bipm=False) cls.f = pint.fitter.WLSFitter(cls.t, cls.m) diff --git a/tests/test_gls_fitter.py b/tests/test_gls_fitter.py index e559f4803..9ad629d36 100644 --- a/tests/test_gls_fitter.py +++ b/tests/test_gls_fitter.py @@ -1,6 +1,6 @@ import json import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -11,11 +11,11 @@ from pinttestdata import datadir -class TestGLS(unittest.TestCase): +class TestGLS: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.par = "B1855+09_NANOGrav_9yv1.gls.par" cls.tim = "B1855+09_NANOGrav_9yv1.tim" diff --git a/tests/test_jump.py b/tests/test_jump.py index 39da5c545..be53697fc 100644 --- a/tests/test_jump.py +++ b/tests/test_jump.py @@ -1,7 +1,7 @@ """Tests for jump model component """ import logging import os -import unittest +import pytest import pytest import astropy.units as u @@ -14,6 +14,7 @@ from pint.models import parameter as p from pint.models import PhaseJump import pint.models.timing_model +import pint.fitter class SimpleSetup: @@ -83,12 +84,14 @@ def test_remove_jump_and_flags(setup_NGC6440E): # test delete_jump_and_flags setup_NGC6440E.m.delete_jump_and_flags(setup_NGC6440E.t.table["flags"], 1) assert len(cp.jumps) == 1 + f = pint.fitter.Fitter.auto(setup_NGC6440E.t, setup_NGC6440E.m) # delete last jump setup_NGC6440E.m.delete_jump_and_flags(setup_NGC6440E.t.table["flags"], 2) for d in setup_NGC6440E.t.table["flags"][selected_toa_ind2]: assert "jump" not in d assert "PhaseJump" not in setup_NGC6440E.m.components + f = pint.fitter.Fitter.auto(setup_NGC6440E.t, setup_NGC6440E.m) def test_jump_params_to_flags(setup_NGC6440E): @@ -190,9 +193,9 @@ def test_find_empty_masks(setup_NGC6440E): setup_NGC6440E.m.validate_toas(setup_NGC6440E.t) -class TestJUMP(unittest.TestCase): +class TestJUMP: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parf = "B1855+09_NANOGrav_dfg+12_TAI.par" cls.timf = "B1855+09_NANOGrav_dfg+12.tim" diff --git a/tests/test_model_ifunc.py b/tests/test_model_ifunc.py index 1a2a94019..8ef6a0ef1 100644 --- a/tests/test_model_ifunc.py +++ b/tests/test_model_ifunc.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.units as u @@ -16,9 +16,9 @@ timfile = os.path.join(datadir, "j0007_ifunc.tim") -class TestIFunc(unittest.TestCase): +class TestIFunc: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.m = pint.models.get_model(parfile) cls.t = pint.toa.get_TOAs(timfile, ephem="DE405", include_bipm=False) diff --git a/tests/test_model_wave.py b/tests/test_model_wave.py index 68155f561..1e57d640f 100644 --- a/tests/test_model_wave.py +++ b/tests/test_model_wave.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.units as u @@ -16,9 +16,9 @@ timfile = os.path.join(datadir, "vela_wave.tim") -class TestWave(unittest.TestCase): +class TestWave: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.m = pint.models.get_model(parfile) cls.t = pint.toa.get_TOAs(timfile, ephem="DE405", include_bipm=False) diff --git a/tests/test_modelconversions.py b/tests/test_modelconversions.py index 4cd4ad3e1..99b328e63 100644 --- a/tests/test_modelconversions.py +++ b/tests/test_modelconversions.py @@ -70,6 +70,37 @@ def test_ECL_to_ICRS(): assert np.allclose(r_ECL.resids, r_ICRS.resids) +def test_ICRS_to_ECL_nouncertainties(): + # start with ICRS model with no pm uncertainties, get residuals with ECL model, compare + model_ICRS = get_model(io.StringIO(modelstring_ICRS)) + model_ICRS.PMRA._uncertainty = None + model_ICRS.PMRA.frozen = True + model_ICRS.PMDEC._uncertainty = None + model_ICRS.PMDEC.frozen = True + toas = pint.simulation.make_fake_toas_uniform( + MJDStart, MJDStop, NTOA, model=model_ICRS, error=1 * u.us, add_noise=True + ) + r_ICRS = pint.residuals.Residuals(toas, model_ICRS) + r_ECL = pint.residuals.Residuals(toas, model_ICRS.as_ECL()) + assert np.allclose(r_ECL.resids, r_ICRS.resids) + # assert model_ICRS.as_ECL(ecl).ECL.value == ecl + + +def test_ECL_to_ICRS_nouncertainties(): + # start with ECL model with no pm uncertainties, get residuals with ICRS model, compare + model_ECL = get_model(io.StringIO(modelstring_ECL)) + model_ECL.PMELONG._uncertainty = None + model_ECL.PMELONG.frozen = True + model_ECL.PMELAT._uncertainty = None + model_ECL.PMELAT.frozen = True + toas = pint.simulation.make_fake_toas_uniform( + MJDStart, MJDStop, NTOA, model=model_ECL, error=1 * u.us, add_noise=True + ) + r_ECL = pint.residuals.Residuals(toas, model_ECL) + r_ICRS = pint.residuals.Residuals(toas, model_ECL.as_ICRS()) + assert np.allclose(r_ECL.resids, r_ICRS.resids) + + def test_ECL_to_ECL(): # start with ECL model, get residuals with ECL model with different obliquity, compare model_ECL = get_model(io.StringIO(modelstring_ECL)) diff --git a/tests/test_modelutils.py b/tests/test_modelutils.py index 0141f88b0..0df565c51 100644 --- a/tests/test_modelutils.py +++ b/tests/test_modelutils.py @@ -1,6 +1,6 @@ import logging import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -13,11 +13,11 @@ from pint.modelutils import model_equatorial_to_ecliptic, model_ecliptic_to_equatorial -class TestEcliptic(unittest.TestCase): +class TestEcliptic: """Test conversion from equatorial <-> ecliptic coordinates, and compare residuals.""" @classmethod - def setUpClass(cls): + def setup_class(cls): # J0613 is in equatorial cls.parfileJ0613 = os.path.join( datadir, "J0613-0200_NANOGrav_dfg+12_TAI_FB90.par" diff --git a/tests/test_observatory_metadata.py b/tests/test_observatory_metadata.py index c3936a656..990a71c66 100644 --- a/tests/test_observatory_metadata.py +++ b/tests/test_observatory_metadata.py @@ -1,13 +1,14 @@ +import pytest import logging -import unittest +import pytest import pint.observatory -class TestObservatoryMetadata(unittest.TestCase): +class TestObservatoryMetadata: """Test handling of observatory metadata""" @classmethod - def setUpClass(cls): + def setup_class(cls): # name of an observatory that PINT should know about # and should have metadata on cls.pint_obsname = "gbt" @@ -44,7 +45,7 @@ def test_observatory_replacement(self): origin="Inserted for testing purposes", ) obs = pint.observatory.get_observatory(obsname) - self.assertRaises( + pytest.raises( ValueError, TopoObs, obsname, diff --git a/tests/test_orbit_phase.py b/tests/test_orbit_phase.py index 3c0600a02..cc73fc4f3 100644 --- a/tests/test_orbit_phase.py +++ b/tests/test_orbit_phase.py @@ -1,5 +1,6 @@ +import pytest import os -import unittest +import pytest import numpy as np @@ -8,11 +9,11 @@ from pinttestdata import datadir -class TestOrbitPhase(unittest.TestCase): +class TestOrbitPhase: """Test orbital phase calculations""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.pJ1855 = "B1855+09_NANOGrav_dfg+12_modified_DD.par" cls.mJ1855 = m.get_model(cls.pJ1855) @@ -20,10 +21,10 @@ def setUpClass(cls): def test_barytimes(self): ts = t.Time([56789.234, 56790.765], format="mjd") # Should raise ValueError since not in "tdb" - with self.assertRaises(ValueError): + with pytest.raises(ValueError): self.mJ1855.orbital_phase(ts) # Should raise ValueError since not correct anom - with self.assertRaises(ValueError): + with pytest.raises(ValueError): self.mJ1855.orbital_phase(ts.tdb, anom="xxx") # Should return phs = self.mJ1855.orbital_phase(ts.tdb, anom="mean") @@ -32,7 +33,7 @@ def test_barytimes(self): phs = self.mJ1855.orbital_phase(toas) assert len(phs) == toas.ntoas - def test_J1855_nonzero_ecc(self): + def test_j1855_nonzero_ecc(self): ts = self.mJ1855.T0.value + np.linspace(0, self.mJ1855.PB.value, 101) self.mJ1855.ECC.value = 0.1 # set the eccentricity to nonzero phs = self.mJ1855.orbital_phase(ts, anom="mean", radians=False) @@ -48,7 +49,7 @@ def test_J1855_nonzero_ecc(self): assert np.isclose(phs3[0].value, phs[0].value), "Eccen anom != True anom" assert phs3[1] != phs[49], "Eccen anom == True anom" - def test_J1855_zero_ecc(self): + def test_j1855_zero_ecc(self): self.mJ1855.ECC.value = 0.0 # set the eccentricity to zero self.mJ1855.OM.value = 0.0 # set omega to zero phs1 = self.mJ1855.orbital_phase(self.mJ1855.T0.value, anom="mean") @@ -60,7 +61,7 @@ def test_J1855_zero_ecc(self): phs3 = self.mJ1855.orbital_phase(self.mJ1855.T0.value + 0.1, anom="true") assert np.isclose(phs3.value, phs1.value), "True anom != Mean anom" - def test_J1855_ell1(self): + def test_j1855_ell1(self): mJ1855ell1 = m.get_model("B1855+09_NANOGrav_12yv3.wb.gls.par") phs1 = mJ1855ell1.orbital_phase(mJ1855ell1.TASC.value, anom="mean") assert np.isclose(phs1.value, 0.0), "Mean anom != 0.0 at TASC as value" @@ -73,7 +74,7 @@ def test_J1855_ell1(self): phs3 = mJ1855ell1.orbital_phase(mJ1855ell1.TASC.value + 0.1, anom="true") assert np.isclose(phs3.value, phs1.value), "True anom != Mean anom" - def test_J0737(self): + def test_j0737(self): # Find a conjunction which we have confirmed by GBT data and Shapiro delay mJ0737 = m.get_model("0737A_latest.par") x = mJ0737.conjunction(55586.25) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 26e80f04e..460bd1ca8 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,6 +1,6 @@ import os import pickle -import unittest +import pytest import io import astropy.time as time @@ -138,50 +138,48 @@ def test_units_consistent(): assert pm.uncertainty_value * pm.units == pm.uncertainty -class TestParameters(unittest.TestCase): +class TestParameters: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.m = get_model("B1855+09_NANOGrav_dfg+12_modified.par") cls.mp = get_model("prefixtest.par") - def test_RAJ(self): + def test_raj(self): """Check whether the value and units of RAJ parameter are ok""" units = u.hourangle value = 18.960109246777776 - self.assertEqual(self.m.RAJ.units, units) - self.assertEqual(self.m.RAJ.value, value) - self.assertEqual(self.m.RAJ.quantity, value * units) + assert self.m.RAJ.units == units + assert self.m.RAJ.value == value + assert self.m.RAJ.quantity == value * units - def test_DECJ(self): + def test_decj(self): """Check whether the value and units of DECJ parameter are ok""" units = u.deg value = 9.72146998888889 - self.assertEqual(self.m.DECJ.units, units) - self.assertEqual(self.m.DECJ.value, value) - self.assertEqual(self.m.DECJ.quantity, value * units) + assert self.m.DECJ.units == units + assert self.m.DECJ.value == value + assert self.m.DECJ.quantity == value * units - def test_F0(self): + def test_f0(self): """Check whether the value and units of F0 parameter are ok""" units = u.Hz value = np.longdouble("186.49408156698235146") - self.assertEqual(self.m.F0.units, units) - self.assertTrue(np.isclose(self.m.F0.value, value, atol=1e-19)) - self.assertEqual(self.m.F0.value, value) + assert self.m.F0.units == units + assert np.isclose(self.m.F0.value, value, atol=1e-19) + assert self.m.F0.value == value - def test_F0_uncertainty(self): + def test_f0_uncertainty(self): uncertainty = 0.00000000000698911818 units = self.m.F0.units # Test stored uncertainty value - self.assertTrue( - np.isclose(self.m.F0.uncertainty.to(units).value, uncertainty, atol=1e-20) + assert np.isclose( + self.m.F0.uncertainty.to(units).value, uncertainty, atol=1e-20 ) # Test parameter.uncertainty_value returned value - self.assertTrue( - np.isclose(self.m.F0.uncertainty_value, uncertainty, atol=1e-20) - ) + assert np.isclose(self.m.F0.uncertainty_value, uncertainty, atol=1e-20) def test_set_new_units(self): """Check whether we can set the units to non-standard ones""" @@ -197,32 +195,28 @@ def test_set_new_units(self): uncertainty_value_new = 0.00000000000698911818 / 1000.0 # Set it to 186.49 Hz: the 'standard' value self.m.F0.quantity = value * units - self.assertTrue(np.isclose(self.m.F0.value, value, atol=1e-13)) + assert np.isclose(self.m.F0.value, value, atol=1e-13) # Now change the units self.m.F0.units = str_unit_new - self.assertTrue(np.isclose(self.m.F0.value, value_new, atol=1e-13)) + assert np.isclose(self.m.F0.value, value_new, atol=1e-13) - self.assertTrue( - np.isclose(self.m.F0.uncertainty_value, uncertainty_value_new, atol=1e-13) + assert np.isclose( + self.m.F0.uncertainty_value, uncertainty_value_new, atol=1e-13 ) # Change the units back, and then set them implicitly # The value will be associate with the new units self.m.F0.units = str_unit self.m.F0.quantity = value_new * units_new self.m.F0.uncertainty = uncertainty_value_new * units_new - self.assertTrue(np.isclose(self.m.F0.value, value, atol=1e-13)) - self.assertTrue( - np.isclose(self.m.F0.uncertainty_value, uncertainty_value, atol=1e-20) - ) + assert np.isclose(self.m.F0.value, value, atol=1e-13) + assert np.isclose(self.m.F0.uncertainty_value, uncertainty_value, atol=1e-20) # Check the ratio, using the old units as a reference ratio = self.m.F0.quantity / (value * units) ratio_uncertainty = self.m.F0.uncertainty / (uncertainty_value * units) - self.assertTrue(np.isclose(ratio.decompose(u.si.bases), 1.0, atol=1e-13)) + assert np.isclose(ratio.decompose(u.si.bases), 1.0, atol=1e-13) - self.assertTrue( - np.isclose(ratio_uncertainty.decompose(u.si.bases), 1.0, atol=1e-20) - ) + assert np.isclose(ratio_uncertainty.decompose(u.si.bases), 1.0, atol=1e-20) def set_units_fail(self): """Setting the unit to a non-compatible unit should fail""" @@ -230,7 +224,7 @@ def set_units_fail(self): def test_units(self): """Test setting the units""" - self.assertRaises(u.UnitConversionError, self.set_units_fail) + pytest.raises(u.UnitConversionError, self.set_units_fail) def set_num_to_unit(self): """Try to set the numerical value to a unit""" @@ -242,16 +236,18 @@ def set_num_to_quantity(self): def test_set_value(self): """Try to set the numerical value of a parameter to various things""" - self.assertRaises(ValueError, self.set_num_to_unit) - self.assertRaises(ValueError, self.set_num_to_quantity) + with pytest.raises(ValueError): + self.set_num_to_unit() + with pytest.raises(u.UnitTypeError): + self.set_num_to_quantity() - def test_T0(self): + def test_t0(self): """Test setting T0 to a test value""" self.m.T0.value = 50044.3322 # I don't understand why this is failing... something about float128 # Does not fail for me (both lines) -- RvH 02/22/2015 - self.assertTrue(np.isclose(self.m.T0.value, 50044.3322)) - self.assertEqual(self.m.T0.value, 50044.3322) + assert np.isclose(self.m.T0.value, 50044.3322) + assert self.m.T0.value == 50044.3322 def set_num_to_none(self): """Set T0 to None""" @@ -263,8 +259,8 @@ def set_num_to_string(self): def test_num_to_other(self): """Test setting the T0 numerical value to a not-number""" - self.assertRaises(ValueError, self.set_num_to_none) - self.assertRaises(ValueError, self.set_num_to_string) + pytest.raises(ValueError, self.set_num_to_none) + pytest.raises(ValueError, self.set_num_to_string) def set_OM_to_none(self): """Set OM to None""" @@ -274,24 +270,24 @@ def set_OM_to_time(self): """Set OM to a time""" self.m.OM.value = time.Time(54000, format="mjd") - def test_OM(self): + def test_om(self): """Test doing stuff to OM""" quantity = 10.0 * u.deg self.m.OM.quantity = quantity - self.assertEqual(self.m.OM.quantity, quantity) - self.assertRaises(ValueError, self.set_OM_to_none) - self.assertRaises(TypeError, self.set_OM_to_time) + assert self.m.OM.quantity == quantity + pytest.raises(ValueError, self.set_OM_to_none) + pytest.raises(TypeError, self.set_OM_to_time) - def test_PBDOT(self): + def test_pbdot(self): # Check that parameter scaling is working as expected # Units are not modified, just the value is scaled self.m.PBDOT.value = 20 - self.assertEqual(self.m.PBDOT.units, u.day / u.day) - self.assertEqual(self.m.PBDOT.quantity, 20 * 1e-12 * u.day / u.day) + assert self.m.PBDOT.units == u.day / u.day + assert self.m.PBDOT.quantity == 20 * 1e-12 * u.day / u.day self.m.PBDOT.value = 1e-11 - self.assertEqual(self.m.PBDOT.units, u.day / u.day) - self.assertEqual(self.m.PBDOT.quantity, 1e-11 * u.day / u.day) + assert self.m.PBDOT.units == u.day / u.day + assert self.m.PBDOT.quantity == 1e-11 * u.day / u.day def test_prefix_value_to_num(self): """Test setting the prefix parameter""" @@ -299,11 +295,11 @@ def test_prefix_value_to_num(self): units = u.Hz self.mp.GLF0_2.value = value - self.assertEqual(self.mp.GLF0_2.quantity, value * units) + assert self.mp.GLF0_2.quantity == value * units value = 50 self.mp.GLF0_2.value = value - self.assertEqual(self.mp.GLF0_2.quantity, value * units) + assert self.mp.GLF0_2.quantity == value * units def test_prefix_value_str(self): """Test setting the prefix parameter from a string""" @@ -313,7 +309,7 @@ def test_prefix_value_str(self): self.mp.GLF0_2.value = str_value - self.assertEqual(self.mp.GLF0_2.value, value * units) + assert self.mp.GLF0_2.value == value * units def set_prefix_value_to_unit_fail(self): """Set the prefix parameter to an incompatible value""" @@ -324,7 +320,7 @@ def set_prefix_value_to_unit_fail(self): def test_prefix_value_fail(self): """Test setting the prefix parameter to an incompatible value""" - self.assertRaises(ValueError, self.set_prefix_value_to_unit_fail) + pytest.raises(ValueError, self.set_prefix_value_to_unit_fail) def test_prefix_value1(self): self.mp.GLF0_2.value = 50 @@ -342,9 +338,9 @@ def set_prefix_value1(self): self.mp.GLF0_2.value = 100 * u.s def test_prefix_value1(self): - self.assertRaises(ValueError, self.set_prefix_value1) + pytest.raises(ValueError, self.set_prefix_value1) - def test_START_FINISH_in_par(self): + def test_start_finish_in_par(self): """ Check that START/FINISH parameters set up/operate properly when from input file. @@ -363,10 +359,10 @@ def test_START_FINISH_in_par(self): assert hasattr(m1, "FINISH") assert isinstance(m1.FINISH, MJDParameter) - self.assertEqual(m1.START.value, start_preval) - self.assertEqual(m1.FINISH.value, finish_preval) - self.assertEqual(m1.START.frozen, True) - self.assertEqual(m1.FINISH.frozen, True) + assert m1.START.value == start_preval + assert m1.FINISH.value == finish_preval + assert m1.START.frozen == True + assert m1.FINISH.frozen == True # fit toas and compare with expected/Tempo2 (for WLS) values fitters = [ @@ -375,23 +371,23 @@ def test_START_FINISH_in_par(self): ] for fitter in fitters: fitter.fit_toas() - self.assertEqual(m1.START.frozen, True) - self.assertEqual(m1.FINISH.frozen, True) + assert m1.START.frozen == True + assert m1.FINISH.frozen == True if fitter.method == "weighted_least_square": - self.assertAlmostEqual( - fitter.model.START.value, start_postval, places=9 + assert fitter.model.START.value == pytest.approx( + start_postval, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.FINISH.value, finish_postval, places=9 + assert fitter.model.FINISH.value == pytest.approx( + finish_postval, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.START.value, fitter.toas.first_MJD.value, places=9 + assert fitter.model.START.value == pytest.approx( + fitter.toas.first_MJD.value, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.FINISH.value, fitter.toas.last_MJD.value, places=9 + assert fitter.model.FINISH.value == pytest.approx( + fitter.toas.last_MJD.value, abs=1e-09 ) - def test_START_FINISH_not_in_par(self): + def test_start_finish_not_in_par(self): """ Check that START/FINISH parameters are added and set up when not in input file. @@ -403,8 +399,8 @@ def test_START_FINISH_not_in_par(self): start_postval = 53478.2858714192 # from Tempo2 finish_postval = 54187.5873241699 # from Tempo2 - self.assertTrue(hasattr(m, "START")) - self.assertTrue(hasattr(m, "FINISH")) + assert hasattr(m, "START") + assert hasattr(m, "FINISH") # fit toas and compare with expected/Tempo2 (for WLS) values fitters = [ @@ -413,25 +409,25 @@ def test_START_FINISH_not_in_par(self): ] for fitter in fitters: fitter.fit_toas() - self.assertTrue(hasattr(fitter.model, "START")) - self.assertTrue(hasattr(fitter.model, "FINISH")) - self.assertEqual(fitter.model.START.frozen, True) - self.assertEqual(fitter.model.FINISH.frozen, True) + assert hasattr(fitter.model, "START") + assert hasattr(fitter.model, "FINISH") + assert fitter.model.START.frozen == True + assert fitter.model.FINISH.frozen == True if fitter.method == "weighted_least_square": - self.assertAlmostEqual( - fitter.model.START.value, start_postval, places=9 + assert fitter.model.START.value == pytest.approx( + start_postval, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.FINISH.value, finish_postval, places=9 + assert fitter.model.FINISH.value == pytest.approx( + finish_postval, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.START.value, fitter.toas.first_MJD.value, places=9 + assert fitter.model.START.value == pytest.approx( + fitter.toas.first_MJD.value, abs=1e-09 ) - self.assertAlmostEqual( - fitter.model.FINISH.value, fitter.toas.last_MJD.value, places=9 + assert fitter.model.FINISH.value == pytest.approx( + fitter.toas.last_MJD.value, abs=1e-09 ) - def test_START_FINISH_notfrozen(self): + def test_start_finish_notfrozen(self): """ check that when the START/FINISH parameters are added as unfrozen it warns and fixes @@ -442,11 +438,11 @@ def test_START_FINISH_notfrozen(self): with pytest.warns(UserWarning, match=r"cannot be unfrozen"): m = get_model(io.StringIO(s)) - self.assertTrue(hasattr(m, "START")) - self.assertTrue(hasattr(m, "FINISH")) + assert hasattr(m, "START") + assert hasattr(m, "FINISH") # make sure that it freezes - self.assertEqual(m.START.frozen, True) - self.assertEqual(m.FINISH.frozen, True) + assert m.START.frozen == True + assert m.FINISH.frozen == True @pytest.mark.parametrize( @@ -609,3 +605,45 @@ def test_correct_number_of_params_and_FD_terms_after_add_or_remove_param(): m.remove_param("FD4") assert len(m.components["FD"].params) == 3 assert len(m.get_prefix_mapping("FD")) == 3 + + +def test_parameter_retains_name_on_set(): + basic_par_str = """ + PSR B1937+21 + LAMBDA 301.9732445337270 + BETA 42.2967523367957 + PMLAMBDA -0.0175 + PMBETA -0.3971 + PX 0.1515 + POSEPOCH 55321.0000 + F0 641.9282333345536244 1 0.0000000000000132 + F1 -4.330899370129D-14 1 2.149749089617D-22 + PEPOCH 55321.000000 + DM 71.016633 + UNITS TDB + """ + + m = get_model(io.StringIO(basic_par_str)) + m.POSEPOCH = m.PEPOCH + assert m.POSEPOCH.name == "POSEPOCH" + + +def test_parameter_set_incompatible_fails(): + basic_par_str = """ + PSR B1937+21 + LAMBDA 301.9732445337270 + BETA 42.2967523367957 + PMLAMBDA -0.0175 + PMBETA -0.3971 + PX 0.1515 + POSEPOCH 55321.0000 + F0 641.9282333345536244 1 0.0000000000000132 + F1 -4.330899370129D-14 1 2.149749089617D-22 + PEPOCH 55321.000000 + DM 71.016633 + UNITS TDB + """ + + m = get_model(io.StringIO(basic_par_str)) + with pytest.raises(u.core.UnitConversionError): + m.F0 = m.F1 diff --git a/tests/test_phase_commands.py b/tests/test_phase_commands.py index 36ed54f9b..f20764a63 100644 --- a/tests/test_phase_commands.py +++ b/tests/test_phase_commands.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import pint.models import pint.toa @@ -12,7 +12,7 @@ timfile = os.path.join(datadir, "NGC6440E_PHASETEST.tim") -class TestAbsPhase(unittest.TestCase): +class TestAbsPhase: def test_phase_commands(self): model = pint.models.get_model(parfile) toas = pint.toa.get_TOAs(timfile) diff --git a/tests/test_piecewise.py b/tests/test_piecewise.py index 5dc306b83..0809a6328 100644 --- a/tests/test_piecewise.py +++ b/tests/test_piecewise.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.units as u import pytest @@ -17,9 +17,9 @@ timfile = os.path.join(datadir, "piecewise.tim") -class TestPiecewise(unittest.TestCase): +class TestPiecewise: @classmethod - def setUpClass(cls): + def setup_class(cls): cls.m = pint.models.get_model(parfile) cls.m2 = pint.models.get_model(parfile2) cls.t = pint.toa.get_TOAs(timfile) diff --git a/tests/test_pintbary.py b/tests/test_pintbary.py index a1cf2944d..e40ef49cc 100644 --- a/tests/test_pintbary.py +++ b/tests/test_pintbary.py @@ -1,5 +1,5 @@ import sys -import unittest +import pytest import numpy as np from io import StringIO @@ -7,14 +7,14 @@ import pint.scripts.pintbary as pintbary -class TestPintBary(unittest.TestCase): +class TestPintBary: def test_result(self): saved_stdout, sys.stdout = sys.stdout, StringIO("_") cmd = "56000.0 --ra 12h22m33.2s --dec 19d21m44.2s --obs gbt --ephem DE405" pintbary.main(cmd.split()) v = sys.stdout.getvalue() # Check that last value printed is the barycentered time - self.assertTrue(np.isclose(float(v.split()[-1]), 56000.0061691189)) + assert np.isclose(float(v.split()[-1]), 56000.0061691189) sys.stdout = saved_stdout diff --git a/tests/test_pintk.py b/tests/test_pintk.py index 803b7b3e2..a548e7a2a 100644 --- a/tests/test_pintk.py +++ b/tests/test_pintk.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import pytest from io import StringIO @@ -14,7 +14,7 @@ @pytest.mark.skipif( "DISPLAY" not in os.environ, reason="Needs an X server, xvfb counts" ) -class TestPintk(unittest.TestCase): +class TestPintk: def test_result(self): saved_stdout, pintk.sys.stdout = pintk.sys.stdout, StringIO("_") cmd = "--test {0} {1}".format(parfile, timfile) diff --git a/tests/test_priors.py b/tests/test_priors.py index 5d3b2d94e..0f6b8a64d 100644 --- a/tests/test_priors.py +++ b/tests/test_priors.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import numpy as np from scipy.stats import norm @@ -16,9 +16,9 @@ from pinttestdata import datadir -class TestPriors(unittest.TestCase): +class TestPriors: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.m = pint.models.get_model("B1855+09_NANOGrav_dfg+12_modified.par") diff --git a/tests/test_pulsar_mjd.py b/tests/test_pulsar_mjd.py index 58a2e58bd..4fe96cecd 100644 --- a/tests/test_pulsar_mjd.py +++ b/tests/test_pulsar_mjd.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import numpy as np from pint.pulsar_mjd import Time @@ -7,9 +7,9 @@ from pinttestdata import datadir -class TestPsrMjd(unittest.TestCase): +class TestPsrMjd: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.leap_second_days = ["2016-12-31T12:00:00", "2015-06-30T12:00:00"] cls.normal_days = ["2016-12-11T12:00:00", "2015-06-02T12:00:00"] diff --git a/tests/test_pulsar_position.py b/tests/test_pulsar_position.py index c4eb1b6ca..929daa204 100644 --- a/tests/test_pulsar_position.py +++ b/tests/test_pulsar_position.py @@ -1,7 +1,7 @@ """Various tests to assess the performance of the PINT position. """ import os -import unittest +import pytest import numpy as np @@ -9,9 +9,9 @@ from pinttestdata import datadir -class TestPulsarPosition(unittest.TestCase): +class TestPulsarPosition: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) # This uses ELONG and ELAT cls.m1 = mb.get_model("B1855+09_NANOGrav_9yv1.gls.par") @@ -33,7 +33,7 @@ def test_ssb_2_psr(self): p1 = self.m1.ssb_to_psb_xyz_ICRS(epoch=self.t) p2 = self.m2.ssb_to_psb_xyz_ICRS(epoch=self.t) - self.assertTrue(np.max(np.abs(p1 - p2)) < 1e-6) + assert np.max(np.abs(p1 - p2)) < 1e-6 # Switch on PM self.m1.PMELONG.value = PMELONG_v @@ -44,7 +44,7 @@ def test_ssb_2_psr(self): p1 = self.m1.ssb_to_psb_xyz_ICRS(epoch=self.t) p2 = self.m2.ssb_to_psb_xyz_ICRS(epoch=self.t) - self.assertTrue(np.max(np.abs(p1 - p2)) < 1e-7) + assert np.max(np.abs(p1 - p2)) < 1e-7 def test_parse_line(self): self.m1.ELONG.from_parfile_line( @@ -67,7 +67,7 @@ def test_parse_line(self): self.m1.PMELONG.from_parfile_line("PMELONG -3.2701 1 0.0141") self.m1.PMELAT.from_parfile_line("PMELAT -5.0982 1 0.0291") - self.assertTrue(np.isclose(self.m1.ELONG.value, ELONG_v)) - self.assertTrue(np.isclose(self.m1.ELAT.value, ELAT_v)) - self.assertTrue(np.isclose(self.m1.PMELONG.value, PMELONG_v)) - self.assertTrue(np.isclose(self.m1.PMELAT.value, PMELAT_v)) + assert np.isclose(self.m1.ELONG.value, ELONG_v) + assert np.isclose(self.m1.ELAT.value, ELAT_v) + assert np.isclose(self.m1.PMELONG.value, PMELONG_v) + assert np.isclose(self.m1.PMELAT.value, PMELAT_v) diff --git a/tests/test_residuals.py b/tests/test_residuals.py index d4ed15d0d..16a64c2a2 100644 --- a/tests/test_residuals.py +++ b/tests/test_residuals.py @@ -272,32 +272,33 @@ def test_gls_chi2_reasonable(full_cov): toas.adjust_TOAs(TimeDelta(np.random.randn(len(toas)) * u.us)) f = GLSFitter(toas, model) fit_chi2 = f.fit_toas(full_cov=full_cov) - assert_allclose(fit_chi2, f.resids.calc_chi2(full_cov=full_cov)) + assert_allclose(fit_chi2, f.resids.calc_chi2()) +# @abhisrkckl: I am commenting this out because calc_chisq no longer has the full_cov option. # @pytest.mark.xfail(reason="numerical instability maybe?") -def test_gls_chi2_full_cov(): - model = get_model( - StringIO( - """ - PSRJ J1234+5678 - ELAT 0 - ELONG 0 - DM 10 - F0 1 - PEPOCH 58000 - TNRedAmp -14.227505410948254 - TNRedGam 4.91353 - TNRedC 45 - """ - ) - ) - model.free_params = ["ELAT", "ELONG"] - toas = make_fake_toas_uniform(57000, 59000, 100, model=model, error=1 * u.us) - np.random.seed(0) - toas.adjust_TOAs(TimeDelta(np.random.randn(len(toas)) * u.us)) - r = Residuals(toas, model) - assert_allclose(r.calc_chi2(full_cov=True), r.calc_chi2(full_cov=False)) +# def test_gls_chi2_full_cov(): +# model = get_model( +# StringIO( +# """ +# PSRJ J1234+5678 +# ELAT 0 +# ELONG 0 +# DM 10 +# F0 1 +# PEPOCH 58000 +# TNRedAmp -14.227505410948254 +# TNRedGam 4.91353 +# TNRedC 45 +# """ +# ) +# ) +# model.free_params = ["ELAT", "ELONG"] +# toas = make_fake_toas_uniform(57000, 59000, 100, model=model, error=1 * u.us) +# np.random.seed(0) +# toas.adjust_TOAs(TimeDelta(np.random.randn(len(toas)) * u.us)) +# r = Residuals(toas, model) +# assert_allclose(r.calc_chi2(full_cov=True), r.calc_chi2(full_cov=False)) def test_gls_chi2_behaviour(): diff --git a/tests/test_solar_system_body.py b/tests/test_solar_system_body.py index 6eb4d2a10..3367c45b3 100644 --- a/tests/test_solar_system_body.py +++ b/tests/test_solar_system_body.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.time as time import numpy as np @@ -10,9 +10,9 @@ from pinttestdata import datadir -class TestSolarSystemDynamic(unittest.TestCase): +class TestSolarSystemDynamic: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) MJDREF = 2400000.5 J2000_JD = 2451545.0 diff --git a/tests/test_toa.py b/tests/test_toa.py index 939641508..7b367ba6d 100644 --- a/tests/test_toa.py +++ b/tests/test_toa.py @@ -1,7 +1,8 @@ +import pytest import io import os import re -import unittest +import pytest import numpy as np import astropy.units as u @@ -16,38 +17,38 @@ from pint.simulation import make_fake_toas_uniform -class TestTOA(unittest.TestCase): +class TestTOA: """Test of TOA class""" - def setUp(self): + def setup_method(self): self.MJD = 57000 def test_units(self): - with self.assertRaises(u.UnitConversionError): + with pytest.raises(u.UnitConversionError): t = TOA(self.MJD * u.m) - with self.assertRaises(u.UnitConversionError): + with pytest.raises(u.UnitConversionError): t = TOA((self.MJD * u.m, 0)) t = TOA((self.MJD * u.day).to(u.s)) - with self.assertRaises(u.UnitConversionError): + with pytest.raises(u.UnitConversionError): t = TOA((self.MJD * u.day, 0)) t = TOA((self.MJD * u.day, 0 * u.day)) - with self.assertRaises(u.UnitConversionError): + with pytest.raises(u.UnitConversionError): t = TOA(self.MJD, error=1 * u.m) t = TOA(self.MJD, freq=100 * u.kHz) - with self.assertRaises(u.UnitConversionError): + with pytest.raises(u.UnitConversionError): t = TOA(self.MJD, freq=100 * u.s) def test_precision_mjd(self): t = TOA(self.MJD) - self.assertEqual(t.mjd.precision, 9) + assert t.mjd.precision == 9 def test_precision_time(self): t = TOA(Time("2008-08-19", format="iso", precision=1)) - self.assertEqual(t.mjd.precision, 9) + assert t.mjd.precision == 9 def test_typo(self): TOA(self.MJD, errror="1") - with self.assertRaises(TypeError): + with pytest.raises(TypeError): TOA(self.MJD, errror=1, flags={}) def test_toa_object(self): @@ -57,21 +58,21 @@ def test_toa_object(self): obs = "ao" # scale should be None when MJD is a Time - with self.assertRaises(ValueError): + with pytest.raises(ValueError): toa = TOA(MJD=toatime, error=toaerr, freq=freq, obs=obs, scale="utc") # flags should be stored without their leading - - with self.assertRaises(ValueError): + with pytest.raises(ValueError): toa = TOA( MJD=toatime, error=toaerr, freq=freq, obs=obs, flags={"-foo": "foo1"} ) # Invalid flag - with self.assertRaises(ValueError): + with pytest.raises(ValueError): toa = TOA( MJD=toatime, error=toaerr, freq=freq, obs=obs, flags={"$": "foo1"} ) - with self.assertRaises(ValueError): + with pytest.raises(ValueError): toa = TOA(MJD=toatime, error=toaerr, freq=freq, obs=obs, flags={"foo": 1}) toa = TOA(MJD=toatime, error=toaerr, freq=freq, obs=obs, foo="foo1") @@ -80,23 +81,23 @@ def test_toa_object(self): assert len(toa.flags) > 0 # Missing name - with self.assertRaises(ValueError): + with pytest.raises(ValueError): toa.as_line() toa = TOA(MJD=toatime, error=toaerr, freq=freq, obs=obs, foo="foo1", name="bla") assert "bla" in toa.as_line() -class TestTOAs(unittest.TestCase): +class TestTOAs: """Test of TOAs class""" - def setUp(self): + def setup_method(self): self.freq = 1440.012345678 * u.MHz self.obs = "gbt" self.MJD = 57000 self.error = 3.0 - def test_make_TOAs(self): + def test_make_toas(self): t = TOA(self.MJD, freq=self.freq, obs=self.obs, error=self.error) t_list = [t, t] assert t_list[0].mjd.precision == 9 @@ -181,3 +182,15 @@ def test_merge_toas(): toas_out = pint.toa.merge_TOAs([toas, toas2]) toas_outb = toas + toas2 assert np.all(toas_out.table == toas_outb.table) + + +def test_mix_nb_wb(): + with pytest.raises(ValueError): + t1 = pint.toa.get_TOAs( + io.StringIO( + """ + fake.ff 1430.000000 53393.561383615118386 0.178 ao -fe L-wide -be ASP -pp_dm 10.0 + fake.ff 1430.000000 53394.561383615118386 0.178 ao -fe L-wide -be ASP + """ + ) + ) diff --git a/tests/test_toa_flag.py b/tests/test_toa_flag.py index 7eae91cd0..563578cbe 100644 --- a/tests/test_toa_flag.py +++ b/tests/test_toa_flag.py @@ -2,7 +2,7 @@ import os -import unittest +import pytest import io import numpy as np import pytest @@ -11,11 +11,11 @@ from pinttestdata import datadir -class TestToaFlag(unittest.TestCase): +class TestToaFlag: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): cls.tim = "B1855+09_NANOGrav_dfg+12.tim" cls.toas = toa.get_TOAs( os.path.join(datadir, cls.tim), diff --git a/tests/test_toa_pickle.py b/tests/test_toa_pickle.py index 4d62c655b..d7dc1cfee 100644 --- a/tests/test_toa_pickle.py +++ b/tests/test_toa_pickle.py @@ -2,7 +2,7 @@ import os import shutil import time -import unittest +import pytest import copy import pytest @@ -19,8 +19,8 @@ def temp_tim(tmpdir): return tt, tp -class TestTOAReader(unittest.TestCase): - def setUp(self): +class TestTOAReader: + def setup_method(self): os.chdir(datadir) # First, read the TOAs from the tim file. # This should also create the pickle file. diff --git a/tests/test_toa_reader.py b/tests/test_toa_reader.py index 1d8472799..77c7e04f2 100644 --- a/tests/test_toa_reader.py +++ b/tests/test_toa_reader.py @@ -1,6 +1,6 @@ import os import shutil -import unittest +import pytest from io import StringIO from pathlib import Path @@ -61,8 +61,8 @@ def check_indices_contiguous(toas): assert ix[0] == 0 -class TestTOAReader(unittest.TestCase): - def setUp(self): +class TestTOAReader: + def setup_method(self): self.x = toa.TOAs(datadir / "test1.tim") self.x.apply_clock_corrections() self.x.compute_TDBs() diff --git a/tests/test_toa_selection.py b/tests/test_toa_selection.py index b9210ea78..47a05eadc 100644 --- a/tests/test_toa_selection.py +++ b/tests/test_toa_selection.py @@ -1,7 +1,7 @@ import copy import logging import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -15,9 +15,9 @@ from pinttestdata import datadir -class TestTOAselection(unittest.TestCase): +class TestTOAselection: @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.parf = "B1855+09_NANOGrav_9yv1.gls.par" cls.timf = "B1855+09_NANOGrav_9yv1.tim" @@ -76,7 +76,7 @@ def test_boolean_selection(self): self.toas.unselect() assert self.toas.ntoas == 4005 - def test_DMX_selection(self): + def test_dmx_selection(self): dmx_old = self.get_dmx_old(self.toas).value # New way in the code. dmx_new = self.model.dmx_dm(self.toas).value diff --git a/tests/test_troposphere_model.py b/tests/test_troposphere_model.py index 5d0ee5d63..9aa0cfeb6 100644 --- a/tests/test_troposphere_model.py +++ b/tests/test_troposphere_model.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest import astropy.units as u import numpy as np @@ -9,12 +9,12 @@ from pinttestdata import datadir -class TestTroposphereDelay(unittest.TestCase): +class TestTroposphereDelay: MIN_ALT = 5 # the minimum altitude in degrees for testing the delay model FLOAT_THRESHOLD = 1e-12 # - def setUp(self): + def setup_method(self): # parfile = os.path.join(datadir, "J1744-1134.basic.par") # ngc = os.path.join(datadir, "NGC6440E") diff --git a/tests/test_utils.py b/tests/test_utils.py index 15816c135..18988b4d0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -55,6 +55,7 @@ convert_dispersion_measure, print_color_examples, parse_time, + info_string, ) @@ -865,3 +866,8 @@ def test_parse_time(t): assert parse_time(t, scale="tdb") == Time( 55555, format="pulsar_mjd", scale="tdb", precision=9 ) + + +def test_info_str(): + info = info_string() + dinfo = info_string(detailed=True) diff --git a/tests/test_wavex.py b/tests/test_wavex.py new file mode 100644 index 000000000..0c7ec4dca --- /dev/null +++ b/tests/test_wavex.py @@ -0,0 +1,402 @@ +from io import StringIO +import pytest +import numpy as np +from loguru import logger as log + +from astropy import units as u +from pint.models import get_model, get_model_and_toas +from pint.models import model_builder as mb +from pint.models.timing_model import Component, MissingParameter +from pint.fitter import Fitter +from pint.residuals import Residuals +from pint.toa import get_TOAs +from pint.simulation import make_fake_toas_uniform +import pint.utils +from pinttestdata import datadir +from pint.models.wavex import WaveX + +par1 = """ + PSR B1937+21 + LAMBDA 301.9732445337270 + BETA 42.2967523367957 + PMLAMBDA -0.0175 + PMBETA -0.3971 + PX 0.1515 + POSEPOCH 55321.0000 + F0 641.9282333345536244 1 0.0000000000000132 + F1 -4.330899370129D-14 1 2.149749089617D-22 + PEPOCH 55321.000000 + DM 71.016633 + UNITS TDB + """ + +# Introduce a par file with WaveX already present + +par2 = """ + PSR B1937+21 + LAMBDA 301.9732445337270 + BETA 42.2967523367957 + PMLAMBDA -0.0175 + PMBETA -0.3971 + PX 0.1515 + POSEPOCH 55321.0000 + F0 641.9282333345536244 1 0.0000000000000132 + F1 -4.330899370129D-14 1 2.149749089617D-22 + PEPOCH 55321.000000 + DM 71.016633 + WXEPOCH 55321.000000 + WXFREQ_0001 0.1 + WXSIN_0001 1 + WXCOS_0001 1 + UNITS TDB + """ + +wavex_par = """ + WXFREQ_0002 0.2 + WXSIN_0002 2 + WXCOS_0002 2 + WXFREQ_0003 0.3 + WXSIN_0003 3 + WXCOS_0003 3 +""" +wave_par = """ + WAVEEPOCH 55321.000000 + WAVE_OM 0.1 + WAVE1 0.2 0.1 + WAVE2 0.6 0.3""" + + +def wavex_delay(waves, toas): + total_delay = np.zeros(toas.ntoas) * u.s + wave_freqs = waves.get_prefix_mapping_component("WXFREQ_") + wave_sins = waves.get_prefix_mapping_component("WXSIN_") + wave_cos = waves.get_prefix_mapping_component("WXCOS_") + base_phase = toas.table["tdbld"].data * u.d - waves.WXEPOCH.value * u.d + for idx, param in wave_freqs.items(): + freq = getattr(waves, param).quantity + wxsin = getattr(waves, wave_sins[idx]).quantity + wxcos = getattr(waves, wave_cos[idx]).quantity + arg = 2.0 * np.pi * freq * base_phase + total_delay += wxsin * np.sin(arg.value) + wxcos * np.cos(arg.value) + return total_delay + + +def test_derivative(): + # Check that analytical and numerical derivatives are similar + model = mb.get_model(StringIO(par2)) + model.WXFREQ_0001.value = 0.1 + model.WXSIN_0001.value = 0.01 + model.WXCOS_0001.value = 0.05 + toas = make_fake_toas_uniform(55000, 55100, 100, model, obs="gbt") + p = "WXSIN_0001" + log.debug(f"Running derivative for {p}", f"d_delay_d_{p}") + ndf = model.d_delay_d_param_num(toas, p) + adf = model.d_delay_d_param(toas, p) + diff = ndf - adf + print(diff) + if np.all(diff.value) != 0.0: + mean_der = (adf + ndf) / 2.0 + relative_diff = np.abs(diff) / np.abs(mean_der) + msg = f"Derivative test failed at d_delay_d_{p} with max relative difference {np.nanmax(relative_diff).value}" + tol = 0.7 + log.debug( + ( + f"derivative relative diff for d_delay_d_{p}, {np.nanmax(relative_diff).value}" + ) + ) + assert np.nanmax(relative_diff) < tol, msg + + +def test_wxsin_fit(): + # Check that when a par file with a wavex model is used to generate fake toas the wavex parameters don't change much when fitted for + model = get_model(StringIO(par1)) + model.add_component(WaveX()) + model.WXFREQ_0001.value = 0.1 + model.WXSIN_0001.value = 0.01 + model.WXCOS_0001.value = 0.05 + toas = make_fake_toas_uniform(55000, 55100, 100, model, obs="gbt") + for param in model.free_params: + getattr(model, param).frozen = True + model.WXSIN_0001.value = 0.02 + model.WXSIN_0001.frozen = False + f = Fitter.auto(toas, model) + f.fit_toas() + assert np.isclose(f.model.WXSIN_0001.value, 0.01, atol=1e-3) + + +def test_wxcos_fit(): + # Check that when a par file with a wavex model is used to generate fake toas the wavex parameters don't change much when fitted for + model = get_model(StringIO(par1)) + model.add_component(WaveX()) + model.WXFREQ_0001.value = 0.1 + model.WXSIN_0001.value = 0.01 + model.WXCOS_0001.value = 0.05 + toas = make_fake_toas_uniform(55000, 55100, 100, model, obs="gbt") + for param in model.free_params: + getattr(model, param).frozen = True + model.WXCOS_0001.value = 0.09 + model.WXCOS_0001.frozen = False + f = Fitter.auto(toas, model) + f.fit_toas() + assert np.isclose(f.model.WXCOS_0001.value, 0.05, atol=1e-3) + + +def test_wavex_resids_amp(): + # Check that the amplitude of residuals somewhat matches independent calculation of wave delay for a single component + model = get_model(StringIO(par1)) + toas = make_fake_toas_uniform(55000, 55100, 500, model, obs="gbt") + wave_model = get_model(StringIO(par2)) + rs = Residuals(toas, wave_model) + injected_amp = np.sqrt( + wave_model.WXSIN_0001.quantity**2 + wave_model.WXCOS_0001.quantity**2 + ) + assert np.isclose(max(rs.resids), injected_amp, atol=1e-2) + assert np.isclose(min(rs.resids), -injected_amp, atol=1e-2) + + +def test_multiple_wavex_resids_amp(): + # Check that residuals for multiple components match independent calculation + model = get_model(StringIO(par1)) + toas = make_fake_toas_uniform(55000, 55100, 500, model, obs="gbt") + wave_model = get_model(StringIO(par2 + wavex_par)) + rs = Residuals(toas, wave_model) + wave_delays = wavex_delay(wave_model.components["WaveX"], toas) + assert np.allclose(rs.resids, -wave_delays, atol=max(rs.resids.value) / 10.0) + + +def test_wavex_from_par(): + # Check that a par file with wavex components present produces expected indices + model = get_model(StringIO(par2 + wavex_par)) + indices = model.components["WaveX"].get_indices() + assert np.all(np.array(indices) == np.array([1, 2, 3])) + + +def test_add_wavex_to_par(): + # Add a wavex component to par file that has none and check against par file with some WaveX model + model = get_model(StringIO(par1)) + toas = make_fake_toas_uniform(55000, 55100, 100, model, obs="gbt") + model.add_component(WaveX()) + index = model.components["WaveX"].get_indices() + model.WXFREQ_0001.quantity = 0.1 * (1 / u.d) + model.WXSIN_0001.quantity = 1 * u.s + model.WXCOS_0001.quantity = 1 * u.s + wavex_model = get_model(StringIO(par2)) + assert np.all( + np.array(index) == np.array(wavex_model.components["WaveX"].get_indices()) + ) + assert np.all( + model.components["WaveX"].wavex_delay(toas, 0.0 * u.s) + == wavex_model.components["WaveX"].wavex_delay(toas, 0.0 * u.s) + ) + + +def test_add_existing_index(): + # Check that trying to add an existing index fails + model = get_model(StringIO(par2 + wavex_par)) + with pytest.raises(ValueError): + index = model.components["WaveX"].add_wavex_component(0.01, index=2) + + +def test_add_existing_indices(): + # Check that trying to add multiple existing indices fails + model = get_model(StringIO(par2 + wavex_par)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.01, 0.02], indices=[2, 3] + ) + + +def test_multiple_wavex_none_indices(): + model = get_model(StringIO(par2 + wavex_par)) + model.components["WaveX"].add_wavex_components([0.01, 0.02]) + indices = model.components["WaveX"].get_indices() + assert np.all(indices == np.array(range(1, len(indices) + 1))) + + +def test_add_then_remove_wavex(): + # Check that adding and then removing a wavex component actually gets rid of it + model = get_model(StringIO(par2)) + model.components["WaveX"].add_wavex_component(0.2, index=2, wxsin=2, wxcos=2) + indices = model.components["WaveX"].get_indices() + model.components["WaveX"].remove_wavex_component(2) + index = model.components["WaveX"].get_indices() + assert np.all(np.array(len(indices)) != np.array(len(index))) + + +def test_multiple_wavex(): + # Check that when adding multiple wavex component pythonically is consistent with a par file with the same components + model = get_model(StringIO(par2)) + toas = make_fake_toas_uniform(55000, 55100, 100, model, obs="gbt") + wavex_model = get_model(StringIO(par2 + wavex_par)) + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[2, 3], wxsins=[2, 3], wxcoses=[2, 3] + ) + assert np.all(np.array(indices) == np.array([2, 3])) + assert np.all( + model.components["WaveX"].wavex_delay(toas, 0.0 * u.s) + == wavex_model.components["WaveX"].wavex_delay(toas, 0.0 * u.s) + ) + + +def test_multiple_wavex_unit_conversion(): + # Check that input frequencies and amplitudes in different units convert properly + model = get_model(StringIO(par2)) + freqs = [2e-7 * u.s**-1, 3e-7 * u.s**-1] + indices = model.components["WaveX"].add_wavex_components( + [2e-7 * u.s**-1, 3e-7 * u.s**-1], + indices=[2, 3], + wxsins=[2, 3], + wxcoses=[2, 3], + frozens=False, + ) + assert getattr(model, f"WXFREQ_0002").value == freqs[0].to(u.d**-1).value + assert getattr(model, f"WXFREQ_0003").value == freqs[1].to(u.d**-1).value + + +def test_cos_amp_missing(): + # Check that validate fails when using a model with missing cosine amplitudes for the frequencies present + bad_wavex_par = """ + WXFREQ_0002 0.2 + WXSIN_0002 2 + """ + with pytest.raises(ValueError): + model = get_model(StringIO(par2 + bad_wavex_par)) + + +def test_sin_amp_missing(): + # Check that validate fails when using a model with missing cosine amplitudes for the frequencies present + bad_wavex_par = """ + WXFREQ_0002 0.2 + WXCOS_0002 2 + """ + with pytest.raises(ValueError): + model = get_model(StringIO(par2 + bad_wavex_par)) + + +def test_bad_wxfreq_value(): + # Check that putting a zero, or None value for an added frequency raises ValueErrors + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + model.components["WaveX"].add_wavex_component(0) + model.components["WaveX"].add_wavex_component(None) + + +def test_missing_epoch_parameters(): + bad_par = """ + PSR B1937+21 + LAMBDA 301.9732445337270 + BETA 42.2967523367957 + PMLAMBDA -0.0175 + PMBETA -0.3971 + PX 0.1515 + F0 641.9282333345536244 1 0.0000000000000132 + F1 -4.330899370129D-14 1 2.149749089617D-22 + DM 71.016633 + WXFREQ_0001 0.1 + WXSIN_0001 1 + WXCOS_0001 1 + UNITS TDB + """ + with pytest.raises(MissingParameter): + model = get_model(StringIO(bad_par)) + + +def test_sin_cos_mismatch(): + # Check that having mismatching sine and cosine amplitudes raises ValueErrors + bad_wavex_par = """ + WXFREQ_0002 0.2 + WXSIN_0002 2 + WXCOS_0003 2 + WXFREQ_0003 0.3 + WXSIN_0003 2 + WXCOS_0004 2 + """ + with pytest.raises(ValueError): + model = get_model(StringIO(par2 + bad_wavex_par)) + + +def test_multiple_wavex_broadcast_frozens(): + # Check that when a single False is given for frozens, it gets broadcast to all the sine and cosine amplitudes + model = get_model(StringIO(par2)) + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], + indices=[2, 3], + wxsins=[2, 3], + wxcoses=[2, 3], + frozens=False, + ) + for index in indices: + assert getattr(model, f"WXSIN_{index:04d}").frozen == False + assert getattr(model, f"WXCOS_{index:04d}").frozen == False + + +def test_multiple_wavex_wrong_cos_amps(): + # Check that code breaks when adding an extra cosine amplitude than there are frequencies, indices, and sine amplitudes for + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[2, 3], wxsins=[2, 3], wxcoses=[2, 3, 4] + ) + + +def test_multiple_wavex_wrong_sin_amps(): + # Check that code breaks when adding an extra sine amplitude than there are frequencies, indices, and cosine amplitudes for + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[2, 3], wxsins=[2, 3, 4], wxcoses=[2, 3] + ) + + +def test_multiple_wavex_wrong_freqs(): + # Check that code breaks when not adding enough frequencies for the number of indices, sine amps, and cosine amps given + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[2, 3, 4], wxsins=[2, 3, 4], wxcoses=[2, 3, 4] + ) + + +def test_multiple_wavex_wrong_frozens(): + # Check that adding to many elements to frozens breaks code + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], + indices=[2, 3], + wxsins=[2, 3], + wxcoses=[2, 3], + frozens=[False, False, False], + ) + + +def test_multiple_wavex_explicit_indices(): + # Check that adding specific indices is done correctly + model = get_model(StringIO(par2)) + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[3, 4], wxsins=[2, 3], wxcoses=[2, 3] + ) + assert np.all(np.array(indices) == np.array([3, 4])) + + +def test_multiple_wavex_explicit_indices_duplicate(): + # Check that adding a duplicate index fails + model = get_model(StringIO(par2)) + with pytest.raises(ValueError): + indices = model.components["WaveX"].add_wavex_components( + [0.2, 0.3], indices=[1, 3], wxsins=[2, 3], wxcoses=[2, 3] + ) + + +def test_wave_wavex_roundtrip_conversion(): + # Check that when starting with a TimingModel with a Wave model, conversion to a WaveX mode and then back produces consistent results + model = get_model(StringIO(par1)) + toas = make_fake_toas_uniform(55000, 55100, 500, model, obs="gbt") + wave_model = get_model(StringIO(par1 + wave_par)) + wave_to_wavex_model = pint.utils.translate_wave_to_wavex(wave_model) + wavex_to_wave_model = pint.utils.translate_wavex_to_wave(wave_to_wavex_model) + rs_wave = Residuals(toas, wave_model) + rs_wave_to_wavex = Residuals(toas, wave_to_wavex_model) + rs_wavex_to_wave = Residuals(toas, wavex_to_wave_model) + assert np.allclose(rs_wave.resids, rs_wave_to_wavex.resids, atol=1e-3) + assert np.allclose(rs_wave.resids, rs_wavex_to_wave.resids, atol=1e-3) diff --git a/tests/test_wideband_dm_data.py b/tests/test_wideband_dm_data.py index c62d5d9f3..32df2af5d 100644 --- a/tests/test_wideband_dm_data.py +++ b/tests/test_wideband_dm_data.py @@ -60,19 +60,6 @@ def wb_model(tmpdir): return get_model(str(parfile)) -@pytest.fixture -def wb_toas(wb_model): - toas = get_TOAs(io.StringIO(tim)) - for i in range(9): - r = Residuals(toas, wb_model) - if np.all(r.time_resids < 1 * u.ns): - break - toas.adjust_TOAs(TimeDelta(-r.time_resids)) - else: - raise ValueError - return toas - - @pytest.fixture def wb_toas_all(wb_model): toas = get_TOAs(io.StringIO(tim_all)) @@ -162,14 +149,18 @@ def test_dmjump_derivative(self): assert self.model.dm_derivs[dmj_param.name] == [self.model.d_dm_d_dmjump] -def test_wideband_residuals(wb_model, wb_toas): - r = WidebandTOAResiduals(wb_toas, wb_model, dm_resid_args=dict(subtract_mean=False)) - assert len(r.toa.time_resids) == len(wb_toas) - assert len(r.dm.dm_data) < len(wb_toas) +def test_wideband_residuals(wb_model, wb_toas_all): + r = WidebandTOAResiduals( + wb_toas_all, wb_model, dm_resid_args=dict(subtract_mean=False) + ) + assert len(r.toa.time_resids) == len(wb_toas_all) + assert len(r.dm.dm_data) == len(wb_toas_all) -def test_wideband_residuals_dmjump(wb_model, wb_toas): - r = WidebandTOAResiduals(wb_toas, wb_model, dm_resid_args=dict(subtract_mean=False)) +def test_wideband_residuals_dmjump(wb_model, wb_toas_all): + r = WidebandTOAResiduals( + wb_toas_all, wb_model, dm_resid_args=dict(subtract_mean=False) + ) model = deepcopy(wb_model) assert wb_model.DMJUMP1.value == 0 model.DMJUMP1.value = 10 @@ -178,10 +169,17 @@ def test_wideband_residuals_dmjump(wb_model, wb_toas): model.DMJUMP0 with pytest.raises(AttributeError): model.DMJUMP2 - r2 = WidebandTOAResiduals(wb_toas, model, dm_resid_args=dict(subtract_mean=False)) + r2 = WidebandTOAResiduals( + wb_toas_all, model, dm_resid_args=dict(subtract_mean=False) + ) assert 0 < np.sum(r.dm.resids_value != r2.dm.resids_value) < len(r.dm.resids_value) +def test_read_mixed_timfile(): + with pytest.raises(ValueError): + get_TOAs(io.StringIO(tim)) + + def test_wideband_residuals_dof(wb_model, wb_toas_all): wb_model.free_params = ["DMJUMP1"] r = WidebandTOAResiduals( @@ -192,14 +190,6 @@ def test_wideband_residuals_dof(wb_model, wb_toas_all): assert_allclose(r.reduced_chi2, r.chi2 / r.dof) -@pytest.mark.xfail(reason="All TOAs must have DMs, currently") -def test_wideband_fit_dmjump(wb_model, wb_toas): - wb_model.free_params = ["DMJUMP1"] - fitter = WidebandTOAFitter(wb_toas, wb_model) - fitter.fit_toas() - assert_allclose(fitter.model.DMJUMP1.value, -10, atol=1e-3) - - def test_wideband_fit_dmjump_all(wb_model, wb_toas_all): wb_model.free_params = ["DMJUMP1"] fitter = WidebandTOAFitter(wb_toas_all, wb_model) diff --git a/tests/test_wls_fitter.py b/tests/test_wls_fitter.py index 500ffde12..1c9532e7a 100644 --- a/tests/test_wls_fitter.py +++ b/tests/test_wls_fitter.py @@ -1,5 +1,5 @@ import os -import unittest +import pytest from pint.models.model_builder import get_model from pint import toa @@ -7,11 +7,11 @@ from pinttestdata import datadir -class Testwls(unittest.TestCase): +class Testwls: """Compare delays from the dd model with tempo and PINT""" @classmethod - def setUpClass(cls): + def setup_class(cls): os.chdir(datadir) cls.par = "B1855+09_NANOGrav_dfg+12_TAI_FB90.par" cls.tim = "B1855+09_NANOGrav_dfg+12.tim"