@@ -110,6 +110,7 @@ struct nucleiQC {
110110 Configurable<int > cfgTrackTunerConfigSource{" cfgTrackTunerConfigSource" , aod::track_tuner::InputString, " 1: input string; 2: TrackTuner Configurables" };
111111 ConfigurableAxis cfgAxisPtQA{" axisPtQA" , {VARIABLE_WIDTH, 0 .0f , 0 .1f , 0 .2f , 0 .3f , 0 .4f , 0 .5f , 0 .6f , 0 .7f , 0 .8f , 0 .9f , 1 .0f , 1 .1f , 1 .2f , 1 .3f , 1 .4f , 1 .5f , 1 .6f , 1 .7f , 1 .8f , 1 .9f , 2 .0f , 2 .2f , 2 .4f , 2 .6f , 2 .8f , 3 .0f , 3 .2f , 3 .4f , 3 .6f , 3 .8f , 4 .0f , 4 .4f , 4 .8f , 5 .2f , 5 .6f , 6 .0f , 6 .5f , 7 .0f , 7 .5f , 8 .0f , 9 .0f , 10 .0f , 11 .0f , 12 .0f , 13 .0f , 14 .0f , 15 .0f , 17 .0f , 19 .0f , 21 .0f , 23 .0f , 25 .0f , 30 .0f , 35 .0f , 40 .0f , 50 .0f }, " pt axis for QA histograms" };
112112
113+ Configurable<bool > cfgRapidityToggle{" cfgRapidityToggle" , false , " If true, cut on rapidity for reconstructed particles" };
113114 Configurable<float > cfgRapidityMin{" cfgRapidityMin" , -1 ., " Minimum rapidity value" };
114115 Configurable<float > cfgRapidityMax{" cfgRapidityMax" , 1 ., " Maximum rapidity value" };
115116 Configurable<float > cfgRapidityCenterMass{" cfgRapidityCenterMass" , 0 .0f , " Center of mass rapidity" };
@@ -347,10 +348,8 @@ struct nucleiQC {
347348 }
348349 }
349350
350- template <typename Tcollision, typename Ttrack>
351- void fillNucleusFlagsPdgs (const int iSpecies, const Tcollision& collision, const Ttrack& track, nuclei::SlimCandidate& candidate)
351+ void fillSpeciesFlags (const int iSpecies, nuclei::SlimCandidate& candidate)
352352 {
353- candidate.flags = static_cast <uint16_t >((track.pidForTracking () & 0xF ) << 12 );
354353
355354 switch (iSpecies) {
356355 case nuclei::Species::kPr :
@@ -372,6 +371,14 @@ struct nucleiQC {
372371 candidate.flags |= 0 ;
373372 break ;
374373 }
374+ }
375+
376+ template <typename Tcollision, typename Ttrack>
377+ void fillNucleusFlagsPdgs (const int iSpecies, const Tcollision& collision, const Ttrack& track, nuclei::SlimCandidate& candidate)
378+ {
379+ candidate.flags = static_cast <uint16_t >((track.pidForTracking () & 0xF ) << 12 );
380+
381+ fillSpeciesFlags (iSpecies, candidate);
375382
376383 if (track.hasTOF ())
377384 candidate.flags |= nuclei::Flags::kHasTOF ;
@@ -508,110 +515,117 @@ struct nucleiQC {
508515 }
509516 }
510517
511- void processMc (const Collision& collision , const TrackCandidatesMC& tracks, const aod::BCsWithTimestamps&, const aod::McParticles& mcParticles)
518+ void processMc (const Collisions& collisions , const TrackCandidatesMC& tracks, const aod::BCsWithTimestamps&, const aod::McParticles& mcParticles)
512519 {
513-
514520 gRandom ->SetSeed (67 );
515521 mNucleiCandidates .clear ();
516- mFilledMcParticleIds . clear ( );
522+ std::vector< bool > reconstructedMcParticles (mcParticles. size (), false );
517523
518- auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
519- initCCDB (bc);
524+ for (const auto & collision : collisions) {
520525
521- if (! nuclei::eventSelection (collision, mHistograms , cfgEventSelections, cfgCutVertex))
522- return ;
526+ auto bc = collision. template bc_as <aod::BCsWithTimestamps>();
527+ initCCDB (bc) ;
523528
524- bool anyTrackTuner = false ;
525- for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
526- anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
527- }
528- if (anyTrackTuner && mTrackTuner .autoDetectDcaCalib && !mTrackTuner .areGraphsConfigured ) {
529+ if (!nuclei::eventSelection (collision, mHistograms , cfgEventSelections, cfgCutVertex))
530+ continue ;
529531
530- mTrackTuner .setRunNumber (mRunNumber );
532+ bool anyTrackTuner = false ;
533+ for (int iSpecies = 0 ; iSpecies < static_cast <int >(nuclei::Species::kNspecies ); iSpecies++) {
534+ anyTrackTuner = anyTrackTuner || cfgUseTrackTuner->get (iSpecies);
535+ }
536+ if (anyTrackTuner && mTrackTuner .autoDetectDcaCalib && !mTrackTuner .areGraphsConfigured ) {
531537
532- // / setup the "auto-detected" path based on the run number
533- mTrackTuner .getPathInputFileAutomaticFromCCDB ();
534- mHistTrackTunedTracks ->SetTitle (mTrackTuner .outputString .c_str ());
535- mTrackTuner .getDcaGraphs ();
536- }
538+ mTrackTuner .setRunNumber (mRunNumber );
539+
540+ // / setup the "auto-detected" path based on the run number
541+ mTrackTuner .getPathInputFileAutomaticFromCCDB ();
542+ mHistTrackTunedTracks ->SetTitle (mTrackTuner .outputString .c_str ());
543+ mTrackTuner .getDcaGraphs ();
544+ }
545+
546+ auto tracksThisCollision = tracks.sliceBy (mTracksPerCollision , collision.globalIndex ());
547+ for (const auto & track : tracksThisCollision) {
537548
538- auto tracksThisCollision = tracks.sliceBy (mTracksPerCollision , collision.globalIndex ());
539- tracksThisCollision.bindExternalIndices (&tracks);
549+ static_for<0 , nuclei::kNspecies - 1 >([&](auto iSpecies) {
550+ constexpr int kSpeciesCt = decltype (iSpecies)::value;
551+ const int kSpeciesRt = kSpeciesCt ;
540552
541- for (const auto & track : tracks) {
553+ if (std::find (mSpeciesToProcess .begin (), mSpeciesToProcess .end (), kSpeciesRt ) == mSpeciesToProcess .end ())
554+ return ;
542555
543- static_for<0 , nuclei::kNspecies - 1 >([&](auto iSpecies) {
544- constexpr int kSpeciesCt = decltype (iSpecies)::value;
545- const int kSpeciesRt = kSpeciesCt ;
556+ if (!track.has_mcParticle ())
557+ return ;
546558
547- if (std::find (mSpeciesToProcess .begin (), mSpeciesToProcess .end (), kSpeciesRt ) == mSpeciesToProcess .end ())
548- return ;
559+ if (track.mcParticleId () < -1 || track.mcParticleId () >= mcParticles.size ())
560+ return ;
561+ const auto & particle = mcParticles.iteratorAt (track.mcParticleId ());
549562
550- if (!track.has_mcParticle ())
551- return ;
563+ if (cfgDoCheckPdgCode) {
564+ if (std::abs (particle.pdgCode ()) != nuclei::pdgCodes[kSpeciesRt ])
565+ return ;
566+ }
552567
553- const auto & particle = track.mcParticle ();
554- if (cfgDoCheckPdgCode) {
555- if (std::abs (particle.pdgCode ()) != nuclei::pdgCodes[kSpeciesRt ])
568+ if (cfgDownscalingFactor->get (kSpeciesRt ) < 1 .) {
569+ if ((gRandom ->Uniform ()) > cfgDownscalingFactor->get (kSpeciesRt ))
570+ return ;
571+ }
572+
573+ if (cfgRapidityToggle && ((particle.y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle.y () - cfgRapidityCenterMass) > cfgRapidityMax))
556574 return ;
557- }
558575
559- if (cfgDownscalingFactor->get (kSpeciesRt ) < 1 .) {
560- if ((gRandom ->Uniform ()) > cfgDownscalingFactor->get (kSpeciesRt ))
576+ if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
561577 return ;
562- }
563578
564- if ((particle.y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle.y () - cfgRapidityCenterMass) > cfgRapidityMax)
565- return ;
579+ LOG (info) << " track passed physical primary cut" ;
566580
567- if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
568- return ;
581+ mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kNoCuts );
582+ if (!trackSelection<kSpeciesRt >(track))
583+ return ;
584+ mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kTrackCuts );
569585
570- mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kNoCuts );
571- if (!trackSelection<kSpeciesRt >(track))
572- return ;
573- mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kTrackCuts );
586+ if (!pidSelection<kSpeciesRt >(track, collision))
587+ return ;
588+ mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kPidCuts );
574589
575- if (!pidSelection<kSpeciesRt >(track, collision))
576- return ;
577- mHistograms .fill (HIST (nuclei::cNames[kSpeciesCt ]) + HIST (" /hTrackSelections" ), nuclei::trackSelection::kPidCuts );
590+ nuclei::SlimCandidate candidate;
591+ candidate = fillCandidate</* isMc*/ true >(kSpeciesCt , collision, track);
578592
579- nuclei::SlimCandidate candidate;
580- candidate = fillCandidate< /* isMc */ true >( kSpeciesCt , collision, track) ;
593+ mNucleiCandidates . emplace_back ( candidate) ;
594+ reconstructedMcParticles[particle. globalIndex ()] = true ;
581595
582- mNucleiCandidates .emplace_back (candidate);
583- mFilledMcParticleIds .emplace_back (particle.globalIndex ());
584- dispatchFillHistograms</* isGenerated*/ true >(kSpeciesRt , candidate);
585- dispatchFillHistograms</* isGenerated*/ false >(kSpeciesRt , candidate);
586- });
596+ dispatchFillHistograms</* isGenerated*/ true >(kSpeciesRt , candidate);
597+ dispatchFillHistograms</* isGenerated*/ false >(kSpeciesRt , candidate);
598+ });
599+ }
587600 }
588601
589- const int mcCollisionId = collision.mcCollisionId ();
590- auto mcParticlesThisCollision = mcParticles.sliceBy (mMcParticlesPerCollision , mcCollisionId);
591- mcParticlesThisCollision.bindExternalIndices (&mcParticles);
602+ int mcIndex = -1 ;
603+ for (const auto & particle : mcParticles) {
592604
593- for ( const auto & particle : mcParticlesThisCollision) {
605+ mcIndex++;
594606
595- if (std::find (mFilledMcParticleIds .begin (), mFilledMcParticleIds .end (), particle.globalIndex ()) != mFilledMcParticleIds .end ())
607+ int iSpecies = nuclei::getSpeciesFromPdg (particle.pdgCode ());
608+ if (std::find (mSpeciesToProcess .begin (), mSpeciesToProcess .end (), iSpecies) == mSpeciesToProcess .end ())
596609 continue ;
597610
598- if (cfgFillOnlyPhysicalPrimaries && ! particle.isPhysicalPrimary () )
611+ if ((particle. y () - cfgRapidityCenterMass) < cfgRapidityMin || ( particle.y () - cfgRapidityCenterMass) > cfgRapidityMax )
599612 continue ;
600613
601- if ((particle. y () - cfgRapidityCenterMass) < cfgRapidityMin || (particle. y () - cfgRapidityCenterMass) > cfgRapidityMax )
614+ if (reconstructedMcParticles[mcIndex] )
602615 continue ;
603616
604- int iSpecies = nuclei::getSpeciesFromPdg (particle.pdgCode ());
605- if (std::find (mSpeciesToProcess .begin (), mSpeciesToProcess .end (), iSpecies) == mSpeciesToProcess .end ())
617+ if (cfgFillOnlyPhysicalPrimaries && !particle.isPhysicalPrimary ())
606618 continue ;
607619
608620 if (cfgDownscalingFactor->get (iSpecies) < 1 .) {
609621 if ((gRandom ->Uniform ()) > cfgDownscalingFactor->get (iSpecies))
610- return ;
622+ continue ;
611623 }
612624
613625 nuclei::SlimCandidate candidate;
614- candidate.centrality = nuclei::getCentrality (collision, cfgCentralityEstimator, mHistFailCentrality );
626+ // candidate.centrality = nuclei::getCentrality(collision, cfgCentralityEstimator, mHistFailCentrality);
627+ candidate.centrality = -1 .f ; // centrality is not well defined for non-reconstructed particles, set to -1 for now
628+ fillSpeciesFlags (iSpecies, candidate);
615629 fillNucleusFlagsPdgsMc (particle, candidate);
616630 fillNucleusGeneratedVariables (particle, candidate);
617631
0 commit comments