6 , fParticleTriple(nullptr)
16void BmnH3LTripleFinder::Analysis()
18 TLorentzVector lPos1, lPos2, lNeg;
19 Double_t VPX = fVertex->
GetX();
20 Double_t VPY = fVertex->
GetY();
21 Double_t VPZ = fVertex->
GetZ();
25 vector<FairTrackParam> parInVPPos1;
26 vector<FairTrackParam> parInVPPos2;
27 vector<FairTrackParam> parInVPNeg;
28 vector<Double_t> m2Pos1_400;
29 vector<Double_t> m2Pos1_700;
30 vector<Double_t> m2Pos2_400;
31 vector<Double_t> m2Pos2_700;
32 vector<Double_t> chi2NDFPos1;
33 vector<Double_t> chi2NDFPos2;
34 vector<Double_t> chi2NDFNeg;
35 vector<Int_t> nHitsPos1;
36 vector<Int_t> nHitsPos2;
37 vector<Double_t> dedxPos1;
38 vector<Double_t> dedxPos2;
39 vector<Int_t> nGemHitsNeg;
40 vector<Int_t> nGemHitsPos1;
41 vector<Int_t> nGemHitsPos2;
42 vector<Int_t> nFsdHitsNeg;
43 vector<Int_t> nFsdHitsPos1;
44 vector<Int_t> nFsdHitsPos2;
51 for (Int_t
i = 0;
i < fStsTracks->GetEntriesFast();
i++) {
57 GetNHits(tr, nGEM, nFSD);
78 Double_t m2Tof400 = 0.0;
79 Double_t m2Tof700 = 0.0;
80 for (Int_t j = 0; j < fGlobTracks->GetEntriesFast(); j++) {
90 parInVPNeg.push_back(par);
92 nGemHitsNeg.push_back(nGEM);
93 nFsdHitsNeg.push_back(nFSD);
98 if (m2Tof400 > 2 || m2Tof700 > 2) {
99 parInVPPos1.push_back(par);
101 m2Pos1_400.push_back(m2Tof400);
102 m2Pos1_700.push_back(m2Tof700);
105 dedxPos1.push_back(GetdEdx(tr));
106 nGemHitsPos1.push_back(nGEM);
107 nFsdHitsPos1.push_back(nFSD);
112 parInVPPos2.push_back(par);
114 m2Pos2_400.push_back(m2Tof400);
115 m2Pos2_700.push_back(m2Tof700);
118 dedxPos2.push_back(GetdEdx(tr));
119 nGemHitsPos2.push_back(nGEM);
120 nFsdHitsPos2.push_back(nFSD);
133 for (Int_t
i = 0;
i < (Int_t)parInVPPos1.size(); ++
i) {
134 for (Int_t j = 0; j < (Int_t)parInVPPos2.size(); ++j) {
135 for (Int_t k = 0; k < (Int_t)parInVPNeg.size(); ++k) {
137 FairTrackParam VP1 = parInVPPos1[
i];
138 FairTrackParam VP2 = parInVPPos2[j];
139 FairTrackParam VP3 = parInVPNeg[k];
140 FairTrackParam V01 = parInVPPos1[
i];
141 FairTrackParam V02 = parInVPPos2[j];
142 FairTrackParam V03 = parInVPNeg[k];
144 Double_t V0Z = FindV0ByVirtualPlanes(&V01, &V02, &V03, VPZ, 25.0);
154 Double_t V0X1 = V01.GetX();
155 Double_t V0X2 = V02.GetX();
156 Double_t V0X3 = V03.GetX();
157 Double_t V0Y1 = V01.GetY();
158 Double_t V0Y2 = V02.GetY();
159 Double_t V0Y3 = V03.GetY();
160 Double_t VPX1 = VP1.GetX();
161 Double_t VPX2 = VP2.GetX();
162 Double_t VPX3 = VP3.GetX();
163 Double_t VPY1 = VP1.GetY();
164 Double_t VPY2 = VP2.GetY();
165 Double_t VPY3 = VP3.GetY();
167 Double_t dV0X1sq = V01.GetCovariance(0, 0);
168 Double_t dV0Y1sq = V01.GetCovariance(1, 1);
169 Double_t dV0X2sq = V02.GetCovariance(0, 0);
170 Double_t dV0Y2sq = V02.GetCovariance(1, 1);
171 Double_t dV0X3sq = V03.GetCovariance(0, 0);
172 Double_t dV0Y3sq = V03.GetCovariance(1, 1);
173 Double_t dVPX1sq = VP1.GetCovariance(0, 0);
174 Double_t dVPY1sq = VP1.GetCovariance(1, 1);
175 Double_t dVPX2sq = VP2.GetCovariance(0, 0);
176 Double_t dVPY2sq = VP2.GetCovariance(1, 1);
177 Double_t dVPX3sq = VP3.GetCovariance(0, 0);
178 Double_t dVPY3sq = VP3.GetCovariance(1, 1);
180 Double_t DCA12 = Sqrt(Sq(V0X2 - V0X1) + Sq(V0Y2 - V0Y1));
181 Double_t DCA13 = Sqrt(Sq(V0X3 - V0X1) + Sq(V0Y3 - V0Y1));
182 Double_t DCA23 = Sqrt(Sq(V0X3 - V0X2) + Sq(V0Y3 - V0Y2));
183 Double_t DCA123 = (DCA12 + DCA13 + DCA23) / 3.0;
186 1.0 / DCA12 * Sqrt(Sq(V0X2 - V0X1) * (dV0X1sq + dV0X2sq) + Sq(V0Y2 - V0Y1) * (dV0Y1sq + dV0Y2sq));
188 1.0 / DCA13 * Sqrt(Sq(V0X3 - V0X1) * (dV0X1sq + dV0X3sq) + Sq(V0Y3 - V0Y1) * (dV0Y1sq + dV0Y3sq));
190 1.0 / DCA23 * Sqrt(Sq(V0X3 - V0X2) * (dV0X2sq + dV0X3sq) + Sq(V0Y3 - V0Y2) * (dV0Y2sq + dV0Y3sq));
191 Double_t dDCA123 = Sqrt(Sq(dDCA12) + Sq(dDCA13) + Sq(dDCA23));
193 Double_t DCA1 = Sqrt(Sq(VPX1 - VPX) + Sq(VPY1 - VPY));
195 1.0 / DCA1 * Sqrt(Sq(VPX1 - VPX) * (dVPX1sq + dVPXsq) + Sq(VPY1 - VPY) * (dVPY1sq + dVPYsq));
196 Double_t DCA2 = Sqrt(Sq(VPX2 - VPX) + Sq(VPY2 - VPY));
198 1.0 / DCA2 * Sqrt(Sq(VPX2 - VPX) * (dVPX2sq + dVPXsq) + Sq(VPY2 - VPY) * (dVPY2sq + dVPYsq));
199 Double_t DCA3 = Sqrt(Sq(VPX3 - VPX) + Sq(VPY3 - VPY));
201 1.0 / DCA3 * Sqrt(Sq(VPX3 - VPX) * (dVPX3sq + dVPXsq) + Sq(VPY3 - VPY) * (dVPY3sq + dVPYsq));
203 Double_t V0X = (V0X1 + V0X2 + V0X3) / 3.0;
204 Double_t V0Y = (V0Y1 + V0Y2 + V0Y3) / 3.0;
205 Double_t path = Sqrt(Sq(V0X - VPX) + Sq(V0Y - VPY) + Sq(V0Z - VPZ));
213 partTriple.
SetChi2Triple(chi2NDFPos1[
i], chi2NDFPos2[j], chi2NDFNeg[k]);
229 vector<Int_t> nHits1 = {nFsdHitsPos1[
i], nGemHitsPos1[
i]};
230 vector<Int_t> nHits2 = {nFsdHitsPos2[j], nGemHitsPos2[j]};
231 vector<Int_t> nHits3 = {nFsdHitsNeg[k], nGemHitsNeg[k]};
235 Double_t Tx1, Ty1, Tx2, Ty2, Tx3, Ty3;
247 Float_t p1 = 1. / V01.GetQp();
248 Float_t p2 = 1. / V02.GetQp();
249 Float_t p3 = 1. / V03.GetQp();
255 A1 = 1. / Sqrt(Tx1 * Tx1 + Ty1 * Ty1 + 1);
256 lPos1.SetXYZM(Tx1 * A1 * p1, Ty1 * A1 * p1, A1 * p1, fMassD);
258 A2 = 1. / Sqrt(Tx2 * Tx2 + Ty2 * Ty2 + 1);
259 lPos2.SetXYZM(Tx2 * A2 * p2, Ty2 * A2 * p2, A2 * p2, fMassP);
263 A3 = 1. / Sqrt(Tx3 * Tx3 + Ty3 * Ty3 + 1);
264 lNeg.SetXYZM(Tx3 * A3 * p3, Ty3 * A3 * p3, p3 * A3, fMassPi);
269 partTriple.
SetInvMass(TLorentzVector((lPos1 + lPos2 + lNeg)).Mag());
275 Double_t PzPart1 = Abs(p1) * A1;
276 Double_t PzPart2 = Abs(p2) * A2;
277 Double_t PzPart3 = Abs(p3) * A3;
279 Double_t PzPart0 = PzPart1 + PzPart2 + PzPart3;
280 Double_t PxPart0 = PzPart1 * Tx1 + PzPart2 * Tx2 + PzPart3 * Tx3;
281 Double_t PyPart0 = PzPart1 * Ty1 + PzPart2 * Ty2 + PzPart3 * Ty3;
283 Double_t TxPart0 = PxPart0 / PzPart0;
284 Double_t TyPart0 = PyPart0 / PzPart0;
286 Double_t xPart0 = TxPart0 * (VPZ - V0Z) + V0X;
287 Double_t yPart0 = TyPart0 * (VPZ - V0Z) + V0Y;
289 Double_t dca0 = Sqrt(Sq(xPart0 - VPX) + Sq(yPart0 - VPY));
293 new ((*fParticleTriple)[fParticleTriple->GetEntriesFast()])
BmnParticleTriple(partTriple);
302 cout <<
"\nBmnH3LTripleFinder::Init()" << endl;
304 FairRootManager* ioman = FairRootManager::Instance();
306 fStsTracks = (TClonesArray*)ioman->GetObject(
"StsVector");
307 fGlobTracks = (TClonesArray*)ioman->GetObject(
"BmnGlobalTrack");
308 fStsHits = (TClonesArray*)ioman->GetObject(
"StsHit");
309 fVertex = (
CbmVertex*)ioman->GetObject(
"PrimaryVertex.");
310 fUpperClusters = (TClonesArray*)ioman->GetObject(
"BmnGemUpperCluster");
311 fLowerClusters = (TClonesArray*)ioman->GetObject(
"BmnGemLowerCluster");
313 fParticleTriple =
new TClonesArray(
"BmnParticleTriple");
314 ioman->Register(
"par",
"H3L", fParticleTriple, kTRUE);
325 fParticleTriple->Delete();
330 cout <<
"Event# " << fEventCounter << endl;
346 cout <<
"\n-I- [BmnH3LTripleFinder::Finish] " << endl;
349Double_t BmnH3LTripleFinder::FindV0ByVirtualPlanes(FairTrackParam* par1,
350 FairTrackParam* par2,
351 FairTrackParam* par3,
355 const Int_t nPlanes = 15;
357 while (range >= 0.1) {
358 Double_t zMax = z_0 + range;
359 Double_t zMin = z_0 - range;
360 Double_t zStep = (zMax - zMin) / nPlanes;
362 Double_t minDist = 1000.0;
363 Double_t minZ = -1000.0;
365 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
366 Double_t z = zMax - iPlane * zStep;
374 Double_t d12 = Sqrt(Sq(par1->GetX() - par2->GetX()) + Sq(par1->GetY() - par2->GetY()));
375 Double_t d13 = Sqrt(Sq(par1->GetX() - par3->GetX()) + Sq(par1->GetY() - par3->GetY()));
376 Double_t d23 = Sqrt(Sq(par2->GetX() - par3->GetX()) + Sq(par2->GetY() - par3->GetY()));
377 Double_t d123 = Sqrt(Sq(d23) + Sq(d12) + Sq(d13));
379 if (d123 < minDist) {
391Double_t BmnH3LTripleFinder::GetdEdx(
CbmStsTrack* tr)
393 set<Double_t> signalsUpp;
395 for (Int_t hitIdx = 0; hitIdx < tr->
GetNStsHits(); ++hitIdx) {
408 Int_t nGemHits = signalsUpp.size();
412 Int_t shift = (nGemHits == 3) ? 2
413 : (nGemHits == 4) ? 2
414 : (nGemHits == 5) ? 3
415 : (nGemHits == 6) ? 4
416 : (nGemHits == 7) ? 4
419 auto itUpp = signalsUpp.begin();
423 Double_t totSigUpp = 0.0;
424 for (Int_t
i = 0;
i < nGemHits - shift; ++
i) {
425 totSigUpp += (*itUpp);
432 totSigUpp /= (nGemHits - shift);
436void BmnH3LTripleFinder::GetNHits(
CbmStsTrack* tr, Int_t& nGEM, Int_t& nFSD)
440 for (Int_t hitIdx = 0; hitIdx < tr->
GetNStsHits(); ++hitIdx) {
ClassImp(BmnH3LTripleFinder)
Double_t GetMass2(Int_t tofID)
Int_t GetGemTrackIndex() const
virtual void Exec(Option_t *option)
virtual ~BmnH3LTripleFinder()
virtual InitStatus Init()
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
void SetPath(Double_t val)
void SetAlpha2(Double_t val)
void SetDCA1(Double_t val)
void SetdDCA123(Double_t val)
void SetEtaTriple(Double_t val1, Double_t val2, Double_t val3)
void SetDCA2(Double_t val)
void SetMass700Triple(Double_t val1, Double_t val2, Double_t val3)
void SetDCA0(Double_t val)
void SetDCA123(Double_t val)
void SetTyTriple(Double_t val1, Double_t val2, Double_t val3)
void SetAlpha1(Double_t val)
void SetV0Y(Double_t val)
void SetdDCA3(Double_t val)
void SetTxTriple(Double_t val1, Double_t val2, Double_t val3)
void SetV0X(Double_t val)
void SetNHitsTriple(vector< Int_t > part1, vector< Int_t > part2, vector< Int_t > part3)
void SetDCA3(Double_t val)
void SetMass400Triple(Double_t val1, Double_t val2, Double_t val3)
void SetChi2Triple(Double_t val1, Double_t val2, Double_t val3)
void SetInvMass(Double_t val)
void SetV0Z(Double_t val)
void SetdDCA2(Double_t val)
void SetMomTriple(Double_t val1, Double_t val2, Double_t val3)
void SetdDCA1(Double_t val)
Int_t GetSystemId() const
Int_t GetNStsHits() const
Int_t GetStsHitIndex(Int_t iHit) const
FairTrackParam * GetParamFirst()
Double_t GetCovariance(Int_t i, Int_t j) const