7 #include <Math/Point3D.h>
8 #include <Math/Vector3D.h>
17 constexpr
auto cRED =
"\033[1;31m";
20 constexpr
auto cGREEN =
"\033[1;32m";
31 const Double_t M_Ener = M * 931.49401 / 1000.0;
32 Double_t p = brho * Z * (2.99792458 / 10.0);
33 Double_t E = TMath::Sqrt(TMath::Power(p, 2) + TMath::Power(M_Ener, 2)) - M_Ener;
35 return std::make_tuple(p, E);
41 Double_t vertexA = 0.0;
42 Double_t vertexB = 0.0;
46 vertexA = 1000.0 - iniClusterA.GetPosition().Z();
47 vertexB = 1000.0 - iniClusterB.GetPosition().Z();
48 }
else if (trA->
GetGeoTheta() * TMath::RadToDeg() > 90) {
51 vertexA = iniClusterA.GetPosition().Z();
52 vertexB = iniClusterB.GetPosition().Z();
55 return vertexA < vertexB;
59 Bool_t enableSingleVertexTrack, Double_t clusterRadius, Double_t clusterDistance)
62 Bool_t toMerge = kFALSE;
66 std::sort(trackCandSource->begin(), trackCandSource->end(),
67 [
this](
AtTrack *trA,
AtTrack *trB) { return FindVertexTrack(trA, trB); });
70 AtTrack *vertexTrack = *trackCandSource->begin();
72 if (enableSingleVertexTrack) {
75 for (
auto track : *trackCandSource)
76 track->SetIsMerged(kTRUE);
78 trackDest->push_back(*vertexTrack);
91 for (
auto it = trackCandSource->begin() + 1; it != trackCandSource->end(); ++it) {
102 Double_t endVertexZ = 0.0;
103 Double_t iniMergeZ = 0.0;
104 std::cout <<
" Trying to merge ... "
106 std::cout <<
" Vertex track " << vertexTrack->
GetTrackID() <<
" - Track to Merge " << trackToMerge->
GetTrackID()
109 std::cout <<
" Vertex angle " << vertexTrack->
GetGeoTheta() * TMath::RadToDeg() <<
"\n";
110 if (vertexTrack->
GetGeoTheta() * TMath::RadToDeg() < 90) {
114 endVertexZ = 1000.0 - endClusterVertex.GetPosition().Z();
115 iniMergeZ = 1000.0 - iniClusterMerge.GetPosition().Z();
117 Double_t distance = std::sqrt((iniClusterMerge.GetPosition() - endClusterVertex.GetPosition()).Mag2());
120 if (((iniMergeZ + 10.0) > endVertexZ) && distance < 200) {
124 }
else if (vertexTrack->
GetGeoTheta() * TMath::RadToDeg() > 90) {
128 endVertexZ = endClusterVertex.GetPosition().Z();
129 iniMergeZ = iniClusterMerge.GetPosition().Z();
130 Double_t distance = std::sqrt((iniClusterMerge.GetPosition() - endClusterVertex.GetPosition()).Mag2());
133 if (((iniMergeZ + 10.0) > endVertexZ) &&
141 std::cout <<
" --- Merging Succeeded! Vertex track " << vertexTrack->
GetTrackID() <<
" - Track to Merge "
143 for (
const auto &hit : trackToMerge->
GetHitArray()) {
145 vertexTrack->
AddHit(hit->Clone());
152 fTrackTransformer->ClusterizeSmooth3D(
153 *vertexTrack, clusterRadius,
159 std::cout <<
" --- Merging Failed ! Vertex track " << vertexTrack->
GetTrackID() <<
" - Track to Merge "
164 trackDest->push_back(*vertexTrack);
170 std::vector<AtTrack> *trackDest,
bool fitDirection,
bool simulationConv)
179 Double_t trackDist = 20.0;
180 Double_t angleSpread = 5.0;
181 Double_t centerSpread = 20.0;
182 Int_t minClusters = 3;
185 for (
auto trackCand : *trackCandSource) {
186 Double_t thetaCand = trackCand.GetGeoTheta();
187 auto &hitArrayCand = trackCand.GetHitArray();
188 std::pair<Double_t, Double_t> centerCand = trackCand.GetGeoCenter();
194 if (simulationConv) {
195 thetaCand = 180.0 - thetaCand * TMath::RadToDeg();
198 thetaCand = thetaCand * TMath::RadToDeg();
201 for (
auto trackJunk : *trackJunkSource) {
202 Double_t thetaJunk = trackJunk.GetGeoTheta();
203 auto &hitArrayJunk = trackJunk.GetHitArray();
204 std::pair<Double_t, Double_t> centerJunk = trackJunk.GetGeoCenter();
206 if (simulationConv) {
208 thetaJunk = 180.0 - thetaJunk * TMath::RadToDeg();
211 thetaJunk = thetaJunk * TMath::RadToDeg();
214 if (thetaCand > 90) {
224 }
else if (thetaCand < 90 && thetaJunk < 90) {
226 if ((thetaCand + angleSpread) > thetaJunk && (thetaCand - angleSpread) < thetaJunk) {
227 std::cout <<
" Center cand : " << centerCand.first <<
" - " << centerCand.second <<
" " << thetaCand
229 std::cout <<
" Center junk : " << centerJunk.first <<
" - " << centerJunk.second <<
" " << thetaJunk
231 Double_t centerDistance = TMath::Sqrt(TMath::Power(centerCand.first - centerJunk.first, 2) +
232 TMath::Power(centerCand.second - centerJunk.second, 2));
233 std::cout <<
" Distance " << centerDistance <<
"\n";
234 if (centerDistance < 50)
236 for (
const auto &hit : hitArrayJunk) {
238 track.
AddHit(hit->Clone());
253 if (trackJunkSource->size() > 0) {
254 Double_t pruneFraction = 10.0;
255 if (jnkHitCnt > hitArrayCand.size())
258 pruneFraction = 10.0;
260 Int_t numHits = (Int_t)track.
GetHitArray().size() / pruneFraction;
261 for (
auto iHit = 0; iHit < numHits; ++iHit)
265 trackDest->push_back(track);