2 #include <Math/VectorUtil.h> 17 const std::array<ticl::Vector, 3> &
skeleton,
18 const unsigned int min_num_lcs,
19 const float min_trackster_energy,
20 const float pca_quality_th) {
24 trackster.
raw_energy() < min_trackster_energy) {
28 auto const sum = std::accumulate(std::begin(eigenvalues), std::end(eigenvalues), 0.
f);
29 float pcaQuality = eigenvalues[0] / sum;
30 if (pcaQuality > pca_quality_th) {
40 float r1 =
std::sqrt(point1.x() * point1.x() + point1.y() * point1.y());
44 float projective_distance = (
r1 - r2_at_z1) * (
r1 - r2_at_z1) + r2_at_z1 * r2_at_z1 *
delta_phi *
delta_phi;
45 LogDebug(
"TracksterLinkingbySkeletons") <<
"Computing distance between point : " << point1 <<
" And point " 46 << point2 <<
" Distance " << projective_distance << std::endl;
47 return projective_distance;
55 timing_quality_threshold_(conf.getParameter<double>(
"track_time_quality_threshold")),
56 del_(conf.getParameter<double>(
"wind")),
57 min_num_lcs_(conf.getParameter<unsigned
int>(
"min_num_lcs")),
58 min_trackster_energy_(conf.getParameter<double>(
"min_trackster_energy")),
59 pca_quality_th_(conf.getParameter<double>(
"pca_quality_th")),
60 dot_prod_th_(conf.getParameter<double>(
"dot_prod_th")),
61 max_distance_projective_sqr_(conf.getParameter<
std::
vector<double>>(
"max_distance_projective_sqr")),
62 min_distance_z_(conf.getParameter<
std::
vector<double>>(
"min_distance_z")),
63 max_distance_projective_sqr_closest_points_(
64 conf.getParameter<
std::
vector<double>>(
"max_distance_projective_sqr_closest_points")),
65 max_z_distance_closest_points_(conf.getParameter<
std::
vector<double>>(
"max_z_distance_closest_points")),
66 cylinder_radius_sqr_(conf.getParameter<
std::
vector<double>>(
"cylinder_radius_sqr"))
74 std::pair<float, float> rMinMax =
hgcons_->
rangeR(zVal,
true);
77 std::pair<float, float> rMinMax_interface =
hgcons_->
rangeR(zVal_interface,
true);
79 for (
int iSide = 0; iSide < 2; ++iSide) {
80 float zSide = (iSide == 0) ? (-1. * zVal) : zVal;
87 zSide = (iSide == 0) ? (-1. * zVal_interface) : zVal_interface;
91 SimpleDiskBounds(rMinMax_interface.first, rMinMax_interface.second, zSide - 0.5, zSide + 0.5))
110 float lower_percentage,
111 float upper_percentage,
115 auto const trackster_raw_energy = trackster.
raw_energy();
117 std::vector<unsigned int> sortedVertices(
vertices);
124 float cumulativeEnergyFraction = 0.f;
128 float outerLayerZ =
layerClusters[sortedVertices.back()].z();
129 bool foundInnerLayer =
false;
130 bool foundOuterLayer =
false;
131 for (
auto const &
v : sortedVertices) {
134 cumulativeEnergyFraction += lc.energy() / trackster_raw_energy;
135 if (cumulativeEnergyFraction >= lower_percentage and not foundInnerLayer) {
136 innerLayerId = n_lay;
137 innerLayerZ = lc.z();
138 foundInnerLayer =
true;
140 if (cumulativeEnergyFraction >= upper_percentage and not foundOuterLayer) {
141 outerLayerId = n_lay;
142 outerLayerZ = lc.z();
143 foundOuterLayer =
true;
146 std::array<ticl::Vector, 3>
skeleton;
147 int minimumDistanceInLayers = 4;
148 if (outerLayerId - innerLayerId < minimumDistanceInLayers) {
151 auto intersectLineWithSurface = [](
float surfaceZ,
const Vector &origin,
const Vector &direction) ->
Vector {
152 auto const t = (surfaceZ - origin.Z()) / direction.Z();
153 auto const iX =
t * direction.X() + origin.X();
154 auto const iY =
t * direction.Y() + origin.Y();
155 auto const iZ = surfaceZ;
161 auto const t0_p0 = intersectLineWithSurface(innerLayerZ, t0_p1, trackster.
eigenvectors(0));
162 auto const t0_p2 = intersectLineWithSurface(outerLayerZ, t0_p1, trackster.
eigenvectors(0));
171 const std::array<ticl::Vector, 3> &otherSkeleton,
172 const float radius_sqr) {
173 const auto &
first = mySkeleton[0];
174 const auto &
last = mySkeleton[2];
175 const auto &pointToCheck = otherSkeleton[0];
178 const auto &vecToPoint = pointToCheck -
first;
180 auto axisNorm = cylAxis.Dot(cylAxis);
181 auto projLength = vecToPoint.Dot(cylAxis) / axisNorm;
182 bool isWithinLength = projLength >= 0 && projLength <= 1;
187 const auto &
proj = cylAxis * projLength;
191 const auto &
distance = pointToCheck - pointOnAxis;
194 bool isWithinRadius = distance2 <= radius_sqr;
196 return isWithinRadius;
201 const std::array<ticl::Vector, 3> &mySkeleton,
202 const std::array<ticl::Vector, 3> &otherSkeleton) {
206 LogDebug(
"TracksterLinkingbySkeletons") <<
"Inner Trackster with energy " << myTrackster.
raw_energy() <<
" Num LCs " 207 << myTrackster.
vertices().size() <<
" NOT GOOD " << std::endl;
210 LogDebug(
"TracksterLinkingbySkeletons") <<
"Inner Trackster wi energy " << myTrackster.
raw_energy() <<
" Num LCs " 211 << myTrackster.
vertices().size() <<
" IS GOOD " << std::endl;
212 float proj_distance = projective_distance(mySkeleton[1], otherSkeleton[1]);
213 auto isEE = mySkeleton[1].z() <= zVal_interface ? 0 : 1;
215 LogDebug(
"TracksterLinkingbySkeletons")
216 <<
"\t Trying to compare with outer Trackster with energy " << otherTrackster.
raw_energy() <<
" Num LCS " 217 << otherTrackster.
vertices().size() <<
" Projective distance " << proj_distance <<
" areAlignedProjective " 223 if (areAlignedInProjectiveSpace) {
224 auto dotProdSkeletons =
225 ((mySkeleton[2] - mySkeleton[0]).Unit()).Dot((otherSkeleton[2] - otherSkeleton[0]).Unit());
226 bool alignedSkeletons = dotProdSkeletons >
dot_prod_th_;
227 LogDebug(
"TracksterLinkingbySkeletons")
228 <<
"\t Outer Trackster is Good, checking for skeleton alignment " << alignedSkeletons <<
" dotProd " 229 << dotProdSkeletons <<
" Threshold " <<
dot_prod_th_ << std::endl;
230 if (alignedSkeletons)
231 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t Linked! " << std::endl;
232 return alignedSkeletons;
235 LogDebug(
"TracksterLinkingbySkeletons")
236 <<
"\t Outer Trackster is not aligned, check skeletons distances " << std::endl;
237 int myClosestPoint = -1;
238 int otherClosestPoint = -1;
240 for (
int i = 0;
i < 3;
i++) {
241 for (
int j = 0;
j < 3;
j++) {
242 float dist_z =
std::abs(mySkeleton[
i].
Z() - otherSkeleton[
j].
Z());
243 if (dist_z < minDistance_z) {
245 otherClosestPoint =
j;
246 minDistance_z = dist_z;
251 LogDebug(
"TracksterLinkingbySkeletons")
252 <<
"\t Trackster have distance in Z " << minDistance_z
253 <<
"Checking if they are aligned in projective space " 254 << projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) <<
" TH " 256 if (projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) <
258 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t Linked! " << std::endl;
260 return projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) <
263 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t Not Linked Distance Z " << minDistance_z << std::endl;
268 LogDebug(
"TracksterLinkingbySkeletons")
269 <<
"\t Outer Trackster is NOT GOOD, check projective space alignment " << areAlignedInProjectiveSpace
271 if (areAlignedInProjectiveSpace) {
272 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t Linked! " << std::endl;
275 LogDebug(
"TracksterLinkingbySkeletons")
276 <<
"\t Not aligned in projective space, check distance between closest points in the two skeletons " 279 int myClosestPoint = -1;
280 int otherClosestPoint = -1;
283 for (
int i = 1;
i < 3;
i++) {
284 for (
int j = 0;
j < 3;
j++) {
285 float dist_z =
std::abs(mySkeleton[
i].
Z() - otherSkeleton[
j].
Z());
286 if (dist_z < minDistance_z) {
288 otherClosestPoint =
j;
289 minDistance_z = dist_z;
293 float d = projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]);
294 LogDebug(
"TracksterLinkingbySkeletons")
295 <<
"\t\t Distance between closest points " <<
d <<
" TH " << 10.f <<
" Z Distance " << minDistance_z
299 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t\t Linked! " <<
d << std::endl;
302 LogDebug(
"TracksterLinkingbySkeletons") <<
"Distance between closest point " <<
d <<
" Distance in z " 305 LogDebug(
"TracksterLinkingbySkeletons") <<
"Two Points are in Cylinder " <<
isInCylinder << std::endl;
307 LogDebug(
"TracksterLinkingbySkeletons") <<
"\t\t\t Linked! " <<
d << std::endl;
318 std::vector<Trackster> &resultTracksters,
319 std::vector<std::vector<unsigned int>> &linkedResultTracksters,
320 std::vector<std::vector<unsigned int>> &linkedTracksterIdToInputTracksterId) {
321 const auto &tracksters =
input.tracksters;
325 std::vector<unsigned int> sortedTracksters(tracksters.size());
326 std::iota(sortedTracksters.begin(), sortedTracksters.end(), 0);
327 std::sort(sortedTracksters.begin(), sortedTracksters.end(), [&tracksters](
unsigned int i,
unsigned int j) {
328 return tracksters[
i].raw_energy() > tracksters[
j].raw_energy();
333 std::array<TICLLayerTile, 2> tracksterTile;
336 std::vector<std::array<ticl::Vector, 3>> skeletons(tracksters.size());
337 for (
auto const t_idx : sortedTracksters) {
338 const auto &trackster = tracksters[t_idx];
340 tracksterTile[trackster.
barycenter().eta() > 0.f].fill(
343 std::vector<int> maskReceivedLink(tracksters.size(), 1);
344 std::vector<int> isRootTracksters(tracksters.size(), 1);
346 std::vector<Node> allNodes;
347 for (
size_t it = 0;
it < tracksters.size(); ++
it) {
348 allNodes.emplace_back(
it);
352 for (
auto const &t_idx : sortedTracksters) {
353 auto const &trackster = tracksters[t_idx];
354 auto const &
skeleton = skeletons[t_idx];
360 const auto &tiles = tracksterTile[
tileIndex];
361 std::array<int, 4> search_box = tiles.searchBoxEtaPhi(
eta_min,
eta_max, bary.phi() -
del_, bary.phi() +
del_);
362 if (search_box[2] > search_box[3]) {
366 for (
int eta_i = search_box[0]; eta_i <= search_box[1]; ++eta_i) {
367 for (
int phi_i = search_box[2]; phi_i <= search_box[3]; ++phi_i) {
369 for (
auto n : neighbours) {
372 if (maskReceivedLink[
n] == 0
or allNodes[t_idx].isInnerNeighbour(
n))
375 LogDebug(
"TracksterLinkingbySkeletons")
376 <<
"Trying to Link Trackster " << t_idx <<
" With Trackster " <<
n << std::endl;
378 LogDebug(
"TracksterLinkingbySkeletons")
379 <<
"\t==== LINK: Trackster " << t_idx <<
" Linked with Trackster " <<
n << std::endl;
380 maskReceivedLink[
n] = 0;
381 allNodes[t_idx].addOuterNeighbour(
n);
382 allNodes[
n].addInnerNeighbour(t_idx);
383 isRootTracksters[
n] = 0;
391 LogDebug(
"TracksterLinkingbySkeletons") <<
"**************** FINAL GRAPH **********************" << std::endl;
392 for (
auto const &node : allNodes) {
393 if (isRootTracksters[node.getId()]) {
394 LogDebug(
"TracksterLinkingbySkeletons")
396 <<
" Node " << node.getId() <<
" position " << tracksters[node.getId()].barycenter() <<
" energy " 397 << tracksters[node.getId()].raw_energy() << std::endl;
399 LogDebug(
"TracksterLinkingbySkeletons")
400 <<
"Node " << node.getId() <<
" position " << tracksters[node.getId()].barycenter() <<
" energy " 401 << tracksters[node.getId()].raw_energy() << std::endl;
404 LogDebug(
"TracksterLinkingbySkeletons") <<
"********************************************************" << std::endl;
406 TICLGraph graph(allNodes, isRootTracksters);
410 linkedTracksterIdToInputTracksterId.resize(
components.size());
412 LogDebug(
"TracksterLinkingbySkeletons") <<
"Component " << ic <<
" Node: ";
413 std::vector<unsigned int> linkedTracksters;
415 if (
comp.size() == 1) {
416 if (
input.tracksters[
comp[0]].vertices().size() <= 3) {
420 for (
auto const &node :
comp) {
421 LogDebug(
"TracksterLinkingbySkeletons") << node <<
" ";
422 linkedTracksterIdToInputTracksterId[ic].push_back(node);
425 linkedTracksters.push_back(resultTracksters.size());
426 resultTracksters.push_back(outTrackster);
427 linkedResultTracksters.push_back(linkedTracksters);
428 LogDebug(
"TracksterLinkingbySkeletons") <<
"\n";
double waferZ(int layer, bool reco) const
constexpr double deltaPhi(double phi1, double phi2)
static DiskPointer build(Args &&... args)
std::vector< double > min_distance_z_
edm::ESHandle< MagneticField > bfield_
static constexpr int nPhiBins
std::vector< double > max_distance_projective_sqr_
const Vector & barycenter() const
static constexpr float maxEta
void linkTracksters(const Inputs &input, std::vector< Trackster > &resultTracksters, std::vector< std::vector< unsigned int >> &linkedResultTracksters, std::vector< std::vector< unsigned int >> &linkedTracksterIdToInputTracksterId) override
ticl::Trackster::Vector Vector
edm::ESHandle< Propagator > propagator_
bool areCompatible(const ticl::Trackster &myTrackster, const ticl::Trackster &otherTrackster, const std::array< ticl::Vector, 3 > &mySkeleton, const std::array< ticl::Vector, 3 > &otherSkeleton)
static std::string const input
int32_t tileIndex(int32_t layer, int32_t ring, int32_t phi)
const HGCalDDDConstants * hgcons_
const std::array< Vector, 3 > & eigenvectors() const
TracksterLinkingbySkeletons(const edm::ParameterSet &conf, edm::ConsumesCollector iC)
double intersection(double r12)
void mergeTracksters(const Trackster &other)
std::array< ticl::Vector, 3 > findSkeletonNodes(const ticl::Trackster &trackster, float lower_percentage, float upper_percentage, const std::vector< reco::CaloCluster > &layerClusters, const hgcal::RecHitTools &rhtools)
const float raw_energy() const
hgcal::RecHitTools rhtools_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Abs< T >::type abs(const T &t)
std::unique_ptr< GeomDet > interfaceDisk_[2]
static constexpr float minEta
std::vector< double > max_distance_projective_sqr_closest_points_
std::pair< double, double > rangeR(double z, bool reco) const
std::vector< unsigned int > & vertices()
std::vector< std::vector< unsigned int > > findSubComponents()
std::unique_ptr< GeomDet > firstDisk_[2]
float min_trackster_energy_
void initialize(const HGCalDDDConstants *hgcons, const hgcal::RecHitTools rhtools, const edm::ESHandle< MagneticField > bfieldH, const edm::ESHandle< Propagator > propH) override
std::vector< double > max_z_distance_closest_points_
unsigned int min_num_lcs_
const std::array< float, 3 > & eigenvalues() const
std::vector< double > cylinder_radius_sqr_
bool isInCylinder(const std::array< ticl::Vector, 3 > &mySkeleton, const std::array< ticl::Vector, 3 > &otherSkeleton, const float radius_sqr)