3#include "BmnKalmanFilter.h"
7#include "FairTrackParam.h"
23 fSiBTHitsArray =
nullptr;
24 fBeamTracksArray =
nullptr;
26 fSiBTHitsBranchName =
"BmnSiBTHit";
27 fBeamTracksBranchName =
"BmnBeamTrack";
28 fSiBTDetector =
nullptr;
40 cout <<
"======================== BEAM tracking init started ====================" << endl;
45 FairRootManager* ioman = FairRootManager::Instance();
47 Fatal(
"Init",
"FairRootManager is not instantiated");
50 fSiBTHitsArray = (TClonesArray*)ioman->GetObject(fSiBTHitsBranchName);
52 if (!fSiBTHitsArray) {
53 cout <<
"BmnBeamTracking::Init(): branch " << fSiBTHitsBranchName <<
" not found! Task will be deactivated"
56 return InitStatus::kERROR;
59 fBeamTracksArray =
new TClonesArray(
"BmnTrack", 100);
60 ioman->Register(fBeamTracksBranchName,
"BEAM", fBeamTracksArray, kTRUE);
62 fField = FairRunAna::Instance()->GetField();
64 Fatal(
"Init",
"No Magnetic Field found");
66 TString gPathConfig = gSystem->Getenv(
"VMCWORKDIR");
68 TString gPathGemConfig = gPathConfig +
"/parameters/SiBT/XMLConfigs/";
69 TString confSiBT =
"SiBTRun8.xml";
73 cout <<
"======================== BEAM tracking init finished ===================" << endl;
81 cout <<
"\n======================== BEAM tracking exec started ====================" << endl;
83 cout <<
"\n Event number: " << fEventNo << endl;
88 fBeamTracksArray->Delete();
93 cout <<
"BmnBeamTracking: " << fBeamTracksArray->GetEntriesFast() <<
" tracks" << endl;
95 cout <<
"\n======================== BEAM tracking exec finished ===================" << endl;
101 vector<BmnSiBTHit*> sortedHits[fSiBTDetector->
GetNStations()];
102 SortHits(sortedHits);
107 const Int_t nTrMax = 10;
112 for (
BmnHit* hit2 : sortedHits[2]) {
113 for (
BmnHit* hit1 : sortedHits[1]) {
114 for (
BmnHit* hit0 : sortedHits[0]) {
116 cand.
AddHit(hit0->GetIndex(), hit0);
117 cand.
AddHit(hit1->GetIndex(), hit1);
118 cand.
AddHit(hit2->GetIndex(), hit2);
121 if (CalculateTrackParams(&cand) !=
kBMNERROR) {
123 for (Int_t
i = 0;
i < nTr; ++
i) {
124 if (cand.
GetChi2() < sortedCandidates[
i].GetChi2()) {
125 sortedCandidates[
i] = cand;
129 sortedCandidates[nTr] = cand;
137 for (Int_t
i = 0;
i < nTr; ++
i) {
141 TrackUpdateByKalman(&tr);
144 for (Int_t iHit = 0; iHit < tr.
GetNHits(); ++iHit) {
147 hit->
SetResXY(par.GetX() - hit->GetX(), par.GetY() - hit->GetY());
150 tr.
SetB(Sqrt(Sq(par.GetX() - Xv) + Sq(par.GetY() - Yv)));
152 new ((*fBeamTracksArray)[fBeamTracksArray->GetEntriesFast()])
BmnTrack(tr);
160BmnStatus BmnBeamTracking::SortHits(vector<BmnSiBTHit*>* sortedHits)
162 for (Int_t iHit = 0; iHit < fSiBTHitsArray->GetEntriesFast(); ++iHit) {
169 sortedHits[station].push_back(hit);
179 Double_t chiTot = 0.0;
180 for (Int_t iHit = 0; iHit < cand->
GetNHits(); ++iHit) {
184 fKalman->
Update(&par, hit, chi);
189 for (Int_t iHit = cand->
GetNHits() - 1; iHit >= 0; iHit--) {
193 fKalman->
Update(&par, hit, chi);
207 const UInt_t nHits = 3;
208 Double_t chi2circ = 0.0;
209 TVector3 CircParZX =
CircleFit(tr, fSiBTHitsArray, chi2circ);
211 Double_t Xc = CircParZX.Y();
212 Double_t Zc = CircParZX.X();
213 fField = FairRunAna::Instance()->GetField();
214 const Double_t B = (
LineFit(tr, fSiBTHitsArray,
"ZY")).X();
218 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
219 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
220 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
221 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
222 Double_t sumTyTy(0.0), sumTyQP(0.0);
223 Double_t sumQPQP(0.0);
225 for (UInt_t
i = 0;
i < nHits; ++
i) {
229 Double_t Xi = hit->GetX();
230 Double_t Yi = hit->GetY();
231 Double_t Zi = hit->GetZ();
233 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
236 Double_t QPi = 1.0 / 10.678;
252 sumTxTx += Txi * Txi;
253 sumTxTy += Txi * Tyi;
254 sumTxQP += Txi * QPi;
255 sumTyTy += Tyi * Tyi;
256 sumTyQP += Tyi * QPi;
257 sumQPQP += QPi * QPi;
260 Double_t meanX = sumX / nHits;
261 Double_t meanY = sumY / nHits;
262 Double_t meanTx = sumTx / nHits;
263 Double_t meanTy = sumTy / nHits;
264 Double_t meanQP = sumQP / nHits;
266 Double_t Cov_X_X = sumXX / nHits - Sq(meanX);
267 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
268 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
269 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
270 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
271 Double_t Cov_Y_Y = sumYY / nHits - Sq(meanY);
272 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
273 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
274 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
275 Double_t Cov_Tx_Tx = sumTxTx / nHits - Sq(meanTx);
276 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
277 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
278 Double_t Cov_Ty_Ty = sumTyTy / nHits - Sq(meanTy);
279 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
280 Double_t Cov_Qp_Qp = sumQPQP / nHits - Sq(meanQP);
283 par.SetCovariance(0, 0, Cov_X_X);
284 par.SetCovariance(0, 1, Cov_X_Y);
285 par.SetCovariance(0, 2, Cov_X_Tx);
286 par.SetCovariance(0, 3, Cov_X_Ty);
287 par.SetCovariance(0, 4, Cov_X_Qp);
288 par.SetCovariance(1, 1, Cov_Y_Y);
289 par.SetCovariance(1, 2, Cov_Y_Tx);
290 par.SetCovariance(1, 3, Cov_Y_Ty);
291 par.SetCovariance(1, 4, Cov_Y_Qp);
292 par.SetCovariance(2, 2, Cov_Tx_Tx);
293 par.SetCovariance(2, 3, Cov_Tx_Ty);
294 par.SetCovariance(2, 4, Cov_Tx_Qp);
295 par.SetCovariance(3, 3, Cov_Ty_Ty);
296 par.SetCovariance(3, 4, Cov_Ty_Qp);
297 par.SetCovariance(4, 4, Cov_Qp_Qp);
326 TVector3 lineParZY =
LineFit(tr, fSiBTHitsArray,
"ZY");
327 const Double_t B = lineParZY.X();
347 Double_t QP = 1.0 / 10.678;
354Double_t BmnBeamTracking::CalcQp(
BmnTrack* track)
357 vector<BmnHit*> hits;
358 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++)
366 TVector3 CircParZX =
CircleBy3Hit(first, second, third);
367 Double_t R = CircParZX.Z();
368 Double_t Xc = CircParZX.Y();
369 Double_t Zc = CircParZX.X();
371 Double_t Q = (Xc > 0) ? +1. : -1.;
373 * (Abs(fField->GetBy(third->GetX(), third->GetY(), third->GetZ()))
374 + Abs(fField->GetBy(second->GetX(), second->GetY(), second->GetZ()))
375 + Abs(fField->GetBy(first->GetX(), first->GetY(), first->GetZ())))
379 Double_t fX = first->GetX();
380 Double_t fZ = first->GetZ();
384 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
385 TVector3 lineParZY =
LineFit(track, fSiBTHitsArray,
"ZY");
386 const Double_t B = lineParZY.X();
387 Double_t Ty_first = B;
389 Double_t Pz = Pt / Sqrt(1 + Sq(Tx_first));
390 Double_t Px = Tx_first * Pz;
391 Double_t Py = Ty_first * Pz;
392 Double_t P = Sqrt(Sq(Px) + Sq(Py) + Sq(Pz));
TVector3 LineFit(BmnTrack *track, const TClonesArray *arr, TString type)
TVector3 CircleBy3Hit(BmnTrack *track, const TClonesArray *arr)
TVector3 CircleFit(BmnTrack *track, const TClonesArray *arr, Double_t &chi2)
Double_t CalcTx(const BmnHit *h0, const BmnHit *h1, const BmnHit *h2)
virtual ~BmnBeamTracking()
virtual InitStatus Init()
virtual void Exec(Option_t *opt)
void SetResXY(Double_t resX, Double_t resY)
Short_t GetStation() const
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
BmnStatus Update(FairTrackParam *par, const BmnHit *hit, Double_t &chiSq)
Double_t GetStripTotalSignalInUpperLayer()
Double_t GetStripTotalSignalInLowerLayer()
void SetChi2(Double_t chi2)
void SetParamLast(FairTrackParam &par)
FairTrackParam * GetParamFirst()
Int_t GetHitIndex(Int_t iHit) const
void AddHit(Int_t hitIndex, FairHit *Hit)
void SetParamFirst(FairTrackParam &par)
FairTrackParam * GetParamLast()