nucleardatapy 0.2.1__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. nucleardatapy/__init__.py +3 -1
  2. nucleardatapy/astro/setup_gw.py +18 -18
  3. nucleardatapy/astro/setup_mr.py +123 -33
  4. nucleardatapy/astro/setup_mup.py +10 -10
  5. nucleardatapy/corr/setup_EsymDen.py +0 -5
  6. nucleardatapy/corr/setup_EsymLsym.py +50 -17
  7. nucleardatapy/corr/setup_KsatQsat.py +170 -69
  8. nucleardatapy/create_folder.py +2 -2
  9. nucleardatapy/crust/setup_crust.py +364 -126
  10. nucleardatapy/data/astro/HESS/J1731-347.dat +4 -0
  11. nucleardatapy/data/astro/NICER/J0030+0451.dat +6 -6
  12. nucleardatapy/data/astro/NICER/J0437-4715.dat +4 -3
  13. nucleardatapy/data/astro/NICER/J0614-3329.dat +4 -0
  14. nucleardatapy/data/astro/NICER/J0740+6620.dat +5 -4
  15. nucleardatapy/data/hnuclei/1991-2L-Yamamoto.csv +6 -0
  16. nucleardatapy/data/hnuclei/2013-2L-Ahn.csv +1 -1
  17. nucleardatapy/data/hnuclei/2019-2L-Ekawa.csv +7 -0
  18. nucleardatapy/data/matter/micro/2006-BHF/2006-BHF-Av18-E2A-NM.dat +8 -8
  19. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-414-E2A.dat +21 -0
  20. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-414-TD.dat +22 -0
  21. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-450-E2A.dat +20 -0
  22. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-450-TD.dat +22 -0
  23. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-500-E2A.dat +23 -0
  24. nucleardatapy/data/matter/micro/2020-SCGF-NM-N3LO-500-TD.dat +22 -0
  25. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-414-E2A.dat +15 -0
  26. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-414-TD.dat +21 -0
  27. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-450-E2A.dat +15 -0
  28. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-450-TD.dat +21 -0
  29. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-500-E2A.dat +20 -0
  30. nucleardatapy/data/matter/micro/2020-SCGF-SM-N3LO-500-TD.dat +20 -0
  31. nucleardatapy/data/matter/micro/2024-ABI-NM-DeltaNNLO450.dat +28 -0
  32. nucleardatapy/data/matter/micro/2024-ABI-NM-DeltaNNLO500.dat +28 -0
  33. nucleardatapy/data/matter/micro/2024-ABI-NM-DeltaNNLOgo394.dat +28 -0
  34. nucleardatapy/data/matter/micro/2024-ABI-NM-DeltaNNLOgo450.dat +28 -0
  35. nucleardatapy/data/matter/micro/2024-ABI-NM-NNLOsat.dat +28 -0
  36. nucleardatapy/data/matter/micro/2024-ABI-SM-DeltaNNLO450.dat +28 -0
  37. nucleardatapy/data/matter/micro/2024-ABI-SM-DeltaNNLO500.dat +28 -0
  38. nucleardatapy/data/matter/micro/2024-ABI-SM-DeltaNNLOgo394.dat +28 -0
  39. nucleardatapy/data/matter/micro/2024-ABI-SM-DeltaNNLOgo450.dat +28 -0
  40. nucleardatapy/data/matter/micro/2024-ABI-SM-NNLOsat.dat +28 -0
  41. nucleardatapy/data/matter/nep/NEPESkyrme.dat +2 -3
  42. nucleardatapy/data/matter/nep/NEPGSkyrme.dat +7 -0
  43. nucleardatapy/data/matter/nep/NEPSkyrme.dat +4 -2
  44. nucleardatapy/data/matter/nep/NEPxEFT.dat +8 -0
  45. nucleardatapy/data/matter/nep/best67DDSkyrme.dat +28 -0
  46. nucleardatapy/data/matter/nep/best90DDSkyrme.dat +46 -0
  47. nucleardatapy/data/matter/nep/best95DDSkyrme.dat +54 -0
  48. nucleardatapy/data/matter/pheno/ESkyrme/BSk31-NM.dat +996 -996
  49. nucleardatapy/data/matter/pheno/ESkyrme/BSk31-SM.dat +991 -991
  50. nucleardatapy/data/matter/pheno/ESkyrme/BSkG4-NM.dat +1002 -0
  51. nucleardatapy/data/matter/pheno/ESkyrme/BSkG4-SM.dat +1002 -0
  52. nucleardatapy/data/matter/pheno/Skyrme/BSkG1-NM.dat +102 -0
  53. nucleardatapy/data/matter/pheno/Skyrme/BSkG1-SM.dat +102 -0
  54. nucleardatapy/data/matter/pheno/Skyrme/BSkG2-NM.dat +102 -0
  55. nucleardatapy/data/matter/pheno/Skyrme/BSkG2-SM.dat +102 -0
  56. nucleardatapy/env.py +1 -1
  57. nucleardatapy/eos/__init__.py +4 -3
  58. nucleardatapy/eos/setupCC.py +429 -0
  59. nucleardatapy/eos/setup_am.py +39 -14
  60. nucleardatapy/eos/setup_am_Beq.py +40 -15
  61. nucleardatapy/eos/setup_am_Leq.py +40 -15
  62. nucleardatapy/fig/__init__.py +24 -15
  63. nucleardatapy/fig/astro_setupGW_fig.py +9 -7
  64. nucleardatapy/fig/astro_setupMR_fig.py +26 -18
  65. nucleardatapy/fig/astro_setupMasses_fig.py +8 -6
  66. nucleardatapy/fig/astro_setupMtov_fig.py +10 -6
  67. nucleardatapy/fig/astro_setupMup_fig.py +9 -7
  68. nucleardatapy/fig/corr_setupEsymDen_fig.py +22 -9
  69. nucleardatapy/fig/corr_setupEsymLsym_fig.py +25 -8
  70. nucleardatapy/fig/corr_setupKsatQsat_fig.py +23 -17
  71. nucleardatapy/fig/crust_setupCrust_fig.py +11 -9
  72. nucleardatapy/fig/eos_setupAMBeq_fig.py +641 -156
  73. nucleardatapy/fig/eos_setupAMLeq_fig.py +53 -50
  74. nucleardatapy/fig/eos_setupAM_asy_lep_fig.py +373 -0
  75. nucleardatapy/fig/eos_setupAM_asy_nuc_fig.py +346 -0
  76. nucleardatapy/fig/eos_setupAM_asy_tot_fig.py +352 -0
  77. nucleardatapy/fig/eos_setupAM_fig.py +519 -0
  78. nucleardatapy/fig/eos_setupCC_fig.py +270 -0
  79. nucleardatapy/fig/hnuc_setupChart_fig.py +19 -16
  80. nucleardatapy/fig/hnuc_setupRE1LExp_fig.py +15 -5
  81. nucleardatapy/fig/matter_all_fig.py +971 -0
  82. nucleardatapy/fig/matter_setupCheck_fig.py +106 -0
  83. nucleardatapy/fig/matter_setupFFGLep_fig.py +74 -0
  84. nucleardatapy/fig/matter_setupFFGNuc_fig.py +286 -115
  85. nucleardatapy/fig/matter_setupHIC_fig.py +107 -67
  86. nucleardatapy/fig/matter_setupMicroEsym_fig.py +259 -73
  87. nucleardatapy/fig/matter_setupMicro_LP_fig.py +185 -82
  88. nucleardatapy/fig/matter_setupMicro_band_fig.py +126 -53
  89. nucleardatapy/fig/matter_setupMicro_effmass_fig.py +253 -77
  90. nucleardatapy/fig/matter_setupMicro_err_NM_fig.py +45 -20
  91. nucleardatapy/fig/matter_setupMicro_fig.py +317 -77
  92. nucleardatapy/fig/matter_setupMicro_gap_fig.py +237 -100
  93. nucleardatapy/fig/matter_setupNEPStats_fig.py +106 -0
  94. nucleardatapy/fig/matter_setupPhenoEsym_fig.py +204 -65
  95. nucleardatapy/fig/matter_setupPheno_fig.py +395 -93
  96. nucleardatapy/fig/nuc_setupBEExp_chart_fig.py +93 -73
  97. nucleardatapy/fig/nuc_setupBEExp_fig.py +97 -87
  98. nucleardatapy/fig/nuc_setupBETheo_fig.py +114 -81
  99. nucleardatapy/fig/nuc_setupISGMRExp_fig.py +12 -15
  100. nucleardatapy/fig/nuc_setupRchExp_fig.py +14 -22
  101. nucleardatapy/fig/nuc_setupRchTheo_fig.py +37 -40
  102. nucleardatapy/fig/nuc_setupRnpExp_fig.py +86 -106
  103. nucleardatapy/fig/nuc_setupRnpTheo_fig.py +105 -94
  104. nucleardatapy/hello.py +6 -0
  105. nucleardatapy/hnuc/setup_re1L_exp.py +6 -6
  106. nucleardatapy/hnuc/setup_re1Xi_exp.py +5 -5
  107. nucleardatapy/hnuc/setup_re2L_exp.py +36 -13
  108. nucleardatapy/matter/__init__.py +14 -14
  109. nucleardatapy/matter/setup_check.py +6 -6
  110. nucleardatapy/matter/setup_ffg.py +66 -39
  111. nucleardatapy/matter/setup_hic.py +91 -74
  112. nucleardatapy/matter/setup_micro.py +2033 -1007
  113. nucleardatapy/matter/setup_micro_band.py +6 -6
  114. nucleardatapy/matter/setup_micro_esym.py +56 -54
  115. nucleardatapy/matter/setup_micro_gap.py +24 -17
  116. nucleardatapy/matter/setup_micro_lp.py +2 -2
  117. nucleardatapy/matter/setup_nep.py +175 -92
  118. nucleardatapy/matter/{setup_nep_model_dist.py → setup_nep_stat_model.py} +13 -8
  119. nucleardatapy/matter/{setup_nep_dist.py → setup_nep_stat_models.py} +12 -8
  120. nucleardatapy/matter/setup_pheno.py +129 -49
  121. nucleardatapy/matter/setup_pheno_esym.py +22 -19
  122. nucleardatapy/nuc/setup_be_exp.py +306 -292
  123. nucleardatapy/nuc/setup_be_theo.py +288 -105
  124. nucleardatapy/nuc/setup_isgmr_exp.py +4 -4
  125. nucleardatapy/nuc/setup_rnp_exp.py +1 -0
  126. nucleardatapy/nuc/setup_rnp_theo.py +2 -1
  127. {nucleardatapy-0.2.1.dist-info → nucleardatapy-1.0.1.dist-info}/METADATA +48 -16
  128. {nucleardatapy-0.2.1.dist-info → nucleardatapy-1.0.1.dist-info}/RECORD +157 -124
  129. {nucleardatapy-0.2.1.dist-info → nucleardatapy-1.0.1.dist-info}/WHEEL +1 -1
  130. tests/test_corr_setupKsatQsat.py +3 -1
  131. tests/test_matter_setupMicro.py +37 -10
  132. nucleardatapy/data/matter/pheno/ESkyrme/BSkG1-NM.dat +0 -1002
  133. nucleardatapy/data/matter/pheno/ESkyrme/BSkG1-SM.dat +0 -1002
  134. nucleardatapy/data/matter/pheno/ESkyrme/BSkG2-NM.dat +0 -1002
  135. nucleardatapy/data/matter/pheno/ESkyrme/BSkG2-SM.dat +0 -1002
  136. nucleardatapy/fig/eos_setupAM_e_asy_lep_fig.py +0 -125
  137. nucleardatapy/fig/eos_setupAM_e_asy_nuc_fig.py +0 -115
  138. nucleardatapy/fig/eos_setupAM_e_asy_tot_fig.py +0 -117
  139. nucleardatapy/fig/eos_setupAM_e_fig.py +0 -173
  140. nucleardatapy/fig/matter_ENM_fig.py +0 -128
  141. nucleardatapy/fig/matter_ESM_fig.py +0 -140
  142. nucleardatapy/fig/matter_Esym_fig.py +0 -134
  143. nucleardatapy/fig/matter_cs2_fig.py +0 -83
  144. nucleardatapy/fig/matter_preNM_fig.py +0 -146
  145. nucleardatapy/fig/matter_preSM_fig.py +0 -144
  146. nucleardatapy/fig/matter_setupNEPModelDist_fig.py +0 -68
  147. /nucleardatapy/data/LandauParameters/micro/{2006-IBHF-NM-AV18.dat → 2006-EBHF-NM-AV18.dat} +0 -0
  148. /nucleardatapy/data/LandauParameters/micro/{2006-IBHF-SM-AV18.dat → 2006-EBHF-SM-AV18.dat} +0 -0
  149. /nucleardatapy/data/crust/{2022-crustGMRS-BSK14.dat → 2022-GMRS-BSK14.dat} +0 -0
  150. /nucleardatapy/data/crust/{2022-crustGMRS-BSK16.dat → 2022-GMRS-BSK16.dat} +0 -0
  151. /nucleardatapy/data/crust/{2022-crustGMRS-DHSL59.dat → 2022-GMRS-DHSL59.dat} +0 -0
  152. /nucleardatapy/data/crust/{2022-crustGMRS-DHSL69.dat → 2022-GMRS-DHSL69.dat} +0 -0
  153. /nucleardatapy/data/crust/{2022-crustGMRS-F0.dat → 2022-GMRS-F0.dat} +0 -0
  154. /nucleardatapy/data/crust/{2022-crustGMRS-H1.dat → 2022-GMRS-H1.dat} +0 -0
  155. /nucleardatapy/data/crust/{2022-crustGMRS-H2.dat → 2022-GMRS-H2.dat} +0 -0
  156. /nucleardatapy/data/crust/{2022-crustGMRS-H3.dat → 2022-GMRS-H3.dat} +0 -0
  157. /nucleardatapy/data/crust/{2022-crustGMRS-H4.dat → 2022-GMRS-H4.dat} +0 -0
  158. /nucleardatapy/data/crust/{2022-crustGMRS-H5.dat → 2022-GMRS-H5.dat} +0 -0
  159. /nucleardatapy/data/crust/{2022-crustGMRS-H7.dat → 2022-GMRS-H7.dat} +0 -0
  160. /nucleardatapy/data/crust/{2022-crustGMRS-LNS5.dat → 2022-GMRS-LNS5.dat} +0 -0
  161. /nucleardatapy/data/crust/{2022-crustGMRS-RATP.dat → 2022-GMRS-RATP.dat} +0 -0
  162. /nucleardatapy/data/crust/{2022-crustGMRS-SGII.dat → 2022-GMRS-SGII.dat} +0 -0
  163. /nucleardatapy/data/crust/{2022-crustGMRS-SLY5.dat → 2022-GMRS-SLY5.dat} +0 -0
  164. /nucleardatapy/data/matter/micro/{2013-QMC-NM.dat → 2013-MBPT-NM.dat} +0 -0
  165. /nucleardatapy/data/{NeutronSkin/ddrhNskin-208Pb.dat → rnp/ddrhrnp-208Pb.dat} +0 -0
  166. /nucleardatapy/data/{NeutronSkin/ddrhNskin-48Ca.dat → rnp/ddrhrnp-48Ca.dat} +0 -0
  167. /nucleardatapy/data/{NeutronSkin/nlrhNskin-208Pb.dat → rnp/nlrhrnp-208Pb.dat} +0 -0
  168. /nucleardatapy/data/{NeutronSkin/nlrhNskin-48Ca.dat → rnp/nlrhrnp-48Ca.dat} +0 -0
  169. /nucleardatapy/data/{NeutronSkin/skyrmeNskin-208Pb.dat → rnp/skyrmernp-208Pb.dat} +0 -0
  170. /nucleardatapy/data/{NeutronSkin/skyrmeNskin-48Ca.dat → rnp/skyrmernp-48Ca.dat} +0 -0
  171. {nucleardatapy-0.2.1.dist-info → nucleardatapy-1.0.1.dist-info}/licenses/LICENSE +0 -0
  172. {nucleardatapy-0.2.1.dist-info → nucleardatapy-1.0.1.dist-info}/top_level.txt +0 -0
@@ -1,120 +1,100 @@
1
+ import os
1
2
  import numpy as np
2
3
  import matplotlib.pyplot as plt
3
- from matplotlib.ticker import AutoMinorLocator # Import para minor ticks
4
+ from matplotlib.ticker import AutoMinorLocator
4
5
 
5
6
  import nucleardatapy as nuda
6
7
 
7
- # Dictionary to map sources to LaTeX names
8
8
  SOURCE_LABELS_LATEX = {
9
9
  "48Ca": r"$^{48}\mathrm{Ca}$",
10
10
  "208Pb": r"$^{208}\mathrm{Pb}$"
11
11
  }
12
12
 
13
- def nuc_setupRnpExp_fig( pname ):
13
+ def nuc_setupRnpExp_fig(pname=None, source=None):
14
14
  """
15
- Generates neutron skin (R_skin) plots for each nucleus using data from the `SetupNeutronSkinExp` class.
15
+ Plot the experimental np radii (neutron skin).
16
+
17
+ The plot is 1x1 with:
18
+
19
+ [0]: Rch as a function of N.
20
+
21
+ :param pname: name of the figure (*.png)
22
+ :type pname: str.
23
+ :param source: experimental table.
24
+ :type source: str.
16
25
  """
26
+ print(f"Using source: {source}")
27
+
28
+ # subplot_label = "(a)"
29
+ subplot_label = " "
30
+
31
+ if source is None:
32
+ print("Erro: nenhum source fornecido.")
33
+ return
34
+
35
+ labels = []
36
+ rskin_values = []
37
+ error_lower = []
38
+ error_upper = []
39
+ markers = []
40
+
41
+ cals = nuda.nuc.rnp_exp_source(source)
42
+
43
+ for cal in cals:
44
+ neutron_skin_calc = nuda.nuc.setupRnpExp(source=source, cal=cal)
45
+
46
+ if neutron_skin_calc.rnp is not None:
47
+ labels.append(neutron_skin_calc.label)
48
+ rskin_values.append(neutron_skin_calc.rnp)
17
49
 
18
- print(f'Plot name: {pname}')
19
- #
20
- # Retrieve available sources (e.g., '48Ca', '208Pb')
21
- sources, _ = nuda.nskin_exp()
22
-
23
- # Labels for the subplots
24
- subplot_labels = ["(a)", "(b)"] # Adjust this list based on the number of sources
25
-
26
- # Iterate over each source to create individual plots
27
- for idx, source in enumerate(sources):
28
- # Lists to store data for the plot
29
- labels = [] # Labels for references (e.g., 'Brissaud 1972')
30
- rskin_values = [] # R_skin values
31
- error_lower = [] # Lower errors
32
- error_upper = [] # Upper errors
33
- markers = [] # Marker types to customize the points
34
-
35
- # Retrieve available calculations for the source
36
- cals = nuda.nuc.rnp_exp_source(source)
37
-
38
- for cal in cals:
39
- # Instantiate the object for the specific calculation
40
- neutron_skin_calc = nuda.nuc.setupRnpExp(source=source, cal=cal)
41
-
42
- # Store data only if R_skin is available
43
- if neutron_skin_calc.nskin is not None:
44
- labels.append(neutron_skin_calc.label) # Use `self.label` as label
45
- rskin_values.append(neutron_skin_calc.nskin)
46
-
47
- # Replace `None` error values with 0.0
48
- err_down = neutron_skin_calc.nskin_sig_do if neutron_skin_calc.nskin_sig_do is not None else 0.0
49
- err_up = neutron_skin_calc.nskin_sig_up if neutron_skin_calc.nskin_sig_up is not None else 0.0
50
- error_lower.append(err_down)
51
- error_upper.append(err_up)
52
-
53
- # Ensure the marker is valid
54
- marker = neutron_skin_calc.marker if neutron_skin_calc.marker else 'o'
55
- markers.append(marker)
56
-
57
- # Check if there is data to plot
58
- if not rskin_values:
59
- print(f"No data available for {source}.")
60
- continue
61
-
62
- # Plot configuration
63
- fig, ax = plt.subplots(figsize=(10, 8))
64
- x_positions = range(len(labels)+1) # X-axis positions
65
-
66
- # Add each point to the plot with vertical error bars
67
- for i, (x, y, err_down, err_up, marker) in enumerate(zip(x_positions, rskin_values, error_lower, error_upper, markers)):
68
- # Handle large errors (>= 1000) by limiting the bar to 0.1
69
- adjusted_err_down = min(err_down, 0.2)
70
- adjusted_err_up = min(err_up, 0.2)
71
-
72
- # Add adjusted error bars
73
- ax.errorbar(x, y, yerr=[[adjusted_err_down], [adjusted_err_up]], fmt=marker, markersize=8, capsize=0, label=labels[i])
74
-
75
- # Add arrow as cap for err_down >= 1000
76
- if err_down >= 1000:
77
- ax.plot([x], [y - adjusted_err_down], marker="v", color="grey", markersize=8)
78
-
79
- # Add arrow as cap for err_up >= 1000
80
- if err_up >= 1000:
81
- ax.plot([x], [y + adjusted_err_up], marker="^", color="grey", markersize=8)
82
-
83
- nsav = nuda.nuc.setupRnpAverage(source=source)
84
- # print('label:', nsav.label)
85
- if nsav.nskin_cen is not None:
86
- ax.errorbar(len(labels), nsav.nskin_cen, yerr=nsav.sig_std, label=nsav.label,
87
- color='red', marker='o', markersize=10, linestyle='solid', linewidth=3)
50
+ err_down = neutron_skin_calc.rnp_sig_lo if neutron_skin_calc.rnp_sig_lo is not None else 0.0
51
+ err_up = neutron_skin_calc.rnp_sig_up if neutron_skin_calc.rnp_sig_up is not None else 0.0
52
+ error_lower.append(err_down)
53
+ error_upper.append(err_up)
54
+
55
+ marker = getattr(neutron_skin_calc, "marker", 'o')
56
+ markers.append(marker)
57
+
58
+ if not rskin_values:
59
+ print(f"Nenhum dado disponível para {source}.")
60
+ return
61
+
62
+ fig, ax = plt.subplots(figsize=(10, 8))
63
+ x_positions = range(len(labels) + 1)
64
+
65
+ for i, (x, y, err_down, err_up, marker) in enumerate(zip(x_positions, rskin_values, error_lower, error_upper, markers)):
66
+ adjusted_err_down = min(err_down, 0.2)
67
+ adjusted_err_up = min(err_up, 0.2)
68
+
69
+ ax.errorbar(x, y, yerr=[[adjusted_err_down], [adjusted_err_up]], fmt=marker, markersize=8, capsize=0, label=labels[i])
70
+
71
+ if err_down >= 1000:
72
+ ax.plot([x], [y - adjusted_err_down], marker="v", color="grey", markersize=8)
73
+ if err_up >= 1000:
74
+ ax.plot([x], [y + adjusted_err_up], marker="^", color="grey", markersize=8)
75
+
76
+ nsav = nuda.nuc.setupRnpAverage(source=source)
77
+ if nsav.rnp_cen is not None:
78
+ ax.errorbar(len(labels), nsav.rnp_cen, yerr=nsav.sig_std, label=nsav.label,
79
+ color='red', marker='o', markersize=10, linestyle='solid', linewidth=3)
88
80
  labels.append(nsav.label)
89
- # Fixed y-axis configuration
90
- ax.set_ylim([0, 0.5]) # Fixed scale from 0 to 0.5 on the y-axis
91
-
92
- # X-axis configuration
93
- ax.set_xticks(x_positions)
94
- ax.set_xticklabels(labels, rotation=45, ha="right", fontsize=15)
95
-
96
- # Y-axis configuration and layout
97
- # Increase font size for y-axis numbers
98
- ax.tick_params(axis='y', labelsize=15) # Adjust the font size as desired
99
- ax.set_ylabel(rf"$R_{{\rm{{skin}}}}$ {SOURCE_LABELS_LATEX[source]} (fm)", fontsize=15)
100
- # ax.set_xlabel(f"References for {SOURCE_LABELS_LATEX[source]}", fontsize=14)
101
- # ax.grid(True, linestyle="--", alpha=0.5)
102
-
103
- # Adjust the legend (only if there are valid labels)
104
- # ax.legend(loc="upper left", bbox_to_anchor=(1, 1), fontsize=10)
105
-
106
- # Add subplot label (e.g., "(a)", "(b)") in the top right corner
107
- ax.text(0.95, 0.95, subplot_labels[idx], transform=ax.transAxes, fontsize=15,
108
- verticalalignment='top', horizontalalignment='right')
109
-
110
- # Add minor ticks on y-axis
111
- ax.yaxis.set_minor_locator(AutoMinorLocator())
112
- ax.tick_params(axis='y', which='minor', length=4, color='gray') # Style for minor ticks
113
-
114
- # Final adjustments and save the plot
115
- #plt.tight_layout()
116
- if pname is not None:
117
- plt.savefig(pname, dpi=200)
118
- plt.close()
119
-
120
- print(f"Plot saved: {pname}")
81
+
82
+ ax.set_ylim([0, 0.5])
83
+ ax.set_xticks(x_positions)
84
+ ax.set_xticklabels(labels, rotation=45, ha="right", fontsize=15)
85
+ ax.tick_params(axis='y', labelsize=15)
86
+ ax.set_ylabel(rf"$R_{{\rm{{skin}}}}$ {SOURCE_LABELS_LATEX[source]} (fm)", fontsize=15)
87
+ ax.text(0.95, 0.95, subplot_label, transform=ax.transAxes, fontsize=15,
88
+ verticalalignment='top', horizontalalignment='right')
89
+ ax.yaxis.set_minor_locator(AutoMinorLocator())
90
+ ax.tick_params(axis='y', which='minor', length=4, color='gray')
91
+
92
+ if pname is None:
93
+ output_dir = os.path.abspath("figs/")
94
+ os.makedirs(output_dir, exist_ok=True)
95
+ pname = os.path.join(output_dir, f"plot_nuc_setupRnp_Exp_{source.replace(' ', '_')}.png")
96
+
97
+ plt.tight_layout()
98
+ plt.savefig(pname, dpi=200)
99
+ plt.close()
100
+ print(f"Plot saved: {pname}")
@@ -1,17 +1,18 @@
1
1
  import numpy as np
2
2
  import matplotlib.pyplot as plt
3
3
  from matplotlib.ticker import AutoMinorLocator # Import para minor ticks
4
+ import os
4
5
 
5
6
  import nucleardatapy as nuda
6
7
 
7
8
  # Dictionary to map sources to LaTeX names
8
9
  SOURCE_LABELS_LATEX = {
9
- "48Ca": r"$^{48}\mathrm{Ca}$",
10
- "208Pb": r"$^{208}\mathrm{Pb}$"
10
+ "48Ca": r"$^{48}$Ca",
11
+ "208Pb": r"$^{208}$Pb"
11
12
  }
12
13
 
13
14
  # Directory containing the model data tables
14
- MODEL_TABLES_DIR = nuda.param.path_data + '/NeutronSkin/'
15
+ MODEL_TABLES_DIR = nuda.param.path_data + '/rnp/'
15
16
 
16
17
  # Define markers and colors for each model
17
18
  MODEL_STYLES = {
@@ -24,7 +25,7 @@ def read_model_data(directory, source):
24
25
  model_data = {}
25
26
  for filename in os.listdir(directory):
26
27
  if filename.endswith(".dat") and source in filename:
27
- model_name = filename.split("Nskin")[0].lower()
28
+ model_name = filename.split("rnp")[0].lower()
28
29
  filepath = os.path.join(directory, filename)
29
30
  data = []
30
31
  with open(filepath, 'r') as file:
@@ -40,95 +41,105 @@ def read_model_data(directory, source):
40
41
  print(f"Loaded model data for {model_name}: {model_data[model_name]}")
41
42
  return model_data
42
43
 
43
- def nuc_setupRnpExp_fig( pname ):
44
+ def nuc_setupRnpTheo_fig(pname, source):
45
+ """
46
+ Plot the theoretical np radii (neutron skin).
44
47
 
45
- print(f'Plot name: {pname}')
48
+ The plot is 1x1 with:
49
+
50
+ [0]: Rch as a function of N.
46
51
 
47
- sources, _ = nuda.nuc.rnp_exp()
48
- subplot_labels = ["(a)", "(b)"]
49
-
50
- for idx, source in enumerate(sources):
51
- labels = []
52
- rskin_values = []
53
- error_lower = []
54
- error_upper = []
55
- xexp = []
56
-
57
- cals = nuda.nuc.rnp_exp_source(source)
58
- for i, cal in enumerate(cals):
59
- neutron_skin_calc = nuda.nuc.setupRnpExp(source=source, cal=cal)
60
- if neutron_skin_calc.nskin is not None:
61
- labels.append(neutron_skin_calc.label)
62
- rskin_values.append(neutron_skin_calc.nskin)
63
- xexp.append(i)
64
- err_down = neutron_skin_calc.nskin_sig_do if neutron_skin_calc.nskin_sig_do is not None else 0.0
65
- err_up = neutron_skin_calc.nskin_sig_up if neutron_skin_calc.nskin_sig_up is not None else 0.0
66
- error_lower.append(err_down)
67
- error_upper.append(err_up)
68
-
69
- model_data = read_model_data(MODEL_TABLES_DIR, source)
70
- combined_rskin = []
71
- combined_errors = []
72
- combined_markers = []
73
- combined_colors = []
74
- xtheo = []
75
-
76
- for model_name, data in model_data.items():
77
- for j, (_, _, _, rskin) in enumerate(data):
78
- x_position = xexp[j % len(xexp)] + 0.5 # Cycle through xexp and offset by 0.5
79
- xtheo.append(x_position)
80
- combined_rskin.append(rskin)
81
- combined_errors.append((0.0, 0.0))
82
- combined_markers.append(MODEL_STYLES[model_name]["marker"])
83
- combined_colors.append(MODEL_STYLES[model_name]["color"])
84
-
85
- if nuda.env.verb:
86
- print(f"Experimental positions for {source}: {xexp}")
87
- print(f"Theoretical positions for {source}: {xtheo}")
88
-
89
- fig, ax = plt.subplots(figsize=(10, 8))
90
- for i, (x, y, err_down, err_up) in enumerate(zip(xexp, rskin_values, error_lower, error_upper)):
91
- adjusted_err_down = min(err_down, 0.2)
92
- adjusted_err_up = min(err_up, 0.2)
93
- ax.errorbar(x, y, yerr=[[adjusted_err_down], [adjusted_err_up]], fmt='o', markersize=8, capsize=0, color='black', markerfacecolor='none')
94
- if err_down >= 1000:
95
- ax.plot([x], [y - adjusted_err_down], marker="v", color="black", markersize=8)
96
- if err_up >= 1000:
97
- ax.plot([x], [y + adjusted_err_up], marker="^", color="black", markersize=8)
98
-
99
- nsav = nuda.nuc.setupRnpAverage(source=source)
100
- if nsav.nskin_cen is not None:
101
- ax.errorbar(len(labels), nsav.nskin_cen, yerr=nsav.sig_std, label=nsav.label,
102
- color='k', marker='o', markersize=10, linestyle='solid', linewidth=3)
103
- # labels.append(nsav.label)
104
-
105
- for i, (x, y, marker, color) in enumerate(zip(xtheo, combined_rskin, combined_markers, combined_colors)):
106
- ax.plot(x, y, marker=marker, markersize=8, color=color)
107
-
108
- # Add legend for experimental points
109
- ax.scatter([], [], color='black', marker='o', facecolors='none', label='Experimental/Analysis')
110
-
111
- # Add legend for theoretical models
112
- for model_name, style in MODEL_STYLES.items():
113
- ax.scatter([], [], color=style["color"], marker=style["marker"], label=style["label"])
114
-
115
- ax.set_ylim([0, 0.5])
116
- ax.set_xticks(xexp)
117
- ax.set_xticklabels(labels, rotation=45, ha="right", fontsize=15)
118
- ax.set_ylabel(rf"$R_{{\rm{{skin}}}}$ {SOURCE_LABELS_LATEX[source]} (fm)", fontsize=15)
119
- ax.text(0.95, 0.95, subplot_labels[idx], transform=ax.transAxes, fontsize=15, verticalalignment='top', horizontalalignment='right')
120
-
121
- # Add minor ticks on y-axis
122
- ax.yaxis.set_minor_locator(AutoMinorLocator())
123
- ax.tick_params(axis='y', which='minor', length=4, color='gray') # Style for minor ticks
124
-
125
- ax.legend(loc="upper right", bbox_to_anchor=(0.5, 1), fontsize=12)
126
-
127
- output_dir = "figs/"
128
- os.makedirs(output_dir, exist_ok=True)
129
- fig_name = f"{output_dir}plot_nuc_setup_nskin_theo-{source.replace(' ', '_')}.png"
130
- plt.tight_layout()
131
- plt.savefig(fig_name, dpi=200)
132
- plt.close()
133
-
134
- print(f"Plot saved: {fig_name}")
52
+ :param pname: name of the figure (*.png)
53
+ :type pname: str.
54
+ :param source: experimental table.
55
+ :type source: str.
56
+ """
57
+ print(f'Plot name: {pname}')
58
+ print(f'Using source: {source}')
59
+
60
+ # subplot_label = "(a)" # remove this if you don't want any labels
61
+ subplot_label = " "
62
+
63
+ labels = []
64
+ rskin_values = []
65
+ error_lower = []
66
+ error_upper = []
67
+ xexp = []
68
+
69
+ cals = nuda.nuc.rnp_exp_source(source)
70
+ for i, cal in enumerate(cals):
71
+ neutron_skin_calc = nuda.nuc.setupRnpExp(source=source, cal=cal)
72
+ if neutron_skin_calc.rnp is not None:
73
+ labels.append(neutron_skin_calc.label)
74
+ rskin_values.append(neutron_skin_calc.rnp)
75
+ xexp.append(i)
76
+ err_down = neutron_skin_calc.rnp_sig_lo if neutron_skin_calc.rnp_sig_lo is not None else 0.0
77
+ err_up = neutron_skin_calc.rnp_sig_up if neutron_skin_calc.rnp_sig_up is not None else 0.0
78
+ error_lower.append(err_down)
79
+ error_upper.append(err_up)
80
+
81
+ model_data = read_model_data(MODEL_TABLES_DIR, source)
82
+ combined_rskin = []
83
+ combined_errors = []
84
+ combined_markers = []
85
+ combined_colors = []
86
+ xtheo = []
87
+
88
+ for model_name, data in model_data.items():
89
+ for j, (_, _, _, rskin) in enumerate(data):
90
+ x_position = xexp[j % len(xexp)] + 0.5 # Cycle through xexp and offset by 0.5
91
+ xtheo.append(x_position)
92
+ combined_rskin.append(rskin)
93
+ combined_errors.append((0.0, 0.0))
94
+ combined_markers.append(MODEL_STYLES[model_name]["marker"])
95
+ combined_colors.append(MODEL_STYLES[model_name]["color"])
96
+
97
+ if nuda.env.verb:
98
+ print(f"Experimental positions for {source}: {xexp}")
99
+ print(f"Theoretical positions for {source}: {xtheo}")
100
+
101
+ fig, ax = plt.subplots(figsize=(10, 8))
102
+ for i, (x, y, err_down, err_up) in enumerate(zip(xexp, rskin_values, error_lower, error_upper)):
103
+ adjusted_err_down = min(err_down, 0.2)
104
+ adjusted_err_up = min(err_up, 0.2)
105
+ ax.errorbar(x, y, yerr=[[adjusted_err_down], [adjusted_err_up]], fmt='o', markersize=8, capsize=0, color='black', markerfacecolor='none')
106
+ if err_down >= 1000:
107
+ ax.plot([x], [y - adjusted_err_down], marker="v", color="black", markersize=8)
108
+ if err_up >= 1000:
109
+ ax.plot([x], [y + adjusted_err_up], marker="^", color="black", markersize=8)
110
+
111
+ nsav = nuda.nuc.setupRnpAverage(source=source)
112
+ if nsav.rnp_cen is not None:
113
+ ax.errorbar(len(labels), nsav.rnp_cen, yerr=nsav.sig_std, label=nsav.label,
114
+ color='k', marker='o', markersize=10, linestyle='solid', linewidth=3)
115
+
116
+ for i, (x, y, marker, color) in enumerate(zip(xtheo, combined_rskin, combined_markers, combined_colors)):
117
+ ax.plot(x, y, marker=marker, markersize=8, color=color)
118
+
119
+ # Add legend for experimental points
120
+ ax.scatter([], [], color='black', marker='o', facecolors='none', label='Experimental/Analysis')
121
+
122
+ # Add legend for theoretical models
123
+ for model_name, style in MODEL_STYLES.items():
124
+ ax.scatter([], [], color=style["color"], marker=style["marker"], label=style["label"])
125
+
126
+ ax.set_ylim([0, 0.5])
127
+ ax.set_xticks(xexp)
128
+ ax.set_xticklabels(labels, rotation=45, ha="right", fontsize=15)
129
+ ax.set_ylabel(rf"$R_{{\rm{{skin}}}}$ {SOURCE_LABELS_LATEX[source]} (fm)", fontsize=15)
130
+ ax.text(0.95, 0.95, subplot_label, transform=ax.transAxes, fontsize=15, verticalalignment='top', horizontalalignment='right')
131
+
132
+ # Add minor ticks on y-axis
133
+ ax.yaxis.set_minor_locator(AutoMinorLocator())
134
+ ax.tick_params(axis='y', which='minor', length=4, color='gray')
135
+
136
+ ax.legend(loc="upper right", bbox_to_anchor=(0.5, 1), fontsize=12)
137
+
138
+ output_dir = "figs/"
139
+ os.makedirs(output_dir, exist_ok=True)
140
+ fig_name = os.path.join(output_dir, f"plot_nuc_setupRnpTheo_source{source.replace(' ', '_')}.png")
141
+ plt.tight_layout()
142
+ plt.savefig(fig_name, dpi=200)
143
+ plt.close()
144
+
145
+ print(f"Plot saved: {fig_name}")
nucleardatapy/hello.py ADDED
@@ -0,0 +1,6 @@
1
+
2
+ def hello():
3
+ print('hello world!')
4
+
5
+ if __name__ == "__main__":
6
+ hello()
@@ -150,16 +150,16 @@ class setupRE1LExp():
150
150
  #: Attribute A (mass of the nucleus).
151
151
  self.A = self.Z + self.N + np.ones(len(self.N),dtype=int)
152
152
  #: charge of the hypernuclei (=Z, since Lamnda is charged 0)
153
- self.ch = self.Z
153
+ self.Q = self.Z
154
154
  #: Strangness number
155
- self.S = -2*np.ones(len(self.N),dtype=int)
155
+ self.S = -1*np.ones(len(self.N),dtype=int)
156
156
  #: symbol representing the nucleus
157
157
  self.symb = nucSymb
158
- #: Attribute the angular momentum of the state.
158
+ #: Attribute the s.p. state.
159
159
  self.sps = nucsps
160
160
  #: Attribute the angular momentum of the state.
161
161
  self.ell = np.array( nucell, dtype = int )
162
- #: Attribute 1L binding energy in MeV.
162
+ #: Attribute 1L removal energy in MeV.
163
163
  self.lre = np.array( nuclre, dtype = float )
164
164
  #: Attribute 1L binding energy error in MeV.
165
165
  self.lre_err = np.array( nuclre_err, dtype = float )
@@ -204,7 +204,7 @@ class setupRE1LExp():
204
204
  if any(self.Z): print(f" Z: {self.Z}")
205
205
  if any(self.N): print(f" N: {self.N}")
206
206
  if any(self.S): print(f" S: {self.S}")
207
- if any(self.ch): print(f" ch: {self.ch}")
207
+ if any(self.Q): print(f" Q: {self.Q}")
208
208
  if any(self.symb): print(f" symb: {self.symb}")
209
209
  if any(self.ell): print(f" ell: {self.ell}")
210
210
  if any(self.lre): print(f" re: {self.lre}")
@@ -225,7 +225,7 @@ class setupRE1LExp():
225
225
  print(rf" index & Z & N & S & ch & symb & $RE$ & Ref. \\\\")
226
226
  print(rf" & & & & & & (MeV) & \\\\")
227
227
  for ind,A in enumerate(self.A):
228
- print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.ch[ind]} & {self.symb[ind]} & ${self.lre[ind]:.3f}\pm {self.lre_err[ind]:.3f}$ & \cite{{"+self.keyref+"} \\\\")
228
+ print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.Q[ind]} & {self.symb[ind]} & ${self.lre[ind]:.3f}\pm {self.lre_err[ind]:.3f}$ & \cite{{"+self.keyref+"} \\\\")
229
229
  else:
230
230
  print(f"- No table for source {self.table} (average). To get table, write 'verb_latex = True' in env.py.")
231
231
  #
@@ -117,12 +117,12 @@ class setupRE1XiExp():
117
117
  #: Strangness number (to be checked)
118
118
  self.S = -2*np.ones(len(self.N),dtype=int)
119
119
  #: charge of the hypernuclei (=Z-1, since Xi is charged -1)
120
- self.ch = self.Z - np.ones(len(self.N),dtype=int)
120
+ self.Q = self.Z - np.ones(len(self.N),dtype=int)
121
121
  #: symbol representing the nucleus
122
122
  self.symb = nucSymb
123
- #: Attribute 1L binding energy in MeV.
123
+ #: Attribute 1Xi removal energy in MeV.
124
124
  self.xire = np.array( nucxire, dtype = float )
125
- #: Attribute 1L binding energy error in MeV.
125
+ #: Attribute 1Xi removal energy error in MeV.
126
126
  self.xire_err = np.array( nucxire_err, dtype = float )
127
127
  #: Attribute the probe.
128
128
  self.probe = probe
@@ -162,7 +162,7 @@ class setupRE1XiExp():
162
162
  if any(self.Z): print(f" Z: {self.Z}")
163
163
  if any(self.N): print(f" N: {self.N}")
164
164
  if any(self.S): print(f" S: {self.S}")
165
- if any(self.ch): print(f" ch: {self.ch}")
165
+ if any(self.Q): print(f" Q: {self.Q}")
166
166
  if any(self.symb): print(f" symb: {self.symb}")
167
167
  if any(self.xire): print(f" xibe: {self.xire}")
168
168
  if any(self.xire_err): print(f" xibe_err: {self.xire_err}")
@@ -183,7 +183,7 @@ class setupRE1XiExp():
183
183
  print(rf" index & Z & N & S & ch & symb & RE & & Ref. \\\\")
184
184
  print(rf" & & & & & & (MeV) & & \\\\")
185
185
  for ind,A in enumerate(self.A):
186
- print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.ch[ind]} & {self.symb[ind]} & ${self.xire[ind]:.3f}\pm {self.xire_err[ind]:.3f}$ & & \\cite{{"+self.keyref+"} \\\\")
186
+ print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.Q[ind]} & {self.symb[ind]} & ${self.xire[ind]:.3f}\pm {self.xire_err[ind]:.3f}$ & & \\cite{{"+self.keyref+"} \\\\")
187
187
  else:
188
188
  print(f"- No table for source {self.table} (average). To get table, write 'verb_latex = True' in env.py.")
189
189
  #
@@ -16,7 +16,8 @@ def re2L_exp_tables():
16
16
  #
17
17
  if nuda.env.verb: print("\nEnter re2L_exp_tables()")
18
18
  #
19
- tables = [ '2013-2L-Ahn' ]
19
+ #tables = [ '2013-2L-Ahn' ]
20
+ tables = [ '1991-2L-Yamamoto', '2013-2L-Ahn', '2019-2L-Ekawa' ]
20
21
  #
21
22
  #print('tables available in the toolkit:',tables)
22
23
  tables_lower = [ item.lower() for item in tables ]
@@ -78,7 +79,18 @@ class setupRE2LExp():
78
79
  color = []
79
80
  mark = []
80
81
  #
81
- if table.lower() == '2013-2l-ahn':
82
+ if table.lower() == '1991-2l-yamamoto':
83
+ #
84
+ file_in = os.path.join(nuda.param.path_data,'hnuclei/1991-2L-Yamamoto.csv')
85
+ if nuda.env.verb: print('Reads file:',file_in)
86
+ #: Attribute providing the full reference to the paper to be citted.
87
+ self.ref = 'Y. Yamamoto, H. Takaki, K. Ikeda, Prog. Theo. Phys. 86, 867 (1991).'
88
+ self.keyref = 'YYamamoto:1991'
89
+ #: Attribute providing additional notes about the data.
90
+ self.note = "https://doi.org/10.1143/ptp/86.4.867"
91
+ #
92
+
93
+ elif table.lower() == '2013-2l-ahn':
82
94
  #
83
95
  file_in = os.path.join(nuda.param.path_data,'hnuclei/2013-2L-Ahn.csv')
84
96
  if nuda.env.verb: print('Reads file:',file_in)
@@ -88,6 +100,16 @@ class setupRE2LExp():
88
100
  #: Attribute providing additional notes about the data.
89
101
  self.note = "write here notes about this table."
90
102
  #
103
+ if table.lower() == '2019-2l-ekawa':
104
+ #
105
+ file_in = os.path.join(nuda.param.path_data,'hnuclei/2019-2L-Ekawa.csv')
106
+ if nuda.env.verb: print('Reads file:',file_in)
107
+ #: Attribute providing the full reference to the paper to be citted.
108
+ self.ref = 'H. Ekawa et al., PTEP 2019, 021D02.'
109
+ self.keyref = 'HEkawa:2019'
110
+ #: Attribute providing additional notes about the data.
111
+ self.note = "write here notes about this table."
112
+ #
91
113
  #
92
114
  with open(file_in,'r') as file:
93
115
  for line in file:
@@ -102,11 +124,12 @@ class setupRE2LExp():
102
124
  nuclre_err.append(linesplit[4].strip())
103
125
  nucldre.append(linesplit[5].strip())
104
126
  nucldre_err.append(linesplit[6].strip())
105
- probe.append(linesplit[6].strip().strip('\n'))
106
- if probe[-1] == 'emul':
107
- label.append("Ahn-2013 Emul")
108
- color.append('blue')
109
- mark.append('s')
127
+ label.append(linesplit[7].strip('\n'))
128
+ probe.append(linesplit[7].strip().strip('\n'))
129
+ color.append('blue')
130
+ mark.append('s')
131
+ print('label:',label[-1])
132
+ print('probe:',probe[-1])
110
133
  else:
111
134
  break
112
135
  #
@@ -119,14 +142,14 @@ class setupRE2LExp():
119
142
  #: Attribute A (mass of the nucleus).
120
143
  self.A = self.Z + self.N + 2*np.ones(len(self.N),dtype=int)
121
144
  #: charge of the hypernuclei (=Z, since Lamnda is charged 0)
122
- self.ch = self.Z
145
+ self.Q = self.Z
123
146
  #: Strangness number
124
- self.S = -2*2*np.ones(len(self.N),dtype=int)
147
+ self.S = -2*np.ones(len(self.N),dtype=int)
125
148
  #: symbol representing the nucleus
126
149
  self.symb = nucSymb
127
- #: Attribute 2L binding energy in MeV.
150
+ #: Attribute 2L removal energy in MeV.
128
151
  self.llre = np.array( nuclre, dtype = float )
129
- #: Attribute 2L binding energy error in MeV.
152
+ #: Attribute 2L removal energy error in MeV.
130
153
  self.llre_err = np.array( nuclre_err, dtype = float )
131
154
  #: Attribute 2L bond energy in MeV.
132
155
  self.lldre = np.array( nucldre, dtype = float )
@@ -171,7 +194,7 @@ class setupRE2LExp():
171
194
  if any(self.Z): print(f" Z: {self.Z}")
172
195
  if any(self.N): print(f" N: {self.N}")
173
196
  if any(self.S): print(f" S: {self.S}")
174
- if any(self.ch): print(f" ch: {self.ch}")
197
+ if any(self.Q): print(f" Q: {self.Q}")
175
198
  if any(self.symb): print(f" symb: {self.symb}")
176
199
  if any(self.llre): print(f" be: {self.llre}")
177
200
  if any(self.llre_err): print(f" be_err: {self.llre_err}")
@@ -193,7 +216,7 @@ class setupRE2LExp():
193
216
  print(rf" index & Z & N & S & ch & symb & $RE$ & $\Delta RE$ & Ref. \\\\")
194
217
  print(rf" & & & & & & (MeV) & (MeV) & \\\\")
195
218
  for ind,A in enumerate(self.A):
196
- print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.ch[ind]} & {self.symb[ind]} & ${self.llre[ind]:.3f}\pm {self.llre_err[ind]:.3f}$ & ${self.lldre[ind]:.3f}\pm {self.lldre_err[ind]:.3f}$ & \\cite{{"+self.keyref+"} \\\\")
219
+ print(rf" {ind} & {self.Z[ind]} & {self.N[ind]} & {self.S[ind]} & {self.Q[ind]} & {self.symb[ind]} & ${self.llre[ind]:.3f}\pm {self.llre_err[ind]:.3f}$ & ${self.lldre[ind]:.3f}\pm {self.lldre_err[ind]:.3f}$ & \\cite{{"+self.keyref+"} \\\\")
197
220
  else:
198
221
  print(f"- No table for source {self.table} (average). To get table, write 'verb_latex = True' in env.py.")
199
222
  #