BmnRoot
Loading...
Searching...
No Matches
BmnVertexFinder.cxx
Go to the documentation of this file.
1#include "BmnVertexFinder.h"
2
3#include "BmnMath.h"
4#include "TCanvas.h"
5#include "TFitResult.h"
6#include "TGraph.h"
7#include "vector"
8
9using namespace std;
10using namespace TMath;
11
13 fPeriodId = period;
14 fEventNo = 0;
15 fGlobalTracksArray = NULL;
16 fRobustRefit = kTRUE;
17 fGlobalTracksBranchName = "BmnGlobalTrack";
18 fVertexBranchName = "BmnVertex";
19}
20
22 delete fKalman;
23}
24
26 if (fVerbose > 1) cout << "=========================== Vertex finder init started ====================" << endl;
27
28 fKalman = new BmnKalmanFilter();
29
30 //Get ROOT Manager
31 FairRootManager* ioman = FairRootManager::Instance();
32 if (NULL == ioman) Fatal("Init", "FairRootManager is not instantiated");
33
34 fGlobalTracksArray = (TClonesArray*)ioman->GetObject(fGlobalTracksBranchName); //in
35 if (!fGlobalTracksArray) {
36 cout << "BmnVertexFinder::Init(): branch " << fGlobalTracksBranchName << " not found! Task will be deactivated" << endl;
37 SetActive(kFALSE);
38 return kERROR;
39 }
40
41 fVertexArray = new TClonesArray("BmnVertex", 1); //out
42 ioman->Register(fVertexBranchName, "GEM", fVertexArray, kTRUE);
43
44 if (fVerbose > 1) cout << "=========================== Vertex finder init finished ===================" << endl;
45
46 return kSUCCESS;
47}
48
49void BmnVertexFinder::Exec(Option_t* opt) {
50 TStopwatch sw;
51 sw.Start();
52
53 if (!IsActive())
54 return;
55
56 if (fVerbose > 1) cout << "======================== Vertex finder exec started ======================" << endl;
57 if (fVerbose > 1) cout << "Event number: " << fEventNo++ << endl;
58
59 fVertexArray->Delete();
60
61 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex(FindPrimaryVertex(fGlobalTracksArray));
62 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex(FindSecondaryVertex(fGlobalTracksArray));
63
64 if (fVerbose > 1) cout << "\n======================== Vertex finder exec finished ======================" << endl;
65
66 sw.Stop();
67 fTime += sw.RealTime();
68}
69
71 //cout << "Primary" << endl;
72 const Double_t kRange = (fPeriodId == 8) ? 200.0 : 50.0;
73 const Double_t xVertMin = (fPeriodId == 8) ? -10.0 : -0.5;
74 const Double_t xVertMax = (fPeriodId == 8) ? +10.0 : +2.0;
75 const Double_t yVertMin = (fPeriodId == 8) ? -10.0 : -5.0;
76 const Double_t yVertMax = (fPeriodId == 8) ? +10.0 : -2.5;
77 Double_t roughVertexZ = (fPeriodId == 8) ? 0.0 : -1.0;
78 Int_t nPrim = 0;
79
80 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
81 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
82 FairTrackParam par0 = *(track->GetParamFirst());
83 if (fKalman->TGeoTrackPropagate(&par0, roughVertexZ, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) == kBMNERROR) {
84 continue;
85 }
86
87 if (par0.GetX() > xVertMin && par0.GetX() < xVertMax && par0.GetY() > yVertMin && par0.GetY() < yVertMax) {
88 track->SetFlag(0); //primary track
89 nPrim++;
90 } else {
91 track->SetFlag(1); //secondary track
92 }
93 }
94
95 if (nPrim < 2) {
96 return BmnVertex();
97 }
98
99 Double_t vz = FindVZByVirtualPlanes(roughVertexZ, kRange, tracks, 0);
100 if (Abs(vz - roughVertexZ) > kRange) {
101 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
102 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
103 track->SetFlag(1);
104 }
105 return BmnVertex();
106 }
107
108 vector<Double_t> xHits;
109 vector<Double_t> yHits;
110 vector<Int_t> indexes;
111 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
112 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
113 if (track->GetFlag() != 0) continue;
114 FairTrackParam par0 = *(track->GetParamFirst());
115 if (fKalman->TGeoTrackPropagate(&par0, vz, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) == kBMNERROR) {
116 continue;
117 }
118 xHits.push_back(par0.GetX());
119 yHits.push_back(par0.GetY());
120 indexes.push_back(iTr);
121 }
122
123 Double_t vx = Mean(xHits.begin(), xHits.end());
124 Double_t vy = Mean(yHits.begin(), yHits.end());
125
126 Double_t rRMS = CalcRms2D(xHits, yHits);
127
128 return BmnVertex(vx, vy, vz, rRMS, 0, xHits.size(), TMatrixFSym(3), -1, vector<Int_t>());
129}
130
132 //cout << "Sacondary" << endl;
133 Double_t roughVertexZ = (fPeriodId == 8) ? 0.0 : (fPeriodId == 7) ? -1.0 : (fPeriodId == 6) ? -21.9 : 0.0;
134 const Double_t kRange = 300.0;
135
136 Int_t nSec = 0;
137
138 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
139 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
140 if (track->GetFlag() == 1) nSec++; //secondary track
141 }
142
143 if (nSec < 2) {
144 return BmnVertex();
145 }
146
147 Double_t vz = FindVZByVirtualPlanes(roughVertexZ, kRange, tracks, 1);
148
149 vector<Double_t> xHits;
150 vector<Double_t> yHits;
151 vector<Int_t> indexes;
152 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
153 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
154 if (track->GetFlag() != 1) continue;
155 FairTrackParam par0 = *(track->GetParamFirst());
156 if (fKalman->TGeoTrackPropagate(&par0, vz, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) == kBMNERROR) {
157 continue;
158 }
159 xHits.push_back(par0.GetX());
160 yHits.push_back(par0.GetY());
161 indexes.push_back(iTr);
162 }
163
164 Double_t vx = Mean(xHits.begin(), xHits.end());
165 Double_t vy = Mean(yHits.begin(), yHits.end());
166
167 Double_t rRMS = CalcRms2D(xHits, yHits);
168
169 return BmnVertex(vx, vy, vz, rRMS, 0, xHits.size(), TMatrixFSym(3), -1, vector<Int_t>());
170}
171
172Float_t BmnVertexFinder::FindVZByVirtualPlanes(Float_t z_0, Float_t range, TClonesArray* tracks, Int_t flag) {
173 const Int_t nPlanes = 3;
174 Float_t minZ = z_0;
175
176 while (range >= 0.01) {
177 Float_t zMax = minZ + range;
178 Float_t zMin = minZ - range;
179 Float_t zStep = (zMax - zMin) / (nPlanes - 1);
180
181 vector<Double_t> xHits[nPlanes];
182 vector<Double_t> yHits[nPlanes];
183 Float_t zPlane[nPlanes];
184 Float_t rRMS[nPlanes] = {0};
185
186 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane)
187 zPlane[iPlane] = zMax - iPlane * zStep;
188
189 Int_t nOkTr = 0;
190
191 for (Int_t iTr = 0; iTr < tracks->GetEntriesFast(); ++iTr) {
192 BmnGlobalTrack* track = (BmnGlobalTrack*)tracks->At(iTr);
193 if (track->GetFlag() != flag) continue;
194 FairTrackParam par0 = *(track->GetParamFirst());
195 //cout << "tr" << iTr << endl;
196 Double_t xTr[nPlanes];
197 Double_t yTr[nPlanes];
198 Bool_t trOk = kTRUE;
199 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
200 if (fKalman->TGeoTrackPropagate(&par0, zPlane[iPlane], (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) == kBMNERROR) {
201 track->SetFlag(-1); //maybe 666???
202 trOk = kFALSE;
203 break;
204 }
205
206 //cout << " " << par0.GetX() << " " << par0.GetY() << " " << par0.GetZ() << endl;
207 xTr[iPlane] = par0.GetX();
208 yTr[iPlane] = par0.GetY();
209 //xHits[iPlane].push_back(par0.GetX());
210 //yHits[iPlane].push_back(par0.GetY());
211 }
212
213 if (trOk) {
214 nOkTr++;
215 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
216 xHits[iPlane].push_back(xTr[iPlane]);
217 yHits[iPlane].push_back(yTr[iPlane]);
218 }
219 }
220 }
221
222 if (nOkTr < 2) return -1000.0;
223
224 //Double_t minRMS = DBL_MAX;
225
226 //Calculation minZ as minimal value
227 // for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
228 // rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
229 // if (rRMS[iPlane] < minRMS) {
230 // minRMS = rRMS[iPlane];
231 // minZ = zPlane[iPlane];
232 // }
233 // }
234
235 //Calculation minZ as minimum of parabola
236 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
237 rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
238 }
239 TGraph* vertex = new TGraph(nPlanes, zPlane, rRMS);
240 TFitResultPtr ptr = vertex->Fit("pol2", "QFS");
241 Float_t b = ptr->Parameter(1);
242 Float_t a = ptr->Parameter(2);
243 minZ = -b / (2 * a);
244 delete vertex;
245
246 range /= 2;
247
248 // for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane)
249 // //rRMS[iPlane] = CalcRms2D(xHits[iPlane], yHits[iPlane]);
250 // rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
251
252 //TCanvas* c = new TCanvas("c1", "c1", 1200, 800);
253 // //c->Divide(1, 1);
254 // //c->cd(1);
255 //TGraph* vertex = new TGraph(nPlanes, zPlane, rRMS);
256 // TFitResultPtr ptr = vertex->Fit("pol2", "QFS");
257 // // TF1 *fit_func = vertex->GetFunction("pol2");
258 // Float_t b = ptr->Parameter(1);
259 // Float_t a = ptr->Parameter(2);
260 // minZ = -b / (2 * a);
261 // range /= 2;
262 //vertex->Draw("AP*");
263 //c->SaveAs("tmp.pdf");
264 //getchar();
265 //delete vertex;
266 }
267 return minZ;
268}
269
271 ofstream outFile;
272 outFile.open("QA/timing.txt", ofstream::app);
273 outFile << "Vertex Finder Time: " << fTime;
274 if (fVerbose == 0) cout << "Work time of the GEM vertex finder: " << fTime << endl;
275}
276
277Double_t BmnVertexFinder::CalcRms2D(vector<Double_t> x, vector<Double_t> y) {
278 Double_t xMean = 0.0;
279 Double_t yMean = 0.0;
280 Double_t rms = 0.0;
281 for (size_t iHit = 0; iHit < x.size(); ++iHit) {
282 xMean += x.at(iHit);
283 yMean += y.at(iHit);
284 }
285 xMean /= x.size();
286 yMean /= y.size();
287
288 for (size_t iHit = 0; iHit < x.size(); ++iHit) {
289 rms += (Sq(x.at(iHit) - xMean) + Sq(y.at(iHit) - yMean));
290 }
291
292 rms /= x.size();
293 return Sqrt(rms);
294}
295
296Double_t BmnVertexFinder::CalcMeanDist(vector<Double_t> x, vector<Double_t> y) {
297 Double_t sumDist = 0.0;
298 Int_t nPairs = 0;
299 for (size_t i = 0; i < x.size(); ++i) {
300 for (size_t j = i + 1; j < x.size(); ++j) {
301 sumDist += Sqrt(Sq(x[i] - x[j]) + Sq(y[i] - y[j]));
302 nPairs++;
303 }
304 }
305 return sumDist / nPairs; // calc. ave. dist value
306}
int i
Definition P4_F32vec4.h:22
@ kBMNERROR
Definition BmnEnums.h:26
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
void SetFlag(Int_t flag)
Definition BmnTrack.h:93
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:72
Int_t GetFlag() const
Definition BmnTrack.h:52
virtual void Finish()
BmnVertex FindSecondaryVertex(TClonesArray *tracks)
virtual InitStatus Init()
virtual ~BmnVertexFinder()
virtual void Exec(Option_t *opt)
BmnVertex FindPrimaryVertex(TClonesArray *tracks)
Float_t FindVZByVirtualPlanes(Float_t z_0, Float_t range, TClonesArray *tracks, Int_t flag)
STL namespace.