add readfos.specpol.from_txt and more to dump_txt
This commit is contained in:
@@ -67,6 +67,8 @@ class specpol(object):
|
|||||||
self.I_r_err = deepcopy(other.I_r_err)
|
self.I_r_err = deepcopy(other.I_r_err)
|
||||||
self.wav_r = deepcopy(other.wav_r)
|
self.wav_r = deepcopy(other.wav_r)
|
||||||
self.wav_r_err = deepcopy(other.wav_r_err)
|
self.wav_r_err = deepcopy(other.wav_r_err)
|
||||||
|
elif isinstance(other, str):
|
||||||
|
self.from_txt(other)
|
||||||
else:
|
else:
|
||||||
# Initialise to zero
|
# Initialise to zero
|
||||||
if isinstance(other, int):
|
if isinstance(other, int):
|
||||||
@@ -80,8 +82,9 @@ class specpol(object):
|
|||||||
Set all values to zero.
|
Set all values to zero.
|
||||||
"""
|
"""
|
||||||
self.hd = dict([])
|
self.hd = dict([])
|
||||||
|
self.hd["TARGNAME"], self.hd["PROPOSID"], self.hd["ROOTNAME"], self.hd["APER_ID"] = "", 0, "", ""
|
||||||
self.hd["DENSITY"] = False
|
self.hd["DENSITY"] = False
|
||||||
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [m]", r"F [count s$^{-1}$]"
|
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [m]", r"{0:s}F [$10^{{{1:d}}}$ count s$^{{-1}}$]"
|
||||||
self.bin_edges = np.zeros(n + 1)
|
self.bin_edges = np.zeros(n + 1)
|
||||||
self.wav = np.zeros(n)
|
self.wav = np.zeros(n)
|
||||||
self.wav_err = np.zeros((n, 2))
|
self.wav_err = np.zeros((n, 2))
|
||||||
@@ -92,7 +95,9 @@ class specpol(object):
|
|||||||
self.IQUV_cov = np.zeros((4, 4, n))
|
self.IQUV_cov = np.zeros((4, 4, n))
|
||||||
|
|
||||||
def rest(self, wav=None, z=None):
|
def rest(self, wav=None, z=None):
|
||||||
if z is None and "REDSHIFT" not in self.hd.keys():
|
if z is None and self.hd["TARGNAME"] == "":
|
||||||
|
z = 0
|
||||||
|
elif z is None and "REDSHIFT" not in self.hd.keys():
|
||||||
from astroquery.ipac.ned import Ned
|
from astroquery.ipac.ned import Ned
|
||||||
|
|
||||||
z = Ned.query_object(self.hd["TARGNAME"])["Redshift"][0]
|
z = Ned.query_object(self.hd["TARGNAME"])["Redshift"][0]
|
||||||
@@ -104,7 +109,9 @@ class specpol(object):
|
|||||||
return wav / (z + 1)
|
return wav / (z + 1)
|
||||||
|
|
||||||
def unrest(self, wav=None, z=None):
|
def unrest(self, wav=None, z=None):
|
||||||
if z is None and "REDSHIFT" not in self.hd.keys():
|
if z is None and self.hd["TARGNAME"] == "":
|
||||||
|
z = 0
|
||||||
|
elif z is None and "REDSHIFT" not in self.hd.keys():
|
||||||
from astroquery.ipac.ned import Ned
|
from astroquery.ipac.ned import Ned
|
||||||
|
|
||||||
z = Ned.query_object(self.hd["TARGNAME"])["Redshift"][0]
|
z = Ned.query_object(self.hd["TARGNAME"])["Redshift"][0]
|
||||||
@@ -258,12 +265,60 @@ class specpol(object):
|
|||||||
bin_edges = np.arange(self.bin_edges.min(), self.bin_edges.max() + size, size, dtype=np.float32)
|
bin_edges = np.arange(self.bin_edges.min(), self.bin_edges.max() + size, size, dtype=np.float32)
|
||||||
return self.bin(bin_edges)
|
return self.bin(bin_edges)
|
||||||
|
|
||||||
|
def from_txt(self, filename, data_dir=""):
|
||||||
|
"""
|
||||||
|
Fill current spectra from a text file.
|
||||||
|
"""
|
||||||
|
data_dump = np.loadtxt(join_path(data_dir, filename), skiprows=1).T
|
||||||
|
self.zero(data_dump.shape[1])
|
||||||
|
(
|
||||||
|
self.wav,
|
||||||
|
self.wav_err[:, 0],
|
||||||
|
self.I,
|
||||||
|
self.IQUV_cov[0, 0],
|
||||||
|
self.Q,
|
||||||
|
self.IQUV_cov[1, 1],
|
||||||
|
self.U,
|
||||||
|
self.IQUV_cov[2, 2],
|
||||||
|
self.V,
|
||||||
|
self.IQUV_cov[3, 3],
|
||||||
|
) = data_dump[:10]
|
||||||
|
self.wav_err[:, 1] = deepcopy(self.wav_err[:, 0])
|
||||||
|
self.bin_edges[:-1], self.bin_edges[-1] = deepcopy(self.wav - self.wav_err[:, 0]), deepcopy(self.wav[-1] + self.wav_err[-1, 1])
|
||||||
|
for i in range(4):
|
||||||
|
self.IQUV_cov[i][i] = deepcopy(self.IQUV_cov[i][i]) ** 2
|
||||||
|
with open(join_path(data_dir, filename)) as f:
|
||||||
|
self.hd["TARGNAME"], self.hd["PROPOSID"], self.hd["ROOTNAME"], self.hd["APER_ID"], self.hd["XUNIT"], self.hd["YUNIT"] = f.readline()[2:].split(";")
|
||||||
|
|
||||||
def dump_txt(self, filename, output_dir=""):
|
def dump_txt(self, filename, output_dir=""):
|
||||||
"""
|
"""
|
||||||
Dump current spectra to a text file.
|
Dump current spectra to a text file.
|
||||||
"""
|
"""
|
||||||
data_dump = np.array([self.wav, self.I, self.Q, self.U, self.V, self.P, self.PA]).T
|
header = ";".join([self.hd["TARGNAME"], str(self.hd["PROPOSID"]), self.hd["ROOTNAME"], self.hd["APER_ID"], self.hd["XUNIT"], self.hd["YUNIT"]])
|
||||||
np.savetxt(join_path(output_dir, filename + ".txt"), data_dump)
|
header += "\nwav\t wav_err\t I\t I_err\t Q\t Q_err\t U\t U_err\t V\t V_err\t P\t P_err\t PA\t PA_err"
|
||||||
|
data_dump = np.array(
|
||||||
|
[
|
||||||
|
self.wav,
|
||||||
|
self.wav_err.mean(axis=1),
|
||||||
|
self.I,
|
||||||
|
self.I_err,
|
||||||
|
self.Q,
|
||||||
|
self.Q_err,
|
||||||
|
self.U,
|
||||||
|
self.U_err,
|
||||||
|
self.V,
|
||||||
|
self.V_err,
|
||||||
|
self.P,
|
||||||
|
self.P_err,
|
||||||
|
self.PA,
|
||||||
|
self.PA_err,
|
||||||
|
]
|
||||||
|
).T
|
||||||
|
np.savetxt(
|
||||||
|
join_path(output_dir, filename + ".txt"),
|
||||||
|
data_dump,
|
||||||
|
header=header,
|
||||||
|
)
|
||||||
return join_path(output_dir, filename)
|
return join_path(output_dir, filename)
|
||||||
|
|
||||||
def plot(self, fig=None, ax=None, savename=None, plots_folder=""):
|
def plot(self, fig=None, ax=None, savename=None, plots_folder=""):
|
||||||
@@ -271,8 +326,9 @@ class specpol(object):
|
|||||||
Display current spectra.
|
Display current spectra.
|
||||||
"""
|
"""
|
||||||
if fig is None:
|
if fig is None:
|
||||||
|
plt.rcParams.update({"font.size": 15})
|
||||||
if ax is None:
|
if ax is None:
|
||||||
self.fig, self.ax = plt.subplots(3, 1, sharex=True, figsize=(10, 15))
|
self.fig, self.ax = plt.subplots(3, 1, sharex=True, figsize=(20, 15))
|
||||||
self.fig.subplots_adjust(hspace=0)
|
self.fig.subplots_adjust(hspace=0)
|
||||||
self.fig.suptitle("_".join([self.hd["TARGNAME"], str(self.hd["PROPOSID"]), self.hd["ROOTNAME"], self.hd["APER_ID"]]))
|
self.fig.suptitle("_".join([self.hd["TARGNAME"], str(self.hd["PROPOSID"]), self.hd["ROOTNAME"], self.hd["APER_ID"]]))
|
||||||
else:
|
else:
|
||||||
@@ -297,22 +353,44 @@ class specpol(object):
|
|||||||
ax1 = self.ax
|
ax1 = self.ax
|
||||||
|
|
||||||
# Display flux and polarized flux on first ax
|
# Display flux and polarized flux on first ax
|
||||||
ax1.set_xlabel(self.hd["XUNIT"])
|
|
||||||
ax1.set_ylabel(self.hd["YUNIT"])
|
|
||||||
if hasattr(self, "I_r"):
|
if hasattr(self, "I_r"):
|
||||||
# If available, display "raw" total flux
|
# If available, display "raw" total flux
|
||||||
ax1.errorbar(self.wav_r, self.I_r, xerr=self.wav_r_err.T, yerr=self.I_r_err, color="k", fmt=".", label="I")
|
yoffset = np.floor(np.log10(self.I_r[self.I_r > 0.0].min())).astype(int)
|
||||||
ymin, ymax = np.min((self.I_r - 1.5 * self.I_r_err)[self.I_r - 1.5 * self.I_r_err > 0.0]), np.max(self.I_r + self.I_r_err * 1.5)
|
yoff = 10.0**yoffset
|
||||||
|
ymin, ymax = (
|
||||||
|
np.min((self.I_r - 1.5 * self.I_r_err)[self.I_r > 1.5 * self.I_r_err]) / yoff,
|
||||||
|
np.max((self.I_r + self.I_r_err * 1.5)[self.I_r > 1.5 * self.I_r_err]) / yoff,
|
||||||
|
)
|
||||||
xmin, xmax = np.min(self.wav_r - self.wav_r_err[:, 0]), np.max(self.wav_r + self.wav_r_err[:, 1])
|
xmin, xmax = np.min(self.wav_r - self.wav_r_err[:, 0]), np.max(self.wav_r + self.wav_r_err[:, 1])
|
||||||
|
ax1.errorbar(self.wav_r, self.I_r / yoff, xerr=self.wav_r_err.T, yerr=self.I_r_err / yoff, color="k", fmt=".", label="I")
|
||||||
else:
|
else:
|
||||||
ax1.errorbar(self.wav, self.I, xerr=self.wav_err.T, yerr=self.I_err, color="k", fmt=".", label="I")
|
yoffset = np.floor(np.log10(self.I[self.I > 0.0].min())).astype(int)
|
||||||
ymin, ymax = np.min((self.I - 1.5 * self.I_err)[self.I - 1.5 * self.I_err > 0.0]), np.max(self.I + self.I_err * 1.5)
|
yoff = 10.0**yoffset
|
||||||
|
ymin, ymax = (
|
||||||
|
np.min((self.I - 1.5 * self.I_err)[self.I > 1.5 * self.I_err]) / yoff,
|
||||||
|
np.max((self.I + self.I_err * 1.5)[self.I > 1.5 * self.I_err]) / yoff,
|
||||||
|
)
|
||||||
xmin, xmax = np.min(self.wav - self.wav_err[:, 0]), np.max(self.wav + self.wav_err[:, 1])
|
xmin, xmax = np.min(self.wav - self.wav_err[:, 0]), np.max(self.wav + self.wav_err[:, 1])
|
||||||
# ax1.errorbar(self.wav, self.PF, xerr=self.wav_err.T, yerr=self.PF_err, color="b", fmt=".", label="PF")
|
ax1.errorbar(self.wav, self.I / yoff, xerr=self.wav_err.T, yerr=self.I_err / yoff, color="k", fmt=".", label="I")
|
||||||
# ax1.set_ylim([np.min(self.PF[self.PF > 0.0] - self.PF_err[self.PF > 0.0] * 1.5), ymax])
|
|
||||||
# ax1.set_ylim([ymin, ymax])
|
|
||||||
ax1.set_xlim([np.min([xmin, self.bin_edges.min()]), np.max([xmax, self.bin_edges.max()])])
|
ax1.set_xlim([np.min([xmin, self.bin_edges.min()]), np.max([xmax, self.bin_edges.max()])])
|
||||||
# ax1.set_yscale("log")
|
ax1.set_xlabel(self.hd["XUNIT"])
|
||||||
|
ax1.set_ylim([ymin, ymax])
|
||||||
|
ax1.set_ylabel(self.hd["YUNIT"].format("", yoffset))
|
||||||
|
|
||||||
|
# ax11 = ax1.twinx()
|
||||||
|
# pfoffset = np.floor(np.log10(self.PF[self.PF > 0.0].min())).astype(int)
|
||||||
|
# pfoff = 10.0**pfoffset
|
||||||
|
# ax11.errorbar(self.wav, self.PF / pfoff, xerr=self.wav_err.T, yerr=self.PF_err / pfoff, color="b", fmt=".", label="PF")
|
||||||
|
# ax11.set_ylim(
|
||||||
|
# [
|
||||||
|
# ymin * yoff * self.P[np.logical_and(self.P > 0.0, np.isfinite(self.P))].min() / pfoff,
|
||||||
|
# ymax * yoff * self.P[np.logical_and(self.P > 0.0, np.isfinite(self.P))].max() / pfoff,
|
||||||
|
# ]
|
||||||
|
# )
|
||||||
|
# ax11.set_ylabel(self.hd["YUNIT"].format("Px", pfoffset), color="b")
|
||||||
|
# ax11.tick_params(axis="y", color="b", labelcolor="b")
|
||||||
|
|
||||||
# ax1.legend(ncols=2, loc=1)
|
# ax1.legend(ncols=2, loc=1)
|
||||||
|
|
||||||
if isinstance(self.ax, np.ndarray):
|
if isinstance(self.ax, np.ndarray):
|
||||||
@@ -488,7 +566,7 @@ class FOSspecpol(specpol):
|
|||||||
self.hd = dict([])
|
self.hd = dict([])
|
||||||
self.hd["DENSITY"] = True
|
self.hd["DENSITY"] = True
|
||||||
self.hd["TARGNAME"] = "Undefined"
|
self.hd["TARGNAME"] = "Undefined"
|
||||||
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [$\AA$]", r"F$_\lambda$ [erg s$^{-1}$ cm$^{-2} \AA^{-1}$]"
|
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [$\AA$]", r"{0:s}F$_\lambda$ [$10^{{{1:d}}}$ erg s$^{{-1}}$ cm$^{{-2}} \AA^{{-1}}$]"
|
||||||
self.bin_edges = np.zeros((4, n + 1))
|
self.bin_edges = np.zeros((4, n + 1))
|
||||||
self.wav = np.zeros((4, n))
|
self.wav = np.zeros((4, n))
|
||||||
self.wav_err = np.zeros((4, n, 2))
|
self.wav_err = np.zeros((4, n, 2))
|
||||||
@@ -530,7 +608,7 @@ class FOSspecpol(specpol):
|
|||||||
raise ValueError("Input must be a path to a fits file or an HDUlist")
|
raise ValueError("Input must be a path to a fits file or an HDUlist")
|
||||||
# FOS spectra are given in flux density with respect to angstrom wavelength
|
# FOS spectra are given in flux density with respect to angstrom wavelength
|
||||||
self.hd["DENSITY"] = True
|
self.hd["DENSITY"] = True
|
||||||
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [$\AA$]", r"F$_\lambda$ [erg s$^{-1}$ cm$^{-2} \AA^{-1}$]"
|
self.hd["XUNIT"], self.hd["YUNIT"] = r"Wavelength [$\AA$]", r"{0:s}F$_\lambda$ [$10^{{{1:d}}}$ erg s$^{{-1}}$ cm$^{{-2}} \AA^{{-1}}$]"
|
||||||
|
|
||||||
# We set the error to be half the distance to the next mesure
|
# We set the error to be half the distance to the next mesure
|
||||||
self.wav = np.concat((wav[0:2, :], wav[0].reshape(1, wav.shape[1]), wav[0].reshape(1, wav.shape[1])), axis=0)
|
self.wav = np.concat((wav[0:2, :], wav[0].reshape(1, wav.shape[1]), wav[0].reshape(1, wav.shape[1])), axis=0)
|
||||||
|
|||||||
Reference in New Issue
Block a user