BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnHypNuclPairFinder.h
Go to the documentation of this file.
1
2#ifndef BMNHYPNUCLPAIRFINDER_H
3#define BMNHYPNUCLPAIRFINDER_H 1
4
5#include "BmnFieldMap.h"
6#include "BmnGlobalTrack.h"
7#include "BmnHypNuclPair.h"
8#include "BmnKalmanFilter.h"
9#include "BmnNewFieldMap.h"
10#include "BmnStripData.h"
11#include "BmnTofHit.h"
12#include "BmnTrigInfoDst.h"
13#include "CbmStsHit.h"
14#include "CbmStsTrack.h"
15#include "CbmVertex.h"
16#include "DstEventHeader.h"
17#include "FairTask.h"
18#include "TFile.h"
19#include "TGeoManager.h"
20#include "TRandom.h"
21#include "UniRun.h"
22
23using namespace std;
24using namespace TMath;
25
26class BmnHypNuclPairFinder : public FairTask
27{
28 private:
29 UInt_t fEventCounter; //! event counter
30
31 TClonesArray* fStsHits;
32 TClonesArray* fUpperGemClusters;
33 TClonesArray* fLowerGemClusters;
34 TClonesArray* fUpperFsdClusters;
35 TClonesArray* fLowerFsdClusters;
36 TClonesArray* fStsTracks;
37 TClonesArray* fGlobTracks;
38 TClonesArray* fTof700Hits;
39 CbmVertex* fVertex;
40 BmnTrigInfoDst* fTrigger;
41 DstEventHeader* fDstHeader;
42
43 BmnKalmanFilter* fKalman;
44
45 TClonesArray* fParticlePair;
46
49
50 const Int_t fPDG1 = 2212; // we use proton insted of he3, because kalman cannot work with ions; 1000020030; //He3
51 const Int_t fPDG2 = -211; // pi-minus
52
53 const Float_t fMassHe4 = 3.7284013;
54 const Float_t fMassHe3 = 2.8094135;
55 const Float_t fMassPi = 0.1395704;
56 const Float_t fMassP = 0.9382721;
57 const Float_t fMassD = 1.8756129;
58
61
62 // TF1s for parabolic cuts on K+
67
68 // Parametrization for dP = Pout - Pin over Pout.
69 // Needed to correct momentum (KF doesn't work correctly for Q=2, default value is Q=1)
70 // This parametrization got in macro ELossTest.C (on VM)
71 TF1* fit_dP_He;
72
73 // Cut from Matvey Klimenko by 10mln events
74 // 4He/d data were divided by rough cut to d and 4He
75 // d data were fitted by aleph (medians vs p prepared first)
76 TF1* alephFit_d;
77
78 // m^2 cut to select He-4 (low)
79 TF1* m2CutLow;
80 // m^2 cut to select He-4 (up)
81 TF1* m2CutUp;
82
83 Int_t nSt;
84 vector<Int_t> nSect;
86 vector<Float_t> minMomBound;
87 vector<Float_t> maxMomBound;
88
89 Double_t*** a;
90 Double_t*** b;
91
92 vector<FairTrackParam> fParInVPPos;
93 vector<FairTrackParam> fParInVPNeg;
94 vector<Float_t> fM2Pos700;
95 vector<Float_t> fChi2NDFPos;
96 vector<Float_t> fChi2NDFNeg;
97 vector<Float_t> fDedxPos;
98 vector<Short_t> fNGemHitsNeg;
99 vector<Short_t> fNGemHitsPos;
100 vector<Short_t> fNFsdHitsNeg;
101 vector<Short_t> fNFsdHitsPos;
102
103 public:
105 // hyp = "H3L"/"h3l" or "H4L"/"h4l"
108
109 virtual void Exec(Option_t* option);
110 virtual InitStatus Init();
111 virtual void Finish();
112
113 private:
114 // ============================================================
115 // Sentinel-значение для невалидного χ².
116 // ============================================================
117 static constexpr Float_t kInvalidChi2 = -1.0f;
118 // ============================================================
119 // Вспомогательная функция: 2D χ² с учётом корреляций.
120 // dx, dy — разности координат (например, x1 - x2)
121 // C1, C2 — ковариационные матрицы (2x2, представленные как
122 // массивы [c00, c01, c11])
123 // Возвращает χ² = Δᵀ · (C1 + C2)⁻¹ · Δ, или kInvalidChi2
124 // при вырожденной матрице.
125 //
126 // ВАЖНО: внутренние вычисления — в Double_t. Это критично для
127 // треков с хорошим разрешением (σ ~ 0.01 см), где det матрицы
128 // ~ 1e-8 и Float_t теряет точность (вплоть до отрицательного det).
129 // ============================================================
131 Float_t dy,
132 Float_t c1_00,
133 Float_t c1_01,
134 Float_t c1_11,
135 Float_t c2_00,
136 Float_t c2_01,
137 Float_t c2_11)
138 {
139 // Суммарная ковариация — в Double_t
140 const Double_t s00 = static_cast<Double_t>(c1_00) + c2_00;
141 const Double_t s01 = static_cast<Double_t>(c1_01) + c2_01;
142 const Double_t s11 = static_cast<Double_t>(c1_11) + c2_11;
143
144 const Double_t det = s00 * s11 - s01 * s01;
145 if (det <= 0.0)
146 return kInvalidChi2; // вырожденная матрица
147
148 // Обратная матрица 2x2
149 const Double_t inv00 = s11 / det;
150 const Double_t inv01 = -s01 / det;
151 const Double_t inv11 = s00 / det;
152
153 // χ² = Δᵀ · Cov⁻¹ · Δ
154 const Double_t dxd = dx;
155 const Double_t dyd = dy;
156 const Double_t chi2 = dxd * dxd * inv00 + 2.0 * dxd * dyd * inv01 + dyd * dyd * inv11;
157
158 // Защита от отрицательного χ² из-за численных ошибок
159 // (теоретически невозможно, но double round-off может дать -1e-15)
160 return (chi2 >= 0.0) ? static_cast<Float_t>(chi2) : 0.0f;
161 }
162
163 void Analysis();
164
165 Float_t FindV0ByVirtualPlanes(FairTrackParam* par1, FairTrackParam* par2, Float_t z_0, Float_t range = 50.);
167 void GetNHits(CbmStsTrack* tr, Int_t& nGEM, Int_t& nFSD);
168 Float_t GetSigXTof700He3(FairTrackParam* par);
169 Float_t GetSigYTof700He3(FairTrackParam* par);
170 Float_t GetDyTof700(FairTrackParam* par);
171 Float_t GetDxTof700(FairTrackParam* par);
172
173 // Method to check the presence of strangness in event by presence of K+ or K-
175
177};
178
179#endif
bool Bool_t
int Int_t
unsigned int UInt_t
float Float_t
double Double_t
constexpr Bool_t kTRUE
const char Option_t
#define ClassDef(name, id)
BmnGlobalTrack.h.
Float_t GetDyTof700(FairTrackParam *par)
Float_t GetSigYTof700He3(FairTrackParam *par)
vector< Short_t > fNFsdHitsNeg
Bool_t IsKaPlus(BmnGlobalTrack *gl)
TClonesArray * fUpperFsdClusters
BmnKalmanFilter * fKalman
virtual void Exec(Option_t *option)
static constexpr Float_t kInvalidChi2
void GetNHits(CbmStsTrack *tr, Int_t &nGEM, Int_t &nFSD)
TClonesArray * fLowerGemClusters
TClonesArray * fUpperGemClusters
vector< FairTrackParam > fParInVPNeg
vector< Float_t > fM2Pos700
TClonesArray * fLowerFsdClusters
vector< Float_t > minMomBound
virtual InitStatus Init()
vector< Short_t > fNGemHitsNeg
BmnHypNuclPairFinder(TString hyp, Int_t run, Bool_t exp=kTRUE)
vector< Float_t > fChi2NDFPos
vector< Short_t > fNFsdHitsPos
vector< Float_t > maxMomBound
virtual ~BmnHypNuclPairFinder()
Float_t GetDxTof700(FairTrackParam *par)
Float_t GetSigXTof700He3(FairTrackParam *par)
Float_t GetdEdx(CbmStsTrack *tr)
TClonesArray * fStsHits
event counter
static Float_t ComputeChi2_2D(Float_t dx, Float_t dy, Float_t c1_00, Float_t c1_01, Float_t c1_11, Float_t c2_00, Float_t c2_01, Float_t c2_11)
vector< Float_t > fDedxPos
vector< Float_t > fChi2NDFNeg
vector< Short_t > fNGemHitsPos
DstEventHeader * fDstHeader
virtual void Finish()
vector< FairTrackParam > fParInVPPos
Float_t FindV0ByVirtualPlanes(FairTrackParam *par1, FairTrackParam *par2, Float_t z_0, Float_t range=50.)
RVec< PromoteType< T > > exp(const RVec< T > &v)
Definition json.hpp:4446