Add St Corner for datasets; fix 3x3 cluster finding algorithm

This commit is contained in:
2026-04-21 10:40:56 +02:00
parent c25c9c31d5
commit d71fd6f6b4
2 changed files with 16 additions and 10 deletions
+15 -9
View File
@@ -20,7 +20,9 @@ def init(cfg):
global _cfg
global _aduToKev3DMap
_cfg = cfg
_aduToKev3DMap = np.load(cfg['caliFileName'])
NX, NY = cfg['NX'], cfg['NY']
St_x, St_y = cfg.get('StCorner', [0, 0]) ### with default corner at (0, 0)
_aduToKev3DMap = np.load(cfg['caliFileName'])[:, St_y:St_y+NY, St_x:St_x+NX]
Roi = cfg['Roi']
global nChunks
nChunks = _cfg.get('NChunks', 16)
@@ -265,6 +267,7 @@ def _processFrames(idxChunk): ### for both single and double photon events, usin
sumFrame += signalEneFrame
signalEneFrame = signalEneFrame[Roi[2]:Roi[3], Roi[0]:Roi[1]]
_signalEneFrame = np.copy(signalEneFrame) ### make a copy of the original energy frame for cluster energy correction later, since the cluster finder will modify the input energy frame
CF.find_clusters_X(signalEneFrame)
clusters = CF.hits()
for idxCluster in range(len(clusters)):
@@ -277,8 +280,8 @@ def _processFrames(idxChunk): ### for both single and double photon events, usin
### single photon events
if Energy - selectionRange < energy < Energy + selectionRange:
ref_x = clusters['col'][idxCluster] - 1 ### refered to the lower-left corner of the cluster
ref_y = clusters['row'][idxCluster] - 1
ref_x = clusters['col'][idxCluster] - clusterSize1Photon//2 ### refered to the lower-left corner of the cluster
ref_y = clusters['row'][idxCluster] - clusterSize1Photon//2
if int(ref_x) < 0 or int(ref_x)+clusterSize1Photon > signalEneFrame.shape[1] or int(ref_y) < 0 or int(ref_y)+clusterSize1Photon > signalEneFrame.shape[0]:
continue ### skip clusters too close to the border
for i in range(len(xs)):
@@ -290,16 +293,19 @@ def _processFrames(idxChunk): ### for both single and double photon events, usin
_hists['h1_1PhotonClusterDiameterY'].Fill(diameterY)
cluster_1Photon = np.zeros((clusterSize1Photon, clusterSize1Photon), dtype=np.float32)
# for i in range(len(xs)):
### var cluster is less accurate than the 3x3 fixed cluster, since the zero pixels are incontinuous, not friendly for ML.
# for i in range(len(xs)):
# x_rel = xs[i] - int(ref_x)
# y_rel = ys[i] - int(ref_y)
# _hists['h1_1PhotonClusterPixelEnergy'].Fill(enes[i])
# # _hists['h1_1PhotonClusterPixelEnergy'].Fill(enes[i])
# if 0 <= x_rel < clusterSize1Photon and 0 <= y_rel < clusterSize1Photon:
# cluster_1Photon[y_rel, x_rel] = enes[i]
cluster_1Photon = signalEneFrame[int(ref_y):int(ref_y)+clusterSize1Photon, int(ref_x):int(ref_x)+clusterSize1Photon]
_hists['h1_1PhotonClusterEnergy'].Fill(np.sum(cluster_1Photon)) # use the sum of 3x3 cluster as the cluster energy for single photon events, which is more accurate than the original cluster energy given by the cluster finder, since the cluster finder may miss some pixels with low energy far from the center pixel
for i in range(3):
for j in range(3):
# use the sum of 3x3 cluster as the cluster energy for single photon events, which is more accurate than the original cluster energy given by the cluster finder, since the cluster finder may miss some pixels with low energy far from the center pixel
cluster_1Photon = _signalEneFrame[int(ref_y):int(ref_y)+clusterSize1Photon, int(ref_x):int(ref_x)+clusterSize1Photon]
_hists['h1_1PhotonClusterEnergy'].Fill(np.sum(cluster_1Photon))
for i in range(clusterSize1Photon):
for j in range(clusterSize1Photon):
_hists['h2_1PhotonSumSample'].Fill(i, j, cluster_1Photon[i, j])
if 'writeClusters' in _cfg and _cfg['writeClusters'] == True:
cluster_1Photon_list.append(cluster_1Photon)