Skip to content

Commit

Permalink
Merge branch 'nanograv:master' into ne_sw1
Browse files Browse the repository at this point in the history
  • Loading branch information
abhisrkckl authored Nov 22, 2024
2 parents 12ef298 + 96adf4b commit 0e5f3a4
Show file tree
Hide file tree
Showing 18 changed files with 207 additions and 38 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ the released changes.

## Unreleased
### Changed
- Command line scripts now automatically do `allow_tcb` and `allow_T2` while reading par files.
- Updated the `plot_chains` function in `event_optimize` so that the subplots are a fixed size to prevent the subplots from being condensed in the case of many fit parameters.
### Added
- Time derivatives of NE_SW in `SolarWindDispersion`
Expand Down
3 changes: 3 additions & 0 deletions src/pint/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@
"hourangle_second": hourangle_second,
}

# define a units equivalency for gauss in cgs
gauss_equiv = [u.Gauss, u.Hz * (u.g / u.cm) ** (1 / 2), lambda x: x, lambda x: x]

import astropy.version

if astropy.version.major < 4:
Expand Down
57 changes: 37 additions & 20 deletions src/pint/derived_quantities.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,14 @@ def pferrs(
return (forp, forperr, fdorpd, fdorpderr)


def _to_gauss(B: u.Quantity) -> u.G:
"""Convert quantity with mass, length, and time units to Gauss.
In cgs units, magnetic field is has units (mass/length)^(1/2) / time.
"""
return B.to(u.Gauss, equivalencies=[pint.gauss_equiv])


@u.quantity_input(f=u.Hz, fdot=u.Hz / u.s, fo=u.Hz)
def pulsar_age(
f: u.Quantity, fdot: u.Quantity, n: int = 3, fo: u.Quantity = 1e99 * u.Hz
Expand Down Expand Up @@ -219,19 +227,27 @@ def pulsar_edot(
return (-4.0 * np.pi**2 * I * f * fdot).to(u.erg / u.s)


@u.quantity_input(f=u.Hz, fdot=u.Hz / u.s)
def pulsar_B(f: u.Quantity, fdot: u.Quantity) -> u.G:
@u.quantity_input(f=u.Hz, fdot=u.Hz / u.s, I=u.g * u.cm**2, R=u.km)
def pulsar_B(
f: u.Quantity,
fdot: u.Quantity,
I: u.Quantity = 1.0e45 * u.g * u.cm**2,
R: u.Quantity = 10 * u.km,
) -> u.G:
r"""Compute pulsar surface magnetic field
Return the estimated pulsar surface magnetic field strength
given the spin frequency and frequency derivative.
Return the pulsar surface magnetic field strength given the spin frequency `f` and frequency derivative `fdot`.
Parameters
----------
f : astropy.units.Quantity
pulsar frequency
fdot : astropy.units.Quantity
frequency derivative :math:`\dot f`
I : astropy.units.Quantity, optional
pulsar moment of inertia, default of 1e45 g*cm**2
R : astropy.units.Quantity, optional
pulsar radius, default of 10 km
Returns
-------
Expand All @@ -247,15 +263,19 @@ def pulsar_B(f: u.Quantity, fdot: u.Quantity) -> u.G:
Notes
-----
Calculates :math:`B=3.2\times 10^{19}\,{\rm G}\sqrt{ f \dot f^{-3}}`
Calculates :math:`B=\sqrt{\frac{3\,I\,c^3}{8\pi^2\,R^6}\times\frac{-\dot{f}}{f^3}}`
"""
# This is a hack to use the traditional formula by stripping the units.
# It would be nice to improve this to a proper formula with units
return 3.2e19 * u.G * np.sqrt(-fdot.to_value(u.Hz / u.s) / f.to_value(u.Hz) ** 3.0)
factor = (3.0 * I * const.c**3) / (8.0 * np.pi**2 * R**6)
return _to_gauss((factor * (-fdot) / f**3) ** 0.5)


@u.quantity_input(f=u.Hz, fdot=u.Hz / u.s)
def pulsar_B_lightcyl(f: u.Quantity, fdot: u.Quantity) -> u.G:
@u.quantity_input(f=u.Hz, fdot=u.Hz / u.s, I=u.g * u.cm**2, R=u.km)
def pulsar_B_lightcyl(
f: u.Quantity,
fdot: u.Quantity,
I: u.Quantity = 1.0e45 * u.g * u.cm**2,
R=10 * u.km,
) -> u.G:
r"""Compute pulsar magnetic field at the light cylinder
Return the estimated pulsar magnetic field strength at the
Expand All @@ -268,6 +288,10 @@ def pulsar_B_lightcyl(f: u.Quantity, fdot: u.Quantity) -> u.G:
pulsar frequency
fdot : astropy.units.Quantity
frequency derivative :math:`\dot f`
I : astropy.units.Quantity, optional
pulsar moment of inertia, default of 1e45 g*cm**2
R : astropy.units.Quantity, optional
pulsar radius, default of 10 km
Returns
-------
Expand All @@ -283,17 +307,10 @@ def pulsar_B_lightcyl(f: u.Quantity, fdot: u.Quantity) -> u.G:
Notes
-----
Calculates :math:`B_{LC} = 2.9\times 10^8\,{\rm G} P^{-5/2} \dot P^{1/2}`
Calculates :math:`B_{LC} = \sqrt{\frac{-24\pi^4\,I}{c^3}\dot{f}f^3}`
"""
p, pd = p_to_f(f, fdot)
# This is a hack to use the traditional formula by stripping the units.
# It would be nice to improve this to a proper formula with units
return (
2.9e8
* u.G
* p.to_value(u.s) ** (-5.0 / 2.0)
* np.sqrt(pd.to(u.dimensionless_unscaled).value)
)
factor = 24.0 * np.pi**4.0 * I / const.c**3.0
return _to_gauss((factor * (-fdot) * f**3.0) ** 0.5)


@u.quantity_input(pb=u.d, x=u.cm)
Expand Down
8 changes: 6 additions & 2 deletions src/pint/pintk/pulsar.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,9 @@ def __contains__(self, key):
return key in self.prefit_model.params

def reset_model(self):
self.prefit_model = pint.models.get_model(self.parfile)
self.prefit_model = pint.models.get_model(
self.parfile, allow_T2=True, allow_tcb=True
)
self.add_model_params()
self.postfit_model = None
self.postfit_resids = None
Expand All @@ -172,7 +174,9 @@ def reset_TOAs(self):
self.update_resids()

def resetAll(self):
self.prefit_model = pint.models.get_model(self.parfile)
self.prefit_model = pint.models.get_model(
self.parfile, allow_T2=True, allow_tcb=True
)
self.postfit_model = None
self.postfit_resids = None
self.fitted = False
Expand Down
15 changes: 13 additions & 2 deletions src/pint/scripts/compare_parfiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,25 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
level=pint.logging.get_level(args.loglevel, args.verbosity, args.quiet)
)

m1 = get_model(args.input1)
m2 = get_model(args.input2)
m1 = get_model(args.input1, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb)
m2 = get_model(args.input2, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb)

print(
m1.compare(
m2,
Expand Down
14 changes: 13 additions & 1 deletion src/pint/scripts/convert_parfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
Expand All @@ -83,7 +93,9 @@ def main(argv=None):
return

log.info(f"Reading '{args.input}'")
model = get_model(args.input)

model = get_model(args.input, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb)

if hasattr(model, "BINARY") and args.binary is not None:
log.info(f"Converting from {model.BINARY.value} to {args.binary}")
if args.binary == "ELL1H":
Expand Down
14 changes: 13 additions & 1 deletion src/pint/scripts/event_optimize.py
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,16 @@ def main(argv=None):
action="store_true",
dest="linearize_model",
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
Expand Down Expand Up @@ -739,7 +749,9 @@ def main(argv=None):
ncores = args.ncores

# Read in initial model
modelin = pint.models.get_model(parfile)
modelin = pint.models.get_model(
parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

# File name setup and clobber file check
filepath = args.filepath or os.getcwd()
Expand Down
15 changes: 14 additions & 1 deletion src/pint/scripts/event_optimize_MCMCFitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,17 @@ def main(argv=None):
help="Logging level",
dest="loglevel",
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

global nwalkers, nsteps, ftr

args = parser.parse_args(argv)
Expand Down Expand Up @@ -164,7 +175,9 @@ def main(argv=None):
wgtexp = args.wgtexp

# Read in initial model
modelin = pint.models.get_model(parfile)
modelin = pint.models.get_model(
parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

# The custom_timing version below is to manually construct the TimingModel
# class, which allows it to be pickled. This is needed for parallelizing
Expand Down
14 changes: 13 additions & 1 deletion src/pint/scripts/event_optimize_multiple.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,16 @@ def main(argv=None):
help="Logging level",
dest="loglevel",
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

global nwalkers, nsteps, ftr

Expand Down Expand Up @@ -261,7 +271,9 @@ def main(argv=None):
wgtexp = args.wgtexp

# Read in initial model
modelin = pint.models.get_model(parfile)
modelin = pint.models.get_model(
parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

# Set the target coords for automatic weighting if necessary
if "ELONG" in modelin.params:
Expand Down
15 changes: 14 additions & 1 deletion src/pint/scripts/fermiphase.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
Expand All @@ -88,7 +98,10 @@ def main(argv=None):
args.addphase = True

# Read in model
modelin = pint.models.get_model(args.parfile)
modelin = pint.models.get_model(
args.parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

if "ELONG" in modelin.params:
tc = SkyCoord(
modelin.ELONG.quantity,
Expand Down
15 changes: 14 additions & 1 deletion src/pint/scripts/photonphase.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
Expand Down Expand Up @@ -153,7 +163,10 @@ def main(argv=None):
"Please barycenter the event file using the official mission tools before processing with PINT"
)
# Read in model
modelin = pint.models.get_model(args.parfile)
modelin = pint.models.get_model(
args.parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

use_planets = False
if "PLANET_SHAPIRO" in modelin.params:
if modelin.PLANET_SHAPIRO.value:
Expand Down
14 changes: 13 additions & 1 deletion src/pint/scripts/pintbary.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,16 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
Expand Down Expand Up @@ -105,7 +115,9 @@ def main(argv=None):
)

if args.parfile is not None:
m = pint.models.get_model(args.parfile)
m = pint.models.get_model(
args.parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)
else:
# Construct model by hand
m = pint.models.StandardTimingModel
Expand Down
14 changes: 13 additions & 1 deletion src/pint/scripts/pintempo.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,26 @@ def main(argv=None):
parser.add_argument(
"-q", "--quiet", default=0, action="count", help="Decrease output verbosity"
)
parser.add_argument(
"--allow_tcb",
action="store_true",
help="Convert TCB par files to TDB automatically",
)
parser.add_argument(
"--allow_T2",
action="store_true",
help="Guess the underlying binary model when T2 is given",
)

args = parser.parse_args(argv)
pint.logging.setup(
level=pint.logging.get_level(args.loglevel, args.verbosity, args.quiet)
)

log.info("Reading model from {0}".format(args.parfile))
m = pint.models.get_model(args.parfile)
m = pint.models.get_model(
args.parfile, allow_T2=args.allow_T2, allow_tcb=args.allow_tcb
)

log.warning(m.params)

Expand Down
Loading

0 comments on commit 0e5f3a4

Please sign in to comment.