import os
import numpy as np
import uproot
from toor.GateLink.RootToTor import ReadRootFile
[docs]
class AddMotorInfoToRoot(ReadRootFile):
def __init__(self, filename=None, doubleScannerFormat=True, path_to_macs=None):
super().__init__(filename=filename)
if filename is None:
return
# self._filename = filename
if path_to_macs is None:
self._directory = os.path.dirname(filename)
else:
self._directory = path_to_macs
self._flat_tree = None
self._bottomMotor = None
self._topMotor = None
self._bottomMotorFileName = os.path.join(self._directory, "positionsScanner1.mac")
self._topMotorFileName = os.path.join(self._directory, "positions.mac")
self._bottomMotorToSaveSinglesScanner1 = None
self._bottomMotorToSaveSinglesScanner2 = None
self._topMotorToSaveSinglesScanner1 = None
self._topMotorToSaveSinglesScanner2 = None
self._bottomMotorToSaveSingles = None
self._topMotorToSaveSingles = None
# self._singlesScanner1 = None
# self._singlesScanner2 = None
# self._singles = None
self._timeincrement = 0.005
[docs]
def readMotorFiles(self):
print("Reading motor files: {} and {}".format(self._bottomMotorFileName, self._topMotorFileName))
with open(self._bottomMotorFileName, "r") as f:
self._bottomMotor = f.readlines()
self._bottomMotor = [np.array(self._bottomMotor[i].split(" "), dtype=np.float32) for i in
range(8, len(self._bottomMotor))]
self._bottomMotor = np.array(self._bottomMotor)
self._bottomMotor = self._bottomMotor[:, :2]
self._bottomMotor[:, 1] = np.round(self._bottomMotor[:, 1], 3)
self._timeincrement = self._bottomMotor[1, 0] - self._bottomMotor[0, 0]
with open(self._topMotorFileName, "r") as f:
self._topMotor = f.readlines()
self._topMotor = [np.array(self._topMotor[i].split(" "), dtype=np.float32) for i in
range(8, len(self._topMotor))]
self._topMotor = np.array(self._topMotor)
self._topMotor = self._topMotor[:, :2]
self._topMotor[:, 1] = np.round(self._topMotor[:, 1], 3)
[docs]
def createMotorArrays(self):
print("Creating motor arrays")
if self.doubleScannerFormat:
indexesSingleScanner1 = (self._singlesScanner1.time / self._timeincrement-1).astype(np.int32)
indexesSingleScanner2 = (self._singlesScanner2.time / self._timeincrement-1).astype(np.int32)
self._bottomMotorToSaveSinglesScanner1 = self._bottomMotor[indexesSingleScanner1, 1]
self._topMotorToSaveSinglesScanner1 = self._topMotor[indexesSingleScanner1, 1]
self._bottomMotorToSaveSinglesScanner2 = self._bottomMotor[indexesSingleScanner2, 1]
self._topMotorToSaveSinglesScanner2 = self._topMotor[indexesSingleScanner2, 1]
else:
indexesSingle = (self._singles.time / self._timeincrement).astype(np.int32)
self._bottomMotorToSaveSingles = self._bottomMotor[indexesSingle, 1]
self._topMotorToSaveSingles = self._topMotor[indexesSingle, 1]
[docs]
def saveMotorArraysIntoRoot(self, array_keys):
print("Saving motor arrays into root file: {}".format(self._filename))
if self.doubleScannerFormat:
temp_scanner1 = [getattr(self._singlesScanner1, array_keys[i]) for i in range(len(array_keys))]
temp_scanner2 = [getattr(self._singlesScanner2, array_keys[i]) for i in range(len(array_keys))]
dictToSingles = {array_keys[i]: np.hstack((temp_scanner1[i], temp_scanner2[i])) for i in range(len(array_keys))}
dictToSingles["level1ID"] = np.hstack((self._bottomMotorToSaveSinglesScanner1, self._bottomMotorToSaveSinglesScanner2))
dictToSingles["level2ID"] = np.hstack((self._topMotorToSaveSinglesScanner1, self._topMotorToSaveSinglesScanner2))
else:
dictToSingles = {array_keys[i]: getattr(self._singles, array_keys[i]) for i in range(len(array_keys))}
dictToSingles["level1ID"] = self._bottomMotorToSaveSingles
dictToSingles["level2ID"] = self._topMotorToSaveSingles
name_folder = os.path.join(os.path.dirname(self._filename),"motors_added")
if not os.path.exists(name_folder):
os.mkdir(name_folder)
name_file = os.path.basename(self._filename).split(".")[0]
file = os.path.join(name_folder, f"{name_file}_copy.root")
self._filename = file
# self._filename = "easyPET_part0_copy.root"
with uproot.recreate(self._filename) as root_file:
# if self.doubleScannerFormat:
# root_file["SinglesScanner1"] = dictToRootSinglesScanner1
# root_file["SinglesScanner2"] = dictToRootSinglesScanner2
# else:
root_file["Singles"] = dictToSingles
if __name__ == "__main__":
file_path = "/home/crispim/Documentos/Simulations/"
root_file = "easyPET_part0(1).root"
file_path = "C:\\Users\\pedro\\OneDrive - Universidade de Aveiro\\SimulacoesGATE\\EasyPET3D64\\StaticAquisition\\17-Jan-2023_14h30_1turn_0p25s_180p0bot_0p9top_range0.9"
root_file = "coincidences_0.root"
arrays_keys = ['time', 'baseID', 'runID', 'eventID', 'sourcePosX', 'sourcePosY', 'sourcePosZ', 'energy',
'globalPosX', 'globalPosY',
'globalPosZ', 'level1ID', 'level2ID', 'level3ID', 'level4ID']
rootFile = AddMotorInfoToRoot(filename=os.path.join(file_path, root_file))
rootFile.readRoot()
rootFile.setArraysToConvert(rootFile.singlesScanner1, arrays_keys)
rootFile.setArraysToConvert(rootFile.singlesScanner2, arrays_keys)
rootFile.readMotorFiles()
rootFile.createMotorArrays()
rootFile.saveMotorArraysIntoRoot(arrays_keys)
import matplotlib.pyplot as plt
plt.hist2d(rootFile._bottomMotorToSaveSinglesScanner1, rootFile._topMotorToSaveSinglesScanner1,
bins=[np.unique(rootFile._bottomMotorToSaveSinglesScanner1),
np.unique(rootFile._topMotorToSaveSinglesScanner1)])
plt.show()
# rootFile.saveMotorArraysIntoRoot()