Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
6.2 KiB

  1. import re
  2. import numpy as np
  3. from prettytable import PrettyTable
  4. def main():
  5. table_1 = """+----------+-----------------------+-----------------------+----------------------+\n
  6. | Variable | Value | Lower Error | Upper Error |\n
  7. +----------+-----------------------+-----------------------+----------------------+\n
  8. | AFB | -0.1327941714665493 | -0.011751983569979923 | 0.011695518975582573 |\n
  9. | FL | 0.778784190310989 | -0.013786738313616998 | 0.01334631516152801 |\n
  10. | S3 | 0.012016752919524067 | -0.014186281678810328 | 0.01390470699489175 |\n
  11. | S4 | 0.0030912112690471196 | -0.02494551503535478 | 0.02500682819273369 |\n
  12. | S5 | 0.06257482631549156 | -0.022576669869741432 | 0.02267902660423071 |\n
  13. | S7 | 0.026461647341068015 | -0.022870493984060422 | 0.022709046371542273 |\n
  14. | S8 | 0.022528200778115424 | -0.024500119399894143 | 0.02444883875849664 |\n
  15. | S9 | -0.010047596608480971 | -0.015100958783891871 | 0.01497061747614531 |\n
  16. +----------+-----------------------+-----------------------+----------------------+"""
  17. table_2 = """+----------+-----------------------+-----------------------+----------------------+\n
  18. | Variable | Value | Lower Error | Upper Error |\n
  19. +----------+-----------------------+-----------------------+----------------------+\n
  20. | AFB | -0.044313915998597596 | -0.011266005942710903 | 0.011376116194169396 |\n
  21. | FL | 0.8080898316779715 | -0.012903371237386076 | 0.012627755576193413 |\n
  22. | S3 | -0.001350693384098943 | -0.01425102196417036 | 0.014014236056631763 |\n
  23. | S4 | -0.16348388538343442 | -0.022982703026786865 | 0.02353050491741336 |\n
  24. | S5 | -0.12998638915138938 | -0.02207623402690808 | 0.02230804022923196 |\n
  25. | S7 | -0.019175072605277906 | -0.022219297227352726 | 0.02233298418372788 |\n
  26. | S8 | 0.03896504393685167 | -0.02306667997644898 | 0.023056355590581525 |\n
  27. | S9 | -0.026410777123662296 | -0.01497373735832672 | 0.015237714795859537 |\n
  28. +----------+-----------------------+-----------------------+----------------------+"""
  29. table_3 = """+----------+-----------------------+-----------------------+----------------------+\n
  30. | Variable | Value | Lower Error | Upper Error |\n
  31. +----------+-----------------------+-----------------------+----------------------+\n
  32. | AFB | 0.06877321968399613 | -0.00873785505692959 | 0.008866035437567673 |\n
  33. | FL | 0.7579354189983714 | -0.01048129883366948 | 0.01017491937670441 |\n
  34. | S3 | -0.02540601876438032 | -0.012075664333196083 | 0.012192632205060838 |\n
  35. | S4 | -0.18300822691744986 | -0.015545142299112552 | 0.016136099542591972 |\n
  36. | S5 | -0.28137307676130335 | -0.0160784362375397 | 0.01630021297009425 |\n
  37. | S7 | 0.033064765761582675 | -0.01837491321971226 | 0.018457429889962827 |\n
  38. | S8 | -0.022661825503764606 | -0.018831356033962507 | 0.018816177761568176 |\n
  39. | S9 | -0.01151502616377776 | -0.012778180225448249 | 0.013091600028830737 |\n
  40. +----------+-----------------------+-----------------------+----------------------+"""
  41. bin_labels = [r"$0.25 < q^2 < 4.00$", r"$4.00 < q^2 < 8.00$", r"$11.00 < q^2 < 12.50$",
  42. r"$15.00 < q^2 < 18.00$", r"$1.10 < q^2 < 6.00$",
  43. r"$1.1 < q^2 < 2.5$", r"$2.5 < q^2 < 4.0$", r"$4.0 < q^2 < 6.0$", r"$6.0 < q^2 < 8.0$"]
  44. tables = [table_1, table_2, table_3]
  45. variables = ["AFB", "FL", "S3", "S4", "S5", "S7", "S8", "S9"]
  46. select_regex = [".*AFB.*\d+", ".*FL.*\d+", ".*S3.*\d+", ".*S4.*\d+", ".*S5.*\d+", ".*S7.*\d+", ".*S8.*\d+", ".*S9.*\d+"]
  47. value_regex = "[- ]\d+.\d+"
  48. samples = {'1': {'AFB': None, 'FL': None, 'S3': None, 'S4': None, 'S5': None, 'S7': None, 'S8': None, 'S9': None},
  49. '2': {'AFB': None, 'FL': None, 'S3': None, 'S4': None, 'S5': None, 'S7': None, 'S8': None, 'S9': None},
  50. '3': {'AFB': None, 'FL': None, 'S3': None, 'S4': None, 'S5': None, 'S7': None, 'S8': None, 'S9': None},
  51. }
  52. for index in range(len(tables)):
  53. for variable, regex in zip(variables, select_regex):
  54. splitted = tables[index].splitlines()
  55. for line in splitted:
  56. subresult = re.match(regex, line)
  57. if subresult != None:
  58. substring = subresult.group(0)
  59. result = re.findall(value_regex, substring)
  60. value = np.float64(result[0])
  61. lower_err = np.float64(result[1])
  62. upper_err = np.float64(result[2])
  63. samples[str(index + 1)][variable] = (value, lower_err, upper_err)
  64. fit_variables_split = [[] for _ in range(8)]
  65. fit_errors_split = [[] for _ in range(8)]
  66. for value in samples.values():
  67. count = 0
  68. for fitvalue in value.values():
  69. fit_variables_split[count].append(fitvalue[0])
  70. fit_errors_split[count].append(np.sqrt(fitvalue[1]**2 + fitvalue[2]**2))
  71. count += 1
  72. info_table = PrettyTable(["Variable", "Value", "Lower Error", "Upper Error"])
  73. info_table.title = f"q2_split_{bin_labels[4]}_average"
  74. fit_labels = ["AFB", "FL", "S3", "S4", "S5", "S7", "S8", "S9"]
  75. count = 0
  76. for name, fit_split_var, fit_err_split in zip(fit_labels, fit_variables_split, fit_errors_split):
  77. fit_avg = np.mean(fit_split_var)
  78. error_split = 1/3 * np.sqrt(fit_err_split[0]**2 + fit_err_split[1]**2 + fit_err_split[2]**2)
  79. info_table.add_row([name, fit_avg, -error_split, error_split])
  80. count += 1
  81. print(info_table)
  82. if __name__ == "__main__":
  83. main()