8 #include <Math/Point3D.h>
11 #include <boost/core/checked_delete.hpp>
12 #include <boost/smart_ptr/shared_ptr.hpp>
13 #include <pcl/PointIndices.h>
14 #include <pcl/common/io.h>
26 constexpr
auto cRED =
"\033[1;31m";
29 constexpr
auto cGREEN =
"\033[1;32m";
41 pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzti(
new pcl::PointCloud<pcl::PointXYZI>());
44 eventToClusters(event, cloud_xyzti);
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 <<"
55 if (opt_params.
r < 0.0) {
58 if (opt_verbose > 0) {
59 std::cout <<
"Computed smoothed radius: " << dnn << std::endl;
64 if (opt_params.
s < 0.0) {
67 if (opt_verbose > 0) {
68 std::cout <<
"Computed distance scale: " << dnn << std::endl;
72 pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzti_smooth(
new pcl::PointCloud<pcl::PointXYZI>());
74 cloud_xyzti_smooth =
smoothenCloud(cloud_xyzti, opt_params.
r,
false);
78 std::vector<hc::triplet> triplets;
82 cluster =
use_hc(cloud_xyzti_smooth, triplets, opt_params.
s, opt_params.
t, opt_params.
m, opt_verbose);
85 return clustersToTrack(cloud_xyzti,
cluster, event);
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)
97 if (triplets.size() > 5) {
100 return hc::toCluster(triplets, cleaned_up_cluster_group, cloud->size());
102 return empty_cluster;
105 void AtPATTERN::AtTrackFinderHC::eventToClusters(
AtEvent &event, pcl::PointCloud<pcl::PointXYZI>::Ptr cloud)
107 Int_t nHits =
event.GetNumHits();
108 cloud->points.resize(nHits);
110 for (Int_t iHit = 0; iHit < nHits; iHit++) {
112 const AtHit hit =
event.GetHit(iHit);
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;
122 std::unique_ptr<AtPatternEvent> AtPATTERN::AtTrackFinderHC::clustersToTrack(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud,
125 std::vector<AtTrack> tracks;
127 std::vector<pcl::PointXYZI, Eigen::aligned_allocator<pcl::PointXYZI>> points = cloud->points;
129 std::vector<pcl::PointIndicesPtr> clusters =
cluster.getClusters();
131 for (
size_t clusterIndex = 0; clusterIndex < clusters.size(); ++clusterIndex) {
135 pcl::PointIndicesPtr
const &pointIndices = clusters[clusterIndex];
138 for (
int index : pointIndices->indices) {
139 pcl::PointXYZI point = cloud->points[index];
144 for (
auto it = points.end(); it != points.begin(); --it) {
145 if (it->x == point.x && it->y == point.y && it->z == point.z) {
147 if (it != points.end()) {
157 ClusterizeSmooth3D(track, 15.0, 30.5);
163 tracks.push_back(track);
167 std::cout <<
cRED <<
" Tracks found " << tracks.size() <<
cNORMAL <<
"\n";
170 auto retEvent = std::make_unique<AtPatternEvent>();
171 for (
const auto &point : points)
172 retEvent->AddNoise(event.
GetHit(point.intensity));
174 for (
auto &track : tracks) {
176 SetTrackInitialParameters(track);
177 retEvent->AddTrack(std::move(track));