BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnSiliconTrackFinder.h
Go to the documentation of this file.
1// Author: Vasilisa Lenivenko (VBLHEP) <vasilisa@jinr.ru> 2019-07-18
2
3////////////////////////////////////////////////////////////////////////////////
4// //
5// BmnSiliconTrackFinder //
6// //
7// Implementation of an algorithm developed by //
8// V.Lenivenko and V.Paltchik //
9// to the BmnRoot software //
10// //
11// The algorithm serves for searching for track segments //
12// in the Silicon detectors of the BM@N experiment //
13// //
14////////////////////////////////////////////////////////////////////////////////
15
16#ifndef BMNSILICONTRACKFINDER_H
17#define BMNSILICONTRACKFINDER_H 1
18
19#include "BmnSiliconDigit.h"
20#include "BmnSiliconHit.h"
21#include "BmnSiliconTrack.h"
22#include "BmnTrack.h"
23#include "FairMCPoint.h"
24#include "FairTask.h"
25#include "FairTrackParam.h"
26#include "TH1D.h"
27#include "TH2D.h"
28#include "TList.h"
29
30#include <TClonesArray.h>
31#include <TMath.h>
32#include <TString.h>
33#include <TVector2.h>
34#include <fstream>
35#include <vector>
36
37using namespace std;
38using namespace TMath;
39
40struct tracksX
41{
42 Int_t Nhits = 0;
43 Double_t Chi2 = 0.;
44 Double_t Xv = 999.;
45 Double_t Yv = 999.;
46 Double_t param[4] = {999., 999., 999., 999.};
47 Double_t CoordX[4] = {-999., -999., -999., -999.};
48 Double_t CoordXp[4] = {-999., -999., -999., -999.};
49 Double_t CoordY[4] = {-999., -999., -999., -999.};
50 Double_t CoordZ[4] = {-999., -999., -999., -999.};
51 Double_t SigmaX[4] = {-999., -999., -999., -999.};
52 Double_t SigmaXp[4] = {-999., -999., -999., -999.};
53 Double_t SigmaY[4] = {-999., -999., -999., -999.};
54
55 Int_t ModNum[4] = {-1, -1, -1, -1};
56 Double_t StripNumX[4] = {-999., -999., -999., -999.};
57 Double_t StripNumXp[4] = {-999., -999., -999., -999.};
58 Double_t ClSizeX[4] = {-999., -999., -999., -999.};
59 Double_t ClSizeXp[4] = {-999., -999., -999., -999.};
60 Double_t SumQX[4] = {-999., -999., -999., -999.};
61 Double_t SumQXp[4] = {-999., -999., -999., -999.};
62 Int_t Pdg = -1;
63};
64
66{
67 public:
71
72 virtual InitStatus Init();
73 virtual void Exec(Option_t* opt);
74 virtual void Finish();
75
76 static bool compareSegments(const tracksX& a, const tracksX& b) { return a.Chi2 < b.Chi2; }
77
78 struct MC_points
79 {
80 Int_t Id = -1; // mcId
81 Int_t Np = -1;
82 Int_t Pdg = -999;
83 Double_t x[4] = {-999., -999., -999., -999.};
84 Double_t y[4] = {-999., -999., -999., -999.};
85 Double_t z[4] = {-999., -999., -999., -999.};
86 Bool_t wo3st = 0;
87
88 Double_t param[4] = {999., 999., 999., 999.};
89 };
90
91 private:
92 Bool_t fDebug = 0;
93 UInt_t fEventNo = 0; // event counter
96 Int_t N;
98 TList fList;
99 TClonesArray* fBmnSiDigitsArray;
100 TClonesArray* fSiTracks;
101 /** Output array of Silicon Hits **/
102 TString fOutputHitsBranchName;
103 TClonesArray* fBmnSiliconHitsArray;
104 TClonesArray* fBmnSiliconHitsXArray;
105 TClonesArray* fBmnSiliconHitsXpArray;
106 TClonesArray* fBmnSiliconHitsXYArray;
107 TClonesArray* fBmnHitsArray;
108 TClonesArray* fBmnHitsArray2;
109 TString fOutputFileName;
110 TString fInputBranchName;
111 TString fInputBranchName2;
112
113 //--
126 Int_t* iClustXMod; //!
127 Int_t* iModX; //!
128 Int_t* Nsp_st; //!
130 Double_t* rhs; //!
131 Double_t* AmatrArray; //!
132 Double_t* line; //!
135 Double_t* Zposition; //!
137 Double_t* Ampl_strX; //!
138 Double_t* Ampl_strXp; //!
139 Int_t** NclustX; //!
140 Int_t** NclustXp; //!
141 Int_t** NhitsXYmod; //!
142 Int_t** Nleftoversp; //!
143 Int_t** NleftoverX; //!
144 Int_t** NleftoverXp; //!
145 Double_t** Amatr; //!
146 Double_t** shiftX; //!
147 Double_t** shiftY; //!
148 Double_t** shiftYbelow; //!
149 Double_t** Zstation; //!
150 Double_t** Xforglfit; //!
151 Double_t** Xpforglfit; //!
152 Double_t** Yforglfit; //!
157 Double_t*** DigitsArrayX; //!
158 Double_t*** DigitsArrayXp; //!
159 Double_t*** XClust; //!
160 Double_t*** XpClust; //!
161 Double_t*** XClust_width; //!
162 Double_t*** XpClust_width; //!
163 Double_t*** sumQx; //!
164 Double_t*** sumQxp; //!
165 Double_t*** XspClust; //!
166 Double_t*** XpspClust; //!
169 Double_t*** sumQxsp; //!
170 Double_t*** sumQxpsp; //!
171 Double_t*** XCoord; //!
172 Double_t*** XpCoord; //!
173 Double_t*** XspCoord; //!
174 Double_t*** XpspCoord; //!
175 Double_t*** YspCoord; //!
176 Int_t*** Sp_pdg; //!
177 Double_t*** SigmaX; //!
178 Double_t*** SigmaXp; //!
179 Double_t*** SigmspX; //!
180 Double_t*** SigmspXp; //!
181 Double_t*** SigmspY; //!
182 Double_t*** leftoverXsp; //!
183 Double_t*** leftoverXpsp; //!
184 Double_t*** leftoverYsp; //!
188 Double_t*** leftoverX; //!
189 Double_t*** leftoverXp; //!
190 Double_t*** leftoverXsig; //!
191 Double_t*** leftoverXpsig; //!
192
193 vector<tracksX> vec_tracks;
194 vector<tracksX> CleanTr;
195 vector<MC_points> vec_points;
196
217
220 void Case1(Int_t**,
221 Double_t***,
222 Double_t***,
223 Double_t***,
224 Double_t***,
225 Double_t***,
226 Double_t***,
227 vector<tracksX>&,
228 Double_t***,
229 Double_t***,
230 Double_t***,
231 Double_t***,
232 Double_t***,
233 Double_t***);
235 Int_t**,
236 Double_t***,
237 Double_t***,
238 Double_t***,
239 Double_t***,
240 Double_t***,
241 Double_t***,
242 Int_t**,
243 Int_t**,
244 Double_t***,
245 Double_t***,
246 Double_t***,
247 Double_t***,
248 vector<tracksX>&,
249 Double_t***,
250 Double_t***,
251 Double_t***,
252 Double_t***,
253 Double_t***,
254 Double_t***,
255 Double_t***,
256 Double_t***,
257 Double_t***,
258 Double_t***,
259 Double_t***,
260 Double_t***);
261 void Case3(Int_t**,
262 Double_t***,
263 Double_t***,
264 Double_t***,
265 Double_t***,
266 Double_t***,
267 Double_t***,
268 Int_t**,
269 Int_t**,
270 Double_t***,
271 Double_t***,
272 Double_t***,
273 Double_t***,
274 vector<tracksX>&,
275 Double_t***,
276 Double_t***,
277 Double_t***,
278 Double_t***,
279 Double_t***,
280 Double_t***,
281 Double_t***,
282 Double_t***,
283 Double_t***,
284 Double_t***,
285 Double_t***,
286 Double_t***);
288 Int_t**,
289 Double_t***,
290 Double_t***,
291 Double_t***,
292 Double_t***,
293 Double_t***,
294 Double_t***,
295 Int_t**,
296 Int_t**,
297 Double_t***,
298 Double_t***,
299 Double_t***,
300 Double_t***,
301 vector<tracksX>&,
302 Double_t***,
303 Double_t***,
304 Double_t***,
305 Double_t***,
306 Double_t***,
307 Double_t***,
308 Double_t***,
309 Double_t***,
310 Double_t***,
311 Double_t***,
312 Double_t***,
313 Double_t***);
314
316 Double_t***,
317 Double_t***,
318 Double_t***,
319 Double_t***,
320 Int_t**,
321 Double_t***,
322 Double_t***,
323 Double_t***,
324 Int_t**);
327 void GetXYspatial(Int_t** NClX,
328 Int_t** NClXp,
329 Double_t*** XCoor,
330 Double_t*** XpCoor,
331 Double_t*** Xsp,
332 Double_t*** Xpsp,
333 Double_t*** Ysp,
334 Int_t** NXYsp,
335 Double_t*** SigmX,
336 Double_t*** SigmXp,
337 Double_t*** SigspX,
338 Double_t*** SigspXp,
339 Double_t*** SigspY,
340 Double_t***,
341 Double_t***,
342 Double_t***,
343 Double_t***,
344 Double_t***,
345 Double_t***,
346 Double_t***,
347 Double_t***,
348 Double_t***,
349 Double_t***,
350 Double_t***,
351 Double_t***);
353 Int_t**,
354 Double_t***,
355 Double_t***,
356 Double_t***,
357 Double_t***,
358 Double_t***,
359 Double_t***,
360 Double_t***,
361 Double_t***,
362 Double_t***,
363 Double_t***,
364 Int_t**,
365 Double_t***,
366 Double_t***,
367 Double_t***,
368 Double_t***,
369 Double_t***,
370 Double_t***,
371 Double_t***,
372 Double_t***,
373 Double_t***,
374 Double_t***,
375 Double_t***,
376 Double_t***,
377 vector<MC_points>&,
378 Int_t***);
380 void
382 void RecordingTracksAfterSpatialPoints(vector<tracksX>&, vector<tracksX>&);
383 void RecordingTracks(vector<tracksX>&, vector<tracksX>&);
384 void RecordingTracks_case3(vector<tracksX>&, vector<tracksX>&);
386 Int_t**,
387 Double_t***,
388 Double_t***,
389 Double_t***,
390 Double_t***,
391 Double_t***,
392 Double_t***,
393 Double_t***,
394 Double_t***,
395 Double_t***,
396 Double_t***,
397 Int_t**,
398 vector<tracksX>&,
399 Int_t**,
400 Int_t**,
401 Int_t**,
402 Double_t***,
403 Double_t***,
404 Double_t***,
405 Double_t***,
406 Double_t***,
407 Double_t***,
408 Double_t***,
409 Double_t***,
410 Double_t***,
411 Double_t***);
413 Int_t**,
414 Int_t**,
415 Double_t***,
416 Double_t***,
417 Double_t***,
418 Double_t***,
419 Double_t***,
420 Double_t***,
421 Double_t***,
422 Double_t***,
423 Double_t***,
424 Double_t***,
425 vector<tracksX>&,
426 Int_t**,
427 Double_t***,
428 Double_t***,
429 Double_t***,
430 Double_t***);
431 void PrintAllTracks(vector<tracksX>&);
433 void MCefficiencyCalculation(vector<MC_points>&, vector<tracksX>&);
435 Int_t**,
436 Int_t**,
437 Double_t***,
438 Double_t***,
439 Double_t***,
440 Double_t***,
441 Double_t***,
442 Double_t***,
443 Double_t***,
444 Double_t***,
445 Double_t***,
446 Double_t***,
447 Double_t***,
448 Double_t***,
449 Double_t***,
450 Double_t***,
451 Double_t***,
452 Double_t***,
453 Double_t***,
454 Double_t***,
455 Double_t***,
456 Double_t***,
457 Double_t***,
458 Int_t***);
459 void WriteSiliconTracks(vector<tracksX>&);
460
465
466 const float tg2_5 = tan(2.5 * TMath::Pi() / 180.);
467 const float sin2_5 = sin(2.5 * TMath::Pi() / 180.);
468 const float cos2_5 = cos(2.5 * TMath::Pi() / 180.);
469 const Int_t kBig = 300;
470 const Int_t kMaxMC = 100;
471 const Int_t nstripXp = 640;
472 const Int_t nstripXpsm = 614;
473 const Int_t fNstrips = 643;
474 const Double_t sq12 = sqrt(12.);
475
476 const Double_t deltaX = 0.0095; // cm
477 const Double_t deltaXp = 0.01030001; // cm
478 const Double_t half_module = 6.0705;
479 const Double_t shift_after_zigzag = 0.01; // cm
480 const Double_t Xv_av = 0.4;
481 const Double_t Yv_av = 0.4;
482 const Double_t half_roadX1_X2 = 0.11;
483 const Double_t half_roadXp1_Xp2 = 0.11;
484 const Double_t half_roadX1_X3 = 0.7;
485 const Double_t half_roadX1_Xp1 = 0.5; // mc//0.3;
486 const Double_t half_roadX2_Xp2 = 0.5; // mc//0.3;
487 const Double_t half_roadX3_Xp3 = 0.55;
488 const Double_t half_roadY1_Y2 = 0.45;
490 const Double_t half_roadX1_Xp2 = .5;
491
492 const Int_t PDG_Li7 = 1000030070; // Li7
493 const Int_t PDG_He4 = 1000020040; // He4
494
499
500 // cut for cluster charge
504 // cut for strip charge
509
511};
512
513#endif
bool Bool_t
int Int_t
unsigned int UInt_t
double Double_t
const char Option_t
#define ClassDef(name, id)
void Case3(Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< tracksX > &, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
void GetXYspatial(Int_t **NClX, Int_t **NClXp, Double_t ***XCoor, Double_t ***XpCoor, Double_t ***Xsp, Double_t ***Xpsp, Double_t ***Ysp, Int_t **NXYsp, Double_t ***SigmX, Double_t ***SigmXp, Double_t ***SigspX, Double_t ***SigspXp, Double_t ***SigspY, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
void CoordinateAlignment(Int_t **, Double_t ***, Double_t ***, Double_t ***, Int_t **, Int_t **, Double_t ***, Double_t ***)
void WriteSiliconHits(Int_t **, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t ***)
void CoordinateCalculation(Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< MC_points > &, Int_t ***)
void PrintAllTracks(vector< tracksX > &)
virtual void Finish()
void CountSpatialPoints(Int_t **, Int_t *)
void Clustering(Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, Double_t ***, Double_t ***, Double_t ***, Int_t **)
virtual InitStatus Init()
void WriteSiliconTracks(vector< tracksX > &)
Bool_t SkipEvent(Int_t **, Int_t **, Double_t ***, Double_t ***)
virtual void Exec(Option_t *opt)
Double_t GetXYspatial_station1_2(Int_t &, Int_t &, Double_t &, Double_t &)
void Case2(Int_t &, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< tracksX > &, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
Double_t FindClusterCenter(Double_t *, Int_t, Double_t &)
void MCefficiencyCalculation(vector< MC_points > &, vector< tracksX > &)
BmnSiliconTrackFinder(Bool_t, Int_t, Int_t)
vector< MC_points > vec_points
void StripsReading(Double_t ***, Double_t ***)
void Case4(Int_t &, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< tracksX > &, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
bool InvertMatrix(Double_t *, Double_t *)
void PrepareArraysToProcessEvent()
virtual ~BmnSiliconTrackFinder()
void RecordingTracks(vector< tracksX > &, vector< tracksX > &)
const Double_t half_roadXp1_Xp2_diff_sign
void RecordingTracksAfterSpatialPoints(vector< tracksX > &, vector< tracksX > &)
TClonesArray * fBmnSiliconHitsXpArray
Int_t Angle(Int_t &, Int_t &)
static bool compareSegments(const tracksX &a, const tracksX &b)
void calculationOfChi2(Double_t **, Double_t **, Double_t **, Double_t **, Int_t *, Int_t *, Double_t &, Double_t *)
void CheckPoints(Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Int_t **, vector< tracksX > &, Int_t **, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
TString fOutputHitsBranchName
Output array of Silicon Hits.
TClonesArray * fBmnSiliconHitsXYArray
void RecordingTracks_case3(vector< tracksX > &, vector< tracksX > &)
void CheckLeftover(Int_t **, Int_t **, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< tracksX > &, Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
void GlobalFit(Double_t **, Double_t **, Double_t **, Double_t **, Double_t **, Double_t **, Double_t *)
void Case1(Int_t **, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, vector< tracksX > &, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***, Double_t ***)
RVec< PromoteType< T > > tan(const RVec< T > &v)
RVec< PromoteType< T > > cos(const RVec< T > &v)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
RVec< PromoteType< T > > sin(const RVec< T > &v)
constexpr Double_t Pi()
Definition json.hpp:4446
Double_t SumQX[4]
Double_t SigmaX[4]
Double_t CoordZ[4]
Double_t SigmaXp[4]
Double_t CoordX[4]
Double_t CoordY[4]
Double_t SigmaY[4]
Double_t StripNumX[4]
Double_t param[4]
Double_t StripNumXp[4]
Double_t ClSizeX[4]
Double_t SumQXp[4]
Double_t CoordXp[4]
Double_t ClSizeXp[4]