Skip to content

Commit f19aa30

Browse files
committed
Merge remote-tracking branch 'origin/serena_fg' into new-fg-marg
2 parents 7a37c96 + 26f162a commit f19aa30

1 file changed

Lines changed: 51 additions & 19 deletions

File tree

project/SO/pISO/python/dust/fit_dust_amplitude.py

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""
22
This script uses 143/353 GHz spectra from Planck to fit dust amplitude within the deep56 patch
3-
if --use-220 is used , we will also fit the high ell 220 GHz ACT channel, the idea being to try to break the degeneracy between dust and CIB. We will not use this in the first round of dust fits for ISO, will modify the relevant code later on if needed.
3+
if --use-220 is used , we will also fit the high ell 220 GHz ACT channel, the idea being to try to break the degeneracy between dust and CIB. In the default case, we use beta_c = beta_p = 2.20, which is preferred by Planck data. To set a different value use the flag --beta_value, while if you want to sample the beta CIB use the flag --sample_beta
44
example use:
55
python fit_dust_amplitude.py global_dust.dict --mode BB
66
python fit_dust_amplitude.py global_dust.dict --mode TT --use-220 --dr6-result-path ./dr6
@@ -22,7 +22,7 @@
2222
mpl.use("Agg")
2323

2424
def run_mcmc(chain_name, fg_params, Rminus1_stop, Rminus1_cl_stop):
25-
25+
2626
info = {
2727
"likelihood": {"my_like": loglike},
2828
"sampler": {
@@ -44,13 +44,21 @@ def run_mcmc(chain_name, fg_params, Rminus1_stop, Rminus1_cl_stop):
4444
priors = {
4545
"TT": {
4646
"a_p": {"prior": {"min": 0, "max": 15}, "proposal": 0.1, "latex": "a_p"},
47-
# "a_c": {"prior": {"min": 0, "max": 8}, "proposal": 0.12, "latex": "a_c"},
4847
"a_c": {"prior": {"min": 0, "max": 15}, "proposal": 0.12, "latex": "a_c"},
49-
# "a_gtt": { "prior": {"min": 1.0, "max": 20}, "proposal": 0.1, "latex": r"a_\mathrm{dust}^\mathrm{TT}"},
5048
"a_gtt": { "prior": {"min": 0.0, "max": 20}, "proposal": 0.1, "latex": r"a_\mathrm{dust}^\mathrm{TT}"},
5149
}
5250
}
5351

52+
if args.sample_beta:
53+
# when sampling beta for CIB, forcing beta_c and beta_p to be equal (no difference seen when
54+
# they are sampled differently)
55+
priors["TT"].update(
56+
{
57+
"beta_p": {"prior": {"min": 0, "max": 5}, "proposal": 0.1, "latex": r"\beta_p"},
58+
"beta_c": {"value": 'lambda beta_p: beta_p', "derived": True, "latex": r"\beta_c"},
59+
})
60+
61+
5462
if use_220:
5563
priors["TT"].update(
5664
{
@@ -77,27 +85,34 @@ def run_mcmc(chain_name, fg_params, Rminus1_stop, Rminus1_cl_stop):
7785
return run(info)
7886

7987

80-
def loglike(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_pa4_f220=0.0):
88+
def loglike(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, beta_c = 2.2, beta_p = 2.2, bandint_shift_dr6_pa4_f220=0.0):
8189
"""
8290
Compute the loglikelihood for the given fg parameters
8391
The residual from which we measure the dust is by default the Planck 353 GHz x353 GHz + 143 GHz x143 GHz - 2 x 143 GHz x353 GHz residual
8492
optionnaly if use_220 has been set to TRUE, we will also fit the high ell 220 GHz ACT channel
8593
"""
94+
# reassign the beta values if not sampled
95+
if args.sample_beta:
96+
beta_c = beta_c
97+
beta_p = beta_p
98+
else:
99+
beta_c = args.beta_value
100+
beta_p = args.beta_value
101+
86102
if use_220:
87-
_, res_planck_model, _, fg_220_model = get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb,
88-
bandint_shift_dr6_pa4_f220=bandint_shift_dr6_pa4_f220)
103+
_, res_planck_model, _, fg_220_model = get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, beta_c, beta_p, bandint_shift_dr6_pa4_f220=bandint_shift_dr6_pa4_f220)
89104

90105
chi2 = (res_planck[idx_planck] - res_planck_model[idx_planck]) @ icov_res_planck @ (res_planck[idx_planck] - res_planck_model[idx_planck])
91106
chi2 += (ps_220[idx_220] - fg_220_model[idx_220]) @ icov_220 @ (ps_220[idx_220] - fg_220_model[idx_220])
92107

93108
else:
94-
_, res_planck_model = get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb)
109+
_, res_planck_model = get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, beta_c, beta_p)
95110

96111
chi2 = (res_planck[idx_planck] - res_planck_model[idx_planck]) @ icov_res_planck @ (res_planck[idx_planck] - res_planck_model[idx_planck])
97112

98113
return -0.5 * chi2
99114

100-
def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_pa4_f220=0.0):
115+
def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, beta_c, beta_p, bandint_shift_dr6_pa4_f220=0.0):
101116
"""
102117
get the fg model for the given fg parameters
103118
The residual from which we measure the dust is by default the Planck 353 GHz x353 GHz + 143 GHz x143 GHz - 2 x 143 GHz x353 GHz residual
@@ -111,6 +126,8 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
111126
fg_params["a_gee"] = a_gee
112127
fg_params["a_gbb"] = a_gbb
113128
fg_params["a_gtb"] = a_gtb
129+
fg_params["beta_p"] = beta_p
130+
fg_params["beta_c"] = beta_c
114131

115132
band_shift_dict = {}
116133
for map_set in passbands.keys():
@@ -143,11 +160,14 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
143160
# Parse arguments
144161
parser = argparse.ArgumentParser()
145162

146-
parser.add_argument("--use-220", action="store_true", default=False) # LEAVE BUT DONT PASS THIS FLAG WHEN RUNNING
147-
parser.add_argument("--dr6-result-path", type=str, default=".") # SAME AS ABOVE
148-
parser.add_argument("--no-fit", action="store_true", default=False) # SAME AS ABOVE
149-
parser.add_argument("-m", "--mode", type=str, required=True) # VARY FOR TT, TE, EE, TB, BB
163+
parser.add_argument("--use-220", action="store_true", default=False)
164+
parser.add_argument("--dr6-result-path-spectra", type=str, default=".")
165+
parser.add_argument("--dr6-result-path-covariance", type=str, default=".")
166+
parser.add_argument("--no-fit", action="store_true", default=False)
167+
parser.add_argument("-m", "--mode", type=str, required=True)
150168
parser.add_argument("--leak-corr", action="store_true", default=False)
169+
parser.add_argument("--sample_beta", action="store_true", default=False)
170+
parser.add_argument("--beta_value", type=float, default=2.2)
151171
args, dict_file = parser.parse_known_args()
152172

153173
mode = args.mode
@@ -185,6 +205,13 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
185205
chain_name += f"_passbands"
186206
plot_dir += f"_passbands"
187207

208+
if args.sample_beta:
209+
chain_name += f"_sampled_beta"
210+
plot_dir += f"_sampled_beta"
211+
else:
212+
chain_name += f"_beta{args.beta_value}"
213+
plot_dir += f"_beta{args.beta_value}"
214+
188215
pspy_utils.create_directory(plot_dir)
189216

190217
passbands = dust_utils.load_band_pass(d, use_220=use_220)
@@ -212,8 +239,8 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
212239
# High-ell 220 GHz spectra from ACT DR6
213240
if use_220:
214241
spec_name = "dr6_pa4_f220xdr6_pa4_f220"
215-
#spec_dir = os.path.join(args.dr6_result_path, "spectra")
216-
cov_dir = os.path.join(args.dr6_result_path, "covariances")
242+
spec_dir = os.path.join(args.dr6_result_path_spectra)
243+
cov_dir = os.path.join(args.dr6_result_path_covariance)
217244
lb, ps_220, cov_220 = dust_utils.get_spectra_and_cov(spec_dir, cov_dir, spec_name, mode, spectra, mc_cov=mc_cov, leak_cov=leak_cov)
218245
lmin, lmax = 4500, 8500+10
219246
idx_220 = np.where((bin_low >= lmin) & (bin_high <= lmax))[0]
@@ -223,6 +250,10 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
223250
if use_220:
224251
params["TT"].append(f"bandint_shift_dr6_pa4_f220")
225252

253+
if args.sample_beta:
254+
params["TT"].append("beta_c")
255+
params["TT"].append("beta_p")
256+
226257
for m in ["TE", "EE", "BB", "TB"]:
227258
params[m] = [f"a_g{m.lower()}"]
228259

@@ -253,9 +284,9 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
253284
mean[par_name] = samples.mean(par_name)
254285

255286
if use_220:
256-
lb, res_planck_model, lb_220, fg_220_model = get_fg_model(mean["a_p"], mean["a_c"], mean["a_gtt"], mean["a_gte"],
257-
mean["a_gee"], mean["a_gbb"], mean["a_gtb"], bandint_shift_dr6_pa4_f220=mean["bandint_shift_dr6_pa4_f220"])
258-
287+
lb, res_planck_model, lb_220, fg_220_model = get_fg_model(mean["a_p"], mean["a_c"], mean["a_gtt"], mean["a_gte"], mean["a_gee"], mean["a_gbb"], mean["a_gtb"], mean["beta_c"], mean["beta_p"], bandint_shift_dr6_pa4_f220=mean["bandint_shift_dr6_pa4_f220"])
288+
289+
259290
chi2 = (res_planck[idx_planck] - res_planck_model[idx_planck]) @ icov_res_planck @ (res_planck[idx_planck] - res_planck_model[idx_planck])
260291
chi2 += (ps_220[idx_220] - fg_220_model[idx_220]) @ icov_220 @ (ps_220[idx_220] - fg_220_model[idx_220])
261292

@@ -264,7 +295,8 @@ def get_fg_model(a_p, a_c, a_gtt, a_gte, a_gee, a_gbb, a_gtb, bandint_shift_dr6_
264295

265296
else:
266297
lb, res_planck_model = get_fg_model(mean["a_p"], mean["a_c"], mean["a_gtt"], mean["a_gte"],
267-
mean["a_gee"], mean["a_gbb"], mean["a_gtb"], bandint_shift_dr6_pa4_f220=0)
298+
mean["a_gee"], mean["a_gbb"], mean["a_gtb"], mean["beta_c"], mean["beta_p"], bandint_shift_dr6_pa4_f220=0)
299+
268300

269301
chi2 = (res_planck[idx_planck] - res_planck_model[idx_planck]) @ icov_res_planck @ (res_planck[idx_planck] - res_planck_model[idx_planck])
270302

0 commit comments

Comments
 (0)