Mercurial > repos > astroteam > sgwb_astro_tool
comparison Phase_transition_parameters.py @ 0:c9fc89ee996e draft default tip
planemo upload for repository https://github.com/esg-epfl-apc/tools-astro/tree/main/tools commit d5be3628a0bdad9747451669fa195f1d2acaf3f2
| author | astroteam |
|---|---|
| date | Wed, 17 Apr 2024 10:29:23 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:c9fc89ee996e |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 # coding: utf-8 | |
| 3 | |
| 4 # flake8: noqa | |
| 5 | |
| 6 import json | |
| 7 import os | |
| 8 import shutil | |
| 9 | |
| 10 from oda_api.json import CustomJSONEncoder | |
| 11 | |
| 12 get_ipython().run_cell_magic( # noqa: F821 | |
| 13 "bash", | |
| 14 "", | |
| 15 "wget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/EPTA.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/NANOGrav23.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/PPTA.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/RoperPol22.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/MAGIC.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/Ellis.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/NANO_alpha_T.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/NANO_alpha_T1.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/NANO_bubble.csv\nwget https://gitlab.renkulab.io/astronomy/mmoda/sgwb/-/raw/master/NANO_sound.csv\n", | |
| 16 ) | |
| 17 | |
| 18 import matplotlib.pyplot as plt | |
| 19 | |
| 20 # Loading necessary packages | |
| 21 import numpy as np | |
| 22 | |
| 23 get_ipython().run_line_magic("matplotlib", "inline") # noqa: F821 | |
| 24 import astropy.units as u | |
| 25 from astropy.constants import c | |
| 26 from numpy import exp, log, pi, sqrt | |
| 27 from oda_api.api import ProgressReporter | |
| 28 from oda_api.data_products import PictureProduct | |
| 29 | |
| 30 # Parameters of the phase transition | |
| 31 | |
| 32 # fraction of turbulent energy that goes to gw N.B. arXiv:1004.4187 claims that epsilon_turb=0.05, but checks below show that it is rather 0.01 | |
| 33 epsilon_turb = 1.0 # http://odahub.io/ontology#Float | |
| 34 | |
| 35 _galaxy_wd = os.getcwd() | |
| 36 | |
| 37 with open("inputs.json", "r") as fd: | |
| 38 inp_dic = json.load(fd) | |
| 39 if "_data_product" in inp_dic.keys(): | |
| 40 inp_pdic = inp_dic["_data_product"] | |
| 41 else: | |
| 42 inp_pdic = inp_dic | |
| 43 | |
| 44 for vn, vv in inp_pdic.items(): | |
| 45 if vn != "_selector": | |
| 46 globals()[vn] = type(globals()[vn])(vv) | |
| 47 | |
| 48 Tmax_yrs = 10.0 # http://odahub.io/ontology#Float | |
| 49 Tmin_yrs = 2.0 # http://odahub.io/ontology#Float | |
| 50 # terminal velocity of bubbles | |
| 51 v_w = 0.999 # http://odahub.io/ontology#Float | |
| 52 h = 0.7 # http://odahub.io/ontology#Float | |
| 53 # Numbers of relativistic degrees of freedom | |
| 54 g_star = 20 # http://odahub.io/ontology#Integer | |
| 55 | |
| 56 c_s = 3 ** (-0.5) # speed of sound | |
| 57 F0_GW = 1.64e-5 / h**2 * (100 / g_star) ** (1 / 3.0) | |
| 58 pr = ProgressReporter() | |
| 59 pr.report_progress(stage="Progress", progress=1.0) | |
| 60 | |
| 61 # Eq.20 of arXiv:1512.06239, corrected according to Appendix A of arXiv:1004.4187 | |
| 62 | |
| 63 def ka_v(alpha_v, v): | |
| 64 zeta = ((2.0 / 3.0 * alpha_v + alpha_v**2) ** 0.5 + (1 / 3.0) ** 0.5) / ( | |
| 65 1 + alpha_v | |
| 66 ) | |
| 67 kappa_a = ( | |
| 68 6.9 | |
| 69 * v ** (6.0 / 5.0) | |
| 70 * alpha_v | |
| 71 / (1.36 - 0.037 * alpha_v**0.5 + alpha_v) | |
| 72 ) | |
| 73 kappa_b = alpha_v ** (2.0 / 5.0) / ( | |
| 74 0.017 + (0.997 + alpha_v) ** (2.0 / 5.0) | |
| 75 ) | |
| 76 kappa_c = alpha_v**0.5 / (0.135 + (0.98 + alpha_v) ** 0.5) | |
| 77 kappa_d = alpha_v / (0.73 + 0.083 * alpha_v**0.6 + alpha_v) | |
| 78 deltak = -0.9 * log(alpha_v**0.5 / (1 + alpha_v**0.5)) | |
| 79 if v < c_s: | |
| 80 return ( | |
| 81 c_s ** (11.0 / 5.0) | |
| 82 * kappa_a | |
| 83 * kappa_b | |
| 84 / ( | |
| 85 (c_s ** (11.0 / 5.0) - v ** (11.0 / 5.0)) * kappa_b | |
| 86 + v * c_s ** (6.0 / 5.0) * kappa_a | |
| 87 ) | |
| 88 ) | |
| 89 elif v > zeta: | |
| 90 return ( | |
| 91 (zeta - 1) ** 3 | |
| 92 * (zeta / v) ** (5.0 / 2) | |
| 93 * kappa_c | |
| 94 * kappa_d | |
| 95 / ( | |
| 96 ((zeta - 1) ** 3 - (v - 1) ** 3) | |
| 97 * zeta ** (5.0 / 2.0) | |
| 98 * kappa_c | |
| 99 + (v - 1) ** 3 * kappa_d | |
| 100 ) | |
| 101 ) | |
| 102 else: | |
| 103 return ( | |
| 104 kappa_b | |
| 105 + (v - c_s) * deltak | |
| 106 + (v - c_s) ** 3 | |
| 107 / (zeta - c_s) ** 3 | |
| 108 * (kappa_c - kappa_b - (zeta - c_s) * deltak) | |
| 109 ) | |
| 110 | |
| 111 T_star = 0.2 | |
| 112 | |
| 113 # Comoving Hubble rate at the phase transition Eq. 11 of arXiv:1512.06239 | |
| 114 def H_star(T_star): | |
| 115 return ( | |
| 116 16.5e-6 | |
| 117 * (T_star / (100.0 * u.GeV)) | |
| 118 * (g_star / 100) ** (1.0 / 6.0) | |
| 119 * u.Hz | |
| 120 ) | |
| 121 | |
| 122 Hstar = H_star(T_star * u.GeV) | |
| 123 logHstar = np.log10(Hstar / u.Hz) | |
| 124 | |
| 125 fmin = logHstar.value - 5 | |
| 126 fmax = logHstar.value + 5 | |
| 127 ff = np.logspace(fmin, fmax, 101) | |
| 128 | |
| 129 # HL model formula | |
| 130 def GW_sound(f, T_star, alpha, beta_H, v_w): | |
| 131 Hstar = H_star(T_star) | |
| 132 kappa_v = ka_v(alpha, v_w) | |
| 133 K = kappa_v * alpha / (1 + alpha) | |
| 134 lambda_star = (8 * pi) ** (1 / 3) * max([v_w, c_s]) / (beta_H * Hstar) * c | |
| 135 Delta_w = sqrt((v_w - c_s) ** 2) / v_w | |
| 136 s2 = Delta_w * lambda_star * f / c | |
| 137 # print((c/lambda_star).cgs,(c/(Delta_w*lambda_star)).cgs) | |
| 138 s1 = lambda_star * f / c | |
| 139 M = ( | |
| 140 16 | |
| 141 * (1 + Delta_w ** (-3)) ** (2 / 3.0) | |
| 142 * (Delta_w * s1) ** 3 | |
| 143 / ((1 + s1**3) ** (2.0 / 3.0) * (3 + s2**2) ** 2) | |
| 144 ) | |
| 145 factor = (K * lambda_star * Hstar) ** 2 / ( | |
| 146 sqrt(K) + lambda_star * Hstar / c | |
| 147 ) | |
| 148 mu = 4.78 - 6.27 * Delta_w + 3.34 * Delta_w**2 | |
| 149 ff = f / u.Hz | |
| 150 dlnf = (ff[1] - ff[0]) / ff[0] | |
| 151 mu = sum(M) * dlnf | |
| 152 B = 1e-2 / mu | |
| 153 return (3 * B * factor / c**2 * F0_GW * M).cgs | |
| 154 | |
| 155 # Eq 1 of the new Overleaf, from Alberto | |
| 156 | |
| 157 def GW_turb_Andrii(f, T_star, alpha, beta_H, v_w, epsilon_turb): | |
| 158 Hstar = H_star(T_star) | |
| 159 | |
| 160 # Eq. 1 of 2307.10744 | |
| 161 lambda_star = ( | |
| 162 (8 * pi) ** (1 / 3) * max([v_w, c_s]) / (beta_H * Hstar) | |
| 163 ) * c # characteristic light-crossing distance scale | |
| 164 | |
| 165 kappa_v = ka_v(alpha, v_w) | |
| 166 K = kappa_v * alpha / (1 + alpha) | |
| 167 | |
| 168 # Eq. 10 of 2307.10744 | |
| 169 Omega_star = epsilon_turb * K | |
| 170 | |
| 171 # Eq. 13 of 2307.10744 and text after it | |
| 172 u_star = sqrt(0.75 * Omega_star) | |
| 173 dt_fin = 2 * lambda_star / u_star / c | |
| 174 s3 = dt_fin * f | |
| 175 s1 = f * lambda_star / c | |
| 176 # print('u_star=',u_star,'lambda_star=',lambda_star.cgs) | |
| 177 | |
| 178 # Eq. 15 of 2307.10744 | |
| 179 T_GW = np.log(1 + Hstar * dt_fin / (2 * pi)) * (s3 < 1) + np.log( | |
| 180 1 + lambda_star * Hstar / c / (2 * pi * s1) | |
| 181 ) * (s3 >= 1) | |
| 182 T_GW = T_GW**2 | |
| 183 | |
| 184 # Eq. 17 of 2307.10744 | |
| 185 alpha_pi = 2.15 | |
| 186 s_pi = 2.2 | |
| 187 P_pi = (1 + (s1 / s_pi) ** alpha_pi) ** (-11 / (3 * alpha_pi)) | |
| 188 | |
| 189 # Eq 18,19,20 of 2307.10744 | |
| 190 A = 2e-3 * 1.4 * 0.6 | |
| 191 | |
| 192 # Eq. 14 of 2307.10744 | |
| 193 Sturb = ( | |
| 194 4 | |
| 195 * pi**2 | |
| 196 * s1**3 | |
| 197 * T_GW | |
| 198 / (lambda_star * Hstar / c) ** 2 | |
| 199 * P_pi | |
| 200 / 1.4 | |
| 201 / 0.6 | |
| 202 ) | |
| 203 | |
| 204 # Eq 9 of 2307.10744 | |
| 205 res = ( | |
| 206 3 * A * Omega_star**2 * (lambda_star * Hstar / c) ** 2 * F0_GW * Sturb | |
| 207 ) | |
| 208 | |
| 209 Omega_B = Omega_star / 2.0 | |
| 210 Omega_gamma = 2 / g_star | |
| 211 B = 3e-6 * (Omega_B / Omega_gamma) ** 0.5 | |
| 212 return res, lambda_star, B | |
| 213 | |
| 214 H0 = 70 * (u.km / u.s) / u.Mpc | |
| 215 | |
| 216 d = np.genfromtxt("NANOGrav23.csv") | |
| 217 gammas_nano = d[:, 0] | |
| 218 As_nano = 10 ** d[:, 1] | |
| 219 ps_nano = 5 - gammas_nano | |
| 220 | |
| 221 d = np.genfromtxt("EPTA.csv") | |
| 222 gammas_epta = d[:, 0] | |
| 223 As_epta = 10 ** d[:, 1] | |
| 224 ps_epta = 5 - gammas_epta | |
| 225 | |
| 226 d = np.genfromtxt("PPTA.csv") | |
| 227 gammas_ppta = d[:, 0] | |
| 228 As_ppta = 10 ** d[:, 1] | |
| 229 ps_ppta = 5 - gammas_ppta | |
| 230 | |
| 231 fref = (1 / u.yr).cgs.value | |
| 232 lgfmin = np.log10(fref / Tmax_yrs) | |
| 233 lgfmax = np.log10(fref / Tmin_yrs) | |
| 234 fff = np.logspace(lgfmin, lgfmax, 10) * u.Hz | |
| 235 min_nano = np.ones(len(fff)) | |
| 236 max_nano = np.zeros(len(fff)) | |
| 237 for i in range(len(As_nano)): | |
| 238 spec = ( | |
| 239 2 | |
| 240 * pi**2 | |
| 241 / 3 | |
| 242 / H0**2 | |
| 243 * fff**2 | |
| 244 * As_nano[i] ** 2 | |
| 245 * (fff / fref) ** (3 - gammas_nano[i]) | |
| 246 ).cgs.value | |
| 247 min_nano = np.minimum(spec, min_nano) | |
| 248 max_nano = np.maximum(spec, max_nano) | |
| 249 # plt.plot(ff,spec) | |
| 250 plt.fill_between( | |
| 251 fff.value, min_nano, max_nano, color="red", alpha=0.5, label="NANOGrav" | |
| 252 ) | |
| 253 min_epta = np.ones(len(fff)) | |
| 254 max_epta = np.zeros(len(fff)) | |
| 255 for i in range(len(As_epta)): | |
| 256 spec = ( | |
| 257 2 | |
| 258 * pi**2 | |
| 259 / 3 | |
| 260 / H0**2 | |
| 261 * fff**2 | |
| 262 * As_epta[i] ** 2 | |
| 263 * (fff / fref) ** (3 - gammas_epta[i]) | |
| 264 ).cgs.value | |
| 265 min_epta = np.minimum(spec, min_epta) | |
| 266 max_epta = np.maximum(spec, max_epta) | |
| 267 # plt.plot(ff,spec) | |
| 268 plt.fill_between( | |
| 269 fff.value, min_epta, max_epta, color="blue", alpha=0.5, label="EPTA" | |
| 270 ) | |
| 271 min_ppta = np.ones(len(fff)) | |
| 272 max_ppta = np.zeros(len(fff)) | |
| 273 for i in range(len(As_ppta)): | |
| 274 spec = ( | |
| 275 2 | |
| 276 * pi**2 | |
| 277 / 3 | |
| 278 / H0**2 | |
| 279 * fff**2 | |
| 280 * As_ppta[i] ** 2 | |
| 281 * (fff / fref) ** (3 - gammas_ppta[i]) | |
| 282 ).cgs.value | |
| 283 min_ppta = np.minimum(spec, min_ppta) | |
| 284 max_ppta = np.maximum(spec, max_ppta) | |
| 285 # plt.plot(ff,spec) | |
| 286 plt.fill_between( | |
| 287 fff.value, min_ppta, max_ppta, color="green", alpha=0.5, label="PPTA" | |
| 288 ) | |
| 289 | |
| 290 # PBH constraints | |
| 291 def PBH(alpha): | |
| 292 return (5.2 * (1.0 - exp(-1.1 * (abs(alpha - 1.0)) ** (1 / 3))) + 1.0) * ( | |
| 293 alpha > 1 | |
| 294 ) | |
| 295 | |
| 296 Tgrid = np.logspace(-2.6, 1, 81) | |
| 297 agrid = np.logspace(-1, 2, 61) | |
| 298 bgrid = np.logspace(0, 2, 41) | |
| 299 amin_b_nano_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 300 amax_b_nano_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 301 amin_b_epta_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 302 amax_b_epta_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 303 amin_b_ppta_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 304 amax_b_ppta_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 305 amin_T_nano_eps1 = 100.0 * np.ones(len(Tgrid)) | |
| 306 amax_T_nano_eps1 = 0.0 * np.ones(len(Tgrid)) | |
| 307 amin_T_epta_eps1 = 100.0 * np.ones(len(Tgrid)) | |
| 308 amax_T_epta_eps1 = 0.0 * np.ones(len(Tgrid)) | |
| 309 amin_T_ppta_eps1 = 100.0 * np.ones(len(Tgrid)) | |
| 310 amax_T_ppta_eps1 = 0.0 * np.ones(len(Tgrid)) | |
| 311 | |
| 312 Tmin_b_nano_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 313 Tmax_b_nano_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 314 Tmin_b_epta_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 315 Tmax_b_epta_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 316 Tmin_b_ppta_eps1 = 100.0 * np.ones(len(bgrid)) | |
| 317 Tmax_b_ppta_eps1 = 0.0 * np.ones(len(bgrid)) | |
| 318 B_nano_eps1 = [] | |
| 319 lam_nano_eps1 = [] | |
| 320 B_ppta_eps1 = [] | |
| 321 lam_ppta_eps1 = [] | |
| 322 B_epta_eps1 = [] | |
| 323 lam_epta_eps1 = [] | |
| 324 for i, T in enumerate(Tgrid): | |
| 325 print(T, len(B_nano_eps1), len(B_epta_eps1), len(B_ppta_eps1)) | |
| 326 pr.report_progress(stage="Progress", progress=1 + 94.0 * (i / len(Tgrid))) | |
| 327 for j, a in enumerate(agrid): | |
| 328 for k, b in enumerate(bgrid): | |
| 329 if b > PBH(a): | |
| 330 GW_t = GW_turb_Andrii( | |
| 331 ff * u.Hz, T * u.GeV, a, b, v_w, epsilon_turb | |
| 332 ) | |
| 333 lam = GW_t[1].cgs.value | |
| 334 B = GW_t[2] | |
| 335 GW_t = GW_t[0] | |
| 336 GW_s = GW_sound(ff * u.Hz, T * u.GeV, a, b, v_w) | |
| 337 GW = GW_s + GW_t | |
| 338 GW_interp = np.interp(fff.value, ff, GW) | |
| 339 if sum((GW_interp < max_nano) * (GW_interp > min_nano)) == len( | |
| 340 fff | |
| 341 ): | |
| 342 if a < amin_b_nano_eps1[k]: | |
| 343 amin_b_nano_eps1[k] = a | |
| 344 if a > amax_b_nano_eps1[k]: | |
| 345 amax_b_nano_eps1[k] = a | |
| 346 if a < amin_T_nano_eps1[i]: | |
| 347 amin_T_nano_eps1[i] = a | |
| 348 if a > amax_T_nano_eps1[i]: | |
| 349 amax_T_nano_eps1[i] = a | |
| 350 if T < Tmin_b_nano_eps1[k]: | |
| 351 Tmin_b_nano_eps1[k] = T | |
| 352 if T > Tmax_b_nano_eps1[k]: | |
| 353 Tmax_b_nano_eps1[k] = T | |
| 354 B_nano_eps1.append(B) | |
| 355 lam_nano_eps1.append(lam) | |
| 356 if sum((GW_interp < max_epta) * (GW_interp > min_epta)) == len( | |
| 357 fff | |
| 358 ): | |
| 359 if a < amin_b_epta_eps1[k]: | |
| 360 amin_b_epta_eps1[k] = a | |
| 361 if a > amax_b_epta_eps1[k]: | |
| 362 amax_b_epta_eps1[k] = a | |
| 363 if a < amin_T_epta_eps1[i]: | |
| 364 amin_T_epta_eps1[i] = a | |
| 365 if a > amax_T_epta_eps1[i]: | |
| 366 amax_T_epta_eps1[i] = a | |
| 367 if T < Tmin_b_epta_eps1[k]: | |
| 368 Tmin_b_epta_eps1[k] = T | |
| 369 if T > Tmax_b_epta_eps1[k]: | |
| 370 Tmax_b_epta_eps1[k] = T | |
| 371 B_epta_eps1.append(B) | |
| 372 lam_epta_eps1.append(lam) | |
| 373 if sum((GW_interp < max_ppta) * (GW_interp > min_ppta)) == len( | |
| 374 fff | |
| 375 ): | |
| 376 if a < amin_b_ppta_eps1[k]: | |
| 377 amin_b_ppta_eps1[k] = a | |
| 378 if a > amax_b_ppta_eps1[k]: | |
| 379 amax_b_ppta_eps1[k] = a | |
| 380 if a < amin_T_ppta_eps1[i]: | |
| 381 amin_T_ppta_eps1[i] = a | |
| 382 if a > amax_T_ppta_eps1[i]: | |
| 383 amax_T_ppta_eps1[i] = a | |
| 384 if T < Tmin_b_ppta_eps1[k]: | |
| 385 Tmin_b_ppta_eps1[k] = T | |
| 386 if T > Tmax_b_ppta_eps1[k]: | |
| 387 Tmax_b_ppta_eps1[k] = T | |
| 388 B_ppta_eps1.append(B) | |
| 389 lam_ppta_eps1.append(lam) | |
| 390 | |
| 391 lam_bins = np.logspace(-7, -5, 41) | |
| 392 B_bins = np.logspace(-7, -5, 41) | |
| 393 | |
| 394 h = plt.hist2d( | |
| 395 np.array(lam_nano_eps1) / 3e24, | |
| 396 B_nano_eps1, | |
| 397 bins=[lam_bins, B_bins], | |
| 398 vmax=1, | |
| 399 ) | |
| 400 plt.colorbar() | |
| 401 cnt = plt.contour( | |
| 402 sqrt(lam_bins[1:] * lam_bins[:-1]), | |
| 403 sqrt(B_bins[1:] * B_bins[:-1]), | |
| 404 np.transpose(h[0]), | |
| 405 levels=[1], | |
| 406 colors="white", | |
| 407 ) | |
| 408 cont = cnt.get_paths()[0].vertices | |
| 409 B_nanos_eps1 = cont[:, 1] | |
| 410 lam_nanos_eps1 = cont[:, 0] | |
| 411 | |
| 412 plt.xscale("log") | |
| 413 plt.yscale("log") | |
| 414 | |
| 415 lam_bins = np.logspace(-7, -5, 41) | |
| 416 B_bins = np.logspace(-7, -5, 41) | |
| 417 | |
| 418 h = plt.hist2d( | |
| 419 np.array(lam_epta_eps1) / 3e24, | |
| 420 B_epta_eps1, | |
| 421 bins=[lam_bins, B_bins], | |
| 422 vmax=1, | |
| 423 ) | |
| 424 plt.colorbar() | |
| 425 cnt = plt.contour( | |
| 426 sqrt(lam_bins[1:] * lam_bins[:-1]), | |
| 427 sqrt(B_bins[1:] * B_bins[:-1]), | |
| 428 np.transpose(h[0]), | |
| 429 levels=[1], | |
| 430 colors="white", | |
| 431 ) | |
| 432 cont = cnt.get_paths()[0].vertices | |
| 433 B_eptas_eps1 = cont[:, 1] | |
| 434 lam_eptas_eps1 = cont[:, 0] | |
| 435 | |
| 436 plt.xscale("log") | |
| 437 plt.yscale("log") | |
| 438 | |
| 439 lam_bins = np.logspace(-7, -5, 41) | |
| 440 B_bins = np.logspace(-7, -5, 41) | |
| 441 | |
| 442 h = plt.hist2d( | |
| 443 np.array(lam_ppta_eps1) / 3e24, | |
| 444 B_ppta_eps1, | |
| 445 bins=[lam_bins, B_bins], | |
| 446 vmax=1, | |
| 447 ) | |
| 448 plt.colorbar() | |
| 449 cnt = plt.contour( | |
| 450 sqrt(lam_bins[1:] * lam_bins[:-1]), | |
| 451 sqrt(B_bins[1:] * B_bins[:-1]), | |
| 452 np.transpose(h[0]), | |
| 453 levels=[1], | |
| 454 colors="white", | |
| 455 ) | |
| 456 cont = cnt.get_paths()[0].vertices | |
| 457 B_pptas_eps1 = cont[:, 1] | |
| 458 lam_pptas_eps1 = cont[:, 0] | |
| 459 | |
| 460 plt.xscale("log") | |
| 461 plt.yscale("log") | |
| 462 | |
| 463 import numpy as np | |
| 464 from matplotlib import pyplot as plt | |
| 465 | |
| 466 fig, ax = plt.subplots(figsize=(7, 7)) | |
| 467 x = [1e-8, 1e3] | |
| 468 y1 = [3e-6, 3e-6] | |
| 469 y2 = [3e-5, 3e-5] | |
| 470 plt.fill_between(x, y1, y2, color="grey", alpha=0.5) | |
| 471 ax.fill(lam_nanos_eps1, B_nanos_eps1, color="red", alpha=0.3, label="NANOGrav") | |
| 472 ax.fill(lam_eptas_eps1, B_eptas_eps1, color="blue", alpha=0.3, label="EPTA") | |
| 473 ax.fill(lam_pptas_eps1, B_pptas_eps1, color="green", alpha=0.3, label="PPTA") | |
| 474 ax.set_xscale("log") | |
| 475 ax.set_yscale("log") | |
| 476 | |
| 477 lam_med = np.median(lam_nanos_eps1) | |
| 478 B_med = np.median(B_nanos_eps1) | |
| 479 lam_evol = np.logspace(np.log10(lam_med), np.log10(lam_med) + 10, 100) | |
| 480 B_evol = B_med * (lam_evol / lam_med) ** (-5 / 4.0) | |
| 481 mask = B_evol > 10 ** (-8.5) * lam_evol | |
| 482 lam_evol = lam_evol[mask] | |
| 483 B_evol = B_evol[mask] | |
| 484 ax.annotate( | |
| 485 "", | |
| 486 xy=(lam_evol[-1], B_evol[-1]), | |
| 487 xytext=(lam_evol[0], B_evol[0]), | |
| 488 arrowprops={"arrowstyle": "->", "color": "black"}, | |
| 489 ) | |
| 490 | |
| 491 lam_evol = np.logspace(np.log10(lam_med), np.log10(lam_med) + 10, 100) | |
| 492 B_evol = B_med * (lam_evol / lam_med) ** (-5 / 2.0) | |
| 493 mask = B_evol > 10 ** (-6.8) * lam_evol | |
| 494 lam_evol = lam_evol[mask] | |
| 495 B_evol = B_evol[mask] | |
| 496 ax.annotate( | |
| 497 "", | |
| 498 xy=(lam_evol[-1], B_evol[-1]), | |
| 499 xytext=(lam_evol[0], B_evol[0]), | |
| 500 arrowprops={"arrowstyle": "->", "linestyle": "dashed", "color": "black"}, | |
| 501 ) | |
| 502 | |
| 503 x = np.logspace(-8, 3, 10) | |
| 504 y = 10 ** (-8.5) * x | |
| 505 ax.plot(x, y, color="grey", linewidth=4, linestyle="dashed") | |
| 506 y = 10 ** (-6.8) * x | |
| 507 ax.plot(x, y, color="grey", linewidth=4) | |
| 508 | |
| 509 d = np.genfromtxt("MAGIC.csv") | |
| 510 ax.fill_between(d[:, 0], np.zeros(len(d)), d[:, 1], color="grey", alpha=0.5) | |
| 511 ax.set_xlim(1e-8, 1e3) | |
| 512 ax.set_ylim(5e-18, 2e-5) | |
| 513 ax.set_xlabel(r"$\lambda_B$, Mpc") | |
| 514 ax.set_ylabel(r"$B$, G") | |
| 515 plt.text(1, 3e-17, "MAGIC '22", color="black") | |
| 516 plt.text( | |
| 517 1e-6, | |
| 518 0.1e-14, | |
| 519 "Alfvenic larges processed eddies", | |
| 520 color="black", | |
| 521 rotation=42, | |
| 522 ) | |
| 523 | |
| 524 plt.text( | |
| 525 0.15e-7, | |
| 526 0.01e-13, | |
| 527 "Helicity fluctuaitons / reconnection controlled", | |
| 528 color="black", | |
| 529 rotation=41.5, | |
| 530 ) | |
| 531 ax.legend(loc="lower left") | |
| 532 | |
| 533 y = [1.5e-12 * 1e1, 1.5e-12, 1.5e-12] | |
| 534 x = [0.3e-3, 0.03, 1e3] | |
| 535 plt.plot(x, y, color="olive", linewidth=4, linestyle="dotted") | |
| 536 ax.annotate( | |
| 537 "", | |
| 538 xytext=(1, 1.0e-13), | |
| 539 xy=(1, 1.5e-12), | |
| 540 arrowprops={"arrowstyle": "->", "color": "olive", "linewidth": 4}, | |
| 541 ) | |
| 542 plt.text(0.5, 2e-12, "CTA", color="olive") | |
| 543 | |
| 544 x = [0.7e-3, 1e3] | |
| 545 y = [3e-11, 3e-11] | |
| 546 plt.plot(x, y, color="olive", linewidth=4, linestyle="dotted") | |
| 547 ax.annotate( | |
| 548 "", | |
| 549 xytext=(1, 3e-10), | |
| 550 xy=(1, 3e-11), | |
| 551 arrowprops={"arrowstyle": "->", "color": "olive", "linewidth": 4}, | |
| 552 ) | |
| 553 plt.text(0.5, 1.1e-11, "CMB", color="olive") | |
| 554 | |
| 555 plt.savefig("B_lambdaB.png", bbox_inches="tight") | |
| 556 | |
| 557 fig = plt.figure() | |
| 558 mask = Tmax_b_nano_eps1 > 0 | |
| 559 plt.fill_between( | |
| 560 bgrid[mask], | |
| 561 Tmin_b_nano_eps1[mask], | |
| 562 Tmax_b_nano_eps1[mask], | |
| 563 alpha=0.3, | |
| 564 color="red", | |
| 565 label="NANOGrav", | |
| 566 ) | |
| 567 mask = Tmax_b_epta_eps1 > 0 | |
| 568 plt.fill_between( | |
| 569 bgrid[mask], | |
| 570 Tmin_b_epta_eps1[mask], | |
| 571 Tmax_b_epta_eps1[mask], | |
| 572 alpha=0.3, | |
| 573 color="blue", | |
| 574 label="EPTA", | |
| 575 ) | |
| 576 mask = Tmax_b_ppta_eps1 > 0 | |
| 577 plt.fill_between( | |
| 578 bgrid[mask], | |
| 579 Tmin_b_ppta_eps1[mask], | |
| 580 Tmax_b_ppta_eps1[mask], | |
| 581 alpha=0.3, | |
| 582 color="green", | |
| 583 label="PPTA", | |
| 584 ) | |
| 585 d = np.genfromtxt("Ellis.csv") | |
| 586 lgT = d[:, 0] | |
| 587 lgb = d[:, 1] | |
| 588 plt.plot(10**lgb, 10**lgT, color="black", label="2308.08546") | |
| 589 d = np.genfromtxt("NANO_bubble.csv") | |
| 590 lgT = d[:, 0] | |
| 591 lgb = -d[:, 1] | |
| 592 plt.plot( | |
| 593 10**lgb, 10**lgT, color="black", linestyle="dashed", label="2306.162196" | |
| 594 ) | |
| 595 d = np.genfromtxt("NANO_sound.csv") | |
| 596 lgT = d[:, 0] | |
| 597 lgb = -d[:, 1] | |
| 598 plt.plot(10**lgb, 10**lgT, color="black", linestyle="dashed") | |
| 599 plt.axhline(0.160, color="black", linestyle="dotted") | |
| 600 | |
| 601 plt.xscale("log") | |
| 602 plt.yscale("log") | |
| 603 plt.ylabel(r"$T$ [GeV]") | |
| 604 plt.xlabel(r"$\beta/H$") | |
| 605 plt.xlim(0.8, 80) | |
| 606 plt.ylim(0.001, 10) | |
| 607 plt.legend(loc="lower left") | |
| 608 plt.savefig("T_Beta.png", bbox_inches="tight") | |
| 609 | |
| 610 fig = plt.figure() | |
| 611 mask = amax_b_nano_eps1 > 0 | |
| 612 plt.fill_between( | |
| 613 bgrid[mask], | |
| 614 amin_b_nano_eps1[mask], | |
| 615 amax_b_nano_eps1[mask], | |
| 616 alpha=0.3, | |
| 617 color="red", | |
| 618 label="NANOGrav", | |
| 619 ) | |
| 620 mask = amax_b_epta_eps1 > 0 | |
| 621 plt.fill_between( | |
| 622 bgrid[mask], | |
| 623 amin_b_epta_eps1[mask], | |
| 624 amax_b_epta_eps1[mask], | |
| 625 alpha=0.3, | |
| 626 color="blue", | |
| 627 label="EPTA", | |
| 628 ) | |
| 629 mask = amax_b_ppta_eps1 > 0 | |
| 630 plt.fill_between( | |
| 631 bgrid[mask], | |
| 632 amin_b_ppta_eps1[mask], | |
| 633 amax_b_ppta_eps1[mask], | |
| 634 alpha=0.3, | |
| 635 color="green", | |
| 636 label="PPTA", | |
| 637 ) | |
| 638 bpbh = PBH(agrid) | |
| 639 x = [2, 3] | |
| 640 y = [1, 1] | |
| 641 y1 = [2, 2] | |
| 642 plt.fill_between(x, y, y1, color="white", linewidth=0) | |
| 643 plt.fill(bpbh, agrid, color="white") | |
| 644 plt.xscale("log") | |
| 645 plt.yscale("log") | |
| 646 plt.xlim(0.8, 80) | |
| 647 plt.ylim(0.2, 80) | |
| 648 plt.xlabel(r"$\beta/H$") | |
| 649 plt.ylabel(r"$\alpha$") | |
| 650 plt.legend(loc="upper left") | |
| 651 plt.savefig("Alpha_Beta.png", bbox_inches="tight") | |
| 652 | |
| 653 fig = plt.figure() | |
| 654 mask = amax_T_nano_eps1 > 0 | |
| 655 plt.fill_between( | |
| 656 Tgrid[mask], | |
| 657 amin_T_nano_eps1[mask], | |
| 658 amax_T_nano_eps1[mask], | |
| 659 alpha=0.3, | |
| 660 color="red", | |
| 661 label="NANOGrav", | |
| 662 ) | |
| 663 mask = amax_T_epta_eps1 > 0 | |
| 664 plt.fill_between( | |
| 665 Tgrid[mask], | |
| 666 amin_T_epta_eps1[mask], | |
| 667 amax_T_epta_eps1[mask], | |
| 668 alpha=0.3, | |
| 669 color="blue", | |
| 670 label="EPTA", | |
| 671 linewidth=0, | |
| 672 ) | |
| 673 mask = amax_T_ppta_eps1 > 0 | |
| 674 plt.fill_between( | |
| 675 Tgrid[mask], | |
| 676 amin_T_ppta_eps1[mask], | |
| 677 amax_T_ppta_eps1[mask], | |
| 678 alpha=0.3, | |
| 679 color="green", | |
| 680 label="PPTA", | |
| 681 linewidth=0, | |
| 682 ) | |
| 683 d = np.genfromtxt("NANO_alpha_T.csv") | |
| 684 lgT = d[:, 0] | |
| 685 lga = d[:, 1] | |
| 686 plt.plot( | |
| 687 10**lgT, 10**lga, color="black", label="2306.16219", linestyle="dashed" | |
| 688 ) | |
| 689 d = np.genfromtxt("NANO_alpha_T1.csv") | |
| 690 lgT = d[:, 0] | |
| 691 lga = d[:, 1] | |
| 692 plt.plot(10**lgT, 10**lga, color="black", linestyle="dashed") | |
| 693 plt.axvline(0.16, color="black", linestyle="dotted") | |
| 694 plt.xscale("log") | |
| 695 plt.yscale("log") | |
| 696 plt.xlim(0.001, 10) | |
| 697 plt.ylim(0.2, 80) | |
| 698 plt.xlabel(r"$T$ [GeV]") | |
| 699 plt.ylabel(r"$\alpha$") | |
| 700 plt.legend(loc="upper left") | |
| 701 plt.savefig("Alpha_T.png", bbox_inches="tight") | |
| 702 | |
| 703 bin_image1 = PictureProduct.from_file("B_lambdaB.png") | |
| 704 bin_image2 = PictureProduct.from_file("T_Beta.png") | |
| 705 bin_image3 = PictureProduct.from_file("Alpha_Beta.png") | |
| 706 bin_image4 = PictureProduct.from_file("Alpha_T.png") | |
| 707 | |
| 708 B_lambdaB_png = bin_image1 # http://odahub.io/ontology#ODAPictureProduct | |
| 709 T_Beta_png = bin_image2 # http://odahub.io/ontology#ODAPictureProduct | |
| 710 Alpha_Beta_png = bin_image3 # http://odahub.io/ontology#ODAPictureProduct | |
| 711 Alpha_T_png = bin_image4 # http://odahub.io/ontology#ODAPictureProduct | |
| 712 | |
| 713 # output gathering | |
| 714 _galaxy_meta_data = {} | |
| 715 _oda_outs = [] | |
| 716 _oda_outs.append( | |
| 717 ( | |
| 718 "out_Phase_transition_parameters_B_lambdaB_png", | |
| 719 "B_lambdaB_png_galaxy.output", | |
| 720 B_lambdaB_png, | |
| 721 ) | |
| 722 ) | |
| 723 _oda_outs.append( | |
| 724 ( | |
| 725 "out_Phase_transition_parameters_T_Beta_png", | |
| 726 "T_Beta_png_galaxy.output", | |
| 727 T_Beta_png, | |
| 728 ) | |
| 729 ) | |
| 730 _oda_outs.append( | |
| 731 ( | |
| 732 "out_Phase_transition_parameters_Alpha_Beta_png", | |
| 733 "Alpha_Beta_png_galaxy.output", | |
| 734 Alpha_Beta_png, | |
| 735 ) | |
| 736 ) | |
| 737 _oda_outs.append( | |
| 738 ( | |
| 739 "out_Phase_transition_parameters_Alpha_T_png", | |
| 740 "Alpha_T_png_galaxy.output", | |
| 741 Alpha_T_png, | |
| 742 ) | |
| 743 ) | |
| 744 | |
| 745 for _outn, _outfn, _outv in _oda_outs: | |
| 746 _galaxy_outfile_name = os.path.join(_galaxy_wd, _outfn) | |
| 747 if isinstance(_outv, str) and os.path.isfile(_outv): | |
| 748 shutil.move(_outv, _galaxy_outfile_name) | |
| 749 _galaxy_meta_data[_outn] = {"ext": "_sniff_"} | |
| 750 elif getattr(_outv, "write_fits_file", None): | |
| 751 _outv.write_fits_file(_galaxy_outfile_name) | |
| 752 _galaxy_meta_data[_outn] = {"ext": "fits"} | |
| 753 elif getattr(_outv, "write_file", None): | |
| 754 _outv.write_file(_galaxy_outfile_name) | |
| 755 _galaxy_meta_data[_outn] = {"ext": "_sniff_"} | |
| 756 else: | |
| 757 with open(_galaxy_outfile_name, "w") as fd: | |
| 758 json.dump(_outv, fd, cls=CustomJSONEncoder) | |
| 759 _galaxy_meta_data[_outn] = {"ext": "json"} | |
| 760 | |
| 761 with open(os.path.join(_galaxy_wd, "galaxy.json"), "w") as fd: | |
| 762 json.dump(_galaxy_meta_data, fd) | |
| 763 print("*** Job finished successfully ***") |
