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.
 
 
 
 

79 lines
2.7 KiB

import os
import dotenv
import argparse
import sys
import pandas as pd
import zfit
from prettytable import PrettyTable
dotenv.load_dotenv('../properties.env')
sys.path.insert(0, os.getenv('SYS_PATH'))
from b2kstll.models.angular import B2Kstll
from b2kstll.plot import plot_distributions
from hep_analytics.processing.extract import FileManager
from hep_analytics.processing.transform import select_feature
FILE = os.getenv('FILE_GEN')
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--q2bin', dest ='q2bin', default = 0)
args = parser.parse_args()
Q2BIN = int(args.q2bin)
bin_ranges = [(0.25, 4.00), (4.00, 8.00), (11.00, 12.50), (15.00, 18.00), (1.10, 6.00), (1.1, 2.5), (2.5, 4.0), (4.0, 6.0), (6.0, 8.0)]
print(f"Selected Q2 Bin Range is {bin_ranges[Q2BIN]}")
file_manager = FileManager(file = FILE, tree = "Events",
branches = ["q2", "costhetak", "costhetal", "phi"])
data = file_manager.extract_data()
q2, costhetak, costhetal, phi = data[0], data[1], data[2], data[3]
q2, indices = select_feature(feature = q2, limits = bin_ranges[Q2BIN])
costhetak = costhetak[indices]
costhetal = costhetal[indices]
phi = phi[indices]
lower_costhetak_cut = float(os.getenv('LOWER_COSTHETAK_CUT'))
upper_costhetak_cut = float(os.getenv('UPPER_COSTHETAK_CUT'))
costhetak, indices = select_feature(feature = costhetak, limits = (lower_costhetak_cut, upper_costhetak_cut))
q2 = q2[indices]
costhetal = costhetal[indices]
phi = phi[indices]
angular_data = pd.DataFrame({'ctl': costhetal, 'ctk': costhetak, 'phi': phi})
angular_data.to_csv(f"angular_fit_generator_bin_{Q2BIN}.csv", index = False)
x = B2Kstll('ctl','ctk','phi')
obs, pdf, _ = x.get_pdf('PWave')
datazfit = zfit.Data.from_pandas(df = angular_data, obs = obs)
nll = zfit.loss.UnbinnedNLL(model = pdf, data = datazfit)
minimizer = zfit.minimize.Minuit()
result = minimizer.minimize(nll)
print(result)
print(result.params, pdf)
param_errors, _ = result.errors()
print(param_errors)
info_table = PrettyTable(["Variable", "Value", "Lower Error", "Upper Error"])
fit_labels = ["AFB", "FL", "S3", "S4", "S5", "S7", "S8", "S9"]
for name in fit_labels:
value = result.params[name]["value"]
lower = result.params[name]["minuit_minos"]["lower"]
upper = result.params[name]["minuit_minos"]["upper"]
info_table.add_row([name, value, lower, upper])
print(info_table)
plot_distributions(result, suffix = f"accPwavePDF_generator_level_bin_{Q2BIN}")
if __name__ == "__main__":
main()