Skip to content

Commit e8b92d6

Browse files
committed
add residuals to check matching
1 parent ea6be64 commit e8b92d6

File tree

4 files changed

+154
-44
lines changed

4 files changed

+154
-44
lines changed

DataFormats/Reconstruction/include/ReconstructionDataFormats/MatchInfoTOF.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MatchInfoTOF
2828
using GTrackID = o2::dataformats::GlobalTrackID;
2929

3030
public:
31-
MatchInfoTOF(int idLocal, int idxTOFCl, double time, float chi2, o2::track::TrackLTIntegral trkIntLT, GTrackID idxTrack, float dt = 0, float z = 0) : mIdLocal(idLocal), mIdxTOFCl(idxTOFCl), mSignal(time), mChi2(chi2), mIntLT(trkIntLT), mIdxTrack(idxTrack), mDeltaT(dt), mZatTOF(z){};
31+
MatchInfoTOF(int idLocal, int idxTOFCl, double time, float chi2, o2::track::TrackLTIntegral trkIntLT, GTrackID idxTrack, float dt = 0, float z = 0, float dx = 0, float dz = 0) : mIdLocal(idLocal), mIdxTOFCl(idxTOFCl), mSignal(time), mChi2(chi2), mIntLT(trkIntLT), mIdxTrack(idxTrack), mDeltaT(dt), mZatTOF(z), mDXatTOF(dx), mDZatTOF(dz){};
3232
MatchInfoTOF() = default;
3333
void setIdxTOFCl(int index) { mIdxTOFCl = index; }
3434
void setIdxTrack(GTrackID index) { mIdxTrack = index; }
@@ -49,6 +49,10 @@ class MatchInfoTOF
4949
float getDeltaT() const { return mDeltaT; }
5050
void setZatTOF(float val) { mZatTOF = val; }
5151
float getZatTOF() const { return mZatTOF; }
52+
void setDZatTOF(float val) { mDZatTOF = val; }
53+
float getDZatTOF() const { return mDZatTOF; }
54+
void setDXatTOF(float val) { mDXatTOF = val; }
55+
float getDXatTOF() const { return mDXatTOF; }
5256
void setSignal(double time) { mSignal = time; }
5357
double getSignal() const { return mSignal; }
5458

@@ -61,10 +65,12 @@ class MatchInfoTOF
6165
int mIdxTOFCl; ///< Idx for TOF cluster
6266
GTrackID mIdxTrack; ///< Idx for track
6367
float mZatTOF = 0.0; ///< Z position at TOF
68+
float mDXatTOF = 0.0; ///< DX position at TOF
69+
float mDZatTOF = 0.0; ///< DZ position at TOF
6470
float mDeltaT = 0.0; ///< tTOF - TPC (microsec)
6571
double mSignal = 0.0; ///< TOF time in ps
6672

67-
ClassDefNV(MatchInfoTOF, 4);
73+
ClassDefNV(MatchInfoTOF, 5);
6874
};
6975
} // namespace dataformats
7076
} // namespace o2

DataFormats/Reconstruction/include/ReconstructionDataFormats/MatchInfoTOFReco.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class MatchInfoTOFReco : public MatchInfoTOF
3535
ITSTPCTRD,
3636
SIZEALL };
3737

38-
MatchInfoTOFReco(int idLocal, int idxTOFCl, double time, float chi2, o2::track::TrackLTIntegral trkIntLT, GTrackID idxTrack, TrackType trkType, float dt = 0, float z = 0) : MatchInfoTOF(idLocal, idxTOFCl, time, chi2, trkIntLT, idxTrack, dt, z), mTrackType(trkType){};
38+
MatchInfoTOFReco(int idLocal, int idxTOFCl, double time, float chi2, o2::track::TrackLTIntegral trkIntLT, GTrackID idxTrack, TrackType trkType, float dt = 0, float z = 0, float dx = 0, float dz = 0) : MatchInfoTOF(idLocal, idxTOFCl, time, chi2, trkIntLT, idxTrack, dt, z, dx, dz), mTrackType(trkType){};
3939

4040
MatchInfoTOFReco() = default;
4141

Detectors/GlobalTracking/src/MatchTOF.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ void MatchTOF::doMatching(int sec)
674674
foundCluster = true;
675675
// set event indexes (to be checked)
676676
int eventIndexTOFCluster = mTOFClusSectIndexCache[indices[0]][itof];
677-
mMatchedTracksPairs.emplace_back(cacheTrk[itrk], eventIndexTOFCluster, mTOFClusWork[cacheTOF[itof]].getTime(), chi2, trkLTInt[iPropagation], mTrackGid[type][cacheTrk[itrk]], type, trefTOF.getTime() - (minTrkTime + maxTrkTime) * 0.5); // TODO: check if this is correct!
677+
mMatchedTracksPairs.emplace_back(cacheTrk[itrk], eventIndexTOFCluster, mTOFClusWork[cacheTOF[itof]].getTime(), chi2, trkLTInt[iPropagation], mTrackGid[type][cacheTrk[itrk]], type, trefTOF.getTime() - (minTrkTime + maxTrkTime) * 0.5, 0., resX, resZ); // TODO: check if this is correct!
678678
}
679679
}
680680
}
@@ -1002,7 +1002,7 @@ void MatchTOF::doMatchingForTPC(int sec)
10021002
foundCluster = true;
10031003
// set event indexes (to be checked)
10041004
int eventIndexTOFCluster = mTOFClusSectIndexCache[indices[0]][itof];
1005-
mMatchedTracksPairs.emplace_back(cacheTrk[itrk], eventIndexTOFCluster, mTOFClusWork[cacheTOF[itof]].getTime(), chi2, trkLTInt[ibc][iPropagation], mTrackGid[trkType::UNCONS][cacheTrk[itrk]], trkType::UNCONS, resZ / vdrift * side, trefTOF.getZ()); // TODO: check if this is correct!
1005+
mMatchedTracksPairs.emplace_back(cacheTrk[itrk], eventIndexTOFCluster, mTOFClusWork[cacheTOF[itof]].getTime(), chi2, trkLTInt[ibc][iPropagation], mTrackGid[trkType::UNCONS][cacheTrk[itrk]], trkType::UNCONS, resZ / vdrift * side, trefTOF.getZ(), resX, resZ); // TODO: check if this is correct!
10061006
}
10071007
}
10081008
}

Detectors/GlobalTrackingWorkflow/src/TOFEventTimeChecker.cxx

Lines changed: 143 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,24 @@ struct MyTrack : o2::tof::eventTimeTrackTest {
6767
float tofExpTimeDe() const { return mExpDe; }
6868
double mSignalDouble = 0.0;
6969
float mEta = 0.0;
70+
float mPhi = 0.0;
7071
float mExpDe = 0;
7172
int mIsProb = 0;
7273
int mCh = -1;
74+
float mChi2 = 0;
75+
bool mHasTOF = false;
76+
int mSource = -1;
77+
double mTrktime = 0;
78+
double mTrktimeRes = 0;
79+
float mDx = 0;
80+
float mDz = 0;
7381
};
7482

7583
using TimeSlewing = o2::dataformats::CalibTimeSlewingParamTOF;
7684

7785
bool MyFilter(const MyTrack& tr)
7886
{
79-
return (tr.mP < 2.0 && tr.mEta > o2::tof::Utils::mEtaMin && tr.mEta < o2::tof::Utils::mEtaMax);
87+
return (tr.mP < 2.0 && tr.mEta > o2::tof::Utils::mEtaMin && tr.mEta < o2::tof::Utils::mEtaMax && tr.mHasTOF);
8088
} // accept all
8189

8290
namespace o2
@@ -92,7 +100,7 @@ class TOFEventTimeChecker : public Task
92100
void init(InitContext& ic) final;
93101
void run(ProcessingContext& pc) final;
94102
void endOfStream(framework::EndOfStreamContext& ec) final;
95-
void fillMatching(GID gid);
103+
void fillMatching(GID gid, float time0, float time0res);
96104
void processEvent(std::vector<MyTrack>& tracks);
97105

98106
private:
@@ -132,6 +140,8 @@ class TOFEventTimeChecker : public Task
132140
float mP = 0;
133141
float mPt = 0;
134142
float mEta = 0;
143+
float mPhi = 0;
144+
float mChi2 = 0;
135145
float mL = 0;
136146
float mTof = 0;
137147
float mT0 = 0;
@@ -140,7 +150,12 @@ class TOFEventTimeChecker : public Task
140150
float mExpPi = 0;
141151
float mExpKa = 0;
142152
float mExpPr = 0;
153+
float mDx = 0;
154+
float mDz = 0;
143155
int mIsProb = 0;
156+
int mSource = -1;
157+
float mTrktime = 0;
158+
float mTrktimeRes = 0;
144159
RecoContainer mRecoData;
145160
std::shared_ptr<DataRequest> mDataRequest;
146161
bool mUseMC = true;
@@ -153,6 +168,7 @@ void TOFEventTimeChecker::processEvent(std::vector<MyTrack>& tracks)
153168
for (auto& track : tracks) {
154169
if (!o2::tof::Utils::hasFillScheme()) {
155170
track.mSignal = float(track.mSignalDouble - double(o2::tof::Geo::BC_TIME_INPS) * nBC);
171+
track.mTrktime = (track.mTrktime - double(o2::tof::Geo::BC_TIME_INPS) * nBC);
156172
} else {
157173
double localTime = track.mSignalDouble;
158174

@@ -161,6 +177,11 @@ void TOFEventTimeChecker::processEvent(std::vector<MyTrack>& tracks)
161177
bcStarOrbit = (bcStarOrbit / o2::constants::lhc::LHCMaxBunches) * o2::constants::lhc::LHCMaxBunches; // truncation
162178
localTime -= bcStarOrbit * o2::tof::Geo::BC_TIME_INPS;
163179
track.mSignal = o2::tof::Utils::subtractInteractionBC(localTime);
180+
localTime = track.mTrktime;
181+
bcStarOrbit = int(localTime * o2::tof::Geo::BC_TIME_INPS_INV);
182+
bcStarOrbit = (bcStarOrbit / o2::constants::lhc::LHCMaxBunches) * o2::constants::lhc::LHCMaxBunches; // truncation
183+
localTime -= bcStarOrbit * o2::tof::Geo::BC_TIME_INPS;
184+
track.mTrktime = o2::tof::Utils::subtractInteractionBC(localTime);
164185
}
165186
}
166187

@@ -190,13 +211,20 @@ void TOFEventTimeChecker::processEvent(std::vector<MyTrack>& tracks)
190211
mP = track.mP;
191212
mPt = track.mPt;
192213
mEta = track.mEta;
214+
mSource = track.mSource;
215+
mPhi = track.mPhi;
216+
mChi2 = track.mChi2;
193217
mL = track.mLength;
194218
mTof = track.tofSignal();
195219
mExpDe = track.tofExpTimeDe();
196220
mExpPi = track.tofExpTimePi();
197221
mExpKa = track.tofExpTimeKa();
198222
mExpPr = track.tofExpTimePr();
199223
mIsProb = track.mIsProb;
224+
mTrktime = track.mTrktime;
225+
mTrktimeRes = track.mTrktimeRes;
226+
mDx = track.mDx;
227+
mDz = track.mDz;
200228

201229
#ifdef TDEBUG
202230
mTree->Fill();
@@ -250,85 +278,154 @@ void TOFEventTimeChecker::processEvent(std::vector<MyTrack>& tracks)
250278
}
251279
}
252280

253-
void TOFEventTimeChecker::fillMatching(GID gid)
281+
void TOFEventTimeChecker::fillMatching(GID gid, float time0, float time0res)
254282
{
283+
MyTrack trk;
284+
trk.mHasTOF = true;
285+
255286
if (!gid.includesDet(DetID::TOF)) {
256-
return;
287+
trk.mHasTOF = false;
257288
}
258-
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
259-
const o2::track::TrackLTIntegral& info = match.getLTIntegralOut();
260289

261-
if (info.getL() < 370) {
262-
return;
263-
}
290+
trk.mTrktime = time0 * 1E6;
291+
trk.mTrktimeRes = time0res * 1E6;
292+
293+
trk.mDx = 0;
294+
trk.mDz = 0;
264295

265-
MyTrack trk;
266296
int trksource = 5;
267297
if (gid.getSource() == GID::TPCTOF) {
298+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
268299
const auto& array = mRecoData.getTPCTracks();
269300
GID gTrackId = match.getTrackRef();
270301
const auto& srctrk = array[gTrackId.getIndex()];
271302
trk.mPt = srctrk.getPt();
272303
trk.mP = srctrk.getP();
273304
trk.mEta = srctrk.getEta();
305+
trk.mPhi = srctrk.getPhi();
306+
trk.mDx = match.getDXatTOF();
307+
trk.mDz = match.getDZatTOF();
308+
trksource = 0;
309+
} else if (gid.getSource() == GID::TPC) {
310+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
311+
const auto& array = mRecoData.getTPCTracks();
312+
GID gTrackId = gid;
313+
const auto& srctrk = array[gTrackId.getIndex()];
314+
trk.mPt = srctrk.getPt();
315+
trk.mP = srctrk.getP();
316+
trk.mEta = srctrk.getEta();
317+
trk.mPhi = srctrk.getPhi();
274318
trksource = 0;
275319
} else if (gid.getSource() == GID::ITSTPCTOF) {
320+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
276321
const auto& array = mRecoData.getTPCITSTracks();
277322
GID gTrackId = match.getTrackRef();
278323
const auto& srctrk = array[gTrackId.getIndex()];
279324
trk.mPt = srctrk.getPt();
280325
trk.mP = srctrk.getP();
281326
trk.mEta = srctrk.getEta();
327+
trk.mPhi = srctrk.getPhi();
328+
trksource = 1;
329+
trk.mTrktime = srctrk.getTimeMUS().getTimeStamp() * 1E6;
330+
trk.mTrktimeRes = srctrk.getTimeMUS().getTimeStampError() * 1E6;
331+
trk.mDx = match.getDXatTOF();
332+
trk.mDz = match.getDZatTOF();
333+
} else if (gid.getSource() == GID::ITSTPC) {
334+
const auto& array = mRecoData.getTPCITSTracks();
335+
GID gTrackId = gid; //match.getTrackRef();
336+
const auto& srctrk = array[gTrackId.getIndex()];
337+
trk.mPt = srctrk.getPt();
338+
trk.mP = srctrk.getP();
339+
trk.mEta = srctrk.getEta();
340+
trk.mPhi = srctrk.getPhi();
282341
trksource = 1;
342+
trk.mTrktime = srctrk.getTimeMUS().getTimeStamp() * 1E6;
343+
trk.mTrktimeRes = srctrk.getTimeMUS().getTimeStampError() * 1E6;
283344
} else if (gid.getSource() == GID::TPCTRDTOF) {
345+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
284346
const auto& array = mRecoData.getTPCTRDTracks<o2::trd::TrackTRD>();
285347
GID gTrackId = match.getTrackRef();
286348
const auto& srctrk = array[gTrackId.getIndex()];
287349
trk.mPt = srctrk.getPt();
288350
trk.mP = srctrk.getP();
289351
trk.mEta = srctrk.getEta();
352+
trk.mPhi = srctrk.getPhi();
290353
trksource = 2;
354+
trk.mDx = match.getDXatTOF();
355+
trk.mDz = match.getDZatTOF();
291356
} else if (gid.getSource() == GID::ITSTPCTRDTOF) {
357+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
292358
const auto& array = mRecoData.getITSTPCTRDTracks<o2::trd::TrackTRD>();
293359
GID gTrackId = match.getTrackRef();
294360
const auto& srctrk = array[gTrackId.getIndex()];
295361
trk.mPt = srctrk.getPt();
296362
trk.mP = srctrk.getP();
297363
trk.mEta = srctrk.getEta();
364+
trk.mPhi = srctrk.getPhi();
298365
trksource = 3;
366+
trk.mDx = match.getDXatTOF();
367+
trk.mDz = match.getDZatTOF();
299368
}
300369

370+
trk.mSource = trksource;
371+
301372
const char* sources[5] = {"TPC", "ITS-TPC", "TPC-TRD", "ITS-TPC-TRD", "NONE"};
302373

303-
trk.mExpDe = info.getTOF(5); // el
304-
trk.expTimes[0] = info.getTOF(2); // pi
305-
trk.expTimes[1] = info.getTOF(3); // ka
306-
trk.expTimes[2] = info.getTOF(4); // pr
307-
trk.expSigma[0] = 120; // dummy resolution (to be updated)
308-
trk.expSigma[1] = 120; // dummy resolution (to be updated)
309-
trk.expSigma[2] = 120; // dummy resolution (to be updated)
310-
311-
int tofcl = match.getIdxTOFCl();
312-
// trk.mSignal = mTOFClustersArrayInp[tofcl].getTime();
313-
double tofsignal = match.getSignal();
314-
315-
trk.mSignalDouble = tofsignal;
316-
317-
//trk.mSignal = match.getSignal();
318-
trk.mTOFChi2 = match.getChi2();
319-
trk.mLength = info.getL();
320-
// trk.mHypo = 0;
321-
trk.mCh = mTOFClustersArrayInp[tofcl].getMainContributingChannel();
322-
323-
if (mSlewing) { // let's calibrate
324-
trk.mIsProb = mSlewing->isProblematic(trk.mCh);
325-
if (mSlewing->isProblematic(trk.mCh)) {
326-
// LOG(DEBUG) << "skip channel " << trk.mCh << " since problematic";
327-
// return;
374+
if (trk.mHasTOF) {
375+
const o2::dataformats::MatchInfoTOF& match = mRecoData.getTOFMatch(gid);
376+
const o2::track::TrackLTIntegral& info = match.getLTIntegralOut();
377+
378+
if (info.getL() < 370) {
379+
// trk.mHasTOF = false;
380+
}
381+
382+
trk.mExpDe = info.getTOF(5); // el
383+
trk.expTimes[0] = info.getTOF(2); // pi
384+
trk.expTimes[1] = info.getTOF(3); // ka
385+
trk.expTimes[2] = info.getTOF(4); // pr
386+
trk.expSigma[0] = 120; // dummy resolution (to be updated)
387+
trk.expSigma[1] = 120; // dummy resolution (to be updated)
388+
trk.expSigma[2] = 120; // dummy resolution (to be updated)
389+
390+
trk.mChi2 = match.getChi2();
391+
392+
int tofcl = match.getIdxTOFCl();
393+
// trk.mSignal = mTOFClustersArrayInp[tofcl].getTime();
394+
double tofsignal = match.getSignal();
395+
396+
trk.mSignalDouble = tofsignal;
397+
398+
//trk.mSignal = match.getSignal();
399+
trk.mTOFChi2 = match.getChi2();
400+
trk.mLength = info.getL();
401+
// trk.mHypo = 0;
402+
trk.mCh = mTOFClustersArrayInp[tofcl].getMainContributingChannel();
403+
404+
if (mSlewing) { // let's calibrate
405+
trk.mIsProb = mSlewing->isProblematic(trk.mCh);
406+
if (mSlewing->isProblematic(trk.mCh)) {
407+
// LOG(DEBUG) << "skip channel " << trk.mCh << " since problematic";
408+
// return;
409+
}
410+
float tot = mTOFClustersArrayInp[tofcl].getTot();
411+
trk.mSignalDouble -= mSlewing->evalTimeSlewing(trk.mCh, tot);
412+
LOG(DEBUG) << "calibration -> " << mSlewing->evalTimeSlewing(trk.mCh, tot);
328413
}
329-
float tot = mTOFClustersArrayInp[tofcl].getTot();
330-
trk.mSignalDouble -= mSlewing->evalTimeSlewing(trk.mCh, tot);
331-
LOG(DEBUG) << "calibration -> " << mSlewing->evalTimeSlewing(trk.mCh, tot);
414+
}
415+
if (!trk.mHasTOF) {
416+
trk.mExpDe = 0;
417+
trk.expTimes[0] = 0;
418+
trk.expTimes[1] = 0;
419+
trk.expTimes[2] = 0;
420+
trk.expSigma[0] = 0; // dummy resolution (to be updated)
421+
trk.expSigma[1] = 0; // dummy resolution (to be updated)
422+
trk.expSigma[2] = 0; // dummy resolution (to be updated)
423+
trk.mSignalDouble = time0 * 1E6;
424+
trk.mTOFChi2 = 9999;
425+
trk.mLength = 0;
426+
trk.mCh = -1;
427+
trk.mChi2 = 0;
428+
trk.mIsProb = 0;
332429
}
333430

334431
mMyTracks.push_back(trk);
@@ -390,11 +487,18 @@ void TOFEventTimeChecker::init(InitContext& ic)
390487
mTree->Branch("isProb", &mIsProb, "isProb/I");
391488
mTree->Branch("p", &mP, "p/F");
392489
mTree->Branch("pt", &mPt, "pt/F");
490+
mTree->Branch("source", &mSource, "source/I");
393491
mTree->Branch("eta", &mEta, "eta/F");
492+
mTree->Branch("phi", &mPhi, "phi/F");
493+
mTree->Branch("chi2", &mChi2, "chi2/F");
394494
mTree->Branch("l", &mL, "l/F");
395495
mTree->Branch("tof", &mTof, "tof/F");
396496
mTree->Branch("t0", &mT0, "t0/F");
397497
mTree->Branch("t0res", &mT0Res, "t0res/F");
498+
mTree->Branch("trkTime", &mTrktime, "trkTime/F");
499+
mTree->Branch("trkTimeRes", &mTrktimeRes, "trkTimeRes/F");
500+
mTree->Branch("dx", &mDx, "dx/F");
501+
mTree->Branch("dz", &mDz, "dz/F");
398502
mTree->Branch("expDe", &mExpDe, "expDe/F");
399503
mTree->Branch("expPi", &mExpPi, "expPi/F");
400504
mTree->Branch("expKa", &mExpKa, "expKa/F");
@@ -427,7 +531,7 @@ void TOFEventTimeChecker::run(ProcessingContext& pc)
427531
}
428532

429533
auto creator = [this](auto& trk, GID gid, float time0, float terr) {
430-
this->fillMatching(gid);
534+
this->fillMatching(gid, time0, terr);
431535
return true;
432536
};
433537
mRecoData.createTracksVariadic(creator);

0 commit comments

Comments
 (0)