Source code for pint.pintk.timedit
import io
import astropy.time
import tkinter as tk
import tkinter.filedialog as tkFileDialog
import pint
import pint.logging
from loguru import logger as log
import pint.pintk.plk
[docs]class TimActionsWidget(tk.Frame):
"""
Allows the user to reset the model, apply changes, or save to a parfile
"""
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.configure(bg=pint.pintk.plk.background)
self.reset_callback = None
self.remove_callback = None
self.apply_callback = None
self.write_callback = None
self.initLayout()
def initLayout(self):
button = tk.Button(
self,
text="Reset TOAs",
command=self.resetTimfile,
bg=pint.pintk.plk.background,
fg=pint.pintk.plk.foreground,
)
button.grid(row=0, column=0)
button = tk.Button(
self,
text="Remove Changes",
command=self.removeChanges,
bg=pint.pintk.plk.background,
fg=pint.pintk.plk.foreground,
)
button.grid(row=0, column=1)
button = tk.Button(
self,
text="Apply Changes",
command=self.applyChanges,
bg=pint.pintk.plk.background,
fg=pint.pintk.plk.foreground,
)
button.grid(row=0, column=2)
button = tk.Button(
self,
text="Write Tim",
command=self.writeTim,
bg=pint.pintk.plk.background,
fg=pint.pintk.plk.foreground,
)
button.grid(row=0, column=3)
def setCallbacks(self, resetTimfile, removeChanges, applyChanges, writeTim):
self.reset_callback = resetTimfile
self.remove_callback = removeChanges
self.apply_callback = applyChanges
self.write_callback = writeTim
def resetTimfile(self):
log.debug("Reset clicked")
if self.reset_callback is not None:
self.reset_callback()
def removeChanges(self):
log.debug("Remove clicked")
if self.remove_callback is not None:
self.remove_callback()
def applyChanges(self):
log.debug("Apply clicked")
if self.apply_callback is not None:
self.apply_callback()
def writeTim(self):
log.debug("Write clicked")
if self.write_callback is not None:
self.write_callback()
[docs]class TimWidget(tk.Frame):
"""
A widget that allows editing and saving of a pulsar timfile
"""
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.configure(
bg=pint.pintk.plk.background,
)
self.psr = None
self.update_callbacks = None
self.initLayout()
def initLayout(self):
self.editor = tk.Text(self)
self.editor.grid(row=0, column=0, sticky="nesw")
scrollbar = tk.Scrollbar(self, command=self.editor.yview)
scrollbar.grid(row=0, column=1, sticky="nesw")
self.editor["yscrollcommand"] = scrollbar.set
self.actionsWidget = TimActionsWidget(master=self)
self.actionsWidget.grid(row=1, column=0, sticky="w")
self.grid_rowconfigure(0, weight=10)
self.grid_rowconfigure(1, weight=1)
def setPulsar(self, psr, updates):
self.psr = psr
self.actionsWidget.setCallbacks(
self.reset, self.set_toas, self.applyChanges, self.writeTim
)
self.set_toas()
self.update_callbacks = updates
def call_updates(self):
if self.update_callbacks is not None:
for ucb in self.update_callbacks:
ucb()
def reset(self):
self.psr.reset_TOAs()
self.set_toas()
self.call_updates()
def set_toas(self, newpsr=None):
# if pulsar updated in pintk, update here
if newpsr != None:
self.psr = newpsr
self.editor.delete("1.0", tk.END)
# Pretty much copying TOAs.write_TOA_file here but without creating an
# intermediate filename
toas = self.psr.selected_toas
asfile = "FORMAT 1\n"
pnChange = False
if "pn" in toas.table.colnames:
pnChange = True
for i in range(len(toas.table["flags"])):
toas.table["flags"][i]["pn"] = toas.table["pn"][i]
for time, err, freq, obs, flags in zip(
toas.table["mjd"],
toas.table["error"].quantity,
toas.table["freq"].quantity,
toas.table["obs"],
toas.table["flags"],
):
obs_obj = pint.observatory.Observatory.get(obs)
if "clkcorr" in flags.keys():
time_out = time - astropy.time.TimeDelta(flags["clkcorr"])
else:
time_out = time
asfile += pint.toa.format_toa_line(
time_out, err, freq, obs_obj, name="pint", flags=flags, format="TEMPO2"
)
if pnChange:
for flags in toas.table["flags"]:
del flags["pn"]
self.editor.insert("1.0", asfile)
def applyChanges(self):
text = self.editor.get("1.0", "end-1c")
self.psr.selected_toas = pint.toa.get_TOAs(io.StringIO(text))
self.call_updates()
def writeTim(self):
filename = tkFileDialog.asksaveasfilename(title="Choose output tim file")
try:
with open(filename, "w") as fout:
fout.write(self.editor.get("1.0", "end-1c"))
log.info(f"Saved timfile to {filename}")
except Exception:
if filename in [(), ""]:
log.warning("Writing tim file cancelled.")
else:
log.warning("Could not save timfile to filename:\t%s" % filename)