11 #include <FairLogger.h>
13 #include <Math/Vector3D.h>
22 constexpr
auto cRED =
"\033[1;31m";
25 constexpr
auto cGREEN =
"\033[1;32m";
31 fBeamPoint.SetXYZ(0, 0, 500);
32 fBeamDir.SetXYZ(0, 0, 1);
34 fBeamLine[0] = fBeamPoint.X();
35 fBeamLine[1] = fBeamPoint.Y();
36 fBeamLine[2] = fBeamPoint.Z();
37 fBeamLine[3] = fBeamDir.X();
38 fBeamLine[4] = fBeamDir.Y();
39 fBeamLine[5] = fBeamDir.Z();
46 if (tracks.size() < nbTracksPerVtx)
48 switch (nbTracksPerVtx) {
56 std::vector<std::vector<Double_t>> lines;
57 std::vector<Int_t> itracks;
59 for (
auto track : tracks) {
62 std::vector<Double_t> patternPar;
63 patternPar = ransacLine->GetPatternPar();
64 if (patternPar.size() == 0)
66 lines.push_back(patternPar);
67 itracks.push_back(it);
69 std::vector<std::pair<Int_t, XYZVector>> cogVtx;
74 for (
auto &[num, pos] : cogVtx) {
75 if (pos.Z() <= 0 || pos.Z() >= 1000 || sqrt(pos.Perp2()) > 30)
77 std::vector<AtTrack> tracksVtx;
78 tracksVtx.push_back(tracks.at(num));
88 std::vector<std::vector<Double_t>> lines;
89 std::vector<Double_t> wlines;
90 for (
auto track : tracks) {
92 std::vector<Double_t> patternPar;
93 patternPar = ransacLine->GetPatternPar();
94 if (patternPar.size() == 0)
96 lines.push_back(patternPar);
97 wlines.push_back(ransacLine->GetChi2());
102 std::vector<AtTrack> tracksFromSameVtx;
103 std::vector<std::vector<Int_t>> vtxCand;
105 for (Int_t i = 0; i < vtxCand.size(); i++)
106 std::cout << vtxCand.size() <<
" check vtxCand size " << vtxCand.at(i).size() << std::endl;
108 std::vector<XYZVector> cogVtx;
109 cogVtx =
CoGVtx(vtxCand, lines, wlines);
113 if (vtxCand.size() != cogVtx.size())
114 LOG(WARNING) <<
cYELLOW <<
"AtFindVertex : vtxCand.size() != cogVtx.size()" <<
cNORMAL << std::endl;
116 for (Int_t i = 0; i < vtxCand.size(); i++) {
117 if (cogVtx.at(i).X() != cogVtx.at(i).X() || cogVtx.at(i).Y() != cogVtx.at(i).Y() ||
118 cogVtx.at(i).Z() != cogVtx.at(i).Z())
120 if (cogVtx.at(i).Z() <= 0 || cogVtx.at(i).Z() >= 1000 || sqrt(cogVtx.at(i).Perp2()) > 30)
122 if (vtxCand.at(i).size() > nbTracksPerVtx)
123 std::cout <<
cYELLOW <<
" vtx with more than " << nbTracksPerVtx <<
" tracks(" << vtxCand.at(i).size() <<
")"
125 std::vector<AtTrack> tracksVtx;
126 for (
auto vtxInd : vtxCand.at(i)) {
127 tracksVtx.push_back(tracks.at(vtxInd));
138 std::vector<std::vector<Int_t>> result;
139 std::vector<Int_t> paired;
140 std::vector<XYZVector> vtx;
143 for (Int_t i = 0; i < lines.size() - 1; i++) {
144 if (std::find(paired.begin(), paired.end(), i) != paired.end())
146 std::vector<Double_t> line = lines.at(i);
148 for (Int_t j = i + 1; j < lines.size(); j++) {
149 if (std::find(paired.begin(), paired.end(), j) != paired.end())
153 std::vector<Double_t> line_f = lines.at(j);
155 if (vtx.size() == 0) {
156 Double_t angle =
angLines(line, line_f);
159 if (dist < fLineDistThreshold) {
160 if (angle < 10 || angle > 170) {
163 buffVtx = 0.5 * (vtxLines1 + vtxLines2);
170 vtx.push_back(buffVtx);
178 sqrt((vtx.back() - projVtx).Mag2());
179 Double_t radProjVtx = sqrt((0.5 * (vtx.back() + projVtx)).Perp2());
182 if (dist1 < fLineDistThreshold &&
184 if (std::find(paired.begin(), paired.end(), i) == paired.end()) {
192 if (paired.size() > 1)
193 result.push_back(paired);
202 std::vector<std::pair<Int_t, XYZVector>>
205 std::vector<std::pair<Int_t, XYZVector>> result;
206 for (Int_t i = 0; i < lines.size(); i++) {
209 std::vector<Double_t> line = lines.at(i);
211 Double_t dist =
distLines(line, fBeamLine);
212 if (dist < fLineDistThreshold) {
214 vtx = projVtxOnLines1.at(
216 auto p = std::make_pair(itracks.at(i), vtx);
225 std::vector<std::vector<Double_t>> lines, std::vector<Double_t> wlines)
227 std::vector<XYZVector> result;
230 for (
auto iv : vtxCand) {
234 std::vector<XYZVector> sumVtx;
237 sumVtx.resize(iv.size(), buffVec1);
239 for (Int_t i = 0; i < iv.size() - 1; i++) {
241 std::vector<Double_t> line = lines.at(ii);
243 for (Int_t j = i + 1; j < iv.size(); j++) {
245 std::vector<Double_t> line_f = lines.at(jj);
247 Double_t angle =
angLines(line, line_f);
249 if (dist < fLineDistThreshold) {
250 if (angle < 10 || angle > 170) {
253 sumVtx.at(i) += projVtxOnLines1.at(0);
254 sumVtx.at(j) += projVtxOnLines2.at(0);
257 sumVtx.at(i) += projVtxOnLines.at(0);
258 sumVtx.at(j) += projVtxOnLines.at(1);
267 for (Int_t i = 0; i < iv.size(); i++) {
270 CoG += sumVtx.at(i) * (1. / wlines.at(iv.at(i)));
271 sumW += (Double_t)(1. / wlines.at(iv.at(i)));
273 CoG = CoG * (1. / (iv.size() - 1)) * (1. / sumW);
274 std::cout <<
" vertex " << CoG.X() <<
" " << CoG.Y() <<
" " << CoG.Z() << std::endl;
275 result.push_back(CoG);
285 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
286 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
287 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
288 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
291 Double_t t1 = (p2 - p1).Dot(n2) / (d1.Dot(n2));
292 Double_t t2 = (p1 - p2).Dot(n1) / (d2.Dot(n1));
303 std::vector<XYZVector> result;
304 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
305 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
306 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
307 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
310 Double_t t1 = (p2 - p1).Dot(n2) / (d1.Dot(n2));
311 Double_t t2 = (p1 - p2).Dot(n1) / (d2.Dot(n1));
314 result.push_back(c1);
315 result.push_back(
c2);
324 XYZVector posOn(line.at(0), line.at(1), line.at(2));
325 XYZVector dir(line.at(3), line.at(4), line.at(5));
326 XYZVector vop1 = ((dir.Cross(pointToProj - posOn)).Cross(dir)).Unit();
327 Double_t paraVar1 = pointToProj.Dot(dir.Unit()) - posOn.Dot(dir.Unit());
328 Double_t paraVar2 = posOn.Dot(vop1) - pointToProj.Dot(vop1);
329 XYZVector vInter1 = posOn + dir.Unit() * paraVar1;
330 XYZVector vInter2 = pointToProj + vop1 * paraVar2;
331 if (sqrt((vInter1 - vInter2).Mag2()) < 1e-6)
340 return sqrt((ptLine - pt).Cross(dir).Mag2()) / sqrt(dir.Mag2());
346 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
347 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
348 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
349 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
352 return fabs(n.Dot(p1 - p2) / sqrt(n.Mag2()));
358 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
359 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
361 return acos(d1.Dot(d2) / (sqrt(d1.Mag2()) * sqrt(d2.Mag2()))) * 180. / 3.1415;
367 Bool_t result = kTRUE;
368 std::vector<Int_t> diff;
369 std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(diff, diff.begin()));
370 if (v1.size() != diff.size())