Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since Cluster is an overloaded term. It would be a good idea to rename this class AHDCCluster. Or be explicit with interfaces using clusters

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.jlab.rec.ahdc.Cluster;
package org.jlab.rec.ahdc.AHDCCluster;

import org.jlab.rec.ahdc.Hit.Hit;
import org.jlab.rec.ahdc.PreCluster.PreCluster;
Expand All @@ -9,9 +9,9 @@
import org.jlab.geom.prim.Point3D;

/**
* Cluster are compose by 2 PreCluster on layer with a different stereo angle
* AHDCCluster are compose by 2 PreCluster on layer with a different stereo angle
*/
public class Cluster {
public class AHDCCluster {

private int _trackId = -1;
private double _Radius;
Expand Down Expand Up @@ -50,7 +50,7 @@ private static double stereoTwistFromLine(Line3D line) {

return wrapPi(phi1 - phi0);
}
public Cluster(PreCluster precluster, PreCluster other_precluster) {
public AHDCCluster(PreCluster precluster, PreCluster other_precluster) {
this._PreClusters_list = new ArrayList<>();
_PreClusters_list.add(precluster);
_PreClusters_list.add(other_precluster);
Expand Down Expand Up @@ -80,15 +80,44 @@ public Cluster(PreCluster precluster, PreCluster other_precluster) {
this._V = this._Y / (this._X * this._X + this._Y * this._Y);
}

public Cluster(double X, double Y, double Z) {
public AHDCCluster(double X, double Y, double Z) {
this._X = X;
this._Y = Y;
this._Z = Z;
}

/** Build an AHDCCluster from a single PreCluster (one layer of a superlayer).
* Used by the GNN path when a track covers a superlayer on only one
* stereo layer — no stereo pair is available, so Z is taken from the
* average wire-midpoint z of the PreCluster's hits rather than from a
* stereo-angle computation. DocaClusterRefiner falls back to a degenerate
* DocaCluster when {@code get_PreClusters_list().size() != 2}, so
* downstream is unaffected. */
public AHDCCluster(PreCluster precluster) {
this._PreClusters_list = new ArrayList<>();
_PreClusters_list.add(precluster);
this._Radius = precluster.get_Radius();
this._Phi = precluster.get_Phi();
this._X = precluster.get_X();
this._Y = precluster.get_Y();
this._Num_wire = (int) precluster.get_Num_wire();
double r2 = this._X * this._X + this._Y * this._Y;
if (r2 > 0.0) {
this._U = this._X / r2;
this._V = this._Y / r2;
}
double zSum = 0.0;
int zCount = 0;
for (Hit h : precluster.get_hits_list()) {
Line3D line = h.getLine();
if (line != null) { zSum += line.midpoint().z(); zCount++; }
}
this._Z = (zCount > 0) ? zSum / zCount : 0.0;
}

@Override
public String toString() {
return "Cluster{" + "_X=" + _X + ", _Y=" + _Y + ", _Z=" + _Z + '}';
return "AHDCCluster{" + "_X=" + _X + ", _Y=" + _Y + ", _Z=" + _Z + '}';
}

public ArrayList<PreCluster> get_PreClusters_list() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package org.jlab.rec.ahdc.Cluster;
package org.jlab.rec.ahdc.AHDCCluster;

import org.jlab.rec.ahdc.PreCluster.PreCluster;

import java.util.ArrayList;
import java.util.List;

/** ClusterFinder
/** AHDCClusterFinder
*
* \todo description of what it does and how it works
*
*/
public class ClusterFinder {
public class AHDCClusterFinder {

private final ArrayList<Cluster> _AHDCClusters = new ArrayList<>();
private final ArrayList<Cluster> _list_with_maybe_same_cluster = new ArrayList<>();
private final ArrayList<AHDCCluster> _AHDCClusters = new ArrayList<>();
private final ArrayList<AHDCCluster> _list_with_maybe_same_cluster = new ArrayList<>();

public ClusterFinder() {}
public AHDCClusterFinder() {}

private void find_associate_cluster(PreCluster precluster, List<PreCluster> AHDC_precluster_list, int window, int minimal_distance, int super_layer, int layer, int associate_super_layer) {
//System.out.println(" precluster superlayer " + precluster.get_Super_layer() + " ref superlayer " + super_layer + " layer " + precluster.get_Layer() + " ref " + layer);
Expand Down Expand Up @@ -52,7 +52,7 @@ private void find_associate_cluster(PreCluster precluster, List<PreCluster> AHDC
if (best_precluster != null) {
precluster.set_Used(true);
best_precluster.set_Used(true);
Cluster new_Cluster = new Cluster(precluster, best_precluster);
AHDCCluster new_Cluster = new AHDCCluster(precluster, best_precluster);
_list_with_maybe_same_cluster.add(new_Cluster);
}
}
Expand Down Expand Up @@ -81,18 +81,18 @@ public void findCluster(List<PreCluster> AHDC_precluster_list) {
find_associate_cluster(precluster, AHDC_precluster_list, window, minimal_distance, 4, 2, 5);
}

for (Cluster cluster : _list_with_maybe_same_cluster) {
for (AHDCCluster cluster : _list_with_maybe_same_cluster) {
if (!containsCluster(_AHDCClusters, cluster.get_Phi(), cluster.get_Radius())) {
_AHDCClusters.add(cluster);
}
}
}

public boolean containsCluster(final List<Cluster> list, double phi, double radius) {
public boolean containsCluster(final List<AHDCCluster> list, double phi, double radius) {
return list.stream().anyMatch(o -> o.get_Radius() == (radius) && o.get_Phi() == phi);
}

public ArrayList<Cluster> get_AHDCClusters() {
public ArrayList<AHDCCluster> get_AHDCClusters() {
return _AHDCClusters;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import org.jlab.io.base.DataBank;
import org.jlab.io.base.DataEvent;
import org.jlab.rec.ahdc.AI.InterCluster;
import org.jlab.rec.ahdc.AI.TrackPrediction;
import org.jlab.rec.ahdc.Cluster.Cluster;
import org.jlab.rec.alert.AI.InterCluster;
import org.jlab.rec.alert.AI.TrackPrediction;
import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster;
import org.jlab.rec.ahdc.DocaCluster.DocaCluster;
import org.jlab.rec.ahdc.Hit.Hit;
import org.jlab.rec.ahdc.PreCluster.PreCluster;
import org.jlab.rec.ahdc.Track.Track;
import org.jlab.rec.alert.Track.Track;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -50,7 +50,7 @@ public DataBank fillPreClustersBank(DataEvent event, ArrayList<PreCluster> preCl
return bank;
}

public DataBank fillClustersBank(DataEvent event, ArrayList<Cluster> clusters) {
public DataBank fillClustersBank(DataEvent event, ArrayList<AHDCCluster> clusters) {
if (clusters == null || clusters.size() == 0) return null;

DataBank bank = event.createBank("AHDC::clusters", clusters.size());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.jlab.rec.ahdc.Distance;

import org.jlab.rec.ahdc.Cluster.Cluster;
import org.jlab.rec.ahdc.Track.Track;
import org.jlab.rec.ahdc.AHDCCluster.AHDCCluster;
import org.jlab.rec.alert.Track.TrackCandidate;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -14,13 +14,13 @@
*/
public class Distance {

private ArrayList<Track> _AHDCTracks;
private ArrayList<TrackCandidate> _AHDCTrackCandidates;

public Distance(){
_AHDCTracks = new ArrayList<>();
_AHDCTrackCandidates = new ArrayList<>();
}

public void find_track(List<Cluster> AHDC_Cluster){
public void find_track(List<AHDCCluster> AHDC_Cluster){
find_track_4_clusters(AHDC_Cluster);
find_track_3_clusters(AHDC_Cluster);
}
Expand All @@ -41,14 +41,14 @@ public static <T> List<List<T>> computeCombinations2(List<List<T>> lists) {
return combinations;
}

private void find_track_4_clusters(List<Cluster> AHDC_Cluster){
List<Cluster> clusters_to_remove = new ArrayList<>();
List<Cluster> layer1 = new ArrayList<>(); // List of all cluster with a radius equal 35
List<Cluster> layer2 = new ArrayList<>(); // List of all cluster with a radius equal 45
List<Cluster> layer3 = new ArrayList<>(); // List of all cluster with a radius equal 55
List<Cluster> layer4 = new ArrayList<>(); // List of all cluster with a radius equal 65
private void find_track_4_clusters(List<AHDCCluster> AHDC_Cluster){
List<AHDCCluster> clusters_to_remove = new ArrayList<>();
List<AHDCCluster> layer1 = new ArrayList<>(); // List of all cluster with a radius equal 35
List<AHDCCluster> layer2 = new ArrayList<>(); // List of all cluster with a radius equal 45
List<AHDCCluster> layer3 = new ArrayList<>(); // List of all cluster with a radius equal 55
List<AHDCCluster> layer4 = new ArrayList<>(); // List of all cluster with a radius equal 65

for(Cluster cluster : AHDC_Cluster){
for(AHDCCluster cluster : AHDC_Cluster){
if(cluster.get_Radius() == 35){
layer1.add(cluster);
}
Expand All @@ -62,29 +62,29 @@ else if(cluster.get_Radius() == 65){
layer4.add(cluster);
}
}
List<List<Cluster>> merged_list = new ArrayList<>();
List<List<AHDCCluster>> merged_list = new ArrayList<>();
merged_list.add(layer1);
merged_list.add(layer2);
merged_list.add(layer3);
merged_list.add(layer4);
List<List<Cluster>> all_combinations = computeCombinations2(merged_list);
List<List<AHDCCluster>> all_combinations = computeCombinations2(merged_list);

List<Track> all_track = new ArrayList<>();
for(List<Cluster> combination : all_combinations){
all_track.add(new Track(combination));
List<TrackCandidate> all_track = new ArrayList<>();
for(List<AHDCCluster> combination : all_combinations){
all_track.add(new TrackCandidate(combination));
}

List<Track> tracks_possible = new ArrayList<>();
for(Track track : all_track){
List<TrackCandidate> tracks_possible = new ArrayList<>();
for(TrackCandidate track : all_track){
if(track.get_Distance() < 45){
tracks_possible.add(track);
}
}

double window = 3.8;
for(Track track : tracks_possible){
List<Track> tracks_with_close_starting_point = new ArrayList<>();
for(Track other_track : tracks_possible){
for(TrackCandidate track : tracks_possible){
List<TrackCandidate> tracks_with_close_starting_point = new ArrayList<>();
for(TrackCandidate other_track : tracks_possible){
if(other_track.get_Clusters().get(0).get_X() > track.get_Clusters().get(0).get_X() - window
&& other_track.get_Clusters().get(0).get_X() < track.get_Clusters().get(0).get_X() + window
&& other_track.get_Clusters().get(0).get_Y() > track.get_Clusters().get(0).get_Y() - window
Expand All @@ -97,12 +97,12 @@ else if(cluster.get_Radius() == 65){

if(tracks_with_close_starting_point.size() > 0){
double chisq_min = Double.MAX_VALUE;
Track best_track = null;
for(Track other_track : tracks_with_close_starting_point){
TrackCandidate best_track = null;
for(TrackCandidate other_track : tracks_with_close_starting_point){
ArrayList<Double> x_ = new ArrayList<>();
ArrayList<Double> y_ = new ArrayList<>();
ArrayList<Double> w_ = new ArrayList<>(); // weight for circlefit
for(Cluster cluster : other_track.get_Clusters()){
for(AHDCCluster cluster : other_track.get_Clusters()){
x_.add(cluster.get_X());
y_.add(cluster.get_Y());
w_.add(1.);
Expand All @@ -119,32 +119,32 @@ else if(cluster.get_Radius() == 65){
}
if (best_track != null ){
clusters_to_remove.addAll(best_track.get_Clusters());
_AHDCTracks.add(best_track);
_AHDCTrackCandidates.add(best_track);
}
}
}

List<Cluster> clusters_to_remove_without_double = new ArrayList<>();
for(Cluster cluster : clusters_to_remove){
List<AHDCCluster> clusters_to_remove_without_double = new ArrayList<>();
for(AHDCCluster cluster : clusters_to_remove){
if(!containsCluster(clusters_to_remove_without_double, cluster.get_Phi(), cluster.get_Radius())){
clusters_to_remove_without_double.add(cluster);
}
}

for(Cluster cluster : clusters_to_remove_without_double){
for(AHDCCluster cluster : clusters_to_remove_without_double){
AHDC_Cluster.remove(cluster);
}
}

public boolean containsCluster(final List<Cluster> list, double phi, double radius){
public boolean containsCluster(final List<AHDCCluster> list, double phi, double radius){
return list.stream().anyMatch(o -> o.get_Radius() == (radius) && o.get_Phi() == phi);
}


private ArrayList<ArrayList<Cluster>> combination(List<Cluster> arr, ArrayList<Cluster> data, int start,
private ArrayList<ArrayList<AHDCCluster>> combination(List<AHDCCluster> arr, ArrayList<AHDCCluster> data, int start,
int end, int index, int r) {

ArrayList<ArrayList<Cluster>> all = new ArrayList<>();
ArrayList<ArrayList<AHDCCluster>> all = new ArrayList<>();
if (index == r) {
all.add(data);
}
Expand All @@ -157,25 +157,25 @@ private ArrayList<ArrayList<Cluster>> combination(List<Cluster> arr, ArrayList<C
return all;
}

private void find_track_3_clusters(List<Cluster> AHDC_Cluster){
ArrayList<ArrayList<Cluster>> all_combinations = combination(AHDC_Cluster, new ArrayList<Cluster>(),0, AHDC_Cluster.size()-1, 0, 3);
private void find_track_3_clusters(List<AHDCCluster> AHDC_Cluster){
ArrayList<ArrayList<AHDCCluster>> all_combinations = combination(AHDC_Cluster, new ArrayList<AHDCCluster>(),0, AHDC_Cluster.size()-1, 0, 3);

List<Track> all_track = new ArrayList<>();
for(List<Cluster> combination : all_combinations){
all_track.add(new Track(combination));
List<TrackCandidate> all_track = new ArrayList<>();
for(List<AHDCCluster> combination : all_combinations){
all_track.add(new TrackCandidate(combination));
}

List<Track> tracks_possible = new ArrayList<>();
for(Track track : all_track){
List<TrackCandidate> tracks_possible = new ArrayList<>();
for(TrackCandidate track : all_track){
if(track.get_Distance() < 45){
tracks_possible.add(track);
}
}

double window = 3.8;
for(Track track : tracks_possible) {
List<Track> tracks_with_close_starting_point = new ArrayList<>();
for (Track other_track : tracks_possible) {
for(TrackCandidate track : tracks_possible) {
List<TrackCandidate> tracks_with_close_starting_point = new ArrayList<>();
for (TrackCandidate other_track : tracks_possible) {
if (other_track.get_Clusters().get(0).get_X() > track.get_Clusters().get(0).get_X() - window
&& other_track.get_Clusters().get(0).get_X() < track.get_Clusters().get(0).get_X() + window
&& other_track.get_Clusters().get(0).get_Y() > track.get_Clusters().get(0).get_Y() - window
Expand All @@ -188,12 +188,12 @@ private void find_track_3_clusters(List<Cluster> AHDC_Cluster){

if(tracks_with_close_starting_point.size() > 0){
double chisq_min = Double.MAX_VALUE;
Track best_track = null;
for(Track other_track : tracks_with_close_starting_point){
TrackCandidate best_track = null;
for(TrackCandidate other_track : tracks_with_close_starting_point){
ArrayList<Double> x_ = new ArrayList<>();
ArrayList<Double> y_ = new ArrayList<>();
ArrayList<Double> w_ = new ArrayList<>(); // weight for circlefit
for(Cluster cluster : other_track.get_Clusters()){
for(AHDCCluster cluster : other_track.get_Clusters()){
x_.add(cluster.get_X());
y_.add(cluster.get_Y());
w_.add(1.);
Expand All @@ -209,17 +209,17 @@ private void find_track_3_clusters(List<Cluster> AHDC_Cluster){
}
}
if (best_track != null ){
_AHDCTracks.add(best_track);
_AHDCTrackCandidates.add(best_track);
}
}
}
}

public ArrayList<Track> get_AHDCTracks() {
return _AHDCTracks;
public ArrayList<TrackCandidate> get_AHDCTrackCandidates() {
return _AHDCTrackCandidates;
}

public void set_AHDCTracks(ArrayList<Track> _AHDCTracks) {
this._AHDCTracks = _AHDCTracks;
public void set_AHDCTrackCandidates(ArrayList<TrackCandidate> _AHDCTrackCandidates) {
this._AHDCTrackCandidates = _AHDCTrackCandidates;
}
}
Loading