@@ -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