123 Double_t minVZ = 1000;
126 Double_t minDist = 1000;
127 vector<BmnTrack> trackCombination;
128 vector<BmnTrack> bestCombination;
129 if (lTracks.size() != 0 && rTracks.size() != 0) {
132 for (
auto lTr : lTracks) {
133 for (
auto rTr : rTracks) {
134 trackCombination.push_back(lTr);
135 trackCombination.push_back(rTr);
138 if (
dist < minDist) {
141 bestCombination = trackCombination;
143 trackCombination.clear();
146 }
else if (lTracks.size() != 0 && rTracks.size() == 0) {
147 for (
auto lTr : lTracks) {
148 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
150 if (gl->GetUpstreamTrackIndex() == -1)
continue;
151 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
153 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
155 if (mTr->
GetParamFirst()->GetZ() < -700) trackCombination.push_back(*mTr);
157 trackCombination.push_back(lTr);
160 if (
dist < minDist) {
163 bestCombination = trackCombination;
165 trackCombination.clear();
167 }
else if (rTracks.size() != 0 && lTracks.size() == 0) {
168 for (
auto rTr : rTracks) {
169 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
171 if (gl->GetUpstreamTrackIndex() == -1)
continue;
172 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
174 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
176 if (mTr->
GetParamFirst()->GetZ() < -700) trackCombination.push_back(*mTr);
178 trackCombination.push_back(rTr);
181 if (
dist < minDist) {
184 bestCombination = trackCombination;
186 trackCombination.clear();
188 }
else if (rTracks.size() == 0 && lTracks.size() == 0) {
189 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
191 if (gl->GetUpstreamTrackIndex() == -1)
continue;
192 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
194 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
196 if (mTr->
GetParamFirst()->GetZ() < -700) trackCombination.push_back(*mTr);
200 if (
dist < minDist) {
203 bestCombination = trackCombination;
205 trackCombination.clear();
207 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex();
209 if (minDist > 10.0) {
210 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex();
212 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
220 Double_t bx = x - ax * z;
221 Double_t by = y - ay * z;
222 vx = ax * minVZ + bx;
223 vy = ay * minVZ + by;
226 Bool_t isLeft = kFALSE;
227 Bool_t isRight = kFALSE;
228 Bool_t isFragm = kFALSE;
229 Bool_t isBeam = kFALSE;
230 for (
size_t iTr = 0; iTr < bestCombination.size(); ++iTr)
232 BmnTrack track = bestCombination[iTr];
233 if (track.
GetFlag() == 13)
continue;
236 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()])
BmnTrack(track);
241 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()])
BmnTrack(track);
252 Int_t type = (isRight && isLeft) ? 10 : (isLeft && isFragm && isBeam) ? 11 : (isRight && isFragm && isBeam) ? 12 : (isBeam && isFragm) ? 13 : -1;
255 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
257 if (gl.
GetFlag() != 13) idx.push_back(iGl);
260 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex(vx, vy, minVZ, minDist, 0, bestCombination.size(), TMatrixFSym(3), type, idx);
265 Float_t minDist = DBL_MAX;
266 Float_t minVZ = DBL_MAX;
267 vector<BmnTrack> trackCombination;
268 vector<BmnTrack> bestCombination;
269 if (lTracks.size() > 0 && rTracks.size() > 0) {
270 for (
auto lTr : lTracks) {
271 for (
auto rTr : rTracks) {
272 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
274 if (gl.GetUpstreamTrackIndex() != -1)
275 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
277 trackCombination.push_back(lTr);
278 trackCombination.push_back(rTr);
282 trackCombination.clear();
285 if (
dist < minDist) {
288 bestCombination = trackCombination;
290 trackCombination.clear();
293 }
else if (lTracks.size() == 0 && rTracks.size() > 0) {
294 for (
auto rTr : rTracks) {
295 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
297 if (gl.GetUpstreamTrackIndex() != -1)
298 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
300 trackCombination.push_back(rTr);
304 trackCombination.clear();
307 if (
dist < minDist) {
310 bestCombination = trackCombination;
312 trackCombination.clear();
314 }
else if (lTracks.size() > 0 && rTracks.size() == 0) {
315 for (
auto lTr : lTracks) {
316 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
318 if (gl.GetUpstreamTrackIndex() != -1)
319 trackCombination.push_back(*((
BmnTrack *)fGlobalTracksArray->At(iGl)));
321 trackCombination.push_back(lTr);
325 trackCombination.clear();
328 if (
dist < minDist) {
331 bestCombination = trackCombination;
333 trackCombination.clear();
336 if (minDist > 10.0) {
337 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex();
339 vector<Double_t> xHits;
340 vector<Double_t> yHits;
341 for (
size_t iTr = 0; iTr < bestCombination.size(); ++iTr)
343 BmnTrack *track = &bestCombination[iTr];
351 track->
SetB(len / track->
GetB() / (TMath::C() * 1e-7));
352 xHits.push_back(par0.GetX());
353 yHits.push_back(par0.GetY());
355 if (xHits.size() < 2) {
356 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex();
360 Bool_t isLeft = kFALSE;
361 Bool_t isRight = kFALSE;
362 Bool_t isFragm = kFALSE;
363 for (
size_t iTr = 0; iTr < bestCombination.size(); ++iTr)
365 BmnTrack track = bestCombination[iTr];
366 if (track.
GetFlag() == 13)
continue;
369 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()])
BmnTrack(track);
374 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()])
BmnTrack(track);
383 Int_t type = (isRight && isLeft && isFragm) ? 10 : (isRight && isLeft) ? 11 : (isLeft && isFragm) ? 12 : 13;
386 Double_t vx = Mean(xHits.begin(), xHits.end());
387 Double_t vy = Mean(yHits.begin(), yHits.end());
390 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
392 if (gl.
GetFlag() != 13) idx.push_back(iGl);
395 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
BmnVertex(vx, vy, vz, minDist, 0, xHits.size(), TMatrixFSym(3), type, idx);
420 const Int_t nPlanes = 5;
423 while (range >= 0.01) {
424 Float_t zMax = minZ + range;
425 Float_t zMin = minZ - range;
426 Float_t zStep = (zMax - zMin) / (nPlanes - 1);
428 vector<Double_t> xHits[nPlanes];
429 vector<Double_t> yHits[nPlanes];
430 Float_t zPlane[nPlanes];
431 Float_t rRMS[nPlanes] = {0};
433 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane)
434 zPlane[iPlane] = zMax - iPlane * zStep;
438 for (
size_t iTr = 0; iTr < tracks.size(); ++iTr)
442 Double_t xTr[nPlanes];
443 Double_t yTr[nPlanes];
445 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
452 xTr[iPlane] = par0.GetX();
453 yTr[iPlane] = par0.GetY();
460 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
461 xHits[iPlane].push_back(xTr[iPlane]);
462 yHits[iPlane].push_back(yTr[iPlane]);
473 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
474 rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
476 TGraph *vertex =
new TGraph(nPlanes, zPlane, rRMS);
477 TFitResultPtr ptr = vertex->Fit(
"pol2",
"QFS");
478 Float_t c = ptr->Parameter(0);
479 Float_t b = ptr->Parameter(1);
480 Float_t a = ptr->Parameter(2);
482 minDist = a * minZ * minZ + b * minZ + c;
491 vector<Int_t> lTofHitIdx;
492 vector<Int_t> rTofHitIdx;
493 for (Int_t iTof = 0; iTof < fTof400HitsArray->GetEntriesFast(); ++iTof) {
495 if (tHit->GetX() > 0)
496 lTofHitIdx.push_back(iTof);
498 rTofHitIdx.push_back(iTof);
503 vector<Int_t> lGemHitIdx;
504 vector<Int_t> rGemHitIdx;
505 for (Int_t iGem = 0; iGem < fGemHitsArray->GetEntriesFast(); ++iGem) {
508 if (gHit->GetX() > 0)
509 lGemHitIdx.push_back(iGem);
511 rGemHitIdx.push_back(iGem);
519 Double_t dxall, dyall;
520 Double_t dy_tl, dy_tr;
521 Double_t gx, gy, gz, tx, ty, tz;
534 for (
auto gIdx : lGemHitIdx) {
535 for (
auto tIdx : lTofHitIdx) {
536 tHit = *((
BmnHit *)fTof400HitsArray->At(tIdx));
537 gHit = *((
BmnHit *)fGemHitsArray->At(gIdx));
539 gx = gHit.GetX() + dxall;
540 gy = gHit.GetY() + dyall;
542 tx = tHit.GetX() + dxall;
543 ty = tHit.GetY() + dyall + dy_tl;
556 lTr.
SetB(tHit.GetTimeStamp());
557 lTracks.push_back(lTr);
560 for (
auto gIdx : rGemHitIdx) {
561 for (
auto tIdx : rTofHitIdx) {
562 tHit = *((
BmnHit *)fTof400HitsArray->At(tIdx));
563 gHit = *((
BmnHit *)fGemHitsArray->At(gIdx));
565 gx = gHit.GetX() + dxall;
566 gy = gHit.GetY() + dyall;
568 tx = tHit.GetX() + dxall;
569 ty = tHit.GetY() + dyall + dy_tr;
582 rTr.
SetB(tHit.GetTimeStamp());
583 rTracks.push_back(rTr);