mirror of
https://codeberg.org/Yael-II/MSc1-Internship-Stellar-Cluster.git
synced 2026-03-15 03:16:26 +01:00
Add files via upload
This commit is contained in:
180
PhotoCal_v2.py
Normal file
180
PhotoCal_v2.py
Normal file
@@ -0,0 +1,180 @@
|
||||
"""
|
||||
* PhotoCal: Extract the instrumental magnitude coefficients and perform photometry calibration
|
||||
* Version 2 - 2024-03-21
|
||||
@ Yaël Moussouni
|
||||
@ Unistra, P&E, MSc1-MoFP
|
||||
@ Observatory of Strasbourg (Intern)
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import os
|
||||
from scipy.optimize import curve_fit
|
||||
|
||||
if "YII_light" in plt.style.available: plt.style.use("YII_light")
|
||||
|
||||
Simbad_directory = "./Simbad_files/"
|
||||
Joint_directory = "./Joint_files/"
|
||||
PhotoCal_directory = "./PhotoCal_files/"
|
||||
fig_directory = "../Figs/PhotoCal_figs/"
|
||||
Joint_prefix = "Joint_"
|
||||
Simbad_prefix = "Simbad_"
|
||||
PhotoCal_prefix = "PhotoCal_"
|
||||
BVR_suffix = "_BVR"
|
||||
filtered_suffix = "_filtered"
|
||||
file_ext = ".csv"
|
||||
|
||||
precision = 1/3600 # °
|
||||
|
||||
YES = ["Y", "YES", "1", "OUI"]
|
||||
|
||||
# * Functions
|
||||
|
||||
def calibration_function(I,c): return I + c
|
||||
|
||||
# * Import
|
||||
|
||||
Joint_filelist = np.sort(os.listdir(Joint_directory))
|
||||
Joint_filelist = [f for f in Joint_filelist if Joint_prefix in f]
|
||||
filtered_filelist = np.sort(os.listdir(Joint_directory))
|
||||
filtered_filelist = [f for f in filtered_filelist if (Joint_prefix in f and filtered_suffix in f)]
|
||||
Simbad_filelist = np.sort(os.listdir(Simbad_directory))
|
||||
Simbad_filelist = [f for f in Simbad_filelist if Simbad_prefix in f]
|
||||
Joint_sources = []
|
||||
filtered_sources = []
|
||||
Simbad_sources = []
|
||||
|
||||
for i in range(len(Joint_filelist)):
|
||||
k = Joint_filelist[i][len(Joint_prefix):].find("_BVR")
|
||||
source = Joint_filelist[i][len(Joint_prefix):k+len(Joint_prefix)]
|
||||
if source not in Joint_sources: Joint_sources.append(source)
|
||||
for i in range(len(filtered_filelist)):
|
||||
k = filtered_filelist[i][len(Joint_prefix):].find("_BVR")
|
||||
source = filtered_filelist[i][len(Joint_prefix):k+len(Joint_prefix)]
|
||||
if source not in filtered_sources: filtered_sources.append(source)
|
||||
for i in range(len(Simbad_filelist)):
|
||||
k = Simbad_filelist[i][len(Simbad_prefix):].find("_BVR")
|
||||
source = Simbad_filelist[i][len(Simbad_prefix):k+len(Simbad_prefix)]
|
||||
if source not in Simbad_sources: Simbad_sources.append(source)
|
||||
sources = np.intersect1d(Joint_sources, Simbad_sources)
|
||||
|
||||
print("\033[36m"+"Available source:"+"\033[0m")
|
||||
for i in range(len(sources)):
|
||||
if sources[i] in filtered_sources: print("\033[36m"+"\t{}: ".format(i+1) + "\033[0m" + "{} (filtered)".format(sources[i]))
|
||||
else: print("\033[36m"+"\t{}: ".format(i+1) + "\033[0m" + "{}".format(sources[i]))
|
||||
k = int(input("\033[32m"+"Select source number: "+"\033[0m"))-1
|
||||
print("")
|
||||
source = sources[k]
|
||||
|
||||
i_ra = 0
|
||||
i_de = 1
|
||||
i_B_inst = 2
|
||||
i_V_inst = 3
|
||||
i_R_inst = 4
|
||||
i_dB_inst = 5
|
||||
i_dV_inst = 6
|
||||
i_dR_inst = 7
|
||||
i_B_ref = 37
|
||||
i_V_ref = 38
|
||||
i_R_ref = 39
|
||||
|
||||
cols = [i_ra, i_de, i_B_inst, i_V_inst, i_R_inst, i_dB_inst, i_dV_inst, i_dR_inst, i_B_ref, i_V_ref, i_R_ref]
|
||||
|
||||
|
||||
Simbad_file = np.genfromtxt(Simbad_directory+Simbad_prefix+source+BVR_suffix+file_ext, skip_header=1, comments="#", delimiter=",", usecols=cols)
|
||||
if source in filtered_sources: Joint_file = np.loadtxt(Joint_directory+Joint_prefix+source+BVR_suffix+filtered_suffix+file_ext, skiprows=1, comments="#", delimiter=",")
|
||||
else: Joint_file = np.loadtxt(Joint_directory+Joint_prefix+source+BVR_suffix+file_ext, skiprows=1, comments="#", delimiter=",")
|
||||
|
||||
# * Calibration
|
||||
w_B = np.intersect1d(np.argwhere(np.isfinite(Simbad_file[:,8])), np.argwhere(Simbad_file[:,2]!=99))
|
||||
w_V = np.intersect1d(np.argwhere(np.isfinite(Simbad_file[:,9])), np.argwhere(Simbad_file[:,3]!=99))
|
||||
w_R = np.intersect1d(np.argwhere(np.isfinite(Simbad_file[:,10])), np.argwhere(Simbad_file[:,4]!=99))
|
||||
|
||||
c_B, dc_B = curve_fit(calibration_function, Simbad_file[w_B,2].flatten(), Simbad_file[w_B,8].flatten())
|
||||
c_V, dc_V = curve_fit(calibration_function, Simbad_file[w_V,3].flatten(), Simbad_file[w_V,9].flatten())
|
||||
c_R, dc_R = curve_fit(calibration_function, Simbad_file[w_R,4].flatten(), Simbad_file[w_R,10].flatten())
|
||||
|
||||
dc_B = np.sqrt(np.diag(dc_B))
|
||||
dc_V = np.sqrt(np.diag(dc_V))
|
||||
dc_R = np.sqrt(np.diag(dc_R))
|
||||
|
||||
Simbad_file[:,2] += c_B[0]
|
||||
Simbad_file[:,3] += c_V[0]
|
||||
Simbad_file[:,4] += c_R[0]
|
||||
|
||||
Simbad_file[:,5] += dc_B[0]
|
||||
Simbad_file[:,6] += dc_V[0]
|
||||
Simbad_file[:,7] += dc_R[0]
|
||||
|
||||
Joint_file[:,2] += c_B[0]
|
||||
Joint_file[:,3] += c_V[0]
|
||||
Joint_file[:,4] += c_R[0]
|
||||
|
||||
Joint_file[:,5] += dc_B[0]
|
||||
Joint_file[:,6] += dc_V[0]
|
||||
Joint_file[:,7] += dc_R[0]
|
||||
|
||||
# * Output choices
|
||||
|
||||
plot_calibration = input("\033[32m"+"Calibration plot (y/n): "+"\033[0m").upper() in YES
|
||||
plot_magnitude = input("\033[32m"+"Show magnitude distribution (y/n): "+"\033[0m").upper() in YES
|
||||
plot_save = input("\033[32m"+"Save figures (y/n): "+"\033[0m").upper() in YES
|
||||
print("")
|
||||
save_output = input("\033[32m"+"Save output file (y/n): "+"\033[0m").upper() in YES
|
||||
print("")
|
||||
|
||||
# * Calibration plot
|
||||
tab_mag = np.concatenate([Simbad_file[w_B,2].flatten(),Simbad_file[w_B,8].flatten(),Simbad_file[w_V,3].flatten(),Simbad_file[w_V,9].flatten(),Simbad_file[w_R,3].flatten(),Simbad_file[w_R,10].flatten()])
|
||||
|
||||
if plot_calibration:
|
||||
fig, ax = plt.subplots(1)
|
||||
ax.errorbar(Simbad_file[w_B,8].flatten(), Simbad_file[w_B,2].flatten(), Simbad_file[w_B,5].flatten(), markersize=2, color="#0000FF", linestyle="", marker="o", label='B filter', alpha=0.5)
|
||||
ax.errorbar(Simbad_file[w_V,9].flatten(), Simbad_file[w_V,3].flatten(), Simbad_file[w_V,6].flatten(), markersize=2, color="#00FF00", linestyle="", marker="s", label="V filter", alpha=0.5)
|
||||
ax.errorbar(Simbad_file[w_R,10].flatten(), Simbad_file[w_R,4].flatten(), Simbad_file[w_R,7].flatten(), markersize=2, color="#FF0000", linestyle="", marker="^", label="R filter", alpha=0.5)
|
||||
|
||||
min_CAL = np.min(tab_mag)
|
||||
max_CAL = np.max(tab_mag)
|
||||
ax.plot([min_CAL-0.5,max_CAL+0.5], [min_CAL-0.5,max_CAL+0.5], "--", alpha=0.5)
|
||||
ax.set_xlabel("Reference magnitude")
|
||||
ax.set_ylabel("Calibrated magnitude")
|
||||
ax.legend()
|
||||
fig.tight_layout()
|
||||
if plot_save:
|
||||
fig.savefig(fig_directory+source+"_calibration_plot")
|
||||
print("\033[94m"+"Info: Figure saved as " + "\033[0m" + source+"_calibration_plot")
|
||||
|
||||
# * Magnitude histograms
|
||||
|
||||
if plot_magnitude:
|
||||
fig, ax = plt.subplots(1)
|
||||
bins = np.linspace(np.quantile(tab_mag, 0.1), np.quantile(tab_mag,0.9), 20)
|
||||
hist_B, bins_B = np.histogram(Joint_file[:,2],bins)
|
||||
hist_V, bins_V = np.histogram(Joint_file[:,3],bins)
|
||||
hist_R, bins_R = np.histogram(Joint_file[:,4],bins)
|
||||
|
||||
cbins_B = 0.5*(bins_B[1:] + bins_B[:-1])
|
||||
cbins_V = 0.5*(bins_V[1:] + bins_V[:-1])
|
||||
cbins_R = 0.5*(bins_R[1:] + bins_R[:-1])
|
||||
|
||||
ax.scatter(cbins_B, hist_B, color="#0000FF", label="B filter", marker="o", alpha=0.5)
|
||||
ax.scatter(cbins_V, hist_V, color="#00FF00", label="V filter", marker="s", alpha=0.5)
|
||||
ax.scatter(cbins_R, hist_R, color="#FF0000", label="R filter", marker="^", alpha=0.5)
|
||||
|
||||
ax.set_xlabel("Relative magnitude")
|
||||
ax.set_ylabel("Star distribution")
|
||||
ax.legend()
|
||||
fig.tight_layout()
|
||||
if plot_save:
|
||||
fig.savefig(fig_directory+source+"_magnitude_hist")
|
||||
print("\033[94m"+"Info: Figure saved as " + "\033[0m" + source+"_magnitude_hist")
|
||||
|
||||
if save_output:
|
||||
file = open(PhotoCal_directory+PhotoCal_prefix+source+BVR_suffix+file_ext, "w")
|
||||
file.write("ra [deg],dec [deg],B_obs [mag],V_obs [mag],R_obs [mag],dB_obs [mag],dV_obs [mag],dR_obs [mag]\n")
|
||||
for i in range(len(Joint_file)):
|
||||
ra, dec, B, V, R, dB, dV, dR = Joint_file[i,:]
|
||||
file.write("{ra:e},{dec:e},{B:e},{V:e},{R:e},{dB:e},{dV:e},{dR:e}\n".format(ra=ra, dec=dec, B=B, V=V, R=R, dB=dB, dV=dV, dR=dR))
|
||||
print("\033[94m"+"Info: File saved as " + "\033[0m" + PhotoCal_prefix+source+BVR_suffix+file_ext)
|
||||
file.close()
|
||||
plt.show()
|
||||
|
||||
Reference in New Issue
Block a user