Note
Go to the end to download the full example code.
Writing a basf2 analysis steering file#
Hint
This example shows a basic basf2 analysis steering file within b2luigi.
import basf2 as b2
import modularAnalysis as ma
import variables.utils as vu
import vertex as vx
import b2luigi
from b2luigi.contrib.basf2 import Basf2PathTask
from Ex06_basf2_reconstruction import ReconstructionTask
@b2luigi.requires(ReconstructionTask)
class AnalysisTask(Basf2PathTask):
treeFit = b2luigi.BoolParameter(default=True)
result_dir = "results/Analysis"
def output(self):
yield self.add_to_output(f"ntuple_{self.identifier}.root")
def create_path(self):
main = b2.Path()
particle = "mu" if str(self.event_type) == "mumu" else "e"
ma.inputMdstList(
environmentType="default", filelist=self.get_input_file_names("reconstruction.root"), path=main
)
# Fill final state particles
ma.fillParticleList(decayString=f"{particle}+:fsp", cut="[abs(dr) < 2.0] and [abs(dz) < 4.0]", path=main)
ma.fillParticleList(
decayString="K+:fsp", cut="[abs(dr) < 2.0] and [abs(dz) < 4.0] and [kaonID > 0.2]", path=main
)
# reconstruct J/psi -> l+ --
ma.reconstructDecay(
decayString=f"J/psi:ll -> {particle}+:fsp {particle}-:fsp", cut="[2.92 < M < 3.22]", path=main
)
# reconstruct B+ -> J/psi K+
ma.reconstructDecay(
decayString="B+:jpsik -> J/psi:ll K+:fsp", cut="[Mbc > 5.24] and [abs(deltaE) < 0.2]", path=main
)
# Run truth matching
ma.matchMCTruth(list_name="B+:jpsik", path=main)
# Perform tree fit if requested
if self.treeFit:
vx.treeFit(list_name="B+:jpsik", conf_level=0.00, massConstraint=["J/psi"], path=main)
# Define variables to save
variables = ["Mbc", "deltaE", "chiProb", "isSignal"]
variables += vu.create_aliases_for_selected(
list_of_variables=["InvM", "M"], decay_string="B+:jpsik -> ^J/psi:ll K+:fsp", prefix="jpsi"
)
# Write variables into ntuple
ma.variablesToNtuple(
decayString="B+:jpsik",
variables=variables,
filename=self.get_output_file_name(f"ntuple_{self.identifier}.root"),
treename="Bp",
path=main,
storeEventType=False,
)
return main
if __name__ == "__main__":
b2luigi.process(AnalysisTask(n_events=10))