@@ -156,6 +156,7 @@ struct nucleiQC {
156156 std::shared_ptr<TH1> mHistTrackTunedTracks = mHistograms .get<TH1>(HIST(" hTrackTunedTracks" ));
157157
158158 std::vector<int > mSpeciesToProcess ;
159+ std::array<bool , nuclei::Species::kNspecies > mFillSpecies {false };
159160 Produces<aod::NucleiTableRed> mNucleiTableRed ;
160161 Produces<aod::NucleiTableExt> mNucleiTableExt ;
161162
@@ -169,6 +170,7 @@ struct nucleiQC {
169170 o2::dataformats::VertexBase mVtx ;
170171 o2::track::TrackParametrizationWithError<float > mTrackParCov ;
171172 std::array<nuclei::PidManager, static_cast <int >(nuclei::Species::kNspecies )> mPidManagers ;
173+ bool mAnyTrackTuner = false ;
172174
173175 void init (o2::framework::InitContext&)
174176 {
@@ -177,22 +179,24 @@ struct nucleiQC {
177179 mCcdb ->setCaching (true );
178180 mCcdb ->setLocalObjectValidityChecking ();
179181 mCcdb ->setFatalWhenNull (false );
180- nuclei::lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (mCcdb ->get <o2::base::MatLayerCylSet>(" GLO/Param/MatLUT" ));
182+ // nuclei::lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(mCcdb->get<o2::base::MatLayerCylSet>("GLO/Param/MatLUT"));
181183
182184 for (int iSel = 0 ; iSel < nuclei::evSel::kNevSels ; iSel++) {
183185 mHistograms .get <TH1>(HIST (" hEventSelections" ))->GetXaxis ()->SetBinLabel (iSel + 1 , nuclei::eventSelectionLabels[iSel].c_str ());
184186 }
185187
186188 for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
187- if (cfgSpeciesToProcess->get (iSpecies) == 1 )
189+ if (cfgSpeciesToProcess->get (iSpecies) == 1 ) {
188190 mSpeciesToProcess .emplace_back (iSpecies);
191+ mFillSpecies [iSpecies] = true ;
192+ }
189193 }
190194
191195 static_for<0 , nuclei::kNspecies - 1 >([&](auto iSpecies) {
192196 constexpr int kSpeciesCt = decltype (iSpecies)::value;
193197 const int kSpeciesRt = kSpeciesCt ;
194198
195- if (std::find ( mSpeciesToProcess . begin (), mSpeciesToProcess . end (), kSpeciesCt ) == mSpeciesToProcess . end () )
199+ if (! mFillSpecies [ kSpeciesCt ] )
196200 return ;
197201
198202 float tpcBetheBlochParams[6 ];
@@ -214,12 +218,12 @@ struct nucleiQC {
214218 });
215219
216220 // / TrackTuner initialization
217- bool anyTrackTuner = false ;
221+ mAnyTrackTuner = false ;
218222 for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
219- anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
223+ mAnyTrackTuner = mAnyTrackTuner || cfgUseTrackTuner->get (iSpecies);
220224 }
221225
222- if (anyTrackTuner ) {
226+ if (mAnyTrackTuner ) {
223227 std::string outputStringParams = " " ;
224228 switch (cfgTrackTunerConfigSource) {
225229 case aod::track_tuner::InputString:
@@ -251,12 +255,16 @@ struct nucleiQC {
251255
252256 o2::parameters::GRPMagField* grpmag = mCcdb ->getForTimeStamp <o2::parameters::GRPMagField>(" GLO/Config/GRPMagField" , timestamp);
253257 o2::base::Propagator::initFieldFromGRP (grpmag);
254- o2::base::Propagator::Instance ()->setMatLUT (nuclei::lut);
258+ // o2::base::Propagator::Instance()->setMatLUT(nuclei::lut);
259+ if (!o2::base::Propagator::Instance ()->getMatLUT ()) {
260+ nuclei::lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (mCcdb ->get <o2::base::MatLayerCylSet>(" GLO/Param/MatLUT" ));
261+ o2::base::Propagator::Instance ()->setMatLUT (nuclei::lut);
262+ }
255263 mBz = static_cast <float >(grpmag->getNominalL3Field ());
256264 LOGF (info, " Retrieved GRP for timestamp %ull (%i) with magnetic field of %1.2f kZG" , timestamp, mRunNumber , mBz );
257265 }
258266
259- template <int iSpecies, typename Ttrack, typename Tcollision>
267+ template <int iSpecies, bool isMc, typename Ttrack, typename Tcollision>
260268 bool trackSelection (const Ttrack& track, const Tcollision& collision)
261269 {
262270 mHistograms .fill (HIST (nuclei::cNames[iSpecies]) + HIST (" /hTrackQuality" ), track.sign () * track.pt (), trackQuality::kNoCuts );
@@ -289,13 +297,24 @@ struct nucleiQC {
289297 return false ;
290298 mHistograms .fill (HIST (nuclei::cNames[iSpecies]) + HIST (" /hTrackQuality" ), track.sign () * track.pt (), trackQuality::kItsChi2Cut );
291299
292- const o2::math_utils::Point3D<float > collisionVertex{collision.posX (), collision.posY (), collision.posZ ()};
293300 mDcaInfoCov .set (999 , 999 , 999 , 999 , 999 );
294301 setTrackParCov (track, mTrackParCov );
295302 mTrackParCov .setPID (track.pidForTracking ());
296- std::array<float , 2 > dcaInfo;
297- o2::base::Propagator::Instance ()->propagateToDCA (collisionVertex, mTrackParCov , mBz , 2 .f , static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ), &dcaInfo);
298- if (std::abs (dcaInfo[0 ]) > cfgCutDCAxy || std::abs (dcaInfo[1 ]) > cfgCutDCAz)
303+
304+ if constexpr (isMc) {
305+ if (track.has_mcParticle () && cfgUseTrackTuner->get (iSpecies)) {
306+ const auto & particle = track.mcParticle ();
307+ mHistTrackTunedTracks ->Fill (1 .);
308+ mTrackTuner .tuneTrackParams (particle, mTrackParCov , mMatCorr , &mDcaInfoCov , mHistTrackTunedTracks );
309+ }
310+ } else {
311+ mMatCorr = static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value );
312+ }
313+
314+ o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCov , 2 .f , mMatCorr , &mDcaInfoCov );
315+ mDcaInfo [0 ] = mDcaInfoCov .getY ();
316+ mDcaInfo [1 ] = mDcaInfoCov .getZ ();
317+ if (std::abs (mDcaInfo [0 ]) > cfgCutDCAxy || std::abs (mDcaInfo [1 ]) > cfgCutDCAz)
299318 return false ;
300319 mHistograms .fill (HIST (nuclei::cNames[iSpecies]) + HIST (" /hTrackQuality" ), track.sign () * track.pt (), trackQuality::kDcaCuts );
301320
@@ -365,9 +384,9 @@ struct nucleiQC {
365384 }
366385
367386 template <typename Tparticle>
368- void fillCollisionFlag (const Tparticle& particle, nuclei::SlimCandidate& candidate, const std::vector< bool >& reconstructedCollision)
387+ void fillCollisionFlag (const Tparticle& particle, nuclei::SlimCandidate& candidate, const std::unordered_set< int >& reconstructedCollision)
369388 {
370- if (reconstructedCollision[ particle.mcCollisionId ()] ) {
389+ if (reconstructedCollision. count ( particle.mcCollisionId ()) > 0 ) {
371390 candidate.flags |= nuclei::QcFlags::kQcHasReconstructedCollision ;
372391 }
373392 }
@@ -396,31 +415,6 @@ struct nucleiQC {
396415 candidate.phiGenerated = particle.phi ();
397416 }
398417
399- template <const bool isMc, typename Tcollision, typename Ttrack>
400- void fillDcaInformation (const int iSpecies, const Tcollision& collision, const Ttrack& track, nuclei::SlimCandidate& candidate, const aod::McParticles::iterator& particle)
401- {
402-
403- mDcaInfoCov .set (999 , 999 , 999 , 999 , 999 );
404- setTrackParCov (track, mTrackParCov );
405- mTrackParCov .setPID (track.pidForTracking ());
406-
407- if constexpr (isMc) {
408- if (track.has_mcParticle () && cfgUseTrackTuner->get (iSpecies)) {
409- mHistTrackTunedTracks ->Fill (1 .);
410- mTrackTuner .tuneTrackParams (particle, mTrackParCov , mMatCorr , &mDcaInfoCov , mHistTrackTunedTracks );
411- }
412- } else {
413- mMatCorr = static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value );
414- }
415-
416- mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
417- mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
418- o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCov , 2 .f , mMatCorr , &mDcaInfoCov );
419-
420- candidate.DCAxy = mDcaInfoCov .getY ();
421- candidate.DCAz = mDcaInfoCov .getZ ();
422- }
423-
424418 template <const bool isMc, typename Tcollision, typename Ttrack>
425419 nuclei::SlimCandidate fillCandidate (const int iSpecies, Tcollision const & collision, Ttrack const & track)
426420 {
@@ -434,8 +428,8 @@ struct nucleiQC {
434428 .clusterSizesITS = track.itsClusterSizes (),
435429 .TPCsignal = track.tpcSignal (),
436430 .beta = mPidManagers [iSpecies].getBetaTOF (track),
437- .DCAxy = 0 . f ,
438- .DCAz = 0 . f ,
431+ .DCAxy = mDcaInfo [ 0 ], // set in the track selection function
432+ .DCAz = mDcaInfo [ 1 ], // set in the track selection function
439433 .flags = 0 ,
440434 .pdgCode = 0 ,
441435 .motherPdgCode = 0 ,
@@ -450,19 +444,15 @@ struct nucleiQC {
450444
451445 fillNucleusFlagsPdgs (collision, track, candidate);
452446
453- aod::McParticles::iterator particle;
454-
455447 if constexpr (isMc) {
456448 if (track.has_mcParticle ()) {
457449
458- particle = track.mcParticle ();
450+ const auto & particle = track.mcParticle ();
459451 fillNucleusFlagsPdgsMc (particle, candidate);
460452 fillNucleusGeneratedVariables (particle, candidate);
461453 }
462454 }
463455
464- fillDcaInformation<isMc>(iSpecies, collision, track, candidate, particle);
465-
466456 return candidate;
467457 }
468458
@@ -510,12 +500,36 @@ struct nucleiQC {
510500 }
511501 }
512502
503+ void writeCandidate (const nuclei::SlimCandidate& candidate)
504+ {
505+ if (!cfgFillTable)
506+ return ;
507+
508+ mNucleiTableRed (
509+ candidate.pt ,
510+ candidate.eta ,
511+ candidate.phi ,
512+ candidate.tpcInnerParam ,
513+ candidate.clusterSizesITS ,
514+ candidate.TPCsignal ,
515+ candidate.beta ,
516+ candidate.DCAxy ,
517+ candidate.DCAz ,
518+ candidate.flags ,
519+ candidate.ptGenerated ,
520+ candidate.mcProcess ,
521+ candidate.pdgCode ,
522+ candidate.motherPdgCode );
523+ mNucleiTableExt (
524+ candidate.nsigmaTpc ,
525+ candidate.nsigmaTof );
526+ }
527+
513528 void processMc (const Collisions& collisions, const TrackCandidatesMC& tracks, const aod::BCsWithTimestamps&, const aod::McParticles& mcParticles, const aod::McCollisions& mcCollisions)
514529 {
515530 gRandom ->SetSeed (67 );
516- mNucleiCandidates .clear ();
517- std::vector<bool > reconstructedMcParticles (mcParticles.size (), false );
518- std::vector<bool > reconstructedCollisions (mcCollisions.size (), false );
531+ std::unordered_set<int > reconstructedMcParticles;
532+ std::unordered_set<int > reconstructedCollisions;
519533
520534 for (const auto & collision : collisions) {
521535
@@ -525,13 +539,11 @@ struct nucleiQC {
525539 if (!nuclei::eventSelection (collision, mHistograms , cfgEventSelections, cfgCutVertex))
526540 continue ;
527541 mHistograms .fill (HIST (" hCentrality" ), nuclei::getCentrality (collision, cfgCentralityEstimator, mHistFailCentrality ));
528- reconstructedCollisions[collision.mcCollisionId ()] = true ;
542+ reconstructedCollisions.insert (collision.mcCollisionId ());
543+ mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
544+ mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
529545
530- bool anyTrackTuner = false ;
531- for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
532- anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
533- }
534- if (anyTrackTuner && mTrackTuner .autoDetectDcaCalib && !mTrackTuner .areGraphsConfigured ) {
546+ if (mAnyTrackTuner && mTrackTuner .autoDetectDcaCalib && !mTrackTuner .areGraphsConfigured ) {
535547
536548 mTrackTuner .setRunNumber (mRunNumber );
537549
@@ -544,38 +556,41 @@ struct nucleiQC {
544556 auto tracksThisCollision = tracks.sliceBy (mTracksPerCollision , collision.globalIndex ());
545557 for (const auto & track : tracksThisCollision) {
546558
547- static_for< 0 , nuclei:: kNspecies - 1 >([&]( auto iSpecies) {
548- constexpr int kSpeciesCt = decltype (iSpecies)::value;
549- const int kSpeciesRt = kSpeciesCt ;
559+ // selections shared among all species
560+ if (!track. has_mcParticle ())
561+ continue ;
550562
551- if (std::find (mSpeciesToProcess .begin (), mSpeciesToProcess .end (), kSpeciesRt ) == mSpeciesToProcess .end ())
552- return ;
563+ if (track.mcParticleId () < -1 || track.mcParticleId () >= mcParticles.size ())
564+ continue ;
565+ const auto & particle = mcParticles.iteratorAt (track.mcParticleId ());
553566
554- if (!track.has_mcParticle ())
555- return ;
567+ if (cfgRapidityToggle && ((particle.y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle.y () - cfgRapidityCenterMass) > cfgRapidityMax))
568+ continue ;
569+
570+ if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
571+ continue ;
556572
557- if (track.mcParticleId () < -1 || track.mcParticleId () >= mcParticles.size ())
573+ // species-specific selections and filling
574+ static_for<0 , nuclei::kNspecies - 1 >([&](auto iSpecies) {
575+ constexpr int kSpeciesCt = decltype (iSpecies)::value;
576+ const int kSpeciesRt = kSpeciesCt ;
577+ if (!mFillSpecies [kSpeciesCt ])
558578 return ;
559- const auto & particle = mcParticles.iteratorAt (track.mcParticleId ());
560579
561580 if (cfgDoCheckPdgCode) {
562581 if (std::abs (particle.pdgCode ()) != nuclei::pdgCodes[kSpeciesRt ])
563582 return ;
564583 }
565584
585+ mDcaInfo = {-999 .f , -999 .f };
586+
566587 if (cfgDownscalingFactor->get (kSpeciesRt ) < 1 .) {
567588 if ((gRandom ->Uniform ()) > cfgDownscalingFactor->get (kSpeciesRt ))
568589 return ;
569590 }
570591
571- if (cfgRapidityToggle && ((particle.y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle.y () - cfgRapidityCenterMass) > cfgRapidityMax))
572- return ;
573-
574- if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
575- return ;
576-
577592 mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kNoCuts );
578- if (!trackSelection<kSpeciesRt >(track, collision))
593+ if (!trackSelection<kSpeciesRt , /* isMc */ true >(track, collision))
579594 return ;
580595 mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kTrackCuts );
581596
@@ -587,8 +602,8 @@ struct nucleiQC {
587602 candidate = fillCandidate</* isMc*/ true >(kSpeciesCt , collision, track);
588603 fillCollisionFlag (particle, candidate, reconstructedCollisions);
589604
590- mNucleiCandidates . emplace_back (candidate);
591- reconstructedMcParticles[ particle.globalIndex ()] = true ;
605+ writeCandidate (candidate);
606+ reconstructedMcParticles. insert ( particle.globalIndex ()) ;
592607
593608 dispatchFillHistograms</* isGenerated*/ true >(kSpeciesRt , candidate);
594609 dispatchFillHistograms</* isGenerated*/ false >(kSpeciesRt , candidate);
@@ -600,15 +615,14 @@ struct nucleiQC {
600615 for (const auto & particle : mcParticles) {
601616
602617 mcIndex++;
603-
604618 int iSpecies = nuclei::getSpeciesFromPdg (particle.pdgCode ());
605- if (std::find ( mSpeciesToProcess . begin (), mSpeciesToProcess . end (), iSpecies) == mSpeciesToProcess . end () )
619+ if (! mFillSpecies [ iSpecies] )
606620 continue ;
607621
608- if ((particle. y () - cfgRapidityCenterMass) < cfgRapidityMin || ( particle.y () - cfgRapidityCenterMass ) > cfgRapidityMax )
622+ if (reconstructedMcParticles. count ( particle.globalIndex () ) > 0 )
609623 continue ;
610624
611- if (reconstructedMcParticles[mcIndex] )
625+ if ((particle. y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle. y () - cfgRapidityCenterMass) > cfgRapidityMax )
612626 continue ;
613627
614628 if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
@@ -626,34 +640,10 @@ struct nucleiQC {
626640 fillNucleusFlagsPdgsMc (particle, candidate);
627641 fillNucleusGeneratedVariables (particle, candidate);
628642
629- mNucleiCandidates . emplace_back (candidate);
643+ writeCandidate (candidate);
630644 mFilledMcParticleIds .emplace_back (particle.globalIndex ());
631645 dispatchFillHistograms</* isGenerated*/ true >(iSpecies, candidate);
632646 }
633-
634- if (!cfgFillTable)
635- return ;
636-
637- for (const auto & candidate : mNucleiCandidates ) {
638- mNucleiTableRed (
639- candidate.pt ,
640- candidate.eta ,
641- candidate.phi ,
642- candidate.tpcInnerParam ,
643- candidate.clusterSizesITS ,
644- candidate.TPCsignal ,
645- candidate.beta ,
646- candidate.DCAxy ,
647- candidate.DCAz ,
648- candidate.flags ,
649- candidate.ptGenerated ,
650- candidate.mcProcess ,
651- candidate.pdgCode ,
652- candidate.motherPdgCode );
653- mNucleiTableExt (
654- candidate.nsigmaTpc ,
655- candidate.nsigmaTof );
656- }
657647 }
658648 PROCESS_SWITCH (nucleiQC, processMc, " Mc analysis" , false );
659649};
0 commit comments