CbmRoot
Loading...
Searching...
No Matches
CbmStsCoincHodo.cxx
Go to the documentation of this file.
1/* Copyright (C) 2021 GSI/IKF-UFra, Darmstadt/Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Alberica Toia [committer] */
4
5#include "CbmStsCoincHodo.h"
6
7#include "CbmStsCluster.h"
8#include "CbmStsDigi.h"
9#include "CbmStsHit.h"
10#include "FairRootManager.h"
11#include "FairRunOnline.h"
12#include "Logger.h"
13#include "TClonesArray.h"
14#include "TFile.h"
15#include "TH1.h"
16#include "TH2.h"
17#include "TH3.h"
18#include "THttpServer.h"
19
20#include <iomanip>
21#include <iostream>
22using std::fixed;
23using std::setprecision;
24
25// ---- Default constructor -------------------------------------------
26CbmStsCoincHodo::CbmStsCoincHodo() : FairTask("CbmStsCoincHodo"), arrayClusters {nullptr}, arrayHits {nullptr} {}
27
28// ---- Destructor ----------------------------------------------------
30
31
32// ---- Init ----------------------------------------------------------
34{
35
36 // Get a handle from the IO manager
37 FairRootManager* ioman = FairRootManager::Instance();
38
39 // Get a pointer to the previous already existing data level
40 arrayClusters = static_cast<TClonesArray*>(ioman->GetObject("StsCluster"));
41 arrayHits = static_cast<TClonesArray*>(ioman->GetObject("StsHit"));
42
43 if (!arrayClusters) { LOG(info) << "No TClonesArray with STS clusters found."; }
44 if (!arrayHits) { LOG(info) << "No TClonesArray with STS hits found."; }
45
47
48 return kSUCCESS;
49}
50
52{
53 phHitsStsTime = new TH1F("phHitsStsTime", "phHitsStsTime", 1000, 0, 1000);
54 phHitsHodoATime = new TH1F("phHitsHodoATime", "phHitsHodoATime", 1000, 0, 1000);
55 phHitsHodoBTime = new TH1F("phHitsHodoBTime", "phHitsHodoBTime", 1000, 0, 1000);
56
58
59 phHitsPositionHodoA = new TH2F("phHitsPositionHodoA", "Position of the hits in hodoscope A; X [cm]; Y [cm]", 80, -4.0,
60 4.0, 80, -4.0, 4.0);
62 new TH2F("phHitsPositionSts", "Position of the hits in hodoscope B; X [cm]; Y [cm]", 80, -4.0, 4.0, 80, -4.0, 4.0);
63 phHitsPositionHodoB = new TH2F("phHitsPositionHodoB", "Position of the hits in hodoscope B; X [cm]; Y [cm]", 80, -4.0,
64 4.0, 80, -4.0, 4.0);
66
68 new TH2F("phNbHitsCompHodo", "Number of hits per TS in Hodo A vs Hodo B; Nb Hits A[]; Nb Hits B []", 100, 0.0,
69 20000.0, 100, 0.0, 20000.0);
71 new TH2F("phNbHitsCompStsHodoA", "Number of hits per TS in STS vs Hodo A; Nb Hits STS[]; Nb Hits A []", 100, 0.0,
72 20000.0, 100, 0.0, 20000.0);
74 new TH2F("phNbHitsCompStsHodoB", "Number of hits per TS in STS vs Hodo B; Nb Hits STS[]; Nb Hits B []", 100, 0.0,
75 20000.0, 100, 0.0, 20000.0);
77
78 phHitsCoincCorrXX = new TH2F("phHitsCoincCorrXX", "XX correlation of the coincident hits; X_A [cm]; X_B [cm]", 160,
79 -8.0, 8.0, 160, -8.0, 8.0);
80 phHitsCoincCorrYY = new TH2F("phHitsCoincCorrYY", "YY correlation of the coincident hits; Y_A [cm]; Y_B [cm]", 160,
81 -8.0, 8.0, 160, -8.0, 8.0);
82 phHitsCoincCorrXY = new TH2F("phHitsCoincCorrXY", "XY correlation of the coincident hits; X_A [cm]; Y_B [cm]", 160,
83 -8.0, 8.0, 160, -8.0, 8.0);
84 phHitsCoincCorrYX = new TH2F("phHitsCoincCorrYX", "YX correlation of the coincident hits; Y_A [cm]; X_B [cm]", 160,
85 -8.0, 8.0, 160, -8.0, 8.0);
86
88 new TH2F("phHitsPositionCoincA", "Position of the coincident hits in hodoscope A; X [cm]; Y [cm]", 80, -4.0, 4.0,
89 80, -4.0, 4.0);
91 new TH2F("phHitsPositionCoincB", "Position of the coincident hits in hodoscope B; X [cm]; Y [cm]", 80, -4.0, 4.0,
92 80, -4.0, 4.0);
94 new TH2F("phHitsPositionDiff", "Position difference of the coincident hits; X_B - X_A [cm]; Y_B- Y_A [cm]", 160,
95 -8.0, 8.0, 160, -8.0, 8.0);
96 phHitsTimeDiff = new TH1F("phHitsTimeDiff", "Time difference of the coincident hits; t_B - t_A [ns]",
98
99 phHitsCoincDist = new TH1F("phHitsCoincDist", "XY distance of the coincident hits; Dist. [cm]", 100, 0.0, 10.0);
101 new TH1F("phHitsCoincAngle", "Vertical angle of the coincident hits; Angle [deg.]", 180, -90.0, 90.0);
103
105 new TH2F("phHitsSingleCoincCorrXX", "XX correlation of the coincident hits; X_A [cm]; X_B [cm]", 160, -8.0, 8.0,
106 160, -8.0, 8.0);
108 new TH2F("phHitsSingleCoincCorrYY", "YY correlation of the coincident hits; Y_A [cm]; Y_B [cm]", 160, -8.0, 8.0,
109 160, -8.0, 8.0);
111 new TH2F("phHitsSingleCoincCorrXY", "XY correlation of the coincident hits; X_A [cm]; Y_B [cm]", 160, -8.0, 8.0,
112 160, -8.0, 8.0);
114 new TH2F("phHitsSingleCoincCorrYX", "YX correlation of the coincident hits; Y_A [cm]; X_B [cm]", 160, -8.0, 8.0,
115 160, -8.0, 8.0);
116
118 new TH2F("phHitsSinglePositionCoincA", "Position of the coincident hits in hodoscope A; X [cm]; Y [cm]", 80, -4.0,
119 4.0, 80, -4.0, 4.0);
121 new TH2F("phHitsSinglePositionCoincB", "Position of the coincident hits in hodoscope B; X [cm]; Y [cm]", 80, -4.0,
122 4.0, 80, -4.0, 4.0);
124 new TH2F("phHitsSinglePositionDiff", "Position difference of the coincident hits; X_B - X_A [cm]; Y_B- Y_A [cm]",
125 160, -8.0, 8.0, 160, -8.0, 8.0);
126 phHitsSingleTimeDiff = new TH1F("phHitsSingleTimeDiff", "Time difference of the coincident hits; t_B - t_A [ns]",
128
130 new TH1F("phHitsSingleCoincDist", "XY distance of the coincident hits; Dist. [cm]", 100, 0.0, 10.0);
132 new TH1F("phHitsSingleCoincAngle", "Vertical angle of the coincident hits; Angle [deg.]", 180, -90.0, 90.0);
134
135 phHitsBestCoincCorrXX = new TH2F("phHitsBestCoincCorrXX", "XX correlation of the coincident hits; X_A [cm]; X_B [cm]",
136 160, -8.0, 8.0, 160, -8.0, 8.0);
137 phHitsBestCoincCorrYY = new TH2F("phHitsBestCoincCorrYY", "YY correlation of the coincident hits; Y_A [cm]; Y_B [cm]",
138 160, -8.0, 8.0, 160, -8.0, 8.0);
139 phHitsBestCoincCorrXY = new TH2F("phHitsBestCoincCorrXY", "XY correlation of the coincident hits; X_A [cm]; Y_B [cm]",
140 160, -8.0, 8.0, 160, -8.0, 8.0);
141 phHitsBestCoincCorrYX = new TH2F("phHitsBestCoincCorrYX", "YX correlation of the coincident hits; Y_A [cm]; X_B [cm]",
142 160, -8.0, 8.0, 160, -8.0, 8.0);
143
145 new TH2F("phHitsBestPositionCoincA", "Position of the coincident hits in hodoscope A; X [cm]; Y [cm]", 80, -4.0,
146 4.0, 80, -4.0, 4.0);
148 new TH2F("phHitsBestPositionCoincB", "Position of the coincident hits in hodoscope B; X [cm]; Y [cm]", 80, -4.0,
149 4.0, 80, -4.0, 4.0);
151 new TH2F("phHitsBestPositionDiff", "Position difference of the coincident hits; X_B - X_A [cm]; Y_B- Y_A [cm]", 160,
152 -8.0, 8.0, 160, -8.0, 8.0);
153 phHitsBestTimeDiff = new TH1F("phHitsBestTimeDiff", "Time difference of the coincident hits; t_B - t_A [ns]",
155
157 new TH1F("phHitsBestCoincDist", "XY distance of the coincident hits; Dist. [cm]", 100, 0.0, 10.0);
159 new TH1F("phHitsBestCoincAngle", "Vertical angle of the coincident hits; Angle [deg.]", 180, -90.0, 90.0);
160
162 phHitsPositionCoincExtr = new TH2F("phHitsPositionCoincExtr", "Position of the extrapolated hits ; X [cm]; Y [cm]",
163 80, -4.0, 4.0, 80, -4.0, 4.0);
165
167 new TH2F("phHitsStsCoincCorrXX", "XX correlation of the coincident hits; X_extr [cm]; X_STS [cm]", 160, -8.0, 8.0,
168 160, -8.0, 8.0);
170 new TH2F("phHitsStsCoincCorrYY", "YY correlation of the coincident hits; Y_extr [cm]; Y_STS [cm]", 160, -8.0, 8.0,
171 160, -8.0, 8.0);
173 new TH2F("phHitsStsCoincCorrXY", "XY correlation of the coincident hits; X_extr [cm]; Y_STS [cm]", 160, -8.0, 8.0,
174 160, -8.0, 8.0);
176 new TH2F("phHitsStsCoincCorrYX", "YX correlation of the coincident hits; Y_extr [cm]; X_STS [cm]", 160, -8.0, 8.0,
177 160, -8.0, 8.0);
178
180 "phHitsStsPositionCoincExtr", "Position of the extrapolated hits ; X [cm]; Y [cm]", 80, -4.0, 4.0, 80, -4.0, 4.0);
181 phHitsStsPositionCoinc = new TH2F("phHitsStsPositionCoinc", "Position of the coincident hits in Sts; X [cm]; Y [cm]",
182 80, -4.0, 4.0, 80, -4.0, 4.0);
184 new TH1F("phHitsStsTimeDiff", "Position difference of STS hit with the best coincident hits; t_Sts - t_(AB) [ns]",
186 phHitsStsPositionDiff = new TH2F(
187 "phHitsStsPositionDiff", "Position difference of the coincident hits; X_STS - X_extr [cm]; Y_STS- Y_extr [cm]", 160,
188 -8.0, 8.0, 160, -8.0, 8.0);
189 phHitsStsPositionDiffInv = new TH2F(
190 "phHitsStsPositionDiffInv", "Position difference of the coincident hits; X_STS - Y_extr [cm]; Y_STS- Y_extr [cm]",
191 160, -8.0, 8.0, 160, -8.0, 8.0);
192
194
195
197 new TH2F("phHitsStsBestCoincCorrXX", "XX correlation of the coincident hits; X_extr [cm]; X_STS [cm]", 160, -8.0,
198 8.0, 160, -8.0, 8.0);
200 new TH2F("phHitsStsBestCoincCorrYY", "YY correlation of the coincident hits; Y_extr [cm]; Y_STS [cm]", 160, -8.0,
201 8.0, 160, -8.0, 8.0);
203 new TH2F("phHitsStsBestCoincCorrXY", "XY correlation of the coincident hits; X_extr [cm]; Y_STS [cm]", 160, -8.0,
204 8.0, 160, -8.0, 8.0);
206 new TH2F("phHitsStsBestCoincCorrYX", "YX correlation of the coincident hits; Y_extr [cm]; X_STS [cm]", 160, -8.0,
207 8.0, 160, -8.0, 8.0);
208
210 new TH2F("phHitsStsBestPositionCoincExtr", "Position of the extrapolated hits ; X [cm]; Y [cm]", 80, -4.0, 4.0, 80,
211 -4.0, 4.0);
213 new TH2F("phHitsStsBestPositionCoinc", "Position of the coincident hits in Sts; X [cm]; Y [cm]", 80, -4.0, 4.0, 80,
214 -4.0, 4.0);
216 new TH2F("phHitsStsBestPositionShiftCoinc", "Position of the coincident hits in Sts; X [cm]; Y [cm]", 80, -4.0, 4.0,
217 80, -4.0, 4.0);
218
219 phHitsStsBestTimeDiff = new TH1F("phHitsStsBestTimeDiff",
220 "Position difference of STS hit with the best coincident hits; t_Sts - t_(AB) [ns]",
222 phHitsStsBestPositionDiff = new TH2F(
223 "phHitsStsBestPositionDiff",
224 "Position difference of STS hit with the best coincident hits; X_Sts - X_extr(AB) [cm]; Y_Sts- Y_extr(AB) [cm]",
225 400, -8.0, 8.0, 400, -8.0, 8.0);
226 phHitsStsBestPositionDiffInv = new TH2F("phHitsStsBestPositionDiffInv",
227 "Position difference of STS hit (inverted) with the best coincident hits; "
228 "X_Sts - Y_extr(AB) [cm]; Y_Sts- X_extr(AB) [cm]",
229 400, -8.0, 8.0, 400, -8.0, 8.0);
230 phHitsStsBestDiff = new TH3F("phHitsStsBestDiff",
231 "Difference of STS hit with the best coincident hits; X_Sts - X_extr(AB) [cm]; Y_Sts- "
232 "Y_extr(AB) [cm]; t_Sts - t_mean(AB) [ns]",
233 160, -8.0, 8.0, 160, -8.0, 8.0, 2 * iCoincLimitClk, -dCoincLimit, dCoincLimit);
234
237 new TH2F("phHitsStsEff", "Position of the coincident hits in Sts; X [cm]; Y [cm]", 80, -4.0, 4.0, 80, -4.0, 4.0);
238
239
241 FairRunOnline* run = FairRunOnline::Instance();
242 if (run) {
243 THttpServer* server = run->GetHttpServer();
244 if (nullptr != server) {
245
246 server->Register("CheckCoinc", phHitsStsTime);
247 server->Register("CheckCoinc", phHitsHodoATime);
248 server->Register("CheckCoinc", phHitsHodoBTime);
249
250 server->Register("CheckCoinc", phHitsPositionHodoA);
251 server->Register("CheckCoinc", phHitsPositionSts);
252 server->Register("CheckCoinc", phHitsPositionHodoB);
253
254 server->Register("CheckCoinc", phNbHitsCompHodo);
255 server->Register("CheckCoinc", phNbHitsCompStsHodoA);
256 server->Register("CheckCoinc", phNbHitsCompStsHodoB);
257
258 server->Register("CheckCoinc", phHitsCoincCorrXX);
259 server->Register("CheckCoinc", phHitsCoincCorrYY);
260 server->Register("CheckCoinc", phHitsCoincCorrXY);
261 server->Register("CheckCoinc", phHitsCoincCorrYX);
262 server->Register("CheckCoinc", phHitsPositionCoincA);
263 server->Register("CheckCoinc", phHitsPositionCoincB);
264 server->Register("CheckCoinc", phHitsPositionDiff);
265 server->Register("CheckCoinc", phHitsTimeDiff);
266 server->Register("CheckCoinc", phHitsCoincDist);
267 server->Register("CheckCoinc", phHitsCoincAngle);
268
269 server->Register("CheckCoinc", phHitsSingleCoincCorrXX);
270 server->Register("CheckCoinc", phHitsSingleCoincCorrYY);
271 server->Register("CheckCoinc", phHitsSingleCoincCorrXY);
272 server->Register("CheckCoinc", phHitsSingleCoincCorrYX);
273 server->Register("CheckCoinc", phHitsSinglePositionCoincA);
274 server->Register("CheckCoinc", phHitsSinglePositionCoincB);
275 server->Register("CheckCoinc", phHitsSinglePositionDiff);
276 server->Register("CheckCoinc", phHitsSingleTimeDiff);
277 server->Register("CheckCoinc", phHitsSingleCoincDist);
278 server->Register("CheckCoinc", phHitsSingleCoincAngle);
279
280 server->Register("CheckCoinc", phHitsBestCoincCorrXX);
281 server->Register("CheckCoinc", phHitsBestCoincCorrYY);
282 server->Register("CheckCoinc", phHitsBestCoincCorrXY);
283 server->Register("CheckCoinc", phHitsBestCoincCorrYX);
284 server->Register("CheckCoinc", phHitsBestPositionCoincA);
285 server->Register("CheckCoinc", phHitsBestPositionCoincB);
286 server->Register("CheckCoinc", phHitsBestPositionDiff);
287 server->Register("CheckCoinc", phHitsBestTimeDiff);
288 server->Register("CheckCoinc", phHitsBestCoincDist);
289 server->Register("CheckCoinc", phHitsBestCoincAngle);
290
291 server->Register("CheckCoinc", phHitsPositionCoincExtr);
292
293 server->Register("CheckCoinc", phHitsStsCoincCorrXX);
294 server->Register("CheckCoinc", phHitsStsCoincCorrYY);
295 server->Register("CheckCoinc", phHitsStsCoincCorrXY);
296 server->Register("CheckCoinc", phHitsStsCoincCorrYX);
297 server->Register("CheckCoinc", phHitsStsPositionCoincExtr);
298 server->Register("CheckCoinc", phHitsStsPositionCoinc);
299 server->Register("CheckCoinc", phHitsStsTimeDiff);
300 server->Register("CheckCoinc", phHitsStsPositionDiff);
301 server->Register("CheckCoinc", phHitsStsPositionDiffInv);
302
303 server->Register("CheckCoinc", phHitsStsBestCoincCorrXX);
304 server->Register("CheckCoinc", phHitsStsBestCoincCorrYY);
305 server->Register("CheckCoinc", phHitsStsBestCoincCorrXY);
306 server->Register("CheckCoinc", phHitsStsBestCoincCorrYX);
307 server->Register("CheckCoinc", phHitsStsBestPositionCoincExtr);
308 server->Register("CheckCoinc", phHitsStsBestPositionCoinc);
309 server->Register("CheckCoinc", phHitsStsBestPositionShiftCoinc);
310 server->Register("CheckCoinc", phHitsStsBestTimeDiff);
311 server->Register("CheckCoinc", phHitsStsBestPositionDiff);
312 server->Register("CheckCoinc", phHitsStsBestPositionDiffInv);
313 server->Register("CheckCoinc", phHitsStsBestDiff);
314
315 server->Register("CheckCoinc", phHitsStsEff);
316 }
317 }
318}
319// ---- ReInit -------------------------------------------------------
320InitStatus CbmStsCoincHodo::ReInit() { return kSUCCESS; }
321
322// ---- Exec ----------------------------------------------------------
323void CbmStsCoincHodo::Exec(Option_t* /*option*/)
324{
325
326 fNbTs++;
327
328 Double_t dOffsetX = 0.0;
329 Double_t dOffsetY = 0.0;
330 Double_t dOffsetT = -6.38091e+00;
331 Double_t dOffsetXSts = -2.55;
332 Double_t dOffsetYSts = -1.46;
333 Double_t dOffsetTSts = -5.22608e+00;
334 Double_t dSigmaXSts = 6.79000e-02;
335 Double_t dSigmaYSts = 2.81408e-02;
336
337 Int_t iNbClusters = arrayClusters->GetEntriesFast();
338 Int_t iNbHits = arrayHits->GetEntriesFast();
339 std::cout << "executing TS " << fNbTs << " StsClusters: " << iNbClusters << " StsHits: " << iNbHits << std::endl;
340
341 // Fill vectors for Sts and HodoA,B
342 std::vector<CbmStsHit*> vHitsHodoA;
343 std::vector<CbmStsHit*> vHitsSts;
344 std::vector<CbmStsHit*> vHitsHodoB;
345
346 vHitsHodoA.clear();
347 vHitsSts.clear();
348 vHitsHodoB.clear();
349 for (Int_t iHit = 0; iHit < iNbHits; ++iHit) {
350 CbmStsHit* pHit = dynamic_cast<CbmStsHit*>(arrayHits->UncheckedAt(iHit));
351 Double_t dX = pHit->GetX();
352 Double_t dY = pHit->GetY();
353 // Double_t dZ = pHit->GetZ();
354 //std::cout << "TS: " << fNbTs << " " << pHit->GetAddress() << std::endl;
356 // if( dZ < dMidStsHodoA )
357 if (pHit->GetAddress() == 0x10008002) {
358 //std::cout << "TS: " << fNbTs << " HODOA" << std::endl;
359 vHitsHodoA.push_back(pHit);
360 phHitsPositionHodoA->Fill(dX, dY);
361 } // if( dZ < dMidStsHodoA ) => if Hodo A
362 // else if( dZ < dMidStsHodoB )
363 else if (pHit->GetAddress() == 0x10008012) {
364 //std::cout << "TS: " << fNbTs << " STS" << std::endl;
365 vHitsSts.push_back(pHit);
366 phHitsPositionSts->Fill(dX, dY);
367 } // else if( dZ < dMidStsHodoB ) of if( dZ < dMidStsHodoA ) => if STS
368 //else
369 else if (pHit->GetAddress() == 0x10008022) {
370 //std::cout << "TS: " << fNbTs << " HODOB" << std::endl;
371 vHitsHodoB.push_back(pHit);
372 phHitsPositionHodoB->Fill(dX, dY);
373 } // else of if( dZ < dMidStsHodoB ) => if Hodo B
374 } // for( Int_t iHit = 0; iHit < iNbHits; ++iHit)
375 std::cout << "TS: " << fNbTs << " " << vHitsHodoA.size() << " " << vHitsHodoB.size() << " " << vHitsSts.size()
376 << std::endl;
377
378 phNbHitsCompHodo->Fill(vHitsHodoA.size(), vHitsHodoB.size());
379 phNbHitsCompStsHodoA->Fill(vHitsSts.size(), vHitsHodoA.size());
380 phNbHitsCompStsHodoB->Fill(vHitsSts.size(), vHitsHodoB.size());
381
382 phHitsStsTime->Fill(fNbTs, vHitsSts.size());
383 phHitsHodoATime->Fill(fNbTs, vHitsHodoA.size());
384 phHitsHodoBTime->Fill(fNbTs, vHitsHodoB.size());
385
386 //-----------------------------------------------------------------------
387
388
389 // Look for coincidence HODOA - HODOB
390 for (UInt_t uHitA = 0; uHitA < vHitsHodoA.size(); ++uHitA) {
391 Double_t dBestTime = 1e9;
392 UInt_t uBestB = vHitsHodoB.size();
393
394 Double_t dTimeA = vHitsHodoA[uHitA]->GetTime();
395 for (UInt_t uHitB = 0; uHitB < vHitsHodoB.size(); ++uHitB) {
396 Double_t dTimeB = vHitsHodoB[uHitB]->GetTime();
397
398 // time difference of the hits in HODOB - HODOA
399 phHitsTimeDiff->Fill(dTimeB - dTimeA);
400
401 if (TMath::Abs(dTimeB - dTimeA) < dCoincLimit) {
402 // HODOA vs HODOB
403 phHitsCoincCorrXX->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uHitB]->GetX());
404 phHitsCoincCorrYY->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uHitB]->GetY());
405 phHitsCoincCorrXY->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uHitB]->GetY());
406 phHitsCoincCorrYX->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uHitB]->GetX());
407 // position X vs Y of the hits in coincidence HODOA and HODOB
408 phHitsPositionCoincA->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoA[uHitA]->GetY());
409 phHitsPositionCoincB->Fill(vHitsHodoB[uHitB]->GetX(), vHitsHodoB[uHitB]->GetY());
410 // position difference DeltaX vs DeltaY of the hits in coincidence HODOB - HODOA
411 phHitsPositionDiff->Fill(vHitsHodoB[uHitB]->GetX() - vHitsHodoA[uHitA]->GetX() - dOffsetX,
412 vHitsHodoB[uHitB]->GetY() - vHitsHodoA[uHitA]->GetY() - dOffsetY);
413
414 Double_t dHitsDistXY = TMath::Sqrt((vHitsHodoA[uHitA]->GetX() - vHitsHodoB[uHitB]->GetX() - dOffsetX)
415 * (vHitsHodoA[uHitA]->GetX() - vHitsHodoB[uHitB]->GetX() - dOffsetX)
416 + (vHitsHodoA[uHitA]->GetY() - vHitsHodoB[uHitB]->GetY() - dOffsetY)
417 * (vHitsHodoA[uHitA]->GetY() - vHitsHodoB[uHitB]->GetY() - dOffsetY));
418 Double_t dHitsDistZ = TMath::Abs(vHitsHodoA[uHitA]->GetZ() - vHitsHodoB[uHitB]->GetZ());
419 Double_t dAngle = TMath::RadToDeg() * TMath::ATan2(dHitsDistXY, dHitsDistZ);
420 phHitsCoincDist->Fill(dHitsDistXY);
421 phHitsCoincAngle->Fill(dAngle);
422
423 if (TMath::Abs(dTimeB - dTimeA - dOffsetT) < dBestTime) {
424 dBestTime = TMath::Abs(dTimeB - dTimeA);
425 uBestB = uHitB;
426 } // if( TMath::Abs( dTimeB - dTimeA ) < dBestTime )
427 } // if( TMath::Abs( dTimeB - dTimeA ) < dCoincLimit )
428 } // for( UInt_t uHitB = 0; uHitB < vHitsHodoB.size(); ++uHitB )
429 if (uBestB < vHitsHodoB.size()) {
430 Double_t dTimeB = vHitsHodoB[uBestB]->GetTime();
431
432 phHitsBestTimeDiff->Fill(dTimeB - dTimeA);
433
434 if (TMath::Abs(dTimeB - dTimeA) < dCoincLimit) {
435 phHitsBestCoincCorrXX->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uBestB]->GetX());
436 phHitsBestCoincCorrYY->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uBestB]->GetY());
437 phHitsBestCoincCorrXY->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uBestB]->GetY());
438 phHitsBestCoincCorrYX->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uBestB]->GetX());
439
440 phHitsBestPositionCoincA->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoA[uHitA]->GetY());
441 phHitsBestPositionCoincB->Fill(vHitsHodoB[uBestB]->GetX(), vHitsHodoB[uBestB]->GetY());
442 phHitsBestPositionDiff->Fill(vHitsHodoB[uBestB]->GetX() - vHitsHodoA[uHitA]->GetX() - dOffsetX,
443 vHitsHodoB[uBestB]->GetY() - vHitsHodoA[uHitA]->GetY() - dOffsetY);
444
445
446 Double_t dHitsDistXY = TMath::Sqrt((vHitsHodoA[uHitA]->GetX() - vHitsHodoB[uBestB]->GetX() - dOffsetX)
447 * (vHitsHodoA[uHitA]->GetX() - vHitsHodoB[uBestB]->GetX() - dOffsetX)
448 + (vHitsHodoA[uHitA]->GetY() - vHitsHodoB[uBestB]->GetY() - dOffsetY)
449 * (vHitsHodoA[uHitA]->GetY() - vHitsHodoB[uBestB]->GetY() - dOffsetY));
450 Double_t dHitsDistZ = TMath::Abs(vHitsHodoA[uHitA]->GetZ() - vHitsHodoB[uBestB]->GetZ());
451 Double_t dAngle = TMath::RadToDeg() * TMath::ATan2(dHitsDistXY, dHitsDistZ);
452 phHitsBestCoincDist->Fill(dHitsDistXY);
453 phHitsBestCoincAngle->Fill(dAngle);
454
455 // only one hit per TS (never happens in data!)
456 if (1 == vHitsHodoA.size() && 1 == vHitsHodoB.size()) {
457 phHitsSingleCoincCorrXX->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uBestB]->GetX());
458 phHitsSingleCoincCorrYY->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uBestB]->GetY());
459 phHitsSingleCoincCorrXY->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoB[uBestB]->GetY());
460 phHitsSingleCoincCorrYX->Fill(vHitsHodoA[uHitA]->GetY(), vHitsHodoB[uBestB]->GetX());
461
462 phHitsSinglePositionCoincA->Fill(vHitsHodoA[uHitA]->GetX(), vHitsHodoA[uHitA]->GetY());
463 phHitsSinglePositionCoincB->Fill(vHitsHodoB[uBestB]->GetX(), vHitsHodoB[uBestB]->GetY());
464 phHitsSinglePositionDiff->Fill(vHitsHodoB[uBestB]->GetX() - vHitsHodoA[uHitA]->GetX() - dOffsetX,
465 vHitsHodoB[uBestB]->GetY() - vHitsHodoA[uHitA]->GetY() - dOffsetY);
466 phHitsSingleTimeDiff->Fill(dTimeB - dTimeA);
467 phHitsSingleCoincDist->Fill(dHitsDistXY);
468 phHitsSingleCoincAngle->Fill(dAngle);
469 } // if( 1 == vHitsHodoA.size() && 1 == vHitsHodoB.size() )
470
471 } // if( TMath::Abs( dTimeB - dTimeA ) < dCoincLimit )
472
473
475 Double_t dBestTimeSts = 1e9;
476 UInt_t uBestSts = vHitsSts.size();
477
478 Double_t dHodoMeanTime = (dTimeA + dTimeB) / 2.0;
479 Double_t dHodoExtrX =
480 vHitsHodoA[uHitA]->GetX() + (vHitsHodoB[uBestB]->GetX() - vHitsHodoA[uHitA]->GetX()) * dStsDistZ / dHodoDistZ;
481 Double_t dHodoExtrY =
482 vHitsHodoA[uHitA]->GetY() + (vHitsHodoB[uBestB]->GetY() - vHitsHodoA[uHitA]->GetY()) * dStsDistZ / dHodoDistZ;
483
484 phHitsPositionCoincExtr->Fill(dHodoExtrX, dHodoExtrY);
485
486 for (UInt_t uHitSts = 0; uHitSts < vHitsSts.size(); ++uHitSts) {
487 Double_t dTimeSts = vHitsSts[uHitSts]->GetTime();
488 Double_t dTimeDiffSts = dTimeSts - dHodoMeanTime;
489
490 phHitsStsTimeDiff->Fill(dTimeDiffSts);
491
492 if (TMath::Abs(dTimeDiffSts) < dCoincLimit) {
493
494 phHitsStsCoincCorrXX->Fill(dHodoExtrX, vHitsSts[uHitSts]->GetX());
495 phHitsStsCoincCorrYY->Fill(dHodoExtrY, vHitsSts[uHitSts]->GetY());
496 phHitsStsCoincCorrXY->Fill(dHodoExtrX, vHitsSts[uHitSts]->GetY());
497 phHitsStsCoincCorrYX->Fill(dHodoExtrY, vHitsSts[uHitSts]->GetX());
498
499 phHitsStsPositionCoincExtr->Fill(dHodoExtrX, dHodoExtrY);
500 phHitsStsPositionCoinc->Fill(vHitsSts[uHitSts]->GetX(), vHitsSts[uHitSts]->GetY());
501
502 phHitsStsPositionDiff->Fill(vHitsSts[uHitSts]->GetX() - dHodoExtrX - dOffsetX,
503 vHitsSts[uHitSts]->GetY() - dHodoExtrY - dOffsetY);
504 phHitsStsPositionDiffInv->Fill(vHitsSts[uHitSts]->GetX() - dHodoExtrY - dOffsetX,
505 vHitsSts[uHitSts]->GetY() - dHodoExtrX - dOffsetY);
506
507
508 if (TMath::Abs(dTimeDiffSts - dOffsetTSts) < dBestTimeSts) {
509 dBestTimeSts = TMath::Abs(dTimeDiffSts);
510 uBestSts = uHitSts;
511 } // if( TMath::Abs( dTimeB - dTimeA ) < dBestTimeSts )
512 // else std::cout << fNbTs << " " << vHitsHodoA.size() << " " << vHitsSts.size() << " " << vHitsHodoB.size()
513 // << " " << TMath::Abs( dTimeDiffSts ) << " " << dBestTimeSts
514 // << std::endl;
515 } // if( TMath::Abs( dTimeSts - dHodoMeanTime ) < dCoincLimit )
516 } // for( UInt_t uHitSts = 0; uHitSts < vHitsSts.size(); ++uHitSts )
517
518 if (uBestSts < vHitsSts.size()) {
519 phHitsStsBestCoincCorrXX->Fill(dHodoExtrX, vHitsSts[uBestSts]->GetX());
520 phHitsStsBestCoincCorrYY->Fill(dHodoExtrY, vHitsSts[uBestSts]->GetY());
521 phHitsStsBestCoincCorrXY->Fill(dHodoExtrX, vHitsSts[uBestSts]->GetY());
522 phHitsStsBestCoincCorrYX->Fill(dHodoExtrY, vHitsSts[uBestSts]->GetX());
523
524 phHitsStsBestPositionCoincExtr->Fill(dHodoExtrX, dHodoExtrY);
525 phHitsStsBestPositionCoinc->Fill(vHitsSts[uBestSts]->GetX(), vHitsSts[uBestSts]->GetY());
526 phHitsStsBestPositionShiftCoinc->Fill(vHitsSts[uBestSts]->GetX() - dOffsetXSts,
527 vHitsSts[uBestSts]->GetY() - dOffsetYSts);
528
529 phHitsStsBestTimeDiff->Fill(vHitsSts[uBestSts]->GetTime() - dHodoMeanTime);
530 phHitsStsBestPositionDiff->Fill(vHitsSts[uBestSts]->GetX() - dHodoExtrX,
531 vHitsSts[uBestSts]->GetY() - dHodoExtrY);
532 phHitsStsBestPositionDiffInv->Fill(vHitsSts[uBestSts]->GetX() - dHodoExtrY,
533 vHitsSts[uBestSts]->GetY() - dHodoExtrX);
534 phHitsStsBestDiff->Fill(vHitsSts[uBestSts]->GetX() - dHodoExtrX, vHitsSts[uBestSts]->GetY() - dHodoExtrY,
535 vHitsSts[uBestSts]->GetTime() - dHodoMeanTime);
536
537 if ((TMath::Abs(vHitsSts[uBestSts]->GetX() - dHodoExtrX - dOffsetXSts) < 3 * dSigmaXSts)
538 && (TMath::Abs(-vHitsSts[uBestSts]->GetY() - dHodoExtrY - dOffsetYSts) < 3 * dSigmaYSts)) {
539 phHitsStsEff->Fill(dHodoExtrX, dHodoExtrY);
540 }
541 }
542 } // if( uBestB < vHitsHodoB.size() )
543 } // for( UInt_t uHitA = 0; uHitA < vHitsHodoA.size(); ++uHitA )
544}
545
546
547// ---- Finish --------------------------------------------------------
549
551{
552 TFile* old = gFile;
553 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
554
555 phHitsStsTime->Write();
556 phHitsHodoATime->Write();
557 phHitsHodoBTime->Write();
558
559 phHitsPositionHodoA->Write();
560 phHitsPositionSts->Write();
561 phHitsPositionHodoB->Write();
562
563 phNbHitsCompHodo->Write();
564 phNbHitsCompStsHodoA->Write();
565 phNbHitsCompStsHodoB->Write();
566
567 phHitsCoincCorrXX->Write();
568 phHitsCoincCorrYY->Write();
569 phHitsCoincCorrXY->Write();
570 phHitsCoincCorrYX->Write();
571 phHitsPositionCoincA->Write();
572 phHitsPositionCoincB->Write();
573 phHitsPositionDiff->Write();
574 phHitsTimeDiff->Write();
575 phHitsCoincDist->Write();
576 phHitsCoincAngle->Write();
577
578 // phHitsSingleCoincCorrXX->Write();
579 // phHitsSingleCoincCorrYY->Write();
580 // phHitsSingleCoincCorrXY->Write();
581 // phHitsSingleCoincCorrYX->Write();
582 // phHitsSinglePositionCoincA->Write();
583 // phHitsSinglePositionCoincB->Write();
584 // phHitsSinglePositionDiff->Write();
585 // phHitsSingleTimeDiff->Write();
586 // phHitsSingleCoincDist->Write();
587 // phHitsSingleCoincAngle->Write();
588
589 phHitsBestCoincCorrXX->Write();
590 phHitsBestCoincCorrYY->Write();
591 phHitsBestCoincCorrXY->Write();
592 phHitsBestCoincCorrYX->Write();
595 phHitsBestPositionDiff->Write();
596 phHitsBestTimeDiff->Write();
597 phHitsBestCoincDist->Write();
598 phHitsBestCoincAngle->Write();
599
601
602 phHitsStsCoincCorrXX->Write();
603 phHitsStsCoincCorrYY->Write();
604 phHitsStsCoincCorrXY->Write();
605 phHitsStsCoincCorrYX->Write();
607 phHitsStsPositionCoinc->Write();
608 phHitsStsTimeDiff->Write();
609 phHitsStsPositionDiff->Write();
611
619 phHitsStsBestTimeDiff->Write();
622 phHitsStsBestDiff->Write();
623
624 phHitsStsEff->Write();
625
626 outfile->Close();
627 delete outfile;
628
629 gFile = old;
630}
631
ClassImp(CbmConverterManager)
Data class for STS clusters.
Data class for a reconstructed hit in the STS.
int32_t GetAddress() const
Definition CbmHit.h:74
double GetY() const
Definition CbmPixelHit.h:74
double GetX() const
Definition CbmPixelHit.h:73
TH2 * phHitsStsBestPositionDiffInv
TH2 * phHitsStsBestPositionDiff
TH2 * phHitsStsBestPositionShiftCoinc
TH2 * phHitsSinglePositionCoincA
virtual void Finish()
TH2 * phHitsStsBestPositionCoincExtr
TH2 * phHitsSinglePositionCoincB
TH2 * phHitsStsBestPositionCoinc
TH2 * phHitsStsPositionCoincExtr
virtual void Exec(Option_t *)
virtual InitStatus Init()
TClonesArray * arrayClusters
TClonesArray * arrayHits
virtual InitStatus ReInit()
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35