BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
recoRun1.C
Go to the documentation of this file.
1
2#include "TFile.h"
3#include "TString.h"
4#include "TTree.h"
5#include "qaRun1.C"
6#include "recoRun1.C"
7
8TFile* fOut = new TFile("bmndst_qa.root", "RECREATE");
9
11Float_t boundX = 120.0 * 2.414 / 2.0; // InnerRadiusOfOctagon;
15
16TH2F* h_xy1 = new TH2F("hxy_DCH1", "hxy_DCH1", nBins1, -boundX, boundX, nBins1, -boundY, boundY);
17TH2F* h_xy2 = new TH2F("hxy_DCH2", "hxy_DCH2", nBins1, -boundX, boundX, nBins1, -boundY, boundY);
18
20Float_t res_bound = 0.0; // cm
21
22TH1I* h_nHits = new TH1I("h_nHits", "h_nHits", 5, 0, 5);
23
24TH1F* h_dch1_dist_3d = new TH1F("h_dch1_dist_3d", "h_dch1_dist_3d", nBins2, 0.0, res_bound);
25TH1F* h_dch2_dist_3d = new TH1F("h_dch2_dist_3d", "h_dch2_dist_3d", nBins2, 0.0, res_bound);
26
28 new TH2F("h_dch1_dist_x", "h_dch1_dist_x", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
30 new TH2F("h_dch1_dist_y", "h_dch1_distyx", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
32 new TH2F("h_dch1_dist_z", "h_dch1_dist_z", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
34 new TH2F("h_dch2_dist_x", "h_dch2_dist_x", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
36 new TH2F("h_dch2_dist_y", "h_dch2_distyx", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
38 new TH2F("h_dch2_dist_z", "h_dch2_dist_z", nBins2, -res_bound, res_bound, nBins2, -res_bound, res_bound);
39
40// MWPC digits
41TH1I* h_mwpc0_digit_time = new TH1I("h_mwpc0_digit_time", "Time distribution of MWPC0 digits", 50, -5, 45);
42TH1I* h_mwpc1_digit_time = new TH1I("h_mwpc1_digit_time", "Time distribution of MWPC1 digits", 50, -5, 45);
43TH1I* h_mwpc2_digit_time = new TH1I("h_mwpc2_digit_time", "Time distribution of MWPC2 digits", 50, -5, 45);
44
45TH1I* h_mwpc_digit_planes = new TH1I("h_mwpc_digit_planes", "Plane distribution of MWPC digits", 21, -1, 20);
46
47TH1I* h_mwpc0_digit_nDigits = new TH1I("h_mwpc0_digit_nDigits", "Number of digits distribution in MWPC0", 21, -1, 20);
48TH1I* h_mwpc1_digit_nDigits = new TH1I("h_mwpc1_digit_nDigits", "Number of digits distribution in MWPC1", 21, -1, 20);
49TH1I* h_mwpc2_digit_nDigits = new TH1I("h_mwpc2_digit_nDigits", "Number of digits distribution in MWPC2", 21, -1, 20);
50
51// TH1I* h_mwpc0_digit_plane0_nDigits = new TH1I("h_mwpc0_digit_plane0_nDigits", "Number of digits distribution in MWPC0
52// for plane = 0", 21, -1, 20); TH1I* h_mwpc0_digit_plane1_nDigits = new TH1I("h_mwpc0_digit_plane1_nDigits", "Number of
53// digits distribution in MWPC0 for plane = 1", 21, -1, 20); TH1I* h_mwpc0_digit_plane2_nDigits = new
54// TH1I("h_mwpc0_digit_plane2_nDigits", "Number of digits distribution in MWPC0 for plane = 2", 21, -1, 20); TH1I*
55// h_mwpc0_digit_plane3_nDigits = new TH1I("h_mwpc0_digit_plane3_nDigits", "Number of digits distribution in MWPC0 for
56// plane = 3", 21, -1, 20); TH1I* h_mwpc0_digit_plane4_nDigits = new TH1I("h_mwpc0_digit_plane4_nDigits", "Number of
57// digits distribution in MWPC0 for plane = 4", 21, -1, 20); TH1I* h_mwpc0_digit_plane5_nDigits = new
58// TH1I("h_mwpc0_digit_plane5_nDigits", "Number of digits distribution in MWPC0 for plane = 5", 21, -1, 20); TH1I*
59// h_mwpc1_digit_plane0_nDigits = new TH1I("h_mwpc1_digit_plane0_nDigits", "Number of digits distribution in MWPC1 for
60// plane = 0", 21, -1, 20); TH1I* h_mwpc1_digit_plane1_nDigits = new TH1I("h_mwpc1_digit_plane1_nDigits", "Number of
61// digits distribution in MWPC1 for plane = 1", 21, -1, 20); TH1I* h_mwpc1_digit_plane2_nDigits = new
62// TH1I("h_mwpc1_digit_plane2_nDigits", "Number of digits distribution in MWPC1 for plane = 2", 21, -1, 20); TH1I*
63// h_mwpc1_digit_plane3_nDigits = new TH1I("h_mwpc1_digit_plane3_nDigits", "Number of digits distribution in MWPC1 for
64// plane = 3", 21, -1, 20); TH1I* h_mwpc1_digit_plane4_nDigits = new TH1I("h_mwpc1_digit_plane4_nDigits", "Number of
65// digits distribution in MWPC1 for plane = 4", 21, -1, 20); TH1I* h_mwpc1_digit_plane5_nDigits = new
66// TH1I("h_mwpc1_digit_plane5_nDigits", "Number of digits distribution in MWPC1 for plane = 5", 21, -1, 20); TH1I*
67// h_mwpc2_digit_plane0_nDigits = new TH1I("h_mwpc2_digit_plane0_nDigits", "Number of digits distribution in MWPC2 for
68// plane = 0", 21, -1, 20); TH1I* h_mwpc2_digit_plane1_nDigits = new TH1I("h_mwpc2_digit_plane1_nDigits", "Number of
69// digits distribution in MWPC2 for plane = 1", 21, -1, 20); TH1I* h_mwpc2_digit_plane2_nDigits = new
70// TH1I("h_mwpc2_digit_plane2_nDigits", "Number of digits distribution in MWPC2 for plane = 2", 21, -1, 20); TH1I*
71// h_mwpc2_digit_plane3_nDigits = new TH1I("h_mwpc2_digit_plane3_nDigits", "Number of digits distribution in MWPC2 for
72// plane = 3", 21, -1, 20); TH1I* h_mwpc2_digit_plane4_nDigits = new TH1I("h_mwpc2_digit_plane4_nDigits", "Number of
73// digits distribution in MWPC2 for plane = 4", 21, -1, 20); TH1I* h_mwpc2_digit_plane5_nDigits = new
74// TH1I("h_mwpc2_digit_plane5_nDigits", "Number of digits distribution in MWPC2 for plane = 5", 21, -1, 20);
75
76// MWPC hits
81 new TH2F("h_mwpc0_hit_XY", "Hits distribution in XY plane in MWPC0", mwpcN, -mwpcX, mwpcX, mwpcN, -mwpcY, mwpcY);
83 new TH2F("h_mwpc1_hit_XY", "Hits distribution in XY plane in MWPC1", mwpcN, -mwpcX, mwpcX, mwpcN, -mwpcY, mwpcY);
85 new TH2F("h_mwpc2_hit_XY", "Hits distribution in XY plane in MWPC2", mwpcN, -mwpcX, mwpcX, mwpcN, -mwpcY, mwpcY);
86
87TH1F* h_mwpc0_hit_X = new TH1F("h_mwpc0_hit_X", "Hits distribution in X axis in MWPC0", mwpcN, -mwpcX, mwpcX);
88TH1F* h_mwpc1_hit_X = new TH1F("h_mwpc1_hit_X", "Hits distribution in X axis in MWPC1", mwpcN, -mwpcX, mwpcX);
89TH1F* h_mwpc2_hit_X = new TH1F("h_mwpc2_hit_X", "Hits distribution in X axis in MWPC2", mwpcN, -mwpcX, mwpcX);
90
91TH1F* h_mwpc0_hit_Y = new TH1F("h_mwpc0_hit_Y", "Hits distribution in Y axis in MWPC0", mwpcN, -mwpcY, mwpcY);
92TH1F* h_mwpc1_hit_Y = new TH1F("h_mwpc1_hit_Y", "Hits distribution in Y axis in MWPC1", mwpcN, -mwpcY, mwpcY);
93TH1F* h_mwpc2_hit_Y = new TH1F("h_mwpc2_hit_Y", "Hits distribution in Y axis in MWPC2", mwpcN, -mwpcY, mwpcY);
94
95TH1F* h_mwpc0_hit_Z = new TH1F("h_mwpc0_hit_Z", "Hits distribution in Z axis in MWPC0", mwpcN, 0.0, 0.0);
96TH1F* h_mwpc1_hit_Z = new TH1F("h_mwpc1_hit_Z", "Hits distribution in Z axis in MWPC1", mwpcN, 0.0, 0.0);
97TH1F* h_mwpc2_hit_Z = new TH1F("h_mwpc2_hit_Z", "Hits distribution in Z axis in MWPC2", mwpcN, 0.0, 0.0);
98
99TH1I* h_mwpc0_hit_nHits = new TH1I("h_mwpc0_hit_nHits", "Number of hits distribution in MWPC0", 21, -1, 20);
100TH1I* h_mwpc1_hit_nHits = new TH1I("h_mwpc1_hit_nHits", "Number of hits distribution in MWPC1", 21, -1, 20);
101TH1I* h_mwpc2_hit_nHits = new TH1I("h_mwpc2_hit_nHits", "Number of hits distribution in MWPC2", 21, -1, 20);
102
103// MWPC tracks
104
105const Float_t TxBound = 2.0;
106const Float_t TyBound = 2.0;
107
108TH1F* h_mwpc0_track_Tx = new TH1F("h_mwpc0_track_Tx", "Tx distribution of tracks in MWPC0", 100, -TxBound, TxBound);
109TH1F* h_mwpc1_track_Tx = new TH1F("h_mwpc1_track_Tx", "Tx distribution of tracks in MWPC1", 100, -TxBound, TxBound);
110TH1F* h_mwpc2_track_Tx = new TH1F("h_mwpc2_track_Tx", "Tx distribution of tracks in MWPC2", 100, -TxBound, TxBound);
111
112TH1F* h_mwpc0_track_Ty = new TH1F("h_mwpc0_track_Ty", "Ty distribution of tracks in MWPC0", 100, -TyBound, TyBound);
113TH1F* h_mwpc1_track_Ty = new TH1F("h_mwpc1_track_Ty", "Ty distribution of tracks in MWPC1", 100, -TyBound, TyBound);
114TH1F* h_mwpc2_track_Ty = new TH1F("h_mwpc2_track_Ty", "Ty distribution of tracks in MWPC2", 100, -TyBound, TyBound);
115
116TH1I* h_mwpc0_track_nHits = new TH1I("h_mwpc0_track_nHits", "Number of hit distribution of MWPC0 tracks", 5, -1, 4);
117TH1I* h_mwpc1_track_nHits = new TH1I("h_mwpc1_track_nHits", "Number of hit distribution of MWPC1 tracks", 5, -1, 4);
118TH1I* h_mwpc2_track_nHits = new TH1I("h_mwpc2_track_nHits", "Number of hit distribution of MWPC2 tracks", 5, -1, 4);
119
120TH1F* h_mwpc0_track_chi2 = new TH1F("h_mwpc0_track_chi2", "#Chi^2 distribution of tracks in MWPC0", mwpcN, -1, 20);
121TH1F* h_mwpc1_track_chi2 = new TH1F("h_mwpc1_track_chi2", "#Chi^2 distribution of tracks in MWPC1", mwpcN, -1, 20);
122TH1F* h_mwpc2_track_chi2 = new TH1F("h_mwpc2_track_chi2", "#Chi^2 distribution of tracks in MWPC2", mwpcN, -1, 20);
123
124TH2F* h_mwpc0_track_XYstart = new TH2F("h_mwpc0_track_XYstart",
125 "Start hits distribution of track in XY plane in MWPC0",
126 mwpcN,
127 -mwpcX,
128 mwpcX,
129 mwpcN,
130 -mwpcY,
131 mwpcY);
132TH2F* h_mwpc1_track_XYstart = new TH2F("h_mwpc1_track_XYstart",
133 "Start hits distribution of track in XY plane in MWPC1",
134 mwpcN,
135 -mwpcX,
136 mwpcX,
137 mwpcN,
138 -mwpcY,
139 mwpcY);
140TH2F* h_mwpc2_track_XYstart = new TH2F("h_mwpc2_track_XYstart",
141 "Start hits distribution of track in XY plane in MWPC2",
142 mwpcN,
143 -mwpcX,
144 mwpcX,
145 mwpcN,
146 -mwpcY,
147 mwpcY);
148
150 new TH1F("h_mwpc0_track_Xstart", "Start hits distribution of track in X axis in MWPC0", mwpcN, -mwpcX, mwpcX);
152 new TH1F("h_mwpc1_track_Xstart", "Start hits distribution of track in X axis in MWPC1", mwpcN, -mwpcX, mwpcX);
154 new TH1F("h_mwpc2_track_Xstart", "Start hits distribution of track in X axis in MWPC2", mwpcN, -mwpcX, mwpcX);
155
157 new TH1F("h_mwpc0_track_Ystart", "Start hits distribution of track in Y axis in MWPC0", mwpcN, -mwpcY, mwpcY);
159 new TH1F("h_mwpc1_track_Ystart", "Start hits distribution of track in Y axis in MWPC1", mwpcN, -mwpcY, mwpcY);
161 new TH1F("h_mwpc2_track_Ystart", "Start hits distribution of track in Y axis in MWPC2", mwpcN, -mwpcY, mwpcY);
162
163TH1I* h_mwpc0_track_nTracks = new TH1I("h_mwpc0_track_nTracks", "Number of tracks distribution in MWPC0", 21, -1, 20);
164TH1I* h_mwpc1_track_nTracks = new TH1I("h_mwpc1_track_nTracks", "Number of tracks distribution in MWPC1", 21, -1, 20);
165TH1I* h_mwpc2_track_nTracks = new TH1I("h_mwpc2_track_nTracks", "Number of tracks distribution in MWPC2", 21, -1, 20);
166
167// MWPC matched tracks
169 new TH1F("h_mwpc_matched_track_Tx", "Tx distribution of tracks in MWPC", mwpcN, -0.1, 0.1);
171 new TH1F("h_mwpc_matched_track_Ty", "Ty distribution of tracks in MWPC", mwpcN, -0.1, 0.1);
173 new TH1I("h_mwpc_matched_track_nHits", "Number of hit distribution of MWPC tracks", 8, 0, 8);
175 new TH1F("h_mwpc_matched_track_chi2", "#Chi^2 distribution of tracks in MWPC", mwpcN, 0.0, 10.0);
176TH2F* h_mwpc_matched_track_XYstart = new TH2F("h_mwpc_matched_track_XYstart",
177 "Start hits distribution of track in XY plane in MWPC",
178 mwpcN,
179 -mwpcX,
180 mwpcX,
181 mwpcN,
182 -mwpcY,
183 mwpcY);
185 new TH1F("h_mwpc_matched_track_Xstart", "Start hits distribution of track in X axis in MWPC", mwpcN, -mwpcX, mwpcX);
187 new TH1F("h_mwpc_matched_track_Ystart", "Start hits distribution of track in Y axis in MWPC", mwpcN, -mwpcY, mwpcY);
189 new TH1I("h_mwpc_matched_track_nTracks", "Number of tracks distribution in MWPC", 6, -1, 5);
190
192 new TH1F("h_mwpc_matched_track_dist_3d", "h_mwpc_matched_track_dist_3d", mwpcN, 0.0, res_bound);
193
195{
196
197 UInt_t nEvents = 10000; // zero corresponds to ALL EVENTS in run
198
199 reco(648, nEvents);
200
201 qa(648, nEvents);
202
203 fOut->Write();
204 fOut->Close();
205}
206
207void reco(Int_t runId = 648, Int_t nEvents = 10000)
208{
209
210 /* Load basic libraries */
211 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
212 bmnloadlibs(); // load bmn libraries
213
214 TString geoName = (runId >= 12 && runId <= 188) ? "geometry_run1"
215 : (runId >= 220 && runId <= 395) ? "geometry_run2"
216 : (runId >= 403 && runId <= 688) ? "geometry_run3"
217 : "WRONG runId = " + runId + "! NO GEOMETRY FOUND!!!";
218
219 cout << "INFO: Geometry type: " << geoName << endl;
220 if (geoName.Contains("NO GEOMETRY FOUND!!!"))
221 return;
222
223 TGeoManager::Import("geometry_run/" + geoName + ".root");
224
225 TChain* bmnTree = new TChain("BMN_DIGIT");
226 bmnTree->Add(TString::Format("bmn_run0%d_digit.root", runId));
227
228 TChain* bmnRawTree = new TChain("BMN_RAW");
229 bmnRawTree->Add(TString::Format("bmn_run0%d_eb+hrb.root", runId));
230
231 TClonesArray* dchDigits;
232 TClonesArray* mwpcDigits;
233 // TClonesArray *tof400Digits;
234 // TClonesArray *tof700Digits;
235 // TClonesArray *zdcDigits;
236 bmnTree->SetBranchAddress("bmn_dch_digit", &dchDigits);
237 // bmnTree->SetBranchAddress("bmn_tof1_digit", &tof400Digits);
238 // bmnTree->SetBranchAddress("bmn_tof2_digit", &tof700Digits);
239 // bmnTree->SetBranchAddress("bmn_zdc_digit", &zdcDigits);
240 bmnRawTree->SetBranchAddress("bmn_mwpc", &mwpcDigits);
241
242 Int_t startEvent = 0;
243 Int_t events = (nEvents == 0) ? bmnTree->GetEntries() : nEvents;
244
245 TFile* fReco = new TFile(TString::Format("bmndst_run%d.root", runId), "RECREATE");
246 TTree* tReco = new TTree("cbmsim", TString::Format("bmndst_run%d", runId));
247
248 TClonesArray* dchHits = new TClonesArray("BmnDchHit");
249 TClonesArray* mwpcHits = new TClonesArray("BmnMwpcHit");
250 TClonesArray* dchTracks = new TClonesArray("CbmTrack");
251 TClonesArray* mwpcTracks0 = new TClonesArray("CbmTrack");
252 TClonesArray* mwpcTracks1 = new TClonesArray("CbmTrack");
253 TClonesArray* mwpcTracks2 = new TClonesArray("CbmTrack");
254 TClonesArray* mwpcMatchedTracks = new TClonesArray("CbmTrack");
255
256 tReco->Branch("BmnDchHit", &dchHits);
257 tReco->Branch("BmnMwpcHit", &mwpcHits);
258 tReco->Branch("DchTracks", &dchTracks);
259 tReco->Branch("Mwpc0Seeds", &mwpcTracks0);
260 tReco->Branch("Mwpc1Seeds", &mwpcTracks1);
261 tReco->Branch("Mwpc2Seeds", &mwpcTracks2);
262 tReco->Branch("MwpcMatchedTracks", &mwpcMatchedTracks);
263
264 // cout << "DCH tracks reading: START" << endl;
265 // //File is prepared by Nikolay Voytishin
266 // Int_t nEv = 0;
267 // Float_t x1, y1, z1;
268 // Float_t x2, y2, z2;
269 //
270 // ifstream ifs;
271 // ifs.open("dc_segments_run0648.txt", ifstream::in);
272 // // while (!ifs.eof()) {
273 // for (Int_t iTr = 0; iTr < 15; ++iTr) {
274 // dchHits->Clear();
275 // dchTracks->Clear();
276 // ifs >> nEv >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
277 // cout << nEv << " " << x1 << " " << y1 << " " << z1 << " " << x2 << " " << y2 << " " << z2 << endl;
278 // TVector3 pos1(x1, y1, z1);
279 // new((*dchHits)[dchHits->GetEntriesFast()]) BmnDchHit(0, pos1, TVector3(0, 0, 0), 0);
280 // TVector3 pos2(x2, y2, z2);
281 // new((*dchHits)[dchHits->GetEntriesFast()]) BmnDchHit(0, pos2, TVector3(0, 0, 0), 0);
282 // new((*dchTracks)[dchTracks->GetEntriesFast()]) CbmTrack();
283 // CbmTrack* tr = (CbmTrack*) dchTracks->At(dchTracks->GetEntriesFast() - 1);
284 // tr->AddHit(dchHits->GetEntriesFast() - 2, (HitType) 0);
285 // tr->AddHit(dchHits->GetEntriesFast() - 1, (HitType) 0);
286 // tReco->Fill();
287 // }
288 //
289 // ifs.close();
290 // cout << "DCH tracks reading: FINISH" << endl;
291
292 cout << "Time Selection: START" << endl;
293
294 TH1F* h_times0 = new TH1F("h_times0", "mwpc0_times", 40, 0.0, 40.0);
295 TH1F* h_times1 = new TH1F("h_times1", "mwpc1_times", 40, 0.0, 40.0);
296 TH1F* h_times2 = new TH1F("h_times2", "mwpc2_times", 40, 0.0, 40.0);
297 for (Int_t iEv = startEvent; iEv < startEvent + events; iEv++) {
298 if (iEv % 1000 == 0)
299 cout << "TIME SEECTION: \tRUN#" << runId << "\tEvent: " << iEv + 1 << "/" << startEvent + events << endl;
300 bmnRawTree->GetEntry(iEv);
301 for (Int_t iDig = 0; iDig < mwpcDigits->GetEntriesFast(); ++iDig) {
302 BmnMwpcDigit* digi = (BmnMwpcDigit*)mwpcDigits->At(iDig);
303 Short_t plane = digi->GetPlane();
304 if (plane < 6)
305 h_times0->Fill(digi->GetTime());
306 else if (plane < 12)
307 h_times1->Fill(digi->GetTime());
308 else if (plane < 18)
309 h_times2->Fill(digi->GetTime());
310 }
311 }
312
313 DigitsTimeSelection(h_times0, mwpc0_leftTime, mwpc0_rightTime);
314 DigitsTimeSelection(h_times1, mwpc1_leftTime, mwpc1_rightTime);
315 DigitsTimeSelection(h_times2, mwpc2_leftTime, mwpc2_rightTime);
316
317 delete h_times0;
318 delete h_times1;
319 delete h_times2;
320
321 cout << "Time Selection: FINISH" << endl;
322
323 for (Int_t iEv = startEvent; iEv < startEvent + events; iEv++) {
324 bmnTree->GetEntry(iEv);
325 bmnRawTree->GetEntry(iEv);
326
327 dchHits->Clear();
328 mwpcHits->Clear();
329 dchTracks->Clear();
330 mwpcTracks0->Clear();
331 mwpcTracks1->Clear();
332 mwpcTracks2->Clear();
333 mwpcMatchedTracks->Clear();
334
335 if (iEv % 1000 == 0)
336 cout << "RECO: \tRUN#" << runId << "\tEvent: " << iEv + 1 << "/" << startEvent + events << endl;
337 cout << "Event: " << iEv << endl;
338
339 /* ======= Functions for hits reconstruction ======= */
340 ProcessDchDigits(dchDigits, dchHits);
341 ProcessMwpcDigits(mwpcDigits, mwpcHits);
342
343 /* ======= Functions for "seeding" ======= */
344 DchTrackFinder(dchHits, dchTracks);
345 MwpcTrackFinder(mwpcHits, mwpcTracks0, 0);
346 MwpcTrackFinder(mwpcHits, mwpcTracks1, 1);
347 MwpcTrackFinder(mwpcHits, mwpcTracks2, 2);
348
349 /* ======= Functions for tracks matching ======= */
350
351 // MwpcTrackMatching(mwpcHits, mwpcMatchedTracks, mwpcTracks0, mwpcTracks1);
352 MwpcTrackMatchingByAllHits(mwpcHits, mwpcMatchedTracks);
353
354 tReco->Fill();
355 } // event loop
356
357 tReco->Write();
358 fReco->Close();
359
360 delete bmnTree;
361 delete bmnRawTree;
362}
363
364void qa(Int_t runId = 650, Int_t nEvents = 0)
365{
366
367 /* Load basic libraries */
368 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
369 bmnloadlibs(); // load bmn libraries
370
371 TChain* dstTree = new TChain("cbmsim");
372 dstTree->Add(TString::Format("bmndst_run%d.root", runId));
373
374 TChain* bmnRawTree = new TChain("BMN_RAW");
375 bmnRawTree->Add(TString::Format("bmn_run0%d_eb+hrb.root", runId));
376
377 TClonesArray* dchTracks;
378 dstTree->SetBranchAddress("DchTracks", &dchTracks);
379 TClonesArray* dchHits;
380 dstTree->SetBranchAddress("BmnDchHit", &dchHits);
381 TClonesArray* mwpcTracks0;
382 dstTree->SetBranchAddress("Mwpc0Seeds", &mwpcTracks0);
383 TClonesArray* mwpcTracks1;
384 dstTree->SetBranchAddress("Mwpc1Seeds", &mwpcTracks1);
385 TClonesArray* mwpcTracks2;
386 dstTree->SetBranchAddress("Mwpc2Seeds", &mwpcTracks2);
387 TClonesArray* mwpcHits;
388 dstTree->SetBranchAddress("BmnMwpcHit", &mwpcHits);
389 TClonesArray* mwpcDigits;
390 bmnRawTree->SetBranchAddress("bmn_mwpc", &mwpcDigits);
391 TClonesArray* mwpcMatchedTracks;
392 dstTree->SetBranchAddress("MwpcMatchedTracks", &mwpcMatchedTracks);
393
394 Int_t events = (nEvents == 0) ? dstTree->GetEntries() : nEvents;
395
396 for (Int_t iEv = 0; iEv < events; iEv++) {
397 dstTree->GetEntry(iEv);
398 bmnRawTree->GetEntry(iEv);
399
400 if (iEv % 1000 == 0)
401 cout << "QA: \tRUN#" << runId << "\tEvent: " << iEv + 1 << "/" << events << endl;
402 // for (Int_t glIdx = 0; glIdx < /*dchTracks->GetEntriesFast()*/ 0; ++glIdx) {
403 // CbmTrack* track = (CbmTrack*) dchTracks->At(glIdx);
404 // FairTrackParam* par = track->GetParamFirst();
405 // Float_t Tx = par->GetTx();
406 // Float_t Ty = par->GetTy();
407 // Float_t Az = par->GetQp() / Sqrt(Tx * Tx + Ty * Ty + 1.0);
408 // Float_t Ax = Az * Tx;
409 // Float_t Ay = Az * Ty;
410 // Float_t Vx = par->GetX();
411 // Float_t Vy = par->GetY();
412 // Float_t Vz = par->GetZ();
413 // h_nHits->Fill(track->GetNofHits());
414 // for (Int_t i = 0; i < track->GetNofHits(); ++i) {
415 // BmnDchHit* hit = (BmnDchHit*) dchHits->At(track->GetHitIndex(i));
416 // Short_t dchId = hit->GetDchId();
417 // Float_t Hx = hit->GetX();
418 // Float_t Hy = hit->GetY();
419 // Float_t Hz = hit->GetZ();
420 //
421 // //3D
422 // Float_t dist = DistFromPointToLine3D(TVector3(Ax, Ay, Az), TVector3(Vx, Vy, Vz), TVector3(Hx,
423 // Hy, Hz)); if (dchId == 1) {
424 // h_dch1_dist_3d->Fill(dist);
425 // h_dch1_dist_x->Fill(Hx, dist);
426 // h_dch1_dist_y->Fill(Hy, dist);
427 // h_dch1_dist_z->Fill(Hz, dist);
428 // h_xy1->Fill(Hx, Hy);
429 //
430 // } else if (dchId == 2) {
431 // h_dch2_dist_3d->Fill(dist);
432 // h_dch2_dist_x->Fill(Hx, dist);
433 // h_dch2_dist_y->Fill(Hy, dist);
434 // h_dch2_dist_z->Fill(Hz, dist);
435 // h_xy2->Fill(Hx, Hy);
436 // }
437 // }
438 // }
439
440 // MWPC DIGI
441 Int_t digiCounter0 = 0;
442 Int_t digiCounter1 = 0;
443 Int_t digiCounter2 = 0;
444
445 for (Int_t digId = 0; digId < mwpcDigits->GetEntriesFast(); ++digId) {
446 BmnMwpcDigit* digi = (BmnMwpcDigit*)mwpcDigits->At(digId);
447 Short_t plane = digi->GetPlane();
448 Short_t time = digi->GetTime();
449
450 if (plane / 6 == 0) {
451 if (time < mwpc0_leftTime || time > mwpc0_rightTime)
452 continue;
453 h_mwpc1_digit_time->Fill(time);
454 digiCounter1++;
455 } else if (plane / 6 == 1) {
456 if (time < mwpc1_leftTime || time > mwpc1_rightTime)
457 continue;
458 h_mwpc0_digit_time->Fill(time);
459 digiCounter0++;
460 } else if (plane / 6 == 2) {
461 if (time < mwpc2_leftTime || time > mwpc2_rightTime)
462 continue;
463 h_mwpc2_digit_time->Fill(time);
464 digiCounter2++;
465 }
466 h_mwpc_digit_planes->Fill(plane);
467 }
468 h_mwpc0_digit_nDigits->Fill(digiCounter0);
469 h_mwpc1_digit_nDigits->Fill(digiCounter1);
470 h_mwpc2_digit_nDigits->Fill(digiCounter2);
471
472 // MWPC HIT
473 Int_t hitCounter0 = 0;
474 Int_t hitCounter1 = 0;
475 Int_t hitCounter2 = 0;
476
477 for (Int_t hitId = 0; hitId < mwpcHits->GetEntriesFast(); ++hitId) {
478 BmnMwpcHit* mwpcHit = (BmnMwpcHit*)mwpcHits->At(hitId);
479 Short_t mwpcId = mwpcHit->GetMwpcId();
480 Float_t X = mwpcHit->GetX();
481 Float_t Y = mwpcHit->GetY();
482 Float_t Z = mwpcHit->GetZ();
483 if (mwpcId == 0) {
484 h_mwpc0_hit_XY->Fill(X, Y);
485 h_mwpc0_hit_X->Fill(X);
486 h_mwpc0_hit_Y->Fill(Y);
487 h_mwpc0_hit_Z->Fill(Z);
488 hitCounter0++;
489 } else if (mwpcId == 1) {
490 h_mwpc1_hit_XY->Fill(X, Y);
491 h_mwpc1_hit_X->Fill(X);
492 h_mwpc1_hit_Y->Fill(Y);
493 h_mwpc1_hit_Z->Fill(Z);
494 hitCounter1++;
495 } else if (mwpcId == 2) {
496 h_mwpc2_hit_XY->Fill(X, Y);
497 h_mwpc2_hit_X->Fill(X);
498 h_mwpc2_hit_Y->Fill(Y);
499 h_mwpc2_hit_Z->Fill(Z);
500 hitCounter2++;
501 }
502 }
503 h_mwpc0_hit_nHits->Fill(hitCounter0);
504 h_mwpc1_hit_nHits->Fill(hitCounter1);
505 h_mwpc2_hit_nHits->Fill(hitCounter2);
506
507 // MWPC TRACK
508 for (Int_t trId = 0; trId < mwpcTracks0->GetEntriesFast(); ++trId) {
509 CbmTrack* tr = (CbmTrack*)mwpcTracks0->At(trId);
510 FairTrackParam* par = tr->GetParamFirst();
511 Float_t X = par->GetX();
512 Float_t Y = par->GetY();
513 h_mwpc0_track_Tx->Fill(par->GetTx());
514 h_mwpc0_track_Ty->Fill(par->GetTy());
515 h_mwpc0_track_nHits->Fill(tr->GetNDF());
516 h_mwpc0_track_chi2->Fill(tr->GetChiSq());
517 h_mwpc0_track_XYstart->Fill(X, Y);
518 h_mwpc0_track_Xstart->Fill(X);
519 h_mwpc0_track_Ystart->Fill(Y);
520 }
521 for (Int_t trId = 0; trId < mwpcTracks1->GetEntriesFast(); ++trId) {
522 CbmTrack* tr = (CbmTrack*)mwpcTracks1->At(trId);
523 FairTrackParam* par = tr->GetParamFirst();
524 Float_t X = par->GetX();
525 Float_t Y = par->GetY();
526 h_mwpc1_track_Tx->Fill(par->GetTx());
527 h_mwpc1_track_Ty->Fill(par->GetTy());
528 h_mwpc1_track_nHits->Fill(tr->GetNDF());
529 h_mwpc1_track_chi2->Fill(tr->GetChiSq());
530 h_mwpc1_track_XYstart->Fill(X, Y);
531 h_mwpc1_track_Xstart->Fill(X);
532 h_mwpc1_track_Ystart->Fill(Y);
533 }
534 // for (Int_t trId = 0; trId < mwpcTracks2->GetEntriesFast(); ++trId) {
535 // CbmTrack* tr = (CbmTrack*) mwpcTracks2->At(trId);
536 // FairTrackParam* par = tr->GetParamFirst();
537 // Float_t X = par->GetX();
538 // Float_t Y = par->GetY();
539 // h_mwpc2_track_Tx->Fill(par->GetTx());
540 // h_mwpc2_track_Ty->Fill(par->GetTy());
541 // h_mwpc2_track_nHits->Fill(tr->GetNDF());
542 // h_mwpc2_track_chi2->Fill(tr->GetChiSq());
543 // h_mwpc2_track_XYstart->Fill(X, Y);
544 // h_mwpc2_track_Xstart->Fill(X);
545 // h_mwpc2_track_Ystart->Fill(Y);
546 // }
547
548 h_mwpc0_track_nTracks->Fill(mwpcTracks0->GetEntriesFast());
549 h_mwpc1_track_nTracks->Fill(mwpcTracks1->GetEntriesFast());
550 // h_mwpc2_track_nTracks->Fill(mwpcTracks2->GetEntriesFast());
551
552 // MWPC matched tracks
553 for (Int_t trId = 0; trId < mwpcMatchedTracks->GetEntriesFast(); ++trId) {
554 CbmTrack* tr = (CbmTrack*)mwpcMatchedTracks->At(trId);
555 FairTrackParam* par = tr->GetParamFirst();
556 Float_t X = par->GetX();
557 Float_t Y = par->GetY();
558 Float_t Z = par->GetZ();
559 Float_t Tx = par->GetTx();
560 Float_t Ty = par->GetTy();
561 Float_t Az = par->GetQp() / Sqrt(Tx * Tx + Ty * Ty + 1.0);
562 Float_t Ax = Az * Tx;
563 Float_t Ay = Az * Ty;
564 // for (Int_t i = 0; i < tr->GetNofHits(); ++i) {
565 // BmnMwpcHit* mwpcHit = (BmnMwpcHit*) mwpcHits->At(tr->GetHitIndex(i));
566 // Float_t Hx = mwpcHit->GetX();
567 // Float_t Hy = mwpcHit->GetY();
568 // Float_t Hz = mwpcHit->GetZ();
569 //
570 // Float_t dist = DistFromPointToLine3D(TVector3(Ax, Ay, Az), TVector3(X, Y, Z), TVector3(Hx,
571 // Hy, Hz)); h_mwpc_matched_track_dist_3d->Fill(dist);
572 // }
573
574 h_mwpc_matched_track_Tx->Fill(Tx);
575 h_mwpc_matched_track_Ty->Fill(Ty);
576 h_mwpc_matched_track_nHits->Fill(tr->GetNDF());
577 h_mwpc_matched_track_chi2->Fill(tr->GetChiSq());
581 }
582
583 h_mwpc_matched_track_nTracks->Fill(mwpcMatchedTracks->GetEntriesFast());
584
585 } // event loop
586}
587
589{
590 // Distance from point (Mx, My) to line Ax + By + C = 0 is equal:
591 // d = |A * Mx + B * My + C| / Sqrt(A^2 + B^2)
592 return Abs(A * Mx + B * My + C) / Sqrt(A * A + B * B);
593}
594
596{
597 TVector3 VertHit = vertex - hit;
598 TVector3 VectProd = VertHit.Cross(direction);
599 Float_t d = VectProd.Mag() / direction.Mag();
600 return d;
601}
int Int_t
unsigned int UInt_t
float Float_t
short Short_t
#define gROOT
Short_t GetPlane() const
UInt_t GetTime() const
Short_t GetMwpcId() const
Definition BmnMwpcHit.h:32
Int_t SetBranchAddress(const char *bname, T **add, TBranch **ptr=nullptr)
virtual Int_t Add(const char *name, Long64_t nentries=TTree::kMaxEntries)
Long64_t GetEntries() const override
Int_t GetEntry(Long64_t entry=0, Int_t getall=0) override
void Clear(Option_t *option="") override
void Close(Option_t *option="") override
static TGeoManager * Import(const char *filename, const char *name="", Option_t *option="")
virtual Int_t Fill(const char *name, Double_t w)
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
static TString Format(const char *fmt,...)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Int_t Fill()
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) const override
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
Double_t Mag() const
TVector3 Cross(const TVector3 &) const
TH1F * h_mwpc1_hit_Y
Definition recoRun1.C:92
TH1I * h_mwpc0_hit_nHits
Definition recoRun1.C:99
TH1I * h_mwpc2_track_nTracks
Definition recoRun1.C:165
TH1I * h_mwpc1_digit_time
Definition recoRun1.C:42
TH1F * h_mwpc2_track_chi2
Definition recoRun1.C:122
TH2F * h_dch1_dist_z
Definition recoRun1.C:31
TH1I * h_mwpc1_hit_nHits
Definition recoRun1.C:100
TH1F * h_mwpc1_hit_X
Definition recoRun1.C:88
TH1I * h_mwpc2_digit_time
Definition recoRun1.C:43
TH1F * h_mwpc1_track_Xstart
Definition recoRun1.C:151
TH1I * h_nHits
Definition recoRun1.C:22
Float_t zMax
Definition recoRun1.C:14
TH1I * h_mwpc0_digit_nDigits
Definition recoRun1.C:47
TH1I * h_mwpc2_track_nHits
Definition recoRun1.C:118
TH2F * h_dch2_dist_z
Definition recoRun1.C:37
UInt_t nBins1
Definition recoRun1.C:10
TH1F * h_mwpc0_track_Ty
Definition recoRun1.C:112
TH2F * h_dch1_dist_y
Definition recoRun1.C:29
UInt_t mwpcN
Definition recoRun1.C:79
TH1I * h_mwpc0_digit_time
Definition recoRun1.C:41
Float_t boundX
Definition recoRun1.C:11
TH2F * h_mwpc1_track_XYstart
Definition recoRun1.C:132
TH1I * h_mwpc1_digit_nDigits
Definition recoRun1.C:48
TH1F * h_mwpc_matched_track_chi2
Definition recoRun1.C:174
TH2F * h_mwpc1_hit_XY
Definition recoRun1.C:82
Float_t mwpcX
Definition recoRun1.C:77
TH2F * h_mwpc_matched_track_XYstart
Definition recoRun1.C:176
TH1F * h_mwpc0_track_Tx
Definition recoRun1.C:108
TH2F * h_dch1_dist_x
Definition recoRun1.C:27
TH1F * h_dch1_dist_3d
Definition recoRun1.C:24
TH1F * h_mwpc2_track_Xstart
Definition recoRun1.C:153
UInt_t nBins2
Definition recoRun1.C:19
Float_t res_bound
Definition recoRun1.C:20
TH2F * h_mwpc0_track_XYstart
Definition recoRun1.C:124
TH1F * h_mwpc_matched_track_dist_3d
Definition recoRun1.C:191
TH2F * h_dch2_dist_y
Definition recoRun1.C:35
TH1F * h_mwpc1_track_Ty
Definition recoRun1.C:113
TFile * fOut
Definition recoRun1.C:8
TH1I * h_mwpc2_digit_nDigits
Definition recoRun1.C:49
TH1I * h_mwpc2_hit_nHits
Definition recoRun1.C:101
TH1I * h_mwpc1_track_nHits
Definition recoRun1.C:117
TH1F * h_mwpc2_track_Ystart
Definition recoRun1.C:160
TH1F * h_mwpc1_track_Ystart
Definition recoRun1.C:158
TH2F * h_mwpc2_hit_XY
Definition recoRun1.C:84
TH1I * h_mwpc0_track_nTracks
Definition recoRun1.C:163
TH1F * h_mwpc1_hit_Z
Definition recoRun1.C:96
TH1I * h_mwpc0_track_nHits
Definition recoRun1.C:116
Float_t mwpcY
Definition recoRun1.C:78
TH2F * h_dch2_dist_x
Definition recoRun1.C:33
TH1F * h_mwpc0_track_chi2
Definition recoRun1.C:120
TH1F * h_mwpc0_track_Xstart
Definition recoRun1.C:149
Float_t boundY
Definition recoRun1.C:12
TH2F * h_mwpc2_track_XYstart
Definition recoRun1.C:140
TH1F * h_mwpc2_hit_X
Definition recoRun1.C:89
TH1F * h_mwpc1_track_Tx
Definition recoRun1.C:109
TH1F * h_mwpc_matched_track_Ty
Definition recoRun1.C:170
TH1F * h_mwpc0_hit_X
Definition recoRun1.C:87
TH1F * h_mwpc2_track_Tx
Definition recoRun1.C:110
TH1F * h_mwpc2_hit_Y
Definition recoRun1.C:93
TH1F * h_mwpc0_hit_Y
Definition recoRun1.C:91
TH1F * h_dch2_dist_3d
Definition recoRun1.C:25
TH1F * h_mwpc1_track_chi2
Definition recoRun1.C:121
Float_t zMin
Definition recoRun1.C:13
TH2F * h_xy2
Definition recoRun1.C:17
TH1F * h_mwpc2_track_Ty
Definition recoRun1.C:114
TH1F * h_mwpc_matched_track_Tx
Definition recoRun1.C:168
TH2F * h_mwpc0_hit_XY
Definition recoRun1.C:80
TH1F * h_mwpc0_track_Ystart
Definition recoRun1.C:156
const Float_t TyBound
Definition recoRun1.C:106
TH1F * h_mwpc_matched_track_Xstart
Definition recoRun1.C:184
TH1F * h_mwpc2_hit_Z
Definition recoRun1.C:97
TH1I * h_mwpc_digit_planes
Definition recoRun1.C:45
TH1I * h_mwpc_matched_track_nTracks
Definition recoRun1.C:188
TH1I * h_mwpc1_track_nTracks
Definition recoRun1.C:164
TH2F * h_xy1
Definition recoRun1.C:16
const Float_t TxBound
Definition recoRun1.C:105
TH1F * h_mwpc_matched_track_Ystart
Definition recoRun1.C:186
TH1I * h_mwpc_matched_track_nHits
Definition recoRun1.C:172
TH1F * h_mwpc0_hit_Z
Definition recoRun1.C:95
void qa(Int_t runId=650, Int_t nEvents=0)
Definition recoRun1.C:364
Float_t DistFromPointToLine3D(TVector3 direction, TVector3 vertex, TVector3 hit)
Definition recoRun1.C:595
void recoRun1()
Definition recoRun1.C:194
void reco(Int_t runId=648, Int_t nEvents=10000)
Definition recoRun1.C:207
Float_t DistFromPointToLine2D(Float_t A, Float_t B, Float_t C, Float_t Mx, Float_t My)
Definition recoRun1.C:588