diff --git a/benchmarks/sampling_ecal/scripts/draw_cluster.py b/benchmarks/sampling_ecal/scripts/draw_cluster.py
index ff599f06a32ba4c20eeaf51930ed08bb95952d92..5b6c93bd21a06f409df8c2e067007cff3b8619e2 100644
--- a/benchmarks/sampling_ecal/scripts/draw_cluster.py
+++ b/benchmarks/sampling_ecal/scripts/draw_cluster.py
@@ -132,21 +132,38 @@ if __name__ == '__main__':
     # read data
     load_root_macros(args.macros)
     df = get_hits_data(args.file, args.iev, branch=args.branch)
-    dfmcp = get_mcp_simple(args.file, args.iev, 'mcparticles2')
-    vec = dfmcp[['px', 'py', 'pz']].values[0]
-    vec = vec/np.linalg.norm(vec)
-    # df = df[df['cluster'] == args.icl]
+    df = df[df['cluster'] == args.icl]
     if not len(df):
         print("Error: do not find any hits for cluster {:d} in event {:d}".format(args.icl, args.iev))
         exit(-1)
+    # convert to polar coordinates (mrad), and stack all r values
+    df['r'] = np.sqrt(df['x'].values**2 + df['y'].values**2 + df['z'].values**2)
+    df['phi'] = np.arctan2(df['y'].values, df['x'].values)*1000.
+    df['theta'] = np.arccos(df['z'].values/df['r'].values)*1000.
+    df['eta'] = -np.log(np.tan(df['theta'].values/1000./2.))
+
+    # truth
+    dfmcp = get_mcp_simple(args.file, args.iev, 'mcparticles2').iloc[0]
+    pdgbase = ROOT.TDatabasePDG()
+    inpart = pdgbase.GetParticle(int(dfmcp['pid']))
+    print("Incoming particle = {}, pdgcode = {}, charge = {}, mass = {}"\
+          .format(inpart.GetName(), inpart.PdgCode(), inpart.Charge(), inpart.Mass()))
+    # neutral particle, no need to consider magnetic field
+    if np.isclose(inpart.Charge(), 0., rtol=1e-5):
+        vec = dfmcp[['px', 'py', 'pz']].values
+    # charge particle, use the cluster center
+    else:
+        flayer = df[df['layer'] == df['layer'].min()]
+        vec = flayer[['x', 'y', 'z']].mean().values
+    vec = vec/np.linalg.norm(vec)
+
     # particle line from (0, 0, 0) to the inner Ecal surface
     length = rmin/np.sqrt(vec[0]**2 + vec[1]**2)
     pline = np.transpose(vec*np.mgrid[0:length:2j][:, np.newaxis])
-
+    cmap = truncate_colormap(plt.get_cmap('jet'), 0.1, 0.9)
 
     os.makedirs(args.outdir, exist_ok=True)
     # cluster plot
-    cmap = truncate_colormap(plt.get_cmap('jet'), 0.1, 0.9)
     fig = plt.figure(figsize=(15, 12), dpi=160)
     ax = fig.add_subplot(111, projection='3d')
     # draw particle line
@@ -183,12 +200,6 @@ if __name__ == '__main__':
 
 
     # projection plot
-    # convert to polar coordinates (mrad), and stack all r values
-    df['r'] = np.sqrt(df['x'].values**2 + df['y'].values**2 + df['z'].values**2)
-    df['phi'] = np.arctan2(df['y'].values, df['x'].values)*1000.
-    df['theta'] = np.arccos(df['z'].values/df['r'].values)*1000.
-    df['eta'] = -np.log(np.tan(df['theta'].values/1000./2.))
-
     # convert to mrad
     vecp = np.asarray([np.arccos(vec[2]), np.arctan2(vec[1], vec[0])])*1000.
     phi_rg = np.asarray([vecp[1] - args.topo_range, vecp[1] + args.topo_range])
diff --git a/benchmarks/sampling_ecal/scripts/draw_cluster_layers.py b/benchmarks/sampling_ecal/scripts/draw_cluster_layers.py
index 0e6e1fda970a85b13d39fd66bb3c67304c432b18..18ce1c2a84d3ef1fdfbb9120d4b768956f2c398a 100644
--- a/benchmarks/sampling_ecal/scripts/draw_cluster_layers.py
+++ b/benchmarks/sampling_ecal/scripts/draw_cluster_layers.py
@@ -87,15 +87,21 @@ if __name__ == '__main__':
     load_root_macros(args.macros)
     df = get_hits_data(args.file, args.iev, args.branch)
     df = df[df['cluster'] == args.icl]
+    if not len(df):
+        print("Error: do not find any hits for cluster {:d} in event {:d}".format(args.icl, args.iev))
+        exit(-1)
     # convert to polar coordinates (mrad), and stack all r values
     df['r'] = np.sqrt(df['x'].values**2 + df['y'].values**2 + df['z'].values**2)
     df['phi'] = np.arctan2(df['y'].values, df['x'].values)*1000.
     df['theta'] = np.arccos(df['z'].values/df['r'].values)*1000.
     df['eta'] = -np.log(np.tan(df['theta'].values/1000./2.))
+
+    # truth
     dfmcp = get_mcp_simple(args.file, args.iev, 'mcparticles2').iloc[0]
     pdgbase = ROOT.TDatabasePDG()
     inpart = pdgbase.GetParticle(int(dfmcp['pid']))
-    print("Incoming particle = {}, pdgcode = {}, charge = {}, mass = {}".format(inpart.GetName(), inpart.PdgCode(), inpart.Charge(), inpart.Mass()))
+    print("Incoming particle = {}, pdgcode = {}, charge = {}, mass = {}"\
+          .format(inpart.GetName(), inpart.PdgCode(), inpart.Charge(), inpart.Mass()))
     # neutral particle, no need to consider magnetic field
     if np.isclose(inpart.Charge(), 0., rtol=1e-5):
         vec = dfmcp[['px', 'py', 'pz']].values
@@ -105,15 +111,11 @@ if __name__ == '__main__':
         vec = flayer[['x', 'y', 'z']].mean().values
     vec = vec/np.linalg.norm(vec)
 
-    if not len(df):
-        print("Error: do not find any hits for cluster {:d} in event {:d}".format(args.icl, args.iev))
-        exit(-1)
     # particle line from (0, 0, 0) to the inner Ecal surface
     length = rmin/np.sqrt(vec[0]**2 + vec[1]**2)
     pline = np.transpose(vec*np.mgrid[0:length:2j][:, np.newaxis])
     cmap = truncate_colormap(plt.get_cmap('jet'), 0.1, 0.9)
 
-
     # convert truth to mrad
     vecp = np.asarray([np.arccos(vec[2]), np.arctan2(vec[1], vec[0])])*1000.
     phi_rg = np.asarray([vecp[1] - args.topo_range, vecp[1] + args.topo_range])