@@ -46,12 +46,15 @@ using namespace o2::framework::expressions;
4646
4747// / Writes the full information in an output TTree
4848struct LfTreeCreatorNuclei {
49- Produces<o2::aod::LfCandNucleusFull> rowCandidateFull ;
50- Produces<o2::aod::LfCandNucleusFullEvents> rowCandidateFullEvents ;
51- Produces<o2::aod::LfCandNucleusMC> rowCandidateMC ;
49+ Produces<o2::aod::LfCandNucleusFullEvents> tableEvents ;
50+ Produces<o2::aod::LfCandNucleusFull> tableCandidate ;
51+ Produces<o2::aod::LfCandNucleusMC> tableCandidateMC ;
5252
5353 void init (o2::framework::InitContext&)
5454 {
55+ if (doprocessData == true && doprocessMC == true ) {
56+ LOGF (fatal, " Cannot enable processData and processMC at the same time. Please choose one." );
57+ }
5558 }
5659
5760 // track
@@ -69,97 +72,97 @@ struct LfTreeCreatorNuclei {
6972 Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex;
7073 Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (requireGlobalTrackInFilter());
7174 Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz);
75+ using EventCandidates = soa::Join<aod::Collisions, aod::EvSels, aod::Mults>;
7276 using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksExtended, aod::TrackSelection,
7377 aod::pidTOFbeta, aod::TOFSignal,
7478 aod::pidTPCFullPi, aod::pidTOFFullPi,
7579 aod::pidTPCFullKa, aod::pidTOFFullKa,
7680 aod::pidTPCFullPr, aod::pidTOFFullPr,
7781 aod::pidTPCFullDe, aod::pidTOFFullDe,
7882 aod::pidTPCFullHe, aod::pidTOFFullHe>;
79- int nevs = 0 ;
80- void process (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults>> const & collisions,
81- soa::Filtered<TrackCandidates> const & tracks, aod::BCs const &)
83+
84+ template <bool isMC, typename TrackType, typename CollisionType>
85+ void fillForOneEvent (CollisionType const & collision, TrackType const & tracks)
86+ {
87+ // Filling event properties
88+ tableEvents (collision.bcId (),
89+ collision.numContrib (),
90+ collision.posX (),
91+ collision.posY (),
92+ collision.posZ (),
93+ collision.multFV0M (),
94+ collision.sel8 (),
95+ collision.bc ().runNumber ());
96+
97+ // Filling candidate properties
98+ tableCandidate.reserve (tracks.size ());
99+ if constexpr (isMC) {
100+ tableCandidateMC.reserve (tracks.size ());
101+ }
102+ for (auto & track : tracks) {
103+ // auto const& mcParticle = track.mcParticle();
104+ tableCandidate (
105+ tableEvents.lastIndex (),
106+ track.dcaXY (),
107+ track.dcaZ (),
108+ track.tpcNSigmaPi (), track.tpcNSigmaKa (), track.tpcNSigmaPr (),
109+ track.tpcNSigmaDe (), track.tpcNSigmaHe (),
110+ track.tofNSigmaPi (), track.tofNSigmaKa (), track.tofNSigmaPr (),
111+ track.tofNSigmaDe (), track.tofNSigmaHe (),
112+ track.hasTOF (),
113+ track.tpcInnerParam (),
114+ track.tpcSignal (),
115+ track.beta (),
116+ track.px (),
117+ track.py (),
118+ track.pz (),
119+ track.pt (),
120+ track.p (),
121+ track.eta (),
122+ track.phi (),
123+ track.sign (),
124+ track.tpcNClsCrossedRows (),
125+ track.tpcCrossedRowsOverFindableCls (),
126+ track.tpcChi2NCl (),
127+ track.itsChi2NCl ());
128+
129+ if constexpr (isMC) { // Filling MC reco information
130+ if (track.has_mcParticle ()) {
131+ const auto & particle = track.mcParticle ();
132+ tableCandidateMC (particle.pdgCode ());
133+ continue ;
134+ }
135+ tableCandidateMC (0 );
136+ }
137+ }
138+ }
139+
140+ void processData (soa::Filtered<EventCandidates> const & collisions,
141+ soa::Filtered<TrackCandidates> const & tracks, aod::BCs const &)
82142 {
83143 for (const auto & collision : collisions) {
84- LOG (INFO) << " nevs=" << nevs++;
85144 if (useEvsel && !collision.sel8 ()) {
86145 return ;
87146 }
88- // std::cout<<"mc Z-vertex ====>"<<mcColl.posZ()<<std::endl;
89- /* for(auto& mcCollItr : mcCollisions)
90- {}*/
91- // Filling event properties
92- rowCandidateFullEvents (
93- collision.bcId (),
94- collision.numContrib (),
95- collision.posX (),
96- collision.posY (),
97- collision.posZ (),
98- collision.multFV0M (),
99- collision.sel8 (),
100- collision.bc ().runNumber ());
101-
102- // Filling candidate properties
103147 const auto & tracksInCollision = tracks.sliceBy (aod::track::collisionId, collision.globalIndex ());
104- rowCandidateFull.reserve (tracksInCollision.size ());
105- for (auto & track : tracksInCollision) {
106- // auto const& mcParticle = track.mcParticle();
107- // std::cout<<"mc pdg code ====>"<<mcParticle.pdgCode()<<std::endl;
108- // std::cout<<"mc physical primary ====>"<<mcParticle.isPhysicalPrimary()<<std::endl;
109- // std::cout<<"eta-gen ====>"<<mcParticle.eta()<<" eta-reco"<<track.eta()<<std::endl;
110- rowCandidateFull (
111- rowCandidateFullEvents.lastIndex (),
112- track.dcaXY (),
113- track.dcaZ (),
114- track.tpcNSigmaPi (), track.tpcNSigmaKa (), track.tpcNSigmaPr (),
115- track.tpcNSigmaDe (), track.tpcNSigmaHe (),
116- track.tofNSigmaPi (), track.tofNSigmaKa (), track.tofNSigmaPr (),
117- track.tofNSigmaDe (), track.tofNSigmaHe (),
118- track.hasTOF (),
119- track.tpcInnerParam (),
120- track.tpcSignal (),
121- track.beta (),
122- track.px (),
123- track.py (),
124- track.pz (),
125- track.pt (),
126- track.p (),
127- track.eta (),
128- track.phi (),
129- track.sign (),
130- track.tpcNClsCrossedRows (),
131- track.tpcCrossedRowsOverFindableCls (),
132- track.tpcChi2NCl (),
133- track.itsChi2NCl ());
134- }
148+ fillForOneEvent<false >(collision, tracksInCollision);
135149 }
136150 }
137- int nevsmc = 0 ;
138- void processMC (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels>> const & collisions,
151+ PROCESS_SWITCH (LfTreeCreatorNuclei, processData, " process Data" , true );
152+
153+ void processMC (soa::Filtered<soa::Join<EventCandidates, aod::McCollisionLabels>> const & collisions,
139154 soa::Filtered<soa::Join<TrackCandidates, aod::McTrackLabels>> const & tracks,
140155 aod::BCs const &, aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles)
141156 {
142157 for (const auto & collision : collisions) {
143- LOG (INFO) << " nevsmc=" << nevsmc++;
144158 if (useEvsel && !collision.sel8 ()) {
145159 return ;
146160 }
147161 const auto & tracksInCollision = tracks.sliceBy (aod::track::collisionId, collision.globalIndex ());
148- rowCandidateMC.reserve (tracksInCollision.size ());
149- LOG (info) << tracks.size () << " " << tracksInCollision.size ();
150- for (const auto & track : tracksInCollision)
151- // for(const auto& track: tracks)
152- {
153- if (track.has_mcParticle ()) {
154- const auto & particle = track.mcParticle ();
155- rowCandidateMC (particle.pdgCode ());
156- continue ;
157- }
158- rowCandidateMC (0 );
159- }
162+ fillForOneEvent<true >(collision, tracksInCollision);
160163 }
161164 }
162- PROCESS_SWITCH (LfTreeCreatorNuclei, processMC, " process MC" , true );
165+ PROCESS_SWITCH (LfTreeCreatorNuclei, processMC, " process MC" , false );
163166};
164167
165168WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments