@@ -43,6 +43,7 @@ struct FlowEfficiencyCasc {
4343 O2_DEFINE_CONFIGURABLE (cfgCutPtMax, float , 3 .0f , " Maximal pT for tracks" )
4444 O2_DEFINE_CONFIGURABLE (cfgCutEta, float , 0 .8f , " Eta range for tracks" )
4545 O2_DEFINE_CONFIGURABLE (cfgCutChi2prTPCcls, float , 2 .5f , " max chi2 per TPC clusters" )
46+ O2_DEFINE_CONFIGURABLE (cfgCutOccupancyHigh, int , 500 , " High cut on TPC occupancy" )
4647 // topological cut for V0
4748 O2_DEFINE_CONFIGURABLE (cfgv0_radius, float , 5 .0f , " minimum decay radius" )
4849 O2_DEFINE_CONFIGURABLE (cfgv0_v0cospa, float , 0 .995f , " minimum cosine of pointing angle" )
@@ -67,7 +68,7 @@ struct FlowEfficiencyCasc {
6768 O2_DEFINE_CONFIGURABLE (cfgtpccrossoverfindable, int , 0 , " minimum number of Ratio crossed rows over findable clusters" )
6869 O2_DEFINE_CONFIGURABLE (cfgcheckDauTPC, bool , true , " check daughter tracks TPC or not" )
6970 O2_DEFINE_CONFIGURABLE (cfgcheckDauTOF, bool , false , " check daughter tracks TOF or not" )
70- O2_DEFINE_CONFIGURABLE (cfgcheckMCParticle, bool , false , " check the particle and deacy channel match or not" )
71+ O2_DEFINE_CONFIGURABLE (cfgcheckMCParticle, bool , false , " check the particle and deacy channel is MC true or not" )
7172 O2_DEFINE_CONFIGURABLE (cfgCasc_rapidity, float , 0.5 , " rapidity" )
7273
7374 O2_DEFINE_CONFIGURABLE (cfgNSigmatpctof, std::vector<float >, (std::vector<float >{3 , 3 , 3 }), " tpc and tof NSigma for Pion Kaon Proton" )
@@ -97,7 +98,7 @@ struct FlowEfficiencyCasc {
9798
9899 void init (InitContext const &)
99100 {
100- const AxisSpec axisCounter{1 , 0 , + 1 , " " };
101+ const AxisSpec axisCounter{2 , 0 , 2 , " " };
101102 // create histograms
102103 registry.add (" eventCounter" , " eventCounter" , kTH1F , {axisCounter});
103104 registry.add (" mcEventCounter" , " Monte Carlo Truth EventCounter" , kTH1F , {axisCounter});
@@ -111,13 +112,90 @@ struct FlowEfficiencyCasc {
111112 registry.add (" h3DRecLambda" , " " , {HistType::kTH3D , {cfgaxisPtV0, cfgaxisMultiplicity, axisLambdaMass}});
112113 registry.add (" h3DRecXi" , " " , {HistType::kTH3D , {cfgaxisPtXi, cfgaxisMultiplicity, axisXiMass}});
113114 registry.add (" h3DRecOmega" , " " , {HistType::kTH3D , {cfgaxisPtOmega, cfgaxisMultiplicity, axisOmegaMass}});
115+
116+ // V0 QA
117+ registry.add (" QAhisto/V0/hqaV0radiusbefore" , " " , {HistType::kTH1D , {{200 , 0 , 200 }}});
118+ registry.add (" QAhisto/V0/hqaV0radiusafter" , " " , {HistType::kTH1D , {{200 , 0 , 200 }}});
119+ registry.add (" QAhisto/V0/hqaV0cosPAbefore" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
120+ registry.add (" QAhisto/V0/hqaV0cosPAafter" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
121+ registry.add (" QAhisto/V0/hqadcaV0daubefore" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
122+ registry.add (" QAhisto/V0/hqadcaV0dauafter" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
123+ registry.add (" QAhisto/V0/hqaarm_podobefore" , " " , {HistType::kTH2D , {{100 , -1 , 1 }, {50 , 0 , 0.3 }}});
124+ registry.add (" QAhisto/V0/hqaarm_podoafter" , " " , {HistType::kTH2D , {{100 , -1 , 1 }, {50 , 0 , 0.3 }}});
125+ registry.add (" QAhisto/V0/hqadcapostoPVbefore" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
126+ registry.add (" QAhisto/V0/hqadcapostoPVafter" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
127+ registry.add (" QAhisto/V0/hqadcanegtoPVbefore" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
128+ registry.add (" QAhisto/V0/hqadcanegtoPVafter" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
129+ // Cascade QA
130+ registry.add (" QAhisto/Casc/hqaCasccosPAbefore" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
131+ registry.add (" QAhisto/Casc/hqaCasccosPAafter" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
132+ registry.add (" QAhisto/Casc/hqaCascV0cosPAbefore" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
133+ registry.add (" QAhisto/Casc/hqaCascV0cosPAafter" , " " , {HistType::kTH1D , {{1000 , 0.95 , 1 }}});
134+ registry.add (" QAhisto/Casc/hqadcaCascV0toPVbefore" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
135+ registry.add (" QAhisto/Casc/hqadcaCascV0toPVafter" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
136+ registry.add (" QAhisto/Casc/hqadcaCascBachtoPVbefore" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
137+ registry.add (" QAhisto/Casc/hqadcaCascBachtoPVafter" , " " , {HistType::kTH1D , {{1000 , -10 , 10 }}});
138+ registry.add (" QAhisto/Casc/hqadcaCascdaubefore" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
139+ registry.add (" QAhisto/Casc/hqadcaCascdauafter" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
140+ registry.add (" QAhisto/Casc/hqadcaCascV0daubefore" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
141+ registry.add (" QAhisto/Casc/hqadcaCascV0dauafter" , " " , {HistType::kTH1D , {{100 , 0 , 1 }}});
114142 }
143+ template <typename TCollision>
144+ bool eventSelected (TCollision collision)
145+ {
146+ if (collision.alias_bit (kTVXinTRD )) {
147+ // TRD triggered
148+ return false ;
149+ }
150+ if (!collision.selection_bit (o2::aod::evsel::kNoTimeFrameBorder )) {
151+ // reject collisions close to Time Frame borders
152+ // https://its.cern.ch/jira/browse/O2-4623
153+ return false ;
154+ }
155+ if (!collision.selection_bit (o2::aod::evsel::kNoITSROFrameBorder )) {
156+ // reject events affected by the ITS ROF border
157+ // https://its.cern.ch/jira/browse/O2-4309
158+ return false ;
159+ }
160+ if (!collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup )) {
161+ // rejects collisions which are associated with the same "found-by-T0" bunch crossing
162+ // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof
163+ return false ;
164+ }
165+ if (!collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV )) {
166+ // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference
167+ // use this cut at low multiplicities with caution
168+ return false ;
169+ }
170+ if (!collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
171+ // no collisions in specified time range
172+ return false ;
173+ }
174+ if (!collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll )) {
175+ // cut time intervals with dead ITS staves
176+ return false ;
177+ }
178+
179+ auto occupancy = collision.trackOccupancyInTimeRange ();
180+ if (occupancy > cfgCutOccupancyHigh)
181+ return false ;
182+
183+ // // V0A T0A 5 sigma cut
184+ // if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))
185+ // return false;
186+
187+ return true ;
188+ }
189+
115190
116191 void processRec (MyCollisions::iterator const & collision, V0MCCandidates const & V0s, CascMCCandidates const & Cascades, DaughterTracks const &, soa::Join<aod::CascMCCores, aod::CascMCCollRefs> const &, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const &)
117192 {
118193 registry.fill (HIST (" eventCounter" ), 0.5 );
119194 if (!collision.sel8 ())
120195 return ;
196+ if (eventSelected (collision))
197+ return ;
198+ registry.fill (HIST (" eventCounter" ), 1.5 );
121199 int rectracknum = collision.multNTracksGlobal ();
122200 registry.fill (HIST (" h2DCentvsNch" ), collision.centFT0C (), rectracknum);
123201 for (const auto & casc : Cascades) {
@@ -127,6 +205,13 @@ struct FlowEfficiencyCasc {
127205 auto negdau = casc.negTrackExtra_as <DaughterTracks>();
128206 auto posdau = casc.posTrackExtra_as <DaughterTracks>();
129207 auto bachelor = casc.bachTrackExtra_as <DaughterTracks>();
208+ // fill QA
209+ registry.fill (HIST (" QAhisto/Casc/hqaCasccosPAbefore" ), casc.casccosPA (collision.posX (), collision.posY (), collision.posZ ()));
210+ registry.fill (HIST (" QAhisto/Casc/hqaCascV0cosPAbefore" ), casc.v0cosPA (collision.posX (), collision.posY (), collision.posZ ()));
211+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascV0toPVbefore" ), casc.dcav0topv (collision.posX (), collision.posY (), collision.posZ ()));
212+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascBachtoPVbefore" ), casc.dcabachtopv ());
213+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascdaubefore" ), casc.dcacascdaughters ());
214+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascV0daubefore" ), casc.dcaV0daughters ());
130215 // track quality check
131216 if (bachelor.tpcNClsFound () < cfgtpcclusters)
132217 continue ;
@@ -157,13 +242,20 @@ struct FlowEfficiencyCasc {
157242 continue ;
158243 if (std::fabs (casc.mLambda () - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow)
159244 continue ;
245+ // fill QA
246+ registry.fill (HIST (" QAhisto/Casc/hqaCasccosPAafter" ), casc.casccosPA (collision.posX (), collision.posY (), collision.posZ ()));
247+ registry.fill (HIST (" QAhisto/Casc/hqaCascV0cosPAafter" ), casc.v0cosPA (collision.posX (), collision.posY (), collision.posZ ()));
248+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascV0toPVafter" ), casc.dcav0topv (collision.posX (), collision.posY (), collision.posZ ()));
249+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascBachtoPVafter" ), casc.dcabachtopv ());
250+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascdauafter" ), casc.dcacascdaughters ());
251+ registry.fill (HIST (" QAhisto/Casc/hqadcaCascV0dauafter" ), casc.dcaV0daughters ());
160252 // Omega and antiOmega
161253 int pdgCode{cascMC.pdgCode ()};
162254 if (!cfgcheckMCParticle || (std::abs (pdgCode) == kOmegaMinus && std::abs (cascMC.pdgCodeV0 ()) == kLambda0 && std::abs (cascMC.pdgCodeBachelor ()) == kKPlus )) {
163255 if (casc.sign () < 0 && (casc.mOmega () > 1.63 ) && (casc.mOmega () < 1.71 ) && std::fabs (casc.yOmega ()) < cfgCasc_rapidity &&
164256 (!cfgcheckDauTPC || (std::fabs (bachelor.tpcNSigmaKa ()) < cfgNSigma[2 ] && std::fabs (posdau.tpcNSigmaPr ()) < cfgNSigma[1 ] && std::fabs (negdau.tpcNSigmaPi ()) < cfgNSigma[0 ]))) {
165257 registry.fill (HIST (" h3DRecOmega" ), casc.pt (), rectracknum, casc.mOmega ());
166- } else if (casc.sign () < 0 && (casc.mOmega () > 1.63 ) && (casc.mOmega () < 1.71 ) && std::fabs (casc.yOmega ()) < cfgCasc_rapidity &&
258+ } else if (casc.sign () > 0 && (casc.mOmega () > 1.63 ) && (casc.mOmega () < 1.71 ) && std::fabs (casc.yOmega ()) < cfgCasc_rapidity &&
167259 (!cfgcheckDauTPC || (std::fabs (bachelor.tpcNSigmaKa ()) < cfgNSigma[2 ] && std::fabs (negdau.tpcNSigmaPr ()) < cfgNSigma[1 ] && std::fabs (posdau.tpcNSigmaPi ()) < cfgNSigma[0 ]))) {
168260 registry.fill (HIST (" h3DRecOmega" ), casc.pt (), rectracknum, casc.mOmega ());
169261 }
@@ -173,7 +265,7 @@ struct FlowEfficiencyCasc {
173265 if (casc.sign () < 0 && (casc.mXi () > 1.30 ) && (casc.mXi () < 1.37 ) && std::fabs (casc.yXi ()) < cfgCasc_rapidity &&
174266 (!cfgcheckDauTPC || (std::fabs (bachelor.tpcNSigmaPi ()) < cfgNSigma[0 ] && std::fabs (posdau.tpcNSigmaPr ()) < cfgNSigma[1 ] && std::fabs (negdau.tpcNSigmaPi ()) < cfgNSigma[0 ]))) {
175267 registry.fill (HIST (" h3DRecXi" ), casc.pt (), rectracknum, casc.mXi ());
176- } else if (casc.sign () < 0 && (casc.mXi () > 1.30 ) && (casc.mXi () < 1.37 ) && std::fabs (casc.yXi ()) < cfgCasc_rapidity &&
268+ } else if (casc.sign () > 0 && (casc.mXi () > 1.30 ) && (casc.mXi () < 1.37 ) && std::fabs (casc.yXi ()) < cfgCasc_rapidity &&
177269 (!cfgcheckDauTPC || (std::fabs (bachelor.tpcNSigmaPi ()) < cfgNSigma[0 ] && std::fabs (negdau.tpcNSigmaPr ()) < cfgNSigma[1 ] && std::fabs (posdau.tpcNSigmaPi ()) < cfgNSigma[0 ]))) {
178270 registry.fill (HIST (" h3DRecXi" ), casc.pt (), rectracknum, casc.mXi ());
179271 }
@@ -187,6 +279,13 @@ struct FlowEfficiencyCasc {
187279 auto v0negdau = v0.negTrackExtra_as <DaughterTracks>();
188280 auto v0posdau = v0.posTrackExtra_as <DaughterTracks>();
189281
282+ // fill QA before cut
283+ registry.fill (HIST (" QAhisto/V0/hqaV0radiusbefore" ), v0.v0radius ());
284+ registry.fill (HIST (" QAhisto/V0/hqaV0cosPAbefore" ), v0.v0cosPA ());
285+ registry.fill (HIST (" QAhisto/V0/hqadcaV0daubefore" ), v0.dcaV0daughters ());
286+ registry.fill (HIST (" QAhisto/V0/hqadcapostoPVbefore" ), v0.dcapostopv ());
287+ registry.fill (HIST (" QAhisto/V0/hqadcanegtoPVbefore" ), v0.dcanegtopv ());
288+ registry.fill (HIST (" QAhisto/V0/hqaarm_podobefore" ), v0.alpha (), v0.qtarm ());
190289 // track quality check
191290 if (v0posdau.tpcNClsFound () < cfgtpcclusters)
192291 continue ;
@@ -213,13 +312,20 @@ struct FlowEfficiencyCasc {
213312 continue ;
214313 if (std::fabs (v0.dcanegtopv ()) < cfgv0_dcadautopv)
215314 continue ;
315+ // fill QA after cut
316+ registry.fill (HIST (" QAhisto/V0/hqaV0radiusafter" ), v0.v0radius ());
317+ registry.fill (HIST (" QAhisto/V0/hqaV0cosPAafter" ), v0.v0cosPA ());
318+ registry.fill (HIST (" QAhisto/V0/hqadcaV0dauafter" ), v0.dcaV0daughters ());
319+ registry.fill (HIST (" QAhisto/V0/hqadcapostoPVafter" ), v0.dcapostopv ());
320+ registry.fill (HIST (" QAhisto/V0/hqadcanegtoPVafter" ), v0.dcanegtopv ());
216321
217322 int pdgCode{v0MC.pdgCode ()};
218323 // K0short
219324 if (!cfgcheckMCParticle || (std::abs (pdgCode) == kK0Short && v0MC.pdgCodePositive () == kPiPlus && v0MC.pdgCodeNegative () == kPiMinus )) {
220325 if (v0.qtarm () / std::fabs (v0.alpha ()) > cfgv0_ArmPodocut && std::fabs (v0.y ()) < 0.5 && std::fabs (v0.mK0Short () - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow &&
221326 (!cfgcheckDauTPC || (std::fabs (v0posdau.tpcNSigmaPi ()) < cfgNSigma[0 ] && std::fabs (v0negdau.tpcNSigmaPi ()) < cfgNSigma[0 ]))) {
222327 registry.fill (HIST (" h3DRecK0s" ), v0.pt (), rectracknum, v0.mK0Short ());
328+ registry.fill (HIST (" QAhisto/V0/hqaarm_podoafter" ), v0.alpha (), v0.qtarm ());
223329 }
224330 }
225331 // Lambda and antiLambda
0 commit comments