11"""
22This 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
44example use:
55python fit_dust_amplitude.py global_dust.dict --mode BB
66python fit_dust_amplitude.py global_dust.dict --mode TT --use-220 --dr6-result-path ./dr6
2222mpl .use ("Agg" )
2323
2424def 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
144161parser = 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 )
150168parser .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 )
151171args , dict_file = parser .parse_known_args ()
152172
153173mode = 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+
188215pspy_utils .create_directory (plot_dir )
189216
190217passbands = 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
213240if 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_
223250if 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+
226257for 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
255286if 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
265296else :
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