From 6d149d38d6adc0254c715e46521fdb6923988508 Mon Sep 17 00:00:00 2001 From: Zeyu Zhang Date: Wed, 25 Mar 2026 10:13:49 -0400 Subject: [PATCH 1/2] correct the calculation of z positions of clusters and docaclusters --- .../org/jlab/rec/ahdc/Cluster/Cluster.java | 35 ++++++++++++++++--- .../ahdc/DocaCluster/DocaClusterRefiner.java | 7 ++-- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java index c985eb968f..3e50b37d37 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java @@ -4,6 +4,9 @@ import org.jlab.rec.ahdc.PreCluster.PreCluster; import java.util.ArrayList; +import org.jlab.geom.detector.alert.AHDC.AlertDCFactory; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; /** * Cluster are compose by 2 PreCluster on layer with a different stereo angle @@ -11,9 +14,9 @@ public class Cluster { private int _trackId = -1; - private double _StereoAngle = 20.0; - private double _DeltaZ = 300.0; - private double _Zoffset = 150.0; + private double _StereoAngle = 20.0;//not used + private double _DeltaZ = 300;//not used + private double _Zoffset = 150;//not used private double _Radius; private double _Phi; @@ -26,6 +29,23 @@ public class Cluster { private double _V; private ArrayList _PreClusters_list; + private static Line3D representativeLine(PreCluster pc) { + if (pc == null || pc.get_hits_list() == null || pc.get_hits_list().isEmpty()) { + return null; + } + Hit h = pc.get_hits_list().get(0); + return h.getLine(); + } + public static double getStereoAngleDeg(int superlayerId) { + switch (superlayerId) { + case 0: return -19.1489; + case 1: return -19.2857; + case 2: return -20.0; + case 3: return -20.6897; + case 4: return -20.0; + default: return -20.0; + } + } public Cluster(PreCluster precluster, PreCluster other_precluster) { this._PreClusters_list = new ArrayList<>(); @@ -33,7 +53,14 @@ public Cluster(PreCluster precluster, PreCluster other_precluster) { _PreClusters_list.add(other_precluster); this._Radius = (precluster.get_Radius() + other_precluster.get_Radius()) / 2; - this._Z = ((other_precluster.get_Phi() - precluster.get_Phi()) / (Math.toRadians(_StereoAngle) * Math.pow(-1, precluster.get_Super_layer()-1) - Math.toRadians(_StereoAngle) * Math.pow(-1, other_precluster.get_Super_layer()-1))) * _DeltaZ - _Zoffset; + Line3D line1 = representativeLine(precluster); + Point3D end1 = line1.end(); + Point3D start1 = line1.origin(); + double DeltaZ = end1.z()-start1.z(); + double Zref = end1.z(); + double StereoAnglep = getStereoAngleDeg(precluster.get_Super_layer()); + double StereoAngleo = getStereoAngleDeg(other_precluster.get_Super_layer()); + this._Z = ((precluster.get_Phi() - other_precluster.get_Phi()) / (Math.toRadians(StereoAnglep) * Math.pow(-1, precluster.get_Super_layer()-1) - Math.toRadians(StereoAngleo) * Math.pow(-1, other_precluster.get_Super_layer()-1))) * DeltaZ + Zref; double x1 = -precluster.get_Radius() * Math.sin(precluster.get_Phi()); double y1 = -precluster.get_Radius() * Math.cos(precluster.get_Phi()); diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java index 504d41572f..1491f0a96e 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/DocaCluster/DocaClusterRefiner.java @@ -209,9 +209,10 @@ private static Line3D buildShiftedWireLine(Hit h, Vec2 tangentXY) { double dz = e.z() - o.z(); // New origin: (tangent.x, tangent.y, original_z) - Point3D oShift = new Point3D(tangentXY.x, tangentXY.y, o.z()); - Point3D eShift = new Point3D(oShift.x() + dx, oShift.y() + dy, oShift.z() + dz); - + //Point3D oShift = new Point3D(tangentXY.x, tangentXY.y, o.z()); + //Point3D eShift = new Point3D(oShift.x() + dx, oShift.y() + dy, oShift.z() + dz); + Point3D eShift = new Point3D(tangentXY.x, tangentXY.y, e.z()); + Point3D oShift = new Point3D(tangentXY.x - dx, tangentXY.y - dy, e.z() - dz); return new Line3D(oShift, eShift); } From 8569a8ebb50728e97032a61a137bd3c08faa94e6 Mon Sep 17 00:00:00 2001 From: Zeyu Zhang Date: Thu, 2 Apr 2026 06:27:54 -0400 Subject: [PATCH 2/2] calculate stereoangle with line information --- .../org/jlab/rec/ahdc/Cluster/Cluster.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java index 3e50b37d37..1163b2df7f 100644 --- a/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java +++ b/reconstruction/alert/src/main/java/org/jlab/rec/ahdc/Cluster/Cluster.java @@ -36,17 +36,24 @@ private static Line3D representativeLine(PreCluster pc) { Hit h = pc.get_hits_list().get(0); return h.getLine(); } - public static double getStereoAngleDeg(int superlayerId) { - switch (superlayerId) { - case 0: return -19.1489; - case 1: return -19.2857; - case 2: return -20.0; - case 3: return -20.6897; - case 4: return -20.0; - default: return -20.0; + private static double wrapPi(double a) { + while (a > Math.PI) a -= 2.0 * Math.PI; + while (a < -Math.PI) a += 2.0 * Math.PI; + return a; + } + private static double stereoTwistFromLine(Line3D line) { + if (line == null) { + return 0.0; } - } + Point3D p0 = line.origin(); + Point3D p1 = line.end(); + + double phi0 = Math.atan2(p0.y(), p0.x()); + double phi1 = Math.atan2(p1.y(), p1.x()); + + return wrapPi(phi1 - phi0); + } public Cluster(PreCluster precluster, PreCluster other_precluster) { this._PreClusters_list = new ArrayList<>(); _PreClusters_list.add(precluster); @@ -54,13 +61,14 @@ public Cluster(PreCluster precluster, PreCluster other_precluster) { this._Radius = (precluster.get_Radius() + other_precluster.get_Radius()) / 2; Line3D line1 = representativeLine(precluster); + Line3D line2 = representativeLine(other_precluster); Point3D end1 = line1.end(); Point3D start1 = line1.origin(); double DeltaZ = end1.z()-start1.z(); double Zref = end1.z(); - double StereoAnglep = getStereoAngleDeg(precluster.get_Super_layer()); - double StereoAngleo = getStereoAngleDeg(other_precluster.get_Super_layer()); - this._Z = ((precluster.get_Phi() - other_precluster.get_Phi()) / (Math.toRadians(StereoAnglep) * Math.pow(-1, precluster.get_Super_layer()-1) - Math.toRadians(StereoAngleo) * Math.pow(-1, other_precluster.get_Super_layer()-1))) * DeltaZ + Zref; + double StereoAnglep = stereoTwistFromLine(line1); + double StereoAngleo = stereoTwistFromLine(line2); + this._Z = ((precluster.get_Phi() - other_precluster.get_Phi()) / (StereoAnglep - StereoAngleo)) * DeltaZ + Zref; double x1 = -precluster.get_Radius() * Math.sin(precluster.get_Phi()); double y1 = -precluster.get_Radius() * Math.cos(precluster.get_Phi());