107 std::vector<std::vector<BmnSiBTHit*>> sortedHits(
fSiBTDetector->GetNStations());
115 std::vector<BmnTrack> candidates;
116 candidates.reserve(1000);
118 for (
BmnHit* hit2 : sortedHits[2]) {
119 for (
BmnHit* hit1 : sortedHits[1]) {
120 for (
BmnHit* hit0 : sortedHits[0]) {
122 cand.
AddHit(hit0->GetIndex(), hit0);
123 cand.
AddHit(hit1->GetIndex(), hit1);
124 cand.
AddHit(hit2->GetIndex(), hit2);
128 candidates.push_back(cand);
135 std::sort(candidates.begin(), candidates.end(),
136 [](
const BmnTrack& a,
const BmnTrack& b) { return a.GetChi2() < b.GetChi2(); });
142 cout <<
"BmnBeamTracking: " << candidates.size() <<
" tracks after chi2 sort (max " <<
fNTrMax <<
")" << endl;
145 for (
auto& tr : candidates) {
148 FairTrackParam par = *(tr.GetParamFirst());
150 for (
Int_t iHit = 0; iHit < tr.GetNHits(); ++iHit) {
152 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212,
nullptr,
nullptr, 1);
153 hit->
SetResXY(par.GetX() - hit->GetX(), par.GetY() - hit->GetY());
156 fKalman->TGeoTrackPropagate(&par, Zv, 2212,
nullptr,
nullptr, 1);
157 tr.SetB(
Sqrt(
Sq(par.GetX() - Xv) +
Sq(par.GetY() - Yv)));
158 tr.SetParamLast(par);
224 const UInt_t nHits = 3;
230 fField = FairRunAna::Instance()->GetField();
235 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
236 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
237 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
238 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
239 Double_t sumTyTy(0.0), sumTyQP(0.0);
242 for (UInt_t
i = 0;
i < nHits; ++
i) {
250 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
269 sumTxTx += Txi * Txi;
270 sumTxTy += Txi * Tyi;
271 sumTxQP += Txi * QPi;
272 sumTyTy += Tyi * Tyi;
273 sumTyQP += Tyi * QPi;
274 sumQPQP += QPi * QPi;
284 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
285 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
286 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
287 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
289 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
290 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
291 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
292 Double_t Cov_Tx_Tx = sumTxTx / nHits -
Sq(meanTx);
293 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
294 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
295 Double_t Cov_Ty_Ty = sumTyTy / nHits -
Sq(meanTy);
296 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
297 Double_t Cov_Qp_Qp = sumQPQP / nHits -
Sq(meanQP);
300 par.SetCovariance(0, 0, Cov_X_X);
301 par.SetCovariance(0, 1, Cov_X_Y);
302 par.SetCovariance(0, 2, Cov_X_Tx);
303 par.SetCovariance(0, 3, Cov_X_Ty);
304 par.SetCovariance(0, 4, Cov_X_Qp);
305 par.SetCovariance(1, 1, Cov_Y_Y);
306 par.SetCovariance(1, 2, Cov_Y_Tx);
307 par.SetCovariance(1, 3, Cov_Y_Ty);
308 par.SetCovariance(1, 4, Cov_Y_Qp);
309 par.SetCovariance(2, 2, Cov_Tx_Tx);
310 par.SetCovariance(2, 3, Cov_Tx_Ty);
311 par.SetCovariance(2, 4, Cov_Tx_Qp);
312 par.SetCovariance(3, 3, Cov_Ty_Ty);
313 par.SetCovariance(3, 4, Cov_Ty_Qp);
314 par.SetCovariance(4, 4, Cov_Qp_Qp);