Offline Analysis#

Generally, a b2luigi task is written as a python class and contains requires() and output(), which respectively require other tasks as input and specify output files. For most tasks, run() generates the output files from the input files. The offline-analysis might then look like this:

Listing 3.1 offlineanalysis.py#
 1# @cond
 2import b2luigi as luigi
 3from b2luigi.basf2_helper import Basf2nTupleMergeTask
 4from reconstruction import ReconstructionWrapper
 5import uproot
 6import matplotlib.pyplot as plt
 7
 8
 9class MergeFiles(Basf2nTupleMergeTask):
10    batch_system = 'local'
11    projectName = luigi.Parameter()
12
13    def requires(self):
14        skims = open(f"../{self.projectName}skims.dat", 'r')
15        for skim in skims.read().splitlines():
16            yield ReconstructionWrapper(skim=skim, projectName=self.projectName)
17
18
19class Plot(luigi.Task):
20    batch_system = 'local'
21
22    def requires(self):
23        data = {}
24        data.update({"bmesons": MergeFiles(projectName="bmesons")})
25        data.update({"qqcontinuum": MergeFiles(projectName="qqcontinuum")})
26        return data
27
28    def output(self):
29        yield self.add_to_output("Mbc.jpg")
30        yield self.add_to_output("deltaE.jpg")
31
32    def run(self):
33        treeName = 'BtoPiDtoKPiPi'
34        some_variables = ["Mbc", "deltaE"]
35        BBdata = self.requires()["bmesons"].get_output_file_name("reco.root")
36        QQdata = self.requires()["qqcontinuum"].get_output_file_name("reco.root")
37        BBtuple = uproot.open(f"{BBdata}:{treeName}")
38        QQtuple = uproot.open(f"{QQdata}:{treeName}")
39
40        for var in some_variables:
41            plt.hist([QQtuple[var].array(), BBtuple[var].array()], label=["uudd Continuum", "mixed B mesons"], stacked=True)
42            plt.legend(loc='best')
43            plt.xlabel(f"{var} [GeV]")
44            plt.savefig(self.get_output_file_name(f"{var}.jpg"), dpi=100)
45            plt.close()
46# @endcond

The MergeFiles task employs b2luigi.basf2_helper.Basf2nTupleMergeTask to merge the reconstructed nTuples for all skims specified in qqcontinuumskims.dat for quark-antiquark continuum and bmesonsskims.dat for B mesons.

Listing 3.2 ../qqcontinuumskims.dat#
1/belle/MC/release-05-02-00/DB00001330/MC14ri_d/prod00021635/s00/e1003/4S/r00000/uubar/mdst
2/belle/MC/release-05-02-00/DB00001330/MC14ri_d/prod00021636/s00/e1003/4S/r00000/ddbar/mdst
Listing 3.3 ../bmesonsskims.dat#
1/belle/MC/release-05-02-00/DB00001330/MC14ri_d/prod00021752/s00/e1003/4S/r00000/charged/mdst
2/belle/MC/release-05-02-00/DB00001330/MC14ri_d/prod00021641/s00/e1003/4S/r00000/mixed/mdst