11 #include <FairLogger.h>
13 #include <Math/Vector3D.h>
22 constexpr
auto cRED =
"\033[1;31m";
25 constexpr
auto cGREEN =
"\033[1;32m";
29 fBeamPoint.SetXYZ(0, 0, 500);
30 fBeamDir.SetXYZ(0, 0, 1);
32 fBeamLine[0] = fBeamPoint.X();
33 fBeamLine[1] = fBeamPoint.Y();
34 fBeamLine[2] = fBeamPoint.Z();
35 fBeamLine[3] = fBeamDir.X();
36 fBeamLine[4] = fBeamDir.Y();
37 fBeamLine[5] = fBeamDir.Z();
44 if (tracks.size() < nbTracksPerVtx)
46 switch (nbTracksPerVtx) {
54 std::vector<std::vector<Double_t>> lines;
55 std::vector<Int_t> itracks;
57 for (
auto track : tracks) {
60 std::vector<Double_t> patternPar;
61 patternPar = ransacLine->GetPatternPar();
62 if (patternPar.size() == 0)
64 lines.push_back(patternPar);
65 itracks.push_back(it);
67 std::vector<std::pair<Int_t, XYZVector>> cogVtx;
72 for (
auto &[num, pos] : cogVtx) {
73 if (pos.Z() <= 0 || pos.Z() >= 1000 || sqrt(pos.Perp2()) > 30)
75 std::vector<AtTrack> tracksVtx;
76 tracksVtx.push_back(tracks.at(num));
86 std::vector<std::vector<Double_t>> lines;
87 std::vector<Double_t> wlines;
88 for (
auto track : tracks) {
90 std::vector<Double_t> patternPar;
91 patternPar = ransacLine->GetPatternPar();
92 if (patternPar.size() == 0)
94 lines.push_back(patternPar);
95 wlines.push_back(ransacLine->GetChi2());
100 std::vector<AtTrack> tracksFromSameVtx;
101 std::vector<std::vector<Int_t>> vtxCand;
103 for (Int_t i = 0; i < vtxCand.size(); i++)
104 std::cout << vtxCand.size() <<
" check vtxCand size " << vtxCand.at(i).size() << std::endl;
106 std::vector<XYZVector> cogVtx;
107 cogVtx =
CoGVtx(vtxCand, lines, wlines);
111 if (vtxCand.size() != cogVtx.size())
112 LOG(WARNING) <<
cYELLOW <<
"AtFindVertex : vtxCand.size() != cogVtx.size()" <<
cNORMAL << std::endl;
114 for (Int_t i = 0; i < vtxCand.size(); i++) {
115 if (cogVtx.at(i).X() != cogVtx.at(i).X() || cogVtx.at(i).Y() != cogVtx.at(i).Y() ||
116 cogVtx.at(i).Z() != cogVtx.at(i).Z())
118 if (cogVtx.at(i).Z() <= 0 || cogVtx.at(i).Z() >= 1000 || sqrt(cogVtx.at(i).Perp2()) > 30)
120 if (vtxCand.at(i).size() > nbTracksPerVtx)
121 std::cout <<
cYELLOW <<
" vtx with more than " << nbTracksPerVtx <<
" tracks(" << vtxCand.at(i).size() <<
")"
123 std::vector<AtTrack> tracksVtx;
124 for (
auto vtxInd : vtxCand.at(i)) {
125 tracksVtx.push_back(tracks.at(vtxInd));
136 std::vector<std::vector<Int_t>> result;
137 std::vector<Int_t> paired;
138 std::vector<XYZVector> vtx;
141 for (Int_t i = 0; i < lines.size() - 1; i++) {
142 if (std::find(paired.begin(), paired.end(), i) != paired.end())
144 std::vector<Double_t> line = lines.at(i);
146 for (Int_t j = i + 1; j < lines.size(); j++) {
147 if (std::find(paired.begin(), paired.end(), j) != paired.end())
151 std::vector<Double_t> line_f = lines.at(j);
153 if (vtx.size() == 0) {
154 Double_t angle =
angLines(line, line_f);
157 if (dist < fLineDistThreshold) {
158 if (angle < 10 || angle > 170) {
161 buffVtx = 0.5 * (vtxLines1 + vtxLines2);
168 vtx.push_back(buffVtx);
176 sqrt((vtx.back() - projVtx).Mag2());
177 Double_t radProjVtx = sqrt((0.5 * (vtx.back() + projVtx)).Perp2());
180 if (dist1 < fLineDistThreshold &&
182 if (std::find(paired.begin(), paired.end(), i) == paired.end()) {
190 if (paired.size() > 1)
191 result.push_back(paired);
200 std::vector<std::pair<Int_t, XYZVector>>
203 std::vector<std::pair<Int_t, XYZVector>> result;
204 for (Int_t i = 0; i < lines.size(); i++) {
207 std::vector<Double_t> line = lines.at(i);
209 Double_t dist =
distLines(line, fBeamLine);
210 if (dist < fLineDistThreshold) {
212 vtx = projVtxOnLines1.at(
214 auto p = std::make_pair(itracks.at(i), vtx);
223 std::vector<std::vector<Double_t>> lines, std::vector<Double_t> wlines)
225 std::vector<XYZVector> result;
228 for (
auto iv : vtxCand) {
232 std::vector<XYZVector> sumVtx;
235 sumVtx.resize(iv.size(), buffVec1);
237 for (Int_t i = 0; i < iv.size() - 1; i++) {
239 std::vector<Double_t> line = lines.at(ii);
241 for (Int_t j = i + 1; j < iv.size(); j++) {
243 std::vector<Double_t> line_f = lines.at(jj);
245 Double_t angle =
angLines(line, line_f);
247 if (dist < fLineDistThreshold) {
248 if (angle < 10 || angle > 170) {
251 sumVtx.at(i) += projVtxOnLines1.at(0);
252 sumVtx.at(j) += projVtxOnLines2.at(0);
255 sumVtx.at(i) += projVtxOnLines.at(0);
256 sumVtx.at(j) += projVtxOnLines.at(1);
265 for (Int_t i = 0; i < iv.size(); i++) {
268 CoG += sumVtx.at(i) * (1. / wlines.at(iv.at(i)));
269 sumW += (Double_t)(1. / wlines.at(iv.at(i)));
271 CoG = CoG * (1. / (iv.size() - 1)) * (1. / sumW);
272 std::cout <<
" vertex " << CoG.X() <<
" " << CoG.Y() <<
" " << CoG.Z() << std::endl;
273 result.push_back(CoG);
283 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
284 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
285 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
286 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
289 Double_t t1 = (p2 - p1).Dot(n2) / (d1.Dot(n2));
290 Double_t t2 = (p1 - p2).Dot(n1) / (d2.Dot(n1));
301 std::vector<XYZVector> result;
302 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
303 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
304 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
305 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
308 Double_t t1 = (p2 - p1).Dot(n2) / (d1.Dot(n2));
309 Double_t t2 = (p1 - p2).Dot(n1) / (d2.Dot(n1));
312 result.push_back(c1);
313 result.push_back(
c2);
322 XYZVector posOn(line.at(0), line.at(1), line.at(2));
323 XYZVector dir(line.at(3), line.at(4), line.at(5));
324 XYZVector vop1 = ((dir.Cross(pointToProj - posOn)).Cross(dir)).Unit();
325 Double_t paraVar1 = pointToProj.Dot(dir.Unit()) - posOn.Dot(dir.Unit());
326 Double_t paraVar2 = posOn.Dot(vop1) - pointToProj.Dot(vop1);
327 XYZVector vInter1 = posOn + dir.Unit() * paraVar1;
328 XYZVector vInter2 = pointToProj + vop1 * paraVar2;
329 if (sqrt((vInter1 - vInter2).Mag2()) < 1e-6)
338 return sqrt((ptLine - pt).Cross(dir).Mag2()) / sqrt(dir.Mag2());
344 XYZVector p1(line1.at(0), line1.at(1), line1.at(2));
345 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
346 XYZVector p2(line2.at(0), line2.at(1), line2.at(2));
347 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
350 return fabs(n.Dot(p1 - p2) / sqrt(n.Mag2()));
356 XYZVector d1(line1.at(3), line1.at(4), line1.at(5));
357 XYZVector d2(line2.at(3), line2.at(4), line2.at(5));
359 return acos(d1.Dot(d2) / (sqrt(d1.Mag2()) * sqrt(d2.Mag2()))) * 180. / 3.1415;
365 Bool_t result = kTRUE;
366 std::vector<Int_t> diff;
367 std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(diff, diff.begin()));
368 if (v1.size() != diff.size())