higher_multipole_matching.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from analysis.peak_heigth import *
  2. Array = np.ndarray
  3. Expansion = expansion.Expansion
  4. RotConfig = Literal['ep', 'pp', 'sep']
  5. def get_kappaR_higher_multipole_dicts(peak: Peak, params: ModelParams, emanuele_data: Array,
  6. kappaR: Array, dist_cs: list, max_kappaR: float = 50, min_kappa: float = 0.01,
  7. only_loaded: bool = False):
  8. distances, inverse = np.unique(emanuele_data[:, 0], return_inverse=True)
  9. energy_fn = mapping.parameter_map_two_expansions(interactions.charged_shell_energy,
  10. peak.kappaR_axis_in_expansion)
  11. energy = []
  12. for d in dist_cs:
  13. if not only_loaded:
  14. energy.append(energy_fn(peak.ex1, peak.ex2, params, dist=d))
  15. else:
  16. energy.append(np.full((len(kappaR),), 1.))
  17. data_dict_ic = {}
  18. data_dict_cs = {}
  19. k = 0
  20. for i in range(len(distances)):
  21. d = np.around(distances[i], 5)
  22. if d in np.around(dist_cs, 5):
  23. idx, = np.nonzero(inverse == i)
  24. kR = emanuele_data[idx, 1][(emanuele_data[idx, 1] <= max_kappaR) * (min_kappa <= emanuele_data[idx, 1])]
  25. en = emanuele_data[idx, peak.emanuele_data_column-1][(emanuele_data[idx, 1] <= max_kappaR) * (min_kappa <= emanuele_data[idx, 1])]
  26. sort = np.argsort(kR)
  27. if peak.log_y:
  28. data_dict_ic[d] = np.stack((kR[sort], np.abs(en)[sort])).T
  29. data_dict_cs[d] = np.stack((kappaR, np.abs(energy[k]))).T
  30. else:
  31. data_dict_ic[d] = np.stack((kR[sort], en[sort])).T
  32. data_dict_cs[d] = np.stack((kappaR, energy[k])).T
  33. k += 1
  34. return data_dict_ic, data_dict_cs
  35. def IC_peak_energy_plot(config_data: dict,
  36. dist: list,
  37. which: RotConfig,
  38. a_bar=0.8,
  39. min_kappaR: float = 0.01,
  40. max_kappaR: float = 50.,
  41. R: float = 150,
  42. save_as: Path = None,
  43. save_data: bool = False,
  44. quad_correction: bool = False,
  45. log_y: bool = True):
  46. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  47. em_data_path = (Path(config_data["emanuele_data"]).joinpath("TEST_HIGHER_MULTIPOLES"))
  48. em_data = np.load(em_data_path.joinpath("higher_multiplot_energy.npz"))
  49. data2 = em_data['L2']
  50. data4 = em_data['L4']
  51. data6 = em_data['L6']
  52. num = 100 if which == 'sep' else 30
  53. kappaR = np.geomspace(min_kappaR, max_kappaR, num)
  54. params = ModelParams(R=R, kappaR=kappaR)
  55. ex = expansion.MappedExpansionQuad(a_bar, params.kappaR, 0.00099, l_max=20)
  56. if which == 'ep':
  57. peak = PeakEP(ex, log_y, kappaR_axis_in_expansion=0)
  58. elif which == 'pp':
  59. peak = PeakPP(ex, log_y, kappaR_axis_in_expansion=0)
  60. elif which == 'sep':
  61. peak = PeakSEP(ex, log_y, kappaR_axis_in_expansion=0)
  62. else:
  63. raise ValueError
  64. data_dict_ic2, data_dict_cs = get_kappaR_higher_multipole_dicts(peak, params, data2, kappaR, dist, max_kappaR, min_kappaR)
  65. data_dict_ic4, _ = get_kappaR_higher_multipole_dicts(peak, params, data4, kappaR, dist, max_kappaR, min_kappaR)
  66. data_dict_ic6, _ = get_kappaR_higher_multipole_dicts(peak, params, data6, kappaR, dist, max_kappaR, min_kappaR)
  67. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  68. fig = plt.figure(figsize=(2, 1.8))
  69. gs = gridspec.GridSpec(1, 1, figure=fig)
  70. gs.update(left=0.25, right=0.95, top=0.97, bottom=0.21)
  71. ax = fig.add_subplot(gs[0, 0])
  72. for (key, data2), data_cs, data4, data6 in zip(data_dict_ic2.items(), data_dict_cs.values(), data_dict_ic4.values(), data_dict_ic6.values()):
  73. current_color = next(colors)
  74. ax.plot(data2[:, 0], data2[:, 1], label=r'$l=2$', c=current_color)
  75. ax.plot(data_cs[:, 0], data_cs[:, 1], ls='--', c='k')
  76. ax.plot(data4[:, 0], data4[:, 1], ls='-', c=next(colors), label=r'$l=4$')
  77. ax.plot(data6[:, 0], data6[:, 1], ls='-', c=next(colors), label=r'$l=6$')
  78. ax.legend(fontsize=9, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  79. bbox_to_anchor=(0.6, 0.5),
  80. # bbox_to_anchor=(0.42, 0.9)
  81. )
  82. ax.set_title(rf'$\rho = {key:.1f}$', loc='right',
  83. # x=0.95, y=0.8,
  84. x=0.45, y=0.6,
  85. )
  86. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=11)
  87. ax.set_xlabel(r'$\kappa R$', fontsize=11)
  88. ax.set_ylabel(peak.y_label, fontsize=11)
  89. if log_y:
  90. ax.set_yscale('log')
  91. ax.set_xscale('log')
  92. # plt.tight_layout()
  93. if save_as is not None:
  94. plt.savefig(save_as, dpi=300)
  95. plt.show()
  96. if __name__ == '__main__':
  97. with open(Path("/home/andraz/ChargedShells/charged-shells/config.json")) as config_file:
  98. config_data = json.load(config_file)
  99. dist = [2.5]
  100. IC_peak_energy_plot(config_data, dist=dist, which='ep', min_kappaR=0.1, max_kappaR=50,
  101. save_as=Path(
  102. '/home/andraz/ChargedShells/Figures/Emanuele_data/peak_ep_kappaR_higher_correction_rho25.png'),
  103. save_data=False,
  104. quad_correction=False,
  105. log_y=False
  106. )