Skip to content

Commit 7374b5a

Browse files
committed
ITS3 study
1 parent 4a853e0 commit 7374b5a

3 files changed

Lines changed: 54 additions & 49 deletions

File tree

Detectors/Upgrades/ITS3/study/include/ITS3TrackingStudy/ITS3TrackingStudyParam.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct ITS3TrackingStudyParam : o2::conf::ConfigurableParamHelper<ITS3TrackingSt
3636
int minTPCCls{110};
3737

3838
// propagator
39-
o2::base::PropagatorImpl<float>::MatCorrType CorrType = o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrLUT;
39+
o2::base::PropagatorImpl<float>::MatCorrType CorrType = o2::base::PropagatorImpl<float>::MatCorrType::USEMatCorrTGeo;
4040

4141
/// studies
4242
bool doDCA = false;

Detectors/Upgrades/ITS3/study/macros/PlotPulls.C

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
// or submit itself to any jurisdiction.
1111

1212
/// \file PlotDCA.C
13-
/// \brief Simple macro to plot ITS3 impact parameter resolution
13+
/// \brief Simple macro to plot ITS3 pulls
1414

1515
#if !defined(__CLING__) || defined(__ROOTCLING__)
1616
#include <memory>
@@ -27,7 +27,6 @@
2727

2828
#include "ReconstructionDataFormats/GlobalTrackID.h"
2929
#include "ReconstructionDataFormats/Track.h"
30-
#include "ReconstructionDataFormats/DCA.h"
3130
#include "SimulationDataFormat/MCTrack.h"
3231
#endif
3332

Detectors/Upgrades/ITS3/study/src/TrackingStudy.cxx

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ class TrackingStudySpec : public Task
6666
TrackingStudySpec(TrackingStudySpec&&) = delete;
6767
TrackingStudySpec& operator=(const TrackingStudySpec&) = delete;
6868
TrackingStudySpec& operator=(TrackingStudySpec&&) = delete;
69-
TrackingStudySpec(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, GTrackID::mask_t src, bool useMC)
70-
: mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(src), mUseMC(useMC) {}
69+
TrackingStudySpec(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, GTrackID::mask_t src, bool useMC, bool withPV)
70+
: mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(src), mUseMC(useMC), mWithPV(withPV) {}
7171
~TrackingStudySpec() final = default;
7272
void init(InitContext& ic) final;
7373
void run(ProcessingContext& pc) final;
@@ -80,7 +80,7 @@ class TrackingStudySpec : public Task
8080
void prepareITSClusters();
8181
bool selectTrack(GTrackID trkID, bool checkMCTruth = true) const;
8282
T2VMap buildT2V(bool includeCont = false, bool requireMCMatch = true) const;
83-
bool refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID gidx);
83+
bool refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID gidx, const o2::dataformats::VertexBase& pv);
8484

8585
void doDCAStudy();
8686
void doDCARefitStudy();
@@ -146,6 +146,7 @@ class TrackingStudySpec : public Task
146146
std::shared_ptr<DataRequest> mDataRequest;
147147
std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
148148
bool mUseMC{false};
149+
bool mWithPV{false};
149150
GTrackID::mask_t mTracksSrc;
150151
o2::vertexing::PVertexer mVertexer;
151152
o2::steer::MCKinematicsReader mMCReader; // reader of MC information
@@ -183,6 +184,7 @@ void TrackingStudySpec::updateTimeDependentParams(ProcessingContext& pc)
183184
mVertexer.init();
184185
o2::its::GeometryTGeo::Instance()->fillMatrixCache(o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::L2G, o2::math_utils::TransformType::T2G));
185186
mParams = &ITS3TrackingStudyParam::Instance();
187+
mParams->printKeyValues(true, true);
186188
if (mParams->doMisalignment) {
187189
mMisalignment = {};
188190
if (!mParams->misAlgJson.empty()) {
@@ -381,36 +383,19 @@ T2VMap TrackingStudySpec::buildT2V(bool includeCont, bool requireMCMatch) const
381383
return std::move(t2v);
382384
}
383385

384-
bool TrackingStudySpec::refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID gidx)
386+
bool TrackingStudySpec::refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID gidx, const o2::dataformats::VertexBase& pv)
385387
{
386388
if (gidx.getSource() != GTrackID::ITS) {
387389
return false;
388390
}
389-
static auto pvvec = mRecoData.getPrimaryVertices();
390-
static auto t2v = buildT2V(true, true);
391-
static std::vector<unsigned int> itsTracksROF;
392-
if (static bool done{false}; !done) {
393-
done = true;
394-
const auto& itsTracksROFRec = mRecoData.getITSTracksROFRecords();
395-
itsTracksROF.resize(mRecoData.getITSTracks().size());
396-
for (unsigned irf = 0, cnt = 0; irf < itsTracksROFRec.size(); irf++) {
397-
int ntr = itsTracksROFRec[irf].getNEntries();
398-
for (int itr = 0; itr < ntr; itr++) {
399-
itsTracksROF[cnt++] = irf;
400-
}
401-
}
402-
}
403-
auto prop = o2::base::Propagator::Instance();
391+
392+
const auto geom = o2::its::GeometryTGeo::Instance();
393+
const auto prop = o2::base::Propagator::Instance();
404394
std::array<const TrackingCluster*, 8> clArr{nullptr};
405395
const auto trkIn = mRecoData.getTrackParam(gidx);
406-
const auto trkOut = mRecoData.getTrackParamOut(gidx);
407396
const auto& itsTrOrig = mRecoData.getITSTrack(gidx);
408-
int ncl = itsTrOrig.getNumberOfClusters(), rof = itsTracksROF[gidx.getIndex()];
409-
const auto& itsTrackClusRefs = mRecoData.getITSTracksClusterRefs();
410-
int clEntry = itsTrOrig.getFirstClusterEntry();
411-
const auto propagator = o2::base::Propagator::Instance();
397+
412398
// convert PV to a fake cluster in the track DCA frame
413-
const auto& pv = pvvec[t2v[gidx]];
414399
auto trkPV = trkIn;
415400
if (!prop->propagateToDCA(pv, trkPV, prop->getNominalBz(), 2.0, mParams->CorrType)) {
416401
mTrackCounter -= gidx.getSource();
@@ -421,18 +406,29 @@ bool TrackingStudySpec::refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID
421406
o2::math_utils::sincos(trkPV.getAlpha(), sinAlp, cosAlp);
422407
// vertex position rotated to track frame
423408
TrackingCluster pvCls;
409+
pvCls.alpha = trkPV.getAlpha();
424410
pvCls.setXYZ((pv.getX() * cosAlp) + (pv.getY() * sinAlp), (-pv.getX() * sinAlp) + (pv.getY() * cosAlp), pv.getZ());
425-
pvCls.setSigmaY2(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()));
426-
pvCls.setSigmaZ2(pv.getSigmaZ2());
411+
pvCls.setErrors(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()), pv.getSigmaZ2(), 0.f);
412+
pvCls.setSensorID(-1);
427413
clArr[0] = &pvCls;
428-
for (int icl = 0; icl < ncl; ++icl) { // ITS clusters are referred in layer decreasing order
429-
clArr[ncl - icl] = &mITScl[itsTrackClusRefs[clEntry + icl]];
414+
415+
const int ncl = itsTrOrig.getNumberOfClusters();
416+
for (int icl = 0; icl < ncl; ++icl) {
417+
const auto& curClu = mITScl[mITSclRef[itsTrOrig.getClusterEntry(icl)]];
418+
const int llr = geom->getLayer(curClu.getSensorID());
419+
if (clArr[1 + llr]) {
420+
LOGP(fatal, "Cluster at lr {} was already assigned, old sens {}, new sens {}", llr, clArr[1 + llr]->getSensorID(), curClu.getSensorID());
421+
}
422+
clArr[1 + llr] = &curClu;
430423
}
431-
// start refit
432-
trFit = trkOut;
424+
425+
trFit = mRecoData.getTrackParamOut(gidx);
433426
trFit.resetCovariance(1'000);
434427
float chi2{0};
435-
for (int icl = ncl; icl >= 0; --icl) { // go backwards
428+
for (int icl = clArr.size() - 1; icl >= 0; --icl) { // go backwards
429+
if (!clArr[icl]) {
430+
continue;
431+
}
436432
if (!trFit.rotate(clArr[icl]->alpha) || !prop->propagateToX(trFit, clArr[icl]->getX(), prop->getNominalBz(), 0.85, 2.0, mParams->CorrType)) {
437433
mTrackCounter -= gidx.getSource();
438434
return false;
@@ -443,7 +439,6 @@ bool TrackingStudySpec::refitITSPVTrack(o2::track::TrackParCov& trFit, GTrackID
443439
return false;
444440
}
445441
}
446-
// chi2 < conf.maxChi2; should I cut here?
447442
return true;
448443
};
449444

@@ -496,10 +491,10 @@ void TrackingStudySpec::doDCAStudy()
496491
const auto& trk = mRecoData.getTrackParam(contributorsGID[cis]);
497492
auto trkRefit = trk;
498493
// for ITS standalone tracks instead of having the trk at the pv we refit with the pv
499-
if (mParams->refitITS && cis == GTrackID::ITS && !refitITSPVTrack(trkRefit, contributorsGID[cis])) {
494+
if (mWithPV && mParams->refitITS && cis == GTrackID::ITS && !refitITSPVTrack(trkRefit, contributorsGID[cis], pv)) {
500495
mTrackCounter -= cis;
501496
continue;
502-
} else {
497+
} else if (!(mWithPV && mParams->refitITS && cis == GTrackID::ITS)) {
503498
trkRefit.invalidate();
504499
};
505500

@@ -684,17 +679,30 @@ void TrackingStudySpec::doPullStudy()
684679
mTrackCounter &= trkID.getSource();
685680
return;
686681
}
687-
const auto mcTrk = mMCReader.getTrack(mRecoData.getTrackMCLabel(trkID));
682+
const auto& lbl = mRecoData.getTrackMCLabel(trkID);
683+
const auto mcTrk = mMCReader.getTrack(lbl);
688684
if (!mcTrk) {
689685
return;
690686
}
687+
if (!mcTrk->isPrimary()) {
688+
mTrackCounter &= trkID.getSource();
689+
return;
690+
}
691691
auto trk = mRecoData.getTrackParam(trkID);
692692

693-
// for ITS standalone tracks we add the PV as an additional measurement point
694-
if (mParams->refitITS && trkID.getSource() == GTrackID::ITS && !refitITSPVTrack(trk, trkID)) {
695-
mTrackCounter -= trkID.getSource();
696-
++nPullsFail;
697-
return;
693+
// for ITS standalone tracks we add the MC event vertex as an additional measurement point
694+
if (mParams->refitITS && trkID.getSource() == GTrackID::ITS) {
695+
const auto& eve = mMCReader.getMCEventHeader(lbl.getSourceID(), lbl.getEventID());
696+
o2::dataformats::VertexBase mcEve;
697+
mcEve.setXYZ((float)eve.GetX(), (float)eve.GetY(), (float)eve.GetZ());
698+
mcEve.setSigmaX(20e-4f);
699+
mcEve.setSigmaY(20e-4f);
700+
mcEve.setSigmaZ(20e-4f);
701+
if (!refitITSPVTrack(trk, trkID, mcEve)) {
702+
mTrackCounter -= trkID.getSource();
703+
++nPullsFail;
704+
return;
705+
}
698706
}
699707

700708
std::array<float, 3> xyz{(float)mcTrk->GetStartVertexCoordinatesX(), (float)mcTrk->GetStartVertexCoordinatesY(), (float)mcTrk->GetStartVertexCoordinatesZ()},
@@ -885,8 +893,7 @@ void TrackingStudySpec::doResidStudy()
885893
o2::math_utils::sincos(trFitOut.getAlpha(), sinAlp, cosAlp);
886894
cl[0].alpha = trFitOut.getAlpha();
887895
cl[0].setXYZ((pv.getX() * cosAlp) + (pv.getY() * sinAlp), (-pv.getX() * sinAlp) + (pv.getY() * cosAlp), pv.getZ());
888-
cl[0].setSigmaY2(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()));
889-
cl[0].setSigmaZ2(pv.getSigmaZ2());
896+
cl[0].setErrors(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()), pv.getSigmaZ2(), 0.f);
890897
cl[0].setSensorID(-1);
891898
clArr[0] = &cl[0];
892899
}
@@ -1047,8 +1054,7 @@ void TrackingStudySpec::doMisalignmentStudy()
10471054
o2::math_utils::sincos(trFitOut.getAlpha(), sinAlp, cosAlp);
10481055
cl[0].alpha = trFitOut.getAlpha();
10491056
cl[0].setXYZ((pv.getX() * cosAlp) + (pv.getY() * sinAlp), (-pv.getX() * sinAlp) + (pv.getY() * cosAlp), pv.getZ());
1050-
cl[0].setSigmaY2(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()));
1051-
cl[0].setSigmaZ2(pv.getSigmaZ2());
1057+
cl[0].setErrors(0.5f * (pv.getSigmaX2() + pv.getSigmaY2()), pv.getSigmaZ2(), 0.f);
10521058
cl[0].setSensorID(-1);
10531059
clArr[0] = &cl[0];
10541060
}
@@ -1179,7 +1185,7 @@ DataProcessorSpec getTrackingStudySpec(GTrackID::mask_t srcTracks, GTrackID::mas
11791185
.name = "its3-track-study",
11801186
.inputs = dataRequest->inputs,
11811187
.outputs = outputs,
1182-
.algorithm = AlgorithmSpec{adaptFromTask<TrackingStudySpec>(dataRequest, ggRequest, srcTracks, useMC)},
1188+
.algorithm = AlgorithmSpec{adaptFromTask<TrackingStudySpec>(dataRequest, ggRequest, srcTracks, useMC, withPV)},
11831189
.options = {}};
11841190
}
11851191

0 commit comments

Comments
 (0)