peak_heigth.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. from charged_shells import expansion, interactions, mapping, functions
  2. from charged_shells.parameters import ModelParams
  3. import numpy as np
  4. from typing import Literal
  5. from pathlib import Path
  6. from functools import partial
  7. import json
  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. emanuele_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.emanuele_data_column = 4
  25. self.y_label = r'$|U_{EP}|$' if log_y else r'$U_{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.emanuele_data_column = 3
  34. self.y_label = r'$U_{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.emanuele_data_column = 5
  42. self.y_label = r'$|U_{sEP}|$' if log_y else r'$U_{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=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.emanuele_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, emanuele_data: Array, kappaR: Array, abar_cs: list, max_kappaR: float = 50):
  73. abar_ic, inverse = np.unique(emanuele_data[:, 1], return_inverse=True)
  74. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=2),
  75. peak.kappaR_axis_in_expansion)
  76. energy = energy_fn(peak.ex1, peak.ex2, params)
  77. data_dict_ic = {}
  78. data_dict_cs = {}
  79. k = 0
  80. for i in range(len(abar_ic)):
  81. ab = np.around(abar_ic[i], 5)
  82. if ab in np.around(abar_cs, 5):
  83. idx, = np.nonzero(inverse == i)
  84. kR = emanuele_data[idx, 2][emanuele_data[idx, 2] <= max_kappaR]
  85. en = emanuele_data[idx, peak.emanuele_data_column][emanuele_data[idx, 1] <= max_kappaR]
  86. sort = np.argsort(kR)
  87. if peak.log_y:
  88. data_dict_ic[ab] = np.stack((kR[sort], np.abs(en)[sort])).T
  89. data_dict_cs[ab] = np.stack((kappaR, np.abs(energy[k]))).T
  90. else:
  91. data_dict_ic[ab] = np.stack((kR[sort], en[sort])).T
  92. data_dict_cs[ab] = np.stack((kappaR, energy[k])).T
  93. k += 1
  94. return data_dict_ic, data_dict_cs
  95. def get_abar_energy_dicts(peak: Peak, params: ModelParams, emanuele_data: Array, a_bar: Array, kR_cs: list, max_abar: float = 0.8):
  96. kR_ic, inverse = np.unique(emanuele_data[:, 2], return_inverse=True)
  97. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=2),
  98. peak.kappaR_axis_in_expansion)
  99. energy = energy_fn(peak.ex1, peak.ex2, params)
  100. data_dict_ic = {}
  101. data_dict_cs = {}
  102. k = 0
  103. for i in range(len(kR_ic)):
  104. kr = np.around(kR_ic[i], 5)
  105. if kr in np.around(kR_cs, 5):
  106. idx, = np.nonzero(inverse == i)
  107. abar = emanuele_data[idx, 1][emanuele_data[idx, 1] <= max_abar]
  108. en = emanuele_data[idx, peak.emanuele_data_column][emanuele_data[idx, 1] <= max_abar]
  109. sort = np.argsort(abar)
  110. if peak.log_y:
  111. data_dict_ic[kr] = np.stack((abar[sort], np.abs(en)[sort])).T
  112. data_dict_cs[kr] = np.stack((a_bar, np.abs(energy[k]))).T
  113. else:
  114. data_dict_ic[kr] = np.stack((abar[sort], en[sort])).T
  115. data_dict_cs[kr] = np.stack((a_bar, energy[k])).T
  116. k += 1
  117. return data_dict_ic, data_dict_cs
  118. def save_data(data_dict_ic, data_dict_cs, a_bar: list):
  119. if save_data:
  120. ic_save = {str(key): val for key, val in data_dict_ic.items()}
  121. cs_save = {str(key): val for key, val in data_dict_cs.items()}
  122. ic_save['abar'] = a_bar
  123. cs_save['abar'] = a_bar
  124. with open(Path("/home/andraz/ChargedShells/charged-shells/config.json")) as config_file:
  125. config_data = json.load(config_file)
  126. np.savez(Path(config_data["figure_data"]).joinpath("fig_11_IC.npz"), **ic_save)
  127. np.savez(Path(config_data["figure_data"]).joinpath("fig_11_CS.npz"), **cs_save)
  128. def IC_peak_energy_plot(config_data: dict,
  129. a_bar: list,
  130. which: RotConfig,
  131. min_kappaR: float = 0.01,
  132. max_kappaR: float = 50.,
  133. R: float = 150,
  134. save_as: Path = None,
  135. save_data: bool = False,
  136. quad_correction: bool = False,
  137. log_y: bool = True):
  138. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  139. em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_4_PANELS_BDF"))
  140. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  141. data = em_data['fixA']
  142. num = 100 if which == 'sep' else 30
  143. kappaR = np.geomspace(min_kappaR, max_kappaR, num)
  144. params = ModelParams(R=R, kappaR=kappaR)
  145. ex = expansion.MappedExpansionQuad(np.array(a_bar)[:, None], params.kappaR[None, :], 0.001, l_max=20)
  146. if which == 'ep':
  147. peak = PeakEP(ex, log_y, kappaR_axis_in_expansion=1)
  148. elif which == 'pp':
  149. peak = PeakPP(ex, log_y, kappaR_axis_in_expansion=1)
  150. elif which == 'sep':
  151. peak = PeakSEP(ex, log_y, kappaR_axis_in_expansion=1)
  152. else:
  153. raise ValueError
  154. data_dict_ic, data_dict_cs = get_kappaR_energy_dicts(peak, params, data, kappaR, a_bar, max_kappaR)
  155. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  156. fig, ax = plt.subplots(figsize=(4.25, 3))
  157. for (key, data1), data2 in zip(data_dict_ic.items(), data_dict_cs.values()):
  158. current_color = next(colors)
  159. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  160. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  161. ax.legend(fontsize=14, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  162. bbox_to_anchor=(0.42, 0.42),
  163. # bbox_to_anchor=(0.42, 0.9)
  164. )
  165. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  166. ax.set_xlabel(r'$\kappa R$', fontsize=15)
  167. ax.set_ylabel(peak.y_label, fontsize=15)
  168. if log_y:
  169. ax.set_yscale('log')
  170. ax.set_xscale('log')
  171. plt.tight_layout()
  172. if save_as is not None:
  173. plt.savefig(save_as, dpi=600)
  174. plt.show()
  175. def IC_peak_energy_abar_plot(config_data: dict,
  176. kappaR: list,
  177. which: RotConfig,
  178. min_abar: float = 0.01,
  179. max_abar: float = 50.,
  180. R: float = 150,
  181. save_as: Path = None,
  182. save_data: bool = False,
  183. quad_correction: bool = False,
  184. log_y: bool = True):
  185. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  186. em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_4_PANELS_BDF"))
  187. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  188. data = em_data['fixA']
  189. num = 100 if which == 'sep' else 30
  190. a_bar = np.linspace(min_abar, max_abar, num)
  191. params = ModelParams(R=R, kappaR=np.array(kappaR))
  192. ex = expansion.MappedExpansionQuad(np.array(a_bar)[None, :], params.kappaR[:, None], 0.001, l_max=20)
  193. if which == 'ep':
  194. peak = PeakEP(ex, log_y, kappaR_axis_in_expansion=0)
  195. elif which == 'pp':
  196. peak = PeakPP(ex, log_y, kappaR_axis_in_expansion=0)
  197. elif which == 'sep':
  198. peak = PeakSEP(ex, log_y, kappaR_axis_in_expansion=0)
  199. else:
  200. raise ValueError
  201. data_dict_ic, data_dict_cs = get_abar_energy_dicts(peak, params, data, a_bar, kappaR, max_abar)
  202. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  203. fig, ax = plt.subplots(figsize=(4.25, 3))
  204. for (key, data1), data2 in zip(data_dict_ic.items(), data_dict_cs.values()):
  205. current_color = next(colors)
  206. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\kappa R = {key:.2f}$', c=current_color)
  207. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  208. ax.legend(fontsize=14, ncol=1, frameon=False, handlelength=0.7,
  209. # loc='lower right',
  210. # bbox_to_anchor=(0.42, 0.42),
  211. # bbox_to_anchor=(0.42, 0.9)
  212. )
  213. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  214. ax.set_xlabel(r'$\bar a$', fontsize=15)
  215. ax.set_ylabel(peak.y_label, fontsize=15)
  216. if log_y:
  217. ax.set_yscale('log')
  218. # ax.set_xscale('log')
  219. plt.tight_layout()
  220. if save_as is not None:
  221. plt.savefig(save_as, dpi=600)
  222. plt.show()
  223. def IC_peak_energy_charge_plot(config_data: dict,
  224. a_bar: list,
  225. which: RotConfig,
  226. max_kappaR: float = 30.,
  227. R: float = 150,
  228. save_as: Path = None,
  229. save_data: bool = False,
  230. quad_correction: bool = False,
  231. log_y: bool = False):
  232. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  233. em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_4_PANELS_BDF"))
  234. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  235. data = em_data['changeZc']
  236. params = ModelParams(R=R, kappaR=3)
  237. sigma0 = np.linspace(-0.0003, 0.0003, 300)
  238. sigma_tilde = 0.001
  239. ex = expansion.MappedExpansionQuad(np.array(a_bar), kappaR=3, sigma0=sigma0, l_max=20, sigma_tilde=sigma_tilde)
  240. if which == 'ep':
  241. peak = PeakEP(ex, log_y)
  242. elif which == 'pp':
  243. peak = PeakPP(ex, log_y)
  244. elif which == 'sep':
  245. peak = PeakSEP(ex, log_y)
  246. else:
  247. raise ValueError
  248. data_dict_ic, data_dict_cs = get_charge_energy_dicts(peak, params, data, sigma0, a_bar, sigma_tilde)
  249. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  250. fig, ax = plt.subplots(figsize=(4.25, 3))
  251. for (key, data1), data2 in zip(data_dict_ic.items(), data_dict_cs.values()):
  252. current_color = next(colors)
  253. ax.plot(data1[:, 0], data1[:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  254. ax.plot(data2[:, 0], data2[:, 1], ls='--', c=current_color)
  255. ax.legend(fontsize=14, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  256. # bbox_to_anchor=(0.42, 0.95),
  257. # bbox_to_anchor=(0.7, 1),
  258. bbox_to_anchor=(0.42, 1),
  259. )
  260. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  261. ax.set_xlabel(r'$\eta$', fontsize=15)
  262. ax.set_ylabel(peak.y_label, fontsize=15)
  263. if log_y:
  264. ax.set_yscale('log')
  265. # ax.set_xscale('log')
  266. plt.tight_layout()
  267. if save_as is not None:
  268. plt.savefig(save_as, dpi=300)
  269. plt.show()
  270. def IC_peak_energy_kappaR_combined_plot(config_data: dict,
  271. a_bar: list,
  272. R: float = 150,
  273. save_as: Path = None,
  274. min_kappaR: float = 0.01,
  275. max_kappaR: float = 50.,
  276. ):
  277. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  278. em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_4_PANELS_BDF"))
  279. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  280. data = em_data['fixA']
  281. num = 50
  282. kappaR = np.geomspace(min_kappaR, max_kappaR, num)
  283. params = ModelParams(R=R, kappaR=kappaR)
  284. ex = expansion.MappedExpansionQuad(np.sort(np.array(a_bar))[:, None], # sorting necessary as it is also in energy_dicts()
  285. params.kappaR[None, :], 0.001, l_max=20)
  286. peak_ep = PeakEP(ex, log_y=True, kappaR_axis_in_expansion=1)
  287. peak_pp = PeakPP(ex, log_y=True, kappaR_axis_in_expansion=1)
  288. peak_sep = PeakSEP(ex, log_y=False, kappaR_axis_in_expansion=1)
  289. peaks = [peak_ep, peak_pp, peak_sep]
  290. data_ic = []
  291. data_cs = []
  292. for peak in peaks:
  293. dict_ic, dict_cs = get_kappaR_energy_dicts(peak, params, data, kappaR, a_bar, max_kappaR)
  294. data_ic.append(dict_ic)
  295. data_cs.append(dict_cs)
  296. legend_coords = [(0.58, 0.45), (0.58, 0.43), (0.58, 0.9)]
  297. fig, axs = plt.subplots(3, 1, figsize=(3, 7.8))
  298. for ax, data_dict_ic, data_dict_cs, peak, lc in zip(axs, data_ic, data_cs, peaks, legend_coords):
  299. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  300. for ab in a_bar:
  301. key = np.around(ab, 5)
  302. current_color = next(colors)
  303. ax.plot(data_dict_ic[key][:, 0], data_dict_ic[key][:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  304. ax.plot(data_dict_cs[key][:, 0], data_dict_cs[key][:, 1], ls='--', c=current_color)
  305. ax.axvline(x=10, c='k', ls=':')
  306. ax.axvline(x=3, c='k', ls=':')
  307. ax.axvline(x=1, c='k', ls=':')
  308. ax.legend(fontsize=13, ncol=1, frameon=False, handlelength=0.7, loc='upper right', bbox_to_anchor=lc)
  309. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  310. # if ax == axs[-1]:
  311. ax.set_xlabel(r'$\kappa R$', fontsize=15)
  312. ax.set_ylabel(peak.y_label, fontsize=15)
  313. if peak.log_y:
  314. ax.set_yscale('log')
  315. ax.set_xscale('log')
  316. ax.yaxis.set_label_coords(-0.2, 0.5)
  317. plt.subplots_adjust(left=0.3)
  318. plt.tight_layout()
  319. if save_as is not None:
  320. plt.savefig(save_as, dpi=300)
  321. plt.show()
  322. def IC_peak_energy_charge_combined_plot(config_data: dict,
  323. a_bar: list,
  324. R: float = 150,
  325. save_as: Path = None,
  326. log_y: bool = False):
  327. # em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_11"))
  328. em_data_path = (Path(config_data["emanuele_data"]).joinpath("FIG_4_PANELS_BDF"))
  329. em_data = np.load(em_data_path.joinpath("newpair_energy.npz"))
  330. data = em_data['changeZc']
  331. params = ModelParams(R=R, kappaR=3)
  332. sigma0 = np.linspace(-0.0003, 0.0003, 300)
  333. sigma_tilde = 0.001
  334. ex = expansion.MappedExpansionQuad(np.sort(np.array(a_bar)), # sorting necessary as it is also in energy_dicts()
  335. kappaR=3, sigma0=sigma0, l_max=20, sigma_tilde=sigma_tilde)
  336. peak_ep = PeakEP(ex, log_y)
  337. peak_pp = PeakPP(ex, log_y)
  338. peak_sep = PeakSEP(ex, log_y)
  339. peaks = [peak_ep, peak_pp, peak_sep]
  340. data_ic = []
  341. data_cs = []
  342. for peak in peaks:
  343. dict_ic, dict_cs = get_charge_energy_dicts(peak, params, data, sigma0, a_bar, sigma_tilde)
  344. data_ic.append(dict_ic)
  345. data_cs.append(dict_cs)
  346. fig, axs = plt.subplots(3, 1, figsize=(3, 7.8))
  347. for ax, data_dict_ic, data_dict_cs, peak in zip(axs, data_ic, data_cs, peaks):
  348. colors = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
  349. for ab in a_bar:
  350. key = np.around(ab, 5)
  351. current_color = next(colors)
  352. ax.plot(data_dict_ic[key][:, 0], data_dict_ic[key][:, 1], label=rf'$\bar a = {key:.2f}$', c=current_color)
  353. ax.plot(data_dict_cs[key][:, 0], data_dict_cs[key][:, 1], ls='--', c=current_color)
  354. ax.legend(fontsize=13, ncol=1, frameon=False, handlelength=0.7, loc='upper right',
  355. bbox_to_anchor=(0.77, 1.03),
  356. )
  357. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  358. # if ax == axs[-1]:
  359. ax.set_xlabel(r'$\eta$', fontsize=15)
  360. ax.set_ylabel(peak.y_label, fontsize=15)
  361. if peak.log_y:
  362. ax.set_yscale('log')
  363. # ax.set_xscale('log')
  364. ax.yaxis.set_label_coords(-0.2, 0.5)
  365. plt.subplots_adjust(left=0.3)
  366. plt.tight_layout()
  367. if save_as is not None:
  368. plt.savefig(save_as, dpi=300)
  369. plt.show()
  370. def main():
  371. with open(Path("/home/andraz/ChargedShells/charged-shells/config.json")) as config_file:
  372. config_data = json.load(config_file)
  373. # a_bar = [0.2, 0.5, 0.8]
  374. # IC_peak_energy_plot(config_data, a_bar=a_bar, which='ep', max_kappaR=50,
  375. # # save_as=Path('/home/andraz/ChargedShells/Figures/Emanuele_data/peak_pp_kappaR.png'),
  376. # save_data=False,
  377. # quad_correction=False,
  378. # log_y=True
  379. # )
  380. # IC_peak_energy_kappaR_combined_plot(config_data, a_bar,
  381. # save_as=Path(
  382. # '/home/andraz/ChargedShells/Figures/final_figures/peak_combined_kappaR.png')
  383. # )
  384. # a_bar = [0.1, 0.2, 0.3]
  385. # IC_peak_energy_charge_plot(config_data, a_bar=a_bar, which='sep',
  386. # # save_as=Path('/home/andraz/ChargedShells/Figures/Emanuele_data/peak_sep_charge.png'),
  387. # )
  388. # IC_peak_energy_charge_combined_plot(config_data, a_bar,
  389. # save_as=Path('/home/andraz/ChargedShells/Figures/final_figures/peak_combined_charge.png')
  390. # )
  391. kappaR = [0.01, 3.02407, 30]
  392. IC_peak_energy_abar_plot(config_data, kappaR=kappaR, which='sep', min_abar=0.2, max_abar=0.8,
  393. save_as=Path('/home/andraz/ChargedShells/Figures/Emanuele_data/peak_sep_abar.png'),
  394. save_data=False,
  395. quad_correction=False,
  396. log_y=False
  397. )
  398. if __name__ == '__main__':
  399. main()