1919#include " PWGUD/DataModel/UDTables.h"
2020
2121#include " Common/CCDB/EventSelectionParams.h"
22+ #include " Common/CCDB/RCTSelectionFlags.h"
2223#include " Common/DataModel/EventSelection.h"
2324#include " Common/DataModel/PIDResponseTOF.h"
2425#include " Common/DataModel/PIDResponseTPC.h"
5051#include < limits>
5152#include < map>
5253#include < numeric>
54+ #include < string>
5355#include < unordered_map>
5456#include < unordered_set>
5557#include < utility>
5658#include < vector>
5759
5860using namespace o2 ::framework;
5961using namespace o2 ::framework::expressions;
62+ using namespace o2 ::aod::rctsel;
6063
6164struct UpcCandProducer {
6265 bool fDoMC {false };
@@ -91,6 +94,9 @@ struct UpcCandProducer {
9194 std::vector<bool > fwdSelectors;
9295 std::vector<bool > barrelSelectors;
9396
97+ // RCT flag checker
98+ RCTFlagsChecker myRCTChecker;
99+
94100 // skimmer flags
95101 // choose a source of signal MC events
96102 Configurable<int > fSignalGenID {" signalGenID" , 1 , " Signal generator ID" };
@@ -125,9 +131,16 @@ struct UpcCandProducer {
125131 Configurable<bool > fRequireNoTimeFrameBorder {" requireNoTimeFrameBorder" , true , " Require kNoTimeFrameBorder selection bit" };
126132 Configurable<bool > fRequireNoITSROFrameBorder {" requireNoITSROFrameBorder" , true , " Require kNoITSROFrameBorder selection bit" };
127133
134+ Configurable<std::string> rctLabel{" rctLabel" , " muon" , " RCT label to use, options: CBT, CBT_hadronPID, CBT_electronPID, CBT_calo, CBT_muon, CBT_muon_glo, muon = FV0 + MID + MCH, muon_glo = muon + MFT, none = do not use RCT flags" };
135+ Configurable<bool > checkZDC{" checkZDC" , false , " Consider ZDC quality" };
136+ Configurable<bool > useLAasBad{" useLAasBad" , false , " Consider Lim acc flag as Bad" };
137+ bool useRCTflags = true ;
138+
128139 // QA histograms
129140 HistogramRegistry histRegistry{" HistRegistry" , {}, OutputObjHandlingPolicy::AnalysisObject};
130141
142+ using CollisionsSels = o2::soa::Join<o2::aod::Collisions, o2::aod::EvSels>;
143+
131144 using BCsWithBcSels = o2::soa::Join<o2::aod::BCs, o2::aod::BcSels, o2::aod::BCFlags>;
132145
133146 using ForwardTracks = o2::soa::Join<o2::aod::UDFwdTracksProp, o2::aod::UDFwdTracksCovProp>;
@@ -146,6 +159,34 @@ struct UpcCandProducer {
146159
147160 upcCuts = (UPCCutparHolder)inputCuts;
148161
162+ // initialize RCT flag checker
163+ if (rctLabel.value != " none" && rctLabel.value != " muon" && rctLabel.value != " muon_glo" ) {
164+ myRCTChecker.init (rctLabel.value , checkZDC.value , useLAasBad.value );
165+ } else if (rctLabel.value == " none" ) {
166+ useRCTflags = false ;
167+ myRCTChecker.init (" CBT_muon" );
168+ } else if (rctLabel.value == " muon" ) {
169+ if (checkZDC.value && useLAasBad.value ) {
170+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kZDCBad , kMCHLimAccMCRepr , kMIDLimAccMCRepr });
171+ } else if (checkZDC.value ) {
172+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kZDCBad });
173+ } else if (useLAasBad.value ) {
174+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kMCHLimAccMCRepr , kMIDLimAccMCRepr });
175+ } else {
176+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad });
177+ }
178+ } else if (rctLabel.value == " muon_glo" ) {
179+ if (checkZDC.value && useLAasBad.value ) {
180+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kMFTBad , kZDCBad , kMCHLimAccMCRepr , kMIDLimAccMCRepr , kMFTLimAccMCRepr });
181+ } else if (checkZDC.value ) {
182+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kMFTBad , kZDCBad });
183+ } else if (useLAasBad.value ) {
184+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kMFTBad , kMCHLimAccMCRepr , kMIDLimAccMCRepr , kMFTLimAccMCRepr });
185+ } else {
186+ myRCTChecker.init ({kFV0Bad , kMCHBad , kMIDBad , kMFTBad });
187+ }
188+ }
189+
149190 const AxisSpec axisTrgCounters{10 , 0.5 , 10.5 , " " };
150191 histRegistry.add (" hCountersTrg" , " " , kTH1F , {axisTrgCounters});
151192 histRegistry.get <TH1>(HIST (" hCountersTrg" ))->GetXaxis ()->SetBinLabel (1 , " TCE" );
@@ -179,6 +220,11 @@ struct UpcCandProducer {
179220 histRegistry.get <TH1>(HIST (" BarrelsSelCounter" ))->GetXaxis ()->SetBinLabel (upchelpers::kBarrelSelTPCChi2 + 1 , " TPCChi2" );
180221 histRegistry.get <TH1>(HIST (" BarrelsSelCounter" ))->GetXaxis ()->SetBinLabel (upchelpers::kBarrelSelDCAXY + 1 , " DCAXY" );
181222 histRegistry.get <TH1>(HIST (" BarrelsSelCounter" ))->GetXaxis ()->SetBinLabel (upchelpers::kBarrelSelDCAZ + 1 , " DCAZ" );
223+
224+ histRegistry.add (" RCTSelCounter" , " RCTSelCounter" , kTH1F , {{3 , 0.5 , 3.5 }});
225+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->GetXaxis ()->SetBinLabel (1 , " Before RCT sel" );
226+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->GetXaxis ()->SetBinLabel (2 , " After RCT sel" );
227+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->GetXaxis ()->SetBinLabel (3 , " RCT rejected" );
182228 }
183229
184230 template <typename T>
@@ -682,6 +728,13 @@ struct UpcCandProducer {
682728 uint64_t trackBC = 0 ;
683729 if (trk.has_collision ()) {
684730 const auto & col = trk.collision ();
731+ auto bcRCT = col.bc_as <TBCs>();
732+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (1 );
733+ if (!myRCTChecker (bcRCT) && useRCTflags) {
734+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (3 );
735+ continue ;
736+ }
737+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (2 );
685738 nContrib = col.numContrib ();
686739 trackBC = col.bc_as <TBCs>().globalBC ();
687740 hasTrackBC = true ;
@@ -725,6 +778,13 @@ struct UpcCandProducer {
725778 if (!trk.has_collision ())
726779 continue ;
727780 const auto & col = trk.collision ();
781+ auto bcRCT = col.bc_as <TBCs>();
782+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (1 );
783+ if (!myRCTChecker (bcRCT) && useRCTflags) {
784+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (3 );
785+ continue ;
786+ }
787+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (2 );
728788 nContrib = col.numContrib ();
729789 trackBC = col.bc_as <TBCs>().globalBC ();
730790 hasTrackBC = true ;
@@ -765,6 +825,13 @@ struct UpcCandProducer {
765825 if (!trk.has_collision ())
766826 continue ;
767827 const auto & col = trk.collision ();
828+ auto bcRCT = col.bc_as <TBCs>();
829+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (1 );
830+ if (!myRCTChecker (bcRCT) && useRCTflags) {
831+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (3 );
832+ continue ;
833+ }
834+ histRegistry.get <TH1>(HIST (" RCTSelCounter" ))->Fill (2 );
768835 nContrib = col.numContrib ();
769836 trackBC = col.bc_as <TBCs>().globalBC ();
770837 const auto & bc = col.bc_as <TBCs>();
0 commit comments