@@ -93,6 +93,17 @@ static constexpr std::string_view kEvntType[] = {"SE/", "ME/"};
9393auto static constexpr kMinFt0cCell = 96 ;
9494AxisSpec axisEvent{10 , 0.5 , 9.5 , " #Event" , " EventAxis" };
9595
96+ namespace o2 ::aod
97+ {
98+ namespace longrangemultclass
99+ {
100+ DECLARE_SOA_COLUMN (Multiplicity, multiplicity, float ); // ! Centrality/multiplicity value
101+ } // namespace longrangemultclass
102+ DECLARE_SOA_TABLE (LRMultTables, " AOD" , " LRMULTTABLE" , longrangemultclass::Multiplicity); // ! Transient multiplicity table
103+
104+ using LRMultTable = LRMultTables::iterator;
105+ } // namespace o2::aod
106+
96107struct LongrangeCorrelation {
97108
98109 struct : ConfigurableGroup {
@@ -794,7 +805,77 @@ struct LongrangeCorrelation {
794805 PROCESS_SWITCH (LongrangeCorrelation, processFt0aFt0cME, " mixed event FT0a vs FT0c" , false );
795806};
796807
808+ struct MultiplicityClassifier {
809+ Produces<aod::LRMultTables> multvalue;
810+ Configurable<float > cfgEtaCut{" cfgEtaCut" , 0 .8f , " Eta range to consider" };
811+ Configurable<float > dcaZ{" dcaZ" , 0 .2f , " Custom DCA Z cut (ignored if negative)" };
812+ Configurable<float > cfgPtCutMin{" cfgPtCutMin" , 0 .2f , " minimum accepted track pT" };
813+ Configurable<float > cfgPtCutMax{" cfgPtCutMax" , 3 .0f , " maximum accepted track pT" };
814+
815+ Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::ITS) &&
816+ ncheckbit (aod::track::trackCutFlag, TrackSelectionIts);
817+ Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::TPC),
818+ ncheckbit (aod::track::trackCutFlag, TrackSelectionTpc), true );
819+ Filter fTrackSelectionDCA = ifnode(dcaZ.node() > 0 .f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDcaxyOnly),
820+ ncheckbit (aod::track::trackCutFlag, TrackSelectionDca));
821+ Filter fTracksEta = nabs(aod::track::eta) < cfgEtaCut;
822+ Filter fTracksPt = (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax);
823+
824+ void init (InitContext const &)
825+ {
826+ int enabledFunctions = 0 ;
827+ if (doprocessTracks) {
828+ enabledFunctions++;
829+ }
830+ if (doprocessFT0C) {
831+ enabledFunctions++;
832+ }
833+ if (doprocessFV0A) {
834+ enabledFunctions++;
835+ }
836+ if (doprocessFT0M) {
837+ enabledFunctions++;
838+ }
839+ if (enabledFunctions != 1 ) {
840+ LOGP (fatal, " {} multiplicity classifier enabled but we need exactly 1." , enabledFunctions);
841+ }
842+ }
843+
844+ void processTracks (aod::Collision const &, soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection>> const & tracks)
845+ {
846+ multvalue (tracks.size ());
847+ }
848+
849+ void processFT0C (aod::CentFT0Cs const & centralities)
850+ {
851+ for (auto & c : centralities) {
852+ multvalue (c.centFT0C ());
853+ }
854+ }
855+
856+ void processFV0A (aod::CentFV0As const & centralities)
857+ {
858+ for (auto & c : centralities) {
859+ multvalue (c.centFV0A ());
860+ }
861+ }
862+
863+ void processFT0M (aod::CentFT0Ms const & centralities)
864+ {
865+ for (auto & c : centralities) {
866+ multvalue (c.centFT0M ());
867+ }
868+ }
869+
870+ PROCESS_SWITCH (MultiplicityClassifier, processTracks, " Select track count as multiplicity" , false );
871+ PROCESS_SWITCH (MultiplicityClassifier, processFT0C, " Select FT0C centrality as multiplicity" , false );
872+ PROCESS_SWITCH (MultiplicityClassifier, processFV0A, " Select FV0A centrality as multiplicity" , false );
873+ PROCESS_SWITCH (MultiplicityClassifier, processFT0M, " Select FT0M centrality as multiplicity" , false );
874+ };
875+
797876WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
798877{
799- return WorkflowSpec{adaptAnalysisTask<LongrangeCorrelation>(cfgc)};
878+ return WorkflowSpec{
879+ adaptAnalysisTask<LongrangeCorrelation>(cfgc),
880+ adaptAnalysisTask<MultiplicityClassifier>(cfgc)};
800881}
0 commit comments