9 from ROOT
import Belle2
13 from variables
import variables
as variable_manager
14 from variables
import std_vector
17 Python uilities to help create or manage ntuples and work with them in pandas
23 Dump variables directly to HDF5
25 This Module is the equivalent of VariablesToNtuple but creates an hdf5 file
26 instead of a root file. It is slower as it is implemented in pure python and
27 should currently be considered a proof of concept.
30 def __init__(self, listname, variables, filename):
31 """Constructor to initialize the internal state
34 listname(str): name of the particle list
35 variables(list(str)): list of variables to save for each particle
36 filename(str): name of the hdf5 file to be created
47 """Create the hdf5 file and list of variable objects to be used during
50 self.
_varnames_varnames = [str(varname)
for varname
in variable_manager.resolveCollections(std_vector(*self.
_variables_variables))]
59 self.
_plist_plist.isRequired()
62 self.
_hdf5file_hdf5file = tables.open_file(self.
_filename_filename, mode=
"w", title=
"Belle2 Variables to HDF5")
64 basf2.B2ERROR(
"Cannot create output file")
67 dtype = [(
"exp", np.int32), (
"run", np.int32), (
"evt", np.uint32),
68 (
"prod", np.uint32), (
"icand", np.uint32), (
"ncand", np.uint32)]
71 dtype.append((name, np.float64))
75 filters = tables.Filters(complevel=1, complib=
'blosc:lz4', fletcher32=
False)
78 with warnings.catch_warnings():
79 warnings.simplefilter(
"ignore")
81 self.
_table_table = self.
_hdf5file_hdf5file.create_table(
"/", self.
_listname_listname, obj=np.zeros(0, dtype), filters=filters)
84 """Create a new row in the hdf5 file with for each particle in the list"""
85 buf = np.empty(self.
_plist_plist.getListSize(), dtype=self.
_dtype_dtype)
87 buf[
"exp"] = self.
_evtmeta_evtmeta.getExperiment()
89 buf[
"evt"] = self.
_evtmeta_evtmeta.getEvent()
90 buf[
"prod"] = self.
_evtmeta_evtmeta.getProduction()
91 buf[
"ncand"] = len(buf)
92 buf[
"icand"] = np.arange(len(buf))
94 for row, p
in zip(buf, self.
_plist_plist):
99 row[name] = variable_manager.evaluate(v.name, p)
101 self.
_table_table.append(buf)
104 """save and close the output"""
109 def make_mcerrors_readable(dataframe, column="mcErrors"):
111 Take a dataframe containing an column with the output of the :b2:var:`mcErrors`
112 variable from :b2:mod:`VariablesToNTuple` and convert it to a readable set
113 of columns of the form ``{column}_{name}`` where column is the value of the
114 ``column`` argument and ``name`` is one of one of the :ref:`mcmatching`
115 error flags (without the leading 'c_').
118 dataframe(pandas.DataFrame): the pandas dataframe containing an ntuple
119 with column containing the output of the mcErrors variable
120 column(str): the name containing the values from the mcErrors variable
123 if column
not in dataframe:
124 raise KeyError(f
"Cannot find coulumn '{column}'")
127 mcErrors = dataframe[column].astype(int)
138 name = column + flag[1:]
140 dataframe[name] = mcErrors == 0
142 dataframe[name] = (mcErrors & value) == value
147 if __name__ ==
"__main__":
148 import modularAnalysis
150 p = basf2.create_path()
151 p.add_module(
"EventInfoSetter", evtNumList=100)
152 p.add_module(
"EvtGenInput")
154 a =
VariablesToHDF5(
"pi-:gen", [
"M",
"E",
"px",
"py",
"pz"],
"test.hdf5")
158 print(basf2.statistics)
a (simplified) python wrapper for StoreObjPtr.
_filename
Output filename.
_variables
List of variables.
_plist
Pointer to the particle list.
_var_objects
variable objects for each variable
_listname
Particle list name.
def __init__(self, listname, variables, filename)
static ExpRun getRun(map< ExpRun, pair< double, double >> runs, double t)
Get exp number + run number from time.
def fillParticleListsFromMC(decayStringsWithCuts, addDaughters=False, skipNonPrimaryDaughters=False, writeOut=False, path=None)
Functions to perform Monte Carlo matching for reconstructed Particles.