PhD thesis of Renata Kopečná Angular analysis of B+->K*+(K+pi0)mu+mu- decay with the LHCb experiment
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.
 
 
 

306 lines
11 KiB

import sys, os
from pathlib import Path
import numpy as np
import re #whatever it is, it is used for nth replacement
PATH = "/home/renata/B2KMuMu/sigma0/B2KstarMuMu/code/ewp-Bplus2Kstmumu-AngAna/FCNCfitter/LaTeXfiles/"
NAME = "latex_couts_toy"
VERB = False
PATH_NEW = "/home/renata/Documents/LHCb/Dizertacka/Chapters/Toys/jobs/"
NAME_NEW = "pull_table"
ANG_PARAMS = ["Fl", "S3", "S4", "S5", "Afb", "S7", "S8", "S9"]
SWAVE_PARAMS = ["FS","SS1","SS2","SS3","SS4","SS5"]
ANGLE_FOLDING = [
["Fl", "S3", "Afb", "S9"],
["Fl", "S3", "S4"],
["Fl", "S3", "S5"],
["Fl", "S3", "S7"],
["Fl", "S3", "S8"]
]
ANGLE_FOLDING_S = [
["FS", "SS1"],
["FS", "SS1", "SS2"],
["FS", "SS1", "SS3"],
["FS", "SS1", "SS4"],
["FS", "SS4"],
]
COL_OLD = ["0d3c7b", "2b6d97", "499eb3", "67cfcf", "85ffeb", "7ce9c8", "72d2a5", "69b282",
"5FA55F",
"84BC70", "A8D281", "CCE892", "F0FEA2", "DABF7A", "C47F51", "AE4029", "970000"]
COL_WORKING = [ "0d3c7b", "2B6D97","499eb3","85ffeb","72D2A5",
"5FA55F", "5FA55F",
"a8d281", "f0fea2","c47f51", "ae4029", "970000"
]
COL_DEFAULT = ["2B6D97","6cb6c4","Adfff1","9ae9cd","86d2a8",
"5FA55F", "5FA55F",
"a8d281", "CCE892","f0fea2","c47f51", "ae4029"
]
COL_RANGE = 0.5
OBS_LIST = ["$F_{L}$", "$S_{3}$", "$S_{4}$", "$S_{5}$", "$A_{FB}$", "$S_{7}$", "$S_{8}$", "$S_{9}$",
"$F_{S}$", "$S_{S1}$", "$S_{S2}$", "$S_{S3}$", "$S_{S4}$", "$S_{S5}$"]
def read_file(jobID):
fileName = PATH+NAME+"_"+str(jobID)+".tex"
with open(fileName) as file: #Read file line-by-line
lines = file.readlines()
index = lines.index('\\hline\n')
widthLines = lines[4:index]
pullLines = lines[index+8:-4]
head = lines[0:4]
return pullLines, widthLines, head
def removeColor(line):
tmpList = line.split('&')
if (VERB): print (tmpList)
varName = tmpList[0]
varList = tmpList[1:]
varVals = ""
for bin in varList:
if(VERB): print (bin)
varVals += " & $" + bin[:-1].split('$')[1] + "$" #Remove the \n, split by $ and remove the cell color
if (VERB): print (varName,varVals)
return (varName +varVals + "\\\\\n")
def removeColorFilter(line):
tmpList = line.split('&')
if (VERB): print (tmpList)
varName = tmpList[0].strip()
if (varName not in OBS_LIST): return "";
varList = tmpList[1:]
varVals = ""
for bin in varList:
if(VERB): print (bin)
varVals += " & $" + bin[:-1].split('$')[1] + "$" #Remove the \n, split by $ and remove the cell color
if (VERB): print (varName,varVals)
return (varName +varVals + "\\\\\n")
def joinLines(pullLine, widthLine):
pullList = pullLine.split('&')
widthList = widthLine.split('&')
varName = pullList[0]
try: (pullList[0]==widthList[0])
except: print("Something went wrong when splitting the tables.")
pullVal = pullList[1][:-1].split('$')[1] #Remove the last \n, split by $ and remove the cell color
if(VERB): print (pullVal)
widthVal = widthList[1][:-1].split('$')[1]
if(VERB): print (widthVal)
print (varName+" & $" +pullVal+"$ & $"+widthVal+ "$\\\\")
return
def removeAllColor(jobID):
pullLines, widthLines, head = read_file(jobID)
for line in pullLines:
print (removeColor(line))
for line in widthLines:
print (removeColor(line))
return
def joinAllLines(jobID):
pullLines, widthLines, head = read_file(jobID)
for pull, width in zip(pullLines, widthLines):
joinLines(pull,width)
return
def addFldTag(line, fld):
tmpList= line.split("&")
tmpList[0] = tmpList[0] + "("+str(fld)+")"
return "&".join(tmpList)
def makeFancyList(input_list):
list_filtered = []
for lines in input_list:
clean_lines = []
for line in lines:
line = removeColorFilter(line)
clean_lines.append(line)
list_filtered.append(clean_lines)
list_fancy = []
for x in range(0,5): list_fancy.append(addFldTag(list_filtered[x][0],x))
for x in range(0,5): list_fancy.append(addFldTag(list_filtered[x][1],x))
list_fancy.append(list_filtered[1][2])
list_fancy.append(list_filtered[2][2])
list_fancy.append(list_filtered[0][2])
list_fancy.append(list_filtered[3][2])
list_fancy.append(list_filtered[4][2])
list_fancy.append(list_filtered[0][3])
return list_fancy
def createFoldingTables(jobIDlist):
outputName = PATH_NEW + NAME_NEW + "_" + str(jobIDlist[0]) + "_fld.tex"
output = open(outputName, "w")
pull_list = []
width_list = []
index_list = []
for jobID in jobIDlist:
pull, width, head = read_file(jobID)
pull_list.append(pull)
width_list.append(width)
#print (width_list)
#for lines in lines_list:
output.write("\\begin{table} \\footnotesize \\centering\n")
output.write("\\begin{tabular}{|l|c c c c c|}\n") #TODO: 5 bins, doesn't work for
output.write("\\multicolumn{6}{c}{\\textbf{means}}\\\\ \\hline \n")
output.write(head[2].replace("width","parameter"))
output.write("\\hline\n")
for line in makeFancyList(pull_list):
output.write(line)
output.write("\\hline\n")
output.write("\\multicolumn{6}{c}{}\\\\ \n")
output.write("\\multicolumn{6}{c}{\\textbf{widths}}\\\\ \\hline \n")
output.write(head[2].replace("width","parameter"))
output.write("\\hline\n")
for line in makeFancyList(width_list):
output.write(line)
output.write("\\hline\n")
output.write("\\end{tabular}\n")
output.write("\\captionof{table}[The means and widths of the pull distributions in rare-like pseudoexperiments with folding applied.]{The means and widths of the pull distributions in rare-like pseudoexperiments. 500 pseudoexperiments have been generated, mimicking the rare \\BuToKstmm decay. In the fit to the pseudodata, folding is applied. The number at the parameters \\FL and $S_3$ indicate the applied folding, as the two parameters can be measured using all folding techniques. } \\label{tab:toys-Sig-pull-"+str(jobIDlist[0])+"}\n")
output.write("\\end{table}\n\n\n")
output.close
def createTables(jobID):
fileName = PATH+NAME+"_"+str(jobID)+".tex"
if not Path(fileName).exists(): return
with open(fileName) as file: #Read file line-by-line
lines = file.readlines()
if (len(lines)==0): return
outputName = PATH_NEW + NAME_NEW + "_" + str(jobID) + ".tex"
output = open(outputName, "w")
index = lines.index('\\hline\n')
output.write("\\begin{table} \\footnotesize \\centering\n")
#output.write(lines[1])
output.write("\\begin{tabular}{|l|c c c c c|}\n") #TODO: 5 bins, doesn't work for Jpsi
#output.write(lines[3])
output.write("\\multicolumn{6}{c}{\\textbf{means}}\\\\ \\hline \n")
output.write(lines[2].replace("width","parameter"))
output.write("\\hline\n")
for line in lines[index+8:-4]:
output.write(removeColorFilter(line))
output.write("\\hline\n")
output.write("\\multicolumn{6}{c}{}\\\\ \n")
output.write("\\multicolumn{6}{c}{\\textbf{widths}}\\\\ \\hline \n")
output.write((lines[2]).replace("width","parameter"))
output.write("\\hline\n")
for line in lines[4:index]:
output.write(removeColorFilter(line))
output.write("\\hline\n")
output.write("\\end{tabular}\n")
output.write("\\captionof{table}[The means and widths of the pull distributions in rare-like pseudoexperiments.]{The means and widths of the pull distributions in rare-like pseudoexperiments. 500 pseudoexperiments have been generated, mimicking the rare \\BuToKstmm decay.} \\label{tab:toys-Sig-pull-"+str(jobID)+"}\n")
output.write("\\end{table}\n\n\n")
output.close
def getColor(value, isMean):
center = 0 if isMean else 1
ranges = np.linspace(center-COL_RANGE,center+COL_RANGE,len(COL_DEFAULT)-1)
if (value>center+COL_RANGE): return COL_DEFAULT[-1]
idx = np.where((ranges>=value)==True)
return COL_DEFAULT[idx[0][0]]
def printTestTable():
ranges = np.linspace(0-COL_RANGE,0+COL_RANGE,len(COL_DEFAULT)-1)
print(ranges)
print(ranges>=0.05)
print(ranges>=0.55)
print(ranges>=-0.55)
for i in range(0,len(COL_DEFAULT)-2):
value = (ranges[i]+ranges[i+1])/2.0
print ("\\cellcolor[HTML]{"+str(getColor(value,1))+"}"+str(value)+"\\\\")
return
def replacenth(string, sub, wanted, n):
where = [m.start() for m in re.finditer(sub, string)][n-1]
before = string[:where]
after = string[where:]
after = after.replace(sub, wanted, 1)
newString = before + after
return newString
def addNiceColorToLine(line, isMean):
lineList = line.split('&')
colorList = []
for element in lineList[1:]:
element = element.replace("\\phantom{-}","+")
value = element.split('$')[1].split("\\pm")[0]
if (VERB): print(float(value))
if (VERB): print (getColor(float(value),isMean))
colorList.append(getColor(float(value),isMean))
for i in range(0,len(colorList)):
line = replacenth(line,'&','&\cellcolor[HTML]{'+colorList[i]+'}',i+1)
if (VERB): print(line)
return line
def addNiceColors(filePath):
outputPath = filePath.replace(".tex","_col.tex")
output = open(outputPath, "w")
if (VERB): print ("OutputFile: ", output)
with open(filePath) as file: #Read file line-by-line
lines = file.readlines()
indices = [i for i, e in enumerate(lines) if e == '\\hline\n']
if (VERB): print(indices)
NumberOfTables = len(indices)/2
for table in range(0,int(NumberOfTables)):
if(VERB): print("Printing table ", table)
for i in range(indices[table*2]+1,indices[table*2+1]):
lines[i] = addNiceColorToLine(lines[i], table==0)
if (VERB): print(lines)
for line in lines:
output.write(line)
#index = lines.index('\\hline\n')
return
tmpPath = "/home/renata/Documents/LHCb/Dizertacka/Chapters/Toys/jobs/pull_table_643.tex"
addNiceColors(tmpPath)
tmpPath = "/home/renata/Documents/LHCb/Dizertacka/Chapters/Toys/jobs/pull_table_644_fld.tex"
addNiceColors(tmpPath)
tmpPath = "/home/renata/Documents/LHCb/Dizertacka/Chapters/Toys/jobs/pull_table_631.tex"
addNiceColors(tmpPath)
tmpPath = "/home/renata/Documents/LHCb/Dizertacka/Chapters/Toys/jobs/pull_table_632_fld.tex"
addNiceColors(tmpPath)
printTestTable()
#if VERB: print(read_file(614)[0])
#for x in range(600,670):
# createTables(x)
#createFoldingTables([644,645,646,647,648])
#createFoldingTables([632,633,634,635,636])
#joinAllLines(649)