Source code for toor.GateLink.RootToTor.rootjoiner
import uproot
from uproot.exceptions import KeyInFileError
import glob
import os
[docs]
class RootJoiner:
def __init__(self, file_path, path_to_save=None, tree_name="Singles", double_scanner_format=False):
self.file_path = file_path
self.path_to_save = path_to_save
if self.path_to_save is None:
self.path_to_save = self.file_path
self.tree_name = tree_name
self.double_scanner_format = double_scanner_format
self._rootFiles = glob.glob(os.path.join(file_path, "*.root"))
self._rootFiles.sort()
if self.double_scanner_format:
self._rootFiles_scanner1= [f"{el}:SinglesScanner1" for el in self._rootFiles]
self._rootFiles_scanner2 = [f"{el}:SinglesScanner2" for el in self._rootFiles]
self._globalArray_scanner1 = None
self._globalArray_scanner2 = None
else:
self._rootFiles = [f"{el}:{tree_name}" for el in self._rootFiles]
self._globalArray = None
[docs]
def chooseJustFilteredData(self):
# filter files which has filtered in the late part of the name
self._rootFiles = [el for el in self._rootFiles if "filtered" in el]
[docs]
def join(self):
print("Joining root files")
print("Number of files: ", len(self._rootFiles))
if self.double_scanner_format:
print("Double scanner format")
self._globalArray_scanner1 = uproot.concatenate(self._rootFiles_scanner1)
self._globalArray_scanner2 = uproot.concatenate(self._rootFiles_scanner2)
print("Saving joined root file")
# try:
#
# del self._globalArray_scanner1["level1ID"]
# del self._globalArray_scanner1["level2ID"]
# del self._globalArray_scanner2["level1ID"]
# del self._globalArray_scanner2["level2ID"]
#
# except KeyInFileError:
# pass
root = uproot.recreate(os.path.join(self.path_to_save, "joined.root"))
root["SinglesScanner1"] = self._globalArray_scanner1
root["SinglesScanner2"] = self._globalArray_scanner2
print("End of join")
else:
self._globalArray = uproot.concatenate(self._rootFiles)
# try:
# del self._globalArray["comptVolName"]
# del self._globalArray["RayleighVolName"]
#
# except AttributeError:
# pass
print("Saving joined root file")
# try:
root = uproot.create(os.path.join(self.path_to_save, "joined.root"))
# except OSError:
# # delete the file and create a new one
# os.remove(os.path.join(self.path_to_save, "joined.root"))
# root = uproot.create(os.path.join(self.path_to_save, "joined.root"))
# root[self.tree_name] = self._globalArray
root["Singles"] = self._globalArray
print("End of join")
root.close()
@property
def globalArray(self):
return self._globalArray
@property
def globalArray_scanner1(self):
return self._globalArray_scanner1
@property
def globalArray_scanner2(self):
return self._globalArray_scanner2
if __name__ == "__main__":
filePath = "C:\\Users\\pedro\\OneDrive - Universidade de Aveiro\\SimulacoesGATE\\EasyPET3D64\\FOV-UniformSource\\20-December-2022_17h23_8turn_0p005s_1p80bot_0p23top_range108\\"
rootJoiner = RootJoiner(file_path=filePath, tree_name="SinglesScanner1")
rootJoiner.chooseJustFilteredData()
rootJoiner.join()