ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtTrackFinderHC.cxx
Go to the documentation of this file.
1 #include "AtTrackFinderHC.h"
2 
3 #include "AtEvent.h" // for AtEvent
4 #include "AtHit.h" // for AtHit
5 #include "AtPatternEvent.h" // for AtPatternEvent
6 #include "AtTrack.h" // for AtTrack
7 
8 #include <Math/Point3D.h> // for PositionVector3D
9 
10 #include <Eigen/Core> // for aligned_allocator
11 #include <boost/core/checked_delete.hpp> // for checked_delete
12 #include <boost/smart_ptr/shared_ptr.hpp> // for shared_ptr
13 #include <pcl/PointIndices.h> // for PointIndicesPtr, PointIndices
14 #include <pcl/common/io.h> // for copyPointCloud
15 
16 #include "hc.h" // for triplet, cleanupClusterGroup
17 #include "msd.h" // for first_quartile
18 #include "smoothenCloud.h" // for smoothenCloud
19 
20 #include <algorithm>
21 #include <cmath> // for sqrt
22 #include <iostream> // for cout, cerr
23 #include <memory> // for allocator_traits<>::value_...
24 #include <utility> // for move
25 
26 constexpr auto cRED = "\033[1;31m";
27 constexpr auto cYELLOW = "\033[1;33m";
28 constexpr auto cNORMAL = "\033[0m";
29 constexpr auto cGREEN = "\033[1;32m";
30 
32 
33 std::unique_ptr<AtPatternEvent> AtPATTERN::AtTrackFinderHC::FindTracks(AtEvent &event)
34 {
35 
36  int opt_verbose = 0;
37 
38  hc_params opt_params = inputParams;
39 
40  // Parse AtTPCROOT date into PCL format
41  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzti(new pcl::PointCloud<pcl::PointXYZI>());
42 
44  eventToClusters(event, cloud_xyzti);
45 
46  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz(new pcl::PointCloud<pcl::PointXYZ>());
47  pcl::copyPointCloud(*cloud_xyzti, *cloud_xyz);
48  if (cloud_xyz->size() == 0) {
49  std::cerr << "Error: empty cloud <<"
50  "\n";
51  return nullptr;
52  }
53 
54  // compute default r if it is not given
55  if (opt_params.r < 0.0) {
56  float dnn = 2.0f * std::sqrt(msd::first_quartile(cloud_xyz));
57  opt_params.r = dnn;
58  if (opt_verbose > 0) {
59  std::cout << "Computed smoothed radius: " << dnn << std::endl;
60  }
61  }
62 
63  // compute default s if it is not given
64  if (opt_params.s < 0.0) {
65  float dnn = std::sqrt(msd::first_quartile(cloud_xyz)) / 3.0f;
66  opt_params.s = dnn;
67  if (opt_verbose > 0) {
68  std::cout << "Computed distance scale: " << dnn << std::endl;
69  }
70  }
71 
72  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzti_smooth(new pcl::PointCloud<pcl::PointXYZI>());
73 
74  cloud_xyzti_smooth = smoothenCloud(cloud_xyzti, opt_params.r, false);
75 
76  // calculate cluster
78  std::vector<hc::triplet> triplets;
79 
80  triplets = hc::generateTriplets(cloud_xyzti_smooth, opt_params.k, opt_params.n, opt_params.a);
81 
82  cluster = use_hc(cloud_xyzti_smooth, triplets, opt_params.s, opt_params.t, opt_params.m, opt_verbose);
83 
84  // Adapt clusters to AtTrack
85  return clustersToTrack(cloud_xyzti, cluster, event);
86 }
87 
88 Cluster AtPATTERN::AtTrackFinderHC::use_hc(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud,
89  std::vector<hc::triplet> triplets, float scale, float cdist,
90  size_t cleanup_min_triplets, int opt_verbose = 0)
91 {
92 
93  hc::ScaleTripletMetric scale_triplet_metric(scale);
94 
95  Cluster empty_cluster;
96 
97  if (triplets.size() > 5) {
98  hc::cluster_group result = hc::compute_hc(cloud, triplets, scale_triplet_metric, cdist, opt_verbose);
99  hc::cluster_group const &cleaned_up_cluster_group = hc::cleanupClusterGroup(result, cleanup_min_triplets);
100  return hc::toCluster(triplets, cleaned_up_cluster_group, cloud->size());
101  } else
102  return empty_cluster;
103 }
104 
105 void AtPATTERN::AtTrackFinderHC::eventToClusters(AtEvent &event, pcl::PointCloud<pcl::PointXYZI>::Ptr cloud)
106 {
107  Int_t nHits = event.GetNumHits();
108  cloud->points.resize(nHits);
109 
110  for (Int_t iHit = 0; iHit < nHits; iHit++) {
111 
112  const AtHit hit = event.GetHit(iHit);
113  auto position = hit.GetPosition();
114  cloud->points[iHit].x = position.X();
115  cloud->points[iHit].y = position.Y();
116  cloud->points[iHit].z = position.Z();
117  cloud->points[iHit].intensity = iHit; // Storing the position of the hit in the event container
118  // std::cout<<position.Y()<<"\n";
119  }
120 }
121 
122 std::unique_ptr<AtPatternEvent> AtPATTERN::AtTrackFinderHC::clustersToTrack(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud,
123  Cluster const cluster, AtEvent &event)
124 {
125  std::vector<AtTrack> tracks;
126 
127  std::vector<pcl::PointXYZI, Eigen::aligned_allocator<pcl::PointXYZI>> points = cloud->points;
128 
129  std::vector<pcl::PointIndicesPtr> clusters = cluster.getClusters();
130 
131  for (size_t clusterIndex = 0; clusterIndex < clusters.size(); ++clusterIndex) {
132 
133  AtTrack track; // One track per cluster
134 
135  pcl::PointIndicesPtr const &pointIndices = clusters[clusterIndex];
136  // get color colour
137 
138  for (int index : pointIndices->indices) {
139  pcl::PointXYZI point = cloud->points[index];
140 
141  track.AddHit(event.GetHit(point.intensity));
142 
143  // remove clustered points from point-vector
144  for (auto it = points.end(); it != points.begin(); --it) {
145  if (it->x == point.x && it->y == point.y && it->z == point.z) {
146 
147  if (it != points.end()) {
148  points.erase(it);
149  break;
150  }
151  }
152  }
153 
154  } // Indices loop
155 
156  track.SetTrackID(clusterIndex);
157  ClusterizeSmooth3D(track, 15.0, 30.5); // 10.5,20.0
158  // Clusterize3D(track, 15.0, 30.5); //10.5,20.0
159 
160  if (kSetPrunning)
161  PruneTrack(track);
162 
163  tracks.push_back(track);
164 
165  } // Clusters loop
166 
167  std::cout << cRED << " Tracks found " << tracks.size() << cNORMAL << "\n";
168 
169  // Dump noise into pattern event
170  auto retEvent = std::make_unique<AtPatternEvent>();
171  for (const auto &point : points)
172  retEvent->AddNoise(event.GetHit(point.intensity));
173 
174  for (auto &track : tracks) {
175  if (track.GetHitArray().size() > 0)
176  SetTrackInitialParameters(track);
177  retEvent->AddTrack(std::move(track));
178  }
179  return retEvent;
180  /*ROOT::EnableThreadSafety();
181 
182  //Estimaton of track parameters
183  std::vector<std::future<void>> futures;
184  futures.reserve(10);
185 
186  for(auto& track : tracks)
187  {
188 
189  futures.push_back( std::async(std::launch::async,&AtPRA::SetTrackInitialParameters,this,std::ref(track)) );
190  //std::cout<<" Processing track "<<"\n";
191  //SetTrackInitialParameters(track);
192 
193  }
194 
195  for(auto& future : futures) future.wait();
196 
197  for(auto& track : tracks)
198  {
199  std::vector<Double_t>& coeffs = track.GetRANSACCoeff();
200 
201  std::cout<<" RANSAC coeff for Track "<<track.GetTrackID()<<"\n";
202 
203  for(auto& coeff : coeffs){
204 
205  std::cout<<coeff<<"\n";
206  }
207 
208  }*/
209 }
210 
AtEvent::GetHit
const AtHit & GetHit(Int_t hitNo) const
Definition: AtEvent.h:114
cGREEN
constexpr auto cGREEN
Definition: AtTrackFinderHC.cxx:29
scale
constexpr auto scale
Definition: AtHitCluster.cxx:15
AtPATTERN::AtTrackFinderHC::FindTracks
std::unique_ptr< AtPatternEvent > FindTracks(AtEvent &event) override
Definition: AtTrackFinderHC.cxx:33
AtEvent.h
use_hc
Cluster use_hc(pcl::PointCloud< pcl::PointXYZI >::Ptr cloud, std::vector< hc::triplet > triplets, float scale, float cdist, size_t cleanup_min_triplets, int opt_verbose=0)
Definition: main.cpp:196
msd.h
AtPATTERN::AtTrackFinderHC
Definition: AtTrackFinderHC.h:48
AtPATTERN
Definition: AtEventDrawTaskS800.h:41
AtPATTERN::AtTrackFinderHC::AtTrackFinderHC
AtTrackFinderHC()
Definition: AtTrackFinderHC.cxx:31
ClassImp
ClassImp(AtFindVertex)
AtPATTERN::AtPRA
Find patterns in hit clouds.
Definition: AtPRA.h:32
AtEvent
Definition: AtEvent.h:22
hc::generateTriplets
std::vector< triplet > generateTriplets(pcl::PointCloud< pcl::PointXYZI >::ConstPtr cloud, size_t k, size_t n, float a)
Definition: hc.cxx:22
hc::cluster
std::vector< size_t > cluster
Definition: hc.h:25
Cluster
Definition: cluster.h:9
hc::cleanupClusterGroup
cluster_group cleanupClusterGroup(cluster_group const &clusterGroup, size_t m)
Definition: hc.cxx:203
AtPATTERN::hc_params::s
float s
Definition: AtTrackFinderHC.h:38
msd::first_quartile
float first_quartile(pcl::PointCloud< pcl::PointXYZ >::Ptr cloud)
Definition: msd.cxx:65
AtHit::GetPosition
const XYZPoint & GetPosition() const
Definition: AtHit.h:79
AtHit.h
AtTrackFinderHC.h
AtPATTERN::hc_params::r
float r
Definition: AtTrackFinderHC.h:42
AtTrack
Definition: AtTrack.h:25
AtPATTERN::hc_params::t
float t
Definition: AtTrackFinderHC.h:44
AtTrack.h
AtPatternEvent.h
AtPATTERN::hc_params
Definition: AtTrackFinderHC.h:37
cNORMAL
constexpr auto cNORMAL
Definition: AtTrackFinderHC.cxx:28
hc.h
AtPATTERN::hc_params::m
size_t m
Definition: AtTrackFinderHC.h:41
hc::compute_hc
cluster_group compute_hc(pcl::PointCloud< pcl::PointXYZI >::ConstPtr cloud, std::vector< triplet > const &triplets, ScaleTripletMetric triplet_metric, float t, int opt_verbose)
Definition: hc.cxx:139
cYELLOW
constexpr auto cYELLOW
Definition: AtTrackFinderHC.cxx:27
hc::toCluster
Cluster toCluster(std::vector< hc::triplet > const &triplets, hc::cluster_group const &clusterGroup, size_t pointIndexCount)
Definition: hc.cxx:216
AtPATTERN::hc_params::a
float a
Definition: AtTrackFinderHC.h:43
AtPATTERN::hc_params::k
size_t k
Definition: AtTrackFinderHC.h:39
AtPATTERN::hc_params::n
size_t n
Definition: AtTrackFinderHC.h:40
AtTrack::GetHitArray
HitVector & GetHitArray()
Definition: AtTrack.h:79
AtTrack::SetTrackID
void SetTrackID(Int_t val)
Definition: AtTrack.h:96
smoothenCloud
pcl::PointCloud< pcl::PointXYZI >::Ptr smoothenCloud(pcl::PointCloud< pcl::PointXYZI >::Ptr cloud, double r, bool useMedian)
Definition: smoothenCloud.cxx:15
AtHit
Point in space with charge.
Definition: AtHit.h:27
hc::cluster_group
Definition: hc.h:27
smoothenCloud.h
cRED
constexpr auto cRED
Definition: AtTrackFinderHC.cxx:26
hc::ScaleTripletMetric
Definition: hc.h:37
AtTrack::AddHit
void AddHit(const AtHit &hit)
Definition: AtTrack.h:97