1717// Data (run3):
1818// o2-analysis-lf-nuclei-spectra, o2-analysis-timestamp
1919// o2-analysis-pid-tof-base, o2-analysis-multiplicity-table, o2-analysis-event-selection
20+ // (to add flow: o2-analysis-qvector-table, o2-analysis-centrality-table)
2021
2122#include < cmath>
2223
3233#include " Common/DataModel/TrackSelectionTables.h"
3334#include " Common/Core/PID/PIDTOF.h"
3435#include " Common/TableProducer/PID/pidTOFBase.h"
36+ #include " Common/Core/EventPlaneHelper.h"
37+ #include " Common/DataModel/Qvectors.h"
3538
3639#include " DataFormatsParameters/GRPMagField.h"
3740#include " DataFormatsParameters/GRPObject.h"
@@ -72,6 +75,7 @@ struct NucleusCandidate {
7275 uint8_t TPCcrossedRows;
7376 uint8_t ITSclsMap;
7477 uint8_t TPCnCls;
78+ int selCollIndex;
7579};
7680
7781namespace nuclei
@@ -161,6 +165,7 @@ struct nucleiSpectra {
161165
162166 Produces<o2::aod::NucleiTable> nucleiTable;
163167 Produces<o2::aod::NucleiTableMC> nucleiTableMC;
168+ Produces<o2::aod::NucleiFlowColls> nucleiFlowTable;
164169 Service<o2::ccdb::BasicCCDBManager> ccdb;
165170
166171 Configurable<std::string> cfgCentralityEstimator{" cfgCentralityEstimator" , " V0A" , " Centrality estimator name" };
@@ -214,6 +219,9 @@ struct nucleiSpectra {
214219
215220 using TrackCandidates = soa::Filtered<soa::Join<aod::TracksIU, aod::TracksCovIU, aod::TracksExtra, aod::TOFSignal, aod::TOFEvTime>>;
216221
222+ // Flow analysis
223+ using CollWithQvec = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::QvectorFT0Cs, aod::QvectorFT0As, aod::QvectorFT0Ms, aod::QvectorFV0As, aod::QvectorBPoss, aod::QvectorBNegs, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>>::iterator;
224+
217225 HistogramRegistry spectra{" spectra" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
218226 o2::pid::tof::Beta<TrackCandidates::iterator> responseBeta;
219227
@@ -308,10 +316,10 @@ struct nucleiSpectra {
308316 o2::base::Propagator::Instance (true )->setMatLUT (nuclei::lut);
309317 }
310318
311- template <typename TC >
312- void fillDataInfo (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>>::iterator const & collision, TC const & tracks)
319+ template <typename Tcoll, typename Ttrks >
320+ void fillDataInfo (Tcoll const & collision, Ttrks const & tracks)
313321 {
314- auto bc = collision.bc_as <aod::BCsWithTimestamps>();
322+ auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
315323 initCCDB (bc);
316324
317325 // collision process loop
@@ -422,8 +430,34 @@ struct nucleiSpectra {
422430 }
423431 }
424432 if (flag & (kProton | kDeuteron | kTriton | kHe3 | kHe4 )) {
433+ if constexpr (std::is_same<Tcoll, CollWithQvec>::value) {
434+ if (nuclei::candidates.empty ()) {
435+ nucleiFlowTable (collision.centFV0A (),
436+ collision.centFT0M (),
437+ collision.centFT0A (),
438+ collision.centFT0C (),
439+ collision.qvecFV0ARe (),
440+ collision.qvecFV0AIm (),
441+ collision.sumAmplFV0A (),
442+ collision.qvecFT0MRe (),
443+ collision.qvecFT0MIm (),
444+ collision.sumAmplFT0M (),
445+ collision.qvecFT0ARe (),
446+ collision.qvecFT0AIm (),
447+ collision.sumAmplFT0A (),
448+ collision.qvecFT0CRe (),
449+ collision.qvecFT0CIm (),
450+ collision.sumAmplFT0C (),
451+ collision.qvecBPosRe (),
452+ collision.qvecBPosIm (),
453+ collision.nTrkBPos (),
454+ collision.qvecBNegRe (),
455+ collision.qvecBNegIm (),
456+ collision.nTrkBNeg ());
457+ }
458+ }
425459 nuclei::candidates.emplace_back (NucleusCandidate{static_cast <int >(track.globalIndex ()), (1 - 2 * iC) * trackParCov.getPt (), trackParCov.getEta (), trackParCov.getPhi (), track.tpcInnerParam (), beta, collision.posZ (), dcaInfo[0 ], dcaInfo[1 ], track.tpcSignal (), track.itsChi2NCl (),
426- track.tpcChi2NCl (), flag, track.tpcNClsFindable (), static_cast <uint8_t >(track.tpcNClsCrossedRows ()), track.itsClusterMap (), static_cast <uint8_t >(track.tpcNClsFound ())});
460+ track.tpcChi2NCl (), flag, track.tpcNClsFindable (), static_cast <uint8_t >(track.tpcNClsCrossedRows ()), track.itsClusterMap (), static_cast <uint8_t >(track.tpcNClsFound ()), static_cast < int >(nucleiFlowTable. lastIndex ()) });
427461 }
428462 } // end loop over tracks
429463
@@ -436,11 +470,21 @@ struct nucleiSpectra {
436470 nuclei::candidates.clear ();
437471 fillDataInfo (collision, tracks);
438472 for (auto & c : nuclei::candidates) {
439- nucleiTable (c.pt , c.eta , c.phi , c.tpcInnerParam , c.beta , c.zVertex , c.DCAxy , c.DCAz , c.TPCsignal , c.ITSchi2 , c.TPCchi2 , c.flags , c.TPCfindableCls , c.TPCcrossedRows , c.ITSclsMap , c.TPCnCls );
473+ nucleiTable (c.pt , c.eta , c.phi , c.tpcInnerParam , c.beta , c.zVertex , c.DCAxy , c.DCAz , c.TPCsignal , c.ITSchi2 , c.TPCchi2 , c.flags , c.TPCfindableCls , c.TPCcrossedRows , c.ITSclsMap , c.TPCnCls , c. selCollIndex );
440474 }
441475 }
442476 PROCESS_SWITCH (nucleiSpectra, processData, " Data analysis" , true );
443477
478+ void processDataFlow (CollWithQvec const & collision, TrackCandidates const & tracks, aod::BCsWithTimestamps const &)
479+ {
480+ nuclei::candidates.clear ();
481+ fillDataInfo (collision, tracks);
482+ for (auto & c : nuclei::candidates) {
483+ nucleiTable (c.pt , c.eta , c.phi , c.tpcInnerParam , c.beta , c.zVertex , c.DCAxy , c.DCAz , c.TPCsignal , c.ITSchi2 , c.TPCchi2 , c.flags , c.TPCfindableCls , c.TPCcrossedRows , c.ITSclsMap , c.TPCnCls , c.selCollIndex );
484+ }
485+ }
486+ PROCESS_SWITCH (nucleiSpectra, processDataFlow, " Data analysis with flow" , false );
487+
444488 Preslice<TrackCandidates> tracksPerCollisions = aod::track::collisionId;
445489 void processMC (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels>> const & collisions, TrackCandidates const & tracks, aod::McTrackLabels const & trackLabelsMC, aod::McParticles const & particlesMC, aod::BCsWithTimestamps const &)
446490 {
0 commit comments