peak_heigth.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. from matplotlib import gridspec
  2. from charged_shells import expansion, interactions, mapping, functions, charge_distributions
  3. from charged_shells.parameters import ModelParams
  4. import numpy as np
  5. from typing import Literal
  6. from functools import partial
  7. from config import *
  8. from plot_settings import *
  9. from dataclasses import dataclass
  10. Array = np.ndarray
  11. Expansion = expansion.Expansion
  12. RotConfig = Literal['ep', 'pp', 'sep']
  13. @dataclass
  14. class Peak:
  15. rot_config: str
  16. y_label: str
  17. ex1: Expansion
  18. ex2: Expansion
  19. ici_data_column: int
  20. log_y: bool
  21. kappaR_axis_in_expansion: int = None
  22. class PeakEP(Peak):
  23. def __init__(self, ex: Expansion, log_y: bool = False, kappaR_axis_in_expansion: int = None):
  24. self.ici_data_column = 4
  25. self.y_label = r'$|V_\mathrm{EP}|$' if log_y else r'$V_\mathrm{EP}$'
  26. self.ex1 = ex.clone()
  27. self.ex2 = ex.clone()
  28. self.ex1.rotate_euler(alpha=0, beta=np.pi / 2, gamma=0)
  29. self.log_y = log_y
  30. self.kappaR_axis_in_expansion = kappaR_axis_in_expansion
  31. class PeakPP(Peak):
  32. def __init__(self, ex: Expansion, log_y: bool = False, kappaR_axis_in_expansion: int = None):
  33. self.ici_data_column = 3
  34. self.y_label = r'$V_\mathrm{PP}$'
  35. self.ex1 = ex.clone()
  36. self.ex2 = ex.clone()
  37. self.log_y = log_y
  38. self.kappaR_axis_in_expansion = kappaR_axis_in_expansion
  39. class PeakSEP(Peak):
  40. def __init__(self, ex: Expansion, log_y: bool = False, kappaR_axis_in_expansion: int = None):
  41. self.ici_data_column = 5
  42. self.y_label = r'$|V_\mathrm{sEP}|$' if log_y else r'$V_\mathrm{sEP}$'
  43. self.ex1 = ex.clone()
  44. self.ex2 = ex.clone()
  45. self.ex1.rotate_euler(alpha=0, beta=np.pi / 4, gamma=0)
  46. self.ex2.rotate_euler(alpha=0, beta=3 * np.pi / 4, gamma=0)
  47. self.log_y = log_y
  48. self.kappaR_axis_in_expansion = kappaR_axis_in_expansion
  49. def get_charge_energy_dicts(peak: Peak, params: ModelParams, emanuele_data: Array, sigma0: Array, abar_cs: list, sigma_tilde=0.001):
  50. abar_ic, inverse, counts = np.unique(emanuele_data[:, 1], return_counts=True, return_inverse=True)
  51. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=2),
  52. peak.kappaR_axis_in_expansion)
  53. energy = energy_fn(peak.ex1, peak.ex2, params)
  54. data_dict_ic = {}
  55. data_dict_cs = {}
  56. k = 0
  57. for i in range(len(abar_ic)):
  58. ab = np.around(abar_ic[i], 5)
  59. if ab in np.around(abar_cs, 5):
  60. idx, = np.nonzero(inverse == i)
  61. charge = emanuele_data[idx, 0]
  62. en = emanuele_data[idx, peak.ici_data_column]
  63. sort = np.argsort(charge)
  64. if peak.log_y:
  65. data_dict_ic[ab] = np.stack((charge[sort] / 280 + 2, np.abs(en)[sort])).T
  66. data_dict_cs[ab] = np.stack((sigma0 / sigma_tilde, np.abs(energy[k]))).T
  67. else:
  68. data_dict_ic[ab] = np.stack((charge[sort] / 280 + 2, en[sort])).T
  69. data_dict_cs[ab] = np.stack((sigma0 / sigma_tilde, energy[k])).T
  70. k += 1
  71. return data_dict_ic, data_dict_cs
  72. def get_kappaR_energy_dicts(peak: Peak, params: ModelParams, ici_data: Array,
  73. kappaR: Array, abar_cs: list, max_kappaR: float = 50, only_loaded: bool = False):
  74. abar_ic, inverse = np.unique(ici_data[:, 1], return_inverse=True)
  75. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=2),
  76. peak.kappaR_axis_in_expansion)
  77. if not only_loaded:
  78. energy = energy_fn(peak.ex1, peak.ex2, params)
  79. else:
  80. energy = np.full((len(abar_cs), len(kappaR)), 1.)
  81. data_dict_ic = {}
  82. data_dict_cs = {}
  83. k = 0
  84. for i in range(len(abar_ic)):
  85. ab = np.around(abar_ic[i], 5)
  86. if ab in np.around(abar_cs, 5):
  87. idx, = np.nonzero(inverse == i)
  88. kR = ici_data[idx, 2][ici_data[idx, 2] <= max_kappaR]
  89. en = ici_data[idx, peak.ici_data_column][ici_data[idx, 1] <= max_kappaR]
  90. sort = np.argsort(kR)
  91. if peak.log_y:
  92. data_dict_ic[ab] = np.stack((kR[sort], np.abs(en)[sort])).T
  93. data_dict_cs[ab] = np.stack((kappaR, np.abs(energy[k]))).T
  94. else:
  95. data_dict_ic[ab] = np.stack((kR[sort], en[sort])).T
  96. data_dict_cs[ab] = np.stack((kappaR, energy[k])).T
  97. k += 1
  98. return data_dict_ic, data_dict_cs
  99. def get_abar_energy_dicts(peak: Peak, params: ModelParams, ici_data: Array, a_bar: Array, kR_cs: list, max_abar: float = 0.8):
  100. kR_ic, inverse = np.unique(ici_data[:, 2], return_inverse=True)
  101. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=2),
  102. peak.kappaR_axis_in_expansion)
  103. energy = energy_fn(peak.ex1, peak.ex2, params)
  104. data_dict_ic = {}
  105. data_dict_cs = {}
  106. k = 0
  107. for i in range(len(kR_ic)):
  108. kr = np.around(kR_ic[i], 5)
  109. if kr in np.around(kR_cs, 5):
  110. idx, = np.nonzero(inverse == i)
  111. abar = ici_data[idx, 1][ici_data[idx, 1] <= max_abar]
  112. en = ici_data[idx, peak.ici_data_column][ici_data[idx, 1] <= max_abar]
  113. sort = np.argsort(abar)
  114. if peak.log_y:
  115. data_dict_ic[kr] = np.stack((abar[sort], np.abs(en)[sort])).T
  116. data_dict_cs[kr] = np.stack((a_bar, np.abs(energy[k]))).T
  117. else:
  118. data_dict_ic[kr] = np.stack((abar[sort], en[sort])).T
  119. data_dict_cs[kr] = np.stack((a_bar, energy[k])).T
  120. k += 1
  121. return data_dict_ic, data_dict_cs
  122. def save_data(data_dict_ic, data_dict_cs, a_bar: list):
  123. if save_data:
  124. ic_save = {str(key): val for key, val in data_dict_ic.items()}
  125. cs_save = {str(key): val for key, val in data_dict_cs.items()}
  126. ic_save['abar'] = a_bar
  127. cs_save['abar'] = a_bar
  128. np.savez(FIGURES_DATA_PATH.joinpath("fig_11_IC.npz"), **ic_save)
  129. np.savez(FIGURES_DATA_PATH.joinpath("fig_11_CS.npz"), **cs_save)
  130. def IC_peak_energy_plot(a_bar: list,
  131. which: RotConfig,
  132. min_kappaR: float = 0.01,
  133. max_kappaR: float = 50.,
  134. R: float = 150,
  135. save_as: Path = None,
  136. save_data: bool = False,
  137. quad_correction: bool = False,
  138. log_y: bool = True):
  139. # em_data_path = (ICI_DATA_PATH.joinpath("FIG_11"))
  140. em_data_path = (ICI_DATA_PATH.joinpath("FIG_4_PANELS_BDF"))
  141. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  142. data = em_data['fixA']
  143. num = 100 if which == 'sep' else 30
  144. kappaR = np.geomspace(min_kappaR, max_kappaR, num)
  145. params = ModelParams(R=R, kappaR=kappaR)
  146. ex = charge_distributions.create_mapped_quad_expansion(np.array(a_bar)[:, None], params.kappaR[None, :], 0.00099, l_max=20)
  147. if which == 'ep':
  148. peak = PeakEP(ex, log_y, kappaR_axis_in_expansion=1)
  149. elif which == 'pp':
  150. peak = PeakPP(ex, log_y, kappaR_axis_in_expansion=1)
  151. elif which == 'sep':
  152. peak = PeakSEP(ex, log_y, kappaR_axis_in_expansion=1)
  153. else:
  154. raise ValueError
  155. data_dict_ic, data_dict_cs = get_kappaR_energy_dicts(peak, params, data, kappaR, a_bar, max_kappaR)
  156. corrected_data = {}
  157. for key, data in data_dict_ic.items():
  158. corrected_data[key] = data[:, 1] * higher_multipole_ic_correction(data[:, 0], float(key), higher_l=4)
  159. corrected_data2 = {}
  160. for key, data in data_dict_ic.items():
  161. corrected_data2[key] = data[:, 1] * higher_multipole_ic_correction(data[:, 0], float(key), higher_l=6)
  162. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  163. fig = plt.figure(figsize=(2, 1.8))
  164. gs = gridspec.GridSpec(1, 1, figure=fig)
  165. gs.update(left=0.25, right=0.95, top=0.97, bottom=0.21)
  166. ax = fig.add_subplot(gs[0, 0])
  167. i = 0
  168. for (key, data1), data2, cd, cd2 in zip(data_dict_ic.items(), data_dict_cs.values(), corrected_data.values(), corrected_data2.values()):
  169. i += 1
  170. if i == 1:
  171. current_color = next(colors)
  172. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  173. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  174. ax.plot(data1[:, 0], cd, ls='-', c='r', label=r'$l=4$')
  175. ax.plot(data1[:, 0], cd2, ls='-', c='g', label=r'$l=6$')
  176. ax.legend(fontsize=9, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  177. bbox_to_anchor=(0.7, 0.52),
  178. # bbox_to_anchor=(0.42, 0.9)
  179. )
  180. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=11)
  181. ax.set_xlabel(r'$\kappa R$', fontsize=11)
  182. ax.set_ylabel(peak.y_label, fontsize=11)
  183. if log_y:
  184. ax.set_yscale('log')
  185. ax.set_xscale('log')
  186. # plt.tight_layout()
  187. if save_as is not None:
  188. plt.savefig(save_as, dpi=300)
  189. plt.show()
  190. def IC_peak_energy_abar_plot(
  191. kappaR: list,
  192. which: RotConfig,
  193. min_abar: float = 0.01,
  194. max_abar: float = 50.,
  195. R: float = 150,
  196. save_as: Path = None,
  197. save_data: bool = False,
  198. quad_correction: bool = False,
  199. log_y: bool = True):
  200. # em_data_path = (ICI_DATA_PATH.joinpath("FIG_11"))
  201. em_data_path = (ICI_DATA_PATH.joinpath("FIG_4_PANELS_BDF"))
  202. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  203. data = em_data['fixA']
  204. num = 100 if which == 'sep' else 30
  205. a_bar = np.linspace(min_abar, max_abar, num)
  206. params = ModelParams(R=R, kappaR=np.array(kappaR))
  207. ex = charge_distributions.create_mapped_quad_expansion(np.array(a_bar)[None, :], params.kappaR[:, None], 0.001, l_max=20)
  208. if which == 'ep':
  209. peak = PeakEP(ex, log_y, kappaR_axis_in_expansion=0)
  210. elif which == 'pp':
  211. peak = PeakPP(ex, log_y, kappaR_axis_in_expansion=0)
  212. elif which == 'sep':
  213. peak = PeakSEP(ex, log_y, kappaR_axis_in_expansion=0)
  214. else:
  215. raise ValueError
  216. data_dict_ic, data_dict_cs = get_abar_energy_dicts(peak, params, data, a_bar, kappaR, max_abar)
  217. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  218. fig, ax = plt.subplots(figsize=(4.25, 3))
  219. for (key, data1), data2 in zip(data_dict_ic.items(), data_dict_cs.values()):
  220. current_color = next(colors)
  221. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\kappa R = {key:.2f}$', c=current_color)
  222. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  223. ax.legend(fontsize=14, ncol=1, frameon=False, handlelength=0.7,
  224. # loc='lower right',
  225. # bbox_to_anchor=(0.42, 0.42),
  226. # bbox_to_anchor=(0.42, 0.9)
  227. )
  228. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  229. ax.set_xlabel(r'$\bar a$', fontsize=15)
  230. ax.set_ylabel(peak.y_label, fontsize=15)
  231. if log_y:
  232. ax.set_yscale('log')
  233. # ax.set_xscale('log')
  234. plt.tight_layout()
  235. if save_as is not None:
  236. plt.savefig(save_as, dpi=600)
  237. plt.show()
  238. def IC_peak_energy_charge_plot(a_bar: list,
  239. which: RotConfig,
  240. max_kappaR: float = 30.,
  241. R: float = 150,
  242. save_as: Path = None,
  243. save_data: bool = False,
  244. quad_correction: bool = False,
  245. log_y: bool = False):
  246. # em_data_path = (ICI_DATA_PATH.joinpath("FIG_11"))
  247. em_data_path = (ICI_DATA_PATH.joinpath("FIG_4_PANELS_BDF"))
  248. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  249. data = em_data['changeZc']
  250. params = ModelParams(R=R, kappaR=3)
  251. sigma0 = np.linspace(-0.0003, 0.0003, 300)
  252. sigma_tilde = 0.001
  253. ex = charge_distributions.create_mapped_quad_expansion(np.array(a_bar), kappaR=3, sigma0=sigma0, l_max=20, sigma_tilde=sigma_tilde)
  254. if which == 'ep':
  255. peak = PeakEP(ex, log_y)
  256. elif which == 'pp':
  257. peak = PeakPP(ex, log_y)
  258. elif which == 'sep':
  259. peak = PeakSEP(ex, log_y)
  260. else:
  261. raise ValueError
  262. data_dict_ic, data_dict_cs = get_charge_energy_dicts(peak, params, data, sigma0, a_bar, sigma_tilde)
  263. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  264. fig, ax = plt.subplots(figsize=(4.25, 3))
  265. for (key, data1), data2 in zip(data_dict_ic.items(), data_dict_cs.values()):
  266. current_color = next(colors)
  267. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  268. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  269. ax.legend(fontsize=14, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  270. # bbox_to_anchor=(0.42, 0.95),
  271. # bbox_to_anchor=(0.7, 1),
  272. bbox_to_anchor=(0.42, 1),
  273. )
  274. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  275. ax.set_xlabel(r'$\eta$', fontsize=15)
  276. ax.set_ylabel(peak.y_label, fontsize=15)
  277. if log_y:
  278. ax.set_yscale('log')
  279. # ax.set_xscale('log')
  280. plt.tight_layout()
  281. if save_as is not None:
  282. plt.savefig(save_as, dpi=300)
  283. plt.show()
  284. def IC_peak_energy_kappaR_combined_plot(a_bar: list,
  285. R: float = 150,
  286. save_as: Path = None,
  287. min_kappaR: float = 0.01,
  288. max_kappaR: float = 50.,
  289. ):
  290. # em_data_path = (ICI_DATA_PATH.joinpath("FIG_11"))
  291. em_data_path = (ICI_DATA_PATH.joinpath("FIG_4_PANELS_BDF"))
  292. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  293. data = em_data['fixA']
  294. num = 50
  295. kappaR = np.geomspace(min_kappaR, max_kappaR, num)
  296. params = ModelParams(R=R, kappaR=kappaR)
  297. ex = charge_distributions.create_mapped_quad_expansion(np.sort(np.array(a_bar))[:, None], # sorting necessary as it is also in energy_dicts()
  298. params.kappaR[None, :], 0.00099, l_max=20)
  299. peak_ep = PeakEP(ex, log_y=True, kappaR_axis_in_expansion=1)
  300. peak_pp = PeakPP(ex, log_y=True, kappaR_axis_in_expansion=1)
  301. peak_sep = PeakSEP(ex, log_y=False, kappaR_axis_in_expansion=1)
  302. peaks = [peak_ep, peak_pp, peak_sep]
  303. data_ic = []
  304. data_cs = []
  305. for peak in peaks:
  306. dict_ic, dict_cs = get_kappaR_energy_dicts(peak, params, data, kappaR, a_bar, max_kappaR, only_loaded=False)
  307. data_ic.append(dict_ic)
  308. data_cs.append(dict_cs)
  309. legend_coords = [(0.55, 0.45), (0.55, 0.43), (0.55, 0.63)]
  310. # fig, axs = plt.subplots(3, 1, figsize=(2, 5.4))
  311. fig = plt.figure(figsize=(2, 5.4))
  312. gs = gridspec.GridSpec(3, 1, figure=fig)
  313. gs.update(left=0.25, right=0.95, top=0.99, bottom=0.07, hspace=0.3)
  314. axs = [fig.add_subplot(gs[0, 0]), fig.add_subplot(gs[1, 0]), fig.add_subplot(gs[2, 0])]
  315. for ax, data_dict_ic, data_dict_cs, peak, lc in zip(axs, data_ic, data_cs, peaks, legend_coords):
  316. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  317. for ab in a_bar:
  318. key = np.around(ab, 5)
  319. current_color = next(colors)
  320. ax.plot(data_dict_ic[key][:, 0], data_dict_ic[key][:, 1], label=rf'$\bar a = {key:.1f}$', c=current_color, linewidth=1.5)
  321. ax.plot(data_dict_cs[key][:, 0], data_dict_cs[key][:, 1], ls='--', c=current_color, linewidth=1.5)
  322. ax.axvline(x=10, c='k', ls=':', linewidth=1)
  323. ax.axvline(x=3, c='k', ls=':', linewidth=1)
  324. ax.axvline(x=1, c='k', ls=':', linewidth=1)
  325. ax.legend(fontsize=9, ncol=1, frameon=False, handlelength=0.7, loc='upper right', bbox_to_anchor=lc)
  326. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=11)
  327. # if ax == axs[-1]:
  328. ax.set_xlabel(r'$\kappa R$', fontsize=11)
  329. ax.set_ylabel(peak.y_label, fontsize=11)
  330. if peak.log_y:
  331. ax.set_yscale('log')
  332. ax.set_xscale('log')
  333. ax.yaxis.set_label_coords(-0.25, 0.5)
  334. ax.xaxis.set_label_coords(0.5, -0.12)
  335. # plt.subplots_adjust(left=0.1)
  336. # plt.tight_layout()
  337. # plt.subplots_adjust(left=0.25, right=0.97, top=0.85, bottom=0.15)
  338. if save_as is not None:
  339. plt.savefig(save_as, dpi=300)
  340. plt.show()
  341. def IC_peak_energy_charge_combined_plot(a_bar: list,
  342. R: float = 150,
  343. save_as: Path = None,
  344. log_y: bool = False):
  345. # em_data_path = (ICI_DATA_PATH.joinpath("FIG_11"))
  346. em_data_path = (ICI_DATA_PATH.joinpath("FIG_4_PANELS_BDF"))
  347. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  348. data = em_data['changeZc']
  349. params = ModelParams(R=R, kappaR=3)
  350. sigma0 = np.linspace(-0.000297, 0.000297, 300)
  351. sigma_tilde = 0.00099
  352. ex = charge_distributions.create_mapped_quad_expansion(np.sort(np.array(a_bar)), # sorting necessary as it is also in energy_dicts()
  353. kappaR=3, sigma0=sigma0, l_max=20, sigma_tilde=sigma_tilde)
  354. peak_ep = PeakEP(ex, log_y)
  355. peak_pp = PeakPP(ex, log_y)
  356. peak_sep = PeakSEP(ex, log_y)
  357. peaks = [peak_ep, peak_pp, peak_sep]
  358. data_ic = []
  359. data_cs = []
  360. for peak in peaks:
  361. dict_ic, dict_cs = get_charge_energy_dicts(peak, params, data, sigma0, a_bar, sigma_tilde)
  362. data_ic.append(dict_ic)
  363. data_cs.append(dict_cs)
  364. # fig, axs = plt.subplots(3, 1, figsize=(3, 7.8))
  365. fig = plt.figure(figsize=(2, 5.4))
  366. gs = gridspec.GridSpec(3, 1, figure=fig)
  367. gs.update(left=0.25, right=0.95, top=0.99, bottom=0.07, hspace=0.3)
  368. axs = [fig.add_subplot(gs[0, 0]), fig.add_subplot(gs[1, 0]), fig.add_subplot(gs[2, 0])]
  369. for ax, data_dict_ic, data_dict_cs, peak in zip(axs, data_ic, data_cs, peaks):
  370. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  371. for ab in a_bar:
  372. key = np.around(ab, 5)
  373. current_color = next(colors)
  374. ax.plot(data_dict_ic[key][:, 0], data_dict_ic[key][:, 1], label=rf'$\bar a = {key:.1f}$', c=current_color, linewidth=1.5)
  375. ax.plot(data_dict_cs[key][:, 0], data_dict_cs[key][:, 1], ls='--', c=current_color, linewidth=1.5)
  376. ax.legend(fontsize=9, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  377. bbox_to_anchor=(0.77, 1.03),
  378. )
  379. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=11)
  380. # if ax == axs[-1]:
  381. ax.set_xlabel(r'$\eta$', fontsize=11)
  382. ax.set_ylabel(peak.y_label, fontsize=11)
  383. if peak.log_y:
  384. ax.set_yscale('log')
  385. # ax.set_xscale('log')
  386. ax.yaxis.set_label_coords(-0.18, 0.5)
  387. ax.xaxis.set_label_coords(0.5, -0.12)
  388. # plt.subplots_adjust(left=0.3)
  389. # plt.tight_layout()
  390. if save_as is not None:
  391. plt.savefig(save_as, dpi=300)
  392. plt.show()
  393. def higher_multipole_ic_correction(kappaR, abar, higher_l: int = 4):
  394. return (functions.sph_bessel_k(3, kappaR) * functions.sph_bessel_i(2, kappaR * abar) * abar ** (higher_l - 2) /
  395. (functions.sph_bessel_k(higher_l + 1, kappaR) * functions.sph_bessel_i(higher_l, kappaR * abar)))
  396. def main():
  397. a_bar = [0.2, 0.5, 0.8]
  398. # IC_peak_energy_plot(a_bar=a_bar, which='pp', min_kappaR=0.01, max_kappaR=50,
  399. # save_as=FIGURES_PATH.joinpath('ICi_data').joinpath('peak_pp_kappaR_higher_correction_abar02.png'),
  400. # save_data=False,
  401. # quad_correction=False,
  402. # log_y=False
  403. # )
  404. # IC_peak_energy_kappaR_combined_plot(a_bar,
  405. # save_as=FIGURES_PATH.joinpath('final_figures').joinpath('peak_combined_kappaR.png')
  406. # )
  407. a_bar = [0.1, 0.2, 0.3]
  408. # IC_peak_energy_charge_plot(a_bar=a_bar, which='sep',
  409. # # save_as=FIGURES_PATH.joinpath('ICi_data').joinpath('peak_sep_charge.png'),
  410. # )
  411. IC_peak_energy_charge_combined_plot(a_bar,
  412. save_as=FIGURES_PATH.joinpath('final_figures').joinpath('peak_combined_charge.png')
  413. )
  414. kappaR = [0.01, 3.02407, 30]
  415. # IC_peak_energy_abar_plot(kappaR=kappaR, which='sep', min_abar=0.2, max_abar=0.8,
  416. # save_as=FIGURES_PATH.joinpath('ICi_data').joinpath('peak_sep_abar.png'),
  417. # save_data=False,
  418. # quad_correction=False,
  419. # log_y=False
  420. # )
  421. if __name__ == '__main__':
  422. main()