From b807c34aa4a9a6d81414bdb9dea69194fba2975b Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Thu, 9 May 2024 16:04:38 -0400 Subject: [PATCH 01/15] update DC clustering --- .../java/org/jlab/rec/dc/cluster/Cluster.java | 36 +++++- .../dc/cluster/ClusterCleanerUtilities.java | 103 +++++++++++++++++- .../jlab/rec/dc/cluster/ClusterFinder.java | 55 ++++++---- 3 files changed, 168 insertions(+), 26 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/Cluster.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/Cluster.java index eb972c03ac..735fc111aa 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/Cluster.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/Cluster.java @@ -18,7 +18,9 @@ public class Cluster extends ArrayList { private int _Sector; // sector[1...6] private int _Superlayer; // superlayer [1,...6] private int _Id; // cluster Id - + private int _MinWire; + private int _MaxWire; + /** * * @param sector the sector (1...6) @@ -107,6 +109,38 @@ public int get_RegionSlayer() { return (this._Superlayer + 1) % 2 + 1; } + /** + * + * @return the min wire of the cluster (1...112) + */ + public int get_MinWire() { + return _MinWire; + } + + /** + * + * @param _MinWire min wire of the cluster (1...112) + */ + public void set_MinWire(int _MinWire) { + this._MinWire = _MinWire; + } + + /** + * + * @return the max wire of the cluster (1...112) + */ + public int get_MaxWire() { + return _MaxWire; + } + + /** + * + * @param _MaxWire max wire of the cluster (1...112) + */ + public void set_MaxWire(int _MaxWire) { + this._MaxWire = _MaxWire; + } + /** * * @return cluster info. about location and number of hits contained in it diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index e27e639ae0..64df8c6e58 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -137,7 +137,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI // loop over accumulator array to find peaks (allows for more than one peak for multiple tracks) // The accumulator cell count must be at least half the total number of hits // Make binrMax, bintMax arrays to allow for more than one peak - int threshold = Constants.DC_MIN_NLAYERS; + int threshold = Constants.DC_MIN_NLAYERS-1; int nbPeaksR_Phi = 0; // 1st find the peaks in the R_Phi accumulator array @@ -145,7 +145,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI for (int ibint1 = 0; ibint1 < N_t; ibint1++) { //find the peak - if (R_Phi_Accumul[ibinr1][ibint1] >= Constants.DC_MIN_NLAYERS) { + if (R_Phi_Accumul[ibinr1][ibint1] >= Constants.DC_MIN_NLAYERS-1) { if (R_Phi_Accumul[ibinr1][ibint1] > threshold) { threshold = R_Phi_Accumul[ibinr1][ibint1]; @@ -171,7 +171,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI //remove all existing hits and add only the ones passing the criteria below //newClus.removeAll(clus); for (int i = 0; i < clus.size(); i++) { - double rho = clus.get(i).get_X(); + double rho = clus.get(i).get_lX(); double phi = clus.get(i).get_lY(); for (int j_t = 0; j_t < N_t; j_t++) { @@ -205,7 +205,8 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI } } //require 4 layers to make a cluster - if (count_nlayers_in_cluster(contigArrayOfHits) < Constants.DC_MIN_NLAYERS) { + if ((!isExceptionalCluster(contigArrayOfHits) && count_nlayers_in_cluster(contigArrayOfHits) < Constants.DC_MIN_NLAYERS) + || (isExceptionalCluster(contigArrayOfHits) && count_nlayers_in_cluster(contigArrayOfHits) < Constants.DC_MIN_NLAYERS - 1)) { passCluster = false; } @@ -731,7 +732,8 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List hitsInClus){ + // count hits in each layer + int nlayr = 6; + int[] nlayers = new int[nlayr]; + for (int l = 0; l < nlayr; l++) { + nlayers[l] = 0; + for (int h = 0; h < hitsInClus.size(); h++) { + if (hitsInClus.get(h).get_Layer() == l + 1) { + nlayers[l]++; + } + } + } + + boolean flag_hasSkippedLayer = false; + if((nlayers[0] == 0 && nlayers[1] == 0) || (nlayers[4] == 0 && nlayers[5] == 0)){ + flag_hasSkippedLayer = true; + } + else{ + for (int l = 0; l < 4; l++) { + if (nlayers[l] > 0 && nlayers[l+1] == 0) { + flag_hasSkippedLayer = true; + break; + } + } + } + + return flag_hasSkippedLayer; + } + + /* + * @param hitsInClus the hits in a cluster + * @return if one or more layers are skipped in the cluster + */ + public boolean isExceptionalFittedCluster(List hitsInClus){ + // count hits in each layer + int nlayr = 6; + int[] nlayers = new int[nlayr]; + for (int l = 0; l < nlayr; l++) { + nlayers[l] = 0; + for (int h = 0; h < hitsInClus.size(); h++) { + if (hitsInClus.get(h).get_Layer() == l + 1) { + nlayers[l]++; + } + } + } + + boolean flag_hasSkippedLayer = false; + if((nlayers[0] == 0 && nlayers[1] == 0) || (nlayers[4] == 0 && nlayers[5] == 0)){ + flag_hasSkippedLayer = true; + } + else{ + for (int l = 0; l < 4; l++) { + if (nlayers[l] > 0 && nlayers[l+1] == 0) { + flag_hasSkippedLayer = true; + break; + } + } + } + + return flag_hasSkippedLayer; + } + + public Cluster ClusterSticher(Cluster thisclus, Cluster nextclus, int cid){ + ClusterFitter cf = new ClusterFitter(); + + // Two clusters must be in the same sector and the same superlayer + if((thisclus.get_Sector() != nextclus.get_Sector()) || (thisclus.get_Superlayer() != nextclus.get_Superlayer())) return null; + + // Dont take stiching if number of layers in two clusters less than 3 + if((count_nlayers_in_cluster(thisclus) + count_nlayers_in_cluster(nextclus)) < 3) return null; + + // Only allow one-wire skipped + if((nextclus.get_MinWire() - thisclus.get_MaxWire() != 2)) return null; + + Cluster stichedcluster = new Cluster(thisclus.get_Sector(), thisclus.get_Superlayer(), cid); + stichedcluster.addAll(thisclus); + stichedcluster.addAll(nextclus); + + if ((!isExceptionalCluster(stichedcluster) && count_nlayers_in_cluster(stichedcluster) < Constants.DC_MIN_NLAYERS) + || (isExceptionalCluster(stichedcluster) && count_nlayers_in_cluster(stichedcluster) < Constants.DC_MIN_NLAYERS - 1)) + return null; + + return stichedcluster; + + } } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index d6df1944f7..b25d496ada 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -109,7 +109,7 @@ public List findClumps(List allhits, ClusterCleanerUtilities ct) { Collections.sort(allhits); List clumps = new ArrayList<>(); - + // looping over each superlayer in each sector // each superlayer is treated independently int cid = 1; // cluster id, will increment with each new good cluster @@ -143,15 +143,15 @@ public List findClumps(List allhits, ClusterCleanerUtilities ct) { wi++; } - - // Need at least MIN_NLAYERS - if (ct.count_nlayers_in_cluster(hits) >= Constants.DC_MIN_NLAYERS) { - - // cluster constructor DCCluster(hit.sector,hit.superlayer, cid) + + // Need at least DC_MIN_NLAYERS layers if no skipped layer or at meast DC_MIN_NLAYERS - 1 layers if with skipped layer + if ((!ct.isExceptionalCluster(hits) && ct.count_nlayers_in_cluster(hits) >= Constants.DC_MIN_NLAYERS) + || (ct.isExceptionalCluster(hits) && ct.count_nlayers_in_cluster(hits) >= Constants.DC_MIN_NLAYERS - 1)) { + // cluster constructor DCCluster(hit.sector,hit.superlayer, cid) Cluster this_cluster = new Cluster((int) (ssl / nsect) + 1, (int) (ssl % nsect) + 1, cid++); //LOGGER.log(Level.FINER, " created cluster "+this_cluster.printInfo()); this_cluster.addAll(hits); - + clumps.add(this_cluster); } @@ -161,7 +161,7 @@ public List findClumps(List allhits, ClusterCleanerUtilities ct) { wi++; } - } + } return clumps; } @@ -182,6 +182,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //find clumps of hits init List clusters = this.findClumps(allhits, ct); + /* allhits.clear(); for (Cluster clus : clusters) { @@ -192,12 +193,19 @@ public List FindHitBasedClusters(List allhits, ClusterCleane this.fillHitArray(allhits, 0); clusters.clear(); clusters = this.findClumps(allhits, ct); + */ + + //Sort hits in clusters + for (Cluster clus : clusters) { + Collections.sort(clus); + } // create cluster list to be fitted List selectedClusList = new ArrayList<>(); - for (Cluster clus : clusters) { - if(clus.size() FindHitBasedClusters(List allhits, ClusterCleane // ct.outOfTimersRemover(fClus, false); // correct outoftimers //} // add cluster - if(fClus.size() FindHitBasedClusters(List allhits, ClusterCleane cf.SetFitArray(clus, "LC"); cf.Fit(clus, true); - if(clus.get_fitProb() FindHitBasedClusters(List allhits, ClusterCleane ArrayList rmHits = new ArrayList(); for (FittedCluster clus : fittedClusList) { - if (clus != null && clus.size() > 3 && clus.get_fitProb()>Constants.HITBASEDTRKGMINFITHI2PROB) { + if (clus != null && ((!ct.isExceptionalFittedCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS) || + (ct.isExceptionalFittedCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS-1)) && clus.get_fitProb()>Constants.HITBASEDTRKGMINFITHI2PROB) { // update the hits for (FittedHit fhit : clus) { @@ -283,9 +293,12 @@ public List FindHitBasedClusters(List allhits, ClusterCleane } - public List RecomposeClusters(Map> grpHits, + public List RecomposeClusters(Map> grpHits, DCGeant4Factory dcDetector, ClusterFitter cf) { cf.reset(); + + ClusterCleanerUtilities ct = new ClusterCleanerUtilities(); + List clusters = new ArrayList<>(); // using iterators @@ -294,7 +307,8 @@ public List RecomposeClusters(Map> while(itr.hasNext()) { Map.Entry> entry = itr.next(); - if(entry.getValue().size()>3) { + if((!ct.isExceptionalFittedCluster(entry.getValue()) && entry.getValue().size() >= Constants.DC_MIN_NLAYERS) + || (ct.isExceptionalFittedCluster(entry.getValue()) && entry.getValue().size() >= Constants.DC_MIN_NLAYERS-1)) { Cluster cluster = new Cluster(entry.getValue().get(0).get_Sector(), entry.getValue().get(0).get_Superlayer(), entry.getValue().get(0).get_AssociatedClusterID()); FittedCluster fcluster = new FittedCluster(cluster); @@ -328,7 +342,7 @@ public List RecomposeClusters(Map> return clusters; } - private List RecomposeTrackClusters(DataEvent event, List fhits, IndexedTable tab, DCGeant4Factory DcDetector, TimeToDistanceEstimator tde) { + private List RecomposeTrackClusters(DataEvent event, List fhits, ClusterCleanerUtilities ct, IndexedTable tab, DCGeant4Factory DcDetector, TimeToDistanceEstimator tde) { Map> grpHits = new HashMap<>(); List clusters = new ArrayList<>(); @@ -354,8 +368,9 @@ private List RecomposeTrackClusters(DataEvent event, List> entry = itr.next(); - - if(entry.getValue().size()>3) { + + if((!ct.isExceptionalFittedCluster(entry.getValue()) && entry.getValue().size() >= Constants.DC_MIN_NLAYERS) + || (ct.isExceptionalFittedCluster(entry.getValue()) && entry.getValue().size() >= Constants.DC_MIN_NLAYERS-1)){ Cluster cluster = new Cluster(entry.getValue().get(0).get_Sector(), entry.getValue().get(0).get_Superlayer(), entry.getValue().get(0).get_AssociatedClusterID()); FittedCluster fcluster = new FittedCluster(cluster); @@ -389,7 +404,7 @@ public List FindTimeBasedClusters(DataEvent event, List clusters = new ArrayList<>(); - List rclusters = RecomposeTrackClusters(event, fhits, tab, DcDetector, tde); + List rclusters = RecomposeTrackClusters(event, fhits, ct, tab, DcDetector, tde); //LOGGER.log(Level.FINER, " Clusters TimeBased Step 1"); // for(FittedCluster c : rclusters) // for(FittedHit h : c) @@ -616,5 +631,5 @@ public EvioDataBank getLayerEfficiencies(List fclusters, List Date: Fri, 10 May 2024 13:42:54 -0400 Subject: [PATCH 02/15] update class PatternRec corresponding to updates of DC clustering --- .../jlab/rec/dc/cluster/ClusterFinder.java | 39 ++----------------- .../java/org/jlab/rec/dc/nn/PatternRec.java | 6 ++- 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index b25d496ada..28492cf04f 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -177,24 +177,10 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //fill array of hit this.fillHitArray(allhits, 0); - //prune noise - //ct.HitListPruner(allhits, HitArray); + //find clumps of hits init List clusters = this.findClumps(allhits, ct); - - /* - allhits.clear(); - - for (Cluster clus : clusters) { - Collections.sort(clus); - allhits.addAll(ct.HitListPruner(clus)); - } - - this.fillHitArray(allhits, 0); - clusters.clear(); - clusters = this.findClumps(allhits, ct); - */ - + //Sort hits in clusters for (Cluster clus : clusters) { Collections.sort(clus); @@ -209,24 +195,13 @@ public List FindHitBasedClusters(List allhits, ClusterCleane continue; //LOGGER.log(Level.FINER, " I passed this cluster "+clus.printInfo()); FittedCluster fClus = new FittedCluster(clus); - //FittedCluster fClus = ct.IsolatedHitsPruner(fclus); - // Flag out-of-timers - //if(Constants.isSimulation==true) { ct.outOfTimersRemover(fClus, true); // remove outoftimers - //} else { - // ct.outOfTimersRemover(fClus, false); // correct outoftimers - //} - // add cluster if((!ct.isExceptionalFittedCluster(fClus) && fClus.size() fittedClusList = new ArrayList<>(); List refittedClusList = new ArrayList<>(); @@ -241,9 +216,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane cf.SetFitArray(clus, "LC"); cf.Fit(clus, true); } - if (clus.get_fitProb() > Constants.HITBASEDTRKGMINFITHI2PROB ){ - // || - // (clus.size() < Constants.HITBASEDTRKGNONSPLITTABLECLSSIZE && clus.get_fitProb()!=0) ){ + if (clus.get_fitProb() > Constants.HITBASEDTRKGMINFITHI2PROB ){ fittedClusList.add(clus); //if the chi2 prob is good enough, then just add the cluster, or if the cluster is not split-able because it has too few hits } else { @@ -284,11 +257,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane } } - - //LOGGER.log(Level.FINER, " Clusters Step 4"); - //for(FittedCluster c : refittedClusList) - // for(FittedHit h : c) - // LOGGER.log(Level.FINER, h.printInfo()); + return refittedClusList; } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java index 56c8dd2700..671ba6122d 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java @@ -9,6 +9,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.jlab.detector.geant4.v2.DCGeant4Factory; +import org.jlab.rec.dc.Constants; import org.jlab.rec.dc.cluster.Cluster; import org.jlab.rec.dc.cluster.ClusterCleanerUtilities; import org.jlab.rec.dc.cluster.ClusterFinder; @@ -139,7 +140,7 @@ public List RecomposeSegments(List fhits, while(itr.hasNext()) { Map.Entry> entry = itr.next(); - if(entry.getValue().size()>=20) {// 4 layers per superlayer, 5 out of six superlayer tracking + if(entry.getValue().size()>=15) {// 3 or 4 layers per superlayer, 5 out of six superlayer tracking // find clusters //fill array of hit clf.fillHitArray(entry.getValue(), 0); //find clumps of hits init @@ -147,7 +148,8 @@ public List RecomposeSegments(List fhits, for (Cluster clus : clusters) { FittedCluster fclus = new FittedCluster(clus); clus.set_Id(clus.get(0).NNClusId); - if (clus != null && clus.size() >= 4 ) { //4 layers per superlayer + if (clus != null && ((!ct.isExceptionalCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS) || + (ct.isExceptionalCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS-1)) ) { // 3 or 4 layers per superlayer fclus.set_Id(clus.get(0).NNClusId); // update the hits for (FittedHit fhit : fclus) { From dbcdee1b8f05df726ae24820dccf51b7efa26509 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Thu, 16 May 2024 12:46:16 -0400 Subject: [PATCH 03/15] restore pruner for DC clustering --- .../org/jlab/rec/dc/cluster/ClusterFinder.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index 28492cf04f..e55faa841a 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -180,11 +180,24 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //find clumps of hits init List clusters = this.findClumps(allhits, ct); - + + allhits.clear(); + + for (Cluster clus : clusters) { + Collections.sort(clus); + allhits.addAll(ct.HitListPruner(clus)); + } + + this.fillHitArray(allhits, 0); + clusters.clear(); + clusters = this.findClumps(allhits, ct); + + /* //Sort hits in clusters for (Cluster clus : clusters) { Collections.sort(clus); } + */ // create cluster list to be fitted List selectedClusList = new ArrayList<>(); From 2bbc47d729104b19eef86499879d66218e82d569 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Fri, 7 Jun 2024 13:58:00 -0400 Subject: [PATCH 04/15] update ClusterCleanerUtilities::OverlappingClusterResolver() for elimination and selection of clusters from cluster splitter --- .../org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java | 8 ++++---- .../main/java/org/jlab/rec/dc/cluster/FittedCluster.java | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index 64df8c6e58..c728b6cbb1 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -727,10 +727,10 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List 0.2) { - passCls = false; - } + + //if (Math.abs(ovr.get_clusterLineFitSlope() - cls.get_clusterLineFitSlope()) > 0.2) { + // passCls = false; + //} } if((!isExceptionalFittedCluster(cls) && hitOvrl.size() < 3) || (isExceptionalFittedCluster(cls) && hitOvrl.size() < 2)) { diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java index 5a3e27d0f6..a9b89bee45 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java @@ -192,7 +192,12 @@ public void set_Chisq(double _Chisq) { public int compareTo(FittedCluster o) { if (this.size() > o.size()) { return 1; - } else { + } + else if(this.size() == o.size()){ + if(this.get_fitProb() > o.get_fitProb()) return 1; + else return 0; + } + else { return 0; } } From 220bc0f2c259038e718489919cb21cb9210c83fc Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Thu, 13 Jun 2024 09:26:19 -0400 Subject: [PATCH 05/15] fix an issue in HitReader::read_NNHits() --- .../dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java index 6f45c09806..e110447a36 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java @@ -624,6 +624,7 @@ private void read_NNHits() { tPars[2] = (double)bankAI.getFloat("phi", j); tPars[3] = (double)bankAI.getByte("id", j); + aimatch.clear(); for (int k = 0; k < 6; k++) { aimatch.put(Ids[k], tPars); } From 255e695ef7f685fa29c1cf6d6bd96c4a75fa1425 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Fri, 14 Jun 2024 10:10:58 -0400 Subject: [PATCH 06/15] fix bug for hits shared by clusters --- .../java/org/jlab/rec/dc/banks/HitReader.java | 20 ++++++++++++- .../org/jlab/rec/dc/banks/RecoBankWriter.java | 14 ++++++---- .../jlab/rec/dc/cluster/ClusterFinder.java | 28 ++++++++++++++++--- .../java/org/jlab/rec/dc/nn/PatternRec.java | 20 ++++++++++--- .../org/jlab/service/dc/DCHBClustering.java | 2 +- .../java/org/jlab/service/dc/DCHBEngine.java | 2 +- 6 files changed, 69 insertions(+), 17 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java index e110447a36..43ad66be9d 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java @@ -54,7 +54,8 @@ public class HitReader { private IndexedTable docares = null; private IndexedTable time2dist = null; private IndexedTable t0s = null; - + + private int numTDCBankRows = -1; private List _DCHits; private List _HBHits; //hit-based tracking hit information private List _TBHits; //time-based tracking hit information @@ -263,6 +264,7 @@ private void fetch_DCHits(Clas12NoiseAnalysis noiseAnalysis, RawDataBank bankFiltered = new RawDataBank(bankNames.getTdcBank(), rawBankOrders); bankFiltered.read(event); + this.set_NumTDCBankRows(bankFiltered.rows()); for (int i = 0; i < bankFiltered.rows(); i++) { int sector = bankFiltered.getByte("sector", i); int layer = (bankFiltered.getByte("layer", i)-1)%6 + 1; @@ -916,4 +918,20 @@ public List get_DCHits(int sectorSelect) { return list; } } + + /** + * + * @param num # of rows in DC::TDC bank + */ + public void set_NumTDCBankRows(int num){ + this.numTDCBankRows = num; + } + + /** + * + * @return # of rows in DC::TDC bank + */ + public int get_NumTDCBankRows(){ + return numTDCBankRows; + } } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java index 3be9e11d45..c19f2af1d4 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java @@ -36,22 +36,24 @@ public RecoBankWriter(Banks names) { public void updateListsWithClusterInfo(List fhits, List clusters) { - + ArrayList rmHits = new ArrayList(); + ArrayList addHits = new ArrayList(); for (int i = 0; i < clusters.size(); i++) { clusters.get(i).set_Id(i + 1); for (int j = 0; j < clusters.get(i).size(); j++) { clusters.get(i).get(j).set_AssociatedClusterID(clusters.get(i).get_Id()); + addHits.add(clusters.get(i).get(j)); for (int k = 0; k < fhits.size(); k++) { if (fhits.get(k).get_Id() == clusters.get(i).get(j).get_Id()) { - fhits.remove(k); - fhits.add(clusters.get(i).get(j)); - + rmHits.add(fhits.get(k)); + } } } } - } - + + fhits.removeAll(rmHits); + fhits.addAll(addHits); } public DataBank fillHBHitsBank(DataEvent event, List hitlist) { diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index e55faa841a..a0bbc417fe 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import org.jlab.detector.geant4.v2.DCGeant4Factory; import org.jlab.io.base.DataEvent; @@ -170,10 +171,11 @@ public List findClumps(List allhits, ClusterCleanerUtilities ct) { * @param ct * @param cf * @param DcDetector + * @param numTDCBankRows * @return clusters of hits. Hit-based tracking linear fits to the wires are * done to determine the clusters. The result is a fitted cluster */ - public List FindHitBasedClusters(List allhits, ClusterCleanerUtilities ct, ClusterFitter cf, DCGeant4Factory DcDetector) { + public List FindHitBasedClusters(List allhits, ClusterCleanerUtilities ct, ClusterFitter cf, DCGeant4Factory DcDetector, int numTDCBankRows) { //fill array of hit this.fillHitArray(allhits, 0); @@ -238,7 +240,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane } } - ArrayList rmHits = new ArrayList(); + int idSharedHits = numTDCBankRows + 10000; for (FittedCluster clus : fittedClusList) { if (clus != null && ((!ct.isExceptionalFittedCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS) || (ct.isExceptionalFittedCluster(clus) && clus.size() >= Constants.DC_MIN_NLAYERS-1)) && clus.get_fitProb()>Constants.HITBASEDTRKGMINFITHI2PROB) { @@ -256,13 +258,31 @@ public List FindHitBasedClusters(List allhits, ClusterCleane clus = ct.ClusterCleaner(clus, cf, DcDetector); // update the hits + ArrayList rmHits = new ArrayList(); + ArrayList addHits = new ArrayList(); + //System.out.print(clus.size() + " "); for (FittedHit fhit : clus) { - fhit.set_AssociatedClusterID(clus.get_Id()); + if(fhit.get_AssociatedClusterID() <= 0) + fhit.set_AssociatedClusterID(clus.get_Id()); + else{ + try{ + FittedHit newHit = fhit.clone(); + newHit.set_Id(idSharedHits++); + newHit.set_AssociatedClusterID(clus.get_Id()); + rmHits.add(fhit); + addHits.add(newHit); + + } catch (CloneNotSupportedException ex) { + Logger.getLogger(FittedHit.class.getName()).log(Level.SEVERE, null, ex); + } + } } + clus.removeAll(rmHits); + clus.addAll(addHits); cf.SetFitArray(clus, "TSC"); cf.Fit(clus, false); cf.SetSegmentLineParameters(clus.get(0).get_Z(), clus); - + //System.out.println(clus.size()); if (clus != null ) { refittedClusList.add(clus); } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java index 671ba6122d..2edc349e04 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/nn/PatternRec.java @@ -141,10 +141,22 @@ public List RecomposeSegments(List fhits, Map.Entry> entry = itr.next(); if(entry.getValue().size()>=15) {// 3 or 4 layers per superlayer, 5 out of six superlayer tracking - // find clusters - //fill array of hit - clf.fillHitArray(entry.getValue(), 0); //find clumps of hits init - List clusters = clf.findClumps(entry.getValue(), ct); + // Construct clusters + Map clusterMap = new HashMap<>(); + for(Hit hit : entry.getValue()){ + int index = hit.NNClusId; + if(clusterMap.get(index)==null) { // if the list not yet created make it + clusterMap.put(index, new Cluster(hit.get_Sector(), hit.get_Superlayer(), index)); + clusterMap.get(index).add(hit); // append hit + } else { + clusterMap.get(index).add(hit); // append hit + } + } + List clusters = new ArrayList(); + for(Cluster clus : clusterMap.values()){ + Collections.sort(clus); + clusters.add(clus); + } for (Cluster clus : clusters) { FittedCluster fclus = new FittedCluster(clus); clus.set_Id(clus.get(0).NNClusId); diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java index c527befa37..2a977d65dd 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java @@ -79,7 +79,7 @@ public boolean processDataEvent(DataEvent event) { List clusters = clusFinder.FindHitBasedClusters(hits, ct, cf, - Constants.getInstance().dcDetector); + Constants.getInstance().dcDetector, hitRead.get_NumTDCBankRows()); if (clusters.isEmpty()) { return true; } else { diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java index 868608395b..eae796665e 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBEngine.java @@ -104,7 +104,7 @@ public boolean processDataEvent(DataEvent event) { List clusters = clusFinder.FindHitBasedClusters(hits, ct, cf, - Constants.getInstance().dcDetector); + Constants.getInstance().dcDetector, hitRead.get_NumTDCBankRows()); if (clusters.isEmpty()) { return true; } From ebc36a207402b823187a57cd5f89ab382afb8313 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Mon, 17 Jun 2024 15:12:06 -0400 Subject: [PATCH 07/15] clean up comments --- .../dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index a0bbc417fe..6fb7ba5c31 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -260,7 +260,6 @@ public List FindHitBasedClusters(List allhits, ClusterCleane // update the hits ArrayList rmHits = new ArrayList(); ArrayList addHits = new ArrayList(); - //System.out.print(clus.size() + " "); for (FittedHit fhit : clus) { if(fhit.get_AssociatedClusterID() <= 0) fhit.set_AssociatedClusterID(clus.get_Id()); @@ -282,7 +281,6 @@ public List FindHitBasedClusters(List allhits, ClusterCleane cf.SetFitArray(clus, "TSC"); cf.Fit(clus, false); cf.SetSegmentLineParameters(clus.get(0).get_Z(), clus); - //System.out.println(clus.size()); if (clus != null ) { refittedClusList.add(clus); } From 99362114c74d76900a3ff64c3a42446edcb321e3 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Mon, 17 Jun 2024 17:18:38 -0400 Subject: [PATCH 08/15] update ClusterCleanerUtilities::OverlappingClusterResolver() --- .../rec/dc/cluster/ClusterCleanerUtilities.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index c728b6cbb1..388722180f 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -704,7 +704,7 @@ public FittedCluster SecondariesRemover(DataEvent event, FittedCluster clus, Clu * @return the selected cluster */ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List clusters) { - + // Get list for overlapped clusters List overlapingClusters = new ArrayList<>(); for (FittedCluster cls : clusters) { @@ -742,7 +742,19 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List 1){ + List rmClusters = new ArrayList<>(); + for(FittedCluster overlapingCls : overlapingClusters){ + if(overlapingCls.get_Superlayer() <=4 && Math.abs(overlapingCls.get_clusterLineFitSlope()) > 0.578) //tan(30 deg) + rmClusters.add(overlapingCls); + } + if(overlapingClusters.size() > rmClusters.size()) overlapingClusters.removeAll(rmClusters); + } + + Collections.sort(overlapingClusters); // Order overlapping clusters; 1st priortiy: cluster size; 2nd priority if same cluster size : fitting quality // return the largest cluster. return overlapingClusters.get(0); From 8154e7eed13c5aa9b0f4e0f01b574f073803185c Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Tue, 18 Jun 2024 16:10:41 -0400 Subject: [PATCH 09/15] Add a new item called as indexTDC into HitBasedTrkg::Hits --- etc/bankdefs/hipo4/dc.json | 1 + .../java/org/jlab/rec/dc/banks/HitReader.java | 3 +- .../org/jlab/rec/dc/banks/RecoBankWriter.java | 43 +++++++++++++++++++ .../jlab/rec/dc/cluster/ClusterFinder.java | 3 +- .../jlab/rec/dc/cluster/FittedCluster.java | 1 + .../java/org/jlab/rec/dc/hit/FittedHit.java | 1 + .../main/java/org/jlab/rec/dc/hit/Hit.java | 17 ++++++++ .../org/jlab/service/dc/DCHBClustering.java | 9 ++-- 8 files changed, 70 insertions(+), 8 deletions(-) diff --git a/etc/bankdefs/hipo4/dc.json b/etc/bankdefs/hipo4/dc.json index e8dd22f348..616528e41b 100644 --- a/etc/bankdefs/hipo4/dc.json +++ b/etc/bankdefs/hipo4/dc.json @@ -6,6 +6,7 @@ "info": "reconstructed hits using DC wire positions", "entries": [ {"name":"id", "type":"S", "info":"id of the hit"}, + {"name": "indexTDC", "type":"S", "info":"inex in the bank DC::TDC"}, {"name":"status", "type":"S", "info":"id of the hit"}, {"name":"sector", "type":"B", "info":"DC sector"}, {"name":"superlayer", "type":"B", "info":"DC superlayer (1...6)"}, diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java index 43ad66be9d..faa907a8cf 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/HitReader.java @@ -44,7 +44,7 @@ public class HitReader { private int run = 0; private long tiTimeStamp = 0; private DataEvent event = null; - + private IndexedTable tt = null; private IndexedTable reverseTT = null; private IndexedTable dcrbjitters = null; @@ -341,6 +341,7 @@ private void fetch_DCHits(Clas12NoiseAnalysis noiseAnalysis, hit.calc_CellSize(detector); double posError = hit.get_CellSize() / Math.sqrt(12.); hit.set_DocaErr(posError); + hit.set_IndexTDC(index); this._DCHits.add(hit); } } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java index c19f2af1d4..529be90740 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/banks/RecoBankWriter.java @@ -55,6 +55,48 @@ public void updateListsWithClusterInfo(List fhits, fhits.removeAll(rmHits); fhits.addAll(addHits); } + + public DataBank fillHitsBank(DataEvent event, List hitlist) { + String name = bankNames.getHitsBank(); + + int rejCnt = 0; + for (int i = 0; i < hitlist.size(); i++) { +// if (hitlist.get(i).get_Id() == -1 /*|| hitlist.get(i).get_Id()==0*/) { //PASS1 + if (hitlist.get(i).get_Id() == -1 || hitlist.get(i).get_Id()==0) { + rejCnt++; + } + } + DataBank bank = event.createBank(name, hitlist.size()-rejCnt); + rejCnt=0; + for (int i = 0; i < hitlist.size(); i++) { +// if (hitlist.get(i).get_Id() == -1 /*|| hitlist.get(i).get_Id()==0*/) { //PASS1 + if (hitlist.get(i).get_Id() == -1 || hitlist.get(i).get_Id()==0) { + rejCnt++; + continue; + } + bank.setShort("id", i-rejCnt, (short) hitlist.get(i).get_Id()); + bank.setShort("indexTDC", i-rejCnt, (short) hitlist.get(i).get_IndexTDC()); + bank.setShort("status", i-rejCnt, (short) hitlist.get(i).get_QualityFac()); + bank.setByte("superlayer", i-rejCnt, (byte) hitlist.get(i).get_Superlayer()); + bank.setByte("layer", i-rejCnt, (byte) hitlist.get(i).get_Layer()); + bank.setByte("sector", i-rejCnt, (byte) hitlist.get(i).get_Sector()); + bank.setShort("wire", i-rejCnt, (short) hitlist.get(i).get_Wire()); + bank.setFloat("docaError", i-rejCnt, (float) hitlist.get(i).get_DocaErr()); + bank.setFloat("trkDoca", i-rejCnt, (float) hitlist.get(i).get_ClusFitDoca()); + bank.setFloat("LocX", i-rejCnt, (float) hitlist.get(i).get_lX()); + bank.setFloat("LocY", i-rejCnt, (float) hitlist.get(i).get_lY()); + bank.setFloat("X", i-rejCnt, (float) hitlist.get(i).get_X()); + bank.setFloat("Z", i-rejCnt, (float) hitlist.get(i).get_Z()); + bank.setByte("LR", i-rejCnt, (byte) hitlist.get(i).get_LeftRightAmb()); + bank.setShort("clusterID", i-rejCnt, (short) hitlist.get(i).get_AssociatedClusterID()); + bank.setInt("TDC",i-rejCnt,hitlist.get(i).get_TDC()); + bank.setByte("jitter",i, (byte) hitlist.get(i).getJitter()); + + } + + return bank; + + } public DataBank fillHBHitsBank(DataEvent event, List hitlist) { String name = bankNames.getHitsBank(); @@ -831,6 +873,7 @@ public List createRawHitList(List hits) { hit.get_Layer(), hit.get_Wire(), hit.get_TDC(), hit.getJitter(), hit.get_Id()); fhit.set_Id(hit.get_Id()); + fhit.set_IndexTDC(hit.get_IndexTDC()); fhit.set_DocaErr(hit.get_DocaErr()); fhits.add(fhit); } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index 6fb7ba5c31..270aaf3ebd 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -265,7 +265,8 @@ public List FindHitBasedClusters(List allhits, ClusterCleane fhit.set_AssociatedClusterID(clus.get_Id()); else{ try{ - FittedHit newHit = fhit.clone(); + FittedHit newHit = fhit.clone(); + newHit.set_IndexTDC(fhit.get_IndexTDC()); newHit.set_Id(idSharedHits++); newHit.set_AssociatedClusterID(clus.get_Id()); rmHits.add(fhit); diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java index a9b89bee45..50bf11c888 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/FittedCluster.java @@ -35,6 +35,7 @@ public FittedCluster(Cluster rawCluster) { fhit.set_DocaErr(rawCluster.get(i).get_DocaErr()); fhit.set_CellSize(rawCluster.get(i).get_CellSize()); fhit.set_Id(rawCluster.get(i).get_Id()); + fhit.set_IndexTDC(rawCluster.get(i).get_IndexTDC()); this.add(fhit); } diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java index 741a0ed905..36e802de15 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/FittedHit.java @@ -1112,6 +1112,7 @@ public FittedHit clone() throws CloneNotSupportedException { hitClone.set_CellSize(this.get_CellSize()); hitClone.set_AssociatedClusterID(this.get_AssociatedClusterID()); hitClone.set_AssociatedHBTrackID(this.get_AssociatedHBTrackID()); + hitClone.set_IndexTDC(this.get_IndexTDC()); hitClone.betaFlag = this.betaFlag; return hitClone; diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/Hit.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/Hit.java index 7b2c9dc74f..e308353c76 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/Hit.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/hit/Hit.java @@ -21,6 +21,7 @@ public class Hit implements Comparable { private int _Id; private double _cellSize; private double _DocaErr; + private int _indexTDC = -1; // class implements Comparable interface to allow for sorting a collection of hits by wire number values public int NNTrkId; public int NNClusId; @@ -49,6 +50,22 @@ public Hit(int sector, int superlayer, int layer, int wire, int TDC, int jitter, } + + /** + * + * @return index in DC::TDC bank + */ + public int get_IndexTDC(){ + return _indexTDC; + } + + /** + * + * @param index in DC::TDC bank + */ + public void set_IndexTDC(int index){ + this._indexTDC = index; + } /** * diff --git a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java index 2a977d65dd..978ae61e2f 100644 --- a/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java +++ b/reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBClustering.java @@ -86,12 +86,9 @@ public boolean processDataEvent(DataEvent event) { List fhits = rbc.createRawHitList(hits); /* 13 */ rbc.updateListsWithClusterInfo(fhits, clusters); - rbc.fillAllHBBanks(event, - fhits, - clusters, - null, - null, - null); + event.appendBanks(rbc.fillHitsBank(event, fhits), + rbc.fillHBClustersBank(event, clusters) + ); } return true; From 73f7b06b924677823726f12e6dfcd190f3361a8a Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Tue, 18 Jun 2024 16:12:08 -0400 Subject: [PATCH 10/15] cancel pruner in clustering --- .../main/java/org/jlab/rec/dc/cluster/ClusterFinder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index 270aaf3ebd..6975d6d017 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -183,6 +183,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //find clumps of hits init List clusters = this.findClumps(allhits, ct); + /* allhits.clear(); for (Cluster clus : clusters) { @@ -193,13 +194,12 @@ public List FindHitBasedClusters(List allhits, ClusterCleane this.fillHitArray(allhits, 0); clusters.clear(); clusters = this.findClumps(allhits, ct); - - /* + */ + //Sort hits in clusters for (Cluster clus : clusters) { Collections.sort(clus); - } - */ + } // create cluster list to be fitted List selectedClusList = new ArrayList<>(); From 81c83a1ef3d75c0102aa1c6eba707dfa4d7a8f66 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Mon, 29 Jul 2024 09:43:04 -0400 Subject: [PATCH 11/15] recover pruner for DC clustering and apply j4ml v1.0 --- common-tools/coat-lib/pom.xml | 4 ++-- .../java/org/jlab/rec/dc/cluster/ClusterFinder.java | 11 ++--------- reconstruction/mltn/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/common-tools/coat-lib/pom.xml b/common-tools/coat-lib/pom.xml index 19adba8240..055b0927c0 100644 --- a/common-tools/coat-lib/pom.xml +++ b/common-tools/coat-lib/pom.xml @@ -64,13 +64,13 @@ j4ml j4ml-neuroph - 0.9-SNAPSHOT + 1.0 j4ml j4ml-clas12 - 0.9-SNAPSHOT + 1.0 diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java index 6975d6d017..d9b8eb2ab8 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterFinder.java @@ -182,8 +182,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane //find clumps of hits init List clusters = this.findClumps(allhits, ct); - - /* + allhits.clear(); for (Cluster clus : clusters) { @@ -194,13 +193,7 @@ public List FindHitBasedClusters(List allhits, ClusterCleane this.fillHitArray(allhits, 0); clusters.clear(); clusters = this.findClumps(allhits, ct); - */ - - //Sort hits in clusters - for (Cluster clus : clusters) { - Collections.sort(clus); - } - + // create cluster list to be fitted List selectedClusList = new ArrayList<>(); diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 95bf0ab6d0..9b99d86fd7 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -22,13 +22,13 @@ j4ml j4ml-neuroph - 0.9-SNAPSHOT + 1.0 j4ml j4ml-clas12 - 0.9-SNAPSHOT + 1.0 From 3d896974c61b9b263402a0f27407e7cef7d52d54 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Tue, 30 Jul 2024 11:25:37 -0400 Subject: [PATCH 12/15] back to use j4ml 0.9-SNAPSHOT --- common-tools/coat-lib/pom.xml | 4 ++-- reconstruction/mltn/pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common-tools/coat-lib/pom.xml b/common-tools/coat-lib/pom.xml index 055b0927c0..19adba8240 100644 --- a/common-tools/coat-lib/pom.xml +++ b/common-tools/coat-lib/pom.xml @@ -64,13 +64,13 @@ j4ml j4ml-neuroph - 1.0 + 0.9-SNAPSHOT j4ml j4ml-clas12 - 1.0 + 0.9-SNAPSHOT diff --git a/reconstruction/mltn/pom.xml b/reconstruction/mltn/pom.xml index 9b99d86fd7..95bf0ab6d0 100644 --- a/reconstruction/mltn/pom.xml +++ b/reconstruction/mltn/pom.xml @@ -22,13 +22,13 @@ j4ml j4ml-neuroph - 1.0 + 0.9-SNAPSHOT j4ml j4ml-clas12 - 1.0 + 0.9-SNAPSHOT From fb8563c4a75a41b32d971aa3cb80babe41fbda93 Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Mon, 12 Aug 2024 12:36:55 -0400 Subject: [PATCH 13/15] fix issues in ClusterCleanerUtilities::OverlappingClusterResolver() --- .../org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java | 6 +++--- .../main/java/org/jlab/rec/dc/cluster/FittedCluster.java | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index 388722180f..ef755146f4 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -706,7 +706,7 @@ public FittedCluster SecondariesRemover(DataEvent event, FittedCluster clus, Clu public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List clusters) { // Get list for overlapped clusters List overlapingClusters = new ArrayList<>(); - + for (FittedCluster cls : clusters) { List hitOvrl = new ArrayList<>(); @@ -722,7 +722,7 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List o.size()) { + if (this.size() < o.size()) { return 1; } else if(this.size() == o.size()){ - if(this.get_fitProb() > o.get_fitProb()) return 1; - else return 0; + if(this.get_fitProb() < o.get_fitProb()) return 1; + else if(this.get_fitProb() == o.get_fitProb()) return 0; + else return -1; } else { - return 0; + return -1; } } From c97aca11528eb5b1b4b2c26a0669bcf0bd0293ed Mon Sep 17 00:00:00 2001 From: tongtongcao Date: Wed, 11 Sep 2024 14:08:55 -0400 Subject: [PATCH 14/15] update ClusterCleanerUtilities::OverlappingClusterResolver() and apply it twice --- .../dc/cluster/ClusterCleanerUtilities.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index ef755146f4..aaf81220ae 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -222,7 +222,7 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI } } - // make new clusters + // make new clusters with application of OverlappingClusterResolver List selectedClusList = new ArrayList<>(); int newcid = nextClsStartIndex; @@ -240,19 +240,36 @@ public List ClusterSplitter(FittedCluster clus, int nextClsStartI } } } + + // Apply OverlappingClusterResolver again + List selectedClusList2 = new ArrayList<>(); + for (FittedCluster cluster : selectedClusList) { + cluster.set_Id(newcid++); + cf.SetFitArray(cluster, "LC"); + cf.Fit(cluster, true); + + FittedCluster bestCls = OverlappingClusterResolver(cluster, selectedClusList); + + if (bestCls != null) { + + if (!(selectedClusList2.contains(bestCls))) { + selectedClusList2.add(bestCls); + } + } + } int splitclusId = 1; - if (!selectedClusList.isEmpty()) { - for (FittedCluster cl : selectedClusList) { + if (!selectedClusList2.isEmpty()) { + for (FittedCluster cl : selectedClusList2) { cl.set_Id(clus.get_Id() * 1000 + splitclusId); splitclusId++; } } - if (selectedClusList.isEmpty()) { - selectedClusList.add(clus); // if the splitting fails, then return the original cluster + if (selectedClusList2.isEmpty()) { + selectedClusList2.add(clus); // if the splitting fails, then return the original cluster } - return selectedClusList; + return selectedClusList2; } public List> byLayerListSorter(List DCHits, int sector, int superlyr) { @@ -732,8 +749,8 @@ public FittedCluster OverlappingClusterResolver(FittedCluster thisclus, List Date: Thu, 9 Jan 2025 10:21:29 -0500 Subject: [PATCH 15/15] use wrapper to treat similar functions of isExceptionalCluster --- .../dc/cluster/ClusterCleanerUtilities.java | 90 ++++++++----------- 1 file changed, 35 insertions(+), 55 deletions(-) diff --git a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java index aaf81220ae..b2b37c20f1 100644 --- a/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java +++ b/reconstruction/dc/src/main/java/org/jlab/rec/dc/cluster/ClusterCleanerUtilities.java @@ -1010,73 +1010,53 @@ public FittedCluster ClusterCleaner(FittedCluster clus, ClusterFitter cf, DCGean return BestCluster; } - /** - * - * @param hitsInClus the hits in a cluster - * @return if one or more layers are skipped in the cluster + /** + * Check if one or more layers are skipped in the cluster + * @param hitsInClus the hits in a cluster (can be either Hit or FittedHit) + * @param nlayr the number of layers + * @return true if one or more layers are skipped in the cluster */ - public boolean isExceptionalCluster(List hitsInClus){ - // count hits in each layer - int nlayr = 6; + private boolean isExceptionalClusterHelper(List hitsInClus, int nlayr) { + // Initialize array to count hits in each layer int[] nlayers = new int[nlayr]; - for (int l = 0; l < nlayr; l++) { - nlayers[l] = 0; - for (int h = 0; h < hitsInClus.size(); h++) { - if (hitsInClus.get(h).get_Layer() == l + 1) { - nlayers[l]++; - } + + // Count hits for each layer in a single pass through the hits + for (Hit hit : hitsInClus) { + int layer = hit.get_Layer() - 1; // layer numbering starts from 1 + if (layer >= 0 && layer < nlayr) { + nlayers[layer]++; } } - boolean flag_hasSkippedLayer = false; - if((nlayers[0] == 0 && nlayers[1] == 0) || (nlayers[4] == 0 && nlayers[5] == 0)){ - flag_hasSkippedLayer = true; + // Check if the first or last two layerers are missed + if ((nlayers[0] == 0 && nlayers[1] == 0) || (nlayers[4] == 0 && nlayers[5] == 0)) { + return true; } - else{ - for (int l = 0; l < 4; l++) { - if (nlayers[l] > 0 && nlayers[l+1] == 0) { - flag_hasSkippedLayer = true; - break; - } + + // Check if there is one or more skipped layers in the middle + for (int l = 0; l < 4; l++) { + if (nlayers[l] > 0 && nlayers[l + 1] == 0) { + return true; } } - - return flag_hasSkippedLayer; + + return false; } - /* - * @param hitsInClus the hits in a cluster - * @return if one or more layers are skipped in the cluster - */ - public boolean isExceptionalFittedCluster(List hitsInClus){ - // count hits in each layer - int nlayr = 6; - int[] nlayers = new int[nlayr]; - for (int l = 0; l < nlayr; l++) { - nlayers[l] = 0; - for (int h = 0; h < hitsInClus.size(); h++) { - if (hitsInClus.get(h).get_Layer() == l + 1) { - nlayers[l]++; - } - } - } - - boolean flag_hasSkippedLayer = false; - if((nlayers[0] == 0 && nlayers[1] == 0) || (nlayers[4] == 0 && nlayers[5] == 0)){ - flag_hasSkippedLayer = true; - } - else{ - for (int l = 0; l < 4; l++) { - if (nlayers[l] > 0 && nlayers[l+1] == 0) { - flag_hasSkippedLayer = true; - break; - } - } - } - - return flag_hasSkippedLayer; + /** + * Wrapper for checking if a cluster of Hit objects is exceptional. + */ + public boolean isExceptionalCluster(List hitsInClus) { + return isExceptionalClusterHelper(hitsInClus, 6); // 6 layers for Hit objects } + /** + * Wrapper for checking if a cluster of FittedHit objects is exceptional. + */ + public boolean isExceptionalFittedCluster(List hitsInClus) { + return isExceptionalClusterHelper(hitsInClus, 6); // 6 layers for FittedHit objects + } + public Cluster ClusterSticher(Cluster thisclus, Cluster nextclus, int cid){ ClusterFitter cf = new ClusterFitter();