Newer
Older
Master_thesis / test.py
import ROOT
#from ROOT import TTree, TFile, Double
import numpy as np
from pdg_const import pdg
import matplotlib
matplotlib.use("Qt5Agg")
import matplotlib.pyplot as plt
import pickle as pkl

class model:
    
    def __init__(self):
    

        self.mmu = pdg['muon_M']
        self.mb = pdg["bquark_M"]
        self.ms = pdg["squark_M"]
        self.mK = pdg["Ks_M"]
        self.mB = pdg["Bplus_M"]

        self.C7eff = pdg["C7eff"]
        self.C9eff = pdg["C9eff"]
        self.C10eff = pdg["C10eff"]
        
        #self.C1 = pdg["C1"]
        #self.C2 = pdg["C2"]
        #self.C3 = pdg["C3"]
        #self.C4 = pdg["C4"]
        
        self.GF = pdg["GF"] #Fermi coupling const.
        self.alpha_ew = pdg["alpha_ew"]
        self.Vts = pdg["Vts"]
        self.Vtb = pdg["Vtb"]
        

    def formfactor(self, q2, subscript):
        
        #check if subscript is viable
        
        if subscript != "0" and subscript != "+" and subscript != "T":
            raise ValueError('Wrong subscript entered, choose either 0, + or T')
        
        #get constants
        
        mh = self.mK
        mbstar0 = pdg["mbstar0"]
        mbstar = pdg["mbstar"]
        b0 = pdg["b0"]
        bplus = pdg["bplus"]
        bT = pdg["bT"]
        
        N = 3
        
        #some helperfunctions
        
        tpos = (self.mB - self.mK)**2
        tzero = (self.mB + self.mK)*(np.sqrt(self.mB)-np.sqrt(self.mK))**2
        
        z_oben = np.sqrt(tpos - q2) - np.sqrt(tpos - tzero)
        z_unten = np.sqrt(tpos - q2) + np.sqrt(tpos - tzero)
        z = z_oben/z_unten
        
        #calculate f0
        
        if subscript == "0":
            prefactor = 1/(1 - q2/(mbstar0**2))
            _sum = 0
            
            for i in range(N):
                _sum += b0[i]*(z**i)
                
            return prefactor * _sum
        
        #calculate f+ or fT
        
        else:
            prefactor = 1/(1 - q2/(mbstar**2))
            _sum = 0
            
            if subscript == "T":
                b = bT
            else:
                b = bplus
        
            for i in range(N):
                _sum += b[i] * (z**i - ((-1)**(i-N)) * (i/N) * z**N)
            
            return prefactor * _sum
    
    def axiv_nonres(self, q2):
        
        GF = self.GF
        alpha_ew = self.alpha_ew
        Vtb = self.Vtb
        Vts = self.Vts
        C10eff = self.C10eff
        
        mmu = self.mmu
        mb = self.mb
        ms = self.ms
        mK = self.mK
        mB = self.mB        
    
        #Some helperfunctions
        
        beta = np.sqrt(np.abs(1. - 4. * self.mmu**2. / q2))
        
        kabs = np.sqrt(mB**2 + q2**2/mB**2 + mK**4/mB**2 - 2 * (mB**2 * mK**2 + mK**2 * q2 + mB**2 * q2) / mB**2)
        
        #prefactor in front of whole bracket
        
        prefactor1 = GF**2. *alpha_ew**2. * (np.abs(Vtb*Vts))**2 * kabs * beta / (128. * np.pi**5.)
        
        #left term in bracket
        
        bracket_left = 2./3. * kabs**2 * beta**2 * np.abs(C10eff*self.formfactor(q2, "+"))**2      
        
        #middle term in bracket
        
        _top = 4. * mmu**2 * (mB**2 - mK**2) * (mB**2 - mK**2)
        
        _under = q2 * mB**2
        
        bracket_middle = _top/_under * np.abs(C10eff * self.formfactor(q2, "0"))**2
        
        return prefactor1 * (bracket_left + bracket_middle) * 2 * np.sqrt(q2)
        

    def vec_nonres(self, q2):
        
        GF = self.GF
        alpha_ew = self.alpha_ew
        Vtb = self.Vtb
        Vts = self.Vts
        C7eff = self.C7eff
        C9eff = self.C9eff
        
        mmu = self.mmu
        mb = self.mb
        ms = self.ms
        mK = self.mK
        mB = self.mB        
    
        #Some helperfunctions
        
        beta = np.sqrt(np.abs(1. - 4. * self.mmu**2. / q2))
        
        kabs = np.sqrt(mB**2 + q2**2/mB**2 + mK**4/mB**2 - 2 * (mB**2 * mK**2 + mK**2 * q2 + mB**2 * q2) / mB**2)
        
        #prefactor in front of whole bracket
        
        prefactor1 = GF**2. *alpha_ew**2. * (np.abs(Vtb*Vts))**2 * kabs * beta / (128. * np.pi**5.) 
        
        #right term in bracket
        
        prefactor2 = kabs**2 * (1. - 1./3. * beta**2)
        
        abs_bracket = np.abs(C9eff * self.formfactor(q2, "+") + 2 * C7eff * (mb + ms)/(mB + mK) * self.formfactor(q2, "T"))**2
                
        bracket_right = prefactor2 * abs_bracket
        
        return prefactor1 * bracket_right * 2 * np.sqrt(q2)
    
    def total_nonres(self, q2):
        
        #Get constants
        
        GF = self.GF
        alpha_ew = self.alpha_ew
        Vtb = self.Vtb
        Vts = self.Vts
        C10eff = self.C10eff
        C9eff = self.C9eff
        C7eff = self.C7eff
        
        mmu = self.mmu
        mb = self.mb
        ms = self.ms
        mK = self.mK
        mB = self.mB
        
        #vector nonresonant part
        
        vec_nonres_part = self.vec_nonres(q2)
        
        #axial verctor nonresonant part including C7
        
        axiv_nonres_part = self.axiv_nonres(q2)
        
        #Complete term
        
        return vec_nonres_part + axiv_nonres_part
            

modl = model()

#f0 = modl.formfactor(10000, "+")
#print(f0)

_dgammadq2 = modl.total_nonres(10)

mB = modl.mB
mK = modl.mK
mmu = modl.mmu

#print((mB-mK))

dq = np.linspace(2*mmu, (mB-mK) - 0.1 ,1000)


dq2 = []

for i in dq:
	dq2.append(i**2)


ff_plus = []
ff_T = []
ff_0 = []
dgamma_axiv_nonres = []
dgamma_vec_nonres = []
dgamma_tot = []

for i in dq:
    ff_0.append(modl.formfactor(i**2, "0"))
    ff_T.append(modl.formfactor(i**2, "T"))
    ff_plus.append(modl.formfactor(i**2, "+"))

for i in dq:	
	dgamma_axiv_nonres.append(modl.axiv_nonres(i**2))
	dgamma_vec_nonres.append(modl.vec_nonres(i**2))
	dgamma_tot.append(modl.total_nonres(i**2))
	

plt.plot(dq2, ff_0, label = "0")
plt.plot(dq2, ff_T, label = "T")
plt.plot(dq2, ff_plus, label = "+")

plt.grid()

plt.legend()

plt.savefig("ff.png")

plt.clf()

plt.plot(dq, dgamma_axiv_nonres, label = "axiv")
plt.plot(dq, dgamma_vec_nonres, label = "vec")

plt.grid()

plt.legend()

plt.savefig("vec_axiv.png")

plt.clf()

plt.plot(dq, dgamma_tot, label = "total")

#print(max(dgamma_tot))

plt.grid()

plt.legend()

plt.savefig("tot.png")

#Generate a random set

set_size = 10000

x = []
y = []

x_part = []
y_part = []

print("Generating set of size {}...".format(set_size))

#print(len(y))

#ROOT.TRandom1().SetSeed(0)

while len(x_part) < set_size:
    x.append(ROOT.TRandom1().Uniform(2*mmu, (mB-mK)))
    y.append(ROOT.TRandom1().Uniform(0, max(dgamma_tot)*1.05))
    
    if y[-1] < modl.total_nonres(x[-1]**2):
             x_part.append(x[-1])
             y_part.append(y[-1])
             
             #progress calls
             
             if len(x_part)%int(set_size/10) == 0:
                print("{0}/{1} completed".format(len(x_part), set_size))
                
                
print("{0} out of {1} particles chosen!".format(len(x_part), len(x)))
             
print("Set generated!")

part_set = {"q" : x_part, "y": y_part}
             
pkl.dump( part_set, open("set.pkl" , "wb" ) )

print("Set saved!")

plt.clf()

plt.plot(x, y, label = "total", marker = ".", linewidth = 0)

plt.plot(dq, dgamma_tot, label = "pdf")

plt.plot(x_part, y_part, label = "chosen", marker = ".", linewidth = 0)

plt.grid()

plt.legend()

plt.savefig("set.png")

print("test finished")