Project
Loading...
Searching...
No Matches
TOFEventTimeChecker.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13
14#include <vector>
15#include <string>
16#include "TStopwatch.h"
22#include "Framework/Task.h"
24
25// from Tracks
32
33// from TOF
34#include "TOFBase/Geo.h"
35#include "TOFBase/Utils.h"
38//#include "GlobalTracking/MatchTOF.h"
41
42#include "TSystem.h"
43#include "TFile.h"
44#include "TCanvas.h"
45#include "TH1.h"
46#include "TH2.h"
47#include "TTree.h"
48#include "TString.h"
49#include "TProfile.h"
51
52#define TDEBUG
53
54using namespace o2::framework;
55// using MCLabelsTr = gsl::span<const o2::MCCompLabel>;
56// using GID = o2::dataformats::GlobalTrackID;
58
60using MatchOutputType = std::vector<o2::dataformats::MatchInfoTOF>;
62
64 double tofSignalDouble() const { return mSignalDouble; }
65 float tofExpSignalDe() const { return mExpDe; }
66 double mSignalDouble = 0.0;
67 float mEta = 0.0;
68 float mPTPC = 0.0;
69 float mPhi = 0.0;
70 float mExpDe = 0;
71 int mIsProb = 0;
72 int mCh = -1;
73 float mChi2 = 0;
74 bool mHasTOF = false;
75 int mSource = -1;
76 double mTrktime = 0;
77 double mTrktimeRes = 0;
78 float mDx = 0;
79 float mDz = 0;
80};
81
83
84bool MyFilter(const MyTrack& tr)
85{
86 return (tr.mP < 2.0 && tr.mEta > o2::tof::Utils::mEtaMin && tr.mEta < o2::tof::Utils::mEtaMax && tr.mHasTOF && tr.mSource >= 0);
87} // accept all
88
89namespace o2
90{
91namespace globaltracking
92{
93
95{
96 public:
97 TOFEventTimeChecker(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, bool useMC) : mDataRequest(dr), mGGCCDBRequest(gr), mUseMC(useMC) {}
98 ~TOFEventTimeChecker() override = default;
99 void init(InitContext& ic) final;
100 void run(ProcessingContext& pc) final;
102 void fillMatching(GID gid, float time0, float time0res);
103 void processEvent(std::vector<MyTrack>& tracks);
104 void finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) final
105 {
107 return;
108 }
109 }
110
111 private:
112 void updateTimeDependentParams(ProcessingContext& pc)
113 {
115 static bool initOnceDone = false;
116 if (!initOnceDone) { // this params need to be queried only once
117 initOnceDone = true;
118 const auto bcs = o2::base::GRPGeomHelper::instance().getGRPLHCIF()->getBunchFilling().getFilledBCs();
119 for (auto bc : bcs) {
121 }
122 }
123 }
124
125 bool mIsTPC;
126 bool mIsTPCTRD;
127 bool mIsITSTPCTRD;
128 bool mIsITSTPC;
129 gsl::span<const o2::tof::Cluster> mTOFClustersArrayInp;
130 std::vector<MyTrack> mMyTracks;
131 TimeSlewing* mSlewing = nullptr;
132 TH1F* mHTimePi;
133 TH1F* mHTimeKa;
134 TH1F* mHTimePr;
135 TH1F* mHMass;
136 TH1F* mHMassExpPi;
137 TH1F* mHMassExpKa;
138 TH1F* mHMassExpPr;
139 TH2F* mHBetavsP;
140 TH2F* mHTimePivsP;
141 TH2F* mHTimeKvsP;
142 TH2F* mHTimePrvsP;
143 TProfile* mPBetavsPExpPi;
144 TProfile* mPBetavsPExpKa;
145 TProfile* mPBetavsPExpPr;
146 TH2F* mHMassvsP;
147 TProfile* mPMassvsPExpPi;
148 TProfile* mPMassvsPExpKa;
149 TProfile* mPMassvsPExpPr;
150 TH2F* mHTimevsResEvtimePi;
151 TH2F* mHEventTimevsResEvtime;
152 TFile* mFout;
153#ifdef TDEBUG
154 TTree* mTree;
155#endif
156 int mOrbit = 0;
157 int mCh;
158 float mP = 0;
159 float mPt = 0;
160 float mPTPC = 0;
161 float mEta = 0;
162 float mPhi = 0;
163 float mChi2 = 0;
164 float mL = 0;
165 float mTof = 0;
166 float mT0 = 0;
167 float mT0Res = 0;
168 float mExpDe = 0;
169 float mExpPi = 0;
170 float mExpKa = 0;
171 float mExpPr = 0;
172 float mDx = 0;
173 float mDz = 0;
174 int mIsProb = 0;
175 int mSource = -1;
176 float mTrktime = 0;
177 float mTrktimeRes = 0;
178 RecoContainer mRecoData;
179 std::shared_ptr<DataRequest> mDataRequest;
180 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
181 bool mUseMC = true;
182 TStopwatch mTimer;
183};
184
185void TOFEventTimeChecker::processEvent(std::vector<MyTrack>& tracks)
186{
187 int nBC = int(tracks[0].tofSignalDouble() * o2::tof::Geo::BC_TIME_INPS_INV);
188 for (auto& track : tracks) {
190 track.mSignal = float(track.mSignalDouble - double(o2::tof::Geo::BC_TIME_INPS) * nBC);
191 track.mTrktime = (track.mTrktime - double(o2::tof::Geo::BC_TIME_INPS) * nBC);
192 } else {
193 double localTime = track.mSignalDouble;
194
195 // get into orbit
196 int bcStarOrbit = int(localTime * o2::tof::Geo::BC_TIME_INPS_INV);
197 bcStarOrbit = (bcStarOrbit / o2::constants::lhc::LHCMaxBunches) * o2::constants::lhc::LHCMaxBunches; // truncation
198 localTime -= bcStarOrbit * o2::tof::Geo::BC_TIME_INPS;
199 int mask = 0;
200 track.mSignal = o2::tof::Utils::subtractInteractionBC(localTime, mask);
201 localTime = track.mTrktime;
202 bcStarOrbit = int(localTime * o2::tof::Geo::BC_TIME_INPS_INV);
203 bcStarOrbit = (bcStarOrbit / o2::constants::lhc::LHCMaxBunches) * o2::constants::lhc::LHCMaxBunches; // truncation
204 localTime -= bcStarOrbit * o2::tof::Geo::BC_TIME_INPS;
205 mask = 0;
206 track.mTrktime = o2::tof::Utils::subtractInteractionBC(localTime, mask);
207 }
208 }
209
210 auto evtime = o2::tof::evTimeMaker<std::vector<MyTrack>, MyTrack, MyFilter>(tracks);
211
212 if (evtime.mEventTime - o2::tof::Utils::mLHCPhase < -2000 || evtime.mEventTime - o2::tof::Utils::mLHCPhase > 2000) {
213 return;
214 }
215 //
216 const float cinv = 33.35641;
217
218 int nt = 0;
219 for (auto& track : tracks) {
220 mT0 = evtime.mEventTime;
221 mT0Res = evtime.mEventTimeError;
222
223 float sumw = 1. / (mT0Res * mT0Res);
224 mT0 *= sumw;
225 mT0 -= evtime.mWeights[nt] * evtime.mTrackTimes[nt];
226 sumw -= evtime.mWeights[nt];
227 mT0 /= sumw;
228 mT0Res = sqrt(1. / sumw);
229
230 nt++;
231
232 mCh = track.mCh;
233 mP = track.mP;
234 mPt = track.mPt;
235 mPTPC = track.mPTPC;
236 mEta = track.mEta;
237 mSource = track.mSource;
238 mPhi = track.mPhi;
239 mChi2 = track.mChi2;
240 mL = track.mLength;
241 mTof = track.tofSignal();
242 mExpDe = track.tofExpSignalDe();
243 mExpPi = track.tofExpSignalPi();
244 mExpKa = track.tofExpSignalKa();
245 mExpPr = track.tofExpSignalPr();
246 mIsProb = track.mIsProb;
247 mTrktime = track.mTrktime;
248 mTrktimeRes = track.mTrktimeRes;
249 mDx = track.mDx;
250 mDz = track.mDz;
251
252#ifdef TDEBUG
253 mTree->Fill();
254#endif
255
256 // remove unphysical tracks
257 if (mTof - mT0 - mExpPi < -5000) {
258 continue;
259 }
260
261 //Beta
262 float beta = mL / (mTof - mT0) * cinv;
263
264 float betaexpPi = mL / mExpPi * cinv;
265 float betaexpKa = mL / mExpKa * cinv;
266 float betaexpPr = mL / mExpPr * cinv;
267
268 //Mass
269 float mass = mP / beta * TMath::Sqrt(std::abs(1 - beta * beta));
270 float massexpPi = mP / betaexpPi * TMath::Sqrt(std::abs(1 - betaexpPi * betaexpPi));
271 float massexpKa = mP / betaexpKa * TMath::Sqrt(std::abs(1 - betaexpKa * betaexpKa));
272 float massexpPr = mP / betaexpPr * TMath::Sqrt(std::abs(1 - betaexpPr * betaexpPr));
273
274 if (massexpPi < 0.13) { // remove wrong track lengths
275 continue;
276 }
277
278 //Fill histos
279 mHTimePi->Fill(mTof - mT0 - mExpPi);
280 mHTimeKa->Fill(mTof - mT0 - mExpKa);
281 mHTimePr->Fill(mTof - mT0 - mExpPr);
282 mHMass->Fill(mass);
283 mHMassExpPi->Fill(massexpPi);
284 mHMassExpKa->Fill(massexpKa);
285 mHMassExpPr->Fill(massexpPr);
286 mHBetavsP->Fill(mP, beta);
287 mPBetavsPExpPi->Fill(mP, betaexpPi);
288 mPBetavsPExpKa->Fill(mP, betaexpKa);
289 mPBetavsPExpPr->Fill(mP, betaexpPr);
290 mHTimePivsP->Fill(mP, mTof - mT0 - mExpPi);
291 mHTimeKvsP->Fill(mP, mTof - mT0 - mExpKa);
292 mHTimePrvsP->Fill(mP, mTof - mT0 - mExpPr);
293 mHMassvsP->Fill(mP, mass);
294 mPMassvsPExpPi->Fill(mP, massexpPi);
295 mPMassvsPExpKa->Fill(mP, massexpKa);
296 mPMassvsPExpPr->Fill(mP, massexpPr);
297 if (mP > 0.7 && mP < 1.1) {
298 mHTimevsResEvtimePi->Fill(mT0Res, mTof - mT0 - mExpPi);
299 }
300 mHEventTimevsResEvtime->Fill(mT0Res, mT0);
301 }
302}
303
304void TOFEventTimeChecker::fillMatching(GID gid, float time0, float time0res)
305{
306 MyTrack trk;
307 trk.mHasTOF = true;
308
309 if (!gid.includesDet(DetID::TOF)) {
310 trk.mHasTOF = false;
311 }
312
313 trk.mTrktime = time0 * 1E6;
314 trk.mTrktimeRes = time0res * 1E6;
315
316 trk.mDx = 0;
317 trk.mDz = 0;
318
319 int trksource = 5;
320 if (gid.getSource() == GID::TPCTOF) {
321 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
322 const auto& array = mRecoData.getTPCTracks();
323 GID gTrackId = match.getTrackRef();
324 const auto& srctrk = array[gTrackId.getIndex()];
325 trk.mPt = srctrk.getPt() * srctrk.getCharge();
326 trk.mPTPC = srctrk.getP();
327 trk.mP = srctrk.getP();
328 trk.mEta = srctrk.getEta();
329 trk.mPhi = srctrk.getPhi();
330 trk.mDx = match.getDXatTOF();
331 trk.mDz = match.getDZatTOF();
332 trksource = 0;
333 } else if (gid.getSource() == GID::TPC) {
334 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
335 const auto& array = mRecoData.getTPCTracks();
336 GID gTrackId = gid;
337 const auto& srctrk = array[gTrackId.getIndex()];
338 trk.mPt = srctrk.getPt() * srctrk.getCharge();
339 trk.mPTPC = srctrk.getP();
340 trk.mP = srctrk.getP();
341 trk.mEta = srctrk.getEta();
342 trk.mPhi = srctrk.getPhi();
343 trksource = 0;
344 } else if (gid.getSource() == GID::ITSTPCTOF) {
345 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
346 const auto& array = mRecoData.getTPCITSTracks();
347 GID gTrackId = match.getTrackRef();
348 const auto& srctrk = array[gTrackId.getIndex()];
349 trk.mPt = srctrk.getPt() * srctrk.getCharge();
350 trk.mPTPC = srctrk.getP();
351 trk.mP = srctrk.getP();
352 trk.mEta = srctrk.getEta();
353 trk.mPhi = srctrk.getPhi();
354 trksource = 1;
355 trk.mTrktime = srctrk.getTimeMUS().getTimeStamp() * 1E6;
356 trk.mTrktimeRes = srctrk.getTimeMUS().getTimeStampError() * 1E6;
357 trk.mDx = match.getDXatTOF();
358 trk.mDz = match.getDZatTOF();
359 } else if (gid.getSource() == GID::ITSTPC) {
360 const auto& array = mRecoData.getTPCITSTracks();
361 GID gTrackId = gid; //match.getTrackRef();
362 const auto& srctrk = array[gTrackId.getIndex()];
363 trk.mPt = srctrk.getPt() * srctrk.getCharge();
364 trk.mPTPC = srctrk.getP();
365 trk.mP = srctrk.getP();
366 trk.mEta = srctrk.getEta();
367 trk.mPhi = srctrk.getPhi();
368 trksource = 1;
369 trk.mTrktime = srctrk.getTimeMUS().getTimeStamp() * 1E6;
370 trk.mTrktimeRes = srctrk.getTimeMUS().getTimeStampError() * 1E6;
371 } else if (gid.getSource() == GID::TPCTRDTOF) {
372 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
373 const auto& array = mRecoData.getTPCTRDTracks<o2::trd::TrackTRD>();
374 GID gTrackId = match.getTrackRef();
375 const auto& srctrk = array[gTrackId.getIndex()];
376 trk.mPt = srctrk.getPt() * srctrk.getCharge();
377 trk.mPTPC = srctrk.getP();
378 trk.mP = srctrk.getP();
379 trk.mEta = srctrk.getEta();
380 trk.mPhi = srctrk.getPhi();
381 trksource = 2;
382 trk.mDx = match.getDXatTOF();
383 trk.mDz = match.getDZatTOF();
384 } else if (gid.getSource() == GID::TPCTRD) {
385 const auto& array = mRecoData.getTPCTRDTracks<o2::trd::TrackTRD>();
386 GID gTrackId = gid; // match.getTrackRef();
387 const auto& srctrk = array[gTrackId.getIndex()];
388 trk.mPt = srctrk.getPt() * srctrk.getCharge();
389 trk.mPTPC = srctrk.getP();
390 trk.mP = srctrk.getP();
391 trk.mEta = srctrk.getEta();
392 trk.mPhi = srctrk.getPhi();
393 trksource = 2;
394 } else if (gid.getSource() == GID::ITSTPCTRDTOF) {
395 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
396 const auto& array = mRecoData.getITSTPCTRDTracks<o2::trd::TrackTRD>();
397 GID gTrackId = match.getTrackRef();
398 const auto& srctrk = array[gTrackId.getIndex()];
399 trk.mPt = srctrk.getPt() * srctrk.getCharge();
400 trk.mPTPC = srctrk.getP();
401 trk.mP = srctrk.getP();
402 trk.mEta = srctrk.getEta();
403 trk.mPhi = srctrk.getPhi();
404 trksource = 3;
405 trk.mDx = match.getDXatTOF();
406 trk.mDz = match.getDZatTOF();
407 } else if (gid.getSource() == GID::ITSTPCTRD) {
408 const auto& array = mRecoData.getITSTPCTRDTracks<o2::trd::TrackTRD>();
409 GID gTrackId = gid; // match.getTrackRef();
410 const auto& srctrk = array[gTrackId.getIndex()];
411 trk.mPt = srctrk.getPt() * srctrk.getCharge();
412 trk.mPTPC = srctrk.getP();
413 trk.mP = srctrk.getP();
414 trk.mEta = srctrk.getEta();
415 trk.mPhi = srctrk.getPhi();
416 trksource = 3;
417 }
418
419 trk.mSource = trksource;
420
421 const char* sources[5] = {"TPC", "ITS-TPC", "TPC-TRD", "ITS-TPC-TRD", "NONE"};
422
423 if (trk.mHasTOF) {
424 const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
425 const o2::track::TrackLTIntegral& info = match.getLTIntegralOut();
426
427 if (info.getL() < 370) {
428 trk.mHasTOF = false;
429 }
430
431 trk.mExpDe = info.getTOF(5); // el
432 trk.expTimes[0] = info.getTOF(2); // pi
433 trk.expTimes[1] = info.getTOF(3); // ka
434 trk.expTimes[2] = info.getTOF(4); // pr
435 trk.expSigma[0] = 120; // dummy resolution (to be updated)
436 trk.expSigma[1] = 120; // dummy resolution (to be updated)
437 trk.expSigma[2] = 120; // dummy resolution (to be updated)
438
439 trk.mChi2 = match.getChi2();
440
441 int tofcl = match.getIdxTOFCl();
442 // trk.mSignal = mTOFClustersArrayInp[tofcl].getTime();
443 double tofsignal = match.getSignal();
444
445 trk.mSignalDouble = tofsignal;
446
447 //trk.mSignal = match.getSignal();
448 trk.mTOFChi2 = match.getChi2();
449 trk.mLength = info.getL();
450 // trk.mHypo = 0;
451 trk.mCh = mTOFClustersArrayInp[tofcl].getMainContributingChannel();
452
453 if (mSlewing) { // let's calibrate
454 trk.mIsProb = mSlewing->isProblematic(trk.mCh);
455 if (mSlewing->isProblematic(trk.mCh)) {
456 // LOG(debug) << "skip channel " << trk.mCh << " since problematic";
457 // return;
458 }
459 float tot = mTOFClustersArrayInp[tofcl].getTot();
460 trk.mSignalDouble -= mSlewing->evalTimeSlewing(trk.mCh, tot);
461 LOG(debug) << "calibration -> " << mSlewing->evalTimeSlewing(trk.mCh, tot);
462 }
463 }
464 if (!trk.mHasTOF) {
465 trk.mExpDe = 0;
466 trk.expTimes[0] = 0;
467 trk.expTimes[1] = 0;
468 trk.expTimes[2] = 0;
469 trk.expSigma[0] = 0; // dummy resolution (to be updated)
470 trk.expSigma[1] = 0; // dummy resolution (to be updated)
471 trk.expSigma[2] = 0; // dummy resolution (to be updated)
472 trk.mSignalDouble = time0 * 1E6;
473 trk.mTOFChi2 = 9999;
474 trk.mLength = 0;
475 trk.mCh = -1;
476 trk.mChi2 = 0;
477 trk.mIsProb = 0;
478 }
479
480 mMyTracks.push_back(trk);
481}
482
484{
485 mTimer.Stop();
486 mTimer.Reset();
488 // extrct orbit from dir
489 std::string dir = gSystem->GetWorkingDirectory();
490 if (dir.find("orbit") < dir.size()) {
491 dir.erase(0, dir.find("orbit") + 5);
492 dir.erase(dir.find("_"), dir.size());
493 while (dir.size() && dir[0] == '0') {
494 dir.erase(0, 1);
495 }
496 sscanf(dir.c_str(), "%d", &mOrbit);
497 }
498
499 TFile* fsleewing = TFile::Open("localTimeSlewing.root");
500 if (fsleewing) {
501 mSlewing = (TimeSlewing*)fsleewing->Get("ccdb_object");
502 }
503
504 mFout = new TFile("TOFperformance.root", "recreate");
505
506 mHTimePi = new TH1F("HTimePi", ";t_{TOF} - t_{exp}^{#pi} (ps)", 500, -5000, 5000);
507 mHTimeKa = new TH1F("HTimeKa", ";t_{TOF} - t_{exp}^{K} (ps)", 500, -5000, 5000);
508 mHTimePr = new TH1F("HTimePr", ";t_{TOF} - t_{exp}^{p} (ps)", 500, -5000, 5000);
509 mHMass = new TH1F("HMass", ";M (GeV/#it{c}^{2})", 1000, 0, 2.);
510 mHMassExpPi = new TH1F("HMassExpPi", ";M(#beta_{exp}^{#pi}) (GeV/#it{c}^{2})", 1000, 0, 2.);
511 mHMassExpKa = new TH1F("HMassExpKa", ";M(#beta_{exp}^{K}) (GeV/#it{c}^{2})", 1000, 0, 2.);
512 mHMassExpPr = new TH1F("HMassExpPr", ";M(#beta_{exp}^{p}) (GeV/#it{c}^{2})", 1000, 0, 2.);
513 mHBetavsP = new TH2F("HBetavsP", ";#it{p} (GeV/#it{c});TOF #beta", 1000, 0., 5, 1000, 0., 1.5);
514 mPBetavsPExpPi = new TProfile("PBetavsPExpPi", ";#it{p} (GeV/#it{c}); #beta_{exp}^{#pi}", 1000, 0., 5, 0., 1.5);
515 mPBetavsPExpKa = new TProfile("PBetavsPExpKa", ";#it{p} (GeV/#it{c}); #beta_{exp}^{K}", 1000, 0., 5, 0., 1.5);
516 mPBetavsPExpPr = new TProfile("PBetavsPExpPr", ";#it{p} (GeV/#it{c}); #beta_{exp}^{p}", 1000, 0., 5, 0., 1.5);
517 mHTimePivsP = new TH2F("HTimePivsP", ";#it{p} (GeV/#it{c});t_{TOF} - t_{exp}^{#pi} (ps)", 500, 0., 5, 500, -5000, 5000);
518 mHTimeKvsP = new TH2F("HTimeKavsP", ";#it{p} (GeV/#it{c});t_{TOF} - t_{exp}^{K} (ps)", 500, 0., 5, 500, -5000, 5000);
519 mHTimePrvsP = new TH2F("HTimePrvsP", ";#it{p} (GeV/#it{c});t_{TOF} - t_{exp}^{p} (ps)", 500, 0., 5, 500, -5000, 5000);
520 mHMassvsP = new TH2F("HMassvsP", ";#it{p} (GeV/#it{c}); M (GeV/#it{c}^{2})", 1000, 0., 5, 1000, 0., 2.);
521 mPMassvsPExpPi = new TProfile("PMassvsPExpPi", ";#it{p} (GeV/#it{c}); M(#beta_{exp}^{#pi}) [GeV/#it{c}^{2}]", 1000, 0., 5, 0., 2.);
522 mPMassvsPExpKa = new TProfile("PMassvsPExpKa", ";#it{p} (GeV/#it{c}); M(#beta_{exp}^{K}) [GeV/#it{c}^{2}]", 1000, 0., 5, 0., 2.);
523 mPMassvsPExpPr = new TProfile("PMassvsPExpPr", ";#it{p} (GeV/#it{c}); M(#beta_{exp}^{p}) [GeV/#it{c}^{2}]", 1000, 0., 5, 0., 2.);
524 mHTimevsResEvtimePi = new TH2F("HTimevsResEvtimePi", "0.7 < p < 1.1 GeV/#it{c};TOF event time resolution (ps);t_{TOF} - t_{exp}^{#pi} (ps)", 200, 0., 200, 500, -5000, 5000);
525 mHEventTimevsResEvtime = new TH2F("HEventTimevsResEvtime", ";TOF event time resolution (ps); TOF event time (ps)", 100, 0, 200, 5000, -20000, 20000);
526
527#ifdef TDEBUG
528 mTree = new TTree("tree", "tree");
529 mTree->Branch("orbit", &mOrbit, "orbit/I");
530 mTree->Branch("ch", &mCh, "ch/I");
531 mTree->Branch("isProb", &mIsProb, "isProb/I");
532 mTree->Branch("p", &mP, "p/F");
533 mTree->Branch("pt", &mPt, "pt/F");
534 mTree->Branch("pTPC", &mPTPC, "pTPC/F");
535 mTree->Branch("source", &mSource, "source/I");
536 mTree->Branch("eta", &mEta, "eta/F");
537 mTree->Branch("phi", &mPhi, "phi/F");
538 mTree->Branch("chi2", &mChi2, "chi2/F");
539 mTree->Branch("l", &mL, "l/F");
540 mTree->Branch("tof", &mTof, "tof/F");
541 mTree->Branch("t0", &mT0, "t0/F");
542 mTree->Branch("t0res", &mT0Res, "t0res/F");
543 mTree->Branch("trkTime", &mTrktime, "trkTime/F");
544 mTree->Branch("trkTimeRes", &mTrktimeRes, "trkTimeRes/F");
545 mTree->Branch("dx", &mDx, "dx/F");
546 mTree->Branch("dz", &mDz, "dz/F");
547 mTree->Branch("expDe", &mExpDe, "expDe/F");
548 mTree->Branch("expPi", &mExpPi, "expPi/F");
549 mTree->Branch("expKa", &mExpKa, "expKa/F");
550 mTree->Branch("expPr", &mExpPr, "expPr/F");
551#endif
552}
553
555{
556 mTimer.Start(false);
557
558 mMyTracks.clear();
559 mRecoData.collectData(pc, *mDataRequest.get());
560
565
566 mTOFClustersArrayInp = mRecoData.getTOFClusters();
567
568 LOG(debug) << "isTrackSourceLoaded: TPC -> " << mIsTPC << " (t=" << mRecoData.isTrackSourceLoaded(o2::dataformats::GlobalTrackID::Source::TPCTOF) << ",m=" << mRecoData.isMatchSourceLoaded(o2::dataformats::GlobalTrackID::Source::TPCTOF) << ")";
569 LOG(debug) << "isTrackSourceLoaded: ITSTPC -> " << mIsITSTPC << " (t=" << mRecoData.isTrackSourceLoaded(o2::dataformats::GlobalTrackID::Source::ITSTPCTOF) << ",m=" << mRecoData.isMatchSourceLoaded(o2::dataformats::GlobalTrackID::Source::ITSTPCTOF) << ")";
570 LOG(debug) << "isTrackSourceLoaded: TPCTRD -> " << mIsTPCTRD << " (t=" << mRecoData.isTrackSourceLoaded(o2::dataformats::GlobalTrackID::Source::TPCTRDTOF) << ",m=" << mRecoData.isMatchSourceLoaded(o2::dataformats::GlobalTrackID::Source::TPCTRDTOF) << ")";
571 LOG(debug) << "isTrackSourceLoaded: ITSTPCTRD -> " << mIsITSTPCTRD << " (t=" << mRecoData.isTrackSourceLoaded(o2::dataformats::GlobalTrackID::Source::ITSTPCTRDTOF) << ",m=" << mRecoData.isMatchSourceLoaded(o2::dataformats::GlobalTrackID::Source::ITSTPCTRDTOF) << ")";
572 LOG(debug) << "TOF cluster size = " << mTOFClustersArrayInp.size();
573
574 if (!mTOFClustersArrayInp.size()) {
575 return;
576 }
577 updateTimeDependentParams(pc);
578
579 auto creator = [this](auto& trk, GID gid, float time0, float terr) {
580 this->fillMatching(gid, time0, terr);
581 return true;
582 };
583 mRecoData.createTracksVariadic(creator);
584
585 // sorting matching in time
586 std::sort(mMyTracks.begin(), mMyTracks.end(),
587 [](MyTrack a, MyTrack b) { return a.tofSignalDouble() < b.tofSignalDouble(); });
588
589 for (auto& element : mMyTracks) { // loop print
590 LOG(debug) << "Time cluster = " << element.tofSignal() << " ps - pt = " << element.pt();
591 }
592
593 std::vector<MyTrack> tracks;
594 for (int i = 0; i < mMyTracks.size(); i++) { // loop looking for interaction candidates
595 tracks.clear();
596 int ntrk = 1;
597 double time = mMyTracks[i].tofSignalDouble();
598 tracks.emplace_back(mMyTracks[i]);
599 for (; i < mMyTracks.size(); i++) {
600 double timeCurrent = mMyTracks[i].tofSignalDouble();
601 if (timeCurrent - time > 100E3) {
602 i--;
603 break;
604 }
605 tracks.emplace_back(mMyTracks[i]);
606 ntrk++;
607 }
608 if (ntrk > 0) { // good candidate with time
609 processEvent(tracks);
610 }
611 }
612
613 mTimer.Stop();
614}
615
617{
618 LOGF(debug, "TOF matching total timing: Cpu: %.3e Real: %.3e s in %d slots",
619 mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
620
621 mFout->cd();
622#ifdef TDEBUG
623 mTree->Write();
624#endif
625 mHTimePi->Write();
626 mHTimeKa->Write();
627 mHTimePr->Write();
628 mHMass->Write();
629 mHMassExpPi->Write();
630 mHMassExpKa->Write();
631 mHMassExpPr->Write();
632 mHBetavsP->Write();
633 mPBetavsPExpPi->Write();
634 mPBetavsPExpKa->Write();
635 mPBetavsPExpPr->Write();
636 mHTimePivsP->Write();
637 mHTimeKvsP->Write();
638 mHTimePrvsP->Write();
639 mHMassvsP->Write();
640 mPMassvsPExpPi->Write();
641 mPMassvsPExpKa->Write();
642 mPMassvsPExpPr->Write();
643 mHTimevsResEvtimePi->Write();
644 mHEventTimevsResEvtime->Write();
645 mFout->Close();
646}
647
649{
650 auto dataRequest = std::make_shared<DataRequest>();
651
652 // request TOF clusters
653 dataRequest->requestTracks(src, useMC);
654 dataRequest->requestClusters(GID::getSourceMask(GID::TOF), useMC);
655 dataRequest->requestTOFMatches(src, useMC);
656 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(false, // orbitResetTime
657 false, // GRPECS=true
658 true, // GRPLHCIF
659 false, // GRPMagField
660 false, // askMatLUT
662 dataRequest->inputs,
663 true);
664 return DataProcessorSpec{
665 "tof-eventime",
666 dataRequest->inputs,
667 {},
668 AlgorithmSpec{adaptFromTask<TOFEventTimeChecker>(dataRequest, ggRequest, useMC)},
669 Options{}};
670}
671
672} // namespace globaltracking
673} // namespace o2
Class to store the output of the matching to TOF for calibration.
Wrapper container for different reconstructed object types.
Definition of the TOF cluster.
Definition of the TOF event time maker.
uint64_t bc
Definition RawEventData.h:5
int16_t time
Definition RawEventData.h:4
int32_t i
Helper for geometry and GRP related CCDB requests.
Accessor for TrackParCov derived objects from multiple containers.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
std::vector< o2::dataformats::MatchInfoHMP > MatchOutputType
Class to perform TPC ITS matching.
Definition of the Names Generator class.
Wrapper container for different reconstructed object types.
bool MyFilter(const MyTrack &tr)
std::ostringstream debug
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
float evalTimeSlewing(int channel, float tot) const
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr ID TOF
Definition DetID.h:66
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
void endOfStream(framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void fillMatching(GID gid, float time0, float time0res)
void run(ProcessingContext &pc) final
TOFEventTimeChecker(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, bool useMC)
void processEvent(std::vector< MyTrack > &tracks)
static constexpr Double_t BC_TIME_INPS
Definition Geo.h:103
static constexpr Double_t BC_TIME_INPS_INV
Definition Geo.h:104
static double subtractInteractionBC(double time, int &mask, bool subLatency=false)
Definition Utils.cxx:122
static float mEtaMin
Definition Utils.h:60
static void addInteractionBC(int bc, bool fromCollisonCotext=false)
Definition Utils.cxx:52
static float mEtaMax
Definition Utils.h:61
static bool hasFillScheme()
Definition Utils.cxx:261
bool match(const std::vector< std::string > &queries, const char *pattern)
Definition dcs-ccdb.cxx:229
GLenum src
Definition glcorearb.h:1767
GLenum array
Definition glcorearb.h:4274
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLint GLuint mask
Definition glcorearb.h:291
GLsizei GLenum * sources
Definition glcorearb.h:2516
constexpr int LHCMaxBunches
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > Options
framework::DataProcessorSpec getTOFEventTimeCheckerSpec(o2::dataformats::GlobalTrackID::mask_t src, bool useMC)
create a processor spec
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
float tofExpSignalDe() const
double tofSignalDouble() const
bool isMatchSourceLoaded(int src) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
const o2::dataformats::MatchInfoTOF & getTOFMatch(GTrackID id) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"